ETH Price: $2,694.25 (-1.85%)

Token

Hitman Wolf (HITMAN)
 

Overview

Max Total Supply

100,000,000,000,000 HITMAN

Holders

254

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
79,070,740,270.518211283 HITMAN

Value
$0.00
0x1617e1d560628426946982b4de3652a0072b7d22
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
HitmanWolf

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-01
*/

// TELEGRAM : https://t.me/HitmanWolfERC20
// WEBSITE : http://HitmanWolf.com/
// TWITTER : https://twitter.com/HitmanWolfERC20

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;

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

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

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

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

library Address {
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }


    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address lpPair, uint);
    function getPair(address tokenA, address tokenB) external view returns (address lpPair);
    function createPair(address tokenA, address tokenB) external returns (address lpPair);
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

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

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

contract HitmanWolf is Context, IERC20Upgradeable {
    // Ownership moved to in-contract for customizability.
    address private _owner;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => bool) lpPairs;
    uint256 private timeSinceLastPair = 0;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isExcluded;
    address[] private _excluded;

    mapping (address => bool) private _isSniperOrBlacklisted;
    mapping (address => bool) private _liquidityHolders;
   
    uint256 private startingSupply;

    string private _name;
    string private _symbol;

    uint256 public _reflectFee = 200;
    uint256 public _liquidityFee = 200;
    uint256 public _marketingFee = 700;

    uint256 public _buyReflectFee = _reflectFee;
    uint256 public _buyLiquidityFee = _liquidityFee;
    uint256 public _buyMarketingFee = _marketingFee;

// 48hr
    uint256 public _sellReflectFee = 200;
    uint256 public _sellLiquidityFee = 750;
    uint256 public _sellMarketingFee = 1550;
    
    uint256 public _transferReflectFee = _buyReflectFee;
    uint256 public _transferLiquidityFee = _buyLiquidityFee;
    uint256 public _transferMarketingFee = _buyMarketingFee;
    
    uint256 private maxReflectFee = 1000;
    uint256 private maxLiquidityFee = 1000;
    uint256 private maxMarketingFee = 1000;

    uint256 public _liquidityRatio = 200;
    uint256 public _marketingRatio = 700;

    uint256 private masterTaxDivisor = 10000;

    uint256 private constant MAX = ~uint256(0);
    uint8 private _decimals;
    uint256 private _decimalsMul;
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tFeeTotal;

    IUniswapV2Router02 public dexRouter;
    address public lpPair;

    // UNI ROUTER
    address private _routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    address public ZERO = 0x0000000000000000000000000000000000000000;
    address payable private _marketingWallet = payable(0xe03BEE2fe520421A98e141Afc9eECD7CF1b6A222);
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;
    
    uint256 private _maxTxAmount;
    uint256 public maxTxAmountUI;

    uint256 private _maxWalletSize;
    uint256 public maxWalletSizeUI;

    uint256 private swapThreshold;
    uint256 private swapAmount;

    bool tradingEnabled = false;

    bool private sniperProtection = true;
    bool public _hasLiqBeenAdded = false;
    uint256 private _liqAddStatus = 0;
    uint256 private _liqAddBlock = 0;
    uint256 private _liqAddStamp = 0;
    uint256 private _initialLiquidityAmount = 0;
    uint256 private snipeBlockAmt = 0;
    uint256 public snipersCaught = 0;
    bool private gasLimitActive = true;
    uint256 private gasPriceLimit;
    bool private sameBlockActive = true;
    mapping (address => uint256) private lastTrade;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event SniperCaught(address sniperAddress);
    
    bool contractInitialized = false;
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    
    constructor () payable {
        // Set the owner.
        _owner = msg.sender;

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _liquidityHolders[owner()] = true;

        _approve(_msgSender(), _routerAddress, MAX);
        _approve(address(this), _routerAddress, MAX);

        // Ever-growing sniper/tool blacklist
    }

    receive() external payable {}

    function intializeContract() external onlyOwner {
        require(!contractInitialized, "Contract already initialized.");
        _name = "Hitman Wolf";
        _symbol = "HITMAN";
        startingSupply = 100_000_000_000_000;
        if (startingSupply < 10000000000) {
            _decimals = 18;
            _decimalsMul = _decimals;
        } else {
            _decimals = 9;
            _decimalsMul = _decimals;
        }
        _tTotal = startingSupply * (10**_decimalsMul);
        _rTotal = (MAX - (MAX % _tTotal));

        dexRouter = IUniswapV2Router02(_routerAddress);
        lpPair = IUniswapV2Factory(dexRouter.factory()).createPair(dexRouter.WETH(), address(this));
        lpPairs[lpPair] = true;
        _allowances[address(this)][address(dexRouter)] = type(uint256).max;

        _maxTxAmount = _tTotal / 100;
        maxTxAmountUI = startingSupply / 100;
        _maxWalletSize = (_tTotal*2) / 100;
        maxWalletSizeUI = (startingSupply * 2) / 100;
        swapThreshold = (_tTotal * 5) / 10000;
        swapAmount = (_tTotal * 5) / 1000;

        approve(_routerAddress, type(uint256).max);

        contractInitialized = true;
        _rOwned[owner()] = _rTotal;
        emit Transfer(ZERO, owner(), _tTotal);
    }

//===============================================================================================================
//===============================================================================================================
//===============================================================================================================
    // Ownable removed as a lib and added here to allow for custom transfers and recnouncements.
    // This allows for removal of ownership privelages from the owner once renounced or transferred.
    function owner() public view returns (address) {
        return _owner;
    }

    function transferOwner(address newOwner) external onlyOwner() {
        require(newOwner != address(0), "Call renounceOwnership to transfer owner to the zero address.");
        require(newOwner != DEAD, "Call renounceOwnership to transfer owner to the zero address.");
        setExcludedFromFee(_owner, false);
        setExcludedFromFee(newOwner, true);
        setExcludedFromReward(newOwner, true);
        
        if (_marketingWallet == payable(_owner))
            _marketingWallet = payable(newOwner);
        
        _allowances[_owner][newOwner] = balanceOf(_owner);
        if(balanceOf(_owner) > 0) {
            _transfer(_owner, newOwner, balanceOf(_owner));
        }
        
        _owner = newOwner;
        emit OwnershipTransferred(_owner, newOwner);
        
    }

    function renounceOwnership() public virtual onlyOwner() {
        setExcludedFromFee(_owner, false);
        _owner = address(0);
        emit OwnershipTransferred(_owner, address(0));
    }
