ETH Price: $2,526.97 (+0.37%)

Token

RuffRuff (RUFF)
 

Overview

Max Total Supply

1,000,000,000 RUFF

Holders

113

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,141,239.341445908 RUFF

Value
$0.00
0x74e4f76Aa097a5D81704e232A4eD15a0aC4D8a78
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:
RuffRuff

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 5 runs

Other Settings:
default evmVersion
File 1 of 1 : RuffRuff.sol
/**
 *Submitted for verification at BscScan.com on 2023-03-02
 */

// SPDX-License-Identifier: Unlicensed

pragma solidity 0.8.18;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) internal view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key)
        internal
        view
        returns (int256)
    {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index)
        internal
        view
        returns (address)
    {
        return map.keys[index];
    }

    function size(Map storage map) internal view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) internal {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) internal {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

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

        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(address _owner)
        external
        view
        returns (uint256);

    function withdrawnDividendOf(address _owner)
        external
        view
        returns (uint256);

    function accumulativeDividendOf(address _owner)
        external
        view
        returns (uint256);
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns (uint256);

    function distributeDividends() external payable;

    function withdrawDividend() external;

    event DividendsDistributed(address indexed from, uint256 weiAmount);

    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

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

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

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

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

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

contract DividendPayingToken is
    ERC20,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;

    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;

    constructor(string memory _name, string memory _symbol)
        ERC20(_name, _symbol)
    {}

    receive() external payable {
        distributeDividends();
    }

    function distributeDividends() public payable override {
        require(totalSupply() > 0);

        if (msg.value > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (msg.value).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, msg.value);

            totalDividendsDistributed = totalDividendsDistributed.add(
                msg.value
            );
        }
    }

    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user)
        internal
        virtual
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            emit DividendWithdrawn(user, _withdrawableDividend);
            (bool success, ) = user.call{
                value: _withdrawableDividend,
                gas: 3000
            }("");

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    function dividendOf(address _owner) public view override returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    function withdrawnDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return
            magnifiedDividendPerShare
                .mul(balanceOf(_owner))
                .toInt256Safe()
                .add(magnifiedDividendCorrections[_owner])
                .toUint256Safe() / magnitude;
    }

    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        require(false);

        int256 _magCorrection = magnifiedDividendPerShare
            .mul(value)
            .toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from]
            .add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(
            _magCorrection
        );
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);

        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }
}

contract RuffRuff is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;

    bool private swapping;
    bool private stakingEnabled = false;
    bool public tradingEnabled = false;

    RuffRuffDividendTracker public dividendTracker;

    address public liquidityWallet;

    address payable public marketingAddress =
        payable(0xc00991c80F10df939E57B6fFa298fCa5737Ae706);

    address payable public marketingAddress2 =
        payable(0x027aBf2e14bc9Aa5126CF0dE7Aa687B474776383);

    uint256 public maxWalletSize = 20000000 * 10**9; // 2% Max

    uint256 public swapTokensAtAmount = 200000 * (10**9);
    uint256 public swapTokensAtAmountMax = 5000000 * (10**9);

    uint256 public devFees = 3;
    uint256 public devFeesReferred = 2;
    uint256 public liquidityFee = 1;
    uint256 public liquidityFeeReferred = 0;
    uint256 public BNBRewardsBuyFee = 0;
    uint256 public BNBRewardsBuyFeeReferred = 0;
    uint256 public BNBRewardsSellFee = 0;
    uint256 public BNBRewardsSellFeeReferred = 0;

    uint256 private countDevFees = 0;
    uint256 private countLiquidityFees = 0;
    uint256 private countBNBRewardsFee = 0;

    mapping(address => mapping(int256 => address)) public referrerTree;

    mapping(address => bool) private convertReferrals;
    mapping(address => uint256) private unconvertedTokens;
    uint256 public unconvertedTokensIndex;
    uint256 public unconvertedTokensIndexUpper;
    mapping(uint256 => address) private unconvertedTokensKeys;
    bool public enableConvertingReferralRewards;

    uint256 public referralFee; // referral fees are split up by the referralTreeFees
    mapping(int256 => uint256) public referralTreeFees;
    int256 private referralTreeFeesLength;

    mapping(address => uint256) public referralCount;
    mapping(address => uint256) public referralCountBranched;
    mapping(address => uint256) public referralEarnings;
    mapping(address => uint256) public referralEarningsConverted;
    mapping(address => uint256) public referralEarningsConvertedInPayout;
    uint256 public totalReferralsDistributed;
    uint256 public totalReferralsDistributedConverted;
    uint256 public totalReferralsDistributedConvertedInPayout;

    uint256 private iteration = 0;
    uint256 private iterationDaily = 0;
    uint256 private iterationWeekly = 0;
    uint256 private iterationMonthly = 0;
    uint256 public dailyTimer = block.timestamp + 86400;
    uint256 public weeklyTimer = block.timestamp + 604800;
    uint256 public monthlyTimer = block.timestamp + 2629743;
    bool public swapAndLiquifyEnabled = true;

    uint256 public gasForProcessing = 300000;
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;

    mapping(address => uint256) public stakingBonus;
    mapping(address => uint256) public stakingUntilDate;
    mapping(uint256 => uint256) public stakingAmounts;

    mapping(address => bool) private canTransferBeforeTradingIsEnabled;


    event EnableSwapAndLiquify(bool enabled);

    event UpdateDividendTracker(
        address indexed newAddress,
        address indexed oldAddress
    );

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );


    event UpdateFees(
        uint256 dev,
        uint256 liquidity,
        uint256 BNBRewardsBuy,
        uint256 BNBRewardsSell,
        uint256 referralFee
    );

    event UpdateFeesReferred(
        uint256 dev,
        uint256 liquidity,
        uint256 BNBRewardsBuy,
        uint256 BNBRewardsSell
    );

    event UpdateReferralTreeFees(int256 index, uint256 fee);

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LiquidityWalletUpdated(
        address indexed newLiquidityWallet,
        address indexed oldLiquidityWallet
    );

    event GasForProcessingUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity,
        bool success
    );

    event SendDividends(uint256 dividends, uint256 marketing, bool success);

    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    event UpdatePayoutToken(address account, address token);
    event UpdateAllowTokens(address token, bool allow);

    event ReferralRewards(
        address from,
        address indexed to,
        uint256 indexed amount,
        uint256 iterationDaily,
        uint256 iterationWeekly,
        uint256 iterationMonthly,
        int256 treePosition,
        int256 indexed bnbAmount
    );
    event ReferredBy(
        address indexed by,
        address indexed referree,
        uint256 iterationDaily,
        uint256 iterationWeekly,
        uint256 iterationMonthly
    );

    event LeaderboardCompletion(uint8 leaderboardCase, uint256 iteration);

    constructor() ERC20("RuffRuff", "RUFF") {
        dividendTracker = new RuffRuffDividendTracker(payable(this));

        liquidityWallet = owner();

        uniswapV2Router = IUniswapV2Router02(
            // 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D //mainnet
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D //testnet
            
        );

        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this),
                uniswapV2Router.WETH()
            );

        _setAutomatedMarketMakerPair(uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(
            0x000000000000000000000000000000000000dEaD
        );
        dividendTracker.excludedFromDividends(address(0));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(uniswapV2Router));

        // exclude from paying fees or having max transaction amount
        _isExcludedFromFees[liquidityWallet] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[address(dividendTracker)] = true;

        referralTreeFees[0] = 100; // 1% to primary referrer
        referralTreeFees[1] = 60; // 0.6% to secondary referrer
        referralTreeFees[2] = 40; // 0.4% to tertiary referrer
        referralTreeFeesLength = 3;

        calculateReferralFee();

        canTransferBeforeTradingIsEnabled[owner()] = true;

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */

        _mint(owner(), 1000000000 * (10**9));
    }

    function decimals() public view virtual override returns (uint8) {
        return 9;
    }

    receive() external payable {}

    function updateStakingAmounts(uint256 duration, uint256 bonus)
        public
        onlyOwner
    {
        require(stakingAmounts[duration] != bonus);
        require(bonus <= 100, "Staking bonus can't exceed 100");
        require(bonus > 0, "Staking bonus can't be 0");

        stakingAmounts[duration] = bonus;
    }

    function setMaxWalletSize(uint256 newMaxWalletSize) public onlyOwner {
    maxWalletSize = newMaxWalletSize;
    }


    function enableTrading() external onlyOwner {
        require(!tradingEnabled, "trading already enabled");
        tradingEnabled = true;
        enableConvertingReferralRewards = true;
        blockNumEnabled = block.number;
    }

    function setPresaleWallet(address wallet) external onlyOwner {
        canTransferBeforeTradingIsEnabled[wallet] = true;
        _isExcludedFromFees[wallet] = true;
        dividendTracker.excludeFromDividends(wallet);
    }

    function updateDividendTracker(address newAddress) public onlyOwner {
        require(newAddress != address(dividendTracker));

        RuffRuffDividendTracker newDividendTracker = RuffRuffDividendTracker(
            payable(newAddress)
        );

        require(newDividendTracker.owner() == address(this));

        newDividendTracker.excludeFromDividends(address(newDividendTracker));
        newDividendTracker.excludeFromDividends(address(this));
        newDividendTracker.excludeFromDividends(owner());
        newDividendTracker.excludeFromDividends(address(uniswapV2Router));

        emit UpdateDividendTracker(newAddress, address(dividendTracker));

        dividendTracker = newDividendTracker;
    }

   
    function setMarketingAddress(address payable newAddress) public onlyOwner {
        marketingAddress = newAddress;
    }

    function setMarketingAddress2(address payable newAddress2)
        public
        onlyOwner
    {
        marketingAddress2 = newAddress2;
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router));
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
        dividendTracker.updateUniswapV2Router(newAddress);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(_isExcludedFromFees[account] != excluded);
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function enableSwapAndLiquify(bool enabled) public onlyOwner {
        require(swapAndLiquifyEnabled != enabled);
        swapAndLiquifyEnabled = enabled;

        emit EnableSwapAndLiquify(enabled);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(pair != uniswapV2Pair);

        _setAutomatedMarketMakerPair(pair, value);
    }

    function setAllowCustomTokens(bool allow) public onlyOwner {
        dividendTracker.setAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) public onlyOwner {
        dividendTracker.setAllowAutoReinvest(allow);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        if (value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateLiquidityWallet(address newLiquidityWallet)
        public
        onlyOwner
    {
        excludeFromFees(newLiquidityWallet, true);
        emit LiquidityWalletUpdated(newLiquidityWallet, liquidityWallet);
        liquidityWallet = newLiquidityWallet;
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(
            newValue >= 200000 && newValue <= 500000,
            "new gas value must be between 200000 and 500000"
        );
        gasForProcessing = newValue;
    }

    function updateFees(
        uint256 dev,
        uint256 liquidity,
        uint256 BNBRewardsBuy,
        uint256 BNBRewardsSell,
        uint256 referral
    ) public onlyOwner {
        devFees = dev;
        liquidityFee = liquidity;
        BNBRewardsBuyFee = BNBRewardsBuy;
        BNBRewardsSellFee = BNBRewardsSell;
        referralFee = referral;

        emit UpdateFees(
            dev,
            liquidity,
            BNBRewardsBuy,
            BNBRewardsSell,
            referralFee
        );
    }

    function updateFeesReferred(
        uint256 devReferred,
        uint256 liquidityReferred,
        uint256 BNBRewardsBuyReferred,
        uint256 BNBRewardsSellReferred
    ) public onlyOwner {
        require(BNBRewardsBuyReferred <= 2, "Cannot set BNBreward fee over 2%");
        require(
            BNBRewardsSellReferred <= 2,
            "Cannot set BNBreward fee over 2%"
        );
        require(devReferred <= 10, "Cannot set dev fee over 10%");
        require(liquidityReferred <= 10, "Cannot set liquidity fee over 10%");
        devFeesReferred = devReferred;
        liquidityFeeReferred = liquidityReferred;
        BNBRewardsBuyFeeReferred = BNBRewardsBuyReferred;
        BNBRewardsSellFeeReferred = BNBRewardsSellReferred;

        emit UpdateFeesReferred(
            devReferred,
            liquidityReferred,
            BNBRewardsBuyReferred,
            BNBRewardsSellReferred
        );
    }

    // returns with two decimals of precision. i.e. "123" == "1.23%"
    function getReferralTreeFees(int256 index) public view returns (uint256) {
        return referralTreeFees[index];
    }

    function getReferralTreeFeesLength() public view returns (int256) {
        return referralTreeFeesLength;
    }

    function calculateReferralFee() private {
        uint256 referralTreeFeesAdded;
        for (int256 i = 0; i < referralTreeFeesLength; i++) {
            referralTreeFeesAdded += referralTreeFees[i];
        }
        referralFee = referralTreeFeesAdded / 100;
    }

    function setReferralTreeFeesLength(int256 length) public onlyOwner {
        referralTreeFeesLength = length;
        calculateReferralFee();
    }

    function updateReferralTreeFees(int256 index, uint256 fee)
        public
        onlyOwner
    {
        referralTreeFees[index] = fee;
        calculateReferralFee();
        emit UpdateReferralTreeFees(index, fee);
    }


    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function withdrawableDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.balanceOf(account);
    }

    function getAccountDividendsInfo(address account)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccountAtIndex(index);
    }

    function processDividendTracker(uint256 gas) external {
        (
            uint256 iterations,
            uint256 claims,
            uint256 lastProcessedIndex
        ) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(
            iterations,
            claims,
            lastProcessedIndex,
            false,
            gas,
            tx.origin
        );
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    function setAutoClaim(bool value) external {
        dividendTracker.setAutoClaim(msg.sender, value);
    }

    function setReinvest(bool value) external {
        dividendTracker.setReinvest(msg.sender, value);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        dividendTracker.setDividendsPaused(value);
    }

    function isExcludedFromAutoClaim(address account)
        external
        view
        returns (bool)
    {
        return dividendTracker.isExcludedFromAutoClaim(account);
    }

    function isReinvest(address account) external view returns (bool) {
        return dividendTracker.isReinvest(account);
    }

    function getETHBalance() external view returns (uint256) {
        return address(this).balance;
    }

    function transferETH(address destination, uint256 bnb) external onlyOwner {
        payable(destination).transfer(bnb);
    }

    function getNativeBalance() external view returns (uint256) {
        return balanceOf(address(this));
    }

    function getCountOfFeesToSwap()
        external
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        return (countBNBRewardsFee, countDevFees, countLiquidityFees);
    }

    function transferERC20Token(
        address tokenAddress,
        uint256 amount,
        address destination
    ) external onlyOwner {
        require(tokenAddress != address(this), "Cannot remove native token");
        ERC20(tokenAddress).transfer(destination, amount);
    }

    uint256 private originalAmountBeforeFees;

    uint256 private devFeeActual;
    uint256 private liquidityFeeActual;
    uint256 private BNBRewardsBuyFeeActual;
    uint256 private BNBRewardsSellFeeActual;
    uint256 private totalBuyFeesActual;
    uint256 private totalSellFeesActual;

    uint256 private blockNumEnabled;
    uint256 private earlyBlocks;
    uint256 private earlyTax;

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");

        require(
            tradingEnabled || canTransferBeforeTradingIsEnabled[from],
            "Trading has not yet been enabled"
        );

        if (from != uniswapV2Pair) {
            require(
                to != address(this),
                "You cannot send tokens to the contract address!"
            );
        }

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        } else if (
            !swapping &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to] &&
            (to == address(uniswapV2Pair) || from == address(uniswapV2Pair))
        ) {
            bool isSelling = automatedMarketMakerPairs[to];

            devFeeActual = devFees;
            liquidityFeeActual = liquidityFee;
            BNBRewardsBuyFeeActual = BNBRewardsBuyFee;
            BNBRewardsSellFeeActual = BNBRewardsSellFee;

            bool isReferredOnBuy = false;
            address referrer = address(
                0x0000000000000000000000000000000000000000
            );

            // if the user has been referred by someone and is buying, change to special fees
            if ((getReferrerOf(to) != referrer) && !isSelling) {
                isReferredOnBuy = true;
                referrer = getReferrerOf(to);
                devFees = devFeesReferred;
                liquidityFee = liquidityFeeReferred;
                BNBRewardsBuyFee = BNBRewardsBuyFeeReferred;
                BNBRewardsSellFee = BNBRewardsSellFeeReferred;
            }

            if (block.number < blockNumEnabled + earlyBlocks) {
                devFees = earlyTax;
                liquidityFee = 0;
                BNBRewardsBuyFee = 0;
                BNBRewardsSellFee = 0;
            }

            if(to != uniswapV2Pair) {
                require(ERC20.balanceOf(to) + amount < maxWalletSize, "TOKEN: Balance exceeds wallet size!");
            }

            uint256 contractTokenBalance = balanceOf(address(this));

            // convert referral rewards into payout token
            if (
                unconvertedTokensIndexUpper > 0 &&
                enableConvertingReferralRewards &&
                isSelling
            ) {
                uint256 toConvert = getUnconvertedReferralRewards(
                    unconvertedTokensKeys[unconvertedTokensIndex]
                );
                if (toConvert <= 0) {
                    unconvertedTokensIndex++;
                } else {
                    if (toConvert > swapTokensAtAmountMax) {
                        toConvert = swapTokensAtAmountMax;
                    }
                    swapTokensForPayoutToken(
                        from,
                        toConvert,
                        payable(unconvertedTokensKeys[unconvertedTokensIndex])
                    );
                }
            }

            bool canSwap = contractTokenBalance >= swapTokensAtAmount;

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

                if (swapAndLiquifyEnabled) {
                    swapAndLiquify(countLiquidityFees);
                }

                swapAndSendDividendsAndMarketingFunds(
                    countBNBRewardsFee,
                    countDevFees
                );

                swapping = false;
            }

            originalAmountBeforeFees = amount;

            /*
                Referral System
            */
            uint256 referralFeeTxn = amount.mul(referralFee).div(100);

            if (isReferredOnBuy) {
                for (int256 i = 0; i < referralTreeFeesLength; i++) {
                    address treePayoutTo = referrerTree[to][i];
                    uint256 adjustedTax = originalAmountBeforeFees
                        .mul(referralTreeFees[i])
                        .div(10000);

                    if (
                        treePayoutTo ==
                        address(0x0000000000000000000000000000000000000000)
                    ) {
                        break;
                    }

                    amount = amount.sub(adjustedTax);
                    if (
                        !getConvertReferralRewards(treePayoutTo) ||
                        !enableConvertingReferralRewards
                    ) {
                        super._transfer(from, treePayoutTo, adjustedTax);
                        dividendTracker.setBalance(
                            treePayoutTo,
                            getStakingBalance(treePayoutTo)
                        );
                        referralEarnings[treePayoutTo] += adjustedTax;
                        totalReferralsDistributed += adjustedTax;
                        referralFeeTxn -= adjustedTax;
                        emit ReferralRewards(
                            from,
                            treePayoutTo,
                            adjustedTax,
                            iterationDaily,
                            iterationWeekly,
                            iterationMonthly,
                            i,
                            -1
                        );
                    } else {
                        super._transfer(from, address(this), adjustedTax);
                        if (getUnconvertedReferralRewards(treePayoutTo) <= 0) {
                            unconvertedTokensKeys[
                                unconvertedTokensIndexUpper
                            ] = treePayoutTo;
                            unconvertedTokensIndexUpper++;
                        }
                        unconvertedTokens[treePayoutTo] += adjustedTax;
                        referralFeeTxn -= adjustedTax;
                    }
                }

                if (referralFeeTxn > 0) {
                    amount = amount.sub(referralFeeTxn);
                    super._transfer(from, address(this), referralFeeTxn);
                    countBNBRewardsFee += referralFeeTxn;
                }
            } else if (!isSelling) {
                // if not referred on buy, use the referral tax towards passive earn rewards
                amount = amount.sub(referralFeeTxn);
                super._transfer(from, address(this), referralFeeTxn);
                countBNBRewardsFee += referralFeeTxn;
            }
            /*
            
            */

            uint256 BNBRewardsFee = isSelling
                ? BNBRewardsSellFee
                : BNBRewardsBuyFee;

            uint256 devFeeAmount = originalAmountBeforeFees.mul(devFees).div(
                100
            );
            uint256 liquidityFeeAmount = originalAmountBeforeFees
                .mul(liquidityFee)
                .div(100);
            uint256 BNBRewardsFeeAmount = originalAmountBeforeFees
                .mul(BNBRewardsFee)
                .div(100);

            countDevFees += devFeeAmount;
            countLiquidityFees += liquidityFeeAmount;
            countBNBRewardsFee += BNBRewardsFeeAmount;

            uint256 fees = devFeeAmount +
                liquidityFeeAmount +
                BNBRewardsFeeAmount;
            amount = amount.sub(fees);
            super._transfer(from, address(this), fees);

            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (
                uint256 iterations,
                uint256 claims,
                uint256 lastProcessedIndex
            ) {
                emit ProcessedDividendTracker(
                    iterations,
                    claims,
                    lastProcessedIndex,
                    true,
                    gas,
                    tx.origin
                );
            } catch {}

            // set fees back to normal values
            if (isReferredOnBuy) {
                devFees = devFeeActual;
                liquidityFee = liquidityFeeActual;
                BNBRewardsBuyFee = BNBRewardsBuyFeeActual;
                BNBRewardsSellFee = BNBRewardsSellFeeActual;
            }
        }

        super._transfer(from, to, amount);

        dividendTracker.setBalance(from, getStakingBalance(from));
        dividendTracker.setBalance(to, getStakingBalance(to));

        updateReferralLeaderboards();
    }

    function getStakingBalance(address account) private view returns (uint256) {
        return
            stakingEnabled
                ? balanceOf(account).mul(stakingBonus[account].add(100)).div(
                    100
                )
                : balanceOf(account);
    }

    function swapAndLiquify(uint256 tokens) private {
        if (tokens > balanceOf(address(this))) {
            emit SwapAndLiquify(0, 0, 0, false);
            return;
        }

        // avoid price impact errors with large transactions
        if (tokens > swapTokensAtAmountMax) {
            tokens = swapTokensAtAmountMax;
        }

        // split the contract balance into halves
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);

        if (half <= 0 || otherHalf <= 0) {
            return;
        }

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half, payable(address(this)));

        countLiquidityFees -= half;

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);

        countLiquidityFees -= otherHalf;

        emit SwapAndLiquify(half, newBalance, otherHalf, true);
    }

    function setSwapTokensAmount(uint256 amount) public onlyOwner {
        require(amount <= 20000000, "cannot set swap amount greater than .2%");
        swapTokensAtAmount = amount;
    }

    function setSwapTokensAmountMax(uint256 amount) public onlyOwner {
        require(
            amount > swapTokensAtAmount,
            "Max amount must be greater than minimum"
        );
        require(amount <= 20000000, "cannot set swap amount greater than .2%");
        swapTokensAtAmountMax = amount;
    }

    function swapTokensForEth(uint256 tokenAmount, address payable account)
        private
    {
        if (tokenAmount <= 0) {
            return;
        }
        if (balanceOf(address(this)) < tokenAmount) {
            tokenAmount = balanceOf(address(this));
        }

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            account,
            block.timestamp
        );
    }

    address private upcoming = address(0);
    uint256 private upcomingAmount = 0;
    address private upcomingFrom = address(0);

    function clearUnconvertedEntry() private {
        unconvertedTokens[unconvertedTokensKeys[unconvertedTokensIndex]] = 0;
        unconvertedTokensKeys[unconvertedTokensIndex] = address(0);
        unconvertedTokensIndex++;
        if (unconvertedTokensIndex >= unconvertedTokensIndexUpper) {
            unconvertedTokensIndex = 0;
            unconvertedTokensIndexUpper = 0;
        }
    }

    function swapTokensForPayoutToken(
        address fromOriginal,
        uint256 tokenAmount,
        address payable account
    ) private {
        if (tokenAmount <= 0) {
            return;
        }

        uint256 initialBalance;
        uint256 newBalance;

        if (dividendTracker.getPayoutToken(account) == address(0)) {
            initialBalance = address(this).balance;
            swapTokensForEth(tokenAmount, account);
            newBalance = address(this).balance.sub(initialBalance);

            referralEarningsConverted[account] += tokenAmount;
            totalReferralsDistributedConverted += tokenAmount;
            referralEarningsConvertedInPayout[account] += newBalance;
            totalReferralsDistributedConvertedInPayout += newBalance;

            emit ReferralRewards(
                fromOriginal,
                account,
                unconvertedTokens[account],
                iterationDaily,
                iterationWeekly,
                iterationMonthly,
                int256(-1),
                int256(newBalance)
            );

            clearUnconvertedEntry();

            if (upcoming == address(0)) {
                return;
            }
        } else if (upcoming == address(0)) {
            initialBalance = address(this).balance;
            swapTokensForEth(tokenAmount, payable(address(this)));
            newBalance = address(this).balance.sub(initialBalance);

            referralEarningsConverted[account] += tokenAmount;
            totalReferralsDistributedConverted += tokenAmount;

            upcoming = account;
            upcomingAmount = newBalance;
            upcomingFrom = fromOriginal;

            clearUnconvertedEntry();
            return;
        }

        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = dividendTracker.getPayoutToken(upcoming);

        try
            uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
                value: upcomingAmount
            }(0, path, upcoming, block.timestamp)
        {} catch {}

        referralEarningsConvertedInPayout[upcoming] += upcomingAmount;
        totalReferralsDistributedConvertedInPayout += upcomingAmount;

        emit ReferralRewards(
            upcomingFrom,
            upcoming,
            upcomingAmount,
            iterationDaily,
            iterationWeekly,
            iterationMonthly,
            int256(-1),
            int256(upcomingAmount)
        );

        if (dividendTracker.getPayoutToken(account) != address(0)) {
            upcoming = account;
            upcomingAmount = newBalance;
            upcomingFrom = fromOriginal;
        } else {
            upcoming = address(0);
            upcomingAmount = 0;
            upcomingFrom = address(0);
        }

        clearUnconvertedEntry();
    }

    function getUnconvertedReferralRewardsIndexAt(uint256 index)
        public
        view
        returns (
            address,
            uint256,
            uint256
        )
    {
        return (
            unconvertedTokensKeys[index],
            unconvertedTokensIndexUpper,
            unconvertedTokens[unconvertedTokensKeys[index]]
        );
    }

    function updatePayoutToken(address token) public {
        require(
            balanceOf(msg.sender) > 0,
            "You must own more than zero $RUFF tokens to switch your payout token!"
        );
        require(token != address(this));

        dividendTracker.updatePayoutToken(msg.sender, token);
        emit UpdatePayoutToken(msg.sender, token);
    }

    function getPayoutToken(address account) public view returns (address) {
        return dividendTracker.getPayoutToken(account);
    }

    function updateAllowTokens(address token, bool allow) public onlyOwner {
        require(token != address(this), "Cannot use native token address");

        dividendTracker.updateAllowTokens(token, allow);
        emit UpdateAllowTokens(token, allow);
    }

    function getAllowTokens(address token) public view returns (bool) {
        return dividendTracker.getAllowTokens(token);
    }

    function setReferrer(address _referrer) public {
        require(_referrer != address(0), "Not a valid referrer");
        require(_referrer != msg.sender, "You cannot refer yourself");
        require(
            referrerTree[msg.sender][0] == address(0),
            "Referrer cannot be changed!"
        );

        // add the direct referrer to the user's payout tree
        referrerTree[msg.sender][0] = _referrer;
        referralCount[_referrer] = referralCount[_referrer] + 1;

        // check if the referrer was referred through a tree of their own;
        // set payout tree accordingly if so
        for (int256 i = 0; i < referralTreeFeesLength - 1; i++) {
            address treeAddress = referrerTree[_referrer][i];

            if (
                treeAddress ==
                address(0x0000000000000000000000000000000000000000)
            ) {
                break;
            }

            referrerTree[msg.sender][i + 1] = treeAddress;
            referralCountBranched[treeAddress] =
                referralCountBranched[treeAddress] +
                1;
        }

        emit ReferredBy(
            _referrer,
            msg.sender,
            iterationDaily,
            iterationWeekly,
            iterationMonthly
        );
    }

    function getReferrer() public view returns (address) {
        return referrerTree[msg.sender][0];
    }

    function getReferrerOf(address account) public view returns (address) {
        return referrerTree[account][0];
    }

    function getReferralCount(address account) public view returns (uint256) {
        return referralCount[account];
    }

    function getReferralCountBranched(address account)
        public
        view
        returns (uint256)
    {
        return referralCountBranched[account];
    }

    function getReferralEarnings(address account)
        public
        view
        returns (uint256)
    {
        return referralEarnings[account];
    }

    function getReferralTree(address account, int256 index)
        public
        view
        returns (address)
    {
        return referrerTree[account][index];
    }

    function setReferralTreeAtIndex(
        address account,
        int256 index,
        address accountToInsert
    ) public onlyOwner {
        referrerTree[account][index] = accountToInsert;
    }

    function getReferralTreeLength(address account)
        public
        view
        returns (int256)
    {
        for (int256 i = 0; i < referralTreeFeesLength; i++) {
            if (
                referrerTree[account][i] ==
                address(0x0000000000000000000000000000000000000000)
            ) {
                return i;
            }
        }

        return -1;
    }

    function getConvertReferralRewards(address account)
        public
        view
        returns (bool)
    {
        return convertReferrals[account];
    }

    function getUnconvertedReferralRewards(address account)
        public
        view
        returns (uint256)
    {
        return unconvertedTokens[account];
    }

    function convertReferralRewards(bool convert) public {
        require(
            enableConvertingReferralRewards,
            "Converting referral rewards is not enabled yet!"
        );
        convertReferrals[msg.sender] = convert;
    }

    function updateReferralLeaderboards() private {
        // check if the daily/weekly/monthly leaderboards should be reset

        if (block.timestamp >= dailyTimer) {
            iterationDaily++;
            dailyTimer = block.timestamp + 8600;
            emit LeaderboardCompletion(1, iterationDaily - 1);
        }

        if (block.timestamp >= weeklyTimer) {
            iterationWeekly++;
            weeklyTimer = block.timestamp + 604800;
            emit LeaderboardCompletion(2, iterationWeekly - 1);
        }

        if (block.timestamp >= monthlyTimer) {
            iterationMonthly++;
            monthlyTimer = block.timestamp + 2629743;
            emit LeaderboardCompletion(3, iterationMonthly - 1);
        }
    }

    function getReferralLeaderboardTimers()
        public
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        return (dailyTimer, weeklyTimer, monthlyTimer);
    }

    function setReferralLeaderboardTimers(
        uint256 daily,
        uint256 weekly,
        uint256 monthly
    ) public onlyOwner {
        dailyTimer = daily;
        weeklyTimer = weekly;
        monthlyTimer = monthly;
    }

    function forceUpdateReferralLeaderboards()
        public
        onlyOwner
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        updateReferralLeaderboards();
        return getReferralLeaderboardTimers();
    }

    function getIterations()
        public
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return (iteration, iterationDaily, iterationWeekly, iterationMonthly);
    }

    function setIterations(
        uint256 newIteration,
        uint256 newIterationDaily,
        uint256 newIterationWeekly,
        uint256 newIterationMonthly
    ) public onlyOwner {
        iteration = newIteration;
        iterationDaily = newIterationDaily;
        iterationWeekly = newIterationWeekly;
        iterationMonthly = newIterationMonthly;
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityWallet,
            block.timestamp
        );
    }

    function forceSwapAndSendDividendsAndMarketingFundsAndLiquidity(
        uint256 dividends,
        uint256 marketing,
        uint256 liquidity
    ) public onlyOwner {
        swapAndLiquify(liquidity);
        swapAndSendDividendsAndMarketingFunds(dividends, marketing);
    }

    function swapAndSendDividendsAndMarketingFunds(
        uint256 dividends,
        uint256 marketing
    ) private {
        if (dividends + marketing > balanceOf(address(this))) {
            emit SendDividends(dividends, marketing, false);
            return;
        }

        uint256 beforeSwap;
        uint256 afterSwapDelta;

        if (dividends > swapTokensAtAmountMax) {
            dividends = swapTokensAtAmountMax;
        }
        beforeSwap = address(this).balance;
        swapTokensForEth(dividends, payable(address(this)));
        afterSwapDelta = address(this).balance - beforeSwap;
        countBNBRewardsFee -= dividends;
        uint256 BNBRewardsFeeBNB = afterSwapDelta;
        if (dividends <= 0) {
            BNBRewardsFeeBNB = 0;
        }

        (bool success, ) = address(dividendTracker).call{
            value: BNBRewardsFeeBNB
        }("");

        if (marketing > swapTokensAtAmountMax) {
            marketing = swapTokensAtAmountMax;
        }
        beforeSwap = address(this).balance;
        swapTokensForEth(marketing, payable(address(this)));
        afterSwapDelta = address(this).balance - beforeSwap;
        countDevFees -= marketing;
        uint256 devFeesBNB = afterSwapDelta;
        if (marketing <= 0) {
            devFeesBNB = 0;
        }

        // Calculate the amount to send to each wallet
        uint256 splitValue = devFeesBNB / 2;

        // Send to first wallet
        (bool successWallet1, ) = address(marketingAddress).call{
            value: splitValue
        }("");
        require(successWallet1, "Sending BNB to wallet 1 failed");

        // Send to second wallet
        (bool successWallet2, ) = address(marketingAddress2).call{
            value: splitValue
        }("");
        require(successWallet2, "Sending BNB to wallet 2 failed");

        // Check if both transfers were successful
        bool successMarketing = successWallet1 && successWallet2;

        emit SendDividends(
            BNBRewardsFeeBNB,
            devFeesBNB,
            success && successMarketing
        );
    }

    function setearlyBlocks(uint256 amount) public onlyOwner {
        require(!tradingEnabled);
        earlyBlocks = amount;
    }

    function setearlyTax(uint256 amount) public onlyOwner {
        require(!tradingEnabled);
        earlyTax = amount;
    }
}

