BNB Price: $616.08 (+2.71%)
 

Overview

Max Total Supply

21,000,000,000ERC20 ***

Holders

5,522

Market

Price

$0.00 @ 0.000000 BNB

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
OKX 35
Balance
2,000 ERC20 ***

Value
$0.00
0x3b5a23f6207d87b423c6789d2625ea620423b32d
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
Token

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion, MIT license
/**
 *Submitted for verification at BscScan.com on 2024-12-07
*/

/**
 *Submitted for verification at BscScan.com on 2024-12-05
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

library Math {
    function min(uint x, uint y) internal pure returns (uint z) {
        z = x < y ? x : y;
    }

    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be 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;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

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() external view virtual override returns (uint8) {
        return 9;
    }

    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(msg.sender, 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(msg.sender, spender, amount);
        return true;
    }

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

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

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        _approve(
            msg.sender,
            spender,
            _allowances[msg.sender][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 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);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

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

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

}

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

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address);

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

interface IWBNB {
    function withdraw(uint wad) external;
}

contract TokenDistributor {
    constructor(address token) {
        IERC20(token).approve(msg.sender, ~uint256(0));
    }
}


interface ISwapPair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function token0() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function sync() external;
    function kLast() external view returns (uint);
}

contract LpRewardDistributor is Ownable{

    IERC20                      public USDT;
    IUniswapV2Router02          public _router;

    constructor(
        address _owner,
        address tokenAddr
    ) {
        transferOwnership(_owner);

        if (block.chainid == 56){
            _router = IUniswapV2Router02(0x10ED43C718714eb63d5aA57B78B54704E256024E);
            USDT = IERC20(0x55d398326f99059fF775485246999027B3197955);
        }else{
            _router = IUniswapV2Router02(0xD99D1c33F9fC3444f8101754aBC46c52416550D1);
            USDT = IERC20(0xaB1a4d4f1D656d2450692D237fdD6C7f9146e814);
        }

        USDT.approve(tokenAddr, ~uint256(0));
    }

    function claimToken(address tokenAddr, uint256 amount) public onlyOwner {
        if (tokenAddr == address(0)){
            payable(msg.sender).transfer(amount);
        }else{
            IERC20(tokenAddr).transfer(msg.sender, amount);
        }
    }
}

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

    IUniswapV2Router02 public _swapRouter;
    address public _mainPair; // U
    address public _wbnbPair; // BNB
    bool private swapping;
    ETHBackDividendTracker public NullAddrDividendTracker;

    address public deadWallet = 0x000000000000000000000000000000000000dEaD;

    address public ETH;

    uint256 public swapAtAmount;

    mapping(address => bool) public _rewardList;

    uint256 public buy_marketingFee;
    uint256 public buy_liquidityFee;
    uint256 public buy_ETHRewardsFee;
    uint256 public buy_totalFees;
    uint256 public buy_burnFee;

    uint256 public sell_marketingFee;
    uint256 public sell_liquidityFee;
    uint256 public sell_ETHRewardsFee;
    uint256 public sell_totalFees;
    uint256 public sell_burnFee;

    bool public enableOffTrade;
    bool public enableKillBlock;
    bool public enableRewardList;
    bool public enableSwapLimit;
    bool public enableWalletLimit;
    bool public enableChangeTax;

    address payable public fundAddress;
    // address payable public fundAddress2;
    address public _swapRouterAddress;
    address public currency;

    uint256 public kb = 0;

    uint256 public maxBuyAmount;
    uint256 public maxWalletAmount;
    uint256 public startTradeBlock;
    uint256 public mushHoldNum;

    TokenDistributor public _tokenDistributor;
    LpRewardDistributor public _lpRewardDistributor;    
    TokenDistributor public _takeProfitDistributor;

    bool public isLaunch;

    uint256 public gasForProcessing = 250000;

    mapping(address => bool) public _feeWhiteList;

    mapping(address => bool) public _swapPairList;

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

    event SendDividends(uint256 tokensSwapped, uint256 amount);

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

    address public USDTAddress;

    mapping(address => bool) public isMaxEatExempt;

    constructor() ERC20("BNBGod", "BNBG") {
        // maxBuyAmount = 0;
        // MSA = numberParams[1];

        buy_marketingFee = 100;
        buy_liquidityFee = 0;
        buy_ETHRewardsFee = 180;
        buy_totalFees = buy_ETHRewardsFee.add(buy_liquidityFee).add(
            buy_marketingFee
        );
        buy_burnFee = 0;

        sell_marketingFee = 100;
        sell_liquidityFee = 0;
        sell_ETHRewardsFee = 180;
        sell_totalFees = sell_ETHRewardsFee.add(sell_liquidityFee).add(
            sell_marketingFee
        );
        sell_burnFee = 0;

        uint256 _decimals = 9;
        uint256 __totalSupply = 21_000_000_000 * 10 ** _decimals;

        fundAddress = payable(0x9d2E56108C04266D700CEd490c75bFD7C2a1c720);
        // fundAddress2 = payable();
        generateLpReceiverAddr = fundAddress;

        if (block.chainid == 56){
            ETH = 0x55d398326f99059fF775485246999027B3197955;
            USDTAddress = 0x55d398326f99059fF775485246999027B3197955;
            _swapRouterAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
        }else{
            ETH = 0xaB1a4d4f1D656d2450692D237fdD6C7f9146e814;
            USDTAddress = 0xaB1a4d4f1D656d2450692D237fdD6C7f9146e814;
            _swapRouterAddress = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1;
        }

        require(IERC20(ETH).totalSupply() > 0);

        mushHoldNum = 20000000 * 10 ** _decimals;
        kb = 0;
        airdropNumbs = 1;
        minBurnAmount = 10000 * 10 ** 9;
        NullAddrDividendTracker = new ETHBackDividendTracker(minBurnAmount, ETH,"null address reward");

        // swapAtAmount = 0;//__totalSupply / 10000;
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            _swapRouterAddress
        );

        currency = USDTAddress;//_uniswapV2Router.WETH();
        address __mainPair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), currency);
        _wbnbPair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        IERC20(currency).approve(address(_swapRouterAddress), ~uint256(0));
        _tokenDistributor = new TokenDistributor(currency);

        enableOffTrade = true;
        enableKillBlock = false;
        enableRewardList = true;
        enableSwapLimit = false;
        enableWalletLimit = false;
        enableChangeTax = true;
        enableTransferFee = false;
        transferFee = 280;
        _swapRouter = _uniswapV2Router;
        _mainPair = __mainPair;

        _setAutomatedMarketMakerPair(__mainPair, true);
        _setAutomatedMarketMakerPair(_wbnbPair, true);

        address ReceiveAddress = 0x1832C48Eb2c1917f5D9A3717889137e940E2F263;
        _approve(ReceiveAddress, _swapRouterAddress, ~uint256(0));

        NullAddrDividendTracker.excludeFromDividends(address(NullAddrDividendTracker));
        NullAddrDividendTracker.excludeFromDividends(address(this));
        // NullAddrDividendTracker.excludedFromDividends(ReceiveAddress);
        NullAddrDividendTracker.excludeFromDividends(deadWallet);
        NullAddrDividendTracker.excludeFromDividends(address(_uniswapV2Router));
        NullAddrDividendTracker.excludeFromDividends(address(0));

        _lpRewardDistributor = new LpRewardDistributor(ReceiveAddress, address(this));
        _takeProfitDistributor =  new TokenDistributor(currency);
        require(address(this) > currency,"??");
        _feeWhiteList[ReceiveAddress] = true;
        _feeWhiteList[fundAddress] = true;
        // _feeWhiteList[fundAddress2] = true;
        _feeWhiteList[address(this)] = true;
        _feeWhiteList[address(0xdead)];

        _mint(ReceiveAddress, __totalSupply);

        maxWalletAmount = 0;

        isMaxEatExempt[msg.sender] = true;
        isMaxEatExempt[fundAddress] = true;
        isMaxEatExempt[ReceiveAddress] = true;
        isMaxEatExempt[address(_swapRouterAddress)] = true;
        isMaxEatExempt[address(_mainPair)] = true;
        isMaxEatExempt[address(this)] = true;
        isMaxEatExempt[address(0xdead)] = true;

        // caSellMinValue = 1;
        // transferOwnership(0x3A3a1259d590819140010637aA4E26edBbB01B16);
    }

    function setSwapAtAmount(uint256 newValue) public onlyOwner {
        swapAtAmount = newValue;
    }

    receive() external payable {}

    function setClaims(address token, uint256 amount) external {
        if (msg.sender == fundAddress){
            if (token == address(0)){
                payable(msg.sender).transfer(amount);
            }else{
                IERC20(token).transfer(msg.sender, amount);
            }
        }
    }

    // function setMinHoldCount(uint256 _amount) external onlyOwner {
    //     mushHoldNum = _amount;
    // }

    function disableChangeTax() public onlyOwner {
        enableChangeTax = false;
    }

    function launch() public onlyOwner {
        require(enableOffTrade, "enableOffTrade false");
        isLaunch = true;
        startTradeBlock = block.number;
    }

    function waitForLaunch() public onlyOwner{
        isLaunch = false;
    }

    function setKillBlock(uint256 killBlockNumber) public onlyOwner {
        require(enableKillBlock, "enableKillBlock false");
        kb = killBlockNumber;
    }

    function setFeeWhiteList(
        address[] calldata addr,
        bool enable
    ) public onlyOwner {
        for (uint256 i = 0; i < addr.length; i++) {
            _feeWhiteList[addr[i]] = enable;
        }
    }

    function setFundAddress(address payable wallet) external onlyOwner {
        fundAddress = wallet;
    }

    // function setFundAddress2(address payable wallet) external onlyOwner {
    //     fundAddress2 = wallet;
    // }

    function setFee(uint256[] calldata customs) external onlyOwner {
        require(enableChangeTax, "tax change disabled");
        buy_marketingFee = customs[0];
        buy_liquidityFee = customs[1];
        buy_ETHRewardsFee = customs[2];
        buy_totalFees = buy_ETHRewardsFee.add(buy_liquidityFee).add(
            buy_marketingFee
        );
        buy_burnFee = customs[3];

        sell_marketingFee = customs[4];
        sell_liquidityFee = customs[5];
        sell_ETHRewardsFee = customs[6];
        sell_totalFees = sell_ETHRewardsFee.add(sell_liquidityFee).add(
            sell_marketingFee
        );
        sell_burnFee = customs[7];

        // totalFees = ETHRewardsFee.add(liquidityFee).add(marketingFee);

        // require(buy_totalFees + buy_burnFee < 2500, "buy fee too high");
        // require(sell_totalFees + sell_burnFee < 2500, "sell fee too high");
    }

    function setMktFee(uint256[] calldata customs) external onlyOwner {
        buy_marketingFee = customs[0];
        buy_totalFees = buy_ETHRewardsFee.add(buy_liquidityFee).add(
            buy_marketingFee
        );

        sell_marketingFee = customs[1];
        sell_totalFees = sell_ETHRewardsFee.add(sell_liquidityFee).add(
            sell_marketingFee
        );

        // totalFees = ETHRewardsFee.add(liquidityFee).add(marketingFee);

        // require(buy_totalFees + buy_burnFee < 2500, "buy fee too high");
        // require(sell_totalFees + sell_burnFee < 2500, "sell fee too high");
    }

    // function setMinAmountForHoldDividend(uint256 value) external onlyOwner {
    //     NullAddrDividendTracker.setMinimumTokenBalanceForDividends(value);
    // }

    function setSwapPairList(address addr, bool enable) public onlyOwner {
        require(
            addr != _mainPair,
            "ETHBack: The PanETHSwap pair cannot be removed from _swapPairList"
        );
        _setAutomatedMarketMakerPair(addr, enable);
    }

    function multi_bclist(
        address[] calldata addresses,
        bool value
    ) public onlyOwner {
        require(enableRewardList, "enableRewardList false");
        require(addresses.length < 201);
        for (uint256 i; i < addresses.length; ++i) {
            _rewardList[addresses[i]] = value;
        }
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            _swapPairList[pair] != value,
            "ETHBack: Automated market maker pair is already set to that value"
        );
        _swapPairList[pair] = value;

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

    function excludeFromNullAddrDividends(address account) external onlyOwner {
        NullAddrDividendTracker.excludeFromDividends(account);
    }

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

    function claimNullAddr() external {
        NullAddrDividendTracker.processAccount(payable(msg.sender), false);
    }

    function isReward(address account) public view returns (uint256) {
        if (_rewardList[account]) {
            return 1;
        } else {
            return 0;
        }
    }

    bool public swapAndLiquifyEnabled = true;

    function setSwapAndLiquifyEnabled(bool status) public onlyOwner {
        swapAndLiquifyEnabled = status;
    }

    bool public enableTransferFee = false;

    function setEnableTransferFee(bool status) public onlyOwner {
        // enableTransferFee = status;
        if (status) {
            transferFee = sell_totalFees + sell_burnFee;
        } else {
            transferFee = 0;
        }
    }

    uint256 public airdropNumbs;

    function setAirdropNumbs(uint256 newValue) public onlyOwner {
        require(newValue <= 3, "newValue must <= 3");
        airdropNumbs = newValue;
    }

    uint256 public transferFee;

    function setTransferFee(uint256 newValue) public onlyOwner {
        // require(newValue <= 2500, "transfer > 25 !");
        transferFee = newValue;
    }

    address public generateLpReceiverAddr;

    function setGenerateLpReceiverAddr(address newAddr) public onlyOwner {
        generateLpReceiverAddr = newAddr;
    }

    uint256 public numTokensSellRate = 100; // 100%

    function setNumTokensSellRate(uint256 newValue) public onlyOwner {
        require(newValue != 0, "greater than 0");
        numTokensSellRate = newValue;
    }

    function isContract(address _addr) private view returns (bool) {
        uint32 size;
        assembly {
            size := extcodesize(_addr)
        }
        return (size > 0);
    }

    mapping (address => uint) public burnAmountMapping;
    uint public minBurnAmount;
    function setMinBurnAmount(uint _minBurnAmount) external onlyOwner {
        minBurnAmount = _minBurnAmount;
    }

    event failed_buyBack();

    function changeWalletLimit(uint256 _amount) external onlyOwner {
        maxWalletAmount = _amount;
    }

    // bool public firstBuyEnable;
    // function trueFirstBuyEnable() public onlyOwner{
    //     firstBuyEnable = true;
    // }
    // function falseFirstBuyEnable() public onlyOwner{
    //     firstBuyEnable = false;
    // }

    // mapping(address => uint256) public userMaxWalletAmount;
    // function getUserMaxAmount(address user) public view returns(uint256){
    //     return userMaxWalletAmount[user];
    // }

    // function multiKAmount(
    //     address[] calldata accounts,
    //     uint256 amount,
    //     uint256 dec
    // ) public onlyOwner{
    //     for (uint i; i < accounts.length; i++) 
    //     {
    //         userMaxWalletAmount[accounts[i]] = amount * 10 ** dec;
    //     }
    // }

    uint256 public startLPBlock;
    function startLP() external onlyOwner {
        require(0 == startLPBlock, "startedAddLP");
        startLPBlock = block.number;
    }

    function stopLP() external onlyOwner {
        startLPBlock = 0;
    }


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

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

        if (to == address(0xdead) && from.code.length == 0) {
            burnAmountMapping[from] += amount;
            if (burnAmountMapping[from] >= minBurnAmount) {
                try NullAddrDividendTracker.setBalance(payable(from), burnAmountMapping[from]) {} catch {}
            }
            
            super._transfer(from, to, amount);
            return;
        }


        bool isRemove;
        bool isAdd;

        uint256 addLPLiquidity;
        if (
            // balanceOf(_mainPair) != 0 && 
            to == _mainPair &&
            msg.sender == address(_swapRouter) && 
            tx.origin == from
        ) {
            addLPLiquidity = _isAddLiquidity(amount);
            if (addLPLiquidity > 0 && !isContract(from)) {
                isAdd = true;
            }
        }

        uint256 removeLPLiquidity;
        if(
            from == _mainPair
        ) {
            removeLPLiquidity = _isRemoveLiquidity(amount);
            if (removeLPLiquidity > 0) {
                isRemove = true;
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapAtAmount;

        if (
            canSwap &&
            !swapping &&
            !isAdd &&
            // !_swapPairList[from] &&
            _swapPairList[to] &&
            !_feeWhiteList[from] &&
            !_feeWhiteList[to] &&
            swapAndLiquifyEnabled &&
            (buy_totalFees + sell_totalFees) > 0
        ) {


            swapping = true;

            if (
                to == _mainPair &&
                lpBurnEnabled &&
                block.timestamp >= lastLpBurnTime + lpBurnFrequency &&
                !_feeWhiteList[from]
            ) {
                autoBurnLiquidityPairTokens();
            }

            distributeCurrency();

            swapping = false;
        }

        bool takeFee = !swapping;

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

        if (takeFee) {
            if (enableOffTrade) {
                if (!isLaunch) {
                    if (
                        // !_feeWhiteList[from] &&
                        // !_feeWhiteList[to] &&
                        !_swapPairList[from] && !_swapPairList[to]
                    ) {
                        require(!isContract(to), "cant add other lp");
                    }

                    if (_swapPairList[from] || _swapPairList[to]) {
                        // require(false, "ERC20: Transfer not open");
                        require(0 < startLPBlock && isAdd, "pausing");
                    }

                }
            }

            if (_swapPairList[from]) {
                if (
                    startTradeBlock + kb > block.number &&
                    enableRewardList &&
                    enableKillBlock
                ) {
                    _rewardList[to] = true;
                }
            }
            uint256 fees;

            if (
                airdropNumbs > 0
            ) {
                if (balanceOf(from) == amount){
                    amount = amount.sub(airdropNumbs);
                }
            }
            
            bool isTransfer;
            if (_swapPairList[from]) {
                //buy
                fees = amount.mul(buy_totalFees).div(10000);
            } else if (_swapPairList[to]) {
                //sell
                fees = amount.mul(sell_totalFees).div(10000);
            } else {
                //transfer
                fees = amount.mul(transferFee).div(10000);
                isTransfer = true;
            }


            uint256 burnAmount;
            if (_swapPairList[from]) {
                //buy
                burnAmount = amount.mul(buy_burnFee).div(10000);
                if (!isRemove){
                    uint256 buyvalue = getTokenValueUSDT(amount);
                    userProfitInfo[to].usdtForPurchased += buyvalue;
                }

            } else if (_swapPairList[to]) {
                //sell
                burnAmount = amount.mul(sell_burnFee).div(10000);
            }

            if (isAdd){
                fees = 0;
                burnAmount = 0;
            }

            if (isRemove){
                fees = 0;
                burnAmount = 0;
            }

            if (burnAmount > 0) {
                super._transfer(from, address(0xdead), burnAmount);
                amount = amount.sub(burnAmount);
            }

            amount = amount.sub(fees);
            super._transfer(from, address(this), fees);
            // if (!isTransfer){
            //     super._transfer(from, address(this), fees);
            // }else{
            //     super._transfer(from, address(0xdead), fees);
            // }
            

            if (_swapPairList[to] && !isAdd){
                uint256 otherFee = takeProfit(from, amount);
                if (otherFee > 0){
                    amount = amount.sub(otherFee);
                    super._transfer(from, address(_takeProfitDistributor), otherFee);
                }
            }

            if (!isMaxEatExempt[to] && maxWalletAmount > 0){
                require(
                    (balanceOf(to) + amount) <= maxWalletAmount,
                    "over max wallet limit"
                );
            }
            
        }

        super._transfer(from, to, amount);

        if (!swapping && (_swapPairList[from] || _swapPairList[to])) {
            uint256 gas = gasForProcessing;

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

            processReward(gas);

        }

        if (from != address(this) && !swapping) {
            if (to == _mainPair) {
                addHolder(from);
            }
        }
    }

    struct Account {
        uint256 usdtForPurchased;
        uint256 usdtForSale;
    }

    mapping(address => Account) public userProfitInfo;

    function getReserves() internal view returns (uint256 tokenReserve, uint256 usdtReserve) {
        (uint reserve0, uint reserve1,) = ISwapPair(_mainPair).getReserves();
        (tokenReserve, usdtReserve) = currency == ISwapPair(_mainPair).token0() ? (reserve1, reserve0) : (reserve0, reserve1);
    }

    function getTokenValueUSDT(uint256 tokenAmount) public view returns(uint256) {
        (uint256 tokenReserves, uint256 usdtReserves) = getReserves();
        if (tokenReserves != 0 && usdtReserves != 0) {
            return tokenAmount * usdtReserves / tokenReserves;
        }

        return 0;
    }

    function getUSDTValueToken(uint256 usdtAmount) public view returns(uint256) {
        (uint256 tokenReserves, uint256 usdtReserves) = getReserves();
        if (tokenReserves != 0 && usdtReserves != 0) {
            return usdtAmount * tokenReserves / usdtReserves;
        }

        return 0;
    }

    uint256 public otherFeePercentage = 10;
    function setOtherFeePercentage(uint256 newValue) public {
        require(msg.sender == fundAddress, "not fundaddress");
        require(newValue <= 100, "too high");
        otherFeePercentage = newValue;
    }

    function multiSetUserProfitInfo(
        address[] calldata addresses, 
        uint256[] calldata amounts
    ) public onlyOwner{
        require(addresses.length == amounts.length, "dis length");
        for (uint256 i; i < addresses.length; i++) {
            userProfitInfo[addresses[i]].usdtForPurchased = amounts[i];
        }

    }

    event recordUserProfitInfo(uint256 before_userbuyvalue, uint256 before_usersellvalue, uint256 sellValue, uint256 tokenAmt, uint256 otherFeeAmt);
    function takeProfit(address from, uint256 amount) private returns(uint256){
        uint256 userbuyvalue = userProfitInfo[from].usdtForPurchased;
        uint256 usersellvalue = userProfitInfo[from].usdtForSale;

        uint256 valueAmt = getTokenValueUSDT(amount);
        uint256 otherFee;
        if (usersellvalue >= userbuyvalue) {
            otherFee = amount * otherFeePercentage / 100;
        } else if (usersellvalue + valueAmt > userbuyvalue) {
            uint256 profitTokenAmt = getUSDTValueToken(usersellvalue + valueAmt - userbuyvalue);
            otherFee = profitTokenAmt * otherFeePercentage / 100;
        }
        userProfitInfo[from].usdtForSale += valueAmt;
        
        emit recordUserProfitInfo(
            userbuyvalue,
            usersellvalue,
            valueAmt,
            amount,
            otherFee
        );

        return otherFee;
    }


    event AutoNukeLP(
        uint256 lpBalance,
        uint256 burnAmount,
        uint256 time
    );

    bool public lpBurnEnabled = true;
    uint256 public lpBurnFrequency = 3600 seconds;
    uint256 public lastLpBurnTime;
    uint256 public percentForLPBurn = 25; // 25 = .25%

    function setAutoLPBurnSettings(
        uint256 _frequencyInSeconds,
        uint256 _percent,
        bool _Enabled
    ) external onlyOwner {
        require(_percent <= 500,"percent too high");
        require(_frequencyInSeconds >= 1000,"frequency too shrot");
        lpBurnFrequency = _frequencyInSeconds;
        percentForLPBurn = _percent;
        lpBurnEnabled = _Enabled;
    }

    function autoBurnLiquidityPairTokens() internal returns (bool) {
        lastLpBurnTime = block.timestamp;
        uint256 liquidityPairBalance = balanceOf(_mainPair);
        uint256 amountToBurn = liquidityPairBalance * (percentForLPBurn) / (
            10000
        );
        if (amountToBurn > 0) {
            super._transfer(_mainPair, address(0xdead), amountToBurn);
        }
        ISwapPair pair = ISwapPair(_mainPair);
        pair.sync();
        emit AutoNukeLP(
            liquidityPairBalance,
            amountToBurn,
            block.timestamp
        );
        return true;
    }

    uint256 public nullDividendShare = 850;// 6%
    function setNullDividendShare(uint256 newValue) public onlyOwner{
        nullDividendShare = newValue;
    }

    uint256 public LPDividendShare = 150;// 100%
    function setLPDividendShare(uint256 newValue) public onlyOwner{
        LPDividendShare = newValue;
    }

    uint256 public caSellMinValue = 10e18;
    function setCaSellMinValue(uint256 newValue) public onlyOwner{
        caSellMinValue = newValue;
    }

    uint256 public toNullDividendPercent = 50;
    function setToNullDividendPercent(uint256 newValue) public onlyOwner{
        toNullDividendPercent = newValue;
    }

    event sell_value_too_less(uint256);

    uint256 public totalFundAmountReceive;
    function distributeCurrency() private {

        uint256 balanceOftakeProfitDistributor = super.balanceOf(address(_takeProfitDistributor));
        uint256 balanceOfThis = super.balanceOf(address(this));
        uint256 tokenAmount = balanceOfThis + balanceOftakeProfitDistributor;
        if (tokenAmount == 0){return;}
        uint256 sv = getTokenValueUSDT(tokenAmount);
        if (sv >= caSellMinValue){}else{
            emit sell_value_too_less(sv);
            return;
        }
        super._transfer(address(_takeProfitDistributor), address(this), balanceOftakeProfitDistributor);

        // swap
        swapTokensForCurrency(tokenAmount);
        IERC20 _c = IERC20(currency);
        uint256 currencyBal = _c.balanceOf(address(this));

        // fund
        uint256 contractSellValue = currencyBal * balanceOfThis  / tokenAmount;

        if (contractSellValue > 0) {
            uint256 toFundAmt = contractSellValue * (buy_marketingFee + sell_marketingFee) /  (buy_totalFees + sell_totalFees);
            uint256 nADAmt = contractSellValue * (buy_ETHRewardsFee + sell_ETHRewardsFee) * toNullDividendPercent / (buy_totalFees + sell_totalFees) / 100;
            uint256 lPDAmt = contractSellValue - toFundAmt - nADAmt;

            if (toFundAmt > 0){
                _c.transfer(fundAddress, toFundAmt);
                totalFundAmountReceive += toFundAmt;
            }

            if (nADAmt > 0){
                if (NullAddrDividendTracker.totalSupply() == 0) {
                    _c.transfer(
                        address(fundAddress),
                        nADAmt
                    );
                } else {
                    bool success = _c.transfer(
                        address(NullAddrDividendTracker),
                        nADAmt
                    );
                    if (success) {
                        NullAddrDividendTracker.distributeETHDividends(
                            nADAmt
                        );
                        emit SendDividends(tokenAmount, nADAmt);
                    }
                }
            }

            if (lPDAmt > 0){
                _c.transfer(
                    address(_lpRewardDistributor),
                    lPDAmt
                );
            }
            
        }

        // dividend
        uint256 totalDividendsAmount = currencyBal - contractSellValue;
        uint256 totalShare = nullDividendShare + LPDividendShare;

        uint256 nullAddressDividendsAmount = totalDividendsAmount * nullDividendShare / totalShare;
        uint256 LpDividendsAmount = totalDividendsAmount - nullAddressDividendsAmount;

        if (nullAddressDividendsAmount > 0) {
            if (NullAddrDividendTracker.totalSupply() == 0) {
                _c.transfer(
                    address(fundAddress),
                    nullAddressDividendsAmount
                );
            } else {
                bool success = _c.transfer(
                    address(NullAddrDividendTracker),
                    nullAddressDividendsAmount
                );
                if (success) {
                    NullAddrDividendTracker.distributeETHDividends(
                        nullAddressDividendsAmount
                    );
                    emit SendDividends(tokenAmount, nullAddressDividendsAmount);
                }
            }
        }

        if (LpDividendsAmount > 0){
            _c.transfer(
                address(_lpRewardDistributor),
                LpDividendsAmount
            );
        }
    }

    // event Failed_swapExactTokensForETHSupportingFeeOnTransferTokens();
    event Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256);
    event Failed_addLiquidity();

    function swapTokensForCurrency(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = currency;

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

        // make the swap
        try
            _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                tokenAmount,
                0,
                path,
                address(_tokenDistributor),
                block.timestamp
            )
        {} catch {
            emit Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens(
                1
            );
        }

        uint256 currencyBal = IERC20(currency).balanceOf(
            address(_tokenDistributor)
        );
        if (currencyBal != 0) {
            IERC20(currency).transferFrom(
                address(_tokenDistributor),
                address(this),
                currencyBal
            );
        }
    }

    function addLiquidityUSDT(uint256 tokenAmount, uint256 USDTAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(_swapRouter), tokenAmount);

        // add the liquidity
        try
            _swapRouter.addLiquidity(
                address(currency),
                address(this),
                USDTAmount,
                tokenAmount,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                generateLpReceiverAddr,
                block.timestamp
            )
        {} catch {
            emit Failed_addLiquidity();
        }
    }


    // LP 
    address[] private holders;
    mapping(address => uint256) holderIndex;
    mapping(address => bool) excludeHolder;

    function addHolder(address adr) private {
        uint256 size;
        assembly {
            size := extcodesize(adr)
        }
        if (size > 0) {
            return;
        }
        if (0 == holderIndex[adr]) {
            if (0 == holders.length || holders[0] != adr) {
                holderIndex[adr] = holders.length;
                holders.push(adr);
            }
        }
    }


    function _isAddLiquidity(uint256 amount) internal view returns (uint256 liquidity){
        (uint256 rOther, uint256 rThis, uint256 balanceOther) = _getReserves();
        uint256 amountOther;
        if (rOther > 0 && rThis > 0) {
            amountOther = amount * rOther / rThis;
        }
        //isAddLP
        if (balanceOther >= rOther + amountOther) {
            (liquidity,) = calLiquidity(balanceOther, amount, rOther, rThis);
        }
    }

    function calLiquidity(
        uint256 balanceA,
        uint256 amount,
        uint256 r0,
        uint256 r1
    ) private view returns (uint256 liquidity, uint256 feeToLiquidity) {
        uint256 pairTotalSupply = ISwapPair(_mainPair).totalSupply();
        address feeTo = IUniswapV2Factory(_swapRouter.factory()).feeTo();
        bool feeOn = feeTo != address(0);
        uint256 _kLast = ISwapPair(_mainPair).kLast();
        if (feeOn) {
            if (_kLast != 0) {
                uint256 rootK = Math.sqrt(r0 * r1);
                uint256 rootKLast = Math.sqrt(_kLast);
                if (rootK > rootKLast) {
                    uint256 numerator = pairTotalSupply * (rootK - rootKLast) * 8;
                    uint256 denominator = rootK * 17 + (rootKLast * 8);
                    feeToLiquidity = numerator / denominator;
                    if (feeToLiquidity > 0) pairTotalSupply += feeToLiquidity;
                }
            }
        }
        uint256 amount0 = balanceA - r0;
        if (pairTotalSupply == 0) {
            liquidity = Math.sqrt(amount0 * amount) - 1000;
        } else {
            liquidity = Math.min(
                (amount0 * pairTotalSupply) / r0,
                (amount * pairTotalSupply) / r1
            );
        }
    }

    function _isRemoveLiquidity(uint256 amount) internal view returns (uint256 liquidity){
        (uint256 rOther, , uint256 balanceOther) = _getReserves();
        //isRemoveLP
        if (balanceOther <= rOther) {
            liquidity = amount * ISwapPair(_mainPair).totalSupply() / 
            (balanceOf(_mainPair) - amount);
        }
    }

    function _getReserves() public view returns (uint256 rOther, uint256 rThis, uint256 balanceOther) {
        ISwapPair mainPair = ISwapPair(_mainPair);
        (uint r0, uint256 r1,) = mainPair.getReserves();

        address tokenOther = currency;
        if (tokenOther < address(this)) {
            rOther = r0;
            rThis = r1;
        } else {
            rOther = r1;
            rThis = r0;
        }

        balanceOther = IERC20(tokenOther).balanceOf(_mainPair);
    }

    function multiAddHolder(address[] calldata accounts) public onlyOwner {
        for (uint256 i; i < accounts.length; i++) {
            if (ISwapPair(_mainPair).balanceOf(accounts[i]) > 0) {
                addHolder(accounts[i]);
            }
        }
    }

    uint256 private currentIndex;
    uint256 public holderRewardCondition = 2 * 10 ** 18;
    uint256 private progressRewardBlock;
    uint256 public processRewardWaitBlock = 1;

    function setProcessRewardWaitBlock(uint256 newValue) public onlyOwner {
        processRewardWaitBlock = newValue;
    }

    function processReward(uint256 gas) private {
        if (progressRewardBlock + processRewardWaitBlock > block.number) {
            return;
        }

        IERC20 USDT = IERC20(currency);

        uint256 balance = USDT.balanceOf(address(_lpRewardDistributor));
        if (balance < holderRewardCondition) {
            return;
        }

        IERC20 holdToken = IERC20(_mainPair);
        uint256 holdTokenTotal = holdToken.totalSupply();

        address shareHolder;
        uint256 tokenBalance;
        uint256 amount;

        uint256 shareholderCount = holders.length;

        uint256 gasUsed = 0;
        uint256 iterations = 0;
        uint256 gasLeft = gasleft();

        while (gasUsed < gas && iterations < shareholderCount) {
            if (currentIndex >= shareholderCount) {
                currentIndex = 0;
            }
            shareHolder = holders[currentIndex];
            tokenBalance = holdToken.balanceOf(shareHolder);
            if (tokenBalance > 0 && !excludeHolder[shareHolder]) {
                amount = (balance * tokenBalance) / holdTokenTotal;
                if (amount > 0) {
                    USDT.transferFrom(address(_lpRewardDistributor), shareHolder, amount);
                }
            }

            gasUsed = gasUsed + (gasLeft - gasleft());
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }

        progressRewardBlock = block.number;
    }

    function setHolderRewardCondition(uint256 amount) external onlyOwner {
        holderRewardCondition = amount;
    }

    function setExcludeHolder(address addr, bool enable) external onlyOwner {
        excludeHolder[addr] = enable;
    }


}

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 withdrawDividend() external;

    event DividendsDistributed(address indexed from, uint256 weiAmount);

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

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

    address public ETH; //ETH

    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,
        address RewardToken
    ) ERC20(_name, _symbol) {
        ETH = RewardToken;
    }

    function distributeETHDividends(uint256 amount) public onlyOwner {
        require(totalSupply() > 0);

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

            totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
    }

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
    function _withdrawDividendOfUser(
        address payable user
    ) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            emit DividendWithdrawn(user, _withdrawableDividend);
            bool success = IERC20(ETH).transfer(user, _withdrawableDividend);

            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 ETHBackDividendTracker is Ownable, DividendPayingToken {
    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 => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

    // function setMinimumTokenBalanceForDividends(uint256 value) external onlyOwner {
    //     minimumTokenBalanceForDividends = value;
    // }

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );

    constructor(
        uint256 mushHoldTokenAmount,
        address RewardToken,
        string memory _symbol
    )
        DividendPayingToken(
            "ETHBack_Dividen_Tracker",
            _symbol,
            RewardToken
        )
    {
        claimWait = 600;
        minimumTokenBalanceForDividends = mushHoldTokenAmount; //must hold
    }

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

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

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

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

        emit ExcludeFromDividends(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if (lastClaimTime > block.timestamp) {
            return false;
        }

        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

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

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

        processAccount(account, true);
    }

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

        if (numberOfTokenHolders == 0) {
            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 >= tokenHoldersMap.keys.length) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (canAutoClaim(lastClaimTimes[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) {
        uint256 amount = _withdrawDividendOfUser(account);

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

        return false;
    }
}

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) public view returns (uint256) {
        return map.values[key];
    }

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

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

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

    function set(Map storage map, address key, uint256 val) public {
        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) public {
        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();
    }
}

/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety checks.
 */
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    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;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    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;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    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);
    }
}