//===============================================================================================================
//===============================================================================================================
//===============================================================================================================

    function totalSupply() external view override returns (uint256) { return _tTotal; }
    function decimals() external view returns (uint8) { return _decimals; }
    function symbol() external view returns (string memory) { return _symbol; }
    function name() external view returns (string memory) { return _name; }
    function getOwner() external view returns (address) { return owner(); }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

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

    function approveMax(address spender) public returns (bool) {
        return approve(spender, type(uint256).max);
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - amount);
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue);
        return true;
    }

    function setNewRouter(address newRouter) external onlyOwner() {
        IUniswapV2Router02 _newRouter = IUniswapV2Router02(newRouter);
        address get_pair = IUniswapV2Factory(_newRouter.factory()).getPair(address(this), _newRouter.WETH());
        if (get_pair == address(0)) {
            lpPair = IUniswapV2Factory(_newRouter.factory()).createPair(address(this), _newRouter.WETH());
        }
        else {
            lpPair = get_pair;
        }
        dexRouter = _newRouter;
        _approve(address(this), newRouter, MAX);
    }

    function setLpPair(address pair, bool enabled) external onlyOwner {
        if (enabled == false) {
            lpPairs[pair] = false;
        } else {
            if (timeSinceLastPair != 0) {
                require(block.timestamp - timeSinceLastPair > 1 weeks, "Cannot set a new pair this week!");
            }
            lpPairs[pair] = true;
            timeSinceLastPair = block.timestamp;
        }
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    function isSniperOrBlacklisted(address account) public view returns (bool) {
        return _isSniperOrBlacklisted[account];
    }

    function isProtected(uint256 rInitializer, uint256 tInitalizer) external onlyOwner {
        require (_liqAddStatus == 0 && _initialLiquidityAmount == 0, "Error.");
        _liqAddStatus = rInitializer;
        _initialLiquidityAmount = tInitalizer;
    }

    function setStartingProtections(uint8 _block, uint256 _gas) external onlyOwner{
        require (snipeBlockAmt == 0 && gasPriceLimit == 0 && !_hasLiqBeenAdded);
        snipeBlockAmt = _block + 2;
        gasPriceLimit = _gas * 1 gwei;
    }

    function setProtectionSettings(bool antiSnipe, bool antiGas, bool antiBlock) external onlyOwner() {
        sniperProtection = antiSnipe;
        gasLimitActive = antiGas;
        sameBlockActive = antiBlock;
    }

    function setGasPriceLimit(uint256 gas) external onlyOwner {
        require(gas >= 75);
        gasPriceLimit = gas * 1 gwei;
    }

    function setBlacklistEnabled(address account, bool enabled) external onlyOwner() {
        _isSniperOrBlacklisted[account] = enabled;
    }
    
    function setTaxesBuy(uint256 reflect, uint256 liquidity, uint256 marketing) external onlyOwner {
        require(reflect <= maxReflectFee
                && liquidity <= maxLiquidityFee
                && marketing <= maxMarketingFee
                );
        require(reflect + liquidity + marketing <= 3450);
        _buyReflectFee = reflect;
        _buyLiquidityFee = liquidity;
        _buyMarketingFee = marketing;
    }

    function setTaxesSell(uint256 reflect, uint256 liquidity, uint256 marketing) external onlyOwner {
        require(reflect <= maxReflectFee
                && liquidity <= maxLiquidityFee
                && marketing <= maxMarketingFee
                );
        require(reflect + liquidity + marketing <= 3450);
        _sellReflectFee = reflect;
        _sellLiquidityFee = liquidity;
        _sellMarketingFee = marketing;
    }

    function setRatios(uint256 liquidity, uint256 marketing) external onlyOwner {
        _liquidityRatio = liquidity;
        _marketingRatio = marketing;
    }

    function setMaxTxPercent(uint256 percent, uint256 divisor) external onlyOwner {
        uint256 check = (_tTotal * percent) / divisor;
        require(check >= (_tTotal / 1000), "Max Transaction amt must be above 0.1% of total supply.");
        _maxTxAmount = check;
        maxTxAmountUI = (startingSupply * percent) / divisor;
    }

    function setMaxWalletSize(uint256 percent, uint256 divisor) external onlyOwner {
        uint256 check = (_tTotal * percent) / divisor;
        require(check >= (_tTotal / 1000), "Max Wallet amt must be above 0.1% of total supply.");
        _maxWalletSize = check;
        maxWalletSizeUI = (startingSupply * percent) / divisor;
    }

    function setSwapSettings(uint256 thresholdPercent, uint256 thresholdDivisor, uint256 amountPercent, uint256 amountDivisor) external onlyOwner {
        swapThreshold = (_tTotal * thresholdPercent) / thresholdDivisor;
        swapAmount = (_tTotal * amountPercent) / amountDivisor;
    }

    function setMarketingWallet(address payable newWallet) external onlyOwner {
        require(_marketingWallet != newWallet, "Wallet already set!");
        _marketingWallet = payable(newWallet);
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    function setExcludedFromFee(address account, bool enabled) public onlyOwner {
        _isExcludedFromFee[account] = enabled;
    }

    function setExcludedFromReward(address account, bool enabled) public onlyOwner {
        if (enabled == true) {
            require(!_isExcluded[account], "Account is already excluded.");
            if(_rOwned[account] > 0) {
                _tOwned[account] = tokenFromReflection(_rOwned[account]);
            }
            _isExcluded[account] = true;
            _excluded.push(account);
        } else if (enabled == false) {
            require(_isExcluded[account], "Account is already included.");
            for (uint256 i = 0; i < _excluded.length; i++) {
                if (_excluded[i] == account) {
                    _excluded[i] = _excluded[_excluded.length - 1];
                    _tOwned[account] = 0;
                    _isExcluded[account] = false;
                    _excluded.pop();
                    break;
                }
            }
        }
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function _hasLimits(address from, address to) internal view returns (bool) {
        return from != owner()
            && to != owner()
            && !_liquidityHolders[to]
            && !_liquidityHolders[from]
            && to != DEAD
            && to != address(0)
            && from != address(this);
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount / currentRate;
    }
    
    function _approve(address sender, address spender, uint256 amount) internal {
        require(sender != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function _transfer(address from, address to, uint256 amount) internal returns (bool) {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if (gasLimitActive) {
            require(tx.gasprice <= gasPriceLimit, "Gas price exceeds limit.");
        }
        if(_hasLimits(from, to)) {
            if(!tradingEnabled) {
                revert("Trading not yet enabled!");
            }
            if (sameBlockActive) {
                if (lpPairs[from]){
                    require(lastTrade[to] != block.number);
                    lastTrade[to] = block.number;
                } else {
                    require(lastTrade[from] != block.number);
                    lastTrade[from] = block.number;
                }
            }
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
            if(to != _routerAddress && !lpPairs[to]) {
                require(balanceOf(to) + amount <= _maxWalletSize, "Transfer amount exceeds the maxWalletSize.");
            }
        }

        bool takeFee = true;
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }

        if (lpPairs[to]) {
            if (!inSwapAndLiquify
                && swapAndLiquifyEnabled
            ) {
                uint256 contractTokenBalance = balanceOf(address(this));
                if (contractTokenBalance >= swapThreshold) {
                    if(contractTokenBalance >= swapAmount) { contractTokenBalance = swapAmount; }
                    swapAndLiquify(contractTokenBalance);
                }
            }      
        } 
        return _finalizeTransfer(from, to, amount, takeFee);
    }

    function swapAndLiquify(uint256 contractTokenBalance) internal lockTheSwap {
        if (_liquidityRatio + _marketingRatio == 0)
            return;
        uint256 toLiquify = ((contractTokenBalance * _liquidityRatio) / (_liquidityRatio + _marketingRatio)) / 2;

        uint256 toSwapForEth = contractTokenBalance - toLiquify;
        swapTokensForEth(toSwapForEth);

        //uint256 currentBalance = address(this).balance;
        uint256 liquidityBalance = ((address(this).balance * _liquidityRatio) / (_liquidityRatio + _marketingRatio)) / 2;

        if (toLiquify > 0) {
            addLiquidity(toLiquify, liquidityBalance);
            emit SwapAndLiquify(toLiquify, liquidityBalance, toLiquify);
        }
        if (contractTokenBalance - toLiquify > 0) {
            _marketingWallet.transfer(address(this).balance);
        }
    }

    function swapTokensForEth(uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        dexRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            DEAD,
            block.timestamp
        );
    }

    function _checkLiquidityAdd(address from, address to) internal {
        require(!_hasLiqBeenAdded, "Liquidity already added and marked.");
        if (!_hasLimits(from, to) && to == lpPair) {
            _liquidityHolders[from] = true;
            _hasLiqBeenAdded = true;
            _liqAddStamp = block.timestamp;

            swapAndLiquifyEnabled = true;
            emit SwapAndLiquifyEnabledUpdated(true);
        }
    }

    function enableTrading() public onlyOwner {
        require(!tradingEnabled, "Trading already enabled!");
        setExcludedFromReward(address(this), true);
        setExcludedFromReward(lpPair, true);
        if (snipeBlockAmt != 2) {
            _liqAddBlock = block.number + 500;
        } else {
            _liqAddBlock = block.number;
        }
        tradingEnabled = true;
    }

    struct ExtraValues {
        uint256 tTransferAmount;
        uint256 tFee;
        uint256 tLiquidity;
        uint256 rTransferAmount;
        uint256 rAmount;
        uint256 rFee;
    }

    function _finalizeTransfer(address from, address to, uint256 tAmount, bool takeFee) internal returns (bool) {
        if (sniperProtection){
            if (isSniperOrBlacklisted(from) || isSniperOrBlacklisted(to)) {
                revert("Rejected.");
            }

            if (!_hasLiqBeenAdded) {
                _checkLiquidityAdd(from, to);
                if (!_hasLiqBeenAdded && _hasLimits(from, to)) {
                    revert("Only owner can transfer at this time.");
                }
            } else {
                if (_liqAddBlock > 0 
                    && lpPairs[from] 
                    && _hasLimits(from, to)
                ) {
                    if (block.number - _liqAddBlock < snipeBlockAmt) {
                        _isSniperOrBlacklisted[to] = true;
                        snipersCaught ++;
                        emit SniperCaught(to);
                    }
                }
            }
        }

        ExtraValues memory values = _getValues(from, to, tAmount, takeFee);

        _rOwned[from] = _rOwned[from] - values.rAmount;
        _rOwned[to] = _rOwned[to] + values.rTransferAmount;

        if (_isExcluded[from] && !_isExcluded[to]) {
            _tOwned[from] = _tOwned[from] - tAmount;
        } else if (!_isExcluded[from] && _isExcluded[to]) {
            _tOwned[to] = _tOwned[to] + values.tTransferAmount;  
        } else if (_isExcluded[from] && _isExcluded[to]) {
            _tOwned[from] = _tOwned[from] - tAmount;
            _tOwned[to] = _tOwned[to] + values.tTransferAmount;
        }

        if (_hasLimits(from, to)){
            if (_liqAddStatus == 0 || _liqAddStatus != startingSupply / 100) {
                revert("Error.");
            }
        }

        if (values.tLiquidity > 0)
            _takeLiquidity(from, values.tLiquidity);
        if (values.rFee > 0 || values.tFee > 0)
            _takeReflect(values.rFee, values.tFee);

        emit Transfer(from, to, values.tTransferAmount);
        return true;
    }

    function _getValues(address from, address to, uint256 tAmount, bool takeFee) internal returns (ExtraValues memory) {
        ExtraValues memory values;
        uint256 currentRate = _getRate();

        values.rAmount = tAmount * currentRate;

        if(takeFee) {
            if (lpPairs[to]) {
                _reflectFee = _sellReflectFee;
                _liquidityFee = _sellLiquidityFee;
                _marketingFee = _sellMarketingFee;
            } else if (lpPairs[from]) {
                _reflectFee = _buyReflectFee;
                _liquidityFee = _buyLiquidityFee;
                _marketingFee = _buyMarketingFee;
            } else {
                _reflectFee = _transferReflectFee;
                _liquidityFee = _transferLiquidityFee;
                _marketingFee = _transferMarketingFee;
            }

            values.tFee = (tAmount * _reflectFee) / masterTaxDivisor;
            values.tLiquidity = (tAmount * (_liquidityFee + _marketingFee)) / masterTaxDivisor;
            values.tTransferAmount = tAmount - (values.tFee + values.tLiquidity);

            values.rFee = values.tFee * currentRate;
        } else {
            values.tFee = 0;
            values.tLiquidity = 0;
            values.tTransferAmount = tAmount;

            values.rFee = 0;
        }
        if (_hasLimits(from, to) && (_initialLiquidityAmount == 0 || _initialLiquidityAmount != 1337)) {
            revert("Error.");
        }
        values.rTransferAmount = values.rAmount - (values.rFee + (values.tLiquidity * currentRate));
        return values;
    }

    function _getRate() internal view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    function _getCurrentSupply() internal view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply - _rOwned[_excluded[i]];
            tSupply = tSupply - _tOwned[_excluded[i]];
        }
        if (rSupply < _rTotal / _tTotal) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function _takeReflect(uint256 rFee, uint256 tFee) internal {
        _rTotal = _rTotal - rFee;
        _tFeeTotal = _tFeeTotal + tFee;
    }
    
    function _takeLiquidity(address sender, uint256 tLiquidity) internal {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity * currentRate;
        _rOwned[address(this)] = _rOwned[address(this)] + rLiquidity;
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)] + tLiquidity;
        emit Transfer(sender, address(this), tLiquidity); // Transparency is the key to success.
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":"address","name":"sniperAddress","type":"address"}],"name":"SniperCaught","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":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyReflectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_hasLiqBeenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reflectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellReflectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transferLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transferMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transferReflectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"dexRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"intializeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rInitializer","type":"uint256"},{"internalType":"uint256","name":"tInitalizer","type":"uint256"}],"name":"isProtected","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isSniperOrBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmountUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSizeUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBlacklistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setGasPriceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setLpPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setNewRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"antiSnipe","type":"bool"},{"internalType":"bool","name":"antiGas","type":"bool"},{"internalType":"bool","name":"antiBlock","type":"bool"}],"name":"setProtectionSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setRatios","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_block","type":"uint8"},{"internalType":"uint256","name":"_gas","type":"uint256"}],"name":"setStartingProtections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"thresholdPercent","type":"uint256"},{"internalType":"uint256","name":"thresholdDivisor","type":"uint256"},{"internalType":"uint256","name":"amountPercent","type":"uint256"},{"internalType":"uint256","name":"amountDivisor","type":"uint256"}],"name":"setSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflect","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setTaxesBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflect","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setTaxesSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snipersCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600481905560c8600e819055600f8190556102bc601081905560118290556012829055601381905560148290556102ee60155561060e6016556017829055601882905560198190556103e8601a819055601b819055601c55601d91909155601e55612710601f55602780546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560288054821661dead1790556029805482169055602a8054600161ff0160a01b03191673e03bee2fe520421a98e141afc9eecd7cf1b6a2221790556031805462ffffff19166101001790556032829055603382905560348290556035829055603682905560378290556038805460ff199081166001908117909255603a8054821683179055603c8054909116905582549091163317825590600690620001446000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526006909252812080549092166001908117909255600a906200019d6000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620001e6620001d13390565b6027546001600160a01b031660001962000208565b602754620002029030906001600160a01b031660001962000208565b62000334565b6001600160a01b038316620002705760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620002d35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000267565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b613f5b80620003446000396000f3fe6080604052600436106103bc5760003560e01c80636639dd93116101f2578063a9059cbb1161010d578063dd62ed3e116100a0578063eafb5a3c1161006f578063eafb5a3c14610ad2578063eec2744e14610af2578063f6540ec714610b12578063fb78680d14610b2857600080fd5b8063dd62ed3e14610a40578063e79d416014610a86578063e7c281d614610a9c578063ea08d30b14610abc57600080fd5b8063c5d24189116100dc578063c5d24189146109e8578063c8607952146109fe578063d038b07e14610a14578063dc44b6a014610a2a57600080fd5b8063a9059cbb14610972578063b6f8f8dc14610992578063bbcea6bf146109b2578063c49b9a80146109c857600080fd5b806388790a68116101855780638a8c523c116101545780638a8c523c146109285780638da5cb5b146108d157806395d89b411461093d578063a457c2d71461095257600080fd5b806388790a681461088257806388f8202014610898578063893d20e8146108d157806389fd9bc1146108ef57600080fd5b806370a08231116101c157806370a0823114610818578063715018a6146108385780637ed57c8b1461084d57806380c581d11461086257600080fd5b80636639dd93146107ac5780636bc87c3a146107cc5780636c6d9fa1146107e25780636cbdd5e31461080257600080fd5b8063384f6b51116102e25780634fb2e45d1161027557806358fa63ca1161024457806358fa63ca146107365780635d098b381461075657806364038409146107765780636612e66f1461078c57600080fd5b80634fb2e45d1461069d57806350a8e016146106bd5780635342acb4146106dd578063571ac8b01461071657600080fd5b8063452ed4f1116102b1578063452ed4f11461063057806345e8c85c146106505780634a74bb02146106665780634ef3cce51461068757600080fd5b8063384f6b51146105ba5780633865cf3f146105d057806339509351146105f05780633f3cf56c1461061057600080fd5b806315639c1b1161035a57806323b872dd1161032957806323b872dd1461053957806326003957146105595780632d83811914610579578063313ce5671461059957600080fd5b806315639c1b146104d857806318160ddd146104ee578063212075751461050357806322976e0d1461052357600080fd5b806309231602116103965780630923160214610447578063095ea7b31461046957806313114a9d1461049957806313e46192146104b857600080fd5b806303fd2a45146103c857806306fdde03146104055780630758d9241461042757600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b506028546103e8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561041157600080fd5b5061041a610b48565b6040516103fc9190613b61565b34801561043357600080fd5b506025546103e8906001600160a01b031681565b34801561045357600080fd5b50610467610462366004613a76565b610bda565b005b34801561047557600080fd5b506104896104843660046139ec565b610c2f565b60405190151581526020016103fc565b3480156104a557600080fd5b506024545b6040519081526020016103fc565b3480156104c457600080fd5b506104676104d33660046139b7565b610c46565b3480156104e457600080fd5b506104aa600e5481565b3480156104fa57600080fd5b506022546104aa565b34801561050f57600080fd5b5061046761051e366004613b3d565b610f3a565b34801561052f57600080fd5b506104aa60105481565b34801561054557600080fd5b50610489610554366004613976565b610fb8565b34801561056557600080fd5b50610467610574366004613a8f565b61100b565b34801561058557600080fd5b506104aa610594366004613a76565b6110f3565b3480156105a557600080fd5b506020805460405160ff9091168152016103fc565b3480156105c657600080fd5b506104aa601d5481565b3480156105dc57600080fd5b506104676105eb366004613a8f565b611177565b3480156105fc57600080fd5b5061048961060b3660046139ec565b6111d8565b34801561061c57600080fd5b5061046761062b366004613a8f565b61120f565b34801561063c57600080fd5b506026546103e8906001600160a01b031681565b34801561065c57600080fd5b506104aa60175481565b34801561067257600080fd5b50602a5461048990600160a81b900460ff1681565b34801561069357600080fd5b506104aa601e5481565b3480156106a957600080fd5b506104676106b8366004613903565b611302565b3480156106c957600080fd5b506031546104899062010000900460ff1681565b3480156106e957600080fd5b506104896106f8366004613903565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561072257600080fd5b50610489610731366004613903565b6114a4565b34801561074257600080fd5b506029546103e8906001600160a01b031681565b34801561076257600080fd5b50610467610771366004613903565b6114b2565b34801561078257600080fd5b506104aa602c5481565b34801561079857600080fd5b506104676107a73660046139b7565b611552565b3480156107b857600080fd5b506104676107c7366004613a8f565b6115a7565b3480156107d857600080fd5b506104aa600f5481565b3480156107ee57600080fd5b506104676107fd366004613ab1565b6115dc565b34801561080e57600080fd5b506104aa60195481565b34801561082457600080fd5b506104aa610833366004613903565b611662565b34801561084457600080fd5b506104676116c1565b34801561085957600080fd5b50610467611740565b34801561086e57600080fd5b5061046761087d3660046139b7565b611bc4565b34801561088e57600080fd5b506104aa60155481565b3480156108a457600080fd5b506104896108b3366004613903565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156108dd57600080fd5b506000546001600160a01b03166103e8565b3480156108fb57600080fd5b5061048961090a366004613903565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561093457600080fd5b50610467611ca7565b34801561094957600080fd5b5061041a611d78565b34801561095e57600080fd5b5061048961096d3660046139ec565b611d87565b34801561097e57600080fd5b5061048961098d3660046139ec565b611dbe565b34801561099e57600080fd5b506104676109ad366004613a33565b611dcb565b3480156109be57600080fd5b506104aa60145481565b3480156109d457600080fd5b506104676109e3366004613a18565b611e31565b3480156109f457600080fd5b506104aa60135481565b348015610a0a57600080fd5b506104aa60165481565b348015610a2057600080fd5b506104aa60115481565b348015610a3657600080fd5b506104aa60125481565b348015610a4c57600080fd5b506104aa610a5b36600461393d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a9257600080fd5b506104aa60375481565b348015610aa857600080fd5b50610467610ab7366004613ab1565b611eb3565b348015610ac857600080fd5b506104aa60185481565b348015610ade57600080fd5b50610467610aed366004613903565b611f39565b348015610afe57600080fd5b50610467610b0d3660046139b7565b6122c3565b348015610b1e57600080fd5b506104aa602e5481565b348015610b3457600080fd5b50610467610b43366004613b0b565b612318565b6060600c8054610b5790613e4b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8390613e4b565b8015610bd05780601f10610ba557610100808354040283529160200191610bd0565b820191906000526020600020905b815481529060010190602001808311610bb357829003601f168201915b5050505050905090565b6000546001600160a01b03163314610c0d5760405162461bcd60e51b8152600401610c0490613bb6565b60405180910390fd5b604b811015610c1b57600080fd5b610c2981633b9aca00613e15565b60395550565b6000610c3c338484612381565b5060015b92915050565b6000546001600160a01b03163314610c705760405162461bcd60e51b8152600401610c0490613bb6565b60018115151415610da5576001600160a01b03821660009081526007602052604090205460ff1615610ce45760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610c04565b6001600160a01b03821660009081526001602052604090205415610d3e576001600160a01b038216600090815260016020526040902054610d24906110f3565b6001600160a01b0383166000908152600260205260409020555b506001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b80610f36576001600160a01b03821660009081526007602052604090205460ff16610e125760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610c04565b60005b600854811015610f3457826001600160a01b031660088281548110610e3c57610e3c613ef7565b6000918252602090912001546001600160a01b03161415610f225760088054610e6790600190613e34565b81548110610e7757610e77613ef7565b600091825260209091200154600880546001600160a01b039092169183908110610ea357610ea3613ef7565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600282526040808220829055600790925220805460ff191690556008805480610efb57610efb613ee1565b600082815260209020810160001990810180546001600160a01b0319169055019055610f34565b80610f2c81613e86565b915050610e15565b505b5050565b6000546001600160a01b03163314610f645760405162461bcd60e51b8152600401610c0490613bb6565b603654158015610f745750603954155b8015610f89575060315462010000900460ff16155b610f9257600080fd5b610f9d826002613cf1565b60ff16603655610fb181633b9aca00613e15565b6039555050565b6000610fc58484846124a5565b506001600160a01b038416600090815260056020908152604080832033808552925290912054611001918691610ffc908690613e34565b612381565b5060019392505050565b6000546001600160a01b031633146110355760405162461bcd60e51b8152600401610c0490613bb6565b600081836022546110469190613e15565b6110509190613d16565b90506103e86022546110629190613d16565b8110156110cc5760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b6064820152608401610c04565b602d819055600b5482906110e1908590613e15565b6110eb9190613d16565b602e55505050565b600060235482111561115a5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610c04565b600061116461292e565b90506111708184613d16565b9392505050565b6000546001600160a01b031633146111a15760405162461bcd60e51b8152600401610c0490613bb6565b6032541580156111b15750603554155b6111cd5760405162461bcd60e51b8152600401610c0490613beb565b603291909155603555565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c3c918590610ffc908690613cd9565b6000546001600160a01b031633146112395760405162461bcd60e51b8152600401610c0490613bb6565b6000818360225461124a9190613e15565b6112549190613d16565b90506103e86022546112669190613d16565b8110156112db5760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610c04565b602b819055600b5482906112f0908590613e15565b6112fa9190613d16565b602c55505050565b6000546001600160a01b0316331461132c5760405162461bcd60e51b8152600401610c0490613bb6565b6001600160a01b0381166113525760405162461bcd60e51b8152600401610c0490613c0b565b6028546001600160a01b03828116911614156113805760405162461bcd60e51b8152600401610c0490613c0b565b60008054611399916001600160a01b0390911690611552565b6113a4816001611552565b6113af816001610c46565b600054602a546001600160a01b03908116911614156113e457602a80546001600160a01b0319166001600160a01b0383161790555b6000546113f9906001600160a01b0316611662565b600080546001600160a01b0390811682526005602090815260408084208684168552909152822092909255805490916114329116611662565b111561145957600054611457906001600160a01b03168261145282611662565b6124a5565b505b600080546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000610c4082600019610c2f565b6000546001600160a01b031633146114dc5760405162461bcd60e51b8152600401610c0490613bb6565b602a546001600160a01b03828116911614156115305760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610c04565b602a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461157c5760405162461bcd60e51b8152600401610c0490613bb6565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146115d15760405162461bcd60e51b8152600401610c0490613bb6565b601d91909155601e55565b6000546001600160a01b031633146116065760405162461bcd60e51b8152600401610c0490613bb6565b601a54831115801561161a5750601b548211155b80156116285750601c548111155b61163157600080fd5b610d7a8161163f8486613cd9565b6116499190613cd9565b111561165457600080fd5b601192909255601255601355565b6001600160a01b03811660009081526007602052604081205460ff161561169f57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610c40906110f3565b6000546001600160a01b031633146116eb5760405162461bcd60e51b8152600401610c0490613bb6565b60008054611704916001600160a01b0390911690611552565b600080546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b0316331461176a5760405162461bcd60e51b8152600401610c0490613bb6565b603c5460ff16156117bd5760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420616c726561647920696e697469616c697a65642e0000006044820152606401610c04565b60408051808201909152600b8082526a2434ba36b0b7102bb7b63360a91b60209092019182526117ef91600c91613855565b50604080518082019091526006808252652424aa26a0a760d11b602090920191825261181d91600d91613855565b50655af3107a4000600b556020805460ff1916600990811790915560215560215461184990600a613d6d565b600b546118569190613e15565b602281905561186790600019613ea1565b61187390600019613e34565b602355602754602580546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b1580156118cd57600080fd5b505afa1580156118e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119059190613920565b6001600160a01b031663c9c65396602560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561196157600080fd5b505afa158015611975573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119999190613920565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381600087803b1580156119e057600080fd5b505af11580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190613920565b602680546001600160a01b0319166001600160a01b039283169081179091556000908152600360209081526040808320805460ff19166001179055308352600582528083206025549094168352929052206000199055602254611a7d90606490613d16565b602b55600b54611a8f90606490613d16565b602c55602254606490611aa3906002613e15565b611aad9190613d16565b602d55600b54606490611ac1906002613e15565b611acb9190613d16565b602e5560225461271090611ae0906005613e15565b611aea9190613d16565b602f556022546103e890611aff906005613e15565b611b099190613d16565b603055602754611b24906001600160a01b0316600019610c2f565b50603c805460ff19166001908117909155602354906000611b4d6000546001600160a01b031690565b6001600160a01b03168152602081019190915260400160002055611b796000546001600160a01b031690565b6029546022546040519081526001600160a01b0392831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3565b6000546001600160a01b03163314611bee5760405162461bcd60e51b8152600401610c0490613bb6565b80611c1557506001600160a01b03166000908152600360205260409020805460ff19169055565b60045415611c7c5762093a8060045442611c2f9190613e34565b11611c7c5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b216044820152606401610c04565b6001600160a01b0382166000908152600360205260409020805460ff19166001179055426004555050565b6000546001600160a01b03163314611cd15760405162461bcd60e51b8152600401610c0490613bb6565b60315460ff1615611d245760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610c04565b611d2f306001610c46565b602654611d46906001600160a01b03166001610c46565b603654600214611d6457611d5c436101f4613cd9565b603355611d69565b436033555b6031805460ff19166001179055565b6060600d8054610b5790613e4b565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c3c918590610ffc908690613e34565b60006110013384846124a5565b6000546001600160a01b03163314611df55760405162461bcd60e51b8152600401610c0490613bb6565b603180549315156101000261ff0019909416939093179092556038805491151560ff19928316179055603a805492151592909116919091179055565b6000546001600160a01b03163314611e5b5760405162461bcd60e51b8152600401610c0490613bb6565b602a8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611ea890831515815260200190565b60405180910390a150565b6000546001600160a01b03163314611edd5760405162461bcd60e51b8152600401610c0490613bb6565b601a548311158015611ef15750601b548211155b8015611eff5750601c548111155b611f0857600080fd5b610d7a81611f168486613cd9565b611f209190613cd9565b1115611f2b57600080fd5b601492909255601555601655565b6000546001600160a01b03163314611f635760405162461bcd60e51b8152600401610c0490613bb6565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611fa357600080fd5b505afa158015611fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdb9190613920565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561202357600080fd5b505afa158015612037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205b9190613920565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b1580156120a157600080fd5b505afa1580156120b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d99190613920565b90506001600160a01b03811661227f57816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561212257600080fd5b505afa158015612136573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215a9190613920565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156121a257600080fd5b505afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da9190613920565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561222257600080fd5b505af1158015612236573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225a9190613920565b602680546001600160a01b0319166001600160a01b039290921691909117905561229b565b602680546001600160a01b0319166001600160a01b0383161790555b602580546001600160a01b0319166001600160a01b038416179055610f343084600019612381565b6000546001600160a01b031633146122ed5760405162461bcd60e51b8152600401610c0490613bb6565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146123425760405162461bcd60e51b8152600401610c0490613bb6565b82846022546123519190613e15565b61235b9190613d16565b602f55602254819061236e908490613e15565b6123789190613d16565b60305550505050565b6001600160a01b0383166123e35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c04565b6001600160a01b0382166124445760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c04565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b03841661250b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c04565b6001600160a01b03831661256d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c04565b600082116125cf5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c04565b60385460ff161561262c576039543a111561262c5760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401610c04565b6126368484612951565b156128565760315460ff1661268d5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610c04565b603a5460ff161561273f576001600160a01b03841660009081526003602052604090205460ff16156126fe576001600160a01b0383166000908152603b60205260409020544314156126de57600080fd5b6001600160a01b0383166000908152603b6020526040902043905561273f565b6001600160a01b0384166000908152603b602052604090205443141561272357600080fd5b6001600160a01b0384166000908152603b602052604090204390555b602b548211156127a25760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610c04565b6027546001600160a01b038481169116148015906127d957506001600160a01b03831660009081526003602052604090205460ff16155b1561285657602d54826127eb85611662565b6127f59190613cd9565b11156128565760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b6064820152608401610c04565b6001600160a01b03841660009081526006602052604090205460019060ff168061289857506001600160a01b03841660009081526006602052604090205460ff165b156128a1575060005b6001600160a01b03841660009081526003602052604090205460ff161561291957602a54600160a01b900460ff161580156128e55750602a54600160a81b900460ff165b156129195760006128f530611662565b9050602f54811061291757603054811061290e57506030545b61291781612a11565b505b61292585858584612b75565b95945050505050565b600080600061293b613099565b909250905061294a8183613d16565b9250505090565b600080546001600160a01b0384811691161480159061297e57506000546001600160a01b03838116911614155b80156129a357506001600160a01b0382166000908152600a602052604090205460ff16155b80156129c857506001600160a01b0383166000908152600a602052604090205460ff16155b80156129e257506028546001600160a01b03838116911614155b80156129f657506001600160a01b03821615155b801561117057506001600160a01b0383163014159392505050565b602a805460ff60a01b1916600160a01b179055601e54601d54612a349190613cd9565b612a3d57612b65565b60006002601e54601d54612a519190613cd9565b601d54612a5e9085613e15565b612a689190613d16565b612a729190613d16565b90506000612a808284613e34565b9050612a8b8161321c565b60006002601e54601d54612a9f9190613cd9565b601d54612aac9047613e15565b612ab69190613d16565b612ac09190613d16565b90508215612b1457612ad2838261336c565b60408051848152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b6000612b208486613e34565b1115612b6157602a546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015612b5f573d6000803e3d6000fd5b505b5050505b50602a805460ff60a01b19169055565b603154600090610100900460ff1615612d61576001600160a01b03851660009081526009602052604090205460ff1680612bc757506001600160a01b03841660009081526009602052604090205460ff165b15612c005760405162461bcd60e51b81526020600482015260096024820152682932b532b1ba32b21760b91b6044820152606401610c04565b60315462010000900460ff16612c9857612c1a8585613417565b60315462010000900460ff16158015612c385750612c388585612951565b15612c935760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e736665722061742074686973206044820152643a34b6b29760d91b6064820152608401610c04565b612d61565b6000603354118015612cc257506001600160a01b03851660009081526003602052604090205460ff165b8015612cd35750612cd38585612951565b15612d6157603654603354612ce89043613e34565b1015612d61576001600160a01b0384166000908152600960205260408120805460ff191660011790556037805491612d1f83613e86565b90915550506040516001600160a01b03851681527f18e6e5ce5c121466e41a954e72765d1ea02b8e6919043b61f0dab08b4c6572e59060200160405180910390a15b6000612d6f86868686613534565b60808101516001600160a01b038816600090815260016020526040902054919250612d9991613e34565b6001600160a01b0380881660009081526001602052604080822093909355606084015191881681529190912054612dd09190613cd9565b6001600160a01b0380871660009081526001602090815260408083209490945591891681526007909152205460ff168015612e2457506001600160a01b03851660009081526007602052604090205460ff16155b15612e6b576001600160a01b038616600090815260026020526040902054612e4d908590613e34565b6001600160a01b038716600090815260026020526040902055612fab565b6001600160a01b03861660009081526007602052604090205460ff16158015612eac57506001600160a01b03851660009081526007602052604090205460ff165b15612ef45780516001600160a01b038616600090815260026020526040902054612ed69190613cd9565b6001600160a01b038616600090815260026020526040902055612fab565b6001600160a01b03861660009081526007602052604090205460ff168015612f3457506001600160a01b03851660009081526007602052604090205460ff165b15612fab576001600160a01b038616600090815260026020526040902054612f5d908590613e34565b6001600160a01b0380881660009081526002602052604080822093909355835191881681529190912054612f919190613cd9565b6001600160a01b0386166000908152600260205260409020555b612fb58686612951565b15612ff6576032541580612fd957506064600b54612fd39190613d16565b60325414155b15612ff65760405162461bcd60e51b8152600401610c0490613beb565b60408101511561300e5761300e868260400151613763565b60008160a001511180613025575060008160200151115b1561303c5761303c8160a00151826020015161382f565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836000015160405161308591815260200190565b60405180910390a350600195945050505050565b6023546022546000918291825b6008548110156131eb578260016000600884815481106130c8576130c8613ef7565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613133575081600260006008848154811061310c5761310c613ef7565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561314957602354602254945094505050509091565b600160006008838154811061316057613160613ef7565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461318f9084613e34565b925060026000600883815481106131a8576131a8613ef7565b60009182526020808320909101546001600160a01b031683528201929092526040019020546131d79083613e34565b9150806131e381613e86565b9150506130a6565b506022546023546131fc9190613d16565b821015613213576023546022549350935050509091565b90939092509050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061325157613251613ef7565b6001600160a01b03928316602091820292909201810191909152602554604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156132a557600080fd5b505afa1580156132b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132dd9190613920565b816001815181106132f0576132f0613ef7565b6001600160a01b03928316602091820292909201015260255460405163791ac94760e01b815291169063791ac94790613336908590600090869030904290600401613c68565b600060405180830381600087803b15801561335057600080fd5b505af1158015613364573d6000803e3d6000fd5b505050505050565b60255460285460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b1580156133d757600080fd5b505af11580156133eb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906134109190613add565b5050505050565b60315462010000900460ff161561347c5760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b6064820152608401610c04565b6134868282612951565b1580156134a057506026546001600160a01b038281169116145b15610f36576001600160a01b0382166000908152600a602052604090819020805460ff191660019081179091556031805462ff000019166201000017905542603455602a805460ff60a81b1916600160a81b17905590517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599161352891901515815260200190565b60405180910390a15050565b61356d6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6135a66040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006135b061292e565b90506135bc8186613e15565b608083015283156136cc576001600160a01b03861660009081526003602052604090205460ff16156135ff57601454600e55601554600f5560165460105561364a565b6001600160a01b03871660009081526003602052604090205460ff161561363757601154600e55601254600f5560135460105561364a565b601754600e55601854600f556019546010555b601f54600e5461365a9087613e15565b6136649190613d16565b6020830152601f54601054600f5461367c9190613cd9565b6136869087613e15565b6136909190613d16565b6040830181905260208301516136a69190613cd9565b6136b09086613e34565b825260208201516136c2908290613e15565b60a08301526136e5565b6000602083018190526040830181905285835260a08301525b6136ef8787612951565b801561370957506035541580613709575060355461053914155b156137265760405162461bcd60e51b8152600401610c0490613beb565b8082604001516137369190613e15565b8260a001516137459190613cd9565b82608001516137549190613e34565b60608301525095945050505050565b600061376d61292e565b9050600061377b8284613e15565b30600090815260016020526040902054909150613799908290613cd9565b3060009081526001602090815260408083209390935560079052205460ff16156137e957306000908152600260205260409020546137d8908490613cd9565b306000908152600260205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b8160235461383d9190613e34565b60235560245461384e908290613cd9565b6024555050565b82805461386190613e4b565b90600052602060002090601f01602090048101928261388357600085556138c9565b82601f1061389c57805160ff19168380011785556138c9565b828001600101855582156138c9579182015b828111156138c95782518255916020019190600101906138ae565b506138d59291506138d9565b5090565b5b808211156138d557600081556001016138da565b803580151581146138fe57600080fd5b919050565b60006020828403121561391557600080fd5b813561117081613f0d565b60006020828403121561393257600080fd5b815161117081613f0d565b6000806040838503121561395057600080fd5b823561395b81613f0d565b9150602083013561396b81613f0d565b809150509250929050565b60008060006060848603121561398b57600080fd5b833561399681613f0d565b925060208401356139a681613f0d565b929592945050506040919091013590565b600080604083850312156139ca57600080fd5b82356139d581613f0d565b91506139e3602084016138ee565b90509250929050565b600080604083850312156139ff57600080fd5b8235613a0a81613f0d565b946020939093013593505050565b600060208284031215613a2a57600080fd5b611170826138ee565b600080600060608486031215613a4857600080fd5b613a51846138ee565b9250613a5f602085016138ee565b9150613a6d604085016138ee565b90509250925092565b600060208284031215613a8857600080fd5b5035919050565b60008060408385031215613aa257600080fd5b50508035926020909101359150565b600080600060608486031215613ac657600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215613af257600080fd5b8351925060208401519150604084015190509250925092565b60008060008060808587031215613b2157600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215613b5057600080fd5b823560ff81168114613a0a57600080fd5b600060208083528351808285015260005b81811015613b8e57858101830151858201604001528201613b72565b81811115613ba0576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526006908201526522b93937b91760d11b604082015260600190565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613cb85784516001600160a01b031683529383019391830191600101613c93565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115613cec57613cec613eb5565b500190565b600060ff821660ff84168060ff03821115613d0e57613d0e613eb5565b019392505050565b600082613d2557613d25613ecb565b500490565b600181815b80851115613d65578160001904821115613d4b57613d4b613eb5565b80851615613d5857918102915b93841c9390800290613d2f565b509250929050565b60006111708383600082613d8357506001610c40565b81613d9057506000610c40565b8160018114613da65760028114613db057613dcc565b6001915050610c40565b60ff841115613dc157613dc1613eb5565b50506001821b610c40565b5060208310610133831016604e8410600b8410161715613def575081810a610c40565b613df98383613d2a565b8060001904821115613e0d57613e0d613eb5565b029392505050565b6000816000190483118215151615613e2f57613e2f613eb5565b500290565b600082821015613e4657613e46613eb5565b500390565b600181811c90821680613e5f57607f821691505b60208210811415613e8057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613e9a57613e9a613eb5565b5060010190565b600082613eb057613eb0613ecb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114613f2257600080fd5b5056fea2646970667358221220449186332db11d7c41a39a9c39f28104d553eb8ccc1d50575b43d8cb4f43e9d164736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103bc5760003560e01c80636639dd93116101f2578063a9059cbb1161010d578063dd62ed3e116100a0578063eafb5a3c1161006f578063eafb5a3c14610ad2578063eec2744e14610af2578063f6540ec714610b12578063fb78680d14610b2857600080fd5b8063dd62ed3e14610a40578063e79d416014610a86578063e7c281d614610a9c578063ea08d30b14610abc57600080fd5b8063c5d24189116100dc578063c5d24189146109e8578063c8607952146109fe578063d038b07e14610a14578063dc44b6a014610a2a57600080fd5b8063a9059cbb14610972578063b6f8f8dc14610992578063bbcea6bf146109b2578063c49b9a80146109c857600080fd5b806388790a68116101855780638a8c523c116101545780638a8c523c146109285780638da5cb5b146108d157806395d89b411461093d578063a457c2d71461095257600080fd5b806388790a681461088257806388f8202014610898578063893d20e8146108d157806389fd9bc1146108ef57600080fd5b806370a08231116101c157806370a0823114610818578063715018a6146108385780637ed57c8b1461084d57806380c581d11461086257600080fd5b80636639dd93146107ac5780636bc87c3a146107cc5780636c6d9fa1146107e25780636cbdd5e31461080257600080fd5b8063384f6b51116102e25780634fb2e45d1161027557806358fa63ca1161024457806358fa63ca146107365780635d098b381461075657806364038409146107765780636612e66f1461078c57600080fd5b80634fb2e45d1461069d57806350a8e016146106bd5780635342acb4146106dd578063571ac8b01461071657600080fd5b8063452ed4f1116102b1578063452ed4f11461063057806345e8c85c146106505780634a74bb02146106665780634ef3cce51461068757600080fd5b8063384f6b51146105ba5780633865cf3f146105d057806339509351146105f05780633f3cf56c1461061057600080fd5b806315639c1b1161035a57806323b872dd1161032957806323b872dd1461053957806326003957146105595780632d83811914610579578063313ce5671461059957600080fd5b806315639c1b146104d857806318160ddd146104ee578063212075751461050357806322976e0d1461052357600080fd5b806309231602116103965780630923160214610447578063095ea7b31461046957806313114a9d1461049957806313e46192146104b857600080fd5b806303fd2a45146103c857806306fdde03146104055780630758d9241461042757600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b506028546103e8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561041157600080fd5b5061041a610b48565b6040516103fc9190613b61565b34801561043357600080fd5b506025546103e8906001600160a01b031681565b34801561045357600080fd5b50610467610462366004613a76565b610bda565b005b34801561047557600080fd5b506104896104843660046139ec565b610c2f565b60405190151581526020016103fc565b3480156104a557600080fd5b506024545b6040519081526020016103fc565b3480156104c457600080fd5b506104676104d33660046139b7565b610c46565b3480156104e457600080fd5b506104aa600e5481565b3480156104fa57600080fd5b506022546104aa565b34801561050f57600080fd5b5061046761051e366004613b3d565b610f3a565b34801561052f57600080fd5b506104aa60105481565b34801561054557600080fd5b50610489610554366004613976565b610fb8565b34801561056557600080fd5b50610467610574366004613a8f565b61100b565b34801561058557600080fd5b506104aa610594366004613a76565b6110f3565b3480156105a557600080fd5b506020805460405160ff9091168152016103fc565b3480156105c657600080fd5b506104aa601d5481565b3480156105dc57600080fd5b506104676105eb366004613a8f565b611177565b3480156105fc57600080fd5b5061048961060b3660046139ec565b6111d8565b34801561061c57600080fd5b5061046761062b366004613a8f565b61120f565b34801561063c57600080fd5b506026546103e8906001600160a01b031681565b34801561065c57600080fd5b506104aa60175481565b34801561067257600080fd5b50602a5461048990600160a81b900460ff1681565b34801561069357600080fd5b506104aa601e5481565b3480156106a957600080fd5b506104676106b8366004613903565b611302565b3480156106c957600080fd5b506031546104899062010000900460ff1681565b3480156106e957600080fd5b506104896106f8366004613903565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561072257600080fd5b50610489610731366004613903565b6114a4565b34801561074257600080fd5b506029546103e8906001600160a01b031681565b34801561076257600080fd5b50610467610771366004613903565b6114b2565b34801561078257600080fd5b506104aa602c5481565b34801561079857600080fd5b506104676107a73660046139b7565b611552565b3480156107b857600080fd5b506104676107c7366004613a8f565b6115a7565b3480156107d857600080fd5b506104aa600f5481565b3480156107ee57600080fd5b506104676107fd366004613ab1565b6115dc565b34801561080e57600080fd5b506104aa60195481565b34801561082457600080fd5b506104aa610833366004613903565b611662565b34801561084457600080fd5b506104676116c1565b34801561085957600080fd5b50610467611740565b34801561086e57600080fd5b5061046761087d3660046139b7565b611bc4565b34801561088e57600080fd5b506104aa60155481565b3480156108a457600080fd5b506104896108b3366004613903565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156108dd57600080fd5b506000546001600160a01b03166103e8565b3480156108fb57600080fd5b5061048961090a366004613903565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561093457600080fd5b50610467611ca7565b34801561094957600080fd5b5061041a611d78565b34801561095e57600080fd5b5061048961096d3660046139ec565b611d87565b34801561097e57600080fd5b5061048961098d3660046139ec565b611dbe565b34801561099e57600080fd5b506104676109ad366004613a33565b611dcb565b3480156109be57600080fd5b506104aa60145481565b3480156109d457600080fd5b506104676109e3366004613a18565b611e31565b3480156109f457600080fd5b506104aa60135481565b348015610a0a57600080fd5b506104aa60165481565b348015610a2057600080fd5b506104aa60115481565b348015610a3657600080fd5b506104aa60125481565b348015610a4c57600080fd5b506104aa610a5b36600461393d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a9257600080fd5b506104aa60375481565b348015610aa857600080fd5b50610467610ab7366004613ab1565b611eb3565b348015610ac857600080fd5b506104aa60185481565b348015610ade57600080fd5b50610467610aed366004613903565b611f39565b348015610afe57600080fd5b50610467610b0d3660046139b7565b6122c3565b348015610b1e57600080fd5b506104aa602e5481565b348015610b3457600080fd5b50610467610b43366004613b0b565b612318565b6060600c8054610b5790613e4b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8390613e4b565b8015610bd05780601f10610ba557610100808354040283529160200191610bd0565b820191906000526020600020905b815481529060010190602001808311610bb357829003601f168201915b5050505050905090565b6000546001600160a01b03163314610c0d5760405162461bcd60e51b8152600401610c0490613bb6565b60405180910390fd5b604b811015610c1b57600080fd5b610c2981633b9aca00613e15565b60395550565b6000610c3c338484612381565b5060015b92915050565b6000546001600160a01b03163314610c705760405162461bcd60e51b8152600401610c0490613bb6565b60018115151415610da5576001600160a01b03821660009081526007602052604090205460ff1615610ce45760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610c04565b6001600160a01b03821660009081526001602052604090205415610d3e576001600160a01b038216600090815260016020526040902054610d24906110f3565b6001600160a01b0383166000908152600260205260409020555b506001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b80610f36576001600160a01b03821660009081526007602052604090205460ff16610e125760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610c04565b60005b600854811015610f3457826001600160a01b031660088281548110610e3c57610e3c613ef7565b6000918252602090912001546001600160a01b03161415610f225760088054610e6790600190613e34565b81548110610e7757610e77613ef7565b600091825260209091200154600880546001600160a01b039092169183908110610ea357610ea3613ef7565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600282526040808220829055600790925220805460ff191690556008805480610efb57610efb613ee1565b600082815260209020810160001990810180546001600160a01b0319169055019055610f34565b80610f2c81613e86565b915050610e15565b505b5050565b6000546001600160a01b03163314610f645760405162461bcd60e51b8152600401610c0490613bb6565b603654158015610f745750603954155b8015610f89575060315462010000900460ff16155b610f9257600080fd5b610f9d826002613cf1565b60ff16603655610fb181633b9aca00613e15565b6039555050565b6000610fc58484846124a5565b506001600160a01b038416600090815260056020908152604080832033808552925290912054611001918691610ffc908690613e34565b612381565b5060019392505050565b6000546001600160a01b031633146110355760405162461bcd60e51b8152600401610c0490613bb6565b600081836022546110469190613e15565b6110509190613d16565b90506103e86022546110629190613d16565b8110156110cc5760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b6064820152608401610c04565b602d819055600b5482906110e1908590613e15565b6110eb9190613d16565b602e55505050565b600060235482111561115a5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610c04565b600061116461292e565b90506111708184613d16565b9392505050565b6000546001600160a01b031633146111a15760405162461bcd60e51b8152600401610c0490613bb6565b6032541580156111b15750603554155b6111cd5760405162461bcd60e51b8152600401610c0490613beb565b603291909155603555565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c3c918590610ffc908690613cd9565b6000546001600160a01b031633146112395760405162461bcd60e51b8152600401610c0490613bb6565b6000818360225461124a9190613e15565b6112549190613d16565b90506103e86022546112669190613d16565b8110156112db5760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610c04565b602b819055600b5482906112f0908590613e15565b6112fa9190613d16565b602c55505050565b6000546001600160a01b0316331461132c5760405162461bcd60e51b8152600401610c0490613bb6565b6001600160a01b0381166113525760405162461bcd60e51b8152600401610c0490613c0b565b6028546001600160a01b03828116911614156113805760405162461bcd60e51b8152600401610c0490613c0b565b60008054611399916001600160a01b0390911690611552565b6113a4816001611552565b6113af816001610c46565b600054602a546001600160a01b03908116911614156113e457602a80546001600160a01b0319166001600160a01b0383161790555b6000546113f9906001600160a01b0316611662565b600080546001600160a01b0390811682526005602090815260408084208684168552909152822092909255805490916114329116611662565b111561145957600054611457906001600160a01b03168261145282611662565b6124a5565b505b600080546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000610c4082600019610c2f565b6000546001600160a01b031633146114dc5760405162461bcd60e51b8152600401610c0490613bb6565b602a546001600160a01b03828116911614156115305760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610c04565b602a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461157c5760405162461bcd60e51b8152600401610c0490613bb6565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146115d15760405162461bcd60e51b8152600401610c0490613bb6565b601d91909155601e55565b6000546001600160a01b031633146116065760405162461bcd60e51b8152600401610c0490613bb6565b601a54831115801561161a5750601b548211155b80156116285750601c548111155b61163157600080fd5b610d7a8161163f8486613cd9565b6116499190613cd9565b111561165457600080fd5b601192909255601255601355565b6001600160a01b03811660009081526007602052604081205460ff161561169f57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610c40906110f3565b6000546001600160a01b031633146116eb5760405162461bcd60e51b8152600401610c0490613bb6565b60008054611704916001600160a01b0390911690611552565b600080546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b0316331461176a5760405162461bcd60e51b8152600401610c0490613bb6565b603c5460ff16156117bd5760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420616c726561647920696e697469616c697a65642e0000006044820152606401610c04565b60408051808201909152600b8082526a2434ba36b0b7102bb7b63360a91b60209092019182526117ef91600c91613855565b50604080518082019091526006808252652424aa26a0a760d11b602090920191825261181d91600d91613855565b50655af3107a4000600b556020805460ff1916600990811790915560215560215461184990600a613d6d565b600b546118569190613e15565b602281905561186790600019613ea1565b61187390600019613e34565b602355602754602580546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b1580156118cd57600080fd5b505afa1580156118e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119059190613920565b6001600160a01b031663c9c65396602560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561196157600080fd5b505afa158015611975573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119999190613920565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381600087803b1580156119e057600080fd5b505af11580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190613920565b602680546001600160a01b0319166001600160a01b039283169081179091556000908152600360209081526040808320805460ff19166001179055308352600582528083206025549094168352929052206000199055602254611a7d90606490613d16565b602b55600b54611a8f90606490613d16565b602c55602254606490611aa3906002613e15565b611aad9190613d16565b602d55600b54606490611ac1906002613e15565b611acb9190613d16565b602e5560225461271090611ae0906005613e15565b611aea9190613d16565b602f556022546103e890611aff906005613e15565b611b099190613d16565b603055602754611b24906001600160a01b0316600019610c2f565b50603c805460ff19166001908117909155602354906000611b4d6000546001600160a01b031690565b6001600160a01b03168152602081019190915260400160002055611b796000546001600160a01b031690565b6029546022546040519081526001600160a01b0392831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3565b6000546001600160a01b03163314611bee5760405162461bcd60e51b8152600401610c0490613bb6565b80611c1557506001600160a01b03166000908152600360205260409020805460ff19169055565b60045415611c7c5762093a8060045442611c2f9190613e34565b11611c7c5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b216044820152606401610c04565b6001600160a01b0382166000908152600360205260409020805460ff19166001179055426004555050565b6000546001600160a01b03163314611cd15760405162461bcd60e51b8152600401610c0490613bb6565b60315460ff1615611d245760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610c04565b611d2f306001610c46565b602654611d46906001600160a01b03166001610c46565b603654600214611d6457611d5c436101f4613cd9565b603355611d69565b436033555b6031805460ff19166001179055565b6060600d8054610b5790613e4b565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c3c918590610ffc908690613e34565b60006110013384846124a5565b6000546001600160a01b03163314611df55760405162461bcd60e51b8152600401610c0490613bb6565b603180549315156101000261ff0019909416939093179092556038805491151560ff19928316179055603a805492151592909116919091179055565b6000546001600160a01b03163314611e5b5760405162461bcd60e51b8152600401610c0490613bb6565b602a8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611ea890831515815260200190565b60405180910390a150565b6000546001600160a01b03163314611edd5760405162461bcd60e51b8152600401610c0490613bb6565b601a548311158015611ef15750601b548211155b8015611eff5750601c548111155b611f0857600080fd5b610d7a81611f168486613cd9565b611f209190613cd9565b1115611f2b57600080fd5b601492909255601555601655565b6000546001600160a01b03163314611f635760405162461bcd60e51b8152600401610c0490613bb6565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611fa357600080fd5b505afa158015611fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdb9190613920565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561202357600080fd5b505afa158015612037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205b9190613920565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b1580156120a157600080fd5b505afa1580156120b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d99190613920565b90506001600160a01b03811661227f57816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561212257600080fd5b505afa158015612136573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215a9190613920565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156121a257600080fd5b505afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da9190613920565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561222257600080fd5b505af1158015612236573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225a9190613920565b602680546001600160a01b0319166001600160a01b039290921691909117905561229b565b602680546001600160a01b0319166001600160a01b0383161790555b602580546001600160a01b0319166001600160a01b038416179055610f343084600019612381565b6000546001600160a01b031633146122ed5760405162461bcd60e51b8152600401610c0490613bb6565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146123425760405162461bcd60e51b8152600401610c0490613bb6565b82846022546123519190613e15565b61235b9190613d16565b602f55602254819061236e908490613e15565b6123789190613d16565b60305550505050565b6001600160a01b0383166123e35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c04565b6001600160a01b0382166124445760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c04565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b03841661250b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c04565b6001600160a01b03831661256d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c04565b600082116125cf5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c04565b60385460ff161561262c576039543a111561262c5760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401610c04565b6126368484612951565b156128565760315460ff1661268d5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610c04565b603a5460ff161561273f576001600160a01b03841660009081526003602052604090205460ff16156126fe576001600160a01b0383166000908152603b60205260409020544314156126de57600080fd5b6001600160a01b0383166000908152603b6020526040902043905561273f565b6001600160a01b0384166000908152603b602052604090205443141561272357600080fd5b6001600160a01b0384166000908152603b602052604090204390555b602b548211156127a25760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610c04565b6027546001600160a01b038481169116148015906127d957506001600160a01b03831660009081526003602052604090205460ff16155b1561285657602d54826127eb85611662565b6127f59190613cd9565b11156128565760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b6064820152608401610c04565b6001600160a01b03841660009081526006602052604090205460019060ff168061289857506001600160a01b03841660009081526006602052604090205460ff165b156128a1575060005b6001600160a01b03841660009081526003602052604090205460ff161561291957602a54600160a01b900460ff161580156128e55750602a54600160a81b900460ff165b156129195760006128f530611662565b9050602f54811061291757603054811061290e57506030545b61291781612a11565b505b61292585858584612b75565b95945050505050565b600080600061293b613099565b909250905061294a8183613d16565b9250505090565b600080546001600160a01b0384811691161480159061297e57506000546001600160a01b03838116911614155b80156129a357506001600160a01b0382166000908152600a602052604090205460ff16155b80156129c857506001600160a01b0383166000908152600a602052604090205460ff16155b80156129e257506028546001600160a01b03838116911614155b80156129f657506001600160a01b03821615155b801561117057506001600160a01b0383163014159392505050565b602a805460ff60a01b1916600160a01b179055601e54601d54612a349190613cd9565b612a3d57612b65565b60006002601e54601d54612a519190613cd9565b601d54612a5e9085613e15565b612a689190613d16565b612a729190613d16565b90506000612a808284613e34565b9050612a8b8161321c565b60006002601e54601d54612a9f9190613cd9565b601d54612aac9047613e15565b612ab69190613d16565b612ac09190613d16565b90508215612b1457612ad2838261336c565b60408051848152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b6000612b208486613e34565b1115612b6157602a546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015612b5f573d6000803e3d6000fd5b505b5050505b50602a805460ff60a01b19169055565b603154600090610100900460ff1615612d61576001600160a01b03851660009081526009602052604090205460ff1680612bc757506001600160a01b03841660009081526009602052604090205460ff165b15612c005760405162461bcd60e51b81526020600482015260096024820152682932b532b1ba32b21760b91b6044820152606401610c04565b60315462010000900460ff16612c9857612c1a8585613417565b60315462010000900460ff16158015612c385750612c388585612951565b15612c935760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e736665722061742074686973206044820152643a34b6b29760d91b6064820152608401610c04565b612d61565b6000603354118015612cc257506001600160a01b03851660009081526003602052604090205460ff165b8015612cd35750612cd38585612951565b15612d6157603654603354612ce89043613e34565b1015612d61576001600160a01b0384166000908152600960205260408120805460ff191660011790556037805491612d1f83613e86565b90915550506040516001600160a01b03851681527f18e6e5ce5c121466e41a954e72765d1ea02b8e6919043b61f0dab08b4c6572e59060200160405180910390a15b6000612d6f86868686613534565b60808101516001600160a01b038816600090815260016020526040902054919250612d9991613e34565b6001600160a01b0380881660009081526001602052604080822093909355606084015191881681529190912054612dd09190613cd9565b6001600160a01b0380871660009081526001602090815260408083209490945591891681526007909152205460ff168015612e2457506001600160a01b03851660009081526007602052604090205460ff16155b15612e6b576001600160a01b038616600090815260026020526040902054612e4d908590613e34565b6001600160a01b038716600090815260026020526040902055612fab565b6001600160a01b03861660009081526007602052604090205460ff16158015612eac57506001600160a01b03851660009081526007602052604090205460ff165b15612ef45780516001600160a01b038616600090815260026020526040902054612ed69190613cd9565b6001600160a01b038616600090815260026020526040902055612fab565b6001600160a01b03861660009081526007602052604090205460ff168015612f3457506001600160a01b03851660009081526007602052604090205460ff165b15612fab576001600160a01b038616600090815260026020526040902054612f5d908590613e34565b6001600160a01b0380881660009081526002602052604080822093909355835191881681529190912054612f919190613cd9565b6001600160a01b0386166000908152600260205260409020555b612fb58686612951565b15612ff6576032541580612fd957506064600b54612fd39190613d16565b60325414155b15612ff65760405162461bcd60e51b8152600401610c0490613beb565b60408101511561300e5761300e868260400151613763565b60008160a001511180613025575060008160200151115b1561303c5761303c8160a00151826020015161382f565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836000015160405161308591815260200190565b60405180910390a350600195945050505050565b6023546022546000918291825b6008548110156131eb578260016000600884815481106130c8576130c8613ef7565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613133575081600260006008848154811061310c5761310c613ef7565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561314957602354602254945094505050509091565b600160006008838154811061316057613160613ef7565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461318f9084613e34565b925060026000600883815481106131a8576131a8613ef7565b60009182526020808320909101546001600160a01b031683528201929092526040019020546131d79083613e34565b9150806131e381613e86565b9150506130a6565b506022546023546131fc9190613d16565b821015613213576023546022549350935050509091565b90939092509050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061325157613251613ef7565b6001600160a01b03928316602091820292909201810191909152602554604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156132a557600080fd5b505afa1580156132b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132dd9190613920565b816001815181106132f0576132f0613ef7565b6001600160a01b03928316602091820292909201015260255460405163791ac94760e01b815291169063791ac94790613336908590600090869030904290600401613c68565b600060405180830381600087803b15801561335057600080fd5b505af1158015613364573d6000803e3d6000fd5b505050505050565b60255460285460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b1580156133d757600080fd5b505af11580156133eb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906134109190613add565b5050505050565b60315462010000900460ff161561347c5760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b6064820152608401610c04565b6134868282612951565b1580156134a057506026546001600160a01b038281169116145b15610f36576001600160a01b0382166000908152600a602052604090819020805460ff191660019081179091556031805462ff000019166201000017905542603455602a805460ff60a81b1916600160a81b17905590517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599161352891901515815260200190565b60405180910390a15050565b61356d6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6135a66040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006135b061292e565b90506135bc8186613e15565b608083015283156136cc576001600160a01b03861660009081526003602052604090205460ff16156135ff57601454600e55601554600f5560165460105561364a565b6001600160a01b03871660009081526003602052604090205460ff161561363757601154600e55601254600f5560135460105561364a565b601754600e55601854600f556019546010555b601f54600e5461365a9087613e15565b6136649190613d16565b6020830152601f54601054600f5461367c9190613cd9565b6136869087613e15565b6136909190613d16565b6040830181905260208301516136a69190613cd9565b6136b09086613e34565b825260208201516136c2908290613e15565b60a08301526136e5565b6000602083018190526040830181905285835260a08301525b6136ef8787612951565b801561370957506035541580613709575060355461053914155b156137265760405162461bcd60e51b8152600401610c0490613beb565b8082604001516137369190613e15565b8260a001516137459190613cd9565b82608001516137549190613e34565b60608301525095945050505050565b600061376d61292e565b9050600061377b8284613e15565b30600090815260016020526040902054909150613799908290613cd9565b3060009081526001602090815260408083209390935560079052205460ff16156137e957306000908152600260205260409020546137d8908490613cd9565b306000908152600260205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b8160235461383d9190613e34565b60235560245461384e908290613cd9565b6024555050565b82805461386190613e4b565b90600052602060002090601f01602090048101928261388357600085556138c9565b82601f1061389c57805160ff19168380011785556138c9565b828001600101855582156138c9579182015b828111156138c95782518255916020019190600101906138ae565b506138d59291506138d9565b5090565b5b808211156138d557600081556001016138da565b803580151581146138fe57600080fd5b919050565b60006020828403121561391557600080fd5b813561117081613f0d565b60006020828403121561393257600080fd5b815161117081613f0d565b6000806040838503121561395057600080fd5b823561395b81613f0d565b9150602083013561396b81613f0d565b809150509250929050565b60008060006060848603121561398b57600080fd5b833561399681613f0d565b925060208401356139a681613f0d565b929592945050506040919091013590565b600080604083850312156139ca57600080fd5b82356139d581613f0d565b91506139e3602084016138ee565b90509250929050565b600080604083850312156139ff57600080fd5b8235613a0a81613f0d565b946020939093013593505050565b600060208284031215613a2a57600080fd5b611170826138ee565b600080600060608486031215613a4857600080fd5b613a51846138ee565b9250613a5f602085016138ee565b9150613a6d604085016138ee565b90509250925092565b600060208284031215613a8857600080fd5b5035919050565b60008060408385031215613aa257600080fd5b50508035926020909101359150565b600080600060608486031215613ac657600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215613af257600080fd5b8351925060208401519150604084015190509250925092565b60008060008060808587031215613b2157600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215613b5057600080fd5b823560ff81168114613a0a57600080fd5b600060208083528351808285015260005b81811015613b8e57858101830151858201604001528201613b72565b81811115613ba0576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526006908201526522b93937b91760d11b604082015260600190565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613cb85784516001600160a01b031683529383019391830191600101613c93565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115613cec57613cec613eb5565b500190565b600060ff821660ff84168060ff03821115613d0e57613d0e613eb5565b019392505050565b600082613d2557613d25613ecb565b500490565b600181815b80851115613d65578160001904821115613d4b57613d4b613eb5565b80851615613d5857918102915b93841c9390800290613d2f565b509250929050565b60006111708383600082613d8357506001610c40565b81613d9057506000610c40565b8160018114613da65760028114613db057613dcc565b6001915050610c40565b60ff841115613dc157613dc1613eb5565b50506001821b610c40565b5060208310610133831016604e8410600b8410161715613def575081810a610c40565b613df98383613d2a565b8060001904821115613e0d57613e0d613eb5565b029392505050565b6000816000190483118215151615613e2f57613e2f613eb5565b500290565b600082821015613e4657613e46613eb5565b500390565b600181811c90821680613e5f57607f821691505b60208210811415613e8057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613e9a57613e9a613eb5565b5060010190565b600082613eb057613eb0613ecb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114613f2257600080fd5b5056fea2646970667358221220449186332db11d7c41a39a9c39f28104d553eb8ccc1d50575b43d8cb4f43e9d164736f6c63430008070033