contract RuffRuffDividendTracker is DividendPayingToken, Ownable {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;
    mapping(address => bool) public excludedFromAutoClaim;
    mapping(address => bool) public autoReinvest;
    mapping(address => address) public payoutToken;
    mapping(address => bool) public allowTokens;
    bool public allowCustomTokens;
    bool public allowAutoReinvest;
    bool public dividendsPaused = false;

    IUniswapV2Router02 public uniswapV2Router;

    RuffRuff public ruffruff;

    mapping(address => uint256) public lastClaimTimes;

    uint256 public immutable minimumTokenBalanceForAutoDividends;
    uint256 public immutable minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event DividendReinvested(
        address indexed acount,
        uint256 value,
        bool indexed automatic
    );
    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );
    event DividendsPaused(bool paused);
    event SetAllowCustomTokens(bool allow);
    event SetAllowAutoReinvest(bool allow);

    constructor(address payable mainContract)
        DividendPayingToken(
            "RuffRuff_Dividend_Tracker",
            "RuffRuff_Dividend_Tracker"
        )
    {
        ruffruff = RuffRuff(mainContract);
        minimumTokenBalanceForAutoDividends = 1 * (10**9);
        minimumTokenBalanceForDividends = 1 * (10**9);

        uniswapV2Router = IUniswapV2Router02(
            //0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D MAINNET
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D //TESTNET
        );
        allowCustomTokens = true;
        allowAutoReinvest = true;
    }

    function decimals() public view virtual override returns (uint8) {
        return 9;
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "RuffRuff_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "RuffRuff_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main RuffRuff contract."
        );
    }

    function isExcludedFromAutoClaim(address account)
        external
        view
        onlyOwner
        returns (bool)
    {
        return excludedFromAutoClaim[account];
    }

    function isReinvest(address account)
        external
        view
        onlyOwner
        returns (bool)
    {
        return autoReinvest[account];
    }

    function getAllowCustomTokens() public view returns (bool) {
        return (allowCustomTokens);
    }

    function setAllowCustomTokens(bool allow) external onlyOwner {
        require(allowCustomTokens != allow);
        allowCustomTokens = allow;
        emit SetAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) external onlyOwner {
        require(allowAutoReinvest != allow);
        allowAutoReinvest = allow;
        emit SetAllowAutoReinvest(allow);
    }

    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;

        _setBalance(account, 0);
        tokenHoldersMap.remove(account);

        emit ExcludeFromDividends(account);
    }

    function setAutoClaim(address account, bool value) external onlyOwner {
        excludedFromAutoClaim[account] = value;
    }

    function setReinvest(address account, bool value) external onlyOwner {
        autoReinvest[account] = value;
    }

    function setDividendsPaused(bool value) external onlyOwner {
        require(dividendsPaused != value);
        dividendsPaused = value;
        emit DividendsPaused(value);
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getAccount(address _account)
        public
        view
        returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime
        )
    {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(
                    int256(lastProcessedIndex)
                );
            } else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length >
                    lastProcessedIndex
                    ? tokenHoldersMap.keys.length.sub(lastProcessedIndex)
                    : 0;

                iterationsUntilProcessed = index.add(
                    int256(processesUntilEndOfArray)
                );
            }
        }

        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];
    }

    function getAccountAtIndex(uint256 index)
        public
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        if (index >= tokenHoldersMap.size()) {
            return (
                0x0000000000000000000000000000000000000000,
                -1,
                -1,
                0,
                0,
                0
            );
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function setBalance(address account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }

        if (newBalance < minimumTokenBalanceForDividends) {
            tokenHoldersMap.remove(account);
            _setBalance(account, 0);

            return;
        }

        _setBalance(account, newBalance);

        if (newBalance >= minimumTokenBalanceForAutoDividends) {
            tokenHoldersMap.set(account, newBalance);
        } else {
            tokenHoldersMap.remove(account);
        }
    }

    function process(uint256 gas)
        public
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if (numberOfTokenHolders == 0 || dividendsPaused) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if (_lastProcessedIndex >= numberOfTokenHolders) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (!excludedFromAutoClaim[account]) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }

            iterations++;

            uint256 newGasLeft = gasleft();

            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic)
        public
        onlyOwner
        returns (bool)
    {
        if (dividendsPaused) {
            return false;
        }

        bool reinvest = autoReinvest[account];

        if (automatic && reinvest && !allowAutoReinvest) {
            return false;
        }

        uint256 amount = reinvest
            ? _reinvestDividendOfUser(account)
            : _withdrawDividendOfUser(account);

        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            if (reinvest) {
                emit DividendReinvested(account, amount, automatic);
            } else {
                emit Claim(account, amount, automatic);
            }
            return true;
        }

        return false;
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function updatePayoutToken(address account, address token)
        public
        onlyOwner
    {
        require(
            allowTokens[token] || token == address(0),
            "Token not in allow list"
        );
        payoutToken[account] = token;
    }

    function getPayoutToken(address account) public view returns (address) {
        return payoutToken[account];
    }

    function updateAllowTokens(address token, bool allow) public onlyOwner {
        allowTokens[token] = allow;
    }

    function getAllowTokens(address token) public view returns (bool) {
        return allowTokens[token];
    }

    function _reinvestDividendOfUser(address account)
        private
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(account);
        if (_withdrawableDividend > 0) {
            bool success;

            withdrawnDividends[account] = withdrawnDividends[account].add(
                _withdrawableDividend
            );

            address[] memory path = new address[](2);
            path[0] = uniswapV2Router.WETH();
            path[1] = address(ruffruff);

            uint256 prevBalance = ruffruff.balanceOf(address(this));

            // make the swap
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend
                }(
                    0, // accept any amount of Tokens
                    path,
                    address(this),
                    block.timestamp
                )
            {
                uint256 received = ruffruff.balanceOf(address(this)).sub(
                    prevBalance
                );
                if (received > 0) {
                    success = true;
                    ruffruff.transfer(account, received);
                } else {
                    success = false;
                }
            } catch {
                success = false;
            }

            if (!success) {
                withdrawnDividends[account] = withdrawnDividends[account].sub(
                    _withdrawableDividend
                );
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    function _withdrawDividendOfUser(address payable user)
        internal
        override
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );

            address tokenAddress = payoutToken[user];
            bool success;

            // if no tokenAddress assume bnb payout
            if (
                !allowCustomTokens ||
                tokenAddress == address(0) ||
                !allowTokens[tokenAddress]
            ) {
                (success, ) = user.call{
                    value: _withdrawableDividend,
                    gas: 3000
                }("");
            } else {
                //investor wants to be payed out in a custom token
                address[] memory path = new address[](2);
                path[0] = uniswapV2Router.WETH();
                path[1] = tokenAddress;

                try
                    uniswapV2Router
                        .swapExactETHForTokensSupportingFeeOnTransferTokens{
                        value: _withdrawableDividend
                    }(
                        0, // accept any amount of Tokens
                        path,
                        user,
                        block.timestamp
                    )
                {
                    success = true;
                } catch {
                    success = false;
                }
            }

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
                return 0;
            } else {
                emit DividendWithdrawn(user, _withdrawableDividend);
            }

            return _withdrawableDividend;
        }

        return 0;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableSwapAndLiquify","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":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"leaderboardCase","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"iteration","type":"uint256"}],"name":"LeaderboardCompletion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"iterationDaily","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"iterationWeekly","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"iterationMonthly","type":"uint256"},{"indexed":false,"internalType":"int256","name":"treePosition","type":"int256"},{"indexed":true,"internalType":"int256","name":"bnbAmount","type":"int256"}],"name":"ReferralRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"address","name":"referree","type":"address"},{"indexed":false,"internalType":"uint256","name":"iterationDaily","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"iterationWeekly","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"iterationMonthly","type":"uint256"}],"name":"ReferredBy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"dividends","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketing","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SendDividends","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":"tokensIntoLiqudity","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"allow","type":"bool"}],"name":"UpdateAllowTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"dev","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"BNBRewardsBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"BNBRewardsSell","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referralFee","type":"uint256"}],"name":"UpdateFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"dev","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"BNBRewardsBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"BNBRewardsSell","type":"uint256"}],"name":"UpdateFeesReferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"UpdatePayoutToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int256","name":"index","type":"int256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"UpdateReferralTreeFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"BNBRewardsBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BNBRewardsBuyFeeReferred","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BNBRewardsSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BNBRewardsSellFeeReferred","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":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"convert","type":"bool"}],"name":"convertReferralRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dailyTimer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeesReferred","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract RuffRuffDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableConvertingReferralRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"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":"uint256","name":"dividends","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"forceSwapAndSendDividendsAndMarketingFundsAndLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceUpdateReferralLeaderboards","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getAllowTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getConvertReferralRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCountOfFeesToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getETHBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIterations","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNativeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getPayoutToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferralCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferralCountBranched","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferralEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReferralLeaderboardTimers","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"index","type":"int256"}],"name":"getReferralTree","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"index","type":"int256"}],"name":"getReferralTreeFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReferralTreeFeesLength","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferralTreeLength","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReferrer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferrerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUnconvertedReferralRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getUnconvertedReferralRewardsIndexAt","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"isExcludedFromAutoClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isReinvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeReferred","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress2","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monthlyTimer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralCountBranched","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralEarningsConverted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralEarningsConvertedInPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"","type":"int256"}],"name":"referralTreeFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"}],"name":"referrerTree","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowAutoReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowCustomTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutoClaim","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":"bool","name":"value","type":"bool"}],"name":"setDividendsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newIteration","type":"uint256"},{"internalType":"uint256","name":"newIterationDaily","type":"uint256"},{"internalType":"uint256","name":"newIterationWeekly","type":"uint256"},{"internalType":"uint256","name":"newIterationMonthly","type":"uint256"}],"name":"setIterations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress2","type":"address"}],"name":"setMarketingAddress2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWalletSize","type":"uint256"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"daily","type":"uint256"},{"internalType":"uint256","name":"weekly","type":"uint256"},{"internalType":"uint256","name":"monthly","type":"uint256"}],"name":"setReferralLeaderboardTimers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"index","type":"int256"},{"internalType":"address","name":"accountToInsert","type":"address"}],"name":"setReferralTreeAtIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"length","type":"int256"}],"name":"setReferralTreeFeesLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"setReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAmountMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setearlyBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setearlyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingUntilDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmountMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReferralsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReferralsDistributedConverted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReferralsDistributedConvertedInPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"transferERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"bnb","type":"uint256"}],"name":"transferETH","outputs":[],"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":"unconvertedTokensIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unconvertedTokensIndexUpper","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"allow","type":"bool"}],"name":"updateAllowTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dev","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"BNBRewardsBuy","type":"uint256"},{"internalType":"uint256","name":"BNBRewardsSell","type":"uint256"},{"internalType":"uint256","name":"referral","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"devReferred","type":"uint256"},{"internalType":"uint256","name":"liquidityReferred","type":"uint256"},{"internalType":"uint256","name":"BNBRewardsBuyReferred","type":"uint256"},{"internalType":"uint256","name":"BNBRewardsSellReferred","type":"uint256"}],"name":"updateFeesReferred","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"updatePayoutToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"index","type":"int256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"updateReferralTreeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"updateStakingAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weeklyTimer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526007805461ffff60a81b19169055600a80546001600160a01b031990811673c00991c80f10df939e57b6ffa298fca5737ae70617909155600b805490911673027abf2e14bc9aa5126cf0de7aa687b47477638317905566470de4df820000600c5565b5e620f48000600d556611c37937e08000600e556003600f5560026010556001601155600060128190556013819055601481905560158190556016819055601781905560188190556019819055602c819055602d819055602e819055602f55620000d4426201518062000aee565b603055620000e64262093a8062000aee565b603155620000f8426228206f62000aee565b6032556033805460ff19166001179055620493e0603455604580546001600160a01b031990811690915560006046556047805490911690553480156200013d57600080fd5b5060405180604001604052806008815260200167293ab333293ab33360c11b81525060405180604001604052806004815260200163292aa32360e11b81525081600390816200018d919062000ba8565b5060046200019c828262000ba8565b5050506000620001b16200082060201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350306040516200020e9062000aca565b6200021a919062000c74565b604051809103906000f08015801562000237573d6000803e3d6000fd5b50600880546001600160a01b0319166001600160a01b03929092169190911790556200026262000824565b600980546001600160a01b03929092166001600160a01b031992831617905560068054909116737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620002df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000305919062000c88565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000368573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200038e919062000c88565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620003dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000402919062000c88565b600780546001600160a01b0319166001600160a01b039290921691821790556200042e90600162000833565b60085460405163031e79db60e41b81526001600160a01b03909116906331e79db0906200046090839060040162000c74565b600060405180830381600087803b1580156200047b57600080fd5b505af115801562000490573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b0390911692506331e79db09150620004c690309060040162000c74565b600060405180830381600087803b158015620004e157600080fd5b505af1158015620004f6573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b0390911692506331e79db091506200052e9061dead9060040162000c74565b600060405180830381600087803b1580156200054957600080fd5b505af11580156200055e573d6000803e3d6000fd5b5050600854604051634e7b827f60e01b81526001600160a01b039091169250634e7b827f9150620005959060009060040162000c74565b602060405180830381865afa158015620005b3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005d9919062000cb3565b506008546001600160a01b03166331e79db0620005f562000824565b6040518263ffffffff1660e01b815260040162000613919062000c74565b600060405180830381600087803b1580156200062e57600080fd5b505af115801562000643573d6000803e3d6000fd5b505060085460065460405163031e79db60e41b81526001600160a01b0392831694506331e79db093506200067e929091169060040162000c74565b600060405180830381600087803b1580156200069957600080fd5b505af1158015620006ae573d6000803e3d6000fd5b50506009546001600160a01b031660009081526035602081905260408083208054600160ff1991821681179092553085529184208054909216811790915593509150620006fa62000824565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905560085490911681526035835290812080549093166001179092556022905260647fb84cf808d0d5b1ad44962c9bfddd3cfce67763c49ab557cfd0e9f6804faade9955603c7fe39b43e4224876d80510ac9d8f190663bcce357e28a4aec26f3bf2e600bb40ec556002905260287f52978eb6718a0ed733b71dbb3c4781d6da146a41523832713c09679420d0cac5556003602355620007c562000904565b6001603a6000620007d562000824565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556200081a6200080b62000824565b670de0b6b3a764000062000959565b62000d1c565b3390565b6005546001600160a01b031690565b6001600160a01b0382166000908152603660205260409020805460ff19168215801591909117909155620008c85760085460405163031e79db60e41b81526001600160a01b03909116906331e79db0906200089390859060040162000c74565b600060405180830381600087803b158015620008ae57600080fd5b505af1158015620008c3573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000805b60235481121562000945576000818152602260205260409020546200092e908362000aee565b9150806200093c8162000cd7565b91505062000908565b506200095360648262000cf9565b60215550565b6001600160a01b038216620009b55760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b620009d18160025462000a5e60201b620035651790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a049183906200356562000a5e821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b60008062000a6d838562000aee565b90508381101562000ac15760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620009ac565b90505b92915050565b612ff780620067cb83390190565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000ac45762000ac462000ad8565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000b2f57607f821691505b60208210810362000b5057634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a5957600081815260208120601f850160051c8101602086101562000b7f5750805b601f850160051c820191505b8181101562000ba05782815560010162000b8b565b505050505050565b81516001600160401b0381111562000bc45762000bc462000b04565b62000bdc8162000bd5845462000b1a565b8462000b56565b602080601f83116001811462000c14576000841562000bfb5750858301515b600019600386901b1c1916600185901b17855562000ba0565b600085815260208120601f198616915b8281101562000c455788860151825594840194600190910190840162000c24565b508582101562000c645787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0391909116815260200190565b60006020828403121562000c9b57600080fd5b81516001600160a01b038116811462000ac157600080fd5b60006020828403121562000cc657600080fd5b8151801515811462000ac157600080fd5b60006001600160ff1b01820162000cf25762000cf262000ad8565b5060010190565b60008262000d1757634e487b7160e01b600052601260045260246000fd5b500490565b615a9f8062000d2c6000396000f3fe6080604052600436106105655760003560e01c8063871c128d116102c1578063871c128d14610db657806388a9d55414610dd657806388bdd9be14610deb5780638a8c523c14610e0b5780638da5cb5b14610e205780638f3fa86014610e35578063906e9dd014610e4b578063913c7df614610e6b57806395d89b4114610e9857806398118cb414610ead5780639a7a23d614610ec35780639b45900814610ee35780639c1b8af514610efe5780639c3372ea14610f145780639d325abd14610f34578063a18a7bfc14610f49578063a3e1096e14610f69578063a3ec8c8914610f7f578063a457c2d714610f9a578063a5ece94114610fba578063a8b9d24014610fda578063a9059cbb14610ffa578063ad56c13c1461101a578063ad8e749514611071578063b62496f51461109e578063b8429e05146110ce578063ba079d49146110e8578063bc7f25e414611108578063befa65aa14611128578063c02466681461113e578063c07b528a1461115e578063c32c293d1461118b578063c64e5aa0146111ab578063ce7d83f6146111c1578063d07a091c146111e1578063d35e3cd014611201578063d37e095214611217578063d46980161461122d578063d564af3a1461124d578063d5a1b7191461126d578063d5e37251146112dc578063d8032ed3146112fc578063db74559b1461131c578063dd62ed3e14611349578063e2f456051461138f578063e37ba8f9146113a5578063e409bfad146113c5578063e718ae92146113db578063e7300d3b146113fb578063e76e98621461141b578063e7841ec014611431578063ea1644d514611446578063ea2290ba14611466578063ec0d3fb114611486578063f1c0ddff1461149c578063f27fd254146114c9578063f2fde38b146114e9578063f5d3c79a14611509578063f94ce0d214611529578063fa95619614611549578063fb0b8dc01461156957600080fd5b806301abc132146105715780630224e9a71461059357806306fdde03146105bc57806309239b2b146105de578063095ea7b3146105fe5780630ef35b7e1461062e57806313616b4a1461064e5780631694505e1461066e57806318160ddd1461069b57806318ad81f8146106b05780631a676afa146106f15780631e093e941461071157806323b872dd1461073a57806324acbd691461075a5780632a84ff51146107905780632c1f5216146107d357806330bb4cff146107f3578063313ce567146108085780633599bb171461082457806337e84502146108445780633944784d1461086457806339509351146108885780633c295986146108a857806340ffdd80146108be578063435c89e4146108de57806343e716fe1461090b578063446d49da1461092b578063457ffca2146109415780634625830e1461096157806346585f741461098157806349bd5a5e146109975780634a74bb02146109b75780634ad12ec0146109d15780634ada218b146109e75780634e71d92d14610a085780634fbee19314610a1d57806350a0ccac14610a565780635123425b14610a6c5780635424226d14610a8c578063551e5f8d14610ab95780635764b7c414610ad95780635b72c18c14610b0f5780635e52a00b14610b2f5780635eb402a414610b655780636094c4ce14610b9257806363b4bc5314610bbf57806364b0f65314610bdf57806365b8dbc014610bf45780636843cd8414610c145780636d48467b14610c345780636e94729814610c54578063700bb19114610c6757806370a0823114610c875780637b0bbe9714610ca75780637b1a490914610cbd5780637d32f34214610cdd578063838a538614610d0a578063847ff70214610d2a57806384ae2bc614610d4a57806385e12a9414610d60578063868730c714610d9657600080fd5b3661056c57005b600080fd5b34801561057d57600080fd5b5061059161058c3660046151f4565b61157f565b005b34801561059f57600080fd5b506105a9600f5481565b6040519081526020015b60405180910390f35b3480156105c857600080fd5b506105d16116f6565b6040516105b39190615226565b3480156105ea57600080fd5b506105a96105f9366004615289565b611788565b34801561060a57600080fd5b5061061e6106193660046152a6565b6117a3565b60405190151581526020016105b3565b34801561063a57600080fd5b506105916106493660046152d2565b6117ba565b34801561065a57600080fd5b506105916106693660046152f4565b6118ad565b34801561067a57600080fd5b5060065461068e906001600160a01b031681565b6040516105b39190615336565b3480156106a757600080fd5b506002546105a9565b3480156106bc57600080fd5b5061068e6106cb3660046152a6565b601a6020908152600092835260408084209091529082529020546001600160a01b031681565b3480156106fd57600080fd5b5061059161070c36600461534a565b611912565b34801561071d57600080fd5b50602c54602d54602e54602f546040516105b39493929190615376565b34801561074657600080fd5b5061061e610755366004615391565b611954565b34801561076657600080fd5b506105a9610775366004615289565b6001600160a01b031660009081526024602052604090205490565b34801561079c57600080fd5b5061068e6107ab3660046152a6565b6001600160a01b039182166000908152601a6020908152604080832093835292905220541690565b3480156107df57600080fd5b5060085461068e906001600160a01b031681565b3480156107ff57600080fd5b506105a96119bd565b34801561081457600080fd5b50604051600981526020016105b3565b34801561083057600080fd5b5061059161083f3660046153e0565b611a30565b34801561085057600080fd5b5061059161085f3660046152d2565b611abd565b34801561087057600080fd5b50610879611b3e565b6040516105b3939291906153fd565b34801561089457600080fd5b5061061e6108a33660046152a6565b611b89565b3480156108b457600080fd5b506105a9600e5481565b3480156108ca57600080fd5b506105916108d93660046153e0565b611bbf565b3480156108ea57600080fd5b506105a96108f9366004615413565b60396020526000908152604090205481565b34801561091757600080fd5b50610591610926366004615413565b611c1a565b34801561093757600080fd5b506105a960295481565b34801561094d57600080fd5b5061059161095c36600461542c565b611c6d565b34801561096d57600080fd5b5061059161097c366004615413565b611d07565b34801561098d57600080fd5b506105a960315481565b3480156109a357600080fd5b5060075461068e906001600160a01b031681565b3480156109c357600080fd5b5060335461061e9060ff1681565b3480156109dd57600080fd5b506105a960305481565b3480156109f357600080fd5b5060075461061e90600160b01b900460ff1681565b348015610a1457600080fd5b50610591611d4d565b348015610a2957600080fd5b5061061e610a38366004615289565b6001600160a01b031660009081526035602052604090205460ff1690565b348015610a6257600080fd5b506105a960125481565b348015610a7857600080fd5b50610591610a87366004615467565b611dc6565b348015610a9857600080fd5b506105a9610aa7366004615289565b60276020526000908152604090205481565b348015610ac557600080fd5b50610591610ad4366004615413565b611edd565b348015610ae557600080fd5b506105a9610af4366004615289565b6001600160a01b031660009081526026602052604090205490565b348015610b1b57600080fd5b5061061e610b2a366004615289565b611f23565b348015610b3b57600080fd5b50336000908152601a602090815260408083208380529091529020546001600160a01b031661068e565b348015610b7157600080fd5b506105a9610b80366004615413565b60226020526000908152604090205481565b348015610b9e57600080fd5b506105a9610bad366004615289565b60256020526000908152604090205481565b348015610bcb57600080fd5b50610591610bda3660046152f4565b611f95565b348015610beb57600080fd5b506105a961208b565b348015610c0057600080fd5b50610591610c0f366004615289565b6120d5565b348015610c2057600080fd5b506105a9610c2f366004615289565b61219c565b348015610c4057600080fd5b5061061e610c4f366004615289565b61220e565b348015610c6057600080fd5b50476105a9565b348015610c7357600080fd5b50610591610c82366004615413565b61223f565b348015610c9357600080fd5b506105a9610ca2366004615289565b6122fb565b348015610cb357600080fd5b506105a9601d5481565b348015610cc957600080fd5b50610591610cd83660046152a6565b612316565b348015610ce957600080fd5b506105a9610cf8366004615289565b60386020526000908152604090205481565b348015610d1657600080fd5b50610591610d2536600461534a565b612376565b348015610d3657600080fd5b50610591610d45366004615289565b6123ae565b348015610d5657600080fd5b506105a960215481565b348015610d6c57600080fd5b506105a9610d7b366004615289565b6001600160a01b031660009081526025602052604090205490565b348015610da257600080fd5b50610591610db13660046153e0565b6123fa565b348015610dc257600080fd5b50610591610dd1366004615413565b61242c565b348015610de257600080fd5b506105a96124d5565b348015610df757600080fd5b50610591610e06366004615289565b6124e0565b348015610e1757600080fd5b5061059161278b565b348015610e2c57600080fd5b5061068e61282f565b348015610e4157600080fd5b506105a9600c5481565b348015610e5757600080fd5b50610591610e66366004615289565b61283e565b348015610e7757600080fd5b506105a9610e86366004615413565b60009081526022602052604090205490565b348015610ea457600080fd5b506105d161288a565b348015610eb957600080fd5b506105a960115481565b348015610ecf57600080fd5b50610591610ede366004615467565b612899565b348015610eef57600080fd5b50601954601754601854610879565b348015610f0a57600080fd5b506105a960345481565b348015610f2057600080fd5b50610591610f2f3660046153e0565b6128ec565b348015610f4057600080fd5b506023546105a9565b348015610f5557600080fd5b50610591610f64366004615289565b612948565b348015610f7557600080fd5b506105a960105481565b348015610f8b57600080fd5b50603054603154603254610879565b348015610fa657600080fd5b5061061e610fb53660046152a6565b612be6565b348015610fc657600080fd5b50600a5461068e906001600160a01b031681565b348015610fe657600080fd5b506105a9610ff5366004615289565b612c35565b34801561100657600080fd5b5061061e6110153660046152a6565b612c66565b34801561102657600080fd5b5061103a611035366004615289565b612c73565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016105b3565b34801561107d57600080fd5b506105a961108c366004615289565b60286020526000908152604090205481565b3480156110aa57600080fd5b5061061e6110b9366004615289565b60366020526000908152604090205460ff1681565b3480156110da57600080fd5b5060205461061e9060ff1681565b3480156110f457600080fd5b5061061e611103366004615289565b612d05565b34801561111457600080fd5b5061068e611123366004615289565b612d36565b34801561113457600080fd5b506105a960135481565b34801561114a57600080fd5b50610591611159366004615467565b612d5f565b34801561116a57600080fd5b506105a9611179366004615289565b60266020526000908152604090205481565b34801561119757600080fd5b5061068e6111a6366004615289565b612e15565b3480156111b757600080fd5b506105a960155481565b3480156111cd57600080fd5b506105a96111dc366004615289565b612e87565b3480156111ed57600080fd5b506105916111fc366004615289565b612ee1565b34801561120d57600080fd5b506105a9602a5481565b34801561122357600080fd5b506105a9601e5481565b34801561123957600080fd5b5060095461068e906001600160a01b031681565b34801561125957600080fd5b50610591611268366004615413565b612f6f565b34801561127957600080fd5b506112b7611288366004615413565b6000908152601f6020908152604080832054601e546001600160a01b03909116808552601c9093529220549092565b604080516001600160a01b0390941684526020840192909252908201526060016105b3565b3480156112e857600080fd5b506105916112f73660046153e0565b613023565b34801561130857600080fd5b50610591611317366004615289565b6130ac565b34801561132857600080fd5b506105a9611337366004615289565b60246020526000908152604090205481565b34801561135557600080fd5b506105a96113643660046154a0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561139b57600080fd5b506105a9600d5481565b3480156113b157600080fd5b506105916113c0366004615289565b6131e2565b3480156113d157600080fd5b506105a960325481565b3480156113e757600080fd5b506105916113f63660046153e0565b613274565b34801561140757600080fd5b506105916114163660046151f4565b6132fe565b34801561142757600080fd5b506105a960165481565b34801561143d57600080fd5b506105a961333c565b34801561145257600080fd5b50610591611461366004615413565b613386565b34801561147257600080fd5b50600b5461068e906001600160a01b031681565b34801561149257600080fd5b506105a9602b5481565b3480156114a857600080fd5b506105a96114b7366004615289565b60376020526000908152604090205481565b3480156114d557600080fd5b5061103a6114e4366004615413565b6133b5565b3480156114f557600080fd5b50610591611504366004615289565b6133f3565b34801561151557600080fd5b506105916115243660046153e0565b6134de565b34801561153557600080fd5b5061061e611544366004615289565b613510565b34801561155557600080fd5b50610591611564366004615413565b61352e565b34801561157557600080fd5b506105a960145481565b6005546001600160a01b031633146115b25760405162461bcd60e51b81526004016115a9906154ce565b60405180910390fd5b60028211156115d35760405162461bcd60e51b81526004016115a990615503565b60028111156115f45760405162461bcd60e51b81526004016115a990615503565b600a8411156116435760405162461bcd60e51b815260206004820152601b60248201527a43616e6e6f74207365742064657620666565206f7665722031302560281b60448201526064016115a9565b600a83111561169e5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f7420736574206c697175696469747920666565206f7665722031306044820152602560f81b60648201526084016115a9565b60108490556012839055601482905560168190556040517f7930d77b0ffd67679071b576440d6e525f442ff3f55db20413eed41d88c81583906116e8908690869086908690615376565b60405180910390a150505050565b60606003805461170590615538565b80601f016020809104026020016040519081016040528092919081815260200182805461173190615538565b801561177e5780601f106117535761010080835404028352916020019161177e565b820191906000526020600020905b81548152906001019060200180831161176157829003601f168201915b5050505050905090565b6001600160a01b03166000908152601c602052604090205490565b60006117b03384846135c9565b5060015b92915050565b6005546001600160a01b031633146117e45760405162461bcd60e51b81526004016115a9906154ce565b6000828152603960205260409020548190036117ff57600080fd5b60648111156118505760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e27742065786365656420313030000060448201526064016115a9565b6000811161189b5760405162461bcd60e51b815260206004820152601860248201527705374616b696e6720626f6e75732063616e277420626520360441b60448201526064016115a9565b60009182526039602052604090912055565b6005546001600160a01b031633146118d75760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b039283166000908152601a602090815260408083209483529390529190912080546001600160a01b03191691909216179055565b6005546001600160a01b0316331461193c5760405162461bcd60e51b81526004016115a9906154ce565b611945816136ee565b61194f83836137db565b505050565b6000611961848484613aaa565b6119b384336119ae856040518060600160405280602881526020016159fd602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190614461565b6135c9565b5060019392505050565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2b9190615572565b905090565b6005546001600160a01b03163314611a5a5760405162461bcd60e51b81526004016115a9906154ce565b600854604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b158015611aa257600080fd5b505af1158015611ab6573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314611ae75760405162461bcd60e51b81526004016115a9906154ce565b6000828152602260205260409020819055611b0061449b565b60408051838152602081018390527fbfe4066ad4b56591d9738665ba86b038826d6ec196bd3e4c2305847c22eb02a891015b60405180910390a15050565b600554600090819081906001600160a01b03163314611b6f5760405162461bcd60e51b81526004016115a9906154ce565b611b776144e8565b50506030546031546032549193909250565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916117b09185906119ae9086613565565b6005546001600160a01b03163314611be95760405162461bcd60e51b81526004016115a9906154ce565b6008546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd8090602401611a88565b6005546001600160a01b03163314611c445760405162461bcd60e51b81526004016115a9906154ce565b6301312d00811115611c685760405162461bcd60e51b81526004016115a99061558b565b600d55565b6005546001600160a01b03163314611c975760405162461bcd60e51b81526004016115a9906154ce565b600f8590556011849055601383905560158290556021819055604080518681526020810186905290810184905260608101839052608081018290527fda70e0b1954bcd95873c930c54e19a24ff3b2f024251a9eb0756e67a7794711e9060a0015b60405180910390a15050505050565b6005546001600160a01b03163314611d315760405162461bcd60e51b81526004016115a9906154ce565b600754600160b01b900460ff1615611d4857600080fd5b604455565b60085460405163bc4c4b3760e01b81526001600160a01b039091169063bc4c4b3790611d809033906000906004016155d2565b6020604051808303816000875af1158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc391906155ed565b50565b6005546001600160a01b03163314611df05760405162461bcd60e51b81526004016115a9906154ce565b306001600160a01b03831603611e485760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420757365206e617469766520746f6b656e20616464726573730060448201526064016115a9565b600854604051635123425b60e01b81526001600160a01b0390911690635123425b90611e7a90859085906004016155d2565b600060405180830381600087803b158015611e9457600080fd5b505af1158015611ea8573d6000803e3d6000fd5b505050507ff8e5e8c18b9fbb7607019e8dab60e0ad981ba259df038a668fc13025a64854d68282604051611b329291906155d2565b6005546001600160a01b03163314611f075760405162461bcd60e51b81526004016115a9906154ce565b600754600160b01b900460ff1615611f1e57600080fd5b604355565b6008546040516316dcb06360e21b81526000916001600160a01b031690635b72c18c90611f54908590600401615336565b602060405180830381865afa158015611f71573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b491906155ed565b6005546001600160a01b03163314611fbf5760405162461bcd60e51b81526004016115a9906154ce565b306001600160a01b038416036120145760405162461bcd60e51b815260206004820152601a60248201527921b0b73737ba103932b6b7bb32903730ba34bb32903a37b5b2b760311b60448201526064016115a9565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90612042908490869060040161560a565b6020604051808303816000875af1158015612061573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208591906155ed565b50505050565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611a07573d6000803e3d6000fd5b6005546001600160a01b031633146120ff5760405162461bcd60e51b81526004016115a9906154ce565b6006546001600160a01b039081169082160361211a57600080fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0383811691909117909155600854604051630196e36f60e61b81529116906365b8dbc090611a88908490600401615336565b6008546040516370a0823160e01b81526000916001600160a01b0316906370a08231906121cd908590600401615336565b602060405180830381865afa1580156121ea573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b49190615572565b600854604051636d48467b60e01b81526000916001600160a01b031690636d48467b90611f54908590600401615336565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015612292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b69190615623565b925092509250326001600160a01b031660001515600080516020615957833981519152858585896040516122ed9493929190615376565b60405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146123405760405162461bcd60e51b81526004016115a9906154ce565b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561194f573d6000803e3d6000fd5b6005546001600160a01b031633146123a05760405162461bcd60e51b81526004016115a9906154ce565b603092909255603155603255565b6005546001600160a01b031633146123d85760405162461bcd60e51b81526004016115a9906154ce565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051638bc1d63960e01b81526001600160a01b0390911690638bc1d63990611a8890339085906004016155d2565b6005546001600160a01b031633146124565760405162461bcd60e51b81526004016115a9906154ce565b62030d40811015801561246c57506207a1208111155b6124d05760405162461bcd60e51b815260206004820152602f60248201527f6e6577206761732076616c7565206d757374206265206265747765656e20323060448201526e03030303020616e642035303030303608c1b60648201526084016115a9565b603455565b6000611a2b306122fb565b6005546001600160a01b0316331461250a5760405162461bcd60e51b81526004016115a9906154ce565b6008546001600160a01b039081169082160361252557600080fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612572573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125969190615651565b6001600160a01b0316146125a957600080fd5b60405163031e79db60e41b81526001600160a01b038216906331e79db0906125d5908490600401615336565b600060405180830381600087803b1580156125ef57600080fd5b505af1158015612603573d6000803e3d6000fd5b505060405163031e79db60e41b81526001600160a01b03841692506331e79db09150612633903090600401615336565b600060405180830381600087803b15801561264d57600080fd5b505af1158015612661573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db061267c61282f565b6040518263ffffffff1660e01b81526004016126989190615336565b600060405180830381600087803b1580156126b257600080fd5b505af11580156126c6573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b0380861694506331e79db093506126fa921690600401615336565b600060405180830381600087803b15801561271457600080fd5b505af1158015612728573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b031633146127b55760405162461bcd60e51b81526004016115a9906154ce565b600754600160b01b900460ff16156128095760405162461bcd60e51b81526020600482015260176024820152761d1c98591a5b99c8185b1c9958591e48195b98589b1959604a1b60448201526064016115a9565b6007805460ff60b01b1916600160b01b1790556020805460ff1916600117905543604255565b6005546001600160a01b031690565b6005546001600160a01b031633146128685760405162461bcd60e51b81526004016115a9906154ce565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60606004805461170590615538565b6005546001600160a01b031633146128c35760405162461bcd60e51b81526004016115a9906154ce565b6007546001600160a01b03908116908316036128de57600080fd5b6128e88282614620565b5050565b6005546001600160a01b031633146129165760405162461bcd60e51b81526004016115a9906154ce565b600854604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea90602401611a88565b6001600160a01b0381166129955760405162461bcd60e51b81526020600482015260146024820152732737ba1030903b30b634b2103932b332b93932b960611b60448201526064016115a9565b336001600160a01b038216036129e95760405162461bcd60e51b81526020600482015260196024820152782cb7ba9031b0b73737ba103932b332b9103cb7bab939b2b63360391b60448201526064016115a9565b336000908152601a602090815260408083208380529091529020546001600160a01b031615612a585760405162461bcd60e51b815260206004820152601b60248201527a52656665727265722063616e6e6f74206265206368616e6765642160281b60448201526064016115a9565b336000908152601a60209081526040808320838052825280832080546001600160a01b0319166001600160a01b03861690811790915583526024909152902054612aa3906001615684565b6001600160a01b0382166000908152602460205260408120919091555b6001602354612acf9190615697565b811215612b96576001600160a01b038083166000908152601a602090815260408083208584529091529020541680612b075750612b96565b336000908152601a602052604081208291612b238560016156be565b81526020808201929092526040908101600090812080546001600160a01b0319166001600160a01b0395861617905592841683526025909152902054612b6a906001615684565b6001600160a01b0390911660009081526025602052604090205580612b8e816156e6565b915050612ac0565b50602d54602e54602f5460405133936001600160a01b038616937f2311833a6b34f4f41fdf892d645b68a6ccfeaec5f489c18070af21710258577193612bdb936153fd565b60405180910390a350565b60006117b033846119ae85604051806060016040528060258152602001615a45602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190614461565b6008546040516302a2e74960e61b81526000916001600160a01b03169063a8b9d240906121cd908590600401615336565b60006117b0338484613aaa565b60085460405163fbcbc0f160e01b8152600091829182918291829182916001600160a01b039091169063fbcbc0f190612cb0908a90600401615336565b60c060405180830381865afa158015612ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf19190615705565b949c939b5091995097509550909350915050565b60085460405163ba079d4960e01b81526000916001600160a01b03169063ba079d4990611f54908590600401615336565b6001600160a01b039081166000908152601a602090815260408083208380529091529020541690565b6005546001600160a01b03163314612d895760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b03821660009081526035602052604090205481151560ff909116151503612db657600080fd5b6001600160a01b038216600081815260356020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b60085460405163c32c293d60e01b81526000916001600160a01b03169063c32c293d90612e46908590600401615336565b602060405180830381865afa158015612e63573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b49190615651565b6000805b602354811215612ed7576001600160a01b038381166000908152601a6020908152604080832085845290915290205416612ec55792915050565b80612ecf816156e6565b915050612e8b565b5060001992915050565b6005546001600160a01b03163314612f0b5760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b038181166000908152603a602090815260408083208054600160ff19918216811790925560359093529281902080549092169092179055600854905163031e79db60e41b81529116906331e79db090611a88908490600401615336565b6005546001600160a01b03163314612f995760405162461bcd60e51b81526004016115a9906154ce565b600d548111612ffa5760405162461bcd60e51b815260206004820152602760248201527f4d617820616d6f756e74206d7573742062652067726561746572207468616e206044820152666d696e696d756d60c81b60648201526084016115a9565b6301312d0081111561301e5760405162461bcd60e51b81526004016115a99061558b565b600e55565b6005546001600160a01b0316331461304d5760405162461bcd60e51b81526004016115a9906154ce565b60335481151560ff90911615150361306457600080fd5b6033805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef906020015b60405180910390a150565b60006130b7336122fb565b116131385760405162461bcd60e51b815260206004820152604560248201527f596f75206d757374206f776e206d6f7265207468616e207a65726f202452554660448201527f4620746f6b656e7320746f2073776974636820796f7572207061796f757420746064820152646f6b656e2160d81b608482015260a4016115a9565b306001600160a01b0382160361314d57600080fd5b60085460405163f7dd53a960e01b81526001600160a01b039091169063f7dd53a99061317f9033908590600401615758565b600060405180830381600087803b15801561319957600080fd5b505af11580156131ad573d6000803e3d6000fd5b505050507f3640c981ed7cfa9e689ac4e9cafffd8c9240b716b14c982b3e90d54e7b61de2433826040516130a1929190615758565b6005546001600160a01b0316331461320c5760405162461bcd60e51b81526004016115a9906154ce565b613217816001612d5f565b6009546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b60205460ff166132de5760405162461bcd60e51b815260206004820152602f60248201527f436f6e76657274696e6720726566657272616c2072657761726473206973206e60448201526e6f7420656e61626c6564207965742160881b60648201526084016115a9565b336000908152601b60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146133285760405162461bcd60e51b81526004016115a9906154ce565b602c93909355602d91909155602e55602f55565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611a07573d6000803e3d6000fd5b6005546001600160a01b031633146133b05760405162461bcd60e51b81526004016115a9906154ce565b600c55565b600854604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401612cb0565b6005546001600160a01b0316331461341d5760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b0381166134825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016115a9565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051632c8be28160e21b81526001600160a01b039091169063b22f8a0490611a8890339085906004016155d2565b6001600160a01b03166000908152601b602052604090205460ff1690565b6005546001600160a01b031633146135585760405162461bcd60e51b81526004016115a9906154ce565b6023819055611dc361449b565b6000806135728385615684565b9050838110156135c25760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b60448201526064016115a9565b9392505050565b6001600160a01b03831661362b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016115a9565b6001600160a01b03821661368c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016115a9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6136f7306122fb565b811115613723576000805160206159978339815191526000806000806040516130a19493929190615772565b600e548111156137325750600e545b600061373f8260026146ec565b9050600061374d838361472b565b905081158061375a575080155b1561376457505050565b4761376f833061476d565b8260186000828254613781919061578f565b9091555060009050613793478361472b565b905061379f83826148f0565b82601860008282546137b1919061578f565b909155505060405160008051602061599783398151915290611cf890869084908790600190615772565b6137e4306122fb565b6137ee8284615684565b1115613816576000805160206159dd83398151915282826000604051611b32939291906157a2565b600080600e5484111561382957600e5493505b479150613836843061476d565b613840824761578f565b90508360196000828254613854919061578f565b9091555081905084613864575060005b6008546040516000916001600160a01b03169083908381818185875af1925050503d80600081146138b1576040519150601f19603f3d011682016040523d82523d6000602084013e6138b6565b606091505b50509050600e548511156138ca57600e5494505b4793506138d7853061476d565b6138e1844761578f565b925084601760008282546138f5919061578f565b9091555083905085613905575060005b60006139126002836157ba565b600a546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114613964576040519150601f19603f3d011682016040523d82523d6000602084013e613969565b606091505b50509050806139ba5760405162461bcd60e51b815260206004820152601e60248201527f53656e64696e6720424e4220746f2077616c6c65742031206661696c6564000060448201526064016115a9565b600b546040516000916001600160a01b03169084908381818185875af1925050503d8060008114613a07576040519150601f19603f3d011682016040523d82523d6000602084013e613a0c565b606091505b5050905080613a5d5760405162461bcd60e51b815260206004820152601e60248201527f53656e64696e6720424e4220746f2077616c6c65742032206661696c6564000060448201526064016115a9565b6000828015613a695750815b90506000805160206159dd8339815191528786888015613a865750835b604051613a95939291906157a2565b60405180910390a15050505050505050505050565b6001600160a01b038316613ad05760405162461bcd60e51b81526004016115a9906157dc565b600754600160b01b900460ff1680613b0057506001600160a01b0383166000908152603a602052604090205460ff165b613b4c5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c656460448201526064016115a9565b6007546001600160a01b03848116911614613bd157306001600160a01b03831603613bd15760405162461bcd60e51b815260206004820152602f60248201527f596f752063616e6e6f742073656e6420746f6b656e7320746f2074686520636f60448201526e6e747261637420616464726573732160881b60648201526084016115a9565b80600003613be55761194f8383600061499d565b600754600160a01b900460ff16158015613c1857506001600160a01b03831660009081526035602052604090205460ff16155b8015613c3d57506001600160a01b03821660009081526035602052604090205460ff16155b8015613c6d57506007546001600160a01b0383811691161480613c6d57506007546001600160a01b038481169116145b15614378576001600160a01b038216600090815260366020526040812054600f54603c55601154603d55601354603e55601554603f5560ff16908080613cb286612d36565b6001600160a01b031614158015613cc7575082155b15613cf45760019150613cd985612d36565b601054600f5560125460115560145460135560165460155590505b604354604254613d049190615684565b431015613d2157604454600f556000601181905560138190556015555b6007546001600160a01b03868116911614613da657600c5484613d43876122fb565b613d4d9190615684565b10613da65760405162461bcd60e51b815260206004820152602360248201527f544f4b454e3a2042616c616e636520657863656564732077616c6c65742073696044820152627a652160e81b60648201526084016115a9565b6000613db1306122fb565b90506000601e54118015613dc7575060205460ff165b8015613dd05750835b15613e5657601d546000908152601f6020526040812054613df9906001600160a01b0316611788565b905060008111613e1d57601d8054906000613e1383615821565b9190505550613e54565b600e54811115613e2c5750600e545b601d546000908152601f6020526040902054613e5490899083906001600160a01b0316614ae2565b505b600d5481108015908190613e8357506001600160a01b03881660009081526036602052604090205460ff16155b15613ecd576007805460ff60a01b1916600160a01b17905560335460ff1615613eb157613eb16018546136ee565b613ebf6019546017546137db565b6007805460ff60a01b191690555b85603b819055506000613ef66064613ef06021548a61507a90919063ffffffff16565b906146ec565b905084156141845760005b602354811215614149576001600160a01b03808a166000908152601a602090815260408083208584528252808320546022909252822054603b549190931692613f529161271091613ef0919061507a565b90506001600160a01b038216613f69575050614149565b613f738a8261472b565b9950613f7e82613510565b1580613f8d575060205460ff16155b156140a057613f9d8c838361499d565b6008546001600160a01b031663e30443bc83613fb8816150fc565b6040518363ffffffff1660e01b8152600401613fd592919061560a565b600060405180830381600087803b158015613fef57600080fd5b505af1158015614003573d6000803e3d6000fd5b505050506001600160a01b0382166000908152602660205260408120805483929061402f908490615684565b9250508190555080602960008282546140489190615684565b909155506140589050818561578f565b935060001981836001600160a01b0316600080516020615a258339815191528f602d54602e54602f548a604051614093959493929190615833565b60405180910390a4614134565b6140ab8c308361499d565b60006140b683611788565b116140f957601e80546000908152601f6020526040812080546001600160a01b0319166001600160a01b038616179055815491906140f383615821565b91905055505b6001600160a01b0382166000908152601c602052604081208054839290614121908490615684565b909155506141319050818561578f565b93505b50508080614141906156e6565b915050613f01565b50801561417f5761415a878261472b565b965061416789308361499d565b80601960008282546141799190615684565b90915550505b6141b8565b856141b857614193878261472b565b96506141a089308361499d565b80601960008282546141b29190615684565b90915550505b6000866141c7576013546141cb565b6015545b905060006141eb6064613ef0600f54603b5461507a90919063ffffffff16565b9050600061420b6064613ef0601154603b5461507a90919063ffffffff16565b905060006142296064613ef086603b5461507a90919063ffffffff16565b9050826017600082825461423d9190615684565b9250508190555081601860008282546142569190615684565b92505081905550806019600082825461426f9190615684565b9091555060009050816142828486615684565b61428c9190615684565b90506142988c8261472b565b9b506142a58e308361499d565b6034546008546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015614312575060408051601f3d908101601f1916820190925261430f91810190615623565b60015b1561434c57604051329060019060008051602061595783398151915290614340908790879087908b90615376565b60405180910390a35050505b8a1561436b57603c54600f55603d54601155603e54601355603f546015555b5050505050505050505050505b61438383838361499d565b6008546001600160a01b031663e30443bc8461439e816150fc565b6040518363ffffffff1660e01b81526004016143bb92919061560a565b600060405180830381600087803b1580156143d557600080fd5b505af11580156143e9573d6000803e3d6000fd5b50506008546001600160a01b0316915063e30443bc90508361440a816150fc565b6040518363ffffffff1660e01b815260040161442792919061560a565b600060405180830381600087803b15801561444157600080fd5b505af1158015614455573d6000803e3d6000fd5b5050505061194f6144e8565b600081848411156144855760405162461bcd60e51b81526004016115a99190615226565b506000614492848661578f565b95945050505050565b6000805b6023548112156144d6576000818152602260205260409020546144c29083615684565b9150806144ce816156e6565b91505061449f565b506144e26064826157ba565b60215550565b603054421061454e57602d805490600061450183615821565b90915550614513905042612198615684565b603055602d546000805160206159778339815191529060019061453790829061578f565b604051614545929190615861565b60405180910390a15b60315442106145b657602e805490600061456783615821565b9091555061457a90504262093a80615684565b603155602e546000805160206159778339815191529060029061459f9060019061578f565b6040516145ad929190615861565b60405180910390a15b603254421061461e57602f80549060006145cf83615821565b909155506145e29050426228206f615684565b603255602f54600080516020615977833981519152906003906146079060019061578f565b604051614615929190615861565b60405180910390a15b565b6001600160a01b0382166000908152603660205260409020805460ff191682158015919091179091556146b05760085460405163031e79db60e41b81526001600160a01b03909116906331e79db09061467d908590600401615336565b600060405180830381600087803b15801561469757600080fd5b505af11580156146ab573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60006135c283836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061515b565b60006135c283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614461565b60008211614779575050565b81614783306122fb565b101561479557614792306122fb565b91505b60408051600280825260608201835260009260208301908036833701905050905030816000815181106147ca576147ca615874565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148479190615651565b8160018151811061485a5761485a615874565b6001600160a01b03928316602091820292909201015260065461488091309116856135c9565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906148b99086906000908690889042906004016158ce565b600060405180830381600087803b1580156148d357600080fd5b505af11580156148e7573d6000803e3d6000fd5b50505050505050565b6006546149089030906001600160a01b0316846135c9565b60065460095460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015614978573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ab69190615623565b6001600160a01b0383166149c35760405162461bcd60e51b81526004016115a9906157dc565b6001600160a01b038216614a255760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016115a9565b614a62816040518060600160405280602681526020016159b7602691396001600160a01b0386166000908152602081905260409020549190614461565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614a919082613565565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016136e1565b60008211614aef57505050565b60085460405163c32c293d60e01b8152600091829182916001600160a01b03169063c32c293d90614b24908790600401615336565b602060405180830381865afa158015614b41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b659190615651565b6001600160a01b031603614c9457479150614b80848461476d565b614b8a478361472b565b6001600160a01b038416600090815260276020526040812080549293508692909190614bb7908490615684565b9250508190555083602a6000828254614bd09190615684565b90915550506001600160a01b03831660009081526028602052604081208054839290614bfd908490615684565b9250508190555080602b6000828254614c169190615684565b90915550506001600160a01b0383166000818152601c60205260409081902054602d54602e54602f54935186959394600080516020615a2583398151915293614c68938d939192909160001990615833565b60405180910390a4614c78615189565b6045546001600160a01b0316614c8f575050505050565b614d43565b6045546001600160a01b0316614d4357479150614cb1843061476d565b614cbb478361472b565b6001600160a01b038416600090815260276020526040812080549293508692909190614ce8908490615684565b9250508190555083602a6000828254614d019190615684565b9091555050604580546001600160a01b038086166001600160a01b03199283161790925560468390556047805492881692909116919091179055611ab6615189565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015614dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dd19190615651565b81600081518110614de457614de4615874565b6001600160a01b03928316602091820292909201015260085460455460405163c32c293d60e01b81529183169263c32c293d92614e279290911690600401615336565b602060405180830381865afa158015614e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e689190615651565b81600181518110614e7b57614e7b615874565b6001600160a01b03928316602091820292909201015260065460465460455460405163b6f9de9560e01b81529284169363b6f9de9593614ec7926000928892911690429060040161590a565b6000604051808303818588803b158015614ee057600080fd5b505af193505050508015614ef2575060015b506046546045546001600160a01b031660009081526028602052604081208054909190614f20908490615684565b9091555050604654602b8054600090614f3a908490615684565b9091555050604654604554604754602d54602e54602f5460405186956001600160a01b0390811695600080516020615a2583398151915295614f86959290911693909260001990615833565b60405180910390a460085460405163c32c293d60e01b81526000916001600160a01b03169063c32c293d90614fbf908890600401615336565b602060405180830381865afa158015614fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150009190615651565b6001600160a01b03161461504857604580546001600160a01b038087166001600160a01b0319928316179092556046849055604780549289169290911691909117905561506a565b604580546001600160a01b031990811690915560006046556047805490911690555b615072615189565b505050505050565b60008260000361508c575060006117b4565b6000615098838561593f565b9050826150a585836157ba565b146135c25760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016115a9565b600754600090600160a81b900460ff1661511e57615119826122fb565b6117b4565b6001600160a01b0382166000908152603760205260409020546117b490606490613ef09061514c9083613565565b615155866122fb565b9061507a565b6000818361517c5760405162461bcd60e51b81526004016115a99190615226565b50600061449284866157ba565b601d80546000908152601f60208181526040808420546001600160a01b03168452601c825280842084905584548452919052812080546001600160a01b0319169055815491906151d883615821565b9190505550601e54601d541061461e576000601d819055601e55565b6000806000806080858703121561520a57600080fd5b5050823594602084013594506040840135936060013592509050565b600060208083528351808285015260005b8181101561525357858101830151858201604001528201615237565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611dc357600080fd5b60006020828403121561529b57600080fd5b81356135c281615274565b600080604083850312156152b957600080fd5b82356152c481615274565b946020939093013593505050565b600080604083850312156152e557600080fd5b50508035926020909101359150565b60008060006060848603121561530957600080fd5b833561531481615274565b925060208401359150604084013561532b81615274565b809150509250925092565b6001600160a01b0391909116815260200190565b60008060006060848603121561535f57600080fd5b505081359360208301359350604090920135919050565b93845260208401929092526040830152606082015260800190565b6000806000606084860312156153a657600080fd5b83356153b181615274565b925060208401356153c181615274565b929592945050506040919091013590565b8015158114611dc357600080fd5b6000602082840312156153f257600080fd5b81356135c2816153d2565b9283526020830191909152604082015260600190565b60006020828403121561542557600080fd5b5035919050565b600080600080600060a0868803121561544457600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561547a57600080fd5b823561548581615274565b91506020830135615495816153d2565b809150509250929050565b600080604083850312156154b357600080fd5b82356154be81615274565b9150602083013561549581615274565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f43616e6e6f742073657420424e4272657761726420666565206f766572203225604082015260600190565b600181811c9082168061554c57607f821691505b60208210810361556c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561558457600080fd5b5051919050565b60208082526027908201527f63616e6e6f7420736574207377617020616d6f756e742067726561746572207460408201526668616e202e322560c81b606082015260800190565b6001600160a01b039290921682521515602082015260400190565b6000602082840312156155ff57600080fd5b81516135c2816153d2565b6001600160a01b03929092168252602082015260400190565b60008060006060848603121561563857600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561566357600080fd5b81516135c281615274565b634e487b7160e01b600052601160045260246000fd5b808201808211156117b4576117b461566e565b81810360008312801583831316838312821617156156b7576156b761566e565b5092915050565b80820182811260008312801582168215821617156156de576156de61566e565b505092915050565b60006001600160ff1b0182016156fe576156fe61566e565b5060010190565b60008060008060008060c0878903121561571e57600080fd5b865161572981615274565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6001600160a01b0392831681529116602082015260400190565b938452602084019290925260408301521515606082015260800190565b818103818111156117b4576117b461566e565b92835260208301919091521515604082015260600190565b6000826157d757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6000600182016156fe576156fe61566e565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b60ff929092168252602082015260400190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156158c35781516001600160a01b03168752958201959082019060010161589e565b509495945050505050565b85815284602082015260a0604082015260006158ed60a083018661588a565b6001600160a01b0394909416606083015250608001529392505050565b848152608060208201526000615923608083018661588a565b6001600160a01b03949094166040830152506060015292915050565b80820281158282048414176117b4576117b461566e56fec864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a982fc0b521dd59fa7e30ff6ab6b5392d216cb0bb977e9f16006d7b55b1d726b2935826dab182292d2e5b8adf2856697983c65b882fa567a247222747a43e606d1945524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63658e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd045524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636513556b7ecf6a9419a73bcfcb023a4c3f93d2d1991ed91cb718572f4e079ad3d245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122043b36a9766695d5643ba90bb6f80334e1b972bc0ef0992569d20f0b12b3d4d9c64736f6c6343000812003360c06040526014805462ff0000191690553480156200001d57600080fd5b5060405162002ff738038062002ff783398101604081905262000040916200016d565b60408051808201825260198082527f52756666527566665f4469766964656e645f547261636b6572000000000000006020808401829052845180860190955291845290830152908181600362000097838262000244565b506004620000a6828262000244565b50505050506000620000bd6200016960201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601580546001600160a01b0319166001600160a01b0392909216919091179055633b9aca00608081905260a0526014805462ff0001600160b81b031916767a250d5630b4cf539739df2c5dacb4c659f2488d00010117905562000310565b3390565b6000602082840312156200018057600080fd5b81516001600160a01b03811681146200019857600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001ca57607f821691505b602082108103620001eb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200023f57600081815260208120601f850160051c810160208610156200021a5750805b601f850160051c820191505b818110156200023b5782815560010162000226565b5050505b505050565b81516001600160401b038111156200026057620002606200019f565b6200027881620002718454620001b5565b84620001f1565b602080601f831160018114620002b05760008415620002975750858301515b600019600386901b1c1916600185901b1785556200023b565b600085815260208120601f198616915b82811015620002e157888601518255948401946001909101908401620002c0565b5085821015620003005787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051612cb362000344600039600081816108eb01526114a20152600081816107a101526114ee0152612cb36000f3fe6080604052600436106102745760003560e01c806303c833021461028857806306fdde0314610290578063095ea7b3146102bb57806309bbedde146102eb5780631694505e1461030a57806318160ddd1461033e5780631d4ff89a14610353578063226cfa3d1461038357806323b872dd146103b057806327ce0147146103d05780633009a609146103f0578063313ce5671461040657806331e79db0146104225780633599bb1714610442578063395093511461046257806340ffdd801461048257806341808904146104a25780634e5ee1c0146104c15780634e7b827f146104f15780635123425b146105215780635183d6fd146105415780635b72c18c1461059857806365b8dbc0146105d15780636a474002146105f15780636b69163b146106065780636d48467b1461063657806370a082311461065657806370d3c747146106765780637bb4a991146106ac57806385a6b3ae146106cc5780638bc1d639146106e25780638da5cb5b1461070257806391b89fba1461072057806395d89b41146107405780639c3372ea146107555780639eec101e14610775578063a1363cda1461078f578063a4234069146107c3578063a457c2d7146107e3578063a8b9d24014610803578063a9059cbb14610823578063aafd847a14610843578063b22f8a0414610879578063ba079d4914610899578063bc4c4b37146108b9578063be10b614146108d9578063c32c293d1461090d578063d182f93414610946578063dd62ed3e1461095e578063e30443bc146109a4578063e7841ec0146109c4578063f2fde38b146109d9578063f7dd53a9146109f9578063fbcbc0f114610a19578063ffb2c47914610a3957600080fd5b3661028357610281610a74565b005b600080fd5b610281610a74565b34801561029c57600080fd5b506102a5610b07565b6040516102b291906127fb565b60405180910390f35b3480156102c757600080fd5b506102db6102d6366004612861565b610b99565b60405190151581526020016102b2565b3480156102f757600080fd5b50600a545b6040519081526020016102b2565b34801561031657600080fd5b5060145461033190630100000090046001600160a01b031681565b6040516102b2919061288d565b34801561034a57600080fd5b506002546102fc565b34801561035f57600080fd5b506102db61036e3660046128a1565b60116020526000908152604090205460ff1681565b34801561038f57600080fd5b506102fc61039e3660046128a1565b60166020526000908152604090205481565b3480156103bc57600080fd5b506102db6103cb3660046128be565b610bb0565b3480156103dc57600080fd5b506102fc6103eb3660046128a1565b610c19565b3480156103fc57600080fd5b506102fc600e5481565b34801561041257600080fd5b50604051600981526020016102b2565b34801561042e57600080fd5b5061028161043d3660046128a1565b610c72565b34801561044e57600080fd5b5061028161045d36600461290d565b610d3b565b34801561046e57600080fd5b506102db61047d366004612861565b610dda565b34801561048e57600080fd5b5061028161049d36600461290d565b610e10565b3480156104ae57600080fd5b506014546102db90610100900460ff1681565b3480156104cd57600080fd5b506102db6104dc3660046128a1565b60136020526000908152604090205460ff1681565b3480156104fd57600080fd5b506102db61050c3660046128a1565b600f6020526000908152604090205460ff1681565b34801561052d57600080fd5b5061028161053c36600461292a565b610ea2565b34801561054d57600080fd5b5061056161055c366004612963565b610ef7565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016102b2565b3480156105a457600080fd5b506102db6105b33660046128a1565b6001600160a01b031660009081526013602052604090205460ff1690565b3480156105dd57600080fd5b506102816105ec3660046128a1565b610f57565b3480156105fd57600080fd5b50610281610fad565b34801561061257600080fd5b506102db6106213660046128a1565b60106020526000908152604090205460ff1681565b34801561064257600080fd5b506102db6106513660046128a1565b611057565b34801561066257600080fd5b506102fc6106713660046128a1565b6110a3565b34801561068257600080fd5b506103316106913660046128a1565b6012602052600090815260409020546001600160a01b031681565b3480156106b857600080fd5b50601554610331906001600160a01b031681565b3480156106d857600080fd5b506102fc60085481565b3480156106ee57600080fd5b506102816106fd36600461292a565b6110be565b34801561070e57600080fd5b506009546001600160a01b0316610331565b34801561072c57600080fd5b506102fc61073b3660046128a1565b611113565b34801561074c57600080fd5b506102a561111e565b34801561076157600080fd5b5061028161077036600461290d565b61112d565b34801561078157600080fd5b506014546102db9060ff1681565b34801561079b57600080fd5b506102fc7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107cf57600080fd5b506014546102db9062010000900460ff1681565b3480156107ef57600080fd5b506102db6107fe366004612861565b6111af565b34801561080f57600080fd5b506102fc61081e3660046128a1565b6111fe565b34801561082f57600080fd5b506102db61083e366004612861565b61122a565b34801561084f57600080fd5b506102fc61085e3660046128a1565b6001600160a01b031660009081526007602052604090205490565b34801561088557600080fd5b5061028161089436600461292a565b611237565b3480156108a557600080fd5b506102db6108b43660046128a1565b61128c565b3480156108c557600080fd5b506102db6108d436600461292a565b6112d8565b3480156108e557600080fd5b506102fc7f000000000000000000000000000000000000000000000000000000000000000081565b34801561091957600080fd5b506103316109283660046128a1565b6001600160a01b039081166000908152601260205260409020541690565b34801561095257600080fd5b5060145460ff166102db565b34801561096a57600080fd5b506102fc61097936600461297c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109b057600080fd5b506102816109bf366004612861565b611456565b3480156109d057600080fd5b50600e546102fc565b3480156109e557600080fd5b506102816109f43660046128a1565b61152a565b348015610a0557600080fd5b50610281610a1436600461297c565b611615565b348015610a2557600080fd5b50610561610a343660046128a1565b6116e1565b348015610a4557600080fd5b50610a59610a54366004612963565b611790565b604080519384526020840192909252908201526060016102b2565b6000610a7f60025490565b11610a8957600080fd5b3415610b0557610abc610a9b60025490565b610aa934600160801b6118b5565b610ab391906129c0565b6005549061193e565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b01903461193e565b6008555b565b606060038054610b16906129e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b42906129e2565b8015610b8f5780601f10610b6457610100808354040283529160200191610b8f565b820191906000526020600020905b815481529060010190602001808311610b7257829003601f168201915b5050505050905090565b6000610ba633848461199b565b5060015b92915050565b6000610bbd848484611abf565b610c0f8433610c0a85604051806060016040528060288152602001612c11602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611b24565b61199b565b5060019392505050565b6001600160a01b038116600090815260066020526040812054600160801b90610c6890610c6390610c5d610c58610c4f886110a3565b600554906118b5565b611b5e565b90611b6e565b611bac565b610baa91906129c0565b6009546001600160a01b03163314610ca55760405162461bcd60e51b8152600401610c9c90612a1c565b60405180910390fd5b6001600160a01b0381166000908152600f602052604090205460ff1615610ccb57600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610cf9908290611bbf565b610d04600a82611c12565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610d655760405162461bcd60e51b8152600401610c9c90612a1c565b801515601460029054906101000a900460ff16151503610d8457600080fd5b60148054821515620100000262ff0000199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610dcf90831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610ba6918590610c0a908661193e565b6009546001600160a01b03163314610e3a5760405162461bcd60e51b8152600401610c9c90612a1c565b801515601460019054906101000a900460ff16151503610e5957600080fd5b601480548215156101000261ff00199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610dcf90831515815260200190565b6009546001600160a01b03163314610ecc5760405162461bcd60e51b8152600401610c9c90612a1c565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b600080600080600080610f09600a5490565b8710610f28575060009450600019935083925084915081905080610f4e565b6000610f35600a89611d4d565b9050610f40816116e1565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610f815760405162461bcd60e51b8152600401610c9c90612a1c565b601480546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60405162461bcd60e51b815260206004820152606d60248201527f52756666527566665f4469766964656e645f547261636b65723a20776974686460448201527f7261774469766964656e642064697361626c65642e205573652074686520276360648201527f6c61696d272066756e6374696f6e206f6e20746865206d61696e20527566665260848201526c3ab3331031b7b73a3930b1ba1760991b60a482015260c401610c9c565b6009546000906001600160a01b031633146110845760405162461bcd60e51b8152600401610c9c90612a1c565b506001600160a01b031660009081526010602052604090205460ff1690565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b031633146110e85760405162461bcd60e51b8152600401610c9c90612a1c565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610baa826111fe565b606060048054610b16906129e2565b6009546001600160a01b031633146111575760405162461bcd60e51b8152600401610c9c90612a1c565b60145481151560ff90911615150361116e57600080fd5b6014805460ff19168215159081179091556040519081527f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890602001610dcf565b6000610ba63384610c0a85604051806060016040528060258152602001612c59602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611b24565b6001600160a01b038116600090815260076020526040812054610baa9061122484610c19565b90611d80565b6000610ba6338484611abf565b6009546001600160a01b031633146112615760405162461bcd60e51b8152600401610c9c90612a1c565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b031633146112b95760405162461bcd60e51b8152600401610c9c90612a1c565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146113055760405162461bcd60e51b8152600401610c9c90612a1c565b60145462010000900460ff161561131e57506000610baa565b6001600160a01b03831660009081526011602052604090205460ff168280156113445750805b80156113585750601454610100900460ff16155b15611367576000915050610baa565b60008161137c5761137785611dc2565b611385565b611385856120d5565b9050801561144b576001600160a01b038516600090815260166020526040902042905581156113f957831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c836040516113ec91815260200190565b60405180910390a3611440565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0928360405161143791815260200190565b60405180910390a35b600192505050610baa565b506000949350505050565b6009546001600160a01b031633146114805760405162461bcd60e51b8152600401610c9c90612a1c565b6001600160a01b0382166000908152600f602052604090205460ff166114de577f00000000000000000000000000000000000000000000000000000000000000008110156114e2576114d3600a83611c12565b6114de826000611bbf565b5050565b6114ec8282611bbf565b7f0000000000000000000000000000000000000000000000000000000000000000811061151f576114de600a8383612463565b6114de600a83611c12565b6009546001600160a01b031633146115545760405162461bcd60e51b8152600401610c9c90612a1c565b6001600160a01b0381166115b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c9c565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b0316331461163f5760405162461bcd60e51b8152600401610c9c90612a1c565b6001600160a01b03811660009081526013602052604090205460ff168061166d57506001600160a01b038116155b6116b35760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881b9bdd081a5b88185b1b1bddc81b1a5cdd604a1b6044820152606401610c9c565b6001600160a01b03918216600090815260126020526040902080546001600160a01b03191691909216179055565b806000808080806116f3600a8761250c565b945060001993506000851261175557600e5485111561172157600e5461171a908690612557565b9350611755565b600e54600a5460009110611736576000611745565b600e54600a5461174591611d80565b90506117518682611b6e565b9450505b61175e866111fe565b925061176986610c19565b6001600160a01b038716600090815260166020526040902054969895975093959294915050565b600a54600090819081908015806117af575060145462010000900460ff165b156117c5575050600e54600092508291506118ae565b600e546000805a90506000805b89841080156117e057508582105b1561189d57846117ef81612a51565b9550508585106117fe57600094505b6000600a600001868154811061181657611816612a6a565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff16611863576118508160016112d8565b15611863578161185f81612a51565b9250505b8261186d81612a51565b93505060005a9050808511156118945761189161188a8683611d80565b879061193e565b95505b93506117d29050565b600e85905590975095509193505050505b9193909250565b6000826000036118c757506000610baa565b60006118d38385612a80565b9050826118e085836129c0565b146119375760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c9c565b9392505050565b60008061194b8385612a97565b9050838110156119375760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b6044820152606401610c9c565b6001600160a01b0383166119fd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c9c565b6001600160a01b038216611a5e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c9c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602f60248201527f52756666527566665f4469766964656e645f547261636b65723a204e6f20747260448201526e185b9cd9995c9cc8185b1b1bddd959608a1b6064820152608401610c9c565b505050565b60008184841115611b485760405162461bcd60e51b8152600401610c9c91906127fb565b506000611b558486612aaa565b95945050505050565b60008181811215610baa57600080fd5b600080611b7b8385612abd565b905060008312158015611b8e5750838112155b80611ba35750600083128015611ba357508381125b61193757600080fd5b600080821215611bbb57600080fd5b5090565b6000611bca836110a3565b905080821115611bf2576000611be08383611d80565b9050611bec8482612594565b50505050565b80821015611b1f576000611c068284611d80565b9050611bec84826125f8565b6001600160a01b038116600090815260038301602052604090205460ff16611c38575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611c8291612aaa565b90506000846000018281548110611c9b57611c9b612a6a565b60009182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611cea57611cea612a6a565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611d2457611d24612ae5565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000826000018281548110611d6457611d64612a6a565b6000918252602090912001546001600160a01b03169392505050565b600061193783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b24565b600080611dce836111fe565b905080156120cc576001600160a01b038316600090815260076020526040902054611df9908261193e565b6001600160a01b0380851660009081526007602090815260408083209490945560129052918220546014549116919060ff161580611e3e57506001600160a01b038216155b80611e6257506001600160a01b03821660009081526013602052604090205460ff16155b15611ec5576040516001600160a01b03861690610bb89085906000818181858888f193505050503d8060008114611eb5576040519150601f19603f3d011682016040523d82523d6000602084013e611eba565b606091505b505080915050612032565b604080516002808252606082018352600092602083019080368337019050509050601460039054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5d9190612afb565b81600081518110611f7057611f70612a6a565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611fa457611fa4612a6a565b6001600160a01b03928316602091820292909201015260145460405163b6f9de9560e01b815263010000009091049091169063b6f9de95908690611ff39060009086908c904290600401612b5c565b6000604051808303818588803b15801561200c57600080fd5b505af19350505050801561201e575060015b61202b5760009150612030565b600191505b505b80612080576001600160a01b03851660009081526007602052604090205461205a9084611d80565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d846040516120bb91815260200190565b60405180910390a250909392505050565b50600092915050565b6000806120e1836111fe565b905080156120cc576001600160a01b03831660009081526007602052604081205461210c908361193e565b6001600160a01b0385166000908152600760205260408082209290925581516002808252606082019093529091816020016020820280368337019050509050601460039054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561219e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c29190612afb565b816000815181106121d5576121d5612a6a565b6001600160a01b03928316602091820292909201015260155482519116908290600190811061220657612206612a6a565b6001600160a01b0392831660209182029290920101526015546040516370a0823160e01b815260009291909116906370a082319061224890309060040161288d565b602060405180830381865afa158015612265573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122899190612b91565b60145460405163b6f9de9560e01b8152919250630100000090046001600160a01b03169063b6f9de959086906122ca90600090879030904290600401612b5c565b6000604051808303818588803b1580156122e357600080fd5b505af1935050505080156122f5575060015b612302576000925061240a565b6015546040516370a0823160e01b815260009161237a9184916001600160a01b0316906370a082319061233990309060040161288d565b602060405180830381865afa158015612356573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112249190612b91565b905080156124035760155460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af11580156123d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fd9190612baa565b50612408565b600093505b505b82612459576001600160a01b0386166000908152600760205260409020546124329085611d80565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff16156124a8576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166125375750600019610baa565b506001600160a01b03166000908152600291909101602052604090205490565b6000806125648385612bc7565b9050600083121580156125775750838113155b80611ba35750600083128015611ba3575083811361193757600080fd5b61259e828261263c565b6125d86125b9610c58836005546118b590919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490612557565b6001600160a01b0390921660009081526006602052604090209190915550565b6126028282612709565b6125d861261d610c58836005546118b590919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611b6e565b6001600160a01b0382166126925760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610c9c565b60025461269f908261193e565b6002556001600160a01b0382166000908152602081905260409020546126c5908261193e565b6001600160a01b03831660008181526020818152604080832094909455925184815291929091600080516020612c3983398151915291015b60405180910390a35050565b6001600160a01b0382166127695760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c9c565b6127a681604051806060016040528060228152602001612bef602291396001600160a01b0385166000908152602081905260409020549190611b24565b6001600160a01b0383166000908152602081905260409020556002546127cc9082611d80565b6002556040518181526000906001600160a01b03841690600080516020612c39833981519152906020016126fd565b600060208083528351808285015260005b818110156128285785810183015185820160400152820161280c565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461285e57600080fd5b50565b6000806040838503121561287457600080fd5b823561287f81612849565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000602082840312156128b357600080fd5b813561193781612849565b6000806000606084860312156128d357600080fd5b83356128de81612849565b925060208401356128ee81612849565b929592945050506040919091013590565b801515811461285e57600080fd5b60006020828403121561291f57600080fd5b8135611937816128ff565b6000806040838503121561293d57600080fd5b823561294881612849565b91506020830135612958816128ff565b809150509250929050565b60006020828403121561297557600080fd5b5035919050565b6000806040838503121561298f57600080fd5b823561299a81612849565b9150602083013561295881612849565b634e487b7160e01b600052601160045260246000fd5b6000826129dd57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806129f657607f821691505b602082108103612a1657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060018201612a6357612a636129aa565b5060010190565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610baa57610baa6129aa565b80820180821115610baa57610baa6129aa565b81810381811115610baa57610baa6129aa565b8082018281126000831280158216821582161715612add57612add6129aa565b505092915050565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612b0d57600080fd5b815161193781612849565b600081518084526020808501945080840160005b83811015612b515781516001600160a01b031687529582019590820190600101612b2c565b509495945050505050565b848152608060208201526000612b756080830186612b18565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215612ba357600080fd5b5051919050565b600060208284031215612bbc57600080fd5b8151611937816128ff565b8181036000831280158383131683831282161715612be757612be76129aa565b509291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122015da9bcc46c75c387f654715b906891747ede8f0f6650aa4fd27943d6ff528fa64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106105655760003560e01c8063871c128d116102c1578063871c128d14610db657806388a9d55414610dd657806388bdd9be14610deb5780638a8c523c14610e0b5780638da5cb5b14610e205780638f3fa86014610e35578063906e9dd014610e4b578063913c7df614610e6b57806395d89b4114610e9857806398118cb414610ead5780639a7a23d614610ec35780639b45900814610ee35780639c1b8af514610efe5780639c3372ea14610f145780639d325abd14610f34578063a18a7bfc14610f49578063a3e1096e14610f69578063a3ec8c8914610f7f578063a457c2d714610f9a578063a5ece94114610fba578063a8b9d24014610fda578063a9059cbb14610ffa578063ad56c13c1461101a578063ad8e749514611071578063b62496f51461109e578063b8429e05146110ce578063ba079d49146110e8578063bc7f25e414611108578063befa65aa14611128578063c02466681461113e578063c07b528a1461115e578063c32c293d1461118b578063c64e5aa0146111ab578063ce7d83f6146111c1578063d07a091c146111e1578063d35e3cd014611201578063d37e095214611217578063d46980161461122d578063d564af3a1461124d578063d5a1b7191461126d578063d5e37251146112dc578063d8032ed3146112fc578063db74559b1461131c578063dd62ed3e14611349578063e2f456051461138f578063e37ba8f9146113a5578063e409bfad146113c5578063e718ae92146113db578063e7300d3b146113fb578063e76e98621461141b578063e7841ec014611431578063ea1644d514611446578063ea2290ba14611466578063ec0d3fb114611486578063f1c0ddff1461149c578063f27fd254146114c9578063f2fde38b146114e9578063f5d3c79a14611509578063f94ce0d214611529578063fa95619614611549578063fb0b8dc01461156957600080fd5b806301abc132146105715780630224e9a71461059357806306fdde03146105bc57806309239b2b146105de578063095ea7b3146105fe5780630ef35b7e1461062e57806313616b4a1461064e5780631694505e1461066e57806318160ddd1461069b57806318ad81f8146106b05780631a676afa146106f15780631e093e941461071157806323b872dd1461073a57806324acbd691461075a5780632a84ff51146107905780632c1f5216146107d357806330bb4cff146107f3578063313ce567146108085780633599bb171461082457806337e84502146108445780633944784d1461086457806339509351146108885780633c295986146108a857806340ffdd80146108be578063435c89e4146108de57806343e716fe1461090b578063446d49da1461092b578063457ffca2146109415780634625830e1461096157806346585f741461098157806349bd5a5e146109975780634a74bb02146109b75780634ad12ec0146109d15780634ada218b146109e75780634e71d92d14610a085780634fbee19314610a1d57806350a0ccac14610a565780635123425b14610a6c5780635424226d14610a8c578063551e5f8d14610ab95780635764b7c414610ad95780635b72c18c14610b0f5780635e52a00b14610b2f5780635eb402a414610b655780636094c4ce14610b9257806363b4bc5314610bbf57806364b0f65314610bdf57806365b8dbc014610bf45780636843cd8414610c145780636d48467b14610c345780636e94729814610c54578063700bb19114610c6757806370a0823114610c875780637b0bbe9714610ca75780637b1a490914610cbd5780637d32f34214610cdd578063838a538614610d0a578063847ff70214610d2a57806384ae2bc614610d4a57806385e12a9414610d60578063868730c714610d9657600080fd5b3661056c57005b600080fd5b34801561057d57600080fd5b5061059161058c3660046151f4565b61157f565b005b34801561059f57600080fd5b506105a9600f5481565b6040519081526020015b60405180910390f35b3480156105c857600080fd5b506105d16116f6565b6040516105b39190615226565b3480156105ea57600080fd5b506105a96105f9366004615289565b611788565b34801561060a57600080fd5b5061061e6106193660046152a6565b6117a3565b60405190151581526020016105b3565b34801561063a57600080fd5b506105916106493660046152d2565b6117ba565b34801561065a57600080fd5b506105916106693660046152f4565b6118ad565b34801561067a57600080fd5b5060065461068e906001600160a01b031681565b6040516105b39190615336565b3480156106a757600080fd5b506002546105a9565b3480156106bc57600080fd5b5061068e6106cb3660046152a6565b601a6020908152600092835260408084209091529082529020546001600160a01b031681565b3480156106fd57600080fd5b5061059161070c36600461534a565b611912565b34801561071d57600080fd5b50602c54602d54602e54602f546040516105b39493929190615376565b34801561074657600080fd5b5061061e610755366004615391565b611954565b34801561076657600080fd5b506105a9610775366004615289565b6001600160a01b031660009081526024602052604090205490565b34801561079c57600080fd5b5061068e6107ab3660046152a6565b6001600160a01b039182166000908152601a6020908152604080832093835292905220541690565b3480156107df57600080fd5b5060085461068e906001600160a01b031681565b3480156107ff57600080fd5b506105a96119bd565b34801561081457600080fd5b50604051600981526020016105b3565b34801561083057600080fd5b5061059161083f3660046153e0565b611a30565b34801561085057600080fd5b5061059161085f3660046152d2565b611abd565b34801561087057600080fd5b50610879611b3e565b6040516105b3939291906153fd565b34801561089457600080fd5b5061061e6108a33660046152a6565b611b89565b3480156108b457600080fd5b506105a9600e5481565b3480156108ca57600080fd5b506105916108d93660046153e0565b611bbf565b3480156108ea57600080fd5b506105a96108f9366004615413565b60396020526000908152604090205481565b34801561091757600080fd5b50610591610926366004615413565b611c1a565b34801561093757600080fd5b506105a960295481565b34801561094d57600080fd5b5061059161095c36600461542c565b611c6d565b34801561096d57600080fd5b5061059161097c366004615413565b611d07565b34801561098d57600080fd5b506105a960315481565b3480156109a357600080fd5b5060075461068e906001600160a01b031681565b3480156109c357600080fd5b5060335461061e9060ff1681565b3480156109dd57600080fd5b506105a960305481565b3480156109f357600080fd5b5060075461061e90600160b01b900460ff1681565b348015610a1457600080fd5b50610591611d4d565b348015610a2957600080fd5b5061061e610a38366004615289565b6001600160a01b031660009081526035602052604090205460ff1690565b348015610a6257600080fd5b506105a960125481565b348015610a7857600080fd5b50610591610a87366004615467565b611dc6565b348015610a9857600080fd5b506105a9610aa7366004615289565b60276020526000908152604090205481565b348015610ac557600080fd5b50610591610ad4366004615413565b611edd565b348015610ae557600080fd5b506105a9610af4366004615289565b6001600160a01b031660009081526026602052604090205490565b348015610b1b57600080fd5b5061061e610b2a366004615289565b611f23565b348015610b3b57600080fd5b50336000908152601a602090815260408083208380529091529020546001600160a01b031661068e565b348015610b7157600080fd5b506105a9610b80366004615413565b60226020526000908152604090205481565b348015610b9e57600080fd5b506105a9610bad366004615289565b60256020526000908152604090205481565b348015610bcb57600080fd5b50610591610bda3660046152f4565b611f95565b348015610beb57600080fd5b506105a961208b565b348015610c0057600080fd5b50610591610c0f366004615289565b6120d5565b348015610c2057600080fd5b506105a9610c2f366004615289565b61219c565b348015610c4057600080fd5b5061061e610c4f366004615289565b61220e565b348015610c6057600080fd5b50476105a9565b348015610c7357600080fd5b50610591610c82366004615413565b61223f565b348015610c9357600080fd5b506105a9610ca2366004615289565b6122fb565b348015610cb357600080fd5b506105a9601d5481565b348015610cc957600080fd5b50610591610cd83660046152a6565b612316565b348015610ce957600080fd5b506105a9610cf8366004615289565b60386020526000908152604090205481565b348015610d1657600080fd5b50610591610d2536600461534a565b612376565b348015610d3657600080fd5b50610591610d45366004615289565b6123ae565b348015610d5657600080fd5b506105a960215481565b348015610d6c57600080fd5b506105a9610d7b366004615289565b6001600160a01b031660009081526025602052604090205490565b348015610da257600080fd5b50610591610db13660046153e0565b6123fa565b348015610dc257600080fd5b50610591610dd1366004615413565b61242c565b348015610de257600080fd5b506105a96124d5565b348015610df757600080fd5b50610591610e06366004615289565b6124e0565b348015610e1757600080fd5b5061059161278b565b348015610e2c57600080fd5b5061068e61282f565b348015610e4157600080fd5b506105a9600c5481565b348015610e5757600080fd5b50610591610e66366004615289565b61283e565b348015610e7757600080fd5b506105a9610e86366004615413565b60009081526022602052604090205490565b348015610ea457600080fd5b506105d161288a565b348015610eb957600080fd5b506105a960115481565b348015610ecf57600080fd5b50610591610ede366004615467565b612899565b348015610eef57600080fd5b50601954601754601854610879565b348015610f0a57600080fd5b506105a960345481565b348015610f2057600080fd5b50610591610f2f3660046153e0565b6128ec565b348015610f4057600080fd5b506023546105a9565b348015610f5557600080fd5b50610591610f64366004615289565b612948565b348015610f7557600080fd5b506105a960105481565b348015610f8b57600080fd5b50603054603154603254610879565b348015610fa657600080fd5b5061061e610fb53660046152a6565b612be6565b348015610fc657600080fd5b50600a5461068e906001600160a01b031681565b348015610fe657600080fd5b506105a9610ff5366004615289565b612c35565b34801561100657600080fd5b5061061e6110153660046152a6565b612c66565b34801561102657600080fd5b5061103a611035366004615289565b612c73565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016105b3565b34801561107d57600080fd5b506105a961108c366004615289565b60286020526000908152604090205481565b3480156110aa57600080fd5b5061061e6110b9366004615289565b60366020526000908152604090205460ff1681565b3480156110da57600080fd5b5060205461061e9060ff1681565b3480156110f457600080fd5b5061061e611103366004615289565b612d05565b34801561111457600080fd5b5061068e611123366004615289565b612d36565b34801561113457600080fd5b506105a960135481565b34801561114a57600080fd5b50610591611159366004615467565b612d5f565b34801561116a57600080fd5b506105a9611179366004615289565b60266020526000908152604090205481565b34801561119757600080fd5b5061068e6111a6366004615289565b612e15565b3480156111b757600080fd5b506105a960155481565b3480156111cd57600080fd5b506105a96111dc366004615289565b612e87565b3480156111ed57600080fd5b506105916111fc366004615289565b612ee1565b34801561120d57600080fd5b506105a9602a5481565b34801561122357600080fd5b506105a9601e5481565b34801561123957600080fd5b5060095461068e906001600160a01b031681565b34801561125957600080fd5b50610591611268366004615413565b612f6f565b34801561127957600080fd5b506112b7611288366004615413565b6000908152601f6020908152604080832054601e546001600160a01b03909116808552601c9093529220549092565b604080516001600160a01b0390941684526020840192909252908201526060016105b3565b3480156112e857600080fd5b506105916112f73660046153e0565b613023565b34801561130857600080fd5b50610591611317366004615289565b6130ac565b34801561132857600080fd5b506105a9611337366004615289565b60246020526000908152604090205481565b34801561135557600080fd5b506105a96113643660046154a0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561139b57600080fd5b506105a9600d5481565b3480156113b157600080fd5b506105916113c0366004615289565b6131e2565b3480156113d157600080fd5b506105a960325481565b3480156113e757600080fd5b506105916113f63660046153e0565b613274565b34801561140757600080fd5b506105916114163660046151f4565b6132fe565b34801561142757600080fd5b506105a960165481565b34801561143d57600080fd5b506105a961333c565b34801561145257600080fd5b50610591611461366004615413565b613386565b34801561147257600080fd5b50600b5461068e906001600160a01b031681565b34801561149257600080fd5b506105a9602b5481565b3480156114a857600080fd5b506105a96114b7366004615289565b60376020526000908152604090205481565b3480156114d557600080fd5b5061103a6114e4366004615413565b6133b5565b3480156114f557600080fd5b50610591611504366004615289565b6133f3565b34801561151557600080fd5b506105916115243660046153e0565b6134de565b34801561153557600080fd5b5061061e611544366004615289565b613510565b34801561155557600080fd5b50610591611564366004615413565b61352e565b34801561157557600080fd5b506105a960145481565b6005546001600160a01b031633146115b25760405162461bcd60e51b81526004016115a9906154ce565b60405180910390fd5b60028211156115d35760405162461bcd60e51b81526004016115a990615503565b60028111156115f45760405162461bcd60e51b81526004016115a990615503565b600a8411156116435760405162461bcd60e51b815260206004820152601b60248201527a43616e6e6f74207365742064657620666565206f7665722031302560281b60448201526064016115a9565b600a83111561169e5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f7420736574206c697175696469747920666565206f7665722031306044820152602560f81b60648201526084016115a9565b60108490556012839055601482905560168190556040517f7930d77b0ffd67679071b576440d6e525f442ff3f55db20413eed41d88c81583906116e8908690869086908690615376565b60405180910390a150505050565b60606003805461170590615538565b80601f016020809104026020016040519081016040528092919081815260200182805461173190615538565b801561177e5780601f106117535761010080835404028352916020019161177e565b820191906000526020600020905b81548152906001019060200180831161176157829003601f168201915b5050505050905090565b6001600160a01b03166000908152601c602052604090205490565b60006117b03384846135c9565b5060015b92915050565b6005546001600160a01b031633146117e45760405162461bcd60e51b81526004016115a9906154ce565b6000828152603960205260409020548190036117ff57600080fd5b60648111156118505760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e27742065786365656420313030000060448201526064016115a9565b6000811161189b5760405162461bcd60e51b815260206004820152601860248201527705374616b696e6720626f6e75732063616e277420626520360441b60448201526064016115a9565b60009182526039602052604090912055565b6005546001600160a01b031633146118d75760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b039283166000908152601a602090815260408083209483529390529190912080546001600160a01b03191691909216179055565b6005546001600160a01b0316331461193c5760405162461bcd60e51b81526004016115a9906154ce565b611945816136ee565b61194f83836137db565b505050565b6000611961848484613aaa565b6119b384336119ae856040518060600160405280602881526020016159fd602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190614461565b6135c9565b5060019392505050565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2b9190615572565b905090565b6005546001600160a01b03163314611a5a5760405162461bcd60e51b81526004016115a9906154ce565b600854604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b158015611aa257600080fd5b505af1158015611ab6573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314611ae75760405162461bcd60e51b81526004016115a9906154ce565b6000828152602260205260409020819055611b0061449b565b60408051838152602081018390527fbfe4066ad4b56591d9738665ba86b038826d6ec196bd3e4c2305847c22eb02a891015b60405180910390a15050565b600554600090819081906001600160a01b03163314611b6f5760405162461bcd60e51b81526004016115a9906154ce565b611b776144e8565b50506030546031546032549193909250565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916117b09185906119ae9086613565565b6005546001600160a01b03163314611be95760405162461bcd60e51b81526004016115a9906154ce565b6008546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd8090602401611a88565b6005546001600160a01b03163314611c445760405162461bcd60e51b81526004016115a9906154ce565b6301312d00811115611c685760405162461bcd60e51b81526004016115a99061558b565b600d55565b6005546001600160a01b03163314611c975760405162461bcd60e51b81526004016115a9906154ce565b600f8590556011849055601383905560158290556021819055604080518681526020810186905290810184905260608101839052608081018290527fda70e0b1954bcd95873c930c54e19a24ff3b2f024251a9eb0756e67a7794711e9060a0015b60405180910390a15050505050565b6005546001600160a01b03163314611d315760405162461bcd60e51b81526004016115a9906154ce565b600754600160b01b900460ff1615611d4857600080fd5b604455565b60085460405163bc4c4b3760e01b81526001600160a01b039091169063bc4c4b3790611d809033906000906004016155d2565b6020604051808303816000875af1158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc391906155ed565b50565b6005546001600160a01b03163314611df05760405162461bcd60e51b81526004016115a9906154ce565b306001600160a01b03831603611e485760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420757365206e617469766520746f6b656e20616464726573730060448201526064016115a9565b600854604051635123425b60e01b81526001600160a01b0390911690635123425b90611e7a90859085906004016155d2565b600060405180830381600087803b158015611e9457600080fd5b505af1158015611ea8573d6000803e3d6000fd5b505050507ff8e5e8c18b9fbb7607019e8dab60e0ad981ba259df038a668fc13025a64854d68282604051611b329291906155d2565b6005546001600160a01b03163314611f075760405162461bcd60e51b81526004016115a9906154ce565b600754600160b01b900460ff1615611f1e57600080fd5b604355565b6008546040516316dcb06360e21b81526000916001600160a01b031690635b72c18c90611f54908590600401615336565b602060405180830381865afa158015611f71573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b491906155ed565b6005546001600160a01b03163314611fbf5760405162461bcd60e51b81526004016115a9906154ce565b306001600160a01b038416036120145760405162461bcd60e51b815260206004820152601a60248201527921b0b73737ba103932b6b7bb32903730ba34bb32903a37b5b2b760311b60448201526064016115a9565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90612042908490869060040161560a565b6020604051808303816000875af1158015612061573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208591906155ed565b50505050565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611a07573d6000803e3d6000fd5b6005546001600160a01b031633146120ff5760405162461bcd60e51b81526004016115a9906154ce565b6006546001600160a01b039081169082160361211a57600080fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0383811691909117909155600854604051630196e36f60e61b81529116906365b8dbc090611a88908490600401615336565b6008546040516370a0823160e01b81526000916001600160a01b0316906370a08231906121cd908590600401615336565b602060405180830381865afa1580156121ea573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b49190615572565b600854604051636d48467b60e01b81526000916001600160a01b031690636d48467b90611f54908590600401615336565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015612292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b69190615623565b925092509250326001600160a01b031660001515600080516020615957833981519152858585896040516122ed9493929190615376565b60405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146123405760405162461bcd60e51b81526004016115a9906154ce565b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561194f573d6000803e3d6000fd5b6005546001600160a01b031633146123a05760405162461bcd60e51b81526004016115a9906154ce565b603092909255603155603255565b6005546001600160a01b031633146123d85760405162461bcd60e51b81526004016115a9906154ce565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051638bc1d63960e01b81526001600160a01b0390911690638bc1d63990611a8890339085906004016155d2565b6005546001600160a01b031633146124565760405162461bcd60e51b81526004016115a9906154ce565b62030d40811015801561246c57506207a1208111155b6124d05760405162461bcd60e51b815260206004820152602f60248201527f6e6577206761732076616c7565206d757374206265206265747765656e20323060448201526e03030303020616e642035303030303608c1b60648201526084016115a9565b603455565b6000611a2b306122fb565b6005546001600160a01b0316331461250a5760405162461bcd60e51b81526004016115a9906154ce565b6008546001600160a01b039081169082160361252557600080fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612572573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125969190615651565b6001600160a01b0316146125a957600080fd5b60405163031e79db60e41b81526001600160a01b038216906331e79db0906125d5908490600401615336565b600060405180830381600087803b1580156125ef57600080fd5b505af1158015612603573d6000803e3d6000fd5b505060405163031e79db60e41b81526001600160a01b03841692506331e79db09150612633903090600401615336565b600060405180830381600087803b15801561264d57600080fd5b505af1158015612661573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db061267c61282f565b6040518263ffffffff1660e01b81526004016126989190615336565b600060405180830381600087803b1580156126b257600080fd5b505af11580156126c6573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b0380861694506331e79db093506126fa921690600401615336565b600060405180830381600087803b15801561271457600080fd5b505af1158015612728573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b031633146127b55760405162461bcd60e51b81526004016115a9906154ce565b600754600160b01b900460ff16156128095760405162461bcd60e51b81526020600482015260176024820152761d1c98591a5b99c8185b1c9958591e48195b98589b1959604a1b60448201526064016115a9565b6007805460ff60b01b1916600160b01b1790556020805460ff1916600117905543604255565b6005546001600160a01b031690565b6005546001600160a01b031633146128685760405162461bcd60e51b81526004016115a9906154ce565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60606004805461170590615538565b6005546001600160a01b031633146128c35760405162461bcd60e51b81526004016115a9906154ce565b6007546001600160a01b03908116908316036128de57600080fd5b6128e88282614620565b5050565b6005546001600160a01b031633146129165760405162461bcd60e51b81526004016115a9906154ce565b600854604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea90602401611a88565b6001600160a01b0381166129955760405162461bcd60e51b81526020600482015260146024820152732737ba1030903b30b634b2103932b332b93932b960611b60448201526064016115a9565b336001600160a01b038216036129e95760405162461bcd60e51b81526020600482015260196024820152782cb7ba9031b0b73737ba103932b332b9103cb7bab939b2b63360391b60448201526064016115a9565b336000908152601a602090815260408083208380529091529020546001600160a01b031615612a585760405162461bcd60e51b815260206004820152601b60248201527a52656665727265722063616e6e6f74206265206368616e6765642160281b60448201526064016115a9565b336000908152601a60209081526040808320838052825280832080546001600160a01b0319166001600160a01b03861690811790915583526024909152902054612aa3906001615684565b6001600160a01b0382166000908152602460205260408120919091555b6001602354612acf9190615697565b811215612b96576001600160a01b038083166000908152601a602090815260408083208584529091529020541680612b075750612b96565b336000908152601a602052604081208291612b238560016156be565b81526020808201929092526040908101600090812080546001600160a01b0319166001600160a01b0395861617905592841683526025909152902054612b6a906001615684565b6001600160a01b0390911660009081526025602052604090205580612b8e816156e6565b915050612ac0565b50602d54602e54602f5460405133936001600160a01b038616937f2311833a6b34f4f41fdf892d645b68a6ccfeaec5f489c18070af21710258577193612bdb936153fd565b60405180910390a350565b60006117b033846119ae85604051806060016040528060258152602001615a45602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190614461565b6008546040516302a2e74960e61b81526000916001600160a01b03169063a8b9d240906121cd908590600401615336565b60006117b0338484613aaa565b60085460405163fbcbc0f160e01b8152600091829182918291829182916001600160a01b039091169063fbcbc0f190612cb0908a90600401615336565b60c060405180830381865afa158015612ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf19190615705565b949c939b5091995097509550909350915050565b60085460405163ba079d4960e01b81526000916001600160a01b03169063ba079d4990611f54908590600401615336565b6001600160a01b039081166000908152601a602090815260408083208380529091529020541690565b6005546001600160a01b03163314612d895760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b03821660009081526035602052604090205481151560ff909116151503612db657600080fd5b6001600160a01b038216600081815260356020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b60085460405163c32c293d60e01b81526000916001600160a01b03169063c32c293d90612e46908590600401615336565b602060405180830381865afa158015612e63573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b49190615651565b6000805b602354811215612ed7576001600160a01b038381166000908152601a6020908152604080832085845290915290205416612ec55792915050565b80612ecf816156e6565b915050612e8b565b5060001992915050565b6005546001600160a01b03163314612f0b5760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b038181166000908152603a602090815260408083208054600160ff19918216811790925560359093529281902080549092169092179055600854905163031e79db60e41b81529116906331e79db090611a88908490600401615336565b6005546001600160a01b03163314612f995760405162461bcd60e51b81526004016115a9906154ce565b600d548111612ffa5760405162461bcd60e51b815260206004820152602760248201527f4d617820616d6f756e74206d7573742062652067726561746572207468616e206044820152666d696e696d756d60c81b60648201526084016115a9565b6301312d0081111561301e5760405162461bcd60e51b81526004016115a99061558b565b600e55565b6005546001600160a01b0316331461304d5760405162461bcd60e51b81526004016115a9906154ce565b60335481151560ff90911615150361306457600080fd5b6033805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef906020015b60405180910390a150565b60006130b7336122fb565b116131385760405162461bcd60e51b815260206004820152604560248201527f596f75206d757374206f776e206d6f7265207468616e207a65726f202452554660448201527f4620746f6b656e7320746f2073776974636820796f7572207061796f757420746064820152646f6b656e2160d81b608482015260a4016115a9565b306001600160a01b0382160361314d57600080fd5b60085460405163f7dd53a960e01b81526001600160a01b039091169063f7dd53a99061317f9033908590600401615758565b600060405180830381600087803b15801561319957600080fd5b505af11580156131ad573d6000803e3d6000fd5b505050507f3640c981ed7cfa9e689ac4e9cafffd8c9240b716b14c982b3e90d54e7b61de2433826040516130a1929190615758565b6005546001600160a01b0316331461320c5760405162461bcd60e51b81526004016115a9906154ce565b613217816001612d5f565b6009546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b60205460ff166132de5760405162461bcd60e51b815260206004820152602f60248201527f436f6e76657274696e6720726566657272616c2072657761726473206973206e60448201526e6f7420656e61626c6564207965742160881b60648201526084016115a9565b336000908152601b60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146133285760405162461bcd60e51b81526004016115a9906154ce565b602c93909355602d91909155602e55602f55565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611a07573d6000803e3d6000fd5b6005546001600160a01b031633146133b05760405162461bcd60e51b81526004016115a9906154ce565b600c55565b600854604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401612cb0565b6005546001600160a01b0316331461341d5760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b0381166134825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016115a9565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051632c8be28160e21b81526001600160a01b039091169063b22f8a0490611a8890339085906004016155d2565b6001600160a01b03166000908152601b602052604090205460ff1690565b6005546001600160a01b031633146135585760405162461bcd60e51b81526004016115a9906154ce565b6023819055611dc361449b565b6000806135728385615684565b9050838110156135c25760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b60448201526064016115a9565b9392505050565b6001600160a01b03831661362b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016115a9565b6001600160a01b03821661368c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016115a9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6136f7306122fb565b811115613723576000805160206159978339815191526000806000806040516130a19493929190615772565b600e548111156137325750600e545b600061373f8260026146ec565b9050600061374d838361472b565b905081158061375a575080155b1561376457505050565b4761376f833061476d565b8260186000828254613781919061578f565b9091555060009050613793478361472b565b905061379f83826148f0565b82601860008282546137b1919061578f565b909155505060405160008051602061599783398151915290611cf890869084908790600190615772565b6137e4306122fb565b6137ee8284615684565b1115613816576000805160206159dd83398151915282826000604051611b32939291906157a2565b600080600e5484111561382957600e5493505b479150613836843061476d565b613840824761578f565b90508360196000828254613854919061578f565b9091555081905084613864575060005b6008546040516000916001600160a01b03169083908381818185875af1925050503d80600081146138b1576040519150601f19603f3d011682016040523d82523d6000602084013e6138b6565b606091505b50509050600e548511156138ca57600e5494505b4793506138d7853061476d565b6138e1844761578f565b925084601760008282546138f5919061578f565b9091555083905085613905575060005b60006139126002836157ba565b600a546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114613964576040519150601f19603f3d011682016040523d82523d6000602084013e613969565b606091505b50509050806139ba5760405162461bcd60e51b815260206004820152601e60248201527f53656e64696e6720424e4220746f2077616c6c65742031206661696c6564000060448201526064016115a9565b600b546040516000916001600160a01b03169084908381818185875af1925050503d8060008114613a07576040519150601f19603f3d011682016040523d82523d6000602084013e613a0c565b606091505b5050905080613a5d5760405162461bcd60e51b815260206004820152601e60248201527f53656e64696e6720424e4220746f2077616c6c65742032206661696c6564000060448201526064016115a9565b6000828015613a695750815b90506000805160206159dd8339815191528786888015613a865750835b604051613a95939291906157a2565b60405180910390a15050505050505050505050565b6001600160a01b038316613ad05760405162461bcd60e51b81526004016115a9906157dc565b600754600160b01b900460ff1680613b0057506001600160a01b0383166000908152603a602052604090205460ff165b613b4c5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c656460448201526064016115a9565b6007546001600160a01b03848116911614613bd157306001600160a01b03831603613bd15760405162461bcd60e51b815260206004820152602f60248201527f596f752063616e6e6f742073656e6420746f6b656e7320746f2074686520636f60448201526e6e747261637420616464726573732160881b60648201526084016115a9565b80600003613be55761194f8383600061499d565b600754600160a01b900460ff16158015613c1857506001600160a01b03831660009081526035602052604090205460ff16155b8015613c3d57506001600160a01b03821660009081526035602052604090205460ff16155b8015613c6d57506007546001600160a01b0383811691161480613c6d57506007546001600160a01b038481169116145b15614378576001600160a01b038216600090815260366020526040812054600f54603c55601154603d55601354603e55601554603f5560ff16908080613cb286612d36565b6001600160a01b031614158015613cc7575082155b15613cf45760019150613cd985612d36565b601054600f5560125460115560145460135560165460155590505b604354604254613d049190615684565b431015613d2157604454600f556000601181905560138190556015555b6007546001600160a01b03868116911614613da657600c5484613d43876122fb565b613d4d9190615684565b10613da65760405162461bcd60e51b815260206004820152602360248201527f544f4b454e3a2042616c616e636520657863656564732077616c6c65742073696044820152627a652160e81b60648201526084016115a9565b6000613db1306122fb565b90506000601e54118015613dc7575060205460ff165b8015613dd05750835b15613e5657601d546000908152601f6020526040812054613df9906001600160a01b0316611788565b905060008111613e1d57601d8054906000613e1383615821565b9190505550613e54565b600e54811115613e2c5750600e545b601d546000908152601f6020526040902054613e5490899083906001600160a01b0316614ae2565b505b600d5481108015908190613e8357506001600160a01b03881660009081526036602052604090205460ff16155b15613ecd576007805460ff60a01b1916600160a01b17905560335460ff1615613eb157613eb16018546136ee565b613ebf6019546017546137db565b6007805460ff60a01b191690555b85603b819055506000613ef66064613ef06021548a61507a90919063ffffffff16565b906146ec565b905084156141845760005b602354811215614149576001600160a01b03808a166000908152601a602090815260408083208584528252808320546022909252822054603b549190931692613f529161271091613ef0919061507a565b90506001600160a01b038216613f69575050614149565b613f738a8261472b565b9950613f7e82613510565b1580613f8d575060205460ff16155b156140a057613f9d8c838361499d565b6008546001600160a01b031663e30443bc83613fb8816150fc565b6040518363ffffffff1660e01b8152600401613fd592919061560a565b600060405180830381600087803b158015613fef57600080fd5b505af1158015614003573d6000803e3d6000fd5b505050506001600160a01b0382166000908152602660205260408120805483929061402f908490615684565b9250508190555080602960008282546140489190615684565b909155506140589050818561578f565b935060001981836001600160a01b0316600080516020615a258339815191528f602d54602e54602f548a604051614093959493929190615833565b60405180910390a4614134565b6140ab8c308361499d565b60006140b683611788565b116140f957601e80546000908152601f6020526040812080546001600160a01b0319166001600160a01b038616179055815491906140f383615821565b91905055505b6001600160a01b0382166000908152601c602052604081208054839290614121908490615684565b909155506141319050818561578f565b93505b50508080614141906156e6565b915050613f01565b50801561417f5761415a878261472b565b965061416789308361499d565b80601960008282546141799190615684565b90915550505b6141b8565b856141b857614193878261472b565b96506141a089308361499d565b80601960008282546141b29190615684565b90915550505b6000866141c7576013546141cb565b6015545b905060006141eb6064613ef0600f54603b5461507a90919063ffffffff16565b9050600061420b6064613ef0601154603b5461507a90919063ffffffff16565b905060006142296064613ef086603b5461507a90919063ffffffff16565b9050826017600082825461423d9190615684565b9250508190555081601860008282546142569190615684565b92505081905550806019600082825461426f9190615684565b9091555060009050816142828486615684565b61428c9190615684565b90506142988c8261472b565b9b506142a58e308361499d565b6034546008546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015614312575060408051601f3d908101601f1916820190925261430f91810190615623565b60015b1561434c57604051329060019060008051602061595783398151915290614340908790879087908b90615376565b60405180910390a35050505b8a1561436b57603c54600f55603d54601155603e54601355603f546015555b5050505050505050505050505b61438383838361499d565b6008546001600160a01b031663e30443bc8461439e816150fc565b6040518363ffffffff1660e01b81526004016143bb92919061560a565b600060405180830381600087803b1580156143d557600080fd5b505af11580156143e9573d6000803e3d6000fd5b50506008546001600160a01b0316915063e30443bc90508361440a816150fc565b6040518363ffffffff1660e01b815260040161442792919061560a565b600060405180830381600087803b15801561444157600080fd5b505af1158015614455573d6000803e3d6000fd5b5050505061194f6144e8565b600081848411156144855760405162461bcd60e51b81526004016115a99190615226565b506000614492848661578f565b95945050505050565b6000805b6023548112156144d6576000818152602260205260409020546144c29083615684565b9150806144ce816156e6565b91505061449f565b506144e26064826157ba565b60215550565b603054421061454e57602d805490600061450183615821565b90915550614513905042612198615684565b603055602d546000805160206159778339815191529060019061453790829061578f565b604051614545929190615861565b60405180910390a15b60315442106145b657602e805490600061456783615821565b9091555061457a90504262093a80615684565b603155602e546000805160206159778339815191529060029061459f9060019061578f565b6040516145ad929190615861565b60405180910390a15b603254421061461e57602f80549060006145cf83615821565b909155506145e29050426228206f615684565b603255602f54600080516020615977833981519152906003906146079060019061578f565b604051614615929190615861565b60405180910390a15b565b6001600160a01b0382166000908152603660205260409020805460ff191682158015919091179091556146b05760085460405163031e79db60e41b81526001600160a01b03909116906331e79db09061467d908590600401615336565b600060405180830381600087803b15801561469757600080fd5b505af11580156146ab573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60006135c283836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061515b565b60006135c283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614461565b60008211614779575050565b81614783306122fb565b101561479557614792306122fb565b91505b60408051600280825260608201835260009260208301908036833701905050905030816000815181106147ca576147ca615874565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148479190615651565b8160018151811061485a5761485a615874565b6001600160a01b03928316602091820292909201015260065461488091309116856135c9565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906148b99086906000908690889042906004016158ce565b600060405180830381600087803b1580156148d357600080fd5b505af11580156148e7573d6000803e3d6000fd5b50505050505050565b6006546149089030906001600160a01b0316846135c9565b60065460095460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015614978573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ab69190615623565b6001600160a01b0383166149c35760405162461bcd60e51b81526004016115a9906157dc565b6001600160a01b038216614a255760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016115a9565b614a62816040518060600160405280602681526020016159b7602691396001600160a01b0386166000908152602081905260409020549190614461565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614a919082613565565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016136e1565b60008211614aef57505050565b60085460405163c32c293d60e01b8152600091829182916001600160a01b03169063c32c293d90614b24908790600401615336565b602060405180830381865afa158015614b41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b659190615651565b6001600160a01b031603614c9457479150614b80848461476d565b614b8a478361472b565b6001600160a01b038416600090815260276020526040812080549293508692909190614bb7908490615684565b9250508190555083602a6000828254614bd09190615684565b90915550506001600160a01b03831660009081526028602052604081208054839290614bfd908490615684565b9250508190555080602b6000828254614c169190615684565b90915550506001600160a01b0383166000818152601c60205260409081902054602d54602e54602f54935186959394600080516020615a2583398151915293614c68938d939192909160001990615833565b60405180910390a4614c78615189565b6045546001600160a01b0316614c8f575050505050565b614d43565b6045546001600160a01b0316614d4357479150614cb1843061476d565b614cbb478361472b565b6001600160a01b038416600090815260276020526040812080549293508692909190614ce8908490615684565b9250508190555083602a6000828254614d019190615684565b9091555050604580546001600160a01b038086166001600160a01b03199283161790925560468390556047805492881692909116919091179055611ab6615189565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015614dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dd19190615651565b81600081518110614de457614de4615874565b6001600160a01b03928316602091820292909201015260085460455460405163c32c293d60e01b81529183169263c32c293d92614e279290911690600401615336565b602060405180830381865afa158015614e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e689190615651565b81600181518110614e7b57614e7b615874565b6001600160a01b03928316602091820292909201015260065460465460455460405163b6f9de9560e01b81529284169363b6f9de9593614ec7926000928892911690429060040161590a565b6000604051808303818588803b158015614ee057600080fd5b505af193505050508015614ef2575060015b506046546045546001600160a01b031660009081526028602052604081208054909190614f20908490615684565b9091555050604654602b8054600090614f3a908490615684565b9091555050604654604554604754602d54602e54602f5460405186956001600160a01b0390811695600080516020615a2583398151915295614f86959290911693909260001990615833565b60405180910390a460085460405163c32c293d60e01b81526000916001600160a01b03169063c32c293d90614fbf908890600401615336565b602060405180830381865afa158015614fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150009190615651565b6001600160a01b03161461504857604580546001600160a01b038087166001600160a01b0319928316179092556046849055604780549289169290911691909117905561506a565b604580546001600160a01b031990811690915560006046556047805490911690555b615072615189565b505050505050565b60008260000361508c575060006117b4565b6000615098838561593f565b9050826150a585836157ba565b146135c25760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016115a9565b600754600090600160a81b900460ff1661511e57615119826122fb565b6117b4565b6001600160a01b0382166000908152603760205260409020546117b490606490613ef09061514c9083613565565b615155866122fb565b9061507a565b6000818361517c5760405162461bcd60e51b81526004016115a99190615226565b50600061449284866157ba565b601d80546000908152601f60208181526040808420546001600160a01b03168452601c825280842084905584548452919052812080546001600160a01b0319169055815491906151d883615821565b9190505550601e54601d541061461e576000601d819055601e55565b6000806000806080858703121561520a57600080fd5b5050823594602084013594506040840135936060013592509050565b600060208083528351808285015260005b8181101561525357858101830151858201604001528201615237565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611dc357600080fd5b60006020828403121561529b57600080fd5b81356135c281615274565b600080604083850312156152b957600080fd5b82356152c481615274565b946020939093013593505050565b600080604083850312156152e557600080fd5b50508035926020909101359150565b60008060006060848603121561530957600080fd5b833561531481615274565b925060208401359150604084013561532b81615274565b809150509250925092565b6001600160a01b0391909116815260200190565b60008060006060848603121561535f57600080fd5b505081359360208301359350604090920135919050565b93845260208401929092526040830152606082015260800190565b6000806000606084860312156153a657600080fd5b83356153b181615274565b925060208401356153c181615274565b929592945050506040919091013590565b8015158114611dc357600080fd5b6000602082840312156153f257600080fd5b81356135c2816153d2565b9283526020830191909152604082015260600190565b60006020828403121561542557600080fd5b5035919050565b600080600080600060a0868803121561544457600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561547a57600080fd5b823561548581615274565b91506020830135615495816153d2565b809150509250929050565b600080604083850312156154b357600080fd5b82356154be81615274565b9150602083013561549581615274565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f43616e6e6f742073657420424e4272657761726420666565206f766572203225604082015260600190565b600181811c9082168061554c57607f821691505b60208210810361556c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561558457600080fd5b5051919050565b60208082526027908201527f63616e6e6f7420736574207377617020616d6f756e742067726561746572207460408201526668616e202e322560c81b606082015260800190565b6001600160a01b039290921682521515602082015260400190565b6000602082840312156155ff57600080fd5b81516135c2816153d2565b6001600160a01b03929092168252602082015260400190565b60008060006060848603121561563857600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561566357600080fd5b81516135c281615274565b634e487b7160e01b600052601160045260246000fd5b808201808211156117b4576117b461566e565b81810360008312801583831316838312821617156156b7576156b761566e565b5092915050565b80820182811260008312801582168215821617156156de576156de61566e565b505092915050565b60006001600160ff1b0182016156fe576156fe61566e565b5060010190565b60008060008060008060c0878903121561571e57600080fd5b865161572981615274565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6001600160a01b0392831681529116602082015260400190565b938452602084019290925260408301521515606082015260800190565b818103818111156117b4576117b461566e565b92835260208301919091521515604082015260600190565b6000826157d757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6000600182016156fe576156fe61566e565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b60ff929092168252602082015260400190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156158c35781516001600160a01b03168752958201959082019060010161589e565b509495945050505050565b85815284602082015260a0604082015260006158ed60a083018661588a565b6001600160a01b0394909416606083015250608001529392505050565b848152608060208201526000615923608083018661588a565b6001600160a01b03949094166040830152506060015292915050565b80820281158282048414176117b4576117b461566e56fec864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a982fc0b521dd59fa7e30ff6ab6b5392d216cb0bb977e9f16006d7b55b1d726b2935826dab182292d2e5b8adf2856697983c65b882fa567a247222747a43e606d1945524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63658e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd045524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636513556b7ecf6a9419a73bcfcb023a4c3f93d2d1991ed91cb718572f4e079ad3d245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122043b36a9766695d5643ba90bb6f80334e1b972bc0ef0992569d20f0b12b3d4d9c64736f6c63430008120033

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.