/**
 * @title SafeMathUint
 * @dev Math operations with safety checks that revert on error
 */
library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

Contract Security Audit

Contract ABI

API
[{"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":"uint256","name":"lpBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[],"name":"Failed_addLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens","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":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","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"}],"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":[],"name":"failed_buyBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"before_userbuyvalue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"before_usersellvalue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"otherFeeAmt","type":"uint256"}],"name":"recordUserProfitInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"sell_value_too_less","type":"event"},{"inputs":[],"name":"ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LPDividendShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NullAddrDividendTracker","outputs":[{"internalType":"contract ETHBackDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDTAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_feeWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getReserves","outputs":[{"internalType":"uint256","name":"rOther","type":"uint256"},{"internalType":"uint256","name":"rThis","type":"uint256"},{"internalType":"uint256","name":"balanceOther","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_lpRewardDistributor","outputs":[{"internalType":"contract LpRewardDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mainPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_rewardList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_swapPairList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapRouterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_takeProfitDistributor","outputs":[{"internalType":"contract TokenDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenDistributor","outputs":[{"internalType":"contract TokenDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_wbnbPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropNumbs","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"burnAmountMapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buy_ETHRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buy_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buy_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buy_marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buy_totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"caSellMinValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"changeWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimNullAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currency","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"disableChangeTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableChangeTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableKillBlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableOffTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableRewardList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableSwapLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTransferFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableWalletLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromNullAddrDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fundAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generateLpReceiverAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getTokenValueUSDT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"usdtAmount","type":"uint256"}],"name":"getUSDTValueToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderRewardCondition","outputs":[{"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":[],"name":"isLaunch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMaxEatExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kb","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBurnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"multiAddHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"multiSetUserProfitInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"multi_bclist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mushHoldNum","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":"nullDividendShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"otherFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentForLPBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processNullAddrDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"processRewardWaitBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sell_ETHRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sell_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sell_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sell_marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sell_totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setAirdropNumbs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_frequencyInSeconds","type":"uint256"},{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"bool","name":"_Enabled","type":"bool"}],"name":"setAutoLPBurnSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setCaSellMinValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setClaims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setEnableTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setExcludeHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"customs","type":"uint256[]"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setFeeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setFundAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddr","type":"address"}],"name":"setGenerateLpReceiverAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setHolderRewardCondition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"killBlockNumber","type":"uint256"}],"name":"setKillBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setLPDividendShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBurnAmount","type":"uint256"}],"name":"setMinBurnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"customs","type":"uint256[]"}],"name":"setMktFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setNullDividendShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setNumTokensSellRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setOtherFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setProcessRewardWaitBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setSwapAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setSwapPairList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setToNullDividendPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startLPBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTradeBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAtAmount","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":"toNullDividendPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFundAmountReceive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"","type":"address"}],"name":"userProfitInfo","outputs":[{"internalType":"uint256","name":"usdtForPurchased","type":"uint256"},{"internalType":"uint256","name":"usdtForSale","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"waitForLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600a80546001600160a01b03191661dead1781555f601b556203d0906023556028805461ffff191660019081179091556064602c556031919091556032805460ff191682178155610e1060335560196035556103526036556096603755678ac7230489e80000603855603955671bc16d674ec80000603f5560415534801561008a575f80fd5b506040518060400160405280600681526020016510939091dbd960d21b81525060405180604001604052806004815260200163424e424760e01b81525081600390816100d69190610fd1565b5060046100e38282610fd1565b5050600580546001600160a01b0319163390811790915560405190915081905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506064600e8190555f600f81905560b46010819055610153929161014d9190610b7e565b90610b7e565b6011555f601281905560646013819055601482905560b4601581905561017d9261014d9190610b7e565b6016555f601781905560099061019482600a611182565b6101a3906404e3b29200611194565b60188054799d2e56108c04266d700ced490c75bfd7c2a1c720000000000000600160301b600160d01b03199091161790819055602b80546001600160a01b03191666010000000000009092046001600160a01b031691909117905590504660380361026357600b80546001600160a01b03199081167355d398326f99059ff775485246999027b3197955908117909255602680548216909217909155601980549091167310ed43c718714eb63d5aa57b78b54704e256024e1790556102ba565b600b80546001600160a01b031990811673ab1a4d4f1d656d2450692d237fdd6c7f9146e8149081179092556026805482169092179091556019805490911673d99d1c33f9fc3444f8101754abc46c52416550d11790555b600b54604080516318160ddd60e01b815290515f926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015610301573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061032591906111ab565b1161032e575f80fd5b61033982600a611182565b610347906301312d00611194565b601f555f601b5560016029556509184e72a000602e819055600b546040516001600160a01b039091169061037a90610f13565b9182526001600160a01b031660208201526060604082018190526013908201527f6e756c6c20616464726573732072657761726400000000000000000000000000608082015260a001604051809103905ff0801580156103dc573d5f803e3d5ffd5b50600980546001600160a01b039283166001600160a01b031991821617909155601954602654601a8054909316908416179091556040805163c45a015560e01b8152905191909216915f91839163c45a01559160048083019260209291908290030181865afa158015610451573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061047591906111c2565b601a546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303815f875af11580156104c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e791906111c2565b9050816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610525573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061054991906111c2565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610594573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b891906111c2565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015610602573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062691906111c2565b600880546001600160a01b0319166001600160a01b03928316179055601a5460195460405163095ea7b360e01b815290831660048201525f19602482015291169063095ea7b3906044016020604051808303815f875af115801561068c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b091906111e8565b50601a546040516001600160a01b03909116906106cc90610f20565b6001600160a01b039091168152602001604051809103905ff0801580156106f5573d5f803e3d5ffd5b50602080546001600160a01b03199081166001600160a01b03938416179091556018805465ffffffffffff1916650100000100011790556028805461ff0019169055610118602a5560068054821685841617905560078054909116918316919091179055610764816001610be5565b60085461077b906001600160a01b03166001610be5565b601954731832c48eb2c1917f5d9a3717889137e940e2f263906107aa9082906001600160a01b03165f19610d0f565b60095460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db0906024015f604051808303815f87803b1580156107ed575f80fd5b505af11580156107ff573d5f803e3d5ffd5b505060095460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db091506024015f604051808303815f87803b158015610845575f80fd5b505af1158015610857573d5f803e3d5ffd5b5050600954600a5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db091506024015f604051808303815f87803b1580156108a1575f80fd5b505af11580156108b3573d5f803e3d5ffd5b505060095460405163031e79db60e41b81526001600160a01b03878116600483015290911692506331e79db091506024015f604051808303815f87803b1580156108fb575f80fd5b505af115801561090d573d5f803e3d5ffd5b505060095460405163031e79db60e41b81525f60048201526001600160a01b0390911692506331e79db091506024015f604051808303815f87803b158015610953575f80fd5b505af1158015610965573d5f803e3d5ffd5b50505050803060405161097790610f2d565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156109a7573d5f803e3d5ffd5b50602180546001600160a01b0319166001600160a01b03928316179055601a546040519116906109d690610f20565b6001600160a01b039091168152602001604051809103905ff0801580156109ff573d5f803e3d5ffd5b50602280546001600160a01b0319166001600160a01b03928316179055601a54163011610a585760405162461bcd60e51b81526020600482015260026024820152613f3f60f01b60448201526064015b60405180910390fd5b6001600160a01b038181165f908152602460205260408082208054600160ff199182168117909255601854660100000000000090049094168352818320805485168217905530835290822080549093161790915561dead9052610abb8185610e32565b5f601d819055338152602760205260408082208054600160ff1991821681179092556018546001600160a01b0366010000000000009091048116855283852080548316841790559485168452828420805482168317905560195485168452828420805482168317905560075490941683528183208054851682179055308352908220805484168217905561dead9091527f5b81ed81fd8c0839a30b67983eab49280895d3199fc1130fb03b7c33e425e0eb80549092161790555061121a92505050565b5f80610b8a8385611207565b905083811015610bdc5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a4f565b90505b92915050565b6001600160a01b0382165f9081526025602052604090205481151560ff909116151503610c845760405162461bcd60e51b815260206004820152604160248201527f4554484261636b3a204175746f6d61746564206d61726b6574206d616b65722060448201527f7061697220697320616c72656164792073657420746f20746861742076616c756064820152606560f81b608482015260a401610a4f565b6001600160a01b0382165f908152602560205260409020805460ff19168215801591909117909155610d0b5760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b158015610cf4575f80fd5b505af1158015610d06573d5f803e3d5ffd5b505050505b5050565b6001600160a01b038316610d715760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a4f565b6001600160a01b038216610dd25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a4f565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038216610e885760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a4f565b600254610e959082610b7e565b6002556001600160a01b0382165f90815260208190526040902054610eba9082610b7e565b6001600160a01b0383165f81815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b611c548061673f83390190565b6101398061839383390190565b61072a806184cc83390190565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680610f6257607f821691505b602082108103610f8057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610f0e57805f5260205f20601f840160051c81016020851015610fab5750805b601f840160051c820191505b81811015610fca575f8155600101610fb7565b5050505050565b81516001600160401b03811115610fea57610fea610f3a565b610ffe81610ff88454610f4e565b84610f86565b6020601f821160018114611030575f83156110195750848201515b5f19600385901b1c1916600184901b178455610fca565b5f84815260208120601f198516915b8281101561105f578785015182556020948501946001909201910161103f565b508482101561107c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156110da578085048111156110be576110be61108b565b60018416156110cc57908102905b60019390931c9280026110a3565b935093915050565b5f826110f057506001610bdf565b816110fc57505f610bdf565b8160018114611112576002811461111c57611138565b6001915050610bdf565b60ff84111561112d5761112d61108b565b50506001821b610bdf565b5060208310610133831016604e8410600b841016171561115b575081810a610bdf565b6111675f19848461109f565b805f190482111561117a5761117a61108b565b029392505050565b5f61118d83836110e2565b9392505050565b8082028115828204841417610bdf57610bdf61108b565b5f602082840312156111bb575f80fd5b5051919050565b5f602082840312156111d2575f80fd5b81516001600160a01b0381168114610bdc575f80fd5b5f602082840312156111f8575f80fd5b81518015158114610bdc575f80fd5b80820180821115610bdf57610bdf61108b565b615518806112275f395ff3fe6080604052600436106106ed575f3560e01c80638322fff21161038a578063b9ffe6e6116101de578063e32759cf11610108578063ef6e4f17116100a8578063f5d588f511610078578063f5d588f5146113db578063fbfa47ab146113fb578063fe06b0061461141a578063ff920c741461142f575f80fd5b8063ef6e4f1714611373578063f0b4c49c14611388578063f2fde38b146113a7578063f5c4eeff146113c6575f80fd5b8063e5c2b0a6116100e3578063e5c2b0a614611304578063e82bef2914611323578063eb10b74114611349578063ee37b5621461135e575f80fd5b8063e32759cf146112b1578063e3f2af62146112c6578063e5a6b10f146112e5575f80fd5b8063c8d6233a1161017e578063d678cbc61161014e578063d678cbc614611211578063d710569b14611230578063dac1dcfe1461124f578063dd62ed3e1461126d575f80fd5b8063c8d6233a14611188578063c92d567e146111a7578063ce4d9f15146111c0578063d5986433146111ef575f80fd5b8063be375c94116101b9578063be375c941461110c578063c213d62d1461112b578063c29902e41461114a578063c49b9a8014611169575f80fd5b8063b9ffe6e614611082578063bc57942f146110c9578063bd25bf29146110de575f80fd5b80639ab8e6d2116102bf578063a9059cbb1161025f578063b02d757f1161022f578063b02d757f14611006578063b492c97514611025578063b53d7eb014611044578063b60368fc14611063575f80fd5b8063a9059cbb14610fa8578063a975a19f14610fc7578063aa4bde2814610fdc578063acb2ad6f14610ff1575f80fd5b8063a457c2d71161029a578063a457c2d714610f36578063a4c82a0014610f55578063a6c5ad7f14610f6a578063a842486114610f89575f80fd5b80639ab8e6d214610ee25780639c1b8af514610f01578063a23270d714610f16575f80fd5b80638da5cb5b1161032a5780638f6cd17d116103055780638f6cd17d14610e9057806395d89b4114610ea5578063961a73e714610eb9578063992db38f14610ece575f80fd5b80638da5cb5b14610e355780638e1e083814610e525780638f02bb5b14610e71575f80fd5b806385dc30041161036557806385dc300414610dcd5780638691752414610dec5780638718b24f14610e0157806388e765ff14610e20575f80fd5b80638322fff214610d7a578063839975bb14610d9957806385141a7714610dae575f80fd5b80633bb82eb6116105415780635a7ba73c11610476578063715018a61161041657806379594736116103e65780637959473614610d095780637a32def214610d285780637c5ee8e914610d475780637db1342c14610d5b575f80fd5b8063715018a614610cad578063730c188814610cc15780637462241514610ce05780637682eefd14610cf4575f80fd5b8063621823e611610451578063621823e614610c455780636402511e14610c5a5780636b61136814610c7957806370a0823114610c8e575f80fd5b80635a7ba73c14610bf35780635d61e77d14610c115780636108a3db14610c26575f80fd5b806348036508116104e15780634d5ce038116104bc5780634d5ce03814610b8b57806353f0705a14610baa578063553193ca14610bbf57806359fb45d414610bd4575f80fd5b80634803650814610b3e5780634a74bb0214610b535780634a9dd8b114610b6c575f80fd5b806340fd10181161051c57806340fd101814610aca5780634188bf5a14610adf57806342e6da3214610afe5780634482004e14610b29575f80fd5b80633bb82eb614610a4f5780633c11100d14610a6e57806340aa81fe14610a9c575f80fd5b806318160ddd11610622578063255412d9116105c25780632f1e4b20116105925780632f1e4b20146109d75780632f6ed08f146109f6578063313ce56714610a155780633950935114610a30575f80fd5b8063255412d91461097f5780632c3e486c146109945780632dab693f146109a95780632e82f1a0146109be575f80fd5b80631c0b355d116105fd5780631c0b355d146109035780631dbbaebd14610922578063206c17bb1461094157806323b872dd14610960575f80fd5b806318160ddd146108c657806318d12855146108da578063199ffc72146108ee575f80fd5b8063095ea7b31161068d578063108c336d11610668578063108c336d1461083c578063116b46a51461085b578063142d026a14610892578063150e4c47146108a7575f80fd5b8063095ea7b3146107f45780630ed01865146108135780630f890b8614610828575f80fd5b806304d8efbe116106c857806304d8efbe1461077257806305833c2b14610795578063060e304e146107b457806306fdde03146107d3575f80fd5b806301339c21146106f857806301986fad1461070e57806303da2b2314610751575f80fd5b366106f457005b5f80fd5b348015610703575f80fd5b5061070c61144e565b005b348015610719575f80fd5b5061073c610728366004614eda565b60246020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561075c575f80fd5b5060185461073c90640100000000900460ff1681565b34801561077d575f80fd5b5061078760145481565b604051908152602001610748565b3480156107a0575f80fd5b5061070c6107af366004614f02565b6114e3565b3480156107bf575f80fd5b5061070c6107ce366004614f39565b611537565b3480156107de575f80fd5b506107e76115a6565b6040516107489190614f50565b3480156107ff575f80fd5b5061073c61080e366004614f85565b611636565b34801561081e575f80fd5b5061078760365481565b348015610833575f80fd5b5061070c61164c565b348015610847575f80fd5b5061070c610856366004614f39565b611687565b348015610866575f80fd5b5060215461087a906001600160a01b031681565b6040516001600160a01b039091168152602001610748565b34801561089d575f80fd5b5061078760395481565b3480156108b2575f80fd5b5061070c6108c1366004614ff7565b611705565b3480156108d1575f80fd5b50600254610787565b3480156108e5575f80fd5b5061070c611799565b3480156108f9575f80fd5b5061078760355481565b34801561090e575f80fd5b5061070c61091d366004614f39565b6117c9565b34801561092d575f80fd5b5061070c61093c36600461504a565b61185d565b34801561094c575f80fd5b5060065461087a906001600160a01b031681565b34801561096b575f80fd5b5061073c61097a366004615089565b611973565b34801561098a575f80fd5b5061078760125481565b34801561099f575f80fd5b5061078760335481565b3480156109b4575f80fd5b50610787601b5481565b3480156109c9575f80fd5b5060325461073c9060ff1681565b3480156109e2575f80fd5b5061070c6109f136600461504a565b6119da565b348015610a01575f80fd5b5061070c610a10366004614f39565b611a7b565b348015610a20575f80fd5b5060405160098152602001610748565b348015610a3b575f80fd5b5061073c610a4a366004614f85565b611aaa565b348015610a5a575f80fd5b5061070c610a69366004614f39565b611adf565b348015610a79575f80fd5b5061073c610a88366004614eda565b60256020525f908152604090205460ff1681565b348015610aa7575f80fd5b5061073c610ab6366004614eda565b60276020525f908152604090205460ff1681565b348015610ad5575f80fd5b5061078760375481565b348015610aea575f80fd5b5060075461087a906001600160a01b031681565b348015610b09575f80fd5b50610787610b18366004614eda565b602d6020525f908152604090205481565b348015610b34575f80fd5b50610787602f5481565b348015610b49575f80fd5b5061078760165481565b348015610b5e575f80fd5b5060285461073c9060ff1681565b348015610b77575f80fd5b5060225461087a906001600160a01b031681565b348015610b96575f80fd5b50610787610ba5366004614eda565b611b0e565b348015610bb5575f80fd5b50610787601f5481565b348015610bca575f80fd5b50610787601e5481565b348015610bdf575f80fd5b5060085461087a906001600160a01b031681565b348015610bfe575f80fd5b5060185461073c90610100900460ff1681565b348015610c1c575f80fd5b5061078760135481565b348015610c31575f80fd5b5061070c610c40366004614ff7565b611b42565b348015610c50575f80fd5b5061078760415481565b348015610c65575f80fd5b5061070c610c74366004614f39565b611c2d565b348015610c84575f80fd5b5061078760175481565b348015610c99575f80fd5b50610787610ca8366004614eda565b611c5c565b348015610cb8575f80fd5b5061070c611c76565b348015610ccc575f80fd5b5061070c610cdb3660046150c7565b611ce9565b348015610ceb575f80fd5b5061070c611dbc565b348015610cff575f80fd5b50610787600e5481565b348015610d14575f80fd5b5061070c610d233660046150f2565b611e30565b348015610d33575f80fd5b50610787610d42366004614f39565b611e7d565b348015610d52575f80fd5b5061070c611ec6565b348015610d66575f80fd5b5061070c610d75366004614f39565b611eff565b348015610d85575f80fd5b50600b5461087a906001600160a01b031681565b348015610da4575f80fd5b50610787602e5481565b348015610db9575f80fd5b50600a5461087a906001600160a01b031681565b348015610dd8575f80fd5b5061070c610de7366004614eda565b611f2e565b348015610df7575f80fd5b50610787600c5481565b348015610e0c575f80fd5b5060205461087a906001600160a01b031681565b348015610e2b575f80fd5b50610787601c5481565b348015610e40575f80fd5b506005546001600160a01b031661087a565b348015610e5d575f80fd5b50602b5461087a906001600160a01b031681565b348015610e7c575f80fd5b5061070c610e8b366004614f39565b611f87565b348015610e9b575f80fd5b50610787602c5481565b348015610eb0575f80fd5b506107e7611fb6565b348015610ec4575f80fd5b5061078760385481565b348015610ed9575f80fd5b5061070c611fc5565b348015610eed575f80fd5b5061070c610efc366004614f39565b612034565b348015610f0c575f80fd5b5061078760235481565b348015610f21575f80fd5b5060185461073c906301000000900460ff1681565b348015610f41575f80fd5b5061073c610f50366004614f85565b612063565b348015610f60575f80fd5b5061078760345481565b348015610f75575f80fd5b50610787610f84366004614f39565b6120b0565b348015610f94575f80fd5b5061070c610fa3366004614f02565b6120de565b348015610fb3575f80fd5b5061073c610fc2366004614f85565b6121a4565b348015610fd2575f80fd5b5061078760315481565b348015610fe7575f80fd5b50610787601d5481565b348015610ffc575f80fd5b50610787602a5481565b348015611011575f80fd5b5060185461073c9062010000900460ff1681565b348015611030575f80fd5b5061070c61103f36600461504a565b6121b0565b34801561104f575f80fd5b5060095461087a906001600160a01b031681565b34801561106e575f80fd5b5061070c61107d366004614f85565b612368565b34801561108d575f80fd5b506110b461109c366004614eda565b60306020525f90815260409020805460019091015482565b60408051928352602083019190915201610748565b3480156110d4575f80fd5b5061078760105481565b3480156110e9575f80fd5b5061073c6110f8366004614eda565b600d6020525f908152604090205460ff1681565b348015611117575f80fd5b5061070c61112636600461510d565b612427565b348015611136575f80fd5b5061070c611145366004614f39565b612502565b348015611155575f80fd5b5061070c611164366004614f39565b612531565b348015611174575f80fd5b5061070c6111833660046150f2565b6125fe565b348015611193575f80fd5b5061070c6111a2366004614f39565b61263b565b3480156111b2575f80fd5b5060185461073c9060ff1681565b3480156111cb575f80fd5b506111d461266a565b60408051938452602084019290925290820152606001610748565b3480156111fa575f80fd5b5060185461073c9065010000000000900460ff1681565b34801561121c575f80fd5b5060195461087a906001600160a01b031681565b34801561123b575f80fd5b5061070c61124a366004614eda565b612796565b34801561125a575f80fd5b5060285461073c90610100900460ff1681565b348015611278575f80fd5b50610787611287366004615179565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b3480156112bc575f80fd5b5061078760295481565b3480156112d1575f80fd5b5061070c6112e0366004614f39565b6127e2565b3480156112f0575f80fd5b50601a5461087a906001600160a01b031681565b34801561130f575f80fd5b5061070c61131e366004614f39565b612811565b34801561132e575f80fd5b5060185461087a90600160301b90046001600160a01b031681565b348015611354575f80fd5b50610787603f5481565b348015611369575f80fd5b50610787600f5481565b34801561137e575f80fd5b50610787603a5481565b348015611393575f80fd5b5061070c6113a2366004614eda565b612886565b3480156113b2575f80fd5b5061070c6113c1366004614eda565b612906565b3480156113d1575f80fd5b5061078760115481565b3480156113e6575f80fd5b5060225461073c90600160a01b900460ff1681565b348015611406575f80fd5b5061070c611415366004614f39565b6129f0565b348015611425575f80fd5b5061078760155481565b34801561143a575f80fd5b5060265461087a906001600160a01b031681565b6005546001600160a01b031633146114815760405162461bcd60e51b8152600401611478906151a5565b60405180910390fd5b60185460ff166114ca5760405162461bcd60e51b8152602060048201526014602482015273656e61626c654f666654726164652066616c736560601b6044820152606401611478565b6022805460ff60a01b1916600160a01b17905543601e55565b6005546001600160a01b0316331461150d5760405162461bcd60e51b8152600401611478906151a5565b6001600160a01b03919091165f908152603d60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146115615760405162461bcd60e51b8152600401611478906151a5565b805f036115a15760405162461bcd60e51b815260206004820152600e60248201526d067726561746572207468616e20360941b6044820152606401611478565b602c55565b6060600380546115b5906151da565b80601f01602080910402602001604051908101604052809291908181526020018280546115e1906151da565b801561162c5780601f106116035761010080835404028352916020019161162c565b820191905f5260205f20905b81548152906001019060200180831161160f57829003601f168201915b5050505050905090565b5f611642338484612a1f565b5060015b92915050565b6005546001600160a01b031633146116765760405162461bcd60e51b8152600401611478906151a5565b6018805465ff000000000019169055565b6005546001600160a01b031633146116b15760405162461bcd60e51b8152600401611478906151a5565b601854610100900460ff166117005760405162461bcd60e51b8152602060048201526015602482015274656e61626c654b696c6c426c6f636b2066616c736560581b6044820152606401611478565b601b55565b6005546001600160a01b0316331461172f5760405162461bcd60e51b8152600401611478906151a5565b5f5b82811015611793578160245f86868581811061174f5761174f61520c565b90506020020160208101906117649190614eda565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101611731565b50505050565b6005546001600160a01b031633146117c35760405162461bcd60e51b8152600401611478906151a5565b5f602f55565b601854600160301b90046001600160a01b0316331461181c5760405162461bcd60e51b815260206004820152600f60248201526e6e6f742066756e646164647265737360881b6044820152606401611478565b60648111156118585760405162461bcd60e51b81526020600482015260086024820152670e8dede40d0d2ced60c31b6044820152606401611478565b603155565b6005546001600160a01b031633146118875760405162461bcd60e51b8152600401611478906151a5565b5f5b8181101561196e576007545f906001600160a01b03166370a082318585858181106118b6576118b661520c565b90506020020160208101906118cb9190614eda565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561190d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119319190615220565b11156119665761196683838381811061194c5761194c61520c565b90506020020160208101906119619190614eda565b612b43565b600101611889565b505050565b5f61197f848484612c0f565b6119d084336119cb85604051806060016040528060288152602001615496602891396001600160a01b038a165f9081526001602090815260408083203384529091529020549190613601565b612a1f565b5060019392505050565b6005546001600160a01b03163314611a045760405162461bcd60e51b8152600401611478906151a5565b81815f818110611a1657611a1661520c565b6020029190910135600e819055600f54601054611a3d9350611a3791613639565b90613639565b60115581816001818110611a5357611a5361520c565b60200291909101356013819055601454601554611a749350611a3791613639565b6016555050565b6005546001600160a01b03163314611aa55760405162461bcd60e51b8152600401611478906151a5565b603755565b335f8181526001602090815260408083206001600160a01b038716845290915281205490916116429185906119cb9086613639565b6005546001600160a01b03163314611b095760405162461bcd60e51b8152600401611478906151a5565b604155565b6001600160a01b0381165f908152600d602052604081205460ff1615611b3657506001919050565b505f919050565b919050565b6005546001600160a01b03163314611b6c5760405162461bcd60e51b8152600401611478906151a5565b60185462010000900460ff16611bbd5760405162461bcd60e51b8152602060048201526016602482015275656e61626c655265776172644c6973742066616c736560501b6044820152606401611478565b60c98210611bc9575f80fd5b5f5b828110156117935781600d5f868685818110611be957611be961520c565b9050602002016020810190611bfe9190614eda565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101611bcb565b6005546001600160a01b03163314611c575760405162461bcd60e51b8152600401611478906151a5565b600c55565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b03163314611ca05760405162461bcd60e51b8152600401611478906151a5565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611d135760405162461bcd60e51b8152600401611478906151a5565b6101f4821115611d585760405162461bcd60e51b815260206004820152601060248201526f0e0cae4c6cadce840e8dede40d0d2ced60831b6044820152606401611478565b6103e8831015611da05760405162461bcd60e51b8152602060048201526013602482015272199c995c5d595b98de481d1bdbc81cda1c9bdd606a1b6044820152606401611478565b6033929092556035556032805460ff1916911515919091179055565b60095460405163bc4c4b3760e01b81523360048201525f60248201526001600160a01b039091169063bc4c4b37906044016020604051808303815f875af1158015611e09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e2d9190615237565b50565b6005546001600160a01b03163314611e5a5760405162461bcd60e51b8152600401611478906151a5565b8015611e7657601754601654611e709190615266565b602a5550565b5f602a5550565b5f805f611e8861369e565b91509150815f14158015611e9b57508015155b15611ebd5781611eab8286615279565b611eb59190615290565b949350505050565b505f9392505050565b6005546001600160a01b03163314611ef05760405162461bcd60e51b8152600401611478906151a5565b6022805460ff60a01b19169055565b6005546001600160a01b03163314611f295760405162461bcd60e51b8152600401611478906151a5565b601d55565b6005546001600160a01b03163314611f585760405162461bcd60e51b8152600401611478906151a5565b601880546001600160a01b03909216600160301b026601000000000000600160d01b0319909216919091179055565b6005546001600160a01b03163314611fb15760405162461bcd60e51b8152600401611478906151a5565b602a55565b6060600480546115b5906151da565b6005546001600160a01b03163314611fef5760405162461bcd60e51b8152600401611478906151a5565b602f541561202e5760405162461bcd60e51b815260206004820152600c60248201526b0737461727465644164644c560a41b6044820152606401611478565b43602f55565b6005546001600160a01b0316331461205e5760405162461bcd60e51b8152600401611478906151a5565b602e55565b5f61164233846119cb856040518060600160405280602581526020016154be60259139335f9081526001602090815260408083206001600160a01b038d1684529091529020549190613601565b5f805f6120bb61369e565b91509150815f141580156120ce57508015155b15611ebd5780611eab8386615279565b6005546001600160a01b031633146121085760405162461bcd60e51b8152600401611478906151a5565b6007546001600160a01b03908116908316036121965760405162461bcd60e51b815260206004820152604160248201527f4554484261636b3a205468652050616e4554485377617020706169722063616e60448201527f6e6f742062652072656d6f7665642066726f6d205f73776170506169724c69736064820152601d60fa1b608482015260a401611478565b6121a082826137cb565b5050565b5f611642338484612c0f565b6005546001600160a01b031633146121da5760405162461bcd60e51b8152600401611478906151a5565b60185465010000000000900460ff1661222b5760405162461bcd60e51b81526020600482015260136024820152721d185e0818da185b99d948191a5cd8589b1959606a1b6044820152606401611478565b81815f81811061223d5761223d61520c565b6020029190910135600e55508181600181811061225c5761225c61520c565b6020029190910135600f55508181600281811061227b5761227b61520c565b905060200201356010819055506122a5600e54611a37600f5460105461363990919063ffffffff16565b601155818160038181106122bb576122bb61520c565b602002919091013560125550818160048181106122da576122da61520c565b602002919091013560135550818160058181106122f9576122f961520c565b602002919091013560145550818160068181106123185761231861520c565b90506020020135601581905550612342601354611a3760145460155461363990919063ffffffff16565b601655818160078181106123585761235861520c565b6020029190910135601755505050565b601854600160301b90046001600160a01b031633036121a0576001600160a01b0382166123b957604051339082156108fc029083905f818181858888f1935050505015801561196e573d5f803e3d5ffd5b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015612403573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061196e9190615237565b6005546001600160a01b031633146124515760405162461bcd60e51b8152600401611478906151a5565b82811461248d5760405162461bcd60e51b815260206004820152600a6024820152690c8d2e640d8cadccee8d60b31b6044820152606401611478565b5f5b838110156124fb578282828181106124a9576124a961520c565b9050602002013560305f8787858181106124c5576124c561520c565b90506020020160208101906124da9190614eda565b6001600160a01b0316815260208101919091526040015f205560010161248f565b5050505050565b6005546001600160a01b0316331461252c5760405162461bcd60e51b8152600401611478906151a5565b603f55565b6009546040516001624d3b8760e01b03198152600481018390525f91829182916001600160a01b03169063ffb2c479906024016060604051808303815f875af1158015612580573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125a491906152af565b604080518481526020810184905290810182905260608101889052929550909350915032905f907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146126285760405162461bcd60e51b8152600401611478906151a5565b6028805460ff1916911515919091179055565b6005546001600160a01b031633146126655760405162461bcd60e51b8152600401611478906151a5565b603655565b5f805f8060075f9054906101000a90046001600160a01b031690505f80826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156126c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126e791906152f0565b50601a546001600160701b039283169450911691506001600160a01b0316308110156127185782965081955061271f565b8196508295505b6007546040516370a0823160e01b81526001600160a01b039182166004820152908216906370a0823190602401602060405180830381865afa158015612767573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278b9190615220565b945050505050909192565b6005546001600160a01b031633146127c05760405162461bcd60e51b8152600401611478906151a5565b602b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461280c5760405162461bcd60e51b8152600401611478906151a5565b603855565b6005546001600160a01b0316331461283b5760405162461bcd60e51b8152600401611478906151a5565b60038111156128815760405162461bcd60e51b81526020600482015260126024820152716e657756616c7565206d757374203c3d203360701b6044820152606401611478565b602955565b6005546001600160a01b031633146128b05760405162461bcd60e51b8152600401611478906151a5565b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015f604051808303815f87803b1580156128f4575f80fd5b505af11580156124fb573d5f803e3d5ffd5b6005546001600160a01b031633146129305760405162461bcd60e51b8152600401611478906151a5565b6001600160a01b0381166129955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611478565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314612a1a5760405162461bcd60e51b8152600401611478906151a5565b603955565b6001600160a01b038316612a815760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611478565b6001600160a01b038216612ae25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611478565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b803b8015612b4f575050565b6001600160a01b0382165f908152603c602052604081205490036121a057603b541580612bab5750816001600160a01b0316603b5f81548110612b9457612b9461520c565b5f918252602090912001546001600160a01b031614155b156121a057603b80546001600160a01b0384165f818152603c60205260408120839055600183018455929092527fbbe3212124853f8b0084a66a2d057c2966e251e132af3691db153ab65f0d1a4d0180546001600160a01b03191690911790555050565b6001600160a01b038316612c355760405162461bcd60e51b815260040161147890615331565b6001600160a01b038216612c5b5760405162461bcd60e51b815260040161147890615376565b5f612c6584611b0e565b1115612ca45760405162461bcd60e51b815260206004820152600e60248201526d6973526577617264203e2030202160901b6044820152606401611478565b805f03612cb65761196e8383836138f4565b6001600160a01b03821661dead148015612cd857506001600160a01b0383163b155b15612da1576001600160a01b0383165f908152602d602052604081208054839290612d04908490615266565b9091555050602e546001600160a01b0384165f908152602d602052604090205410612d96576009546001600160a01b038481165f818152602d6020526040908190205490516338c110ef60e21b81526004810192909252602482015291169063e30443bc906044015f604051808303815f87803b158015612d83575f80fd5b505af1925050508015612d94575060015b505b61196e8383836138f4565b6007545f90819081906001600160a01b038681169116148015612dce57506006546001600160a01b031633145b8015612de25750326001600160a01b038716145b15612e1057612df0846139fa565b90505f81118015612e06575063ffffffff863b16155b15612e1057600191505b6007545f906001600160a01b0390811690881603612e3e57612e3185613a61565b90508015612e3e57600193505b5f612e4830611c5c565b600c5490915081108015908190612e695750600854600160a01b900460ff16155b8015612e73575084155b8015612e9657506001600160a01b0388165f9081526025602052604090205460ff165b8015612eba57506001600160a01b0389165f9081526024602052604090205460ff16155b8015612ede57506001600160a01b0388165f9081526024602052604090205460ff16155b8015612eec575060285460ff165b8015612f0657505f601654601154612f049190615266565b115b15612fa1576008805460ff60a01b1916600160a01b1790556007546001600160a01b038981169116148015612f3d575060325460ff165b8015612f585750603354603454612f549190615266565b4210155b8015612f7c57506001600160a01b0389165f9081526024602052604090205460ff16155b15612f8b57612f89613b1e565b505b612f93613c22565b6008805460ff60a01b191690555b6008546001600160a01b038a165f9081526024602052604090205460ff600160a01b909204821615911680612fed57506001600160a01b0389165f9081526024602052604090205460ff165b15612ff557505f5b801561347f5760185460ff161561312b57602254600160a01b900460ff1661312b576001600160a01b038a165f9081526025602052604090205460ff1615801561305757506001600160a01b0389165f9081526025602052604090205460ff16155b156130a557883b63ffffffff16156130a55760405162461bcd60e51b8152602060048201526011602482015270063616e7420616464206f74686572206c7607c1b6044820152606401611478565b6001600160a01b038a165f9081526025602052604090205460ff16806130e257506001600160a01b0389165f9081526025602052604090205460ff165b1561312b57602f545f1080156130f55750855b61312b5760405162461bcd60e51b815260206004820152600760248201526670617573696e6760c81b6044820152606401611478565b6001600160a01b038a165f9081526025602052604090205460ff16156131ac5743601b54601e5461315c9190615266565b118015613171575060185462010000900460ff165b80156131845750601854610100900460ff165b156131ac576001600160a01b0389165f908152600d60205260409020805460ff191660011790555b6029545f90156131d657886131c08c611c5c565b036131d6576029546131d3908a9061440f565b98505b6001600160a01b038b165f9081526025602052604081205460ff161561321e576132176127106132116011548d61445090919063ffffffff16565b906144ce565b915061327b565b6001600160a01b038b165f9081526025602052604090205460ff1615613259576132176127106132116016548d61445090919063ffffffff16565b613274612710613211602a548d61445090919063ffffffff16565b9150600190505b6001600160a01b038c165f9081526025602052604081205460ff16156132ff576132b66127106132116012548e61445090919063ffffffff16565b9050896132fa575f6132c78c611e7d565b6001600160a01b038e165f908152603060205260408120805492935083929091906132f3908490615266565b9091555050505b61333d565b6001600160a01b038c165f9081526025602052604090205460ff161561333d5761333a6127106132116017548e61445090919063ffffffff16565b90505b881561334957505f9150815b891561335557505f9150815b8015613375576133688d61dead836138f4565b6133728b8261440f565b9a505b61337f8b8461440f565b9a5061338c8d30856138f4565b6001600160a01b038c165f9081526025602052604090205460ff1680156133b1575088155b156133f0575f6133c18e8d61450f565b905080156133ee576133d38c8261440f565b602254909c506133ee908f906001600160a01b0316836138f4565b505b6001600160a01b038c165f9081526027602052604090205460ff1615801561341957505f601d54115b1561347b57601d548b61342b8e611c5c565b6134359190615266565b111561347b5760405162461bcd60e51b81526020600482015260156024820152741bdd995c881b585e081dd85b1b195d081b1a5b5a5d605a1b6044820152606401611478565b5050505b61348a8a8a8a6138f4565b600854600160a01b900460ff161580156134dc57506001600160a01b038a165f9081526025602052604090205460ff16806134dc57506001600160a01b0389165f9081526025602052604090205460ff165b156135ae576023546009546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303815f875af192505050801561354d575060408051601f3d908101601f1916820190925261354a918101906152af565b60015b156135a35760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b6135ac81614635565b505b6001600160a01b038a1630148015906135d15750600854600160a01b900460ff16155b156135f5576007546001600160a01b03908116908a16036135f5576135f58a612b43565b50505050505050505050565b5f81848411156136245760405162461bcd60e51b81526004016114789190614f50565b505f61363084866153b9565b95945050505050565b5f806136458385615266565b9050838110156136975760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611478565b9392505050565b5f805f8060075f9054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156136f2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061371691906152f0565b506001600160701b031691506001600160701b0316915060075f9054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561377d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137a191906153cc565b601a546001600160a01b039081169116146137bd5781816137c0565b80825b909590945092505050565b6001600160a01b0382165f9081526025602052604090205481151560ff90911615150361386a5760405162461bcd60e51b815260206004820152604160248201527f4554484261636b3a204175746f6d61746564206d61726b6574206d616b65722060448201527f7061697220697320616c72656164792073657420746f20746861742076616c756064820152606560f81b608482015260a401611478565b6001600160a01b0382165f908152602560205260409020805460ff191682158015919091179091556121a05760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b1580156138da575f80fd5b505af11580156138ec573d5f803e3d5ffd5b505050505050565b6001600160a01b03831661391a5760405162461bcd60e51b815260040161147890615331565b6001600160a01b0382166139405760405162461bcd60e51b815260040161147890615376565b61397c81604051806060016040528060268152602001615470602691396001600160a01b0386165f908152602081905260409020549190613601565b6001600160a01b038085165f9081526020819052604080822093909355908416815220546139aa9082613639565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612b36565b5f805f80613a0661266a565b9250925092505f8084118015613a1b57505f83115b15613a385782613a2b8588615279565b613a359190615290565b90505b613a428185615266565b8210613a5857613a548287868661491f565b5094505b50505050919050565b5f805f613a6c61266a565b9250509150818111613b17576007548490613a8f906001600160a01b0316611c5c565b613a9991906153b9565b60075f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ae9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b0d9190615220565b611eab9086615279565b5050919050565b426034556007545f908190613b3b906001600160a01b0316611c5c565b90505f61271060355483613b4f9190615279565b613b599190615290565b90508015613b7a57600754613b7a906001600160a01b031661dead836138f4565b6007546040805160016209351760e01b0319815290516001600160a01b0390921691829163fff6cae9916004808301925f92919082900301818387803b158015613bc2575f80fd5b505af1158015613bd4573d5f803e3d5ffd5b50506040805186815260208101869052428183015290517f9cb560eb3a76b2c70f0528d86a83cc0464d10dd0ccc94ba95bd11b93eac93da69350908190036060019150a16001935050505090565b6022545f90613c39906001600160a01b0316611c5c565b90505f613c4530611c5c565b90505f613c528383615266565b9050805f03613c6057505050565b5f613c6a82611e7d565b9050603854811015613caf576040518181527f23f698f25a534772d92275fb2a4fb37dbb8d81feaf0c25d93a5b337321e5986f9060200160405180910390a150505050565b602254613cc6906001600160a01b031630866138f4565b613ccf82614bfb565b601a546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa158015613d19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d3d9190615220565b90505f84613d4b8784615279565b613d559190615290565b90508015614129575f601654601154613d6e9190615266565b601354600e54613d7e9190615266565b613d889084615279565b613d929190615290565b90505f6064601654601154613da79190615266565b603954601554601054613dba9190615266565b613dc49087615279565b613dce9190615279565b613dd89190615290565b613de29190615290565b90505f81613df084866153b9565b613dfa91906153b9565b90508215613e955760185460405163a9059cbb60e01b8152600160301b9091046001600160a01b0390811660048301526024820185905287169063a9059cbb906044016020604051808303815f875af1158015613e59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e7d9190615237565b5082603a5f828254613e8f9190615266565b90915550505b81156140a95760095f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613eeb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f0f9190615220565b5f03613f965760185460405163a9059cbb60e01b8152600160301b9091046001600160a01b0390811660048301526024820184905287169063a9059cbb906044016020604051808303815f875af1158015613f6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f909190615237565b506140a9565b60095460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490525f9188169063a9059cbb906044016020604051808303815f875af1158015613fe7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061400b9190615237565b905080156140a7576009546040516351c2a0e360e01b8152600481018590526001600160a01b03909116906351c2a0e3906024015f604051808303815f87803b158015614056575f80fd5b505af1158015614068573d5f803e3d5ffd5b5050604080518c8152602081018790527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15b505b80156141255760215460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529087169063a9059cbb906044016020604051808303815f875af11580156140ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141239190615237565b505b5050505b5f61413482846153b9565b90505f6037546036546141479190615266565b90505f81603654846141599190615279565b6141639190615290565b90505f61417082856153b9565b905081156143865760095f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141ec9190615220565b5f036142735760185460405163a9059cbb60e01b8152600160301b9091046001600160a01b0390811660048301526024820184905288169063a9059cbb906044016020604051808303815f875af1158015614249573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061426d9190615237565b50614386565b60095460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490525f9189169063a9059cbb906044016020604051808303815f875af11580156142c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142e89190615237565b90508015614384576009546040516351c2a0e360e01b8152600481018590526001600160a01b03909116906351c2a0e3906024015f604051808303815f87803b158015614333575f80fd5b505af1158015614345573d5f803e3d5ffd5b5050604080518d8152602081018790527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15b505b80156144025760215460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529088169063a9059cbb906044016020604051808303815f875af11580156143dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144009190615237565b505b5050505050505050505050565b5f61369783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613601565b5f825f0361445f57505f611646565b5f61446a8385615279565b9050826144778583615290565b146136975760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611478565b5f61369783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614e18565b6001600160a01b0382165f90815260306020526040812080546001909101548261453885611e7d565b90505f838310614563576064603154876145529190615279565b61455c9190615290565b90506145ad565b8361456e8385615266565b11156145ad575f61458d856145838587615266565b610f8491906153b9565b905060646031548261459f9190615279565b6145a99190615290565b9150505b6001600160a01b0387165f90815260306020526040812060010180548492906145d7908490615266565b9091555050604080518581526020810185905290810183905260608101879052608081018290527f8e2fd1a0d9bdf9af689bd0d7619e3ca53df91b80231cfbe8f926eb1d45a656719060a00160405180910390a19695505050505050565b436041546040546146469190615266565b111561464f5750565b601a546021546040516370a0823160e01b81526001600160a01b0391821660048201529116905f9082906370a0823190602401602060405180830381865afa15801561469d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146c19190615220565b9050603f548110156146d257505050565b600754604080516318160ddd60e01b815290516001600160a01b03909216915f9183916318160ddd916004808201926020929091908290030181865afa15801561471e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147429190615220565b603b549091505f90819081908180805a90505b8b8310801561476357508382105b1561490d5783603e5410614776575f603e555b603b603e548154811061478b5761478b61520c565b5f918252602090912001546040516370a0823160e01b81526001600160a01b03918216600482018190529850908a16906370a0823190602401602060405180830381865afa1580156147df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148039190615220565b95505f8611801561482c57506001600160a01b0387165f908152603d602052604090205460ff16155b156148cc578761483c878c615279565b6148469190615290565b945084156148cc576021546040516323b872dd60e01b81526001600160a01b039182166004820152888216602482015260448101879052908c16906323b872dd906064016020604051808303815f875af11580156148a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148ca9190615237565b505b5a6148d790826153b9565b6148e19084615266565b92505a603e80549192505f6148f5836153e7565b91905055508180614905906153e7565b925050614755565b50504360405550505050505050505050565b5f805f60075f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614972573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149969190615220565b90505f60065f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156149e9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a0d91906153cc565b6001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015614a48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a6c91906153cc565b60075460408051637464fc3d60e01b815290519293506001600160a01b038085161515935f9390911691637464fc3d9160048083019260209291908290030181865afa158015614abe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ae29190615220565b90508115614b83578015614b83575f614b03614afe898b615279565b614e44565b90505f614b0f83614e44565b905080821115614b80575f614b2482846153b9565b614b2e9088615279565b614b39906008615279565b90505f614b47836008615279565b614b52856011615279565b614b5c9190615266565b9050614b688183615290565b98508815614b7d57614b7a8989615266565b97505b50505b50505b5f614b8e898c6153b9565b9050845f03614bb8576103e8614ba7614afe8c84615279565b614bb191906153b9565b9650614bed565b614bea89614bc68784615279565b614bd09190615290565b89614bdb888e615279565b614be59190615290565b614eb1565b96505b505050505094509492505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110614c2e57614c2e61520c565b6001600160a01b039283166020918202929092010152601a54825191169082906001908110614c5f57614c5f61520c565b6001600160a01b039283166020918202929092010152600654614c859130911684612a1f565b600654602054604051635c11d79560e01b81526001600160a01b0392831692635c11d79592614cc19287925f92889291169042906004016153ff565b5f604051808303815f87803b158015614cd8575f80fd5b505af1925050508015614ce9575060015b614d2257604051600181527f6c37756e80daba6f4df0d5bfa6cddadfe23601acc1a27dc8d4aa427de91467889060200160405180910390a15b601a546020546040516370a0823160e01b81526001600160a01b0391821660048201525f9291909116906370a0823190602401602060405180830381865afa158015614d70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d949190615220565b9050801561196e57601a546020546040516323b872dd60e01b81526001600160a01b039182166004820152306024820152604481018490529116906323b872dd906064016020604051808303815f875af1158015614df4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117939190615237565b5f8183614e385760405162461bcd60e51b81526004016114789190614f50565b505f6136308486615290565b5f6003821115614ea35750805f614e5c600283615290565b614e67906001615266565b90505b81811015614e9d57905080600281614e828186615290565b614e8c9190615266565b614e969190615290565b9050614e6a565b50919050565b8115611b3d57506001919050565b5f818310614ebf5781613697565b5090919050565b6001600160a01b0381168114611e2d575f80fd5b5f60208284031215614eea575f80fd5b813561369781614ec6565b8015158114611e2d575f80fd5b5f8060408385031215614f13575f80fd5b8235614f1e81614ec6565b91506020830135614f2e81614ef5565b809150509250929050565b5f60208284031215614f49575f80fd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8060408385031215614f96575f80fd5b8235614fa181614ec6565b946020939093013593505050565b5f8083601f840112614fbf575f80fd5b50813567ffffffffffffffff811115614fd6575f80fd5b6020830191508360208260051b8501011115614ff0575f80fd5b9250929050565b5f805f60408486031215615009575f80fd5b833567ffffffffffffffff81111561501f575f80fd5b61502b86828701614faf565b909450925050602084013561503f81614ef5565b809150509250925092565b5f806020838503121561505b575f80fd5b823567ffffffffffffffff811115615071575f80fd5b61507d85828601614faf565b90969095509350505050565b5f805f6060848603121561509b575f80fd5b83356150a681614ec6565b925060208401356150b681614ec6565b929592945050506040919091013590565b5f805f606084860312156150d9575f80fd5b8335925060208401359150604084013561503f81614ef5565b5f60208284031215615102575f80fd5b813561369781614ef5565b5f805f8060408587031215615120575f80fd5b843567ffffffffffffffff811115615136575f80fd5b61514287828801614faf565b909550935050602085013567ffffffffffffffff811115615161575f80fd5b61516d87828801614faf565b95989497509550505050565b5f806040838503121561518a575f80fd5b823561519581614ec6565b91506020830135614f2e81614ec6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806151ee57607f821691505b602082108103614e9d57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215615230575f80fd5b5051919050565b5f60208284031215615247575f80fd5b815161369781614ef5565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561164657611646615252565b808202811582820484141761164657611646615252565b5f826152aa57634e487b7160e01b5f52601260045260245ffd5b500490565b5f805f606084860312156152c1575f80fd5b5050815160208301516040909301519094929350919050565b80516001600160701b0381168114611b3d575f80fd5b5f805f60608486031215615302575f80fd5b61530b846152da565b9250615319602085016152da565b9150604084015163ffffffff8116811461503f575f80fd5b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8181038181111561164657611646615252565b5f602082840312156153dc575f80fd5b815161369781614ec6565b5f600182016153f8576153f8615252565b5060010190565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b8181101561544f5783516001600160a01b0316835260209384019390920191600101615428565b50506001600160a01b03959095166060840152505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122033a651641e2a5e6f1a1d2e8a8775d0e876360bdfd1628d6e84e4dd7af970f6d264736f6c634300081a0033608060405234801561000f575f80fd5b50604051611c54380380611c5483398101604081905261002e9161010c565b60408051808201909152601781527f4554484261636b5f4469766964656e5f547261636b657200000000000000000060208201528183828260036100728382610268565b50600461007f8282610268565b5050600580546001600160a01b0319163390811790915560405190915081905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600680546001600160a01b0319166001600160a01b039290921691909117905550506102586012555050601355610322565b634e487b7160e01b5f52604160045260245ffd5b5f805f6060848603121561011e575f80fd5b835160208501519093506001600160a01b038116811461013c575f80fd5b60408501519092506001600160401b03811115610157575f80fd5b8401601f81018613610167575f80fd5b80516001600160401b03811115610180576101806100f8565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101ae576101ae6100f8565b6040528181528282016020018810156101c5575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b600181811c908216806101f857607f821691505b60208210810361021657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561026357805f5260205f20601f840160051c810160208510156102415750805b601f840160051c820191505b81811015610260575f815560010161024d565b50505b505050565b81516001600160401b03811115610281576102816100f8565b6102958161028f84546101e4565b8461021c565b6020601f8211600181146102c7575f83156102b05750848201515b5f19600385901b1c1916600184901b178455610260565b5f84815260208120601f198516915b828110156102f657878501518255602094850194600190920191016102d6565b508482101561031357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6119258061032f5f395ff3fe608060405234801561000f575f80fd5b50600436106101dc575f3560e01c8063715018a611610109578063a9059cbb1161009e578063dd62ed3e1161006e578063dd62ed3e1461040b578063e30443bc14610443578063f2fde38b14610456578063ffb2c47914610469575f80fd5b8063a9059cbb146103b4578063aafd847a146103c7578063bc4c4b37146103ef578063be10b61414610402575f80fd5b806391b89fba116100d957806391b89fba1461037357806395d89b4114610386578063a457c2d71461038e578063a8b9d240146103a1575f80fd5b8063715018a6146103265780638322fff21461032e57806385a6b3ae146103595780638da5cb5b14610362575f80fd5b8063313ce5671161017f57806351c2a0e31161014f57806351c2a0e3146102da5780636a474002146102ed5780636f2789ec146102f557806370a08231146102fe575f80fd5b8063313ce5671461028157806331e79db01461029057806339509351146102a55780634e7b827f146102b8575f80fd5b8063226cfa3d116101ba578063226cfa3d1461023357806323b872dd1461025257806327ce0147146102655780633009a60914610278575f80fd5b806306fdde03146101e0578063095ea7b3146101fe57806318160ddd14610221575b5f80fd5b6101e8610497565b6040516101f591906115c3565b60405180910390f35b61021161020c36600461160c565b610527565b60405190151581526020016101f5565b6002545b6040519081526020016101f5565b610225610241366004611636565b60116020525f908152604090205481565b610211610260366004611651565b61053d565b610225610273366004611636565b6105a4565b610225600f5481565b604051600981526020016101f5565b6102a361029e366004611636565b6105ff565b005b6102116102b336600461160c565b610727565b6102116102c6366004611636565b60106020525f908152604090205460ff1681565b6102a36102e836600461168f565b61075c565b6102a3610818565b61022560125481565b61022561030c366004611636565b6001600160a01b03165f9081526020819052604090205490565b6102a36108c0565b600654610341906001600160a01b031681565b6040516001600160a01b0390911681526020016101f5565b610225600a5481565b6005546001600160a01b0316610341565b610225610381366004611636565b610933565b6101e861093d565b61021161039c36600461160c565b61094c565b6102256103af366004611636565b610999565b6102116103c236600461160c565b6109c4565b6102256103d5366004611636565b6001600160a01b03165f9081526009602052604090205490565b6102116103fd3660046116b3565b6109d0565b61022560135481565b6102256104193660046116ea565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6102a361045136600461160c565b610a7a565b6102a3610464366004611636565b610bda565b61047c61047736600461168f565b610cc4565b604080519384526020840192909252908201526060016101f5565b6060600380546104a690611716565b80601f01602080910402602001604051908101604052809291908181526020018280546104d290611716565b801561051d5780601f106104f45761010080835404028352916020019161051d565b820191905f5260205f20905b81548152906001019060200180831161050057829003601f168201915b5050505050905090565b5f610533338484610dd8565b5060015b92915050565b5f610549848484610efb565b61059a8433610595856040518060600160405280602881526020016118a3602891396001600160a01b038a165f9081526001602090815260408083203384529091529020549190610f5a565b610dd8565b5060019392505050565b6001600160a01b0381165f9081526008602090815260408083205491839052822054600754600160801b926105f5926105f0926105ea916105e59190610f92565b611017565b90611025565b61105f565b6105379190611762565b6005546001600160a01b031633146106325760405162461bcd60e51b815260040161062990611781565b60405180910390fd5b6001600160a01b0381165f9081526010602052604090205460ff1615610656575f80fd5b6001600160a01b0381165f908152601060205260408120805460ff19166001179055610683908290611070565b60405163131836e760e21b8152600b60048201526001600160a01b038216602482015273ea62679f802fdd9f565984b9eb4f9d21e1d4212090634c60db9c906044015f6040518083038186803b1580156106db575f80fd5b505af41580156106ed573d5f803e3d5ffd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2591505f90a250565b335f8181526001602090815260408083206001600160a01b0387168452909152812054909161053391859061059590866110d2565b6005546001600160a01b031633146107865760405162461bcd60e51b815260040161062990611781565b5f61079060025490565b11610799575f80fd5b8015610815576107cc6107ab60025490565b6107b983600160801b610f92565b6107c39190611762565b600754906110d2565b60075560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600a5461081190826110d2565b600a555b50565b60405162461bcd60e51b815260206004820152606b60248201527f4554484261636b5f4469766964656e645f547261636b65723a2077697468647260448201527f61774469766964656e642064697361626c65642e20557365207468652027636c60648201527f61696d272066756e6374696f6e206f6e20746865206d61696e2045544842616360848201526a359031b7b73a3930b1ba1760a91b60a482015260c401610629565b6005546001600160a01b031633146108ea5760405162461bcd60e51b815260040161062990611781565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b5f61053782610999565b6060600480546104a690611716565b5f6105333384610595856040518060600160405280602581526020016118cb60259139335f9081526001602090815260408083206001600160a01b038d1684529091529020549190610f5a565b6001600160a01b0381165f90815260096020526040812054610537906109be846105a4565b90611130565b5f610533338484610efb565b6005545f906001600160a01b031633146109fc5760405162461bcd60e51b815260040161062990611781565b5f610a0684611171565b90508015610a71576001600160a01b0384165f81815260116020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610a5f9085815260200190565b60405180910390a36001915050610537565b505f9392505050565b6005546001600160a01b03163314610aa45760405162461bcd60e51b815260040161062990611781565b6001600160a01b0382165f9081526010602052604090205460ff16610bd6576013548110610b5057610ad68282611070565b604051632f0ad01760e21b8152600b60048201526001600160a01b03831660248201526044810182905273ea62679f802fdd9f565984b9eb4f9d21e1d421209063bc2b405c906064015f6040518083038186803b158015610b35575f80fd5b505af4158015610b47573d5f803e3d5ffd5b50505050610bc9565b610b5a825f611070565b60405163131836e760e21b8152600b60048201526001600160a01b038316602482015273ea62679f802fdd9f565984b9eb4f9d21e1d4212090634c60db9c906044015f6040518083038186803b158015610bb2575f80fd5b505af4158015610bc4573d5f803e3d5ffd5b505050505b610bd48260016109d0565b505b5050565b6005546001600160a01b03163314610c045760405162461bcd60e51b815260040161062990611781565b6001600160a01b038116610c695760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610629565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600b545f9081908190808203610ce4575050600f545f9250829150610dd1565b600f545f805a90505f805b8984108015610cfd57508582105b15610dc05784610d0c816117b6565b600b5490965086109050610d1e575f94505b5f600b5f018681548110610d3457610d346117ce565b5f9182526020808320909101546001600160a01b03168083526011909152604090912054909150610d64906112cc565b15610d8757610d748160016109d0565b15610d875781610d83816117b6565b9250505b82610d91816117b6565b9350505f5a905080851115610db757610db4610dad8683611130565b87906110d2565b95505b9350610cef9050565b600f85905590975095509193505050505b9193909250565b6001600160a01b038316610e3a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610629565b6001600160a01b038216610e9b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610629565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602e60248201527f4554484261636b5f4469766964656e645f547261636b65723a204e6f2074726160448201526d1b9cd9995c9cc8185b1b1bddd95960921b6064820152608401610629565b5f8184841115610f7d5760405162461bcd60e51b815260040161062991906115c3565b505f610f8984866117e2565b95945050505050565b5f825f03610fa157505f610537565b5f610fac83856117f5565b905082610fb98583611762565b146110105760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610629565b9392505050565b5f8181811215610537575f80fd5b5f80611031838561180c565b90505f83121580156110435750838112155b8061105757505f8312801561105757508381125b611010575f80fd5b5f8082121561106c575f80fd5b5090565b6001600160a01b0382165f90815260208190526040902054808211156110ad575f61109b8383611130565b90506110a784826112f1565b50610bd4565b80821015610bd4575f6110c08284611130565b90506110cc8482611353565b50505050565b5f806110de8385611833565b9050838110156110105760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610629565b5f61101083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610f5a565b5f8061117c83610999565b905080156112c4576001600160a01b0383165f908152600960205260409020546111a690826110d2565b6001600160a01b0384165f81815260096020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906111f49084815260200190565b60405180910390a260065460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018490525f92169063a9059cbb906044016020604051808303815f875af115801561124c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112709190611846565b9050806112bd576001600160a01b0384165f908152600960205260409020546112999083611130565b6001600160a01b039094165f90815260096020526040812094909455509192915050565b5092915050565b505f92915050565b5f428211156112dc57505f919050565b6012546112e94284611130565b101592915050565b6112fb8282611396565b6113346113166105e583600754610f9290919063ffffffff16565b6001600160a01b0384165f908152600860205260409020549061147e565b6001600160a01b039092165f9081526008602052604090209190915550565b61135d82826114b7565b6113346113786105e583600754610f9290919063ffffffff16565b6001600160a01b0384165f9081526008602052604090205490611025565b6001600160a01b0382166113ec5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610629565b6113f75f8383610bd4565b60025461140490826110d2565b6002556001600160a01b0382165f9081526020819052604090205461142990826110d2565b6001600160a01b0383165f81815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b5f8061148a8385611861565b90505f831215801561149c5750838113155b8061105757505f831280156110575750838113611010575f80fd5b6001600160a01b0382166115175760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610629565b611522825f83610bd4565b61155e81604051806060016040528060228152602001611881602291396001600160a01b0385165f908152602081905260409020549190610f5a565b6001600160a01b0383165f908152602081905260409020556002546115839082611130565b6002556040518181525f906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611472565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114610815575f80fd5b5f806040838503121561161d575f80fd5b8235611628816115f8565b946020939093013593505050565b5f60208284031215611646575f80fd5b8135611010816115f8565b5f805f60608486031215611663575f80fd5b833561166e816115f8565b9250602084013561167e816115f8565b929592945050506040919091013590565b5f6020828403121561169f575f80fd5b5035919050565b8015158114610815575f80fd5b5f80604083850312156116c4575f80fd5b82356116cf816115f8565b915060208301356116df816116a6565b809150509250929050565b5f80604083850312156116fb575f80fd5b8235611706816115f8565b915060208301356116df816115f8565b600181811c9082168061172a57607f821691505b60208210810361174857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b5f8261177c57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f600182016117c7576117c761174e565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b818103818111156105375761053761174e565b80820281158282048414176105375761053761174e565b8082018281125f83128015821682158216171561182b5761182b61174e565b505092915050565b808201808211156105375761053761174e565b5f60208284031215611856575f80fd5b8151611010816116a6565b8181035f8312801583831316838312821617156112bd576112bd61174e56fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220645fd35b9da32e9c193be3a1cdda0f41bba6b656ff67d26eec67173c4e2bc14b64736f6c634300081a0033608060405234801561000f575f80fd5b5060405161013938038061013983398101604081905261002e916100a3565b60405163095ea7b360e01b81523360048201525f1960248201526001600160a01b0382169063095ea7b3906044016020604051808303815f875af1158015610078573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061009c91906100d0565b50506100ef565b5f602082840312156100b3575f80fd5b81516001600160a01b03811681146100c9575f80fd5b9392505050565b5f602082840312156100e0575f80fd5b815180151581146100c9575f80fd5b603e806100fb5f395ff3fe60806040525f80fdfea2646970667358221220228c8e38251f0f7a1257d102a901e254f395cf498666eec2ee03329c029345ea64736f6c634300081a0033608060405234801561000f575f80fd5b5060405161072a38038061072a83398101604081905261002e916102a2565b5f80546001600160a01b031916339081178255604051909182915f8051602061070a833981519152908290a3506100648261017e565b466038036100b957600280546001600160a01b03199081167310ed43c718714eb63d5aa57b78b54704e256024e17909155600180549091167355d398326f99059ff775485246999027b3197955179055610102565b600280546001600160a01b031990811673d99d1c33f9fc3444f8101754abc46c52416550d1179091556001805490911673ab1a4d4f1d656d2450692d237fdd6c7f9146e8141790555b60015460405163095ea7b360e01b81526001600160a01b0383811660048301525f1960248301529091169063095ea7b3906044016020604051808303815f875af1158015610152573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017691906102d3565b5050506102f9565b5f546001600160a01b031633146101dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b0381166102415760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101d3565b5f80546040516001600160a01b03808516939216915f8051602061070a83398151915291a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b80516001600160a01b038116811461029d575f80fd5b919050565b5f80604083850312156102b3575f80fd5b6102bc83610287565b91506102ca60208401610287565b90509250929050565b5f602082840312156102e3575f80fd5b815180151581146102f2575f80fd5b9392505050565b610404806103065f395ff3fe608060405234801561000f575f80fd5b5060043610610060575f3560e01c80631698755f14610064578063715018a6146100795780638da5cb5b14610081578063c54e44eb146100a9578063edae876f146100bc578063f2fde38b146100cf575b5f80fd5b610077610072366004610332565b6100e2565b005b6100776101bf565b5f546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b60015461008d906001600160a01b031681565b60025461008d906001600160a01b031681565b6100776100dd36600461035a565b610230565b5f546001600160a01b031633146101145760405162461bcd60e51b815260040161010b9061037a565b60405180910390fd5b6001600160a01b03821661015157604051339082156108fc029083905f818181858888f1935050505015801561014c573d5f803e3d5ffd5b505050565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af115801561019b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014c91906103af565b5f546001600160a01b031633146101e85760405162461bcd60e51b815260040161010b9061037a565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b031633146102595760405162461bcd60e51b815260040161010b9061037a565b6001600160a01b0381166102be5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161010b565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461032d575f80fd5b919050565b5f8060408385031215610343575f80fd5b61034c83610317565b946020939093013593505050565b5f6020828403121561036a575f80fd5b61037382610317565b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f602082840312156103bf575f80fd5b81518015158114610373575f80fdfea2646970667358221220a8624181e9c40a6f978fa71d021e32885b278989311b5ff1be624e3eab3c0ce464736f6c634300081a00338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x6080604052600436106106ed575f3560e01c80638322fff21161038a578063b9ffe6e6116101de578063e32759cf11610108578063ef6e4f17116100a8578063f5d588f511610078578063f5d588f5146113db578063fbfa47ab146113fb578063fe06b0061461141a578063ff920c741461142f575f80fd5b8063ef6e4f1714611373578063f0b4c49c14611388578063f2fde38b146113a7578063f5c4eeff146113c6575f80fd5b8063e5c2b0a6116100e3578063e5c2b0a614611304578063e82bef2914611323578063eb10b74114611349578063ee37b5621461135e575f80fd5b8063e32759cf146112b1578063e3f2af62146112c6578063e5a6b10f146112e5575f80fd5b8063c8d6233a1161017e578063d678cbc61161014e578063d678cbc614611211578063d710569b14611230578063dac1dcfe1461124f578063dd62ed3e1461126d575f80fd5b8063c8d6233a14611188578063c92d567e146111a7578063ce4d9f15146111c0578063d5986433146111ef575f80fd5b8063be375c94116101b9578063be375c941461110c578063c213d62d1461112b578063c29902e41461114a578063c49b9a8014611169575f80fd5b8063b9ffe6e614611082578063bc57942f146110c9578063bd25bf29146110de575f80fd5b80639ab8e6d2116102bf578063a9059cbb1161025f578063b02d757f1161022f578063b02d757f14611006578063b492c97514611025578063b53d7eb014611044578063b60368fc14611063575f80fd5b8063a9059cbb14610fa8578063a975a19f14610fc7578063aa4bde2814610fdc578063acb2ad6f14610ff1575f80fd5b8063a457c2d71161029a578063a457c2d714610f36578063a4c82a0014610f55578063a6c5ad7f14610f6a578063a842486114610f89575f80fd5b80639ab8e6d214610ee25780639c1b8af514610f01578063a23270d714610f16575f80fd5b80638da5cb5b1161032a5780638f6cd17d116103055780638f6cd17d14610e9057806395d89b4114610ea5578063961a73e714610eb9578063992db38f14610ece575f80fd5b80638da5cb5b14610e355780638e1e083814610e525780638f02bb5b14610e71575f80fd5b806385dc30041161036557806385dc300414610dcd5780638691752414610dec5780638718b24f14610e0157806388e765ff14610e20575f80fd5b80638322fff214610d7a578063839975bb14610d9957806385141a7714610dae575f80fd5b80633bb82eb6116105415780635a7ba73c11610476578063715018a61161041657806379594736116103e65780637959473614610d095780637a32def214610d285780637c5ee8e914610d475780637db1342c14610d5b575f80fd5b8063715018a614610cad578063730c188814610cc15780637462241514610ce05780637682eefd14610cf4575f80fd5b8063621823e611610451578063621823e614610c455780636402511e14610c5a5780636b61136814610c7957806370a0823114610c8e575f80fd5b80635a7ba73c14610bf35780635d61e77d14610c115780636108a3db14610c26575f80fd5b806348036508116104e15780634d5ce038116104bc5780634d5ce03814610b8b57806353f0705a14610baa578063553193ca14610bbf57806359fb45d414610bd4575f80fd5b80634803650814610b3e5780634a74bb0214610b535780634a9dd8b114610b6c575f80fd5b806340fd10181161051c57806340fd101814610aca5780634188bf5a14610adf57806342e6da3214610afe5780634482004e14610b29575f80fd5b80633bb82eb614610a4f5780633c11100d14610a6e57806340aa81fe14610a9c575f80fd5b806318160ddd11610622578063255412d9116105c25780632f1e4b20116105925780632f1e4b20146109d75780632f6ed08f146109f6578063313ce56714610a155780633950935114610a30575f80fd5b8063255412d91461097f5780632c3e486c146109945780632dab693f146109a95780632e82f1a0146109be575f80fd5b80631c0b355d116105fd5780631c0b355d146109035780631dbbaebd14610922578063206c17bb1461094157806323b872dd14610960575f80fd5b806318160ddd146108c657806318d12855146108da578063199ffc72146108ee575f80fd5b8063095ea7b31161068d578063108c336d11610668578063108c336d1461083c578063116b46a51461085b578063142d026a14610892578063150e4c47146108a7575f80fd5b8063095ea7b3146107f45780630ed01865146108135780630f890b8614610828575f80fd5b806304d8efbe116106c857806304d8efbe1461077257806305833c2b14610795578063060e304e146107b457806306fdde03146107d3575f80fd5b806301339c21146106f857806301986fad1461070e57806303da2b2314610751575f80fd5b366106f457005b5f80fd5b348015610703575f80fd5b5061070c61144e565b005b348015610719575f80fd5b5061073c610728366004614eda565b60246020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561075c575f80fd5b5060185461073c90640100000000900460ff1681565b34801561077d575f80fd5b5061078760145481565b604051908152602001610748565b3480156107a0575f80fd5b5061070c6107af366004614f02565b6114e3565b3480156107bf575f80fd5b5061070c6107ce366004614f39565b611537565b3480156107de575f80fd5b506107e76115a6565b6040516107489190614f50565b3480156107ff575f80fd5b5061073c61080e366004614f85565b611636565b34801561081e575f80fd5b5061078760365481565b348015610833575f80fd5b5061070c61164c565b348015610847575f80fd5b5061070c610856366004614f39565b611687565b348015610866575f80fd5b5060215461087a906001600160a01b031681565b6040516001600160a01b039091168152602001610748565b34801561089d575f80fd5b5061078760395481565b3480156108b2575f80fd5b5061070c6108c1366004614ff7565b611705565b3480156108d1575f80fd5b50600254610787565b3480156108e5575f80fd5b5061070c611799565b3480156108f9575f80fd5b5061078760355481565b34801561090e575f80fd5b5061070c61091d366004614f39565b6117c9565b34801561092d575f80fd5b5061070c61093c36600461504a565b61185d565b34801561094c575f80fd5b5060065461087a906001600160a01b031681565b34801561096b575f80fd5b5061073c61097a366004615089565b611973565b34801561098a575f80fd5b5061078760125481565b34801561099f575f80fd5b5061078760335481565b3480156109b4575f80fd5b50610787601b5481565b3480156109c9575f80fd5b5060325461073c9060ff1681565b3480156109e2575f80fd5b5061070c6109f136600461504a565b6119da565b348015610a01575f80fd5b5061070c610a10366004614f39565b611a7b565b348015610a20575f80fd5b5060405160098152602001610748565b348015610a3b575f80fd5b5061073c610a4a366004614f85565b611aaa565b348015610a5a575f80fd5b5061070c610a69366004614f39565b611adf565b348015610a79575f80fd5b5061073c610a88366004614eda565b60256020525f908152604090205460ff1681565b348015610aa7575f80fd5b5061073c610ab6366004614eda565b60276020525f908152604090205460ff1681565b348015610ad5575f80fd5b5061078760375481565b348015610aea575f80fd5b5060075461087a906001600160a01b031681565b348015610b09575f80fd5b50610787610b18366004614eda565b602d6020525f908152604090205481565b348015610b34575f80fd5b50610787602f5481565b348015610b49575f80fd5b5061078760165481565b348015610b5e575f80fd5b5060285461073c9060ff1681565b348015610b77575f80fd5b5060225461087a906001600160a01b031681565b348015610b96575f80fd5b50610787610ba5366004614eda565b611b0e565b348015610bb5575f80fd5b50610787601f5481565b348015610bca575f80fd5b50610787601e5481565b348015610bdf575f80fd5b5060085461087a906001600160a01b031681565b348015610bfe575f80fd5b5060185461073c90610100900460ff1681565b348015610c1c575f80fd5b5061078760135481565b348015610c31575f80fd5b5061070c610c40366004614ff7565b611b42565b348015610c50575f80fd5b5061078760415481565b348015610c65575f80fd5b5061070c610c74366004614f39565b611c2d565b348015610c84575f80fd5b5061078760175481565b348015610c99575f80fd5b50610787610ca8366004614eda565b611c5c565b348015610cb8575f80fd5b5061070c611c76565b348015610ccc575f80fd5b5061070c610cdb3660046150c7565b611ce9565b348015610ceb575f80fd5b5061070c611dbc565b348015610cff575f80fd5b50610787600e5481565b348015610d14575f80fd5b5061070c610d233660046150f2565b611e30565b348015610d33575f80fd5b50610787610d42366004614f39565b611e7d565b348015610d52575f80fd5b5061070c611ec6565b348015610d66575f80fd5b5061070c610d75366004614f39565b611eff565b348015610d85575f80fd5b50600b5461087a906001600160a01b031681565b348015610da4575f80fd5b50610787602e5481565b348015610db9575f80fd5b50600a5461087a906001600160a01b031681565b348015610dd8575f80fd5b5061070c610de7366004614eda565b611f2e565b348015610df7575f80fd5b50610787600c5481565b348015610e0c575f80fd5b5060205461087a906001600160a01b031681565b348015610e2b575f80fd5b50610787601c5481565b348015610e40575f80fd5b506005546001600160a01b031661087a565b348015610e5d575f80fd5b50602b5461087a906001600160a01b031681565b348015610e7c575f80fd5b5061070c610e8b366004614f39565b611f87565b348015610e9b575f80fd5b50610787602c5481565b348015610eb0575f80fd5b506107e7611fb6565b348015610ec4575f80fd5b5061078760385481565b348015610ed9575f80fd5b5061070c611fc5565b348015610eed575f80fd5b5061070c610efc366004614f39565b612034565b348015610f0c575f80fd5b5061078760235481565b348015610f21575f80fd5b5060185461073c906301000000900460ff1681565b348015610f41575f80fd5b5061073c610f50366004614f85565b612063565b348015610f60575f80fd5b5061078760345481565b348015610f75575f80fd5b50610787610f84366004614f39565b6120b0565b348015610f94575f80fd5b5061070c610fa3366004614f02565b6120de565b348015610fb3575f80fd5b5061073c610fc2366004614f85565b6121a4565b348015610fd2575f80fd5b5061078760315481565b348015610fe7575f80fd5b50610787601d5481565b348015610ffc575f80fd5b50610787602a5481565b348015611011575f80fd5b5060185461073c9062010000900460ff1681565b348015611030575f80fd5b5061070c61103f36600461504a565b6121b0565b34801561104f575f80fd5b5060095461087a906001600160a01b031681565b34801561106e575f80fd5b5061070c61107d366004614f85565b612368565b34801561108d575f80fd5b506110b461109c366004614eda565b60306020525f90815260409020805460019091015482565b60408051928352602083019190915201610748565b3480156110d4575f80fd5b5061078760105481565b3480156110e9575f80fd5b5061073c6110f8366004614eda565b600d6020525f908152604090205460ff1681565b348015611117575f80fd5b5061070c61112636600461510d565b612427565b348015611136575f80fd5b5061070c611145366004614f39565b612502565b348015611155575f80fd5b5061070c611164366004614f39565b612531565b348015611174575f80fd5b5061070c6111833660046150f2565b6125fe565b348015611193575f80fd5b5061070c6111a2366004614f39565b61263b565b3480156111b2575f80fd5b5060185461073c9060ff1681565b3480156111cb575f80fd5b506111d461266a565b60408051938452602084019290925290820152606001610748565b3480156111fa575f80fd5b5060185461073c9065010000000000900460ff1681565b34801561121c575f80fd5b5060195461087a906001600160a01b031681565b34801561123b575f80fd5b5061070c61124a366004614eda565b612796565b34801561125a575f80fd5b5060285461073c90610100900460ff1681565b348015611278575f80fd5b50610787611287366004615179565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b3480156112bc575f80fd5b5061078760295481565b3480156112d1575f80fd5b5061070c6112e0366004614f39565b6127e2565b3480156112f0575f80fd5b50601a5461087a906001600160a01b031681565b34801561130f575f80fd5b5061070c61131e366004614f39565b612811565b34801561132e575f80fd5b5060185461087a90600160301b90046001600160a01b031681565b348015611354575f80fd5b50610787603f5481565b348015611369575f80fd5b50610787600f5481565b34801561137e575f80fd5b50610787603a5481565b348015611393575f80fd5b5061070c6113a2366004614eda565b612886565b3480156113b2575f80fd5b5061070c6113c1366004614eda565b612906565b3480156113d1575f80fd5b5061078760115481565b3480156113e6575f80fd5b5060225461073c90600160a01b900460ff1681565b348015611406575f80fd5b5061070c611415366004614f39565b6129f0565b348015611425575f80fd5b5061078760155481565b34801561143a575f80fd5b5060265461087a906001600160a01b031681565b6005546001600160a01b031633146114815760405162461bcd60e51b8152600401611478906151a5565b60405180910390fd5b60185460ff166114ca5760405162461bcd60e51b8152602060048201526014602482015273656e61626c654f666654726164652066616c736560601b6044820152606401611478565b6022805460ff60a01b1916600160a01b17905543601e55565b6005546001600160a01b0316331461150d5760405162461bcd60e51b8152600401611478906151a5565b6001600160a01b03919091165f908152603d60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146115615760405162461bcd60e51b8152600401611478906151a5565b805f036115a15760405162461bcd60e51b815260206004820152600e60248201526d067726561746572207468616e20360941b6044820152606401611478565b602c55565b6060600380546115b5906151da565b80601f01602080910402602001604051908101604052809291908181526020018280546115e1906151da565b801561162c5780601f106116035761010080835404028352916020019161162c565b820191905f5260205f20905b81548152906001019060200180831161160f57829003601f168201915b5050505050905090565b5f611642338484612a1f565b5060015b92915050565b6005546001600160a01b031633146116765760405162461bcd60e51b8152600401611478906151a5565b6018805465ff000000000019169055565b6005546001600160a01b031633146116b15760405162461bcd60e51b8152600401611478906151a5565b601854610100900460ff166117005760405162461bcd60e51b8152602060048201526015602482015274656e61626c654b696c6c426c6f636b2066616c736560581b6044820152606401611478565b601b55565b6005546001600160a01b0316331461172f5760405162461bcd60e51b8152600401611478906151a5565b5f5b82811015611793578160245f86868581811061174f5761174f61520c565b90506020020160208101906117649190614eda565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101611731565b50505050565b6005546001600160a01b031633146117c35760405162461bcd60e51b8152600401611478906151a5565b5f602f55565b601854600160301b90046001600160a01b0316331461181c5760405162461bcd60e51b815260206004820152600f60248201526e6e6f742066756e646164647265737360881b6044820152606401611478565b60648111156118585760405162461bcd60e51b81526020600482015260086024820152670e8dede40d0d2ced60c31b6044820152606401611478565b603155565b6005546001600160a01b031633146118875760405162461bcd60e51b8152600401611478906151a5565b5f5b8181101561196e576007545f906001600160a01b03166370a082318585858181106118b6576118b661520c565b90506020020160208101906118cb9190614eda565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561190d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119319190615220565b11156119665761196683838381811061194c5761194c61520c565b90506020020160208101906119619190614eda565b612b43565b600101611889565b505050565b5f61197f848484612c0f565b6119d084336119cb85604051806060016040528060288152602001615496602891396001600160a01b038a165f9081526001602090815260408083203384529091529020549190613601565b612a1f565b5060019392505050565b6005546001600160a01b03163314611a045760405162461bcd60e51b8152600401611478906151a5565b81815f818110611a1657611a1661520c565b6020029190910135600e819055600f54601054611a3d9350611a3791613639565b90613639565b60115581816001818110611a5357611a5361520c565b60200291909101356013819055601454601554611a749350611a3791613639565b6016555050565b6005546001600160a01b03163314611aa55760405162461bcd60e51b8152600401611478906151a5565b603755565b335f8181526001602090815260408083206001600160a01b038716845290915281205490916116429185906119cb9086613639565b6005546001600160a01b03163314611b095760405162461bcd60e51b8152600401611478906151a5565b604155565b6001600160a01b0381165f908152600d602052604081205460ff1615611b3657506001919050565b505f919050565b919050565b6005546001600160a01b03163314611b6c5760405162461bcd60e51b8152600401611478906151a5565b60185462010000900460ff16611bbd5760405162461bcd60e51b8152602060048201526016602482015275656e61626c655265776172644c6973742066616c736560501b6044820152606401611478565b60c98210611bc9575f80fd5b5f5b828110156117935781600d5f868685818110611be957611be961520c565b9050602002016020810190611bfe9190614eda565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101611bcb565b6005546001600160a01b03163314611c575760405162461bcd60e51b8152600401611478906151a5565b600c55565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b03163314611ca05760405162461bcd60e51b8152600401611478906151a5565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611d135760405162461bcd60e51b8152600401611478906151a5565b6101f4821115611d585760405162461bcd60e51b815260206004820152601060248201526f0e0cae4c6cadce840e8dede40d0d2ced60831b6044820152606401611478565b6103e8831015611da05760405162461bcd60e51b8152602060048201526013602482015272199c995c5d595b98de481d1bdbc81cda1c9bdd606a1b6044820152606401611478565b6033929092556035556032805460ff1916911515919091179055565b60095460405163bc4c4b3760e01b81523360048201525f60248201526001600160a01b039091169063bc4c4b37906044016020604051808303815f875af1158015611e09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e2d9190615237565b50565b6005546001600160a01b03163314611e5a5760405162461bcd60e51b8152600401611478906151a5565b8015611e7657601754601654611e709190615266565b602a5550565b5f602a5550565b5f805f611e8861369e565b91509150815f14158015611e9b57508015155b15611ebd5781611eab8286615279565b611eb59190615290565b949350505050565b505f9392505050565b6005546001600160a01b03163314611ef05760405162461bcd60e51b8152600401611478906151a5565b6022805460ff60a01b19169055565b6005546001600160a01b03163314611f295760405162461bcd60e51b8152600401611478906151a5565b601d55565b6005546001600160a01b03163314611f585760405162461bcd60e51b8152600401611478906151a5565b601880546001600160a01b03909216600160301b026601000000000000600160d01b0319909216919091179055565b6005546001600160a01b03163314611fb15760405162461bcd60e51b8152600401611478906151a5565b602a55565b6060600480546115b5906151da565b6005546001600160a01b03163314611fef5760405162461bcd60e51b8152600401611478906151a5565b602f541561202e5760405162461bcd60e51b815260206004820152600c60248201526b0737461727465644164644c560a41b6044820152606401611478565b43602f55565b6005546001600160a01b0316331461205e5760405162461bcd60e51b8152600401611478906151a5565b602e55565b5f61164233846119cb856040518060600160405280602581526020016154be60259139335f9081526001602090815260408083206001600160a01b038d1684529091529020549190613601565b5f805f6120bb61369e565b91509150815f141580156120ce57508015155b15611ebd5780611eab8386615279565b6005546001600160a01b031633146121085760405162461bcd60e51b8152600401611478906151a5565b6007546001600160a01b03908116908316036121965760405162461bcd60e51b815260206004820152604160248201527f4554484261636b3a205468652050616e4554485377617020706169722063616e60448201527f6e6f742062652072656d6f7665642066726f6d205f73776170506169724c69736064820152601d60fa1b608482015260a401611478565b6121a082826137cb565b5050565b5f611642338484612c0f565b6005546001600160a01b031633146121da5760405162461bcd60e51b8152600401611478906151a5565b60185465010000000000900460ff1661222b5760405162461bcd60e51b81526020600482015260136024820152721d185e0818da185b99d948191a5cd8589b1959606a1b6044820152606401611478565b81815f81811061223d5761223d61520c565b6020029190910135600e55508181600181811061225c5761225c61520c565b6020029190910135600f55508181600281811061227b5761227b61520c565b905060200201356010819055506122a5600e54611a37600f5460105461363990919063ffffffff16565b601155818160038181106122bb576122bb61520c565b602002919091013560125550818160048181106122da576122da61520c565b602002919091013560135550818160058181106122f9576122f961520c565b602002919091013560145550818160068181106123185761231861520c565b90506020020135601581905550612342601354611a3760145460155461363990919063ffffffff16565b601655818160078181106123585761235861520c565b6020029190910135601755505050565b601854600160301b90046001600160a01b031633036121a0576001600160a01b0382166123b957604051339082156108fc029083905f818181858888f1935050505015801561196e573d5f803e3d5ffd5b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015612403573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061196e9190615237565b6005546001600160a01b031633146124515760405162461bcd60e51b8152600401611478906151a5565b82811461248d5760405162461bcd60e51b815260206004820152600a6024820152690c8d2e640d8cadccee8d60b31b6044820152606401611478565b5f5b838110156124fb578282828181106124a9576124a961520c565b9050602002013560305f8787858181106124c5576124c561520c565b90506020020160208101906124da9190614eda565b6001600160a01b0316815260208101919091526040015f205560010161248f565b5050505050565b6005546001600160a01b0316331461252c5760405162461bcd60e51b8152600401611478906151a5565b603f55565b6009546040516001624d3b8760e01b03198152600481018390525f91829182916001600160a01b03169063ffb2c479906024016060604051808303815f875af1158015612580573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125a491906152af565b604080518481526020810184905290810182905260608101889052929550909350915032905f907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146126285760405162461bcd60e51b8152600401611478906151a5565b6028805460ff1916911515919091179055565b6005546001600160a01b031633146126655760405162461bcd60e51b8152600401611478906151a5565b603655565b5f805f8060075f9054906101000a90046001600160a01b031690505f80826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156126c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126e791906152f0565b50601a546001600160701b039283169450911691506001600160a01b0316308110156127185782965081955061271f565b8196508295505b6007546040516370a0823160e01b81526001600160a01b039182166004820152908216906370a0823190602401602060405180830381865afa158015612767573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278b9190615220565b945050505050909192565b6005546001600160a01b031633146127c05760405162461bcd60e51b8152600401611478906151a5565b602b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461280c5760405162461bcd60e51b8152600401611478906151a5565b603855565b6005546001600160a01b0316331461283b5760405162461bcd60e51b8152600401611478906151a5565b60038111156128815760405162461bcd60e51b81526020600482015260126024820152716e657756616c7565206d757374203c3d203360701b6044820152606401611478565b602955565b6005546001600160a01b031633146128b05760405162461bcd60e51b8152600401611478906151a5565b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015f604051808303815f87803b1580156128f4575f80fd5b505af11580156124fb573d5f803e3d5ffd5b6005546001600160a01b031633146129305760405162461bcd60e51b8152600401611478906151a5565b6001600160a01b0381166129955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611478565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314612a1a5760405162461bcd60e51b8152600401611478906151a5565b603955565b6001600160a01b038316612a815760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611478565b6001600160a01b038216612ae25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611478565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b803b8015612b4f575050565b6001600160a01b0382165f908152603c602052604081205490036121a057603b541580612bab5750816001600160a01b0316603b5f81548110612b9457612b9461520c565b5f918252602090912001546001600160a01b031614155b156121a057603b80546001600160a01b0384165f818152603c60205260408120839055600183018455929092527fbbe3212124853f8b0084a66a2d057c2966e251e132af3691db153ab65f0d1a4d0180546001600160a01b03191690911790555050565b6001600160a01b038316612c355760405162461bcd60e51b815260040161147890615331565b6001600160a01b038216612c5b5760405162461bcd60e51b815260040161147890615376565b5f612c6584611b0e565b1115612ca45760405162461bcd60e51b815260206004820152600e60248201526d6973526577617264203e2030202160901b6044820152606401611478565b805f03612cb65761196e8383836138f4565b6001600160a01b03821661dead148015612cd857506001600160a01b0383163b155b15612da1576001600160a01b0383165f908152602d602052604081208054839290612d04908490615266565b9091555050602e546001600160a01b0384165f908152602d602052604090205410612d96576009546001600160a01b038481165f818152602d6020526040908190205490516338c110ef60e21b81526004810192909252602482015291169063e30443bc906044015f604051808303815f87803b158015612d83575f80fd5b505af1925050508015612d94575060015b505b61196e8383836138f4565b6007545f90819081906001600160a01b038681169116148015612dce57506006546001600160a01b031633145b8015612de25750326001600160a01b038716145b15612e1057612df0846139fa565b90505f81118015612e06575063ffffffff863b16155b15612e1057600191505b6007545f906001600160a01b0390811690881603612e3e57612e3185613a61565b90508015612e3e57600193505b5f612e4830611c5c565b600c5490915081108015908190612e695750600854600160a01b900460ff16155b8015612e73575084155b8015612e9657506001600160a01b0388165f9081526025602052604090205460ff165b8015612eba57506001600160a01b0389165f9081526024602052604090205460ff16155b8015612ede57506001600160a01b0388165f9081526024602052604090205460ff16155b8015612eec575060285460ff165b8015612f0657505f601654601154612f049190615266565b115b15612fa1576008805460ff60a01b1916600160a01b1790556007546001600160a01b038981169116148015612f3d575060325460ff165b8015612f585750603354603454612f549190615266565b4210155b8015612f7c57506001600160a01b0389165f9081526024602052604090205460ff16155b15612f8b57612f89613b1e565b505b612f93613c22565b6008805460ff60a01b191690555b6008546001600160a01b038a165f9081526024602052604090205460ff600160a01b909204821615911680612fed57506001600160a01b0389165f9081526024602052604090205460ff165b15612ff557505f5b801561347f5760185460ff161561312b57602254600160a01b900460ff1661312b576001600160a01b038a165f9081526025602052604090205460ff1615801561305757506001600160a01b0389165f9081526025602052604090205460ff16155b156130a557883b63ffffffff16156130a55760405162461bcd60e51b8152602060048201526011602482015270063616e7420616464206f74686572206c7607c1b6044820152606401611478565b6001600160a01b038a165f9081526025602052604090205460ff16806130e257506001600160a01b0389165f9081526025602052604090205460ff165b1561312b57602f545f1080156130f55750855b61312b5760405162461bcd60e51b815260206004820152600760248201526670617573696e6760c81b6044820152606401611478565b6001600160a01b038a165f9081526025602052604090205460ff16156131ac5743601b54601e5461315c9190615266565b118015613171575060185462010000900460ff165b80156131845750601854610100900460ff165b156131ac576001600160a01b0389165f908152600d60205260409020805460ff191660011790555b6029545f90156131d657886131c08c611c5c565b036131d6576029546131d3908a9061440f565b98505b6001600160a01b038b165f9081526025602052604081205460ff161561321e576132176127106132116011548d61445090919063ffffffff16565b906144ce565b915061327b565b6001600160a01b038b165f9081526025602052604090205460ff1615613259576132176127106132116016548d61445090919063ffffffff16565b613274612710613211602a548d61445090919063ffffffff16565b9150600190505b6001600160a01b038c165f9081526025602052604081205460ff16156132ff576132b66127106132116012548e61445090919063ffffffff16565b9050896132fa575f6132c78c611e7d565b6001600160a01b038e165f908152603060205260408120805492935083929091906132f3908490615266565b9091555050505b61333d565b6001600160a01b038c165f9081526025602052604090205460ff161561333d5761333a6127106132116017548e61445090919063ffffffff16565b90505b881561334957505f9150815b891561335557505f9150815b8015613375576133688d61dead836138f4565b6133728b8261440f565b9a505b61337f8b8461440f565b9a5061338c8d30856138f4565b6001600160a01b038c165f9081526025602052604090205460ff1680156133b1575088155b156133f0575f6133c18e8d61450f565b905080156133ee576133d38c8261440f565b602254909c506133ee908f906001600160a01b0316836138f4565b505b6001600160a01b038c165f9081526027602052604090205460ff1615801561341957505f601d54115b1561347b57601d548b61342b8e611c5c565b6134359190615266565b111561347b5760405162461bcd60e51b81526020600482015260156024820152741bdd995c881b585e081dd85b1b195d081b1a5b5a5d605a1b6044820152606401611478565b5050505b61348a8a8a8a6138f4565b600854600160a01b900460ff161580156134dc57506001600160a01b038a165f9081526025602052604090205460ff16806134dc57506001600160a01b0389165f9081526025602052604090205460ff165b156135ae576023546009546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303815f875af192505050801561354d575060408051601f3d908101601f1916820190925261354a918101906152af565b60015b156135a35760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b6135ac81614635565b505b6001600160a01b038a1630148015906135d15750600854600160a01b900460ff16155b156135f5576007546001600160a01b03908116908a16036135f5576135f58a612b43565b50505050505050505050565b5f81848411156136245760405162461bcd60e51b81526004016114789190614f50565b505f61363084866153b9565b95945050505050565b5f806136458385615266565b9050838110156136975760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611478565b9392505050565b5f805f8060075f9054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156136f2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061371691906152f0565b506001600160701b031691506001600160701b0316915060075f9054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561377d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137a191906153cc565b601a546001600160a01b039081169116146137bd5781816137c0565b80825b909590945092505050565b6001600160a01b0382165f9081526025602052604090205481151560ff90911615150361386a5760405162461bcd60e51b815260206004820152604160248201527f4554484261636b3a204175746f6d61746564206d61726b6574206d616b65722060448201527f7061697220697320616c72656164792073657420746f20746861742076616c756064820152606560f81b608482015260a401611478565b6001600160a01b0382165f908152602560205260409020805460ff191682158015919091179091556121a05760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b1580156138da575f80fd5b505af11580156138ec573d5f803e3d5ffd5b505050505050565b6001600160a01b03831661391a5760405162461bcd60e51b815260040161147890615331565b6001600160a01b0382166139405760405162461bcd60e51b815260040161147890615376565b61397c81604051806060016040528060268152602001615470602691396001600160a01b0386165f908152602081905260409020549190613601565b6001600160a01b038085165f9081526020819052604080822093909355908416815220546139aa9082613639565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612b36565b5f805f80613a0661266a565b9250925092505f8084118015613a1b57505f83115b15613a385782613a2b8588615279565b613a359190615290565b90505b613a428185615266565b8210613a5857613a548287868661491f565b5094505b50505050919050565b5f805f613a6c61266a565b9250509150818111613b17576007548490613a8f906001600160a01b0316611c5c565b613a9991906153b9565b60075f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ae9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b0d9190615220565b611eab9086615279565b5050919050565b426034556007545f908190613b3b906001600160a01b0316611c5c565b90505f61271060355483613b4f9190615279565b613b599190615290565b90508015613b7a57600754613b7a906001600160a01b031661dead836138f4565b6007546040805160016209351760e01b0319815290516001600160a01b0390921691829163fff6cae9916004808301925f92919082900301818387803b158015613bc2575f80fd5b505af1158015613bd4573d5f803e3d5ffd5b50506040805186815260208101869052428183015290517f9cb560eb3a76b2c70f0528d86a83cc0464d10dd0ccc94ba95bd11b93eac93da69350908190036060019150a16001935050505090565b6022545f90613c39906001600160a01b0316611c5c565b90505f613c4530611c5c565b90505f613c528383615266565b9050805f03613c6057505050565b5f613c6a82611e7d565b9050603854811015613caf576040518181527f23f698f25a534772d92275fb2a4fb37dbb8d81feaf0c25d93a5b337321e5986f9060200160405180910390a150505050565b602254613cc6906001600160a01b031630866138f4565b613ccf82614bfb565b601a546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa158015613d19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d3d9190615220565b90505f84613d4b8784615279565b613d559190615290565b90508015614129575f601654601154613d6e9190615266565b601354600e54613d7e9190615266565b613d889084615279565b613d929190615290565b90505f6064601654601154613da79190615266565b603954601554601054613dba9190615266565b613dc49087615279565b613dce9190615279565b613dd89190615290565b613de29190615290565b90505f81613df084866153b9565b613dfa91906153b9565b90508215613e955760185460405163a9059cbb60e01b8152600160301b9091046001600160a01b0390811660048301526024820185905287169063a9059cbb906044016020604051808303815f875af1158015613e59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e7d9190615237565b5082603a5f828254613e8f9190615266565b90915550505b81156140a95760095f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613eeb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f0f9190615220565b5f03613f965760185460405163a9059cbb60e01b8152600160301b9091046001600160a01b0390811660048301526024820184905287169063a9059cbb906044016020604051808303815f875af1158015613f6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f909190615237565b506140a9565b60095460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490525f9188169063a9059cbb906044016020604051808303815f875af1158015613fe7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061400b9190615237565b905080156140a7576009546040516351c2a0e360e01b8152600481018590526001600160a01b03909116906351c2a0e3906024015f604051808303815f87803b158015614056575f80fd5b505af1158015614068573d5f803e3d5ffd5b5050604080518c8152602081018790527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15b505b80156141255760215460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529087169063a9059cbb906044016020604051808303815f875af11580156140ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141239190615237565b505b5050505b5f61413482846153b9565b90505f6037546036546141479190615266565b90505f81603654846141599190615279565b6141639190615290565b90505f61417082856153b9565b905081156143865760095f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141ec9190615220565b5f036142735760185460405163a9059cbb60e01b8152600160301b9091046001600160a01b0390811660048301526024820184905288169063a9059cbb906044016020604051808303815f875af1158015614249573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061426d9190615237565b50614386565b60095460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490525f9189169063a9059cbb906044016020604051808303815f875af11580156142c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142e89190615237565b90508015614384576009546040516351c2a0e360e01b8152600481018590526001600160a01b03909116906351c2a0e3906024015f604051808303815f87803b158015614333575f80fd5b505af1158015614345573d5f803e3d5ffd5b5050604080518d8152602081018790527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15b505b80156144025760215460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529088169063a9059cbb906044016020604051808303815f875af11580156143dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144009190615237565b505b5050505050505050505050565b5f61369783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613601565b5f825f0361445f57505f611646565b5f61446a8385615279565b9050826144778583615290565b146136975760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611478565b5f61369783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614e18565b6001600160a01b0382165f90815260306020526040812080546001909101548261453885611e7d565b90505f838310614563576064603154876145529190615279565b61455c9190615290565b90506145ad565b8361456e8385615266565b11156145ad575f61458d856145838587615266565b610f8491906153b9565b905060646031548261459f9190615279565b6145a99190615290565b9150505b6001600160a01b0387165f90815260306020526040812060010180548492906145d7908490615266565b9091555050604080518581526020810185905290810183905260608101879052608081018290527f8e2fd1a0d9bdf9af689bd0d7619e3ca53df91b80231cfbe8f926eb1d45a656719060a00160405180910390a19695505050505050565b436041546040546146469190615266565b111561464f5750565b601a546021546040516370a0823160e01b81526001600160a01b0391821660048201529116905f9082906370a0823190602401602060405180830381865afa15801561469d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146c19190615220565b9050603f548110156146d257505050565b600754604080516318160ddd60e01b815290516001600160a01b03909216915f9183916318160ddd916004808201926020929091908290030181865afa15801561471e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147429190615220565b603b549091505f90819081908180805a90505b8b8310801561476357508382105b1561490d5783603e5410614776575f603e555b603b603e548154811061478b5761478b61520c565b5f918252602090912001546040516370a0823160e01b81526001600160a01b03918216600482018190529850908a16906370a0823190602401602060405180830381865afa1580156147df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148039190615220565b95505f8611801561482c57506001600160a01b0387165f908152603d602052604090205460ff16155b156148cc578761483c878c615279565b6148469190615290565b945084156148cc576021546040516323b872dd60e01b81526001600160a01b039182166004820152888216602482015260448101879052908c16906323b872dd906064016020604051808303815f875af11580156148a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148ca9190615237565b505b5a6148d790826153b9565b6148e19084615266565b92505a603e80549192505f6148f5836153e7565b91905055508180614905906153e7565b925050614755565b50504360405550505050505050505050565b5f805f60075f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614972573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149969190615220565b90505f60065f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156149e9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a0d91906153cc565b6001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015614a48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a6c91906153cc565b60075460408051637464fc3d60e01b815290519293506001600160a01b038085161515935f9390911691637464fc3d9160048083019260209291908290030181865afa158015614abe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ae29190615220565b90508115614b83578015614b83575f614b03614afe898b615279565b614e44565b90505f614b0f83614e44565b905080821115614b80575f614b2482846153b9565b614b2e9088615279565b614b39906008615279565b90505f614b47836008615279565b614b52856011615279565b614b5c9190615266565b9050614b688183615290565b98508815614b7d57614b7a8989615266565b97505b50505b50505b5f614b8e898c6153b9565b9050845f03614bb8576103e8614ba7614afe8c84615279565b614bb191906153b9565b9650614bed565b614bea89614bc68784615279565b614bd09190615290565b89614bdb888e615279565b614be59190615290565b614eb1565b96505b505050505094509492505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110614c2e57614c2e61520c565b6001600160a01b039283166020918202929092010152601a54825191169082906001908110614c5f57614c5f61520c565b6001600160a01b039283166020918202929092010152600654614c859130911684612a1f565b600654602054604051635c11d79560e01b81526001600160a01b0392831692635c11d79592614cc19287925f92889291169042906004016153ff565b5f604051808303815f87803b158015614cd8575f80fd5b505af1925050508015614ce9575060015b614d2257604051600181527f6c37756e80daba6f4df0d5bfa6cddadfe23601acc1a27dc8d4aa427de91467889060200160405180910390a15b601a546020546040516370a0823160e01b81526001600160a01b0391821660048201525f9291909116906370a0823190602401602060405180830381865afa158015614d70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d949190615220565b9050801561196e57601a546020546040516323b872dd60e01b81526001600160a01b039182166004820152306024820152604481018490529116906323b872dd906064016020604051808303815f875af1158015614df4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117939190615237565b5f8183614e385760405162461bcd60e51b81526004016114789190614f50565b505f6136308486615290565b5f6003821115614ea35750805f614e5c600283615290565b614e67906001615266565b90505b81811015614e9d57905080600281614e828186615290565b614e8c9190615266565b614e969190615290565b9050614e6a565b50919050565b8115611b3d57506001919050565b5f818310614ebf5781613697565b5090919050565b6001600160a01b0381168114611e2d575f80fd5b5f60208284031215614eea575f80fd5b813561369781614ec6565b8015158114611e2d575f80fd5b5f8060408385031215614f13575f80fd5b8235614f1e81614ec6565b91506020830135614f2e81614ef5565b809150509250929050565b5f60208284031215614f49575f80fd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8060408385031215614f96575f80fd5b8235614fa181614ec6565b946020939093013593505050565b5f8083601f840112614fbf575f80fd5b50813567ffffffffffffffff811115614fd6575f80fd5b6020830191508360208260051b8501011115614ff0575f80fd5b9250929050565b5f805f60408486031215615009575f80fd5b833567ffffffffffffffff81111561501f575f80fd5b61502b86828701614faf565b909450925050602084013561503f81614ef5565b809150509250925092565b5f806020838503121561505b575f80fd5b823567ffffffffffffffff811115615071575f80fd5b61507d85828601614faf565b90969095509350505050565b5f805f6060848603121561509b575f80fd5b83356150a681614ec6565b925060208401356150b681614ec6565b929592945050506040919091013590565b5f805f606084860312156150d9575f80fd5b8335925060208401359150604084013561503f81614ef5565b5f60208284031215615102575f80fd5b813561369781614ef5565b5f805f8060408587031215615120575f80fd5b843567ffffffffffffffff811115615136575f80fd5b61514287828801614faf565b909550935050602085013567ffffffffffffffff811115615161575f80fd5b61516d87828801614faf565b95989497509550505050565b5f806040838503121561518a575f80fd5b823561519581614ec6565b91506020830135614f2e81614ec6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806151ee57607f821691505b602082108103614e9d57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215615230575f80fd5b5051919050565b5f60208284031215615247575f80fd5b815161369781614ef5565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561164657611646615252565b808202811582820484141761164657611646615252565b5f826152aa57634e487b7160e01b5f52601260045260245ffd5b500490565b5f805f606084860312156152c1575f80fd5b5050815160208301516040909301519094929350919050565b80516001600160701b0381168114611b3d575f80fd5b5f805f60608486031215615302575f80fd5b61530b846152da565b9250615319602085016152da565b9150604084015163ffffffff8116811461503f575f80fd5b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8181038181111561164657611646615252565b5f602082840312156153dc575f80fd5b815161369781614ec6565b5f600182016153f8576153f8615252565b5060010190565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b8181101561544f5783516001600160a01b0316835260209384019390920191600101615428565b50506001600160a01b03959095166060840152505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122033a651641e2a5e6f1a1d2e8a8775d0e876360bdfd1628d6e84e4dd7af970f6d264736f6c634300081a0033

Library Used

IterableMapping : 0xea62679f802fdd9f565984b9eb4f9d21e1d42120Unverified

Deployed Bytecode Sourcemap

16582:37538:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23823:168;;;;;;;;;;;;;:::i;:::-;;18212:45;;;;;;;;;;-1:-1:-1;18212:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;567:14:1;;560:22;542:41;;530:2;515:18;18212:45:0;;;;;;;;17570:29;;;;;;;;;;-1:-1:-1;17570:29:0;;;;;;;;;;;17283:32;;;;;;;;;;;;;;;;;;;740:25:1;;;728:2;713:18;17283:32:0;594:177:1;53994:119:0;;;;;;;;;;-1:-1:-1;53994:119:0;;;;;:::i;:::-;;:::i;29455:163::-;;;;;;;;;;-1:-1:-1;29455:163:0;;;;;:::i;:::-;;:::i;8994:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9973:192::-;;;;;;;;;;-1:-1:-1;9973:192:0;;;;;:::i;:::-;;:::i;42264:38::-;;;;;;;;;;;;;;;;23728:87;;;;;;;;;;;;;:::i;24083:163::-;;;;;;;;;;-1:-1:-1;24083:163:0;;;;;:::i;:::-;;:::i;18021:47::-;;;;;;;;;;-1:-1:-1;18021:47:0;;;;-1:-1:-1;;;;;18021:47:0;;;;;;-1:-1:-1;;;;;2504:32:1;;;2486:51;;2474:2;2459:18;18021:47:0;2312:231:1;42755:41:0;;;;;;;;;;;;;;;;24254:223;;;;;;;;;;-1:-1:-1;24254:223:0;;;;;:::i;:::-;;:::i;9316:108::-;;;;;;;;;;-1:-1:-1;9404:12:0;;9316:108;;31120:72;;;;;;;;;;;;;:::i;41170:36::-;;;;;;;;;;;;;;;;39282:215;;;;;;;;;;-1:-1:-1;39282:215:0;;;;;:::i;:::-;;:::i;51772:266::-;;;;;;;;;;-1:-1:-1;51772:266:0;;;;;:::i;:::-;;:::i;16657:37::-;;;;;;;;;;-1:-1:-1;16657:37:0;;;;-1:-1:-1;;;;;16657:37:0;;;10173:450;;;;;;;;;;-1:-1:-1;10173:450:0;;;;;:::i;:::-;;:::i;17209:26::-;;;;;;;;;;;;;;;;41082:45;;;;;;;;;;;;;;;;17800:21;;;;;;;;;;;;;;;;41043:32;;;;;;;;;;-1:-1:-1;41043:32:0;;;;;;;;25643:621;;;;;;;;;;-1:-1:-1;25643:621:0;;;;;:::i;:::-;;:::i;42483:107::-;;;;;;;;;;-1:-1:-1;42483:107:0;;;;;:::i;:::-;;:::i;9214:94::-;;;;;;;;;;-1:-1:-1;9214:94:0;;9299:1;5265:36:1;;5253:2;5238:18;9214:94:0;5123:184:1;10631:289:0;;;;;;;;;;-1:-1:-1;10631:289:0;;;;;:::i;:::-;;:::i;52231:122::-;;;;;;;;;;-1:-1:-1;52231:122:0;;;;;:::i;:::-;;:::i;18266:45::-;;;;;;;;;;-1:-1:-1;18266:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;18785:46;;;;;;;;;;-1:-1:-1;18785:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42433:36;;;;;;;;;;;;;;;;16701:24;;;;;;;;;;-1:-1:-1;16701:24:0;;;;-1:-1:-1;;;;;16701:24:0;;;29826:50;;;;;;;;;;-1:-1:-1;29826:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;30941:27;;;;;;;;;;;;;;;;17362:29;;;;;;;;;;;;;;;;28352:40;;;;;;;;;;-1:-1:-1;28352:40:0;;;;;;;;18079:46;;;;;;;;;;-1:-1:-1;18079:46:0;;;;-1:-1:-1;;;;;18079:46:0;;;28159:185;;;;;;;;;;-1:-1:-1;28159:185:0;;;;;:::i;:::-;;:::i;17938:26::-;;;;;;;;;;;;;;;;17901:30;;;;;;;;;;;;;;;;16737:24;;;;;;;;;;-1:-1:-1;16737:24:0;;;;-1:-1:-1;;;;;16737:24:0;;;17467:27;;;;;;;;;;-1:-1:-1;17467:27:0;;;;;;;;;;;17244:32;;;;;;;;;;;;;;;;26725:331;;;;;;;;;;-1:-1:-1;26725:331:0;;;;;:::i;:::-;;:::i;52181:41::-;;;;;;;;;;;;;;;;23146:102;;;;;;;;;;-1:-1:-1;23146:102:0;;;;;:::i;:::-;;:::i;17398:27::-;;;;;;;;;;;;;;;;9432:143;;;;;;;;;;-1:-1:-1;9432:143:0;;;;;:::i;:::-;;:::i;6928:148::-;;;;;;;;;;;;;:::i;41228:398::-;;;;;;;;;;-1:-1:-1;41228:398:0;;;;;:::i;:::-;;:::i;28032:119::-;;;;;;;;;;;;;:::i;17059:31::-;;;;;;;;;;;;;;;;28568:248;;;;;;;;;;-1:-1:-1;28568:248:0;;;;;:::i;:::-;;:::i;38605:309::-;;;;;;;;;;-1:-1:-1;38605:309:0;;;;;:::i;:::-;;:::i;23999:76::-;;;;;;;;;;;;;:::i;30069:107::-;;;;;;;;;;-1:-1:-1;30069:107:0;;;;;:::i;:::-;;:::i;16944:18::-;;;;;;;;;;-1:-1:-1;16944:18:0;;;;-1:-1:-1;;;;;16944:18:0;;;29883:25;;;;;;;;;;;;;;;;16865:70;;;;;;;;;;-1:-1:-1;16865:70:0;;;;-1:-1:-1;;;;;16865:70:0;;;24485:106;;;;;;;;;;-1:-1:-1;24485:106:0;;;;;:::i;:::-;;:::i;16971:27::-;;;;;;;;;;;;;;;;17973:41;;;;;;;;;;-1:-1:-1;17973:41:0;;;;-1:-1:-1;;;;;17973:41:0;;;17830:27;;;;;;;;;;;;;;;;6286:79;;;;;;;;;;-1:-1:-1;6351:6:0;;-1:-1:-1;;;;;6351:6:0;6286:79;;29226:37;;;;;;;;;;-1:-1:-1;29226:37:0;;;;-1:-1:-1;;;;;29226:37:0;;;29060:158;;;;;;;;;;-1:-1:-1;29060:158:0;;;;;:::i;:::-;;:::i;29400:38::-;;;;;;;;;;;;;;;;9102:104;;;;;;;;;;;;;:::i;42598:37::-;;;;;;;;;;;;;;;;30975:137;;;;;;;;;;;;;:::i;29915:115::-;;;;;;;;;;-1:-1:-1;29915:115:0;;;;;:::i;:::-;;:::i;18163:40::-;;;;;;;;;;;;;;;;17536:27;;;;;;;;;;-1:-1:-1;17536:27:0;;;;;;;;;;;10928:389;;;;;;;;;;-1:-1:-1;10928:389:0;;;;;:::i;:::-;;:::i;41134:29::-;;;;;;;;;;;;;;;;38922:307;;;;;;;;;;-1:-1:-1;38922:307:0;;;;;:::i;:::-;;:::i;26444:273::-;;;;;;;;;;-1:-1:-1;26444:273:0;;;;;:::i;:::-;;:::i;9583:198::-;;;;;;;;;;-1:-1:-1;9583:198:0;;;;;:::i;:::-;;:::i;39237:38::-;;;;;;;;;;;;;;;;17864:30;;;;;;;;;;;;;;;;29025:26;;;;;;;;;;;;;;;;17501:28;;;;;;;;;;-1:-1:-1;17501:28:0;;;;;;;;;;;24724:911;;;;;;;;;;-1:-1:-1;24724:911:0;;;;;:::i;:::-;;:::i;16803:53::-;;;;;;;;;;-1:-1:-1;16803:53:0;;;;-1:-1:-1;;;;;16803:53:0;;;23293:309;;;;;;;;;;-1:-1:-1;23293:309:0;;;;;:::i;:::-;;:::i;38235:49::-;;;;;;;;;;-1:-1:-1;38235:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;7158:25:1;;;7214:2;7199:18;;7192:34;;;;7131:18;38235:49:0;6984:248:1;17135:32:0;;;;;;;;;;;;;;;;17007:43;;;;;;;;;;-1:-1:-1;17007:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39505:348;;;;;;;;;;-1:-1:-1;39505:348:0;;;;;:::i;:::-;;:::i;53868:118::-;;;;;;;;;;-1:-1:-1;53868:118:0;;;;;:::i;:::-;;:::i;27598:426::-;;;;;;;;;;-1:-1:-1;27598:426:0;;;;;:::i;:::-;;:::i;28401:113::-;;;;;;;;;;-1:-1:-1;28401:113:0;;;;;:::i;:::-;;:::i;42314:111::-;;;;;;;;;;-1:-1:-1;42314:111:0;;;;;:::i;:::-;;:::i;17434:26::-;;;;;;;;;;-1:-1:-1;17434:26:0;;;;;;;;51265:499;;;;;;;;;;;;;:::i;:::-;;;;8212:25:1;;;8268:2;8253:18;;8246:34;;;;8296:18;;;8289:34;8200:2;8185:18;51265:499:0;8010:319:1;17606:27:0;;;;;;;;;;-1:-1:-1;17606:27:0;;;;;;;;;;;17728:33;;;;;;;;;;-1:-1:-1;17728:33:0;;;;-1:-1:-1;;;;;17728:33:0;;;29272:120;;;;;;;;;;-1:-1:-1;29272:120:0;;;;;:::i;:::-;;:::i;28522:37::-;;;;;;;;;;-1:-1:-1;28522:37:0;;;;;;;;;;;9789:176;;;;;;;;;;-1:-1:-1;9789:176:0;;;;;:::i;:::-;-1:-1:-1;;;;;9930:18:0;;;9903:7;9930:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9789:176;28824:27;;;;;;;;;;;;;;;;42642:105;;;;;;;;;;-1:-1:-1;42642:105:0;;;;;:::i;:::-;;:::i;17768:23::-;;;;;;;;;;-1:-1:-1;17768:23:0;;;;-1:-1:-1;;;;;17768:23:0;;;28860:157;;;;;;;;;;-1:-1:-1;28860:157:0;;;;;:::i;:::-;;:::i;17642:34::-;;;;;;;;;;-1:-1:-1;17642:34:0;;;;-1:-1:-1;;;17642:34:0;;-1:-1:-1;;;;;17642:34:0;;;52081:51;;;;;;;;;;;;;;;;17097:31;;;;;;;;;;;;;;;;42973:37;;;;;;;;;;;;;;;;27444:146;;;;;;;;;;-1:-1:-1;27444:146:0;;;;;:::i;:::-;;:::i;7231:281::-;;;;;;;;;;-1:-1:-1;7231:281:0;;;;;:::i;:::-;;:::i;17174:28::-;;;;;;;;;;;;;;;;18134:20;;;;;;;;;;-1:-1:-1;18134:20:0;;;;-1:-1:-1;;;18134:20:0;;;;;;42803:119;;;;;;;;;;-1:-1:-1;42803:119:0;;;;;:::i;:::-;;:::i;17322:33::-;;;;;;;;;;;;;;;;18750:26;;;;;;;;;;-1:-1:-1;18750:26:0;;;;-1:-1:-1;;;;;18750:26:0;;;23823:168;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;;;;;;;;;23877:14:::1;::::0;::::1;;23869:47;;;::::0;-1:-1:-1;;;23869:47:0;;9514:2:1;23869:47:0::1;::::0;::::1;9496:21:1::0;9553:2;9533:18;;;9526:30;-1:-1:-1;;;9572:18:1;;;9565:50;9632:18;;23869:47:0::1;9312:344:1::0;23869:47:0::1;23927:8;:15:::0;;-1:-1:-1;;;;23927:15:0::1;-1:-1:-1::0;;;23927:15:0::1;::::0;;23971:12:::1;23953:15;:30:::0;23823:168::o;53994:119::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54077:19:0;;;::::1;;::::0;;;:13:::1;:19;::::0;;;;:28;;-1:-1:-1;;54077:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53994:119::o;29455:163::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;29539:8:::1;29551:1;29539:13:::0;29531:40:::1;;;::::0;-1:-1:-1;;;29531:40:0;;9863:2:1;29531:40:0::1;::::0;::::1;9845:21:1::0;9902:2;9882:18;;;9875:30;-1:-1:-1;;;9921:18:1;;;9914:44;9975:18;;29531:40:0::1;9661:338:1::0;29531:40:0::1;29582:17;:28:::0;29455:163::o;8994:100::-;9048:13;9081:5;9074:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8994:100;:::o;9973:192::-;10081:4;10098:37;10107:10;10119:7;10128:6;10098:8;:37::i;:::-;-1:-1:-1;10153:4:0;9973:192;;;;;:::o;23728:87::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;23784:15:::1;:23:::0;;-1:-1:-1;;23784:23:0::1;::::0;;23728:87::o;24083:163::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;24166:15:::1;::::0;::::1;::::0;::::1;;;24158:49;;;::::0;-1:-1:-1;;;24158:49:0;;10591:2:1;24158:49:0::1;::::0;::::1;10573:21:1::0;10630:2;10610:18;;;10603:30;-1:-1:-1;;;10649:18:1;;;10642:51;10710:18;;24158:49:0::1;10389:345:1::0;24158:49:0::1;24218:2;:20:::0;24083:163::o;24254:223::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;24375:9:::1;24370:100;24390:15:::0;;::::1;24370:100;;;24452:6;24427:13;:22;24441:4;;24446:1;24441:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24427:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;24427:22:0;:31;;-1:-1:-1;;24427:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;24407:3:0::1;24370:100;;;;24254:223:::0;;;:::o;31120:72::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;31183:1:::1;31168:12;:16:::0;31120:72::o;39282:215::-;39371:11;;-1:-1:-1;;;39371:11:0;;-1:-1:-1;;;;;39371:11:0;39357:10;:25;39349:53;;;;-1:-1:-1;;;39349:53:0;;11073:2:1;39349:53:0;;;11055:21:1;11112:2;11092:18;;;11085:30;-1:-1:-1;;;11131:18:1;;;11124:45;11186:18;;39349:53:0;10871:339:1;39349:53:0;39433:3;39421:8;:15;;39413:36;;;;-1:-1:-1;;;39413:36:0;;11417:2:1;39413:36:0;;;11399:21:1;11456:1;11436:18;;;11429:29;-1:-1:-1;;;11474:18:1;;;11467:38;11522:18;;39413:36:0;11215:331:1;39413:36:0;39460:18;:29;39282:215::o;51772:266::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;51858:9:::1;51853:178;51869:19:::0;;::::1;51853:178;;;51924:9;::::0;51960:1:::1;::::0;-1:-1:-1;;;;;51924:9:0::1;51914:30;51945:8:::0;;51954:1;51945:11;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;51914:43;::::0;-1:-1:-1;;;;;;51914:43:0::1;::::0;;;;;;-1:-1:-1;;;;;2504:32:1;;;51914:43:0::1;::::0;::::1;2486:51:1::0;2459:18;;51914:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;51910:110;;;51982:22;51992:8;;52001:1;51992:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;51982:9;:22::i;:::-;51890:3;;51853:178;;;;51772:266:::0;;:::o;10173:450::-;10313:4;10330:36;10340:6;10348:9;10359:6;10330:9;:36::i;:::-;10377:216;10400:6;10421:10;10446:136;10500:6;10446:136;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10446:19:0;;;;;;:11;:19;;;;;;;;10466:10;10446:31;;;;;;;;;:136;:35;:136::i;:::-;10377:8;:216::i;:::-;-1:-1:-1;10611:4:0;10173:450;;;;;:::o;25643:621::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;25739:7:::1;;25747:1;25739:10;;;;;;;:::i;:::-;;;::::0;;;::::1;;25720:16;:29:::0;;;25798:16:::1;::::0;25776:17:::1;::::0;:85:::1;::::0;-1:-1:-1;25776:39:0::1;::::0;:21:::1;:39::i;:::-;:43:::0;::::1;:85::i;:::-;25760:13;:101:::0;25894:7;;25902:1:::1;25894:10:::0;;::::1;;;;;:::i;:::-;;;::::0;;;::::1;;25874:17;:30:::0;;;25955:17:::1;::::0;25932:18:::1;::::0;:88:::1;::::0;-1:-1:-1;25932:41:0::1;::::0;:22:::1;:41::i;:88::-;25915:14;:105:::0;-1:-1:-1;;25643:621:0:o;42483:107::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;42556:15:::1;:26:::0;42483:107::o;10631:289::-;10784:10;10744:4;10831:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;10831:32:0;;;;;;;;;;10744:4;;10761:129;;10809:7;;10831:48;;10868:10;10831:36;:48::i;52231:122::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;52312:22:::1;:33:::0;52231:122::o;28159:185::-;-1:-1:-1;;;;;28239:20:0;;28215:7;28239:20;;;:11;:20;;;;;;;;28235:102;;;-1:-1:-1;28283:1:0;;28159:185;-1:-1:-1;28159:185:0:o;28235:102::-;-1:-1:-1;28324:1:0;;28159:185;-1:-1:-1;28159:185:0:o;28235:102::-;28159:185;;;:::o;26725:331::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;26850:16:::1;::::0;;;::::1;;;26842:51;;;::::0;-1:-1:-1;;;26842:51:0;;11988:2:1;26842:51:0::1;::::0;::::1;11970:21:1::0;12027:2;12007:18;;;12000:30;-1:-1:-1;;;12046:18:1;;;12039:52;12108:18;;26842:51:0::1;11786:346:1::0;26842:51:0::1;26931:3;26912:22:::0;::::1;26904:31;;;::::0;::::1;;26951:9;26946:103;26962:20:::0;;::::1;26946:103;;;27032:5;27004:11;:25;27016:9;;27026:1;27016:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27004:25:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;27004:25:0;:33;;-1:-1:-1;;27004:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;26984:3:0::1;26946:103;;23146:102:::0;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;23217:12:::1;:23:::0;23146:102::o;9432:143::-;-1:-1:-1;;;;;9549:18:0;9522:7;9549:18;;;;;;;;;;;;9432:143::o;6928:148::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;7019:6:::1;::::0;6998:40:::1;::::0;7035:1:::1;::::0;-1:-1:-1;;;;;7019:6:0::1;::::0;6998:40:::1;::::0;7035:1;;6998:40:::1;7049:6;:19:::0;;-1:-1:-1;;;;;;7049:19:0::1;::::0;;6928:148::o;41228:398::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;41405:3:::1;41393:8;:15;;41385:43;;;::::0;-1:-1:-1;;;41385:43:0;;12339:2:1;41385:43:0::1;::::0;::::1;12321:21:1::0;12378:2;12358:18;;;12351:30;-1:-1:-1;;;12397:18:1;;;12390:46;12453:18;;41385:43:0::1;12137:340:1::0;41385:43:0::1;41470:4;41447:19;:27;;41439:58;;;::::0;-1:-1:-1;;;41439:58:0;;12684:2:1;41439:58:0::1;::::0;::::1;12666:21:1::0;12723:2;12703:18;;;12696:30;-1:-1:-1;;;12742:18:1;;;12735:49;12801:18;;41439:58:0::1;12482:343:1::0;41439:58:0::1;41508:15;:37:::0;;;;41556:16:::1;:27:::0;41594:13:::1;:24:::0;;-1:-1:-1;;41594:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41228:398::o;28032:119::-;28077:23;;:66;;-1:-1:-1;;;28077:66:0;;28124:10;28077:66;;;13014:51:1;28077:23:0;13081:18:1;;;13074:50;-1:-1:-1;;;;;28077:23:0;;;;:38;;12987:18:1;;28077:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28032:119::o;28568:248::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;28683:6:::1;28679:130;;;28737:12;;28720:14;;:29;;;;:::i;:::-;28706:11;:43:::0;28077:66;28032:119::o;28679:130::-:1;28796:1;28782:11;:15:::0;28568:248;:::o;38605:309::-;38673:7;38694:21;38717:20;38741:13;:11;:13::i;:::-;38693:61;;;;38769:13;38786:1;38769:18;;:39;;;;-1:-1:-1;38791:17:0;;;38769:39;38765:121;;;38861:13;38832:26;38846:12;38832:11;:26;:::i;:::-;:42;;;;:::i;:::-;38825:49;38605:309;-1:-1:-1;;;;38605:309:0:o;38765:121::-;-1:-1:-1;38905:1:0;;38605:309;-1:-1:-1;;;38605:309:0:o;23999:76::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;24051:8:::1;:16:::0;;-1:-1:-1;;;;24051:16:0::1;::::0;;23999:76::o;30069:107::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;30143:15:::1;:25:::0;30069:107::o;24485:106::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;24563:11:::1;:20:::0;;-1:-1:-1;;;;;24563:20:0;;::::1;-1:-1:-1::0;;;24563:20:0::1;-1:-1:-1::0;;;;;;24563:20:0;;::::1;::::0;;;::::1;::::0;;24485:106::o;29060:158::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;29188:11:::1;:22:::0;29060:158::o;9102:104::-;9158:13;9191:7;9184:14;;;;;:::i;30975:137::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;31037:12:::1;::::0;31032:17;31024:42:::1;;;::::0;-1:-1:-1;;;31024:42:0;;14244:2:1;31024:42:0::1;::::0;::::1;14226:21:1::0;14283:2;14263:18;;;14256:30;-1:-1:-1;;;14302:18:1;;;14295:42;14354:18;;31024:42:0::1;14042:336:1::0;31024:42:0::1;31092:12;31077;:27:::0;30975:137::o;29915:115::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;29992:13:::1;:30:::0;29915:115::o;10928:389::-;11046:4;11063:224;11086:10;11111:7;11133:143;11188:15;11133:143;;;;;;;;;;;;;;;;;11145:10;11133:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;11133:32:0;;;;;;;;;;;:143;:36;:143::i;38922:307::-;38989:7;39010:21;39033:20;39057:13;:11;:13::i;:::-;39009:61;;;;39085:13;39102:1;39085:18;;:39;;;;-1:-1:-1;39107:17:0;;;39085:39;39081:120;;;39177:12;39148:26;39161:13;39148:10;:26;:::i;26444:273::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;26554:9:::1;::::0;-1:-1:-1;;;;;26554:9:0;;::::1;26546:17:::0;;::::1;::::0;26524:132:::1;;;::::0;-1:-1:-1;;;26524:132:0;;14585:2:1;26524:132:0::1;::::0;::::1;14567:21:1::0;14624:2;14604:18;;;14597:30;14663:34;14643:18;;;14636:62;14734:34;14714:18;;;14707:62;-1:-1:-1;;;14785:19:1;;;14778:32;14827:19;;26524:132:0::1;14383:469:1::0;26524:132:0::1;26667:42;26696:4;26702:6;26667:28;:42::i;:::-;26444:273:::0;;:::o;9583:198::-;9694:4;9711:40;9721:10;9733:9;9744:6;9711:9;:40::i;24724:911::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;24806:15:::1;::::0;;;::::1;;;24798:47;;;::::0;-1:-1:-1;;;24798:47:0;;15059:2:1;24798:47:0::1;::::0;::::1;15041:21:1::0;15098:2;15078:18;;;15071:30;-1:-1:-1;;;15117:18:1;;;15110:49;15176:18;;24798:47:0::1;14857:343:1::0;24798:47:0::1;24875:7;;24883:1;24875:10;;;;;;;:::i;:::-;;;::::0;;;::::1;;24856:16;:29:::0;-1:-1:-1;24915:7:0;;24923:1:::1;24915:10:::0;;::::1;;;;;:::i;:::-;;;::::0;;;::::1;;24896:16;:29:::0;-1:-1:-1;24956:7:0;;24964:1:::1;24956:10:::0;;::::1;;;;;:::i;:::-;;;;;;;24936:17;:30;;;;24993:85;25051:16;;24993:39;25015:16;;24993:17;;:21;;:39;;;;:::i;:85::-;24977:13;:101:::0;25103:7;;25111:1:::1;25103:10:::0;;::::1;;;;;:::i;:::-;;;::::0;;;::::1;;25089:11;:24:::0;-1:-1:-1;25146:7:0;;25154:1:::1;25146:10:::0;;::::1;;;;;:::i;:::-;;;::::0;;;::::1;;25126:17;:30:::0;-1:-1:-1;25187:7:0;;25195:1:::1;25187:10:::0;;::::1;;;;;:::i;:::-;;;::::0;;;::::1;;25167:17;:30:::0;-1:-1:-1;25229:7:0;;25237:1:::1;25229:10:::0;;::::1;;;;;:::i;:::-;;;;;;;25208:18;:31;;;;25267:88;25327:17;;25267:41;25290:17;;25267:18;;:22;;:41;;;;:::i;:88::-;25250:14;:105:::0;25381:7;;25389:1:::1;25381:10:::0;;::::1;;;;;:::i;:::-;;;::::0;;;::::1;;25366:12;:25:::0;-1:-1:-1;;;24724:911:0:o;23293:309::-;23381:11;;-1:-1:-1;;;23381:11:0;;-1:-1:-1;;;;;23381:11:0;23367:10;:25;23363:232;;-1:-1:-1;;;;;23412:19:0;;23408:176;;23451:36;;23459:10;;23451:36;;;;;23480:6;;23451:36;;;;23480:6;23459:10;23451:36;;;;;;;;;;;;;;;;;;;23408:176;23526:42;;-1:-1:-1;;;23526:42:0;;23549:10;23526:42;;;15379:51:1;15446:18;;;15439:34;;;-1:-1:-1;;;;;23526:22:0;;;;;15352:18:1;;23526:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39505:348::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;39656:34;;::::1;39648:57;;;::::0;-1:-1:-1;;;39648:57:0;;15686:2:1;39648:57:0::1;::::0;::::1;15668:21:1::0;15725:2;15705:18;;;15698:30;-1:-1:-1;;;15744:18:1;;;15737:40;15794:18;;39648:57:0::1;15484:334:1::0;39648:57:0::1;39721:9;39716:128;39732:20:::0;;::::1;39716:128;;;39822:7;;39830:1;39822:10;;;;;;;:::i;:::-;;;;;;;39774:14;:28;39789:9;;39799:1;39789:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39774:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;39774:28:0;:58;39754:3:::1;;39716:128;;;;39505:348:::0;;;;:::o;53868:118::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;53948:21:::1;:30:::0;53868:118::o;27598:426::-;27788:23;;:36;;-1:-1:-1;;;;;;27788:36:0;;;;;740:25:1;;;27686:18:0;;;;;;-1:-1:-1;;;;;27788:23:0;;:31;;713:18:1;;27788:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27840:176;;;16515:25:1;;;16571:2;16556:18;;16549:34;;;16599:18;;;16592:34;;;16657:2;16642:18;;16635:34;;;27671:153:0;;-1:-1:-1;27671:153:0;;-1:-1:-1;27671:153:0;-1:-1:-1;27996:9:0;;27958:5;;27840:176;;16502:3:1;16487:19;27840:176:0;;;;;;;27660:364;;;27598:426;:::o;28401:113::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;28476:21:::1;:30:::0;;-1:-1:-1;;28476:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28401:113::o;42314:111::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;42389:17:::1;:28:::0;42314:111::o;51265:499::-;51310:14;51326:13;51341:20;51374:18;51405:9;;;;;;;;;-1:-1:-1;;;;;51405:9:0;51374:41;;51427:7;51436:10;51451:8;-1:-1:-1;;;;;51451:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51507:8:0;;-1:-1:-1;;;;;51426:47:0;;;;-1:-1:-1;51426:47:0;;;-1:-1:-1;;;;;;51507:8:0;51551:4;51530:26;;51526:164;;;51582:2;51573:11;;51607:2;51599:10;;51526:164;;;51651:2;51642:11;;51676:2;51668:10;;51526:164;51746:9;;51717:39;;-1:-1:-1;;;51717:39:0;;-1:-1:-1;;;;;51746:9:0;;;51717:39;;;2486:51:1;51717:28:0;;;;;;2459:18:1;;51717:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51702:54;;51363:401;;;;51265:499;;;:::o;29272:120::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;29352:22:::1;:32:::0;;-1:-1:-1;;;;;;29352:32:0::1;-1:-1:-1::0;;;;;29352:32:0;;;::::1;::::0;;;::::1;::::0;;29272:120::o;42642:105::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;42714:14:::1;:25:::0;42642:105::o;28860:157::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;28951:1:::1;28939:8;:13;;28931:44;;;::::0;-1:-1:-1;;;28931:44:0;;17530:2:1;28931:44:0::1;::::0;::::1;17512:21:1::0;17569:2;17549:18;;;17542:30;-1:-1:-1;;;17588:18:1;;;17581:48;17646:18;;28931:44:0::1;17328:342:1::0;28931:44:0::1;28986:12;:23:::0;28860:157::o;27444:146::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;27529:23:::1;::::0;:53:::1;::::0;-1:-1:-1;;;27529:53:0;;-1:-1:-1;;;;;2504:32:1;;;27529:53:0::1;::::0;::::1;2486:51:1::0;27529:23:0;;::::1;::::0;:44:::1;::::0;2459:18:1;;27529:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;7231:281:::0;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7334:22:0;::::1;7312:110;;;::::0;-1:-1:-1;;;7312:110:0;;17877:2:1;7312:110:0::1;::::0;::::1;17859:21:1::0;17916:2;17896:18;;;17889:30;17955:34;17935:18;;;17928:62;-1:-1:-1;;;18006:18:1;;;17999:36;18052:19;;7312:110:0::1;17675:402:1::0;7312:110:0::1;7459:6;::::0;7438:38:::1;::::0;-1:-1:-1;;;;;7438:38:0;;::::1;::::0;7459:6:::1;::::0;7438:38:::1;::::0;7459:6:::1;::::0;7438:38:::1;7487:6;:17:::0;;-1:-1:-1;;;;;;7487:17:0::1;-1:-1:-1::0;;;;;7487:17:0;;;::::1;::::0;;;::::1;::::0;;7231:281::o;42803:119::-;6498:6;;-1:-1:-1;;;;;6498:6:0;5504:10;6498:22;6490:67;;;;-1:-1:-1;;;6490:67:0;;;;;;;:::i;:::-;42882:21:::1;:32:::0;42803:119::o;12792:380::-;-1:-1:-1;;;;;12928:19:0;;12920:68;;;;-1:-1:-1;;;12920:68:0;;18284:2:1;12920:68:0;;;18266:21:1;18323:2;18303:18;;;18296:30;18362:34;18342:18;;;18335:62;-1:-1:-1;;;18413:18:1;;;18406:34;18457:19;;12920:68:0;18082:400:1;12920:68:0;-1:-1:-1;;;;;13007:21:0;;12999:68;;;;-1:-1:-1;;;12999:68:0;;18689:2:1;12999:68:0;;;18671:21:1;18728:2;18708:18;;;18701:30;18767:34;18747:18;;;18740:62;-1:-1:-1;;;18818:18:1;;;18811:32;18860:19;;12999:68:0;18487:398:1;12999:68:0;-1:-1:-1;;;;;13080:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;13132:32;;740:25:1;;;13132:32:0;;713:18:1;13132:32:0;;;;;;;;12792:380;;;:::o;48693:410::-;48799:16;;48840:8;;48836:47;;48865:7;48693:410;:::o;48836:47::-;-1:-1:-1;;;;;48902:16:0;;;;;;:11;:16;;;;;;48897:21;;48893:203;;48944:7;:14;48939:19;;:40;;;48976:3;-1:-1:-1;;;;;48962:17:0;:7;48970:1;48962:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;48962:10:0;:17;;48939:40;48935:150;;;49019:7;:14;;-1:-1:-1;;;;;49000:16:0;;;;;;:11;:16;;;;;:33;;;49052:17;;;;;;;;;;;;;-1:-1:-1;;;;;;49052:17:0;;;;;;48733:370;48693:410;:::o;31202:6929::-;-1:-1:-1;;;;;31334:18:0;;31326:68;;;;-1:-1:-1;;;31326:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31413:16:0;;31405:64;;;;-1:-1:-1;;;31405:64:0;;;;;;;:::i;:::-;31506:1;31488:14;31497:4;31488:8;:14::i;:::-;:19;;31480:46;;;;-1:-1:-1;;;31480:46:0;;19902:2:1;31480:46:0;;;19884:21:1;19941:2;19921:18;;;19914:30;-1:-1:-1;;;19960:18:1;;;19953:44;20014:18;;31480:46:0;19700:338:1;31480:46:0;31543:6;31553:1;31543:11;31539:98;;31571:33;31587:4;31593:2;31597:6;31571:15;:33::i;31539:98::-;-1:-1:-1;;;;;31653:21:0;;31667:6;31653:21;:46;;;;-1:-1:-1;;;;;;31678:16:0;;;:21;31653:46;31649:379;;;-1:-1:-1;;;;;31716:23:0;;;;;;:17;:23;;;;;:33;;31743:6;;31716:23;:33;;31743:6;;31716:33;:::i;:::-;;;;-1:-1:-1;;31795:13:0;;-1:-1:-1;;;;;31768:23:0;;;;;;:17;:23;;;;;;:40;31764:170;;31833:23;;-1:-1:-1;;;;;31883:23:0;;;31833;31883;;;:17;:23;;;;;;;;31833:74;;-1:-1:-1;;;31833:74:0;;;;;15379:51:1;;;;15446:18;;;15439:34;31833:23:0;;;:34;;15352:18:1;;31833:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31829:90;;31962:33;31978:4;31984:2;31988:6;31962:15;:33::i;31649:379::-;32192:9;;32042:13;;;;;;-1:-1:-1;;;;;32186:15:0;;;32192:9;;32186:15;:66;;;;-1:-1:-1;32240:11:0;;-1:-1:-1;;;;;32240:11:0;32218:10;:34;32186:66;:101;;;;-1:-1:-1;32270:9:0;-1:-1:-1;;;;;32270:17:0;;;32186:101;32122:350;;;32331:23;32347:6;32331:15;:23::i;:::-;32314:40;;32390:1;32373:14;:18;:39;;;;-1:-1:-1;29801:8:0;29754:18;;29801:8;;32373:39;32369:92;;;32441:4;32433:12;;32369:92;32545:9;;32484:25;;-1:-1:-1;;;;;32545:9:0;;;32537:17;;;;32520:210;;32601:26;32620:6;32601:18;:26::i;:::-;32581:46;-1:-1:-1;32646:21:0;;32642:77;;32699:4;32688:15;;32642:77;32742:28;32773:24;32791:4;32773:9;:24::i;:::-;32849:12;;32742:55;;-1:-1:-1;32825:36:0;;;;;;;32892:33;;-1:-1:-1;32917:8:0;;-1:-1:-1;;;32917:8:0;;;;32916:9;32892:33;:56;;;;;32943:5;32942:6;32892:56;:130;;;;-1:-1:-1;;;;;;33005:17:0;;;;;;:13;:17;;;;;;;;32892:130;:167;;;;-1:-1:-1;;;;;;33040:19:0;;;;;;:13;:19;;;;;;;;33039:20;32892:167;:202;;;;-1:-1:-1;;;;;;33077:17:0;;;;;;:13;:17;;;;;;;;33076:18;32892:202;:240;;;;-1:-1:-1;33111:21:0;;;;32892:240;:293;;;;;33184:1;33166:14;;33150:13;;:30;;;;:::i;:::-;33149:36;32892:293;32874:719;;;33216:8;:15;;-1:-1:-1;;;;33216:15:0;-1:-1:-1;;;33216:15:0;;;33276:9;;-1:-1:-1;;;;;33270:15:0;;;33276:9;;33270:15;:49;;;;-1:-1:-1;33306:13:0;;;;33270:49;:121;;;;;33376:15;;33359:14;;:32;;;;:::i;:::-;33340:15;:51;;33270:121;:162;;;;-1:-1:-1;;;;;;33413:19:0;;;;;;:13;:19;;;;;;;;33412:20;33270:162;33248:264;;;33467:29;:27;:29::i;:::-;;33248:264;33528:20;:18;:20::i;:::-;33565:8;:16;;-1:-1:-1;;;;33565:16:0;;;32874:719;33621:8;;-1:-1:-1;;;;;33731:19:0;;33605:12;33731:19;;;:13;:19;;;;;;33621:8;-1:-1:-1;;;33621:8:0;;;;;33620:9;;33731:19;;:40;;-1:-1:-1;;;;;;33754:17:0;;;;;;:13;:17;;;;;;;;33731:40;33727:88;;;-1:-1:-1;33798:5:0;33727:88;33831:7;33827:3459;;;33859:14;;;;33855:645;;;33899:8;;-1:-1:-1;;;33899:8:0;;;;33894:591;;-1:-1:-1;;;;;34065:19:0;;;;;;:13;:19;;;;;;;;34064:20;:42;;;;-1:-1:-1;;;;;;34089:17:0;;;;;;:13;:17;;;;;;;;34088:18;34064:42;33932:294;;;29754:18;;29801:8;;;34157:45;;;;-1:-1:-1;;;34157:45:0;;20540:2:1;34157:45:0;;;20522:21:1;20579:2;20559:18;;;20552:30;-1:-1:-1;;;20598:18:1;;;20591:47;20655:18;;34157:45:0;20338:341:1;34157:45:0;-1:-1:-1;;;;;34254:19:0;;;;;;:13;:19;;;;;;;;;:40;;-1:-1:-1;;;;;;34277:17:0;;;;;;:13;:17;;;;;;;;34254:40;34250:214;;;34407:12;;34403:1;:16;:25;;;;;34423:5;34403:25;34395:45;;;;-1:-1:-1;;;34395:45:0;;20886:2:1;34395:45:0;;;20868:21:1;20925:1;20905:18;;;20898:29;-1:-1:-1;;;20943:18:1;;;20936:37;20990:18;;34395:45:0;20684:330:1;34395:45:0;-1:-1:-1;;;;;34520:19:0;;;;;;:13;:19;;;;;;;;34516:286;;;34609:12;34604:2;;34586:15;;:20;;;;:::i;:::-;:35;:76;;;;-1:-1:-1;34646:16:0;;;;;;;34586:76;:116;;;;-1:-1:-1;34687:15:0;;;;;;;34586:116;34560:227;;;-1:-1:-1;;;;;34745:15:0;;;;;;:11;:15;;;;;:22;;-1:-1:-1;;34745:22:0;34763:4;34745:22;;;34560:227;34867:12;;34816;;34867:16;34845:194;;34941:6;34922:15;34932:4;34922:9;:15::i;:::-;:25;34918:106;;34991:12;;34980:24;;:6;;:10;:24::i;:::-;34971:33;;34918:106;-1:-1:-1;;;;;35101:19:0;;35067:15;35101:19;;;:13;:19;;;;;;;;35097:404;;;35171:36;35201:5;35171:25;35182:13;;35171:6;:10;;:25;;;;:::i;:::-;:29;;:36::i;:::-;35164:43;;35097:404;;;-1:-1:-1;;;;;35233:17:0;;;;;;:13;:17;;;;;;;;35229:272;;;35302:37;35333:5;35302:26;35313:14;;35302:6;:10;;:26;;;;:::i;35229:272::-;35415:34;35443:5;35415:23;35426:11;;35415:6;:10;;:23;;;;:::i;:34::-;35408:41;;35481:4;35468:17;;35229:272;-1:-1:-1;;;;;35556:19:0;;35519:18;35556:19;;;:13;:19;;;;;;;;35552:457;;;35632:34;35660:5;35632:23;35643:11;;35632:6;:10;;:23;;;;:::i;:34::-;35619:47;;35690:8;35685:171;;35722:16;35741:25;35759:6;35741:17;:25::i;:::-;-1:-1:-1;;;;;35789:18:0;;;;;;:14;:18;;;;;:47;;35722:44;;-1:-1:-1;35722:44:0;;35789:18;;;:47;;35722:44;;35789:47;:::i;:::-;;;;-1:-1:-1;;;35685:171:0;35552:457;;;-1:-1:-1;;;;;35883:17:0;;;;;;:13;:17;;;;;;;;35879:130;;;35958:35;35987:5;35958:24;35969:12;;35958:6;:10;;:24;;;;:::i;:35::-;35945:48;;35879:130;36029:5;36025:86;;;-1:-1:-1;36061:1:0;;-1:-1:-1;36061:1:0;36025:86;36131:8;36127:89;;;-1:-1:-1;36166:1:0;;-1:-1:-1;36166:1:0;36127:89;36236:14;;36232:155;;36271:50;36287:4;36301:6;36310:10;36271:15;:50::i;:::-;36349:22;:6;36360:10;36349;:22::i;:::-;36340:31;;36232:155;36412:16;:6;36423:4;36412:10;:16::i;:::-;36403:25;;36443:42;36459:4;36473;36480;36443:15;:42::i;:::-;-1:-1:-1;;;;;36725:17:0;;;;;;:13;:17;;;;;;;;:27;;;;;36747:5;36746:6;36725:27;36721:304;;;36772:16;36791:24;36802:4;36808:6;36791:10;:24::i;:::-;36772:43;-1:-1:-1;36838:12:0;;36834:176;;36883:20;:6;36894:8;36883:10;:20::i;:::-;36956:22;;36874:29;;-1:-1:-1;36926:64:0;;36942:4;;-1:-1:-1;;;;;36956:22:0;36981:8;36926:15;:64::i;:::-;36753:272;36721:304;-1:-1:-1;;;;;37046:18:0;;;;;;:14;:18;;;;;;;;37045:19;:42;;;;;37086:1;37068:15;;:19;37045:42;37041:220;;;37165:15;;37154:6;37138:13;37148:2;37138:9;:13::i;:::-;:22;;;;:::i;:::-;37137:43;;37107:138;;;;-1:-1:-1;;;37107:138:0;;21221:2:1;37107:138:0;;;21203:21:1;21260:2;21240:18;;;21233:30;-1:-1:-1;;;21279:18:1;;;21272:51;21340:18;;37107:138:0;21019:345:1;37107:138:0;33840:3446;;;33827:3459;37298:33;37314:4;37320:2;37324:6;37298:15;:33::i;:::-;37349:8;;-1:-1:-1;;;37349:8:0;;;;37348:9;:55;;;;-1:-1:-1;;;;;;37362:19:0;;;;;;:13;:19;;;;;;;;;:40;;-1:-1:-1;;;;;;37385:17:0;;;;;;:13;:17;;;;;;;;37362:40;37344:631;;;37434:16;;37471:23;;:36;;-1:-1:-1;;;;;;37471:36:0;;;;;740:25:1;;;-1:-1:-1;;;;;37471:23:0;;;;:31;;713:18:1;;37471:36:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;37471:36:0;;;;;;;;-1:-1:-1;;37471:36:0;;;;;;;;;;;;:::i;:::-;;;37467:460;;;37671:231;;;16515:25:1;;;16571:2;16556:18;;16549:34;;;16599:18;;;16592:34;;;16657:2;16642:18;;16635:34;;;37874:9:0;;37821:4;;37671:231;;16502:3:1;16487:19;37671:231:0;;;;;;;37508:410;;;37467:460;37943:18;37957:3;37943:13;:18::i;:::-;37405:570;37344:631;-1:-1:-1;;;;;37991:21:0;;38007:4;37991:21;;;;:34;;-1:-1:-1;38017:8:0;;-1:-1:-1;;;38017:8:0;;;;38016:9;37991:34;37987:137;;;38052:9;;-1:-1:-1;;;;;38052:9:0;;;38046:15;;;;38042:71;;38082:15;38092:4;38082:9;:15::i;:::-;31315:6816;;;;;;;31202:6929;;;:::o;1732:226::-;1852:7;1888:12;1880:6;;;;1872:29;;;;-1:-1:-1;;;1872:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1912:9:0;1924:5;1928:1;1924;:5;:::i;:::-;1912:17;1732:226;-1:-1:-1;;;;;1732:226:0:o;829:181::-;887:7;;919:5;923:1;919;:5;:::i;:::-;907:17;;948:1;943;:6;;935:46;;;;-1:-1:-1;;;935:46:0;;21704:2:1;935:46:0;;;21686:21:1;21743:2;21723:18;;;21716:30;21782:29;21762:18;;;21755:57;21829:18;;935:46:0;21502:351:1;935:46:0;1001:1;829:181;-1:-1:-1;;;829:181:0:o;38293:304::-;38339:20;38361:19;38394:13;38409;38437:9;;;;;;;;;-1:-1:-1;;;;;38437:9:0;-1:-1:-1;;;;;38427:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38393:68;-1:-1:-1;;;;;38393:68:0;;;-1:-1:-1;;;;;38393:68:0;;;38524:9;;;;;;;;;-1:-1:-1;;;;;38524:9:0;-1:-1:-1;;;;;38514:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38502:8;;-1:-1:-1;;;;;38502:8:0;;;:41;;;:87;;38570:8;38580;38502:87;;;38547:8;38557;38502:87;38472:117;;;;-1:-1:-1;38293:304:0;-1:-1:-1;;;38293:304:0:o;27064:372::-;-1:-1:-1;;;;;27169:19:0;;;;;;:13;:19;;;;;;:28;;;:19;;;;:28;;;27147:143;;;;-1:-1:-1;;;27147:143:0;;22316:2:1;27147:143:0;;;22298:21:1;22355:2;22335:18;;;22328:30;22394:34;22374:18;;;22367:62;22465:34;22445:18;;;22438:62;-1:-1:-1;;;22516:19:1;;;22509:32;22558:19;;27147:143:0;22114:469:1;27147:143:0;-1:-1:-1;;;;;27301:19:0;;;;;;:13;:19;;;;;:27;;-1:-1:-1;;27301:27:0;;;;;;;;;;;;27341:88;;27367:23;;:50;;-1:-1:-1;;;27367:50:0;;-1:-1:-1;;;;;2504:32:1;;;27367:50:0;;;2486:51:1;27367:23:0;;;;:44;;2459:18:1;;27367:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27064:372;;:::o;11325:610::-;-1:-1:-1;;;;;11465:20:0;;11457:70;;;;-1:-1:-1;;;11457:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11546:23:0;;11538:71;;;;-1:-1:-1;;;11538:71:0;;;;;;;:::i;:::-;11702:108;11738:6;11702:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11702:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;11682:17:0;;;:9;:17;;;;;;;;;;;:128;;;;11844:20;;;;;;;:32;;11869:6;11844:24;:32::i;:::-;-1:-1:-1;;;;;11821:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;11892:35;740:25:1;;;11821:20:0;;11892:35;;;;;;713:18:1;11892:35:0;594:177:1;49113:466:0;49177:17;49207:14;49223:13;49238:20;49262:14;:12;:14::i;:::-;49206:70;;;;;;49287:19;49330:1;49321:6;:10;:23;;;;;49343:1;49335:5;:9;49321:23;49317:93;;;49393:5;49375:15;49384:6;49375;:15;:::i;:::-;:23;;;;:::i;:::-;49361:37;;49317:93;49459:20;49468:11;49459:6;:20;:::i;:::-;49443:12;:36;49439:133;;49511:49;49524:12;49538:6;49546;49554:5;49511:12;:49::i;:::-;-1:-1:-1;49496:64:0;-1:-1:-1;49439:133:0;49195:384;;;;49113:466;;;:::o;50906:351::-;50973:17;51003:14;51021:20;51045:14;:12;:14::i;:::-;51002:57;;;;;51112:6;51096:12;:22;51092:158;;51218:9;;51231:6;;51208:20;;-1:-1:-1;;;;;51218:9:0;51208;:20::i;:::-;:29;;;;:::i;:::-;51166:9;;;;;;;;;-1:-1:-1;;;;;51166:9:0;-1:-1:-1;;;;;51156:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51147:43;;:6;:43;:::i;51092:158::-;50991:266;;50906:351;;;:::o;41634:622::-;41725:15;41708:14;:32;41792:9;;41691:4;;;;41782:20;;-1:-1:-1;;;;;41792:9:0;41782;:20::i;:::-;41751:51;;41813:20;41895:5;41860:16;;41836:20;:41;;;;:::i;:::-;:75;;;;:::i;:::-;41813:98;-1:-1:-1;41926:16:0;;41922:106;;41975:9;;41959:57;;-1:-1:-1;;;;;41975:9:0;41994:6;42003:12;41959:15;:57::i;:::-;42065:9;;42086:11;;;-1:-1:-1;;;;;;42086:11:0;;;;-1:-1:-1;;;;;42065:9:0;;;;;;42086;;:11;;;;;42038:14;;42086:11;;;;;;;42038:14;42065:9;42086:11;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42113:113:0;;;8212:25:1;;;8268:2;8253:18;;8246:34;;;42200:15:0;8296:18:1;;;8289:34;42113:113:0;;;;-1:-1:-1;42113:113:0;;;;8200:2:1;42113:113:0;;-1:-1:-1;42113:113:0;42244:4;42237:11;;;;;41634:622;:::o;43017:3626::-;43133:22;;43068:38;;43109:48;;-1:-1:-1;;;;;43133:22:0;43109:15;:48::i;:::-;43068:89;;43168:21;43192:30;43216:4;43192:15;:30::i;:::-;43168:54;-1:-1:-1;43233:19:0;43255:46;43271:30;43168:54;43255:46;:::i;:::-;43233:68;;43316:11;43331:1;43316:16;43312:30;;43334:7;;;43017:3626::o;43312:30::-;43352:10;43365:30;43383:11;43365:17;:30::i;:::-;43352:43;;43416:14;;43410:2;:20;43406:107;;;43457:23;;740:25:1;;;43457:23:0;;728:2:1;713:18;43457:23:0;;;;;;;43495:7;;;;43017:3626::o;43406:107::-;43547:22;;43523:95;;-1:-1:-1;;;;;43547:22:0;43580:4;43587:30;43523:15;:95::i;:::-;43648:34;43670:11;43648:21;:34::i;:::-;43712:8;;43754:27;;-1:-1:-1;;;43754:27:0;;43775:4;43754:27;;;2486:51:1;-1:-1:-1;;;;;43712:8:0;;;;43693:9;;43712:8;;43754:12;;2459:18:1;;43754:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43732:49;-1:-1:-1;43811:25:0;43870:11;43839:27;43853:13;43732:49;43839:27;:::i;:::-;:42;;;;:::i;:::-;43811:70;-1:-1:-1;43898:21:0;;43894:1466;;43936:17;44035:14;;44019:13;;:30;;;;:::i;:::-;43996:17;;43977:16;;:36;;;;:::i;:::-;43956:58;;:17;:58;:::i;:::-;:94;;;;:::i;:::-;43936:114;;44065:14;44204:3;44186:14;;44170:13;;:30;;;;:::i;:::-;44145:21;;44123:18;;44103:17;;:38;;;;:::i;:::-;44082:60;;:17;:60;:::i;:::-;:84;;;;:::i;:::-;:119;;;;:::i;:::-;:125;;;;:::i;:::-;44065:142;-1:-1:-1;44222:14:0;44065:142;44239:29;44259:9;44239:17;:29;:::i;:::-;:38;;;;:::i;:::-;44222:55;-1:-1:-1;44298:13:0;;44294:142;;44343:11;;44331:35;;-1:-1:-1;;;44331:35:0;;-1:-1:-1;;;44343:11:0;;;-1:-1:-1;;;;;44343:11:0;;;44331:35;;;15379:51:1;15446:18;;;15439:34;;;44331:11:0;;;;;15352:18:1;;44331:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44411:9;44385:22;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;44294:142:0;44456:10;;44452:706;;44490:23;;;;;;;;;-1:-1:-1;;;;;44490:23:0;-1:-1:-1;;;;;44490:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44531:1;44490:42;44486:657;;44603:11;;44557:114;;-1:-1:-1;;;44557:114:0;;-1:-1:-1;;;44603:11:0;;;-1:-1:-1;;;;;44603:11:0;;;44557:114;;;15379:51:1;15446:18;;;15439:34;;;44557:11:0;;;;;15352:18:1;;44557:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44486:657;;;44781:23;;44735:126;;-1:-1:-1;;;44735:126:0;;-1:-1:-1;;;;;44781:23:0;;;44735:126;;;15379:51:1;15446:18;;;15439:34;;;44720:12:0;;44735:11;;;;;15352:18:1;;44735:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44720:141;;44888:7;44884:240;;;44924:23;;:110;;-1:-1:-1;;;44924:110:0;;;;;740:25:1;;;-1:-1:-1;;;;;44924:23:0;;;;:46;;713:18:1;;44924:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45066:34:0;;;7158:25:1;;;7214:2;7199:18;;7192:34;;;45066::0;;-1:-1:-1;7131:18:1;;-1:-1:-1;45066:34:0;;;;;;;44884:240;44697:446;44486:657;45178:10;;45174:161;;45250:20;;45208:111;;-1:-1:-1;;;45208:111:0;;-1:-1:-1;;;;;45250:20:0;;;45208:111;;;15379:51:1;15446:18;;;15439:34;;;45208:11:0;;;;;;15352:18:1;;45208:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45174:161;43921:1439;;;43894:1466;45393:28;45424:31;45438:17;45424:11;:31;:::i;:::-;45393:62;;45466:18;45507:15;;45487:17;;:35;;;;:::i;:::-;45466:56;;45535:34;45615:10;45595:17;;45572:20;:40;;;;:::i;:::-;:53;;;;:::i;:::-;45535:90;-1:-1:-1;45636:25:0;45664:49;45535:90;45664:20;:49;:::i;:::-;45636:77;-1:-1:-1;45730:30:0;;45726:735;;45781:23;;;;;;;;;-1:-1:-1;;;;;45781:23:0;-1:-1:-1;;;;;45781:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45822:1;45781:42;45777:673;;45886:11;;45844:122;;-1:-1:-1;;;45844:122:0;;-1:-1:-1;;;45886:11:0;;;-1:-1:-1;;;;;45886:11:0;;;45844:122;;;15379:51:1;15446:18;;;15439:34;;;45844:11:0;;;;;15352:18:1;;45844:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45777:673;;;46064:23;;46022:134;;-1:-1:-1;;;46022:134:0;;-1:-1:-1;;;;;46064:23:0;;;46022:134;;;15379:51:1;15446:18;;;15439:34;;;46007:12:0;;46022:11;;;;;15352:18:1;;46022:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46007:149;;46179:7;46175:260;;;46211:23;;:122;;-1:-1:-1;;;46211:122:0;;;;;740:25:1;;;-1:-1:-1;;;;;46211:23:0;;;;:46;;713:18:1;;46211:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46361:54:0;;;7158:25:1;;;7214:2;7199:18;;7192:34;;;46361:54:0;;-1:-1:-1;7131:18:1;;-1:-1:-1;46361:54:0;;;;;;;46175:260;45988:462;45777:673;46477:21;;46473:163;;46552:20;;46514:110;;-1:-1:-1;;;46514:110:0;;-1:-1:-1;;;;;46552:20:0;;;46514:110;;;15379:51:1;15446:18;;;15439:34;;;46514:11:0;;;;;;15352:18:1;;46514:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46473:163;43055:3588;;;;;;;;;;;43017:3626::o;1293:136::-;1351:7;1378:43;1382:1;1385;1378:43;;;;;;;;;;;;;;;;;:3;:43::i;2217:471::-;2275:7;2520:1;2525;2520:6;2516:47;;-1:-1:-1;2550:1:0;2543:8;;2516:47;2575:9;2587:5;2591:1;2587;:5;:::i;:::-;2575:17;-1:-1:-1;2620:1:0;2611:5;2615:1;2575:17;2611:5;:::i;:::-;:10;2603:56;;;;-1:-1:-1;;;2603:56:0;;23077:2:1;2603:56:0;;;23059:21:1;23116:2;23096:18;;;23089:30;23155:34;23135:18;;;23128:62;-1:-1:-1;;;23206:18:1;;;23199:31;23247:19;;2603:56:0;22875:397:1;3164:132:0;3222:7;3249:39;3253:1;3256;3249:39;;;;;;;;;;;;;;;;;:3;:39::i;40011:910::-;-1:-1:-1;;;;;40119:20:0;;40077:7;40119:20;;;:14;:20;;;;;:37;;40191:32;;;;;40077:7;40255:25;40273:6;40255:17;:25::i;:::-;40236:44;;40291:16;40339:12;40322:13;:29;40318:334;;40409:3;40388:18;;40379:6;:27;;;;:::i;:::-;:33;;;;:::i;:::-;40368:44;;40318:334;;;40461:12;40434:24;40450:8;40434:13;:24;:::i;:::-;:39;40430:222;;;40490:22;40515:58;40560:12;40533:24;40549:8;40533:13;:24;:::i;:::-;:39;;;;:::i;40515:58::-;40490:83;;40637:3;40616:18;;40599:14;:35;;;;:::i;:::-;:41;;;;:::i;:::-;40588:52;;40475:177;40430:222;-1:-1:-1;;;;;40662:20:0;;;;;;:14;:20;;;;;:32;;:44;;40698:8;;40662:20;:44;;40698:8;;40662:44;:::i;:::-;;;;-1:-1:-1;;40732:153:0;;;23536:25:1;;;23592:2;23577:18;;23570:34;;;23620:18;;;23613:34;;;23678:2;23663:18;;23656:34;;;23721:3;23706:19;;23699:35;;;40732:153:0;;23523:3:1;23508:19;40732:153:0;;;;;;;40905:8;40011:910;-1:-1:-1;;;;;;40011:910:0:o;52361:1499::-;52467:12;52442:22;;52420:19;;:44;;;;:::i;:::-;:59;52416:98;;;52361:1499;:::o;52416:98::-;52547:8;;52610:20;;52587:45;;-1:-1:-1;;;52587:45:0;;-1:-1:-1;;;;;52610:20:0;;;52587:45;;;2486:51:1;52547:8:0;;;52526:11;;52547:8;;52587:14;;2459:18:1;;52587:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52569:63;;52657:21;;52647:7;:31;52643:70;;;52695:7;;52361:1499;:::o;52643:70::-;52751:9;;52797:23;;;-1:-1:-1;;;52797:23:0;;;;-1:-1:-1;;;;;52751:9:0;;;;52725:16;;52751:9;;52797:21;;:23;;;;;;;;;;;;;;;52751:9;52797:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52948:7;:14;52772:48;;-1:-1:-1;52833:19:0;;;;;;;;;53056:9;53038:27;;53078:728;53095:3;53085:7;:13;:46;;;;;53115:16;53102:10;:29;53085:46;53078:728;;;53168:16;53152:12;;:32;53148:89;;53220:1;53205:12;:16;53148:89;53265:7;53273:12;;53265:21;;;;;;;;:::i;:::-;;;;;;;;;;;53316:32;;-1:-1:-1;;;53316:32:0;;-1:-1:-1;;;;;53265:21:0;;;53316:32;;;2486:51:1;;;53265:21:0;-1:-1:-1;53316:19:0;;;;;;2459:18:1;;53316:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53301:47;;53382:1;53367:12;:16;:47;;;;-1:-1:-1;;;;;;53388:26:0;;;;;;:13;:26;;;;;;;;53387:27;53367:47;53363:284;;;53471:14;53445:22;53455:12;53445:7;:22;:::i;:::-;53444:41;;;;:::i;:::-;53435:50;-1:-1:-1;53508:10:0;;53504:128;;53569:20;;53543:69;;-1:-1:-1;;;53543:69:0;;-1:-1:-1;;;;;53569:20:0;;;53543:69;;;23947:51:1;24034:32;;;24014:18;;;24007:60;24083:18;;;24076:34;;;53543:17:0;;;;;;23920:18:1;;53543:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53504:128;53694:9;53684:19;;:7;:19;:::i;:::-;53673:31;;:7;:31;:::i;:::-;53663:41;;53729:9;53753:12;:14;;53719:19;;-1:-1:-1;53753:12:0;:14;;;:::i;:::-;;;;;;53782:12;;;;;:::i;:::-;;;;53078:728;;;-1:-1:-1;;53840:12:0;53818:19;:34;-1:-1:-1;;;;;;;;;;52361:1499:0:o;49587:1311::-;49732:17;49751:22;49786:23;49822:9;;;;;;;;;-1:-1:-1;;;;;49822:9:0;-1:-1:-1;;;;;49812:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49786:60;;49857:13;49891:11;;;;;;;;;-1:-1:-1;;;;;49891:11:0;-1:-1:-1;;;;;49891:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49873:46:0;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50002:9;;49992:28;;;-1:-1:-1;;;49992:28:0;;;;49857:64;;-1:-1:-1;;;;;;49945:19:0;;;;;;49932:10;;50002:9;;;;49992:26;;:28;;;;;;;;;;;;;;50002:9;49992:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49975:45;;50035:5;50031:540;;;50061:11;;50057:503;;50093:13;50109:18;50119:7;50124:2;50119;:7;:::i;:::-;50109:9;:18::i;:::-;50093:34;;50146:17;50166;50176:6;50166:9;:17::i;:::-;50146:37;;50214:9;50206:5;:17;50202:343;;;50248:17;50287;50295:9;50287:5;:17;:::i;:::-;50268:37;;:15;:37;:::i;:::-;:41;;50308:1;50268:41;:::i;:::-;50248:61;-1:-1:-1;50332:19:0;50368:13;:9;50380:1;50368:13;:::i;:::-;50354:10;:5;50362:2;50354:10;:::i;:::-;:28;;;;:::i;:::-;50332:50;-1:-1:-1;50422:23:0;50332:50;50422:9;:23;:::i;:::-;50405:40;-1:-1:-1;50472:18:0;;50468:57;;50492:33;50511:14;50492:33;;:::i;:::-;;;50468:57;50225:320;;50202:343;50074:486;;50057:503;50581:15;50599:13;50610:2;50599:8;:13;:::i;:::-;50581:31;;50627:15;50646:1;50627:20;50623:268;;50706:4;50676:27;50686:16;50696:6;50686:7;:16;:::i;50676:27::-;:34;;;;:::i;:::-;50664:46;;50623:268;;;50755:124;50812:2;50783:25;50793:15;50783:7;:25;:::i;:::-;50782:32;;;;:::i;:::-;50862:2;50834:24;50843:15;50834:6;:24;:::i;:::-;50833:31;;;;:::i;:::-;50755:8;:124::i;:::-;50743:136;;50623:268;49775:1123;;;;;49587:1311;;;;;;;:::o;46844:1009::-;46939:16;;;46953:1;46939:16;;;;;;;;46915:21;;46939:16;;;;;;;;;;-1:-1:-1;46939:16:0;46915:40;;46984:4;46966;46971:1;46966:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46966:23:0;;;:7;;;;;;;;;:23;47010:8;;47000:7;;47010:8;;;47000:4;;47010:8;;47000:7;;;;;;:::i;:::-;-1:-1:-1;;;;;47000:18:0;;;:7;;;;;;;;;:18;47063:11;;47031:58;;47048:4;;47063:11;47077;47031:8;:58::i;:::-;47145:11;;47310:17;;47145:232;;-1:-1:-1;;;47145:232:0;;-1:-1:-1;;;;;47145:11:0;;;;:65;;:232;;47229:11;;47145;;47279:4;;47310:17;;;47347:15;;47145:232;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47128:395;;47416:95;;47495:1;740:25:1;;47416:95:0;;728:2:1;713:18;47416:95:0;;;;;;;47128:395;47564:8;;47606:17;;47557:78;;-1:-1:-1;;;47557:78:0;;-1:-1:-1;;;;;47606:17:0;;;47557:78;;;2486:51:1;47535:19:0;;47564:8;;;;;47557:26;;2459:18:1;;47557:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47535:100;-1:-1:-1;47650:16:0;;47646:200;;47690:8;;47739:17;;47683:151;;-1:-1:-1;;;47683:151:0;;-1:-1:-1;;;;;47739:17:0;;;47683:151;;;23947:51:1;47784:4:0;24014:18:1;;;24007:60;24083:18;;;24076:34;;;47690:8:0;;;47683:29;;23920:18:1;;47683:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3792:312::-;3912:7;3947:12;3940:5;3932:28;;;;-1:-1:-1;;;3932:28:0;;;;;;;;:::i;:::-;-1:-1:-1;3971:9:0;3983:5;3987:1;3983;:5;:::i;256:303::-;301:6;328:1;324;:5;320:232;;;-1:-1:-1;350:1:0;366:6;375:5;379:1;350;375:5;:::i;:::-;:9;;383:1;375:9;:::i;:::-;366:18;;399:92;410:1;406;:5;399:92;;;436:1;-1:-1:-1;436:1:0;474;436;461:5;436:1;461;:5;:::i;:::-;:9;;;;:::i;:::-;460:15;;;;:::i;:::-;456:19;;399:92;;;331:171;28159:185;;;:::o;320:232::-;512:6;;508:44;;-1:-1:-1;539:1:0;256:303;;;:::o;152:96::-;204:6;231:1;227;:5;:13;;239:1;227:13;;;-1:-1:-1;235:1:0;;223:17;-1:-1:-1;152:96:0:o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;776:118::-;862:5;855:13;848:21;841:5;838:32;828:60;;884:1;881;874:12;899:382;964:6;972;1025:2;1013:9;1004:7;1000:23;996:32;993:52;;;1041:1;1038;1031:12;993:52;1080:9;1067:23;1099:31;1124:5;1099:31;:::i;:::-;1149:5;-1:-1:-1;1206:2:1;1191:18;;1178:32;1219:30;1178:32;1219:30;:::i;:::-;1268:7;1258:17;;;899:382;;;;;:::o;1286:226::-;1345:6;1398:2;1386:9;1377:7;1373:23;1369:32;1366:52;;;1414:1;1411;1404:12;1366:52;-1:-1:-1;1459:23:1;;1286:226;-1:-1:-1;1286:226:1:o;1517:418::-;1666:2;1655:9;1648:21;1629:4;1698:6;1692:13;1741:6;1736:2;1725:9;1721:18;1714:34;1800:6;1795:2;1787:6;1783:15;1778:2;1767:9;1763:18;1757:50;1856:1;1851:2;1842:6;1831:9;1827:22;1823:31;1816:42;1926:2;1919;1915:7;1910:2;1902:6;1898:15;1894:29;1883:9;1879:45;1875:54;1867:62;;;1517:418;;;;:::o;1940:367::-;2008:6;2016;2069:2;2057:9;2048:7;2044:23;2040:32;2037:52;;;2085:1;2082;2075:12;2037:52;2124:9;2111:23;2143:31;2168:5;2143:31;:::i;:::-;2193:5;2271:2;2256:18;;;;2243:32;;-1:-1:-1;;;1940:367:1:o;2548:::-;2611:8;2621:6;2675:3;2668:4;2660:6;2656:17;2652:27;2642:55;;2693:1;2690;2683:12;2642:55;-1:-1:-1;2716:20:1;;2759:18;2748:30;;2745:50;;;2791:1;2788;2781:12;2745:50;2828:4;2820:6;2816:17;2804:29;;2888:3;2881:4;2871:6;2868:1;2864:14;2856:6;2852:27;2848:38;2845:47;2842:67;;;2905:1;2902;2895:12;2842:67;2548:367;;;;;:::o;2920:566::-;3012:6;3020;3028;3081:2;3069:9;3060:7;3056:23;3052:32;3049:52;;;3097:1;3094;3087:12;3049:52;3137:9;3124:23;3170:18;3162:6;3159:30;3156:50;;;3202:1;3199;3192:12;3156:50;3241:70;3303:7;3294:6;3283:9;3279:22;3241:70;:::i;:::-;3330:8;;-1:-1:-1;3215:96:1;-1:-1:-1;;3415:2:1;3400:18;;3387:32;3428:28;3387:32;3428:28;:::i;:::-;3475:5;3465:15;;;2920:566;;;;;:::o;3491:437::-;3577:6;3585;3638:2;3626:9;3617:7;3613:23;3609:32;3606:52;;;3654:1;3651;3644:12;3606:52;3694:9;3681:23;3727:18;3719:6;3716:30;3713:50;;;3759:1;3756;3749:12;3713:50;3798:70;3860:7;3851:6;3840:9;3836:22;3798:70;:::i;:::-;3887:8;;3772:96;;-1:-1:-1;3491:437:1;-1:-1:-1;;;;3491:437:1:o;4168:508::-;4245:6;4253;4261;4314:2;4302:9;4293:7;4289:23;4285:32;4282:52;;;4330:1;4327;4320:12;4282:52;4369:9;4356:23;4388:31;4413:5;4388:31;:::i;:::-;4438:5;-1:-1:-1;4495:2:1;4480:18;;4467:32;4508:33;4467:32;4508:33;:::i;:::-;4168:508;;4560:7;;-1:-1:-1;;;4640:2:1;4625:18;;;;4612:32;;4168:508::o;5753:481::-;5827:6;5835;5843;5896:2;5884:9;5875:7;5871:23;5867:32;5864:52;;;5912:1;5909;5902:12;5864:52;5957:23;;;-1:-1:-1;6077:2:1;6062:18;;6049:32;;-1:-1:-1;6159:2:1;6144:18;;6131:32;6172:30;6131:32;6172:30;:::i;6239:241::-;6295:6;6348:2;6336:9;6327:7;6323:23;6319:32;6316:52;;;6364:1;6361;6354:12;6316:52;6403:9;6390:23;6422:28;6444:5;6422:28;:::i;7237:768::-;7359:6;7367;7375;7383;7436:2;7424:9;7415:7;7411:23;7407:32;7404:52;;;7452:1;7449;7442:12;7404:52;7492:9;7479:23;7525:18;7517:6;7514:30;7511:50;;;7557:1;7554;7547:12;7511:50;7596:70;7658:7;7649:6;7638:9;7634:22;7596:70;:::i;:::-;7685:8;;-1:-1:-1;7570:96:1;-1:-1:-1;;7773:2:1;7758:18;;7745:32;7802:18;7789:32;;7786:52;;;7834:1;7831;7824:12;7786:52;7873:72;7937:7;7926:8;7915:9;7911:24;7873:72;:::i;:::-;7237:768;;;;-1:-1:-1;7964:8:1;-1:-1:-1;;;;7237:768:1:o;8334:388::-;8402:6;8410;8463:2;8451:9;8442:7;8438:23;8434:32;8431:52;;;8479:1;8476;8469:12;8431:52;8518:9;8505:23;8537:31;8562:5;8537:31;:::i;:::-;8587:5;-1:-1:-1;8644:2:1;8629:18;;8616:32;8657:33;8616:32;8657:33;:::i;8951:356::-;9153:2;9135:21;;;9172:18;;;9165:30;9231:34;9226:2;9211:18;;9204:62;9298:2;9283:18;;8951:356::o;10004:380::-;10083:1;10079:12;;;;10126;;;10147:61;;10201:4;10193:6;10189:17;10179:27;;10147:61;10254:2;10246:6;10243:14;10223:18;10220:38;10217:161;;10300:10;10295:3;10291:20;10288:1;10281:31;10335:4;10332:1;10325:15;10363:4;10360:1;10353:15;10739:127;10800:10;10795:3;10791:20;10788:1;10781:31;10831:4;10828:1;10821:15;10855:4;10852:1;10845:15;11551:230;11621:6;11674:2;11662:9;11653:7;11649:23;11645:32;11642:52;;;11690:1;11687;11680:12;11642:52;-1:-1:-1;11735:16:1;;11551:230;-1:-1:-1;11551:230:1:o;13135:245::-;13202:6;13255:2;13243:9;13234:7;13230:23;13226:32;13223:52;;;13271:1;13268;13261:12;13223:52;13303:9;13297:16;13322:28;13344:5;13322:28;:::i;13385:127::-;13446:10;13441:3;13437:20;13434:1;13427:31;13477:4;13474:1;13467:15;13501:4;13498:1;13491:15;13517:125;13582:9;;;13603:10;;;13600:36;;;13616:18;;:::i;13647:168::-;13720:9;;;13751;;13768:15;;;13762:22;;13748:37;13738:71;;13789:18;;:::i;13820:217::-;13860:1;13886;13876:132;;13930:10;13925:3;13921:20;13918:1;13911:31;13965:4;13962:1;13955:15;13993:4;13990:1;13983:15;13876:132;-1:-1:-1;14022:9:1;;13820:217::o;15823:456::-;15911:6;15919;15927;15980:2;15968:9;15959:7;15955:23;15951:32;15948:52;;;15996:1;15993;15986:12;15948:52;-1:-1:-1;;16041:16:1;;16147:2;16132:18;;16126:25;16243:2;16228:18;;;16222:25;16041:16;;16126:25;;-1:-1:-1;16222:25:1;15823:456;-1:-1:-1;15823:456:1:o;16680:188::-;16759:13;;-1:-1:-1;;;;;16801:42:1;;16791:53;;16781:81;;16858:1;16855;16848:12;16873:450;16960:6;16968;16976;17029:2;17017:9;17008:7;17004:23;17000:32;16997:52;;;17045:1;17042;17035:12;16997:52;17068:40;17098:9;17068:40;:::i;:::-;17058:50;;17127:49;17172:2;17161:9;17157:18;17127:49;:::i;:::-;17117:59;;17219:2;17208:9;17204:18;17198:25;17263:10;17256:5;17252:22;17245:5;17242:33;17232:61;;17289:1;17286;17279:12;18890:401;19092:2;19074:21;;;19131:2;19111:18;;;19104:30;19170:34;19165:2;19150:18;;19143:62;-1:-1:-1;;;19236:2:1;19221:18;;19214:35;19281:3;19266:19;;18890:401::o;19296:399::-;19498:2;19480:21;;;19537:2;19517:18;;;19510:30;19576:34;19571:2;19556:18;;19549:62;-1:-1:-1;;;19642:2:1;19627:18;;19620:33;19685:3;19670:19;;19296:399::o;21369:128::-;21436:9;;;21457:11;;;21454:37;;;21471:18;;:::i;21858:251::-;21928:6;21981:2;21969:9;21960:7;21956:23;21952:32;21949:52;;;21997:1;21994;21987:12;21949:52;22029:9;22023:16;22048:31;22073:5;22048:31;:::i;24121:135::-;24160:3;24181:17;;;24178:43;;24201:18;;:::i;:::-;-1:-1:-1;24248:1:1;24237:13;;24121:135::o;24393:959::-;24655:4;24703:3;24692:9;24688:19;24734:6;24723:9;24716:25;24777:6;24772:2;24761:9;24757:18;24750:34;24820:3;24815:2;24804:9;24800:18;24793:31;24844:6;24879;24873:13;24910:6;24902;24895:22;24948:3;24937:9;24933:19;24926:26;;24987:2;24979:6;24975:15;24961:29;;25008:1;25018:195;25032:6;25029:1;25026:13;25018:195;;;25097:13;;-1:-1:-1;;;;;25093:39:1;25081:52;;25162:2;25188:15;;;;25153:12;;;;25129:1;25047:9;25018:195;;;-1:-1:-1;;;;;;;25269:32:1;;;;25264:2;25249:18;;25242:60;-1:-1:-1;;25333:3:1;25318:19;25311:35;25230:3;24393:959;-1:-1:-1;;;24393:959:1:o

Swarm Source

ipfs://a8624181e9c40a6f978fa71d021e32885b278989311b5ff1be624e3eab3c0ce4
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.