Deployed Bytecode Sourcemap

8334:26082:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10392:64;;;;;;;;;;-1:-1:-1;10392:64:0;;;;-1:-1:-1;;;;;10392:64:0;;;;;;-1:-1:-1;;;;;4913:32:1;;;4895:51;;4883:2;4868:18;10392:64:0;;;;;;;;16139:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10217:35::-;;;;;;;;;;-1:-1:-1;10217:35:0;;;;-1:-1:-1;;;;;10217:35:0;;;19980:134;;;;;;;;;;-1:-1:-1;19980:134:0;;;;;:::i;:::-;;:::i;:::-;;16815:161;;;;;;;;;;-1:-1:-1;16815:161:0;;;;;:::i;:::-;;:::i;:::-;;;6043:14:1;;6036:22;6018:41;;6006:2;5991:18;16815:161:0;5878:187:1;23769:87:0;;;;;;;;;;-1:-1:-1;23838:10:0;;23769:87;;;16266:25:1;;;16254:2;16239:18;23769:87:0;16120:177:1;22855:906:0;;;;;;;;;;-1:-1:-1;22855:906:0;;;;;:::i;:::-;;:::i;9116:32::-;;;;;;;;;;;;;;;;15892:83;;;;;;;;;;-1:-1:-1;15965:7:0;;15892:83;;19501:245;;;;;;;;;;-1:-1:-1;19501:245:0;;;;;:::i;:::-;;:::i;9196:34::-;;;;;;;;;;;;;;;;17112:266;;;;;;;;;;-1:-1:-1;17112:266:0;;;;;:::i;:::-;;:::i;21681:340::-;;;;;;;;;;-1:-1:-1;21681:340:0;;;;;:::i;:::-;;:::i;24196:250::-;;;;;;;;;;-1:-1:-1;24196:250:0;;;;;:::i;:::-;;:::i;15981:71::-;;;;;;;;;;-1:-1:-1;16040:9:0;;;15981:71;;16040:9;;;;17753:36:1;;17726:18;15981:71:0;17611:184:1;9871:36:0;;;;;;;;;;;;;;;;19234:259;;;;;;;;;;-1:-1:-1;19234:259:0;;;;;:::i;:::-;;:::i;17386:215::-;;;;;;;;;;-1:-1:-1;17386:215:0;;;;;:::i;:::-;;:::i;21333:340::-;;;;;;;;;;-1:-1:-1;21333:340:0;;;;;:::i;:::-;;:::i;10259:21::-;;;;;;;;;;-1:-1:-1;10259:21:0;;;;-1:-1:-1;;;;;10259:21:0;;;9548:51;;;;;;;;;;;;;;;;10669:41;;;;;;;;;;-1:-1:-1;10669:41:0;;;;-1:-1:-1;;;10669:41:0;;;;;;9914:36;;;;;;;;;;;;;;;;14530:807;;;;;;;;;;-1:-1:-1;14530:807:0;;;;;:::i;:::-;;:::i;11021:36::-;;;;;;;;;;-1:-1:-1;11021:36:0;;;;;;;;;;;18963:123;;;;;;;;;;-1:-1:-1;18963:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;19051:27:0;19027:4;19051:27;;;:18;:27;;;;;;;;;18963:123;16984:120;;;;;;;;;;-1:-1:-1;16984:120:0;;;;;:::i;:::-;;:::i;10463:64::-;;;;;;;;;;-1:-1:-1;10463:64:0;;;;-1:-1:-1;;;;;10463:64:0;;;22326:202;;;;;;;;;;-1:-1:-1;22326:202:0;;;;;:::i;:::-;;:::i;10758:28::-;;;;;;;;;;;;;;;;22715:132;;;;;;;;;;-1:-1:-1;22715:132:0;;;;;:::i;:::-;;:::i;21165:160::-;;;;;;;;;;-1:-1:-1;21165:160:0;;;;;:::i;:::-;;:::i;9155:34::-;;;;;;;;;;;;;;;;20275:435;;;;;;;;;;-1:-1:-1;20275:435:0;;;;;:::i;:::-;;:::i;9668:55::-;;;;;;;;;;;;;;;;16434:198;;;;;;;;;;-1:-1:-1;16434:198:0;;;;;:::i;:::-;;:::i;15345:194::-;;;;;;;;;;;;;:::i;12614:1276::-;;;;;;;;;;;;;:::i;18403:424::-;;;;;;;;;;-1:-1:-1;18403:424:0;;;;;:::i;:::-;;:::i;9451:38::-;;;;;;;;;;;;;;;;18835:120;;;;;;;;;;-1:-1:-1;18835:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;18927:20:0;18903:4;18927:20;;;:11;:20;;;;;;;;;18835:120;16216:71;;;;;;;;;;-1:-1:-1;16259:7:0;14508:6;-1:-1:-1;;;;;14508:6:0;16216:71;;19094:132;;;;;;;;;;-1:-1:-1;19094:132:0;;;;;:::i;:::-;-1:-1:-1;;;;;19187:31:0;19163:4;19187:31;;;:22;:31;;;;;;;;;19094:132;28774:398;;;;;;;;;;;;;:::i;16058:75::-;;;;;;;;;;;;;:::i;17609:225::-;;;;;;;;;;-1:-1:-1;17609:225:0;;;;;:::i;:::-;;:::i;16640:167::-;;;;;;;;;;-1:-1:-1;16640:167:0;;;;;:::i;:::-;;:::i;19754:218::-;;;;;;;;;;-1:-1:-1;19754:218:0;;;;;:::i;:::-;;:::i;9408:36::-;;;;;;;;;;;;;;;;22536:171;;;;;;;;;;-1:-1:-1;22536:171:0;;;;;:::i;:::-;;:::i;9343:47::-;;;;;;;;;;;;;;;;9496:39;;;;;;;;;;;;;;;;9239:43;;;;;;;;;;;;;;;;9289:47;;;;;;;;;;;;;;;;16293:133;;;;;;;;;;-1:-1:-1;16293:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;16395:19:0;;;16377:7;16395:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;16293:133;11272:32;;;;;;;;;;;;;;;;20718:439;;;;;;;;;;-1:-1:-1;20718:439:0;;;;;:::i;:::-;;:::i;9606:55::-;;;;;;;;;;;;;;;;17842:553;;;;;;;;;;-1:-1:-1;17842:553:0;;;;;:::i;:::-;;:::i;20122:141::-;;;;;;;;;;-1:-1:-1;20122:141:0;;;;;:::i;:::-;;:::i;10832:30::-;;;;;;;;;;;;;;;;22029:289;;;;;;;;;;-1:-1:-1;22029:289:0;;;;;:::i;:::-;;:::i;16139:71::-;16178:13;16202:5;16195:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16139:71;:::o;19980:134::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;;;;;;;;;20064:2:::1;20057:3;:9;;20049:18;;;::::0;::::1;;20094:12;:3:::0;20100:6:::1;20094:12;:::i;:::-;20078:13;:28:::0;-1:-1:-1;19980:134:0:o;16815:161::-;16890:4;16907:39;322:10;16930:7;16939:6;16907:8;:39::i;:::-;-1:-1:-1;16964:4:0;16815:161;;;;;:::o;22855:906::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;22960:4:::1;22949:15:::0;::::1;;;22945:809;;;-1:-1:-1::0;;;;;22990:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;22989:21;22981:62;;;::::0;-1:-1:-1;;;22981:62:0;;11751:2:1;22981:62:0::1;::::0;::::1;11733:21:1::0;11790:2;11770:18;;;11763:30;11829;11809:18;;;11802:58;11877:18;;22981:62:0::1;11549:352:1::0;22981:62:0::1;-1:-1:-1::0;;;;;23061:16:0;::::1;23080:1;23061:16:::0;;;:7:::1;:16;::::0;;;;;:20;23058:116:::1;;-1:-1:-1::0;;;;;23141:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;23121:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;23102:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;23058:116:::1;-1:-1:-1::0;;;;;;23188:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;23188:27:0::1;23211:4;23188:27:::0;;::::1;::::0;;;23230:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;23230:23:0::1;::::0;;::::1;::::0;;22855:906::o;22945:809::-:1;23275:16:::0;23271:483:::1;;-1:-1:-1::0;;;;;23316:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;23308:61;;;::::0;-1:-1:-1;;;23308:61:0;;9444:2:1;23308:61:0::1;::::0;::::1;9426:21:1::0;9483:2;9463:18;;;9456:30;9522;9502:18;;;9495:58;9570:18;;23308:61:0::1;9242:352:1::0;23308:61:0::1;23389:9;23384:359;23408:9;:16:::0;23404:20;::::1;23384:359;;;23470:7;-1:-1:-1::0;;;;;23454:23:0::1;:9;23464:1;23454:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;23454:12:0::1;:23;23450:278;;;23517:9;23527:16:::0;;:20:::1;::::0;23546:1:::1;::::0;23527:20:::1;:::i;:::-;23517:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;23502:9:::1;:12:::0;;-1:-1:-1;;;;;23517:31:0;;::::1;::::0;23512:1;;23502:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;23502:46:0::1;-1:-1:-1::0;;;;;23502:46:0;;::::1;;::::0;;23571:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;23614:11:::1;:20:::0;;;;:28;;-1:-1:-1;;23614:28:0::1;::::0;;23665:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;23665:15:0;;;;;-1:-1:-1;;;;;;23665:15:0::1;::::0;;;;;23703:5:::1;;23450:278;23426:3:::0;::::1;::::0;::::1;:::i;:::-;;;;23384:359;;;;23271:483;22855:906:::0;;:::o;19501:245::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;19599:13:::1;::::0;:18;:40;::::1;;;-1:-1:-1::0;19621:13:0::1;::::0;:18;19599:40:::1;:61;;;;-1:-1:-1::0;19644:16:0::1;::::0;;;::::1;;;19643:17;19599:61;19590:71;;;::::0;::::1;;19688:10;:6:::0;19697:1:::1;19688:10;:::i;:::-;19672:26;;:13;:26:::0;19725:13:::1;:4:::0;19732:6:::1;19725:13;:::i;:::-;19709;:29:::0;-1:-1:-1;;19501:245:0:o;17112:266::-;17210:4;17227:36;17237:6;17245:9;17256:6;17227:9;:36::i;:::-;-1:-1:-1;;;;;;17305:19:0;;;;;;:11;:19;;;;;;;;322:10;17305:33;;;;;;;;;17274:74;;17283:6;;17305:42;;17341:6;;17305:42;:::i;:::-;17274:8;:74::i;:::-;-1:-1:-1;17366:4:0;17112:266;;;;;:::o;21681:340::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;21771:13:::1;21809:7;21798;21788;;:17;;;;:::i;:::-;21787:29;;;;:::i;:::-;21771:45;;21855:4;21845:7;;:14;;;;:::i;:::-;21835:5;:25;;21827:88;;;::::0;-1:-1:-1;;;21827:88:0;;10631:2:1;21827:88:0::1;::::0;::::1;10613:21:1::0;10670:2;10650:18;;;10643:30;10709:34;10689:18;;;10682:62;-1:-1:-1;;;10760:18:1;;;10753:48;10818:19;;21827:88:0::1;10429:414:1::0;21827:88:0::1;21926:14;:22:::0;;;21978:14:::1;::::0;22006:7;;21978:24:::1;::::0;21995:7;;21978:24:::1;:::i;:::-;21977:36;;;;:::i;:::-;21959:15;:54:::0;-1:-1:-1;;;21681:340:0:o;24196:250::-;24262:7;24301;;24290;:18;;24282:73;;;;-1:-1:-1;;;24282:73:0;;7865:2:1;24282:73:0;;;7847:21:1;7904:2;7884:18;;;7877:30;7943:34;7923:18;;;7916:62;-1:-1:-1;;;7994:18:1;;;7987:40;8044:19;;24282:73:0;7663:406:1;24282:73:0;24366:19;24389:10;:8;:10::i;:::-;24366:33;-1:-1:-1;24417:21:0;24366:33;24417:7;:21;:::i;:::-;24410:28;24196:250;-1:-1:-1;;;24196:250:0:o;19234:259::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;19337:13:::1;::::0;:18;:50;::::1;;;-1:-1:-1::0;19359:23:0::1;::::0;:28;19337:50:::1;19328:70;;;;-1:-1:-1::0;;;19328:70:0::1;;;;;;;:::i;:::-;19409:13;:28:::0;;;;19448:23:::1;:37:::0;19234:259::o;17386:215::-;322:10;17474:4;17523:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;17523:34:0;;;;;;;;;;17474:4;;17491:80;;17514:7;;17523:47;;17560:10;;17523:47;:::i;21333:340::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;21422:13:::1;21460:7;21449;21439;;:17;;;;:::i;:::-;21438:29;;;;:::i;:::-;21422:45;;21506:4;21496:7;;:14;;;;:::i;:::-;21486:5;:25;;21478:93;;;::::0;-1:-1:-1;;;21478:93:0;;9801:2:1;21478:93:0::1;::::0;::::1;9783:21:1::0;9840:2;9820:18;;;9813:30;9879:34;9859:18;;;9852:62;9950:25;9930:18;;;9923:53;9993:19;;21478:93:0::1;9599:419:1::0;21478:93:0::1;21582:12;:20:::0;;;21630:14:::1;::::0;21658:7;;21630:24:::1;::::0;21647:7;;21630:24:::1;:::i;:::-;21629:36;;;;:::i;:::-;21613:13;:52:::0;-1:-1:-1;;;21333:340:0:o;14530:807::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14611:22:0;::::1;14603:96;;;;-1:-1:-1::0;;;14603:96:0::1;;;;;;;:::i;:::-;14730:4;::::0;-1:-1:-1;;;;;14718:16:0;;::::1;14730:4:::0;::::1;14718:16;;14710:90;;;;-1:-1:-1::0;;;14710:90:0::1;;;;;;;:::i;:::-;14830:6;::::0;;14811:33:::1;::::0;-1:-1:-1;;;;;14830:6:0;;::::1;::::0;14811:18:::1;:33::i;:::-;14855:34;14874:8;14884:4;14855:18;:34::i;:::-;14900:37;14922:8;14932:4;14900:21;:37::i;:::-;14990:6;::::0;14962:16:::1;::::0;-1:-1:-1;;;;;14962:16:0;;::::1;14990:6:::0;::::1;14962:35;14958:90;;;15012:16;:36:::0;;-1:-1:-1;;;;;;15012:36:0::1;-1:-1:-1::0;;;;;15012:36:0;::::1;;::::0;;14958:90:::1;15111:6;::::0;15101:17:::1;::::0;-1:-1:-1;;;;;15111:6:0::1;15101:9;:17::i;:::-;15069:19;15081:6:::0;;-1:-1:-1;;;;;15081:6:0;;::::1;15069:19:::0;;:11:::1;:19;::::0;;;;;;;:29;;::::1;::::0;;;;;;;:49;;;;15142:6;;15069:19;;15132:17:::1;::::0;15142:6:::1;15132:9;:17::i;:::-;:21;15129:99;;;15180:6;::::0;15170:46:::1;::::0;-1:-1:-1;;;;;15180:6:0::1;15188:8:::0;15198:17:::1;15180:6:::0;15198:9:::1;:17::i;:::-;15170:9;:46::i;:::-;;15129:99;15248:6;:17:::0;;-1:-1:-1;;;;;;15248:17:0::1;-1:-1:-1::0;;;;;15248:17:0;::::1;::::0;;::::1;::::0;;15281:38:::1;::::0;15248:17;;;;15281:38:::1;::::0;15248:6;15281:38:::1;14530:807:::0;:::o;16984:120::-;17037:4;17061:35;17069:7;-1:-1:-1;;17061:7:0;:35::i;22326:202::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;22419:16:::1;::::0;-1:-1:-1;;;;;22419:29:0;;::::1;:16:::0;::::1;:29;;22411:61;;;::::0;-1:-1:-1;;;22411:61:0;;11403:2:1;22411:61:0::1;::::0;::::1;11385:21:1::0;11442:2;11422:18;;;11415:30;-1:-1:-1;;;11461:18:1;;;11454:49;11520:18;;22411:61:0::1;11201:343:1::0;22411:61:0::1;22483:16;:37:::0;;-1:-1:-1;;;;;;22483:37:0::1;-1:-1:-1::0;;;;;22483:37:0;;;::::1;::::0;;;::::1;::::0;;22326:202::o;22715:132::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22802:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:37;;-1:-1:-1;;22802:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;22715:132::o;21165:160::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;21252:15:::1;:27:::0;;;;21290:15:::1;:27:::0;21165:160::o;20275:435::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;20400:13:::1;;20389:7;:24;;:73;;;;;20447:15;;20434:9;:28;;20389:73;:122;;;;;20496:15;;20483:9;:28;;20389:122;20381:149;;;::::0;::::1;;20584:4;20571:9:::0;20549:19:::1;20559:9:::0;20549:7;:19:::1;:::i;:::-;:31;;;;:::i;:::-;:39;;20541:48;;;::::0;::::1;;20600:14;:24:::0;;;;20635:16:::1;:28:::0;20674:16:::1;:28:::0;20275:435::o;16434:198::-;-1:-1:-1;;;;;16524:20:0;;16500:7;16524:20;;;:11;:20;;;;;;;;16520:49;;;-1:-1:-1;;;;;;16553:16:0;;;;;:7;:16;;;;;;;16434:198::o;16520:49::-;-1:-1:-1;;;;;16607:16:0;;;;;;:7;:16;;;;;;16587:37;;:19;:37::i;15345:194::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;15431:6:::1;::::0;;15412:33:::1;::::0;-1:-1:-1;;;;;15431:6:0;;::::1;::::0;15412:18:::1;:33::i;:::-;15473:1;15456:19:::0;;-1:-1:-1;;;;;;15456:19:0::1;::::0;;15491:40:::1;::::0;15473:1;;15491:40:::1;::::0;15473:1;;15491:40:::1;15345:194::o:0;12614:1276::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;12682:19:::1;::::0;::::1;;12681:20;12673:62;;;::::0;-1:-1:-1;;;12673:62:0;;13265:2:1;12673:62:0::1;::::0;::::1;13247:21:1::0;13304:2;13284:18;;;13277:30;13343:31;13323:18;;;13316:59;13392:18;;12673:62:0::1;13063:353:1::0;12673:62:0::1;12746:21;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;12746:21:0::1;::::0;;::::1;::::0;;;::::1;::::0;:5:::1;::::0;:21:::1;:::i;:::-;-1:-1:-1::0;12778:18:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;12778:18:0::1;::::0;;::::1;::::0;;;::::1;::::0;:7:::1;::::0;:18:::1;:::i;:::-;-1:-1:-1::0;12824:19:0::1;12807:14;:36:::0;12989:9:::1;:13:::0;;-1:-1:-1;;12989:13:0::1;13001:1;12989:13:::0;;::::1;::::0;;;13017:12:::1;:24:::0;13095:12:::1;::::0;13091:16:::1;::::0;:2:::1;:16;:::i;:::-;13073:14;;:35;;;;:::i;:::-;13063:7;:45:::0;;;13137:13:::1;::::0;-1:-1:-1;;13137:13:0::1;:::i;:::-;13130:21;::::0;-1:-1:-1;;13130:21:0::1;:::i;:::-;13119:7;:33:::0;13196:14:::1;::::0;13165:9:::1;:46:::0;;-1:-1:-1;;;;;;13165:46:0::1;-1:-1:-1::0;;;;;13196:14:0;;::::1;13165:46:::0;;::::1;::::0;;13249:19:::1;::::0;;-1:-1:-1;;;13249:19:0;;;;:17:::1;::::0;:19:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;13196:14;13249:19;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;13231:49:0::1;;13281:9;;;;;;;;;-1:-1:-1::0;;;;;13281:9:0::1;-1:-1:-1::0;;;;;13281:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13231:82;::::0;-1:-1:-1;;;;;;13231:82:0::1;::::0;;;;;;-1:-1:-1;;;;;5187:15:1;;;13231:82:0::1;::::0;::::1;5169:34:1::0;13307:4:0::1;5219:18:1::0;;;5212:43;5104:18;;13231:82:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13222:6;:91:::0;;-1:-1:-1;;;;;;13222:91:0::1;-1:-1:-1::0;;;;;13222:91:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;13324:15:0;;;:7:::1;:15;::::0;;;;;;;:22;;-1:-1:-1;;13324:22:0::1;-1:-1:-1::0;13324:22:0::1;::::0;;13377:4:::1;13357:26:::0;;:11:::1;:26:::0;;;;;13392:9:::1;::::0;;;::::1;13357:46:::0;;;;;;-1:-1:-1;;13357:66:0;;13451:7:::1;::::0;:13:::1;::::0;13461:3:::1;::::0;13451:13:::1;:::i;:::-;13436:12;:28:::0;13491:14:::1;::::0;:20:::1;::::0;13508:3:::1;::::0;13491:20:::1;:::i;:::-;13475:13;:36:::0;13540:7:::1;::::0;13553:3:::1;::::0;13540:9:::1;::::0;13548:1:::1;13540:9;:::i;:::-;13539:17;;;;:::i;:::-;13522:14;:34:::0;13586:14:::1;::::0;13608:3:::1;::::0;13586:18:::1;::::0;13603:1:::1;13586:18;:::i;:::-;13585:26;;;;:::i;:::-;13567:15;:44:::0;13639:7:::1;::::0;13654:5:::1;::::0;13639:11:::1;::::0;13649:1:::1;13639:11;:::i;:::-;13638:21;;;;:::i;:::-;13622:13;:37:::0;13684:7:::1;::::0;13699:4:::1;::::0;13684:11:::1;::::0;13694:1:::1;13684:11;:::i;:::-;13683:20;;;;:::i;:::-;13670:10;:33:::0;13724:14:::1;::::0;13716:42:::1;::::0;-1:-1:-1;;;;;13724:14:0::1;-1:-1:-1::0;;13716:7:0::1;:42::i;:::-;-1:-1:-1::0;13771:19:0::1;:26:::0;;-1:-1:-1;;13771:26:0::1;13793:4;13771:26:::0;;::::1;::::0;;;13827:7:::1;::::0;;13771:19:::1;13816:7;14481::::0;14508:6;-1:-1:-1;;;;;14508:6:0;;14443:79;13816:7:::1;-1:-1:-1::0;;;;;13808:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;13808:16:0;:26;13865:7:::1;14481::::0;14508:6;-1:-1:-1;;;;;14508:6:0;;14443:79;13865:7:::1;13859:4;::::0;13874:7:::1;::::0;13850:32:::1;::::0;16266:25:1;;;-1:-1:-1;;;;;13850:32:0;;::::1;::::0;13859:4;;::::1;::::0;13850:32:::1;::::0;16254:2:1;16239:18;13850:32:0::1;;;;;;;12614:1276::o:0;18403:424::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;18484:16;18480:340:::1;;-1:-1:-1::0;;;;;;18517:13:0::1;18533:5;18517:13:::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;18517:21:0::1;::::0;;22855:906::o;18480:340::-:1;18575:17;::::0;:22;18571:153:::1;;18664:7;18644:17;;18626:15;:35;;;;:::i;:::-;:45;18618:90;;;::::0;-1:-1:-1;;;18618:90:0;;9083:2:1;18618:90:0::1;::::0;::::1;9065:21:1::0;;;9102:18;;;9095:30;9161:34;9141:18;;;9134:62;9213:18;;18618:90:0::1;8881:356:1::0;18618:90:0::1;-1:-1:-1::0;;;;;18738:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;:20;;-1:-1:-1;;18738:20:0::1;18754:4;18738:20;::::0;;18793:15:::1;18773:17;:35:::0;18403:424;;:::o;28774:398::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;28836:14:::1;::::0;::::1;;28835:15;28827:52;;;::::0;-1:-1:-1;;;28827:52:0;;15539:2:1;28827:52:0::1;::::0;::::1;15521:21:1::0;15578:2;15558:18;;;15551:30;15617:26;15597:18;;;15590:54;15661:18;;28827:52:0::1;15337:348:1::0;28827:52:0::1;28890:42;28920:4;28927;28890:21;:42::i;:::-;28965:6;::::0;28943:35:::1;::::0;-1:-1:-1;;;;;28965:6:0::1;::::0;28943:21:::1;:35::i;:::-;28993:13;;29010:1;28993:18;28989:144;;29043:18;:12;29058:3;29043:18;:::i;:::-;29028:12;:33:::0;28989:144:::1;;;29109:12;29094;:27:::0;28989:144:::1;29143:14;:21:::0;;-1:-1:-1;;29143:21:0::1;29160:4;29143:21;::::0;;28774:398::o;16058:75::-;16099:13;16123:7;16116:14;;;;;:::i;17609:225::-;322:10;17702:4;17751:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;17751:34:0;;;;;;;;;;17702:4;;17719:85;;17742:7;;17751:52;;17788:15;;17751:52;:::i;16640:167::-;16718:4;16735:42;322:10;16759:9;16770:6;16735:9;:42::i;19754:218::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;19863:16:::1;:28:::0;;;::::1;;;;-1:-1:-1::0;;19863:28:0;;::::1;::::0;;;::::1;::::0;;;19902:14:::1;:24:::0;;;::::1;;-1:-1:-1::0;;19902:24:0;;::::1;;::::0;;19937:15:::1;:27:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;19754:218::o;22536:171::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;22613:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;22613:32:0::1;-1:-1:-1::0;;;;22613:32:0;;::::1;;::::0;;22661:38:::1;::::0;::::1;::::0;::::1;::::0;22637:8;6043:14:1;6036:22;6018:41;;6006:2;5991:18;;5878:187;22661:38:0::1;;;;;;;;22536:171:::0;:::o;20718:439::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;20844:13:::1;;20833:7;:24;;:73;;;;;20891:15;;20878:9;:28;;20833:73;:122;;;;;20940:15;;20927:9;:28;;20833:122;20825:149;;;::::0;::::1;;21028:4;21015:9:::0;20993:19:::1;21003:9:::0;20993:7;:19:::1;:::i;:::-;:31;;;;:::i;:::-;:39;;20985:48;;;::::0;::::1;;21044:15;:25:::0;;;;21080:17:::1;:29:::0;21120:17:::1;:29:::0;20718:439::o;17842:553::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;17915:29:::1;17966:9;17915:61;;17987:16;18024:10;-1:-1:-1::0;;;;;18024:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18006:47:0::1;;18062:4;18069:10;-1:-1:-1::0;;;;;18069:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18006:81;::::0;-1:-1:-1;;;;;;18006:81:0::1;::::0;;;;;;-1:-1:-1;;;;;5187:15:1;;;18006:81:0::1;::::0;::::1;5169:34:1::0;5239:15;;5219:18;;;5212:43;5104:18;;18006:81:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17987:100:::0;-1:-1:-1;;;;;;18102:22:0;::::1;18098:207;;18168:10;-1:-1:-1::0;;;;;18168:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18150:50:0::1;;18209:4;18216:10;-1:-1:-1::0;;;;;18216:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18150:84;::::0;-1:-1:-1;;;;;;18150:84:0::1;::::0;;;;;;-1:-1:-1;;;;;5187:15:1;;;18150:84:0::1;::::0;::::1;5169:34:1::0;5239:15;;5219:18;;;5212:43;5104:18;;18150:84:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18141:6;:93:::0;;-1:-1:-1;;;;;;18141:93:0::1;-1:-1:-1::0;;;;;18141:93:0;;;::::1;::::0;;;::::1;::::0;;18098:207:::1;;;18276:6;:17:::0;;-1:-1:-1;;;;;;18276:17:0::1;-1:-1:-1::0;;;;;18276:17:0;::::1;;::::0;;18098:207:::1;18315:9;:22:::0;;-1:-1:-1;;;;;;18315:22:0::1;-1:-1:-1::0;;;;;18315:22:0;::::1;;::::0;;18348:39:::1;18365:4;18372:9:::0;-1:-1:-1;;18348:8:0::1;:39::i;20122:141::-:0;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20214:31:0;;;::::1;;::::0;;;:22:::1;:31;::::0;;;;:41;;-1:-1:-1;;20214:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;20122:141::o;22029:289::-;12088:6;;-1:-1:-1;;;;;12088:6:0;322:10;12088:22;12080:67;;;;-1:-1:-1;;;12080:67:0;;;;;;;:::i;:::-;22229:16:::1;22209;22199:7;;:26;;;;:::i;:::-;22198:47;;;;:::i;:::-;22182:13;:63:::0;22270:7:::1;::::0;22297:13;;22270:23:::1;::::0;22280:13;;22270:23:::1;:::i;:::-;22269:41;;;;:::i;:::-;22256:10;:54:::0;-1:-1:-1;;;;22029:289:0:o;24458:342::-;-1:-1:-1;;;;;24553:20:0;;24545:69;;;;-1:-1:-1;;;24545:69:0;;15134:2:1;24545:69:0;;;15116:21:1;15173:2;15153:18;;;15146:30;15212:34;15192:18;;;15185:62;-1:-1:-1;;;15263:18:1;;;15256:34;15307:19;;24545:69:0;14932:400:1;24545:69:0;-1:-1:-1;;;;;24633:21:0;;24625:68;;;;-1:-1:-1;;;24625:68:0;;8276:2:1;24625:68:0;;;8258:21:1;8315:2;8295:18;;;8288:30;8354:34;8334:18;;;8327:62;-1:-1:-1;;;8405:18:1;;;8398:32;8447:19;;24625:68:0;8074:398:1;24625:68:0;-1:-1:-1;;;;;24706:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;24759:33;;16266:25:1;;;24759:33:0;;16239:18:1;24759:33:0;;;;;;;24458:342;;;:::o;24808:1900::-;24887:4;-1:-1:-1;;;;;24912:18:0;;24904:68;;;;-1:-1:-1;;;24904:68:0;;14394:2:1;24904:68:0;;;14376:21:1;14433:2;14413:18;;;14406:30;14472:34;14452:18;;;14445:62;-1:-1:-1;;;14523:18:1;;;14516:35;14568:19;;24904:68:0;14192:401:1;24904:68:0;-1:-1:-1;;;;;24991:16:0;;24983:64;;;;-1:-1:-1;;;24983:64:0;;7108:2:1;24983:64:0;;;7090:21:1;7147:2;7127:18;;;7120:30;7186:34;7166:18;;;7159:62;-1:-1:-1;;;7237:18:1;;;7230:33;7280:19;;24983:64:0;6906:399:1;24983:64:0;25075:1;25066:6;:10;25058:64;;;;-1:-1:-1;;;25058:64:0;;13984:2:1;25058:64:0;;;13966:21:1;14023:2;14003:18;;;13996:30;14062:34;14042:18;;;14035:62;-1:-1:-1;;;14113:18:1;;;14106:39;14162:19;;25058:64:0;13782:405:1;25058:64:0;25137:14;;;;25133:112;;;25191:13;;25176:11;:28;;25168:65;;;;-1:-1:-1;;;25168:65:0;;11050:2:1;25168:65:0;;;11032:21:1;11089:2;11069:18;;;11062:30;11128:26;11108:18;;;11101:54;11172:18;;25168:65:0;10848:348:1;25168:65:0;25258:20;25269:4;25275:2;25258:10;:20::i;:::-;25255:776;;;25299:14;;;;25295:89;;25334:34;;-1:-1:-1;;;25334:34:0;;7512:2:1;25334:34:0;;;7494:21:1;7551:2;7531:18;;;7524:30;7590:26;7570:18;;;7563:54;7634:18;;25334:34:0;7310:348:1;25295:89:0;25402:15;;;;25398:347;;;-1:-1:-1;;;;;25442:13:0;;;;;;:7;:13;;;;;;;;25438:292;;;-1:-1:-1;;;;;25487:13:0;;;;;;:9;:13;;;;;;25504:12;25487:29;;25479:38;;;;;;-1:-1:-1;;;;;25540:13:0;;;;;;:9;:13;;;;;25556:12;25540:28;;25438:292;;;-1:-1:-1;;;;;25625:15:0;;;;;;:9;:15;;;;;;25644:12;25625:31;;25617:40;;;;;;-1:-1:-1;;;;;25680:15:0;;;;;;:9;:15;;;;;25698:12;25680:30;;25438:292;25777:12;;25767:6;:22;;25759:75;;;;-1:-1:-1;;;25759:75:0;;12445:2:1;25759:75:0;;;12427:21:1;12484:2;12464:18;;;12457:30;12523:34;12503:18;;;12496:62;-1:-1:-1;;;12574:18:1;;;12567:38;12622:19;;25759:75:0;12243:404:1;25759:75:0;25858:14;;-1:-1:-1;;;;;25852:20:0;;;25858:14;;25852:20;;;;:36;;-1:-1:-1;;;;;;25877:11:0;;;;;;:7;:11;;;;;;;;25876:12;25852:36;25849:171;;;25943:14;;25933:6;25917:13;25927:2;25917:9;:13::i;:::-;:22;;;;:::i;:::-;:40;;25909:95;;;;-1:-1:-1;;;25909:95:0;;12854:2:1;25909:95:0;;;12836:21:1;12893:2;12873:18;;;12866:30;12932:34;12912:18;;;12905:62;-1:-1:-1;;;12983:18:1;;;12976:40;13033:19;;25909:95:0;12652:406:1;25909:95:0;-1:-1:-1;;;;;26076:24:0;;26043:12;26076:24;;;:18;:24;;;;;;26058:4;;26076:24;;;:50;;-1:-1:-1;;;;;;26104:22:0;;;;;;:18;:22;;;;;;;;26076:50;26073:96;;;-1:-1:-1;26152:5:0;26073:96;-1:-1:-1;;;;;26185:11:0;;;;;;:7;:11;;;;;;;;26181:457;;;26218:16;;-1:-1:-1;;;26218:16:0;;;;26217:17;:59;;;;-1:-1:-1;26255:21:0;;-1:-1:-1;;;26255:21:0;;;;26217:59;26213:408;;;26311:28;26342:24;26360:4;26342:9;:24::i;:::-;26311:55;;26413:13;;26389:20;:37;26385:221;;26478:10;;26454:20;:34;26451:77;;-1:-1:-1;26515:10:0;;26451:77;26550:36;26565:20;26550:14;:36::i;:::-;26292:329;26213:408;26656:44;26674:4;26680:2;26684:6;26692:7;26656:17;:44::i;:::-;26649:51;24808:1900;-1:-1:-1;;;;;24808:1900:0:o;33069:161::-;33111:7;33132:15;33149;33168:19;:17;:19::i;:::-;33131:56;;-1:-1:-1;33131:56:0;-1:-1:-1;33205:17:0;33131:56;;33205:17;:::i;:::-;33198:24;;;;33069:161;:::o;23864:324::-;23933:4;14508:6;;-1:-1:-1;;;;;23957:15:0;;;14508:6;;23957:15;;;;:45;;-1:-1:-1;14481:7:0;14508:6;-1:-1:-1;;;;;23989:13:0;;;14508:6;;23989:13;;23957:45;:84;;;;-1:-1:-1;;;;;;24020:21:0;;;;;;:17;:21;;;;;;;;24019:22;23957:84;:125;;;;-1:-1:-1;;;;;;24059:23:0;;;;;;:17;:23;;;;;;;;24058:24;23957:125;:152;;;;-1:-1:-1;24105:4:0;;-1:-1:-1;;;;;24099:10:0;;;24105:4;;24099:10;;23957:152;:185;;;;-1:-1:-1;;;;;;24126:16:0;;;;23957:185;:223;;;;-1:-1:-1;;;;;;24159:21:0;;24175:4;24159:21;;23950:230;23864:324;-1:-1:-1;;;23864:324:0:o;26716:865::-;11962:16;:23;;-1:-1:-1;;;;11962:23:0;-1:-1:-1;;;11962:23:0;;;26824:15:::1;::::0;26806::::1;::::0;:33:::1;::::0;26824:15;26806:33:::1;:::i;:::-;26802:64;;26859:7;;26802:64;26876:17;26979:1;26959:15;;26941;;:33;;;;:::i;:::-;26921:15;::::0;26898:38:::1;::::0;:20;:38:::1;:::i;:::-;26897:78;;;;:::i;:::-;26896:84;;;;:::i;:::-;26876:104:::0;-1:-1:-1;26993:20:0::1;27016:32;26876:104:::0;27016:20;:32:::1;:::i;:::-;26993:55;;27059:30;27076:12;27059:16;:30::i;:::-;27161:24;27272:1;27252:15;;27234;;:33;;;;:::i;:::-;27214:15;::::0;27190:39:::1;::::0;:21:::1;:39;:::i;:::-;27189:79;;;;:::i;:::-;27188:85;;;;:::i;:::-;27161:112:::0;-1:-1:-1;27290:13:0;;27286:161:::1;;27320:41;27333:9;27344:16;27320:12;:41::i;:::-;27381:54;::::0;;17489:25:1;;;17545:2;17530:18;;17523:34;;;17573:18;;;17566:34;;;27381:54:0::1;::::0;17477:2:1;17462:18;27381:54:0::1;;;;;;;27286:161;27496:1;27461:32;27484:9:::0;27461:20;:32:::1;:::i;:::-;:36;27457:117;;;27514:16;::::0;:48:::1;::::0;-1:-1:-1;;;;;27514:16:0;;::::1;::::0;27540:21:::1;27514:48:::0;::::1;;;::::0;:16:::1;:48:::0;:16;:48;27540:21;27514:16;:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;27457:117;26791:790;;;11996:1;-1:-1:-1::0;12008:16:0;:24;;-1:-1:-1;;;;12008:24:0;;;26716:865::o;29384:2059::-;29507:16;;29486:4;;29507:16;;;;;29503:851;;;-1:-1:-1;;;;;19187:31:0;;19163:4;19187:31;;;:22;:31;;;;;;;;29543:56;;;-1:-1:-1;;;;;;19187:31:0;;19163:4;19187:31;;;:22;:31;;;;;;;;29574:25;29539:116;;;29620:19;;-1:-1:-1;;;29620:19:0;;12108:2:1;29620:19:0;;;12090:21:1;12147:1;12127:18;;;12120:29;-1:-1:-1;;;12165:18:1;;;12158:39;12214:18;;29620:19:0;11906:332:1;29539:116:0;29676:16;;;;;;;29671:672;;29713:28;29732:4;29738:2;29713:18;:28::i;:::-;29765:16;;;;;;;29764:17;:41;;;;;29785:20;29796:4;29802:2;29785:10;:20::i;:::-;29760:137;;;29830:47;;-1:-1:-1;;;29830:47:0;;10225:2:1;29830:47:0;;;10207:21:1;10264:2;10244:18;;;10237:30;10303:34;10283:18;;;10276:62;-1:-1:-1;;;10354:18:1;;;10347:35;10399:19;;29830:47:0;10023:401:1;29760:137:0;29671:672;;;29956:1;29941:12;;:16;:55;;;;-1:-1:-1;;;;;;29983:13:0;;;;;;:7;:13;;;;;;;;29941:55;:101;;;;;30022:20;30033:4;30039:2;30022:10;:20::i;:::-;29937:391;;;30119:13;;30104:12;;30089:27;;:12;:27;:::i;:::-;:43;30085:224;;;-1:-1:-1;;;;;30161:26:0;;;;;;:22;:26;;;;;:33;;-1:-1:-1;;30161:33:0;30190:4;30161:33;;;30221:13;:16;;;;;;:::i;:::-;;;;-1:-1:-1;;30269:16:0;;-1:-1:-1;;;;;4913:32:1;;4895:51;;30269:16:0;;4883:2:1;4868:18;30269:16:0;;;;;;;30085:224;30366:25;30394:38;30405:4;30411:2;30415:7;30424;30394:10;:38::i;:::-;30477:14;;;;-1:-1:-1;;;;;30461:13:0;;;;;;:7;:13;;;;;;30366:66;;-1:-1:-1;30461:30:0;;;:::i;:::-;-1:-1:-1;;;;;30445:13:0;;;;;;;:7;:13;;;;;;:46;;;;30530:22;;;;30516:11;;;;;;;;;;:36;;30530:22;30516:36;:::i;:::-;-1:-1:-1;;;;;30502:11:0;;;;;;;:7;:11;;;;;;;;:50;;;;30569:17;;;;;:11;:17;;;;;;;:37;;;;-1:-1:-1;;;;;;30591:15:0;;;;;;:11;:15;;;;;;;;30590:16;30569:37;30565:416;;;-1:-1:-1;;;;;30639:13:0;;;;;;:7;:13;;;;;;:23;;30655:7;;30639:23;:::i;:::-;-1:-1:-1;;;;;30623:13:0;;;;;;:7;:13;;;;;:39;30565:416;;;-1:-1:-1;;;;;30685:17:0;;;;;;:11;:17;;;;;;;;30684:18;:37;;;;-1:-1:-1;;;;;;30706:15:0;;;;;;:11;:15;;;;;;;;30684:37;30680:301;;;30766:22;;-1:-1:-1;;;;;30752:11:0;;30766:22;30752:11;;;:7;:11;;;;;;:36;;30766:22;30752:36;:::i;:::-;-1:-1:-1;;;;;30738:11:0;;;;;;:7;:11;;;;;:50;30680:301;;;-1:-1:-1;;;;;30812:17:0;;;;;;:11;:17;;;;;;;;:36;;;;-1:-1:-1;;;;;;30833:15:0;;;;;;:11;:15;;;;;;;;30812:36;30808:173;;;-1:-1:-1;;;;;30881:13:0;;;;;;:7;:13;;;;;;:23;;30897:7;;30881:23;:::i;:::-;-1:-1:-1;;;;;30865:13:0;;;;;;;:7;:13;;;;;;:39;;;;30947:22;;30933:11;;;;;;;;;;:36;;30947:22;30933:36;:::i;:::-;-1:-1:-1;;;;;30919:11:0;;;;;;:7;:11;;;;;:50;30808:173;30997:20;31008:4;31014:2;30997:10;:20::i;:::-;30993:167;;;31037:13;;:18;;:59;;;31093:3;31076:14;;:20;;;;:::i;:::-;31059:13;;:37;;31037:59;31033:116;;;31117:16;;-1:-1:-1;;;31117:16:0;;;;;;;:::i;31033:116::-;31176:17;;;;:21;31172:79;;31212:39;31227:4;31233:6;:17;;;31212:14;:39::i;:::-;31280:1;31266:6;:11;;;:15;:34;;;;31299:1;31285:6;:11;;;:15;31266:34;31262:91;;;31315:38;31328:6;:11;;;31341:6;:11;;;31315:12;:38::i;:::-;31386:2;-1:-1:-1;;;;;31371:42:0;31380:4;-1:-1:-1;;;;;31371:42:0;;31390:6;:22;;;31371:42;;;;16266:25:1;;16254:2;16239:18;;16120:177;31371:42:0;;;;;;;;-1:-1:-1;31431:4:0;;29384:2059;-1:-1:-1;;;;;29384:2059:0:o;33238:547::-;33336:7;;33372;;33289;;;;;33390:283;33414:9;:16;33410:20;;33390:283;;;33480:7;33456;:21;33464:9;33474:1;33464:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;33464:12:0;33456:21;;;;;;;;;;;;;:31;;:66;;;33515:7;33491;:21;33499:9;33509:1;33499:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;33499:12:0;33491:21;;;;;;;;;;;;;:31;33456:66;33452:97;;;33532:7;;33541;;33524:25;;;;;;;33238:547;;:::o;33452:97::-;33584:7;:21;33592:9;33602:1;33592:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;33592:12:0;33584:21;;;;;;;;;;;;;33574:31;;:7;:31;:::i;:::-;33564:41;;33640:7;:21;33648:9;33658:1;33648:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;33648:12:0;33640:21;;;;;;;;;;;;;33630:31;;:7;:31;:::i;:::-;33620:41;-1:-1:-1;33432:3:0;;;;:::i;:::-;;;;33390:283;;;;33707:7;;33697;;:17;;;;:::i;:::-;33687:7;:27;33683:58;;;33724:7;;33733;;33716:25;;;;;;33238:547;;:::o;33683:58::-;33760:7;;33769;;-1:-1:-1;33238:547:0;-1:-1:-1;33238:547:0:o;27589:389::-;27680:16;;;27694:1;27680:16;;;;;;;;27656:21;;27680:16;;;;;;;;;;-1:-1:-1;27680:16:0;27656:40;;27725:4;27707;27712:1;27707:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;27707:23:0;;;:7;;;;;;;;;;:23;;;;27751:9;;:16;;;-1:-1:-1;;;27751:16:0;;;;:9;;;;;:14;;:16;;;;;27707:7;;27751:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27741:4;27746:1;27741:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;27741:26:0;;;:7;;;;;;;;;:26;27780:9;;:190;;-1:-1:-1;;;27780:190:0;;:9;;;:60;;:190;;27855:11;;27780:9;;27897:4;;27924;;27944:15;;27780:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27645:333;27589:389;:::o;27986:333::-;28068:9;;28266:4;;28068:243;;-1:-1:-1;;;28068:243:0;;28134:4;28068:243;;;5607:34:1;5657:18;;;5650:34;;;28068:9:0;5700:18:1;;;5693:34;;;5743:18;;;5736:34;-1:-1:-1;;;;;28266:4:0;;;5786:19:1;;;5779:44;28285:15:0;5839:19:1;;;5832:35;28068:9:0;;;:25;;28101:9;;5541:19:1;;28068:243:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;27986:333;;:::o;28327:439::-;28410:16;;;;;;;28409:17;28401:65;;;;-1:-1:-1;;;28401:65:0;;8679:2:1;28401:65:0;;;8661:21:1;8718:2;8698:18;;;8691:30;8757:34;8737:18;;;8730:62;-1:-1:-1;;;8808:18:1;;;8801:33;8851:19;;28401:65:0;8477:399:1;28401:65:0;28482:20;28493:4;28499:2;28482:10;:20::i;:::-;28481:21;:37;;;;-1:-1:-1;28512:6:0;;-1:-1:-1;;;;;28506:12:0;;;28512:6;;28506:12;28481:37;28477:282;;;-1:-1:-1;;;;;28535:23:0;;;;;;:17;:23;;;;;;;:30;;-1:-1:-1;;28535:30:0;28561:4;28535:30;;;;;;28580:16;:23;;-1:-1:-1;;28580:23:0;;;;;28633:15;28618:12;:30;28665:21;:28;;-1:-1:-1;;;;28665:28:0;-1:-1:-1;;;28665:28:0;;;28713:34;;;;;;6043:14:1;;6036:22;6018:41;;6006:2;5991:18;;5878:187;28713:34:0;;;;;;;;28327:439;;:::o;31451:1610::-;31546:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31546:18:0;31577:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31577:25:0;31613:19;31635:10;:8;:10::i;:::-;31613:32;-1:-1:-1;31675:21:0;31613:32;31675:7;:21;:::i;:::-;31658:14;;;:38;31709:1071;;;;-1:-1:-1;;;;;31740:11:0;;;;;;:7;:11;;;;;;;;31736:561;;;31786:15;;31772:11;:29;31836:17;;31820:13;:33;31888:17;;31872:13;:33;31736:561;;;-1:-1:-1;;;;;31931:13:0;;;;;;:7;:13;;;;;;;;31927:370;;;31979:14;;31965:11;:28;32028:16;;32012:13;:32;32079:16;;32063:13;:32;31927:370;;;32150:19;;32136:11;:33;32204:21;;32188:13;:37;32260:21;;32244:13;:37;31927:370;32353:16;;32338:11;;32328:21;;:7;:21;:::i;:::-;32327:42;;;;:::i;:::-;32313:11;;;:56;32450:16;;32432:13;;32416;;:29;;32432:13;32416:29;:::i;:::-;32405:41;;:7;:41;:::i;:::-;32404:62;;;;:::i;:::-;32384:17;;;:82;;;32517:11;;;;:31;;32384:82;32517:31;:::i;:::-;32506:43;;:7;:43;:::i;:::-;32481:68;;32580:11;;;;:25;;32594:11;;32580:25;:::i;:::-;32566:11;;;:39;31709:1071;;;32652:1;32638:11;;;:15;;;32668:17;;;:21;;;32704:32;;;32753:11;;;:15;31709:1071;32794:20;32805:4;32811:2;32794:10;:20::i;:::-;:89;;;;-1:-1:-1;32819:23:0;;:28;;:63;;;32851:23;;32878:4;32851:31;;32819:63;32790:138;;;32900:16;;-1:-1:-1;;;32900:16:0;;;;;;;:::i;32790:138::-;33016:11;32996:6;:17;;;:31;;;;:::i;:::-;32981:6;:11;;;:47;;;;:::i;:::-;32963:6;:14;;;:66;;;;:::i;:::-;32938:22;;;:91;-1:-1:-1;32938:22:0;31451:1610;-1:-1:-1;;;;;31451:1610:0:o;33952:461::-;34032:19;34055:10;:8;:10::i;:::-;34032:33;-1:-1:-1;34076:18:0;34097:24;34032:33;34097:10;:24;:::i;:::-;34173:4;34157:22;;;;:7;:22;;;;;;34076:45;;-1:-1:-1;34157:35:0;;34076:45;;34157:35;:::i;:::-;34148:4;34132:22;;;;:7;:22;;;;;;;;:60;;;;34206:11;:26;;;;;;34203:104;;;34288:4;34272:22;;;;:7;:22;;;;;;:35;;34297:10;;34272:35;:::i;:::-;34263:4;34247:22;;;;:7;:22;;;;;:60;34203:104;34323:43;;16266:25:1;;;34348:4:0;;-1:-1:-1;;;;;34323:43:0;;;;;16254:2:1;16239:18;34323:43:0;;;;;;;34021:392;;33952:461;;:::o;33797:143::-;33887:4;33877:7;;:14;;;;:::i;:::-;33867:7;:24;33915:10;;:17;;33928:4;;33915:17;:::i;:::-;33902:10;:30;-1:-1:-1;;33797:143:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:160:1;79:20;;135:13;;128:21;118:32;;108:60;;164:1;161;154:12;108:60;14:160;;;:::o;179:247::-;238:6;291:2;279:9;270:7;266:23;262:32;259:52;;;307:1;304;297:12;259:52;346:9;333:23;365:31;390:5;365:31;:::i;431:251::-;501:6;554:2;542:9;533:7;529:23;525:32;522:52;;;570:1;567;560:12;522:52;602:9;596:16;621:31;646:5;621:31;:::i;947:388::-;1015:6;1023;1076:2;1064:9;1055:7;1051:23;1047:32;1044:52;;;1092:1;1089;1082:12;1044:52;1131:9;1118:23;1150:31;1175:5;1150:31;:::i;:::-;1200:5;-1:-1:-1;1257:2:1;1242:18;;1229:32;1270:33;1229:32;1270:33;:::i;:::-;1322:7;1312:17;;;947:388;;;;;:::o;1340:456::-;1417:6;1425;1433;1486:2;1474:9;1465:7;1461:23;1457:32;1454:52;;;1502:1;1499;1492:12;1454:52;1541:9;1528:23;1560:31;1585:5;1560:31;:::i;:::-;1610:5;-1:-1:-1;1667:2:1;1652:18;;1639:32;1680:33;1639:32;1680:33;:::i;:::-;1340:456;;1732:7;;-1:-1:-1;;;1786:2:1;1771:18;;;;1758:32;;1340:456::o;1801:315::-;1866:6;1874;1927:2;1915:9;1906:7;1902:23;1898:32;1895:52;;;1943:1;1940;1933:12;1895:52;1982:9;1969:23;2001:31;2026:5;2001:31;:::i;:::-;2051:5;-1:-1:-1;2075:35:1;2106:2;2091:18;;2075:35;:::i;:::-;2065:45;;1801:315;;;;;:::o;2121:::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2305:9;2292:23;2324:31;2349:5;2324:31;:::i;:::-;2374:5;2426:2;2411:18;;;;2398:32;;-1:-1:-1;;;2121:315:1:o;2441:180::-;2497:6;2550:2;2538:9;2529:7;2525:23;2521:32;2518:52;;;2566:1;2563;2556:12;2518:52;2589:26;2605:9;2589:26;:::i;2626:316::-;2694:6;2702;2710;2763:2;2751:9;2742:7;2738:23;2734:32;2731:52;;;2779:1;2776;2769:12;2731:52;2802:26;2818:9;2802:26;:::i;:::-;2792:36;;2847:35;2878:2;2867:9;2863:18;2847:35;:::i;:::-;2837:45;;2901:35;2932:2;2921:9;2917:18;2901:35;:::i;:::-;2891:45;;2626:316;;;;;:::o;2947:180::-;3006:6;3059:2;3047:9;3038:7;3034:23;3030:32;3027:52;;;3075:1;3072;3065:12;3027:52;-1:-1:-1;3098:23:1;;2947:180;-1:-1:-1;2947:180:1:o;3132:248::-;3200:6;3208;3261:2;3249:9;3240:7;3236:23;3232:32;3229:52;;;3277:1;3274;3267:12;3229:52;-1:-1:-1;;3300:23:1;;;3370:2;3355:18;;;3342:32;;-1:-1:-1;3132:248:1:o;3385:316::-;3462:6;3470;3478;3531:2;3519:9;3510:7;3506:23;3502:32;3499:52;;;3547:1;3544;3537:12;3499:52;-1:-1:-1;;3570:23:1;;;3640:2;3625:18;;3612:32;;-1:-1:-1;3691:2:1;3676:18;;;3663:32;;3385:316;-1:-1:-1;3385:316:1:o;3706:306::-;3794:6;3802;3810;3863:2;3851:9;3842:7;3838:23;3834:32;3831:52;;;3879:1;3876;3869:12;3831:52;3908:9;3902:16;3892:26;;3958:2;3947:9;3943:18;3937:25;3927:35;;4002:2;3991:9;3987:18;3981:25;3971:35;;3706:306;;;;;:::o;4017:385::-;4103:6;4111;4119;4127;4180:3;4168:9;4159:7;4155:23;4151:33;4148:53;;;4197:1;4194;4187:12;4148:53;-1:-1:-1;;4220:23:1;;;4290:2;4275:18;;4262:32;;-1:-1:-1;4341:2:1;4326:18;;4313:32;;4392:2;4377:18;4364:32;;-1:-1:-1;4017:385:1;-1:-1:-1;4017:385:1:o;4407:337::-;4473:6;4481;4534:2;4522:9;4513:7;4509:23;4505:32;4502:52;;;4550:1;4547;4540:12;4502:52;4589:9;4576:23;4639:4;4632:5;4628:16;4621:5;4618:27;4608:55;;4659:1;4656;4649:12;6304:597;6416:4;6445:2;6474;6463:9;6456:21;6506:6;6500:13;6549:6;6544:2;6533:9;6529:18;6522:34;6574:1;6584:140;6598:6;6595:1;6592:13;6584:140;;;6693:14;;;6689:23;;6683:30;6659:17;;;6678:2;6655:26;6648:66;6613:10;;6584:140;;;6742:6;6739:1;6736:13;6733:91;;;6812:1;6807:2;6798:6;6787:9;6783:22;6779:31;6772:42;6733:91;-1:-1:-1;6885:2:1;6864:15;-1:-1:-1;;6860:29:1;6845:45;;;;6892:2;6841:54;;6304:597;-1:-1:-1;;;6304:597:1:o;13421:356::-;13623:2;13605:21;;;13642:18;;;13635:30;13701:34;13696:2;13681:18;;13674:62;13768:2;13753:18;;13421:356::o;14598:329::-;14800:2;14782:21;;;14839:1;14819:18;;;14812:29;-1:-1:-1;;;14872:2:1;14857:18;;14850:36;14918:2;14903:18;;14598:329::o;15690:425::-;15892:2;15874:21;;;15931:2;15911:18;;;15904:30;15970:34;15965:2;15950:18;;15943:62;16041:31;16036:2;16021:18;;16014:59;16105:3;16090:19;;15690:425::o;16302:980::-;16564:4;16612:3;16601:9;16597:19;16643:6;16632:9;16625:25;16669:2;16707:6;16702:2;16691:9;16687:18;16680:34;16750:3;16745:2;16734:9;16730:18;16723:31;16774:6;16809;16803:13;16840:6;16832;16825:22;16878:3;16867:9;16863:19;16856:26;;16917:2;16909:6;16905:15;16891:29;;16938:1;16948:195;16962:6;16959:1;16956:13;16948:195;;;17027:13;;-1:-1:-1;;;;;17023:39:1;17011:52;;17118:15;;;;17083:12;;;;17059:1;16977:9;16948:195;;;-1:-1:-1;;;;;;;17199:32:1;;;;17194:2;17179:18;;17172:60;-1:-1:-1;;;17263:3:1;17248:19;17241:35;17160:3;16302:980;-1:-1:-1;;;16302:980:1:o;17800:128::-;17840:3;17871:1;17867:6;17864:1;17861:13;17858:39;;;17877:18;;:::i;:::-;-1:-1:-1;17913:9:1;;17800:128::o;17933:204::-;17971:3;18007:4;18004:1;18000:12;18039:4;18036:1;18032:12;18074:3;18068:4;18064:14;18059:3;18056:23;18053:49;;;18082:18;;:::i;:::-;18118:13;;17933:204;-1:-1:-1;;;17933:204:1:o;18142:120::-;18182:1;18208;18198:35;;18213:18;;:::i;:::-;-1:-1:-1;18247:9:1;;18142:120::o;18267:422::-;18356:1;18399:5;18356:1;18413:270;18434:7;18424:8;18421:21;18413:270;;;18493:4;18489:1;18485:6;18481:17;18475:4;18472:27;18469:53;;;18502:18;;:::i;:::-;18552:7;18542:8;18538:22;18535:55;;;18572:16;;;;18535:55;18651:22;;;;18611:15;;;;18413:270;;;18417:3;18267:422;;;;;:::o;18694:131::-;18754:5;18783:36;18810:8;18804:4;18879:5;18909:8;18899:80;;-1:-1:-1;18950:1:1;18964:5;;18899:80;18998:4;18988:76;;-1:-1:-1;19035:1:1;19049:5;;18988:76;19080:4;19098:1;19093:59;;;;19166:1;19161:130;;;;19073:218;;19093:59;19123:1;19114:10;;19137:5;;;19161:130;19198:3;19188:8;19185:17;19182:43;;;19205:18;;:::i;:::-;-1:-1:-1;;19261:1:1;19247:16;;19276:5;;19073:218;;19375:2;19365:8;19362:16;19356:3;19350:4;19347:13;19343:36;19337:2;19327:8;19324:16;19319:2;19313:4;19310:12;19306:35;19303:77;19300:159;;;-1:-1:-1;19412:19:1;;;19444:5;;19300:159;19491:34;19516:8;19510:4;19491:34;:::i;:::-;19561:6;19557:1;19553:6;19549:19;19540:7;19537:32;19534:58;;;19572:18;;:::i;:::-;19610:20;;18830:806;-1:-1:-1;;;18830:806:1:o;19641:168::-;19681:7;19747:1;19743;19739:6;19735:14;19732:1;19729:21;19724:1;19717:9;19710:17;19706:45;19703:71;;;19754:18;;:::i;:::-;-1:-1:-1;19794:9:1;;19641:168::o;19814:125::-;19854:4;19882:1;19879;19876:8;19873:34;;;19887:18;;:::i;:::-;-1:-1:-1;19924:9:1;;19814:125::o;19944:380::-;20023:1;20019:12;;;;20066;;;20087:61;;20141:4;20133:6;20129:17;20119:27;;20087:61;20194:2;20186:6;20183:14;20163:18;20160:38;20157:161;;;20240:10;20235:3;20231:20;20228:1;20221:31;20275:4;20272:1;20265:15;20303:4;20300:1;20293:15;20157:161;;19944:380;;;:::o;20329:135::-;20368:3;-1:-1:-1;;20389:17:1;;20386:43;;;20409:18;;:::i;:::-;-1:-1:-1;20456:1:1;20445:13;;20329:135::o;20469:112::-;20501:1;20527;20517:35;;20532:18;;:::i;:::-;-1:-1:-1;20566:9:1;;20469:112::o;20586:127::-;20647:10;20642:3;20638:20;20635:1;20628:31;20678:4;20675:1;20668:15;20702:4;20699:1;20692:15;20718:127;20779:10;20774:3;20770:20;20767:1;20760:31;20810:4;20807:1;20800:15;20834:4;20831:1;20824:15;20850:127;20911:10;20906:3;20902:20;20899:1;20892:31;20942:4;20939:1;20932:15;20966:4;20963:1;20956:15;20982:127;21043:10;21038:3;21034:20;21031:1;21024:31;21074:4;21071:1;21064:15;21098:4;21095:1;21088:15;21246:131;-1:-1:-1;;;;;21321:31:1;;21311:42;;21301:70;;21367:1;21364;21357:12;21301:70;21246:131;:::o

Swarm Source

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