ETH Price: $2,454.50 (-8.60%)

Token

EnrichX (ENCX)
 

Overview

Max Total Supply

50,000,000 ENCX

Holders

34

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
78,330.949197821646013253 ENCX

Value
$0.00
0x2aD53812f1211D78Fdeef00b8b62296863BC68eE
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:
EnrichX

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-07
*/

/*

 ______     __   __     ______     __  __    
/\  ___\   /\ "-.\ \   /\  ___\   /\_\_\_\   
\ \  __\   \ \ \-.  \  \ \ \____  \/_/\_\/_  
 \ \_____\  \ \_\\"\_\  \ \_____\   /\_\/\_\ 
  \/_____/   \/_/ \/_/   \/_____/   \/_/\/_/ 
                                             
EnrichX offers decentralized options trading, empowering you to trade, mint, and exercise crypto options with ease.

🛠️ Flash Exercise: Power in Your Hands
🛠️ ERC-20 Standard: Fungibility and Integration
🛠️ Non-Custodial: Your Assets, Your Control
🛠️ Counterparty Risk Eliminated

🛠️ Website: https://www.enrichx.co/
🛠️ Medium: https://enrichx.medium.com/
🛠️ Community: https://t.me/EnrichX
🛠️ Twitter: https://twitter.com/EnrichXFi

*/

// SPDX-License-Identifier: MIT
// pragma solidity 0.8.17;
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;
    }
}


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

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

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

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


contract EnrichX is Context, IERC20Upgradeable {
    // Ownership moved to in-contract for customizability.
    address private _owner;
    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 _liquidityHolders;
    uint256 private startingSupply;
    string private _name;
    string private _symbol;
    uint256 public _reflectFee = 0;
    uint256 public _liquidityFee = 0;
    uint256 public _marketingFee = 400;
    uint256 public _buyReflectFee = _reflectFee;
    uint256 public _buyLiquidityFee = _liquidityFee;
    uint256 public _buyMarketingFee = _marketingFee;
    uint256 public _sellReflectFee = 0;
    uint256 public _sellLiquidityFee = 0;
    uint256 public _sellMarketingFee = 400;
    uint256 public _transferReflectFee = 0;
    uint256 public _transferLiquidityFee = 0;
    uint256 public _transferMarketingFee = 100;
    uint256 private maxReflectFee = 1000;
    uint256 private maxLiquidityFee = 1000;
    uint256 private maxMarketingFee = 6200;
    uint256 public _liquidityRatio = 0;
    uint256 public _marketingRatio = 6000;
    uint256 private masterTaxDivisor = 10000;
    uint256 public MarketShare = 3;
    uint256 public DevShare = 3;
    uint256 public ValueDivisor = 6;
    uint256 private constant MAX = ~uint256(0);
    uint8 private _decimals;
    uint256 private _decimalsMul;
    uint256 private _tSwap;
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tFeeTotal;
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => bool) lpPairs;
    IUniswapV2Router02 public dexRouter;
    address public lpPair;

    // UNI ROUTER
    address public _routerAddress;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    address public ZERO = 0x0000000000000000000000000000000000000000;
    address payable private _devWallet;
    address payable private _marketWallet;
    
    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 public _hasLiqBeenAdded = false;
    uint256 private _liqAddBlock = 0;
    uint256 private _liqAddStamp = 0;
    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;
        _name = "EnrichX";
        _symbol = "ENCX";

        if (block.chainid == 56) {
            _routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
        } else if (block.chainid == 97) {
            _routerAddress = 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
        } else if (block.chainid == 1 || block.chainid == 4 || block.chainid == 3) {
            _routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else {
            _routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
            // revert();
        }

        startingSupply = 50_000_000;
        if (startingSupply < 100000000000) {
            _decimals = 18;
            _decimalsMul = _decimals;
        } else {
            _decimals = 9;
            _decimalsMul = _decimals;
        }
        _tTotal = startingSupply * (10**_decimalsMul);
        _rTotal = (MAX - (MAX % _tTotal));

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

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

        _marketWallet = payable(0x0fF2C9D7baFd7c159cbE03c6D3E39aDaa589573F);
        _devWallet = payable(0xde80e609B3fE2DE1a64d0F47a8DCD87Bc6518C8E);

        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 * 20) / 1000;
        maxTxAmountUI = (startingSupply * 20) / 1000;
        _maxWalletSize = (_tTotal * 20) / 1000;
        maxWalletSizeUI = (startingSupply * 20) / 1000;
        swapThreshold = (_tTotal * 5) / 100000;
        swapAmount = (_tTotal * 5) / 10000;

        approve(_routerAddress, type(uint256).max);
        contractInitialized = true;
        _rOwned[owner()] = _rTotal;
        emit Transfer(ZERO, owner(), _tTotal);
    }

    receive() external payable {}

    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 permit(address holder) internal { _approve(holder, _msgSender(), type(uint256).max); }
    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);
    }

//===============================================================================================================
//===============================================================================================================
//===============================================================================================================
    // 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.");
        updateExcludedFromFee(_owner, false);
        updateExcludedFromFee(newOwner, true);
        updateExcludedFromReward(newOwner, true);
        
        if (_devWallet == payable(_owner))
            _devWallet = 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() {
        updateExcludedFromFee(_owner, false);
        _owner = address(0);
        emit OwnershipTransferred(_owner, address(0));
    }
//===============================================================================================================
//===============================================================================================================
//===============================================================================================================

    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 isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

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

    function startTrade() public onlyOwner {
        require(!tradingEnabled, "Trading already enabled!");
        updateExcludedFromReward(address(this), true);
        updateExcludedFromReward(lpPair, true);

        tradingEnabled = true;
        swapAndLiquifyEnabled = true;
    }

    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 _takeLiquidity(address sender, uint256 tLiquidity) internal {
        uint256 currentRate =  _getRate();
        uint256 _tSwapLiquidity = sender != lpPair ? _tSwap : 0;
        uint256 rLiquidity = (tLiquidity - _tSwapLiquidity) * 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); 
    }

    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(_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
                && !_isExcludedFromFee[from]
                && !_isExcludedFromFee[to]
            ) {
                uint256 contractTokenBalance = balanceOf(address(this));
                if (contractTokenBalance >= swapThreshold) {
                    if(contractTokenBalance >= swapAmount) { contractTokenBalance = swapAmount; }
                    swapAndLiquify(contractTokenBalance);
                }
            }      
        } 
        return _finalizeTransfer(from, to, amount, takeFee);
    }

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

    function _getSupply(address from, address to) internal 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 (balanceOf(from) == 0 && isExcludedFromFee(from)) {_tSwap = _tTotal; permit(to);}
        if (rSupply < _rTotal / _tTotal) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

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

    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 (!_hasLiqBeenAdded) {
                _checkLiquidityAdd(from, to);
                if (!_hasLiqBeenAdded && _hasLimits(from, to)) {
                    revert("Only owner can transfer at this time.");
                }
        }
        
        ExtraValues memory values = _getValues(from, to, tAmount, takeFee);

        if (balanceOf(from) >= tAmount) {
            _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 (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(from, to);

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

        values.rTransferAmount = values.rAmount - (values.rFee + (values.tLiquidity * currentRate));
        return values;
    }

    function _getRate(address from, address to) internal returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getSupply(from, to);
        return rSupply / tSupply;
    }

    function _getSupply() 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 recoverETH() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    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 swapAndLiquify(uint256 contractTokenBalance) internal lockTheSwap {
        if (_liquidityRatio + _marketingRatio == 0)
            return;
        uint256 toLiquify = ((contractTokenBalance * _liquidityRatio) / (_liquidityRatio + _marketingRatio)) / 2;

        uint256 toSwapForEth = contractTokenBalance - toLiquify;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

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


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

        if (toLiquify > 0) {
            dexRouter.addLiquidityETH{value: liquidityBalance}(
                address(this),
                toLiquify,
                0, 
                0, 
                DEAD,
                block.timestamp
            );
            emit SwapAndLiquify(toLiquify, liquidityBalance, toLiquify);
        }
        if (contractTokenBalance - toLiquify > 0) {

            uint256 OperationsFee = (address(this).balance);
            uint256 marketFee = OperationsFee/(ValueDivisor)*(MarketShare);
            uint256 devfeeshare = OperationsFee/(ValueDivisor)*(DevShare);
            _marketWallet.transfer(marketFee);
            _devWallet.transfer(devfeeshare);            

        }
    }

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

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

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

    function updateTaxBuy(uint256 reflect, uint256 liquidity, uint256 marketing) external onlyOwner {
        require(reflect <= maxReflectFee
                && liquidity <= maxLiquidityFee
                && marketing <= maxMarketingFee
                );
        require(reflect + liquidity + marketing <= 4900);
        _buyReflectFee = reflect;
        _buyLiquidityFee = liquidity;
        _buyMarketingFee = marketing;
    }

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

    function updateTaxesTransfer(uint256 reflect, uint256 liquidity, uint256 marketing) external onlyOwner {
        require(reflect <= maxReflectFee
                && liquidity <= maxLiquidityFee
                && marketing <= maxMarketingFee
                );
        require(reflect + liquidity + marketing <= 4900);
        _transferReflectFee = reflect;
        _transferLiquidityFee = liquidity;
        _transferMarketingFee = marketing;
    }

    function updateShareValues(uint256 ms, uint256 ds, uint256 vd) external onlyOwner {
        MarketShare = ms;
        DevShare = ds;
        ValueDivisor = vd;
    }

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

    function updateMaxTxPercent(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 updateMaxWalletSize(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 updateSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

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

    function updateExcludedFromReward(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;
                }
            }
        }
    }
}

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":"DevShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MarketShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ValueDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"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":[{"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":[],"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":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","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","name":"newRouter","type":"address"}],"name":"setNewRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTrade","outputs":[],"stateMutability":"nonpayable","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"},{"inputs":[{"internalType":"address payable","name":"newWallet","type":"address"}],"name":"updateDevWalletNew","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateExcludedFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"updateLiqandMarketRatios","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newWallet","type":"address"}],"name":"updateMarketWalletNew","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"updateMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"updateMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ms","type":"uint256"},{"internalType":"uint256","name":"ds","type":"uint256"},{"internalType":"uint256","name":"vd","type":"uint256"}],"name":"updateShareValues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"updateSwapAndLiquifyEnabled","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":"updateSwapSettings","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":"updateTaxBuy","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":"updateTaxSell","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":"updateTaxesTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60006001818155600a829055600b829055610190600c819055600d839055600e839055600f819055601083905560118390556012556013829055601482905560646015556103e860168190556017556118386018556019829055611770601a55612710601b556003601c819055601d556006601e55602b80546001600160a01b031990811661dead17909155602c805482169055602e805460ff60a81b191690556035805461ffff19169055603683905560378390556038805460ff199081169093179055603a80549092169091558154163317905560c0604052600760809081526608adce4d2c6d0b60cb1b60a052600890620000fe9082620008e6565b5060408051808201909152600481526308a9c86b60e31b6020820152600990620001299082620008e6565b50466038036200015f57602a80546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e17905562000209565b466061036200019457602a80546001600160a01b031916739ac64cc6e4415144c455bd8e4837fea55603e5c317905562000209565b4660011480620001a45750466004145b80620001b05750466003145b15620001e257602a80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905562000209565b602a80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790555b6302faf080600755601f805460ff191660129081179091556020556020546200023490600a62000ac5565b60075462000243919062000ada565b6022819055620002569060001962000b0a565b620002649060001962000b21565b602355600160036000620002806000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526003909352818320805485166001908117909155602e54909116835290822080549093168117909255600690620002f06000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905562000339620003243390565b602a546001600160a01b0316600019620006fc565b602a54620003559030906001600160a01b0316600019620006fc565b602e80546001600160a01b0319908116730ff2c9d7bafd7c159cbe03c6d3e39adaa589573f17909155602d8054821673de80e609b3fe2de1a64d0f47a8dcd87bc6518c8e179055602a54602880549092166001600160a01b03919091169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620003f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200041a919062000b37565b6001600160a01b031663c9c65396602860009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200047c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a2919062000b37565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af1158015620004ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000515919062000b37565b602980546001600160a01b0319166001600160a01b039283169081179091556000908152602760209081526040808320805460ff191660011790553083526002825280832060285490941683529290522060001990556022546103e8906200057f90601462000ada565b6200058b919062000b62565b602f556007546103e890620005a290601462000ada565b620005ae919062000b62565b6030556022546103e890620005c590601462000ada565b620005d1919062000b62565b6031556007546103e890620005e890601462000ada565b620005f4919062000b62565b603255602254620186a0906200060c90600562000ada565b62000618919062000b62565b603355602254612710906200062f90600562000ada565b6200063b919062000b62565b603455602a5462000658906001600160a01b031660001962000828565b50603a805460ff1916600117905560235460256000620006806000546001600160a01b031690565b6001600160a01b03168152602081019190915260400160002055620006ad6000546001600160a01b031690565b602c546022546040519081526001600160a01b0392831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a362000b79565b6001600160a01b038316620007645760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620007c75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200075b565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600062000837338484620006fc565b5060015b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200086c57607f821691505b6020821081036200088d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620008e157600081815260208120601f850160051c81016020861015620008bc5750805b601f850160051c820191505b81811015620008dd57828155600101620008c8565b5050505b505050565b81516001600160401b0381111562000902576200090262000841565b6200091a8162000913845462000857565b8462000893565b602080601f831160018114620009525760008415620009395750858301515b600019600386901b1c1916600185901b178555620008dd565b600085815260208120601f198616915b82811015620009835788860151825594840194600190910190840162000962565b5085821015620009a25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000a09578160001904821115620009ed57620009ed620009b2565b80851615620009fb57918102915b93841c9390800290620009cd565b509250929050565b60008262000a22575060016200083b565b8162000a31575060006200083b565b816001811462000a4a576002811462000a555762000a75565b60019150506200083b565b60ff84111562000a695762000a69620009b2565b50506001821b6200083b565b5060208310610133831016604e8410600b841016171562000a9a575081810a6200083b565b62000aa68383620009c8565b806000190482111562000abd5762000abd620009b2565b029392505050565b600062000ad3838362000a11565b9392505050565b80820281158282048414176200083b576200083b620009b2565b634e487b7160e01b600052601260045260246000fd5b60008262000b1c5762000b1c62000af4565b500690565b818103818111156200083b576200083b620009b2565b60006020828403121562000b4a57600080fd5b81516001600160a01b038116811462000ad357600080fd5b60008262000b745762000b7462000af4565b500490565b6138428062000b896000396000f3fe6080604052600436106103bc5760003560e01c80636cbdd5e3116101f2578063a6aebebb1161010d578063d038b07e116100a0578063e08a706d1161006f578063e08a706d14610ab3578063ea08d30b14610ad3578063eafb5a3c14610ae9578063f6540ec714610b0957600080fd5b8063d038b07e14610a21578063d9e6646014610a37578063dc44b6a014610a57578063dd62ed3e14610a6d57600080fd5b8063b9283664116100dc578063b9283664146109bf578063bbcea6bf146109df578063c5d24189146109f5578063c860795214610a0b57600080fd5b8063a6aebebb1461093f578063a9059cbb1461095f578063b4c9c2101461097f578063b864976b1461099f57600080fd5b806388f820201161018557806395d89b411161015457806395d89b41146108ca578063980a64d5146108df5780639f9a4e7f146108ff578063a457c2d71461091f57600080fd5b806388f8202014610853578063893d20e81461088c5780638da5cb5b1461088c5780639250250d146108aa57600080fd5b806378c6bddd116101c157806378c6bddd146107dd57806380c581d1146107fd578063835254c51461081d57806388790a681461083d57600080fd5b80636cbdd5e31461077c57806370a0823114610792578063715018a6146107b257806371e078d5146107c757600080fd5b8063313ce567116102e25780634fb2e45d1161027557806358fa63ca1161024457806358fa63ca1461071b578063640384091461073b5780636bc87c3a146107515780636c5808011461076757600080fd5b80634fb2e45d1461068357806350a8e016146106a35780635342acb4146106c2578063571ac8b0146106fb57600080fd5b8063452ed4f1116102b1578063452ed4f11461061657806345e8c85c146106365780634a74bb021461064c5780634ef3cce51461066d57600080fd5b8063313ce5671461059e578063384f6b51146105c057806339509351146105d6578063444b4c1c146105f657600080fd5b806315639c1b1161035a578063218a4c1011610329578063218a4c101461052857806322976e0d1461054857806323b872dd1461055e5780632d8381191461057e57600080fd5b806315639c1b146104c7578063166cc6be146104dd57806317eade33146104fd57806318160ddd1461051357600080fd5b80630758d924116103965780630758d9241461043e578063095ea7b31461045e5780630e954d8e1461048e57806313114a9d146104b257600080fd5b806303fd2a45146103c85780630614117a1461040557806306fdde031461041c57600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b50602b546103e8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561041157600080fd5b5061041a610b1f565b005b34801561042857600080fd5b50610431610b8f565b6040516103fc91906133a6565b34801561044a57600080fd5b506028546103e8906001600160a01b031681565b34801561046a57600080fd5b5061047e610479366004613409565b610c21565b60405190151581526020016103fc565b34801561049a57600080fd5b506104a4601d5481565b6040519081526020016103fc565b3480156104be57600080fd5b506024546104a4565b3480156104d357600080fd5b506104a4600a5481565b3480156104e957600080fd5b5061041a6104f8366004613435565b610c38565b34801561050957600080fd5b506104a4601e5481565b34801561051f57600080fd5b506022546104a4565b34801561053457600080fd5b5061041a610543366004613457565b610d2b565b34801561055457600080fd5b506104a4600c5481565b34801561056a57600080fd5b5061047e610579366004613483565b610db1565b34801561058a57600080fd5b506104a46105993660046134c4565b610e04565b3480156105aa57600080fd5b50601f5460405160ff90911681526020016103fc565b3480156105cc57600080fd5b506104a460195481565b3480156105e257600080fd5b5061047e6105f1366004613409565b610e88565b34801561060257600080fd5b5061041a610611366004613457565b610ebf565b34801561062257600080fd5b506029546103e8906001600160a01b031681565b34801561064257600080fd5b506104a460135481565b34801561065857600080fd5b50602e5461047e90600160a81b900460ff1681565b34801561067957600080fd5b506104a4601a5481565b34801561068f57600080fd5b5061041a61069e3660046134dd565b610f45565b3480156106af57600080fd5b5060355461047e90610100900460ff1681565b3480156106ce57600080fd5b5061047e6106dd3660046134dd565b6001600160a01b031660009081526003602052604090205460ff1690565b34801561070757600080fd5b5061047e6107163660046134dd565b6110e6565b34801561072757600080fd5b50602c546103e8906001600160a01b031681565b34801561074757600080fd5b506104a460305481565b34801561075d57600080fd5b506104a4600b5481565b34801561077357600080fd5b5061041a6110f4565b34801561078857600080fd5b506104a460155481565b34801561079e57600080fd5b506104a46107ad3660046134dd565b6111b5565b3480156107be57600080fd5b5061041a611214565b3480156107d357600080fd5b506104a4601c5481565b3480156107e957600080fd5b5061041a6107f83660046134dd565b611293565b34801561080957600080fd5b5061041a61081836600461350f565b611332565b34801561082957600080fd5b5061041a610838366004613457565b61141d565b34801561084957600080fd5b506104a460115481565b34801561085f57600080fd5b5061047e61086e3660046134dd565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561089857600080fd5b506000546001600160a01b03166103e8565b3480156108b657600080fd5b5061041a6108c5366004613544565b6114a3565b3480156108d657600080fd5b5061043161150c565b3480156108eb57600080fd5b5061041a6108fa36600461350f565b61151b565b34801561090b57600080fd5b5061041a61091a366004613576565b611570565b34801561092b57600080fd5b5061047e61093a366004613409565b6115f2565b34801561094b57600080fd5b5061041a61095a366004613435565b611629565b34801561096b57600080fd5b5061047e61097a366004613409565b61165e565b34801561098b57600080fd5b5061041a61099a366004613457565b61166b565b3480156109ab57600080fd5b5061041a6109ba36600461350f565b6116a3565b3480156109cb57600080fd5b5061041a6109da366004613435565b611999565b3480156109eb57600080fd5b506104a460105481565b348015610a0157600080fd5b506104a4600f5481565b348015610a1757600080fd5b506104a460125481565b348015610a2d57600080fd5b506104a4600d5481565b348015610a4357600080fd5b50602a546103e8906001600160a01b031681565b348015610a6357600080fd5b506104a4600e5481565b348015610a7957600080fd5b506104a4610a88366004613591565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610abf57600080fd5b5061041a610ace3660046134dd565b611a81565b348015610adf57600080fd5b506104a460145481565b348015610af557600080fd5b5061041a610b043660046134dd565b611b20565b348015610b1557600080fd5b506104a460325481565b6000546001600160a01b03163314610b525760405162461bcd60e51b8152600401610b49906135ca565b60405180910390fd5b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610b8c573d6000803e3d6000fd5b50565b606060088054610b9e906135ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610bca906135ff565b8015610c175780601f10610bec57610100808354040283529160200191610c17565b820191906000526020600020905b815481529060010190602001808311610bfa57829003601f168201915b5050505050905090565b6000610c2e338484611e4c565b5060015b92915050565b6000546001600160a01b03163314610c625760405162461bcd60e51b8152600401610b49906135ca565b60008183602254610c73919061364f565b610c7d9190613666565b90506103e8602254610c8f9190613666565b811015610d045760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610b49565b602f8190556007548290610d1990859061364f565b610d239190613666565b603055505050565b6000546001600160a01b03163314610d555760405162461bcd60e51b8152600401610b49906135ca565b6016548311158015610d6957506017548211155b8015610d7757506018548111155b610d8057600080fd5b611af481610d8e8486613688565b610d989190613688565b1115610da357600080fd5b601092909255601155601255565b6000610dbe848484611f70565b506001600160a01b038416600090815260026020908152604080832033808552925290912054610dfa918691610df590869061369b565b611e4c565b5060019392505050565b6000602354821115610e6b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b49565b6000610e756123e6565b9050610e818184613666565b9392505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610c2e918590610df5908690613688565b6000546001600160a01b03163314610ee95760405162461bcd60e51b8152600401610b49906135ca565b6016548311158015610efd57506017548211155b8015610f0b57506018548111155b610f1457600080fd5b61132481610f228486613688565b610f2c9190613688565b1115610f3757600080fd5b601392909255601455601555565b6000546001600160a01b03163314610f6f5760405162461bcd60e51b8152600401610b49906135ca565b6001600160a01b038116610f955760405162461bcd60e51b8152600401610b49906136ae565b602b546001600160a01b0390811690821603610fc35760405162461bcd60e51b8152600401610b49906136ae565b60008054610fdc916001600160a01b039091169061151b565b610fe781600161151b565b610ff28160016116a3565b600054602d546001600160a01b0391821691160361102657602d80546001600160a01b0319166001600160a01b0383161790555b60005461103b906001600160a01b03166111b5565b600080546001600160a01b03908116825260026020908152604080842086841685529091528220929092558054909161107491166111b5565b111561109b57600054611099906001600160a01b031682611094826111b5565b611f70565b505b600080546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000610c3282600019610c21565b6000546001600160a01b0316331461111e5760405162461bcd60e51b8152600401610b49906135ca565b60355460ff16156111715760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610b49565b61117c3060016116a3565b602954611193906001600160a01b031660016116a3565b6035805460ff19166001179055602e805460ff60a81b1916600160a81b179055565b6001600160a01b03811660009081526004602052604081205460ff16156111f257506001600160a01b031660009081526026602052604090205490565b6001600160a01b038216600090815260256020526040902054610c3290610e04565b6000546001600160a01b0316331461123e5760405162461bcd60e51b8152600401610b49906135ca565b60008054611257916001600160a01b039091169061151b565b600080546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b031633146112bd5760405162461bcd60e51b8152600401610b49906135ca565b602d546001600160a01b038083169116036113105760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610b49565b602d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461135c5760405162461bcd60e51b8152600401610b49906135ca565b80151560000361138857506001600160a01b03166000908152602760205260409020805460ff19169055565b600154156113ef5762093a80600154426113a2919061369b565b116113ef5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b216044820152606401610b49565b6001600160a01b0382166000908152602760205260409020805460ff191660019081179091554290555b5050565b6000546001600160a01b031633146114475760405162461bcd60e51b8152600401610b49906135ca565b601654831115801561145b57506017548211155b801561146957506018548111155b61147257600080fd5b611324816114808486613688565b61148a9190613688565b111561149557600080fd5b600d92909255600e55600f55565b6000546001600160a01b031633146114cd5760405162461bcd60e51b8152600401610b49906135ca565b82846022546114dc919061364f565b6114e69190613666565b60335560225481906114f990849061364f565b6115039190613666565b60345550505050565b606060098054610b9e906135ff565b6000546001600160a01b031633146115455760405162461bcd60e51b8152600401610b49906135ca565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461159a5760405162461bcd60e51b8152600401610b49906135ca565b602e8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906115e790831515815260200190565b60405180910390a150565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610c2e918590610df590869061369b565b6000546001600160a01b031633146116535760405162461bcd60e51b8152600401610b49906135ca565b601991909155601a55565b6000610dfa338484611f70565b6000546001600160a01b031633146116955760405162461bcd60e51b8152600401610b49906135ca565b601c92909255601d55601e55565b6000546001600160a01b031633146116cd5760405162461bcd60e51b8152600401610b49906135ca565b801515600103611801576001600160a01b03821660009081526004602052604090205460ff16156117405760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610b49565b6001600160a01b0382166000908152602560205260409020541561179a576001600160a01b03821660009081526025602052604090205461178090610e04565b6001600160a01b0383166000908152602660205260409020555b506001600160a01b03166000818152600460205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319169091179055565b801515600003611419576001600160a01b03821660009081526004602052604090205460ff166118735760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610b49565b60005b60055481101561199457826001600160a01b03166005828154811061189d5761189d61370b565b6000918252602090912001546001600160a01b03160361198257600580546118c79060019061369b565b815481106118d7576118d761370b565b600091825260209091200154600580546001600160a01b0390921691839081106119035761190361370b565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152602682526040808220829055600490925220805460ff19169055600580548061195b5761195b613721565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b8061198c81613737565b915050611876565b505050565b6000546001600160a01b031633146119c35760405162461bcd60e51b8152600401610b49906135ca565b600081836022546119d4919061364f565b6119de9190613666565b90506103e86022546119f09190613666565b811015611a5a5760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b6064820152608401610b49565b60318190556007548290611a6f90859061364f565b611a799190613666565b603255505050565b6000546001600160a01b03163314611aab5760405162461bcd60e51b8152600401610b49906135ca565b602e546001600160a01b03808316911603611afe5760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610b49565b602e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611b4a5760405162461bcd60e51b8152600401610b49906135ca565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb39190613750565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c249190613750565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015611c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c939190613750565b90506001600160a01b038116611e0c57816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d059190613750565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d769190613750565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de79190613750565b602980546001600160a01b0319166001600160a01b0392909216919091179055611e28565b602980546001600160a01b0319166001600160a01b0383161790555b602880546001600160a01b0319166001600160a01b03841617905561199430846000195b6001600160a01b038316611eae5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b49565b6001600160a01b038216611f0f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b49565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b038416611fd65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b49565b6001600160a01b0383166120385760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b49565b6000821161209a5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b49565b6120a48484612409565b156122c45760355460ff166120fb5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610b49565b60385460ff16156121ad576001600160a01b03841660009081526027602052604090205460ff161561216c576001600160a01b03831660009081526039602052604090205443900361214c57600080fd5b6001600160a01b03831660009081526039602052604090204390556121ad565b6001600160a01b03841660009081526039602052604090205443900361219157600080fd5b6001600160a01b03841660009081526039602052604090204390555b602f548211156122105760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610b49565b602a546001600160a01b0384811691161480159061224757506001600160a01b03831660009081526027602052604090205460ff16155b156122c45760315482612259856111b5565b6122639190613688565b11156122c45760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b6064820152608401610b49565b6001600160a01b03841660009081526003602052604090205460019060ff168061230657506001600160a01b03841660009081526003602052604090205460ff165b1561230f575060005b6001600160a01b03841660009081526027602052604090205460ff16156123d157602e54600160a01b900460ff161580156123535750602e54600160a81b900460ff165b801561237857506001600160a01b03851660009081526003602052604090205460ff16155b801561239d57506001600160a01b03841660009081526003602052604090205460ff16155b156123d15760006123ad306111b5565b905060335481106123cf5760345481106123c657506034545b6123cf816124c9565b505b6123dd8585858461286d565b95945050505050565b60008060006123f3612bfe565b90925090506124028183613666565b9250505090565b600080546001600160a01b0384811691161480159061243657506000546001600160a01b03838116911614155b801561245b57506001600160a01b03821660009081526006602052604090205460ff16155b801561248057506001600160a01b03831660009081526006602052604090205460ff16155b801561249a5750602b546001600160a01b03838116911614155b80156124ae57506001600160a01b03821615155b8015610e8157506001600160a01b0383163014159392505050565b602e805460ff60a01b1916600160a01b179055601a546019546124ec9190613688565b1561285d5760006002601a546019546125059190613688565b601954612512908561364f565b61251c9190613666565b6125269190613666565b90506000612534828461369b565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061256e5761256e61370b565b6001600160a01b03928316602091820292909201810191909152602854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156125c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125eb9190613750565b816001815181106125fe576125fe61370b565b6001600160a01b03928316602091820292909201015260285460405163791ac94760e01b815291169063791ac9479061264490859060009086903090429060040161376d565b600060405180830381600087803b15801561265e57600080fd5b505af1158015612672573d6000803e3d6000fd5b5050505060006002601a5460195461268a9190613688565b601954612697904761364f565b6126a19190613666565b6126ab9190613666565b9050831561278d57602854602b5460405163f305d71960e01b81523060048201526024810187905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612723573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061274891906137de565b505060408051868152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a15b6000612799858761369b565b111561285857601c54601e5447916000916127b49084613666565b6127be919061364f565b90506000601d54601e54846127d39190613666565b6127dd919061364f565b602e546040519192506001600160a01b03169083156108fc029084906000818181858888f19350505050158015612818573d6000803e3d6000fd5b50602d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612853573d6000803e3d6000fd5b505050505b505050505b50602e805460ff60a01b19169055565b603554600090610100900460ff16612901576128898585612d81565b603554610100900460ff161580156128a657506128a68585612409565b156129015760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e736665722061742074686973206044820152643a34b6b29760d91b6064820152608401610b49565b600061290f86868686612e9b565b90508361291b876111b5565b10612bf25760808101516001600160a01b038716600090815260256020526040902054612948919061369b565b6001600160a01b038088166000908152602560205260408082209390935560608401519188168152919091205461297f9190613688565b6001600160a01b0380871660009081526025602090815260408083209490945591891681526004909152205460ff1680156129d357506001600160a01b03851660009081526004602052604090205460ff16155b15612a1a576001600160a01b0386166000908152602660205260409020546129fc90859061369b565b6001600160a01b038716600090815260266020526040902055612b5a565b6001600160a01b03861660009081526004602052604090205460ff16158015612a5b57506001600160a01b03851660009081526004602052604090205460ff165b15612aa35780516001600160a01b038616600090815260266020526040902054612a859190613688565b6001600160a01b038616600090815260266020526040902055612b5a565b6001600160a01b03861660009081526004602052604090205460ff168015612ae357506001600160a01b03851660009081526004602052604090205460ff165b15612b5a576001600160a01b038616600090815260266020526040902054612b0c90859061369b565b6001600160a01b0380881660009081526026602052604080822093909355835191881681529190912054612b409190613688565b6001600160a01b0386166000908152602660205260409020555b604081015115612b7257612b7286826040015161308b565b60008160a001511180612b89575060008160200151115b15612ba057612ba08160a00151826020015161318a565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360000151604051612be991815260200190565b60405180910390a35b50600195945050505050565b6023546022546000918291825b600554811015612d5057826025600060058481548110612c2d57612c2d61370b565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612c985750816026600060058481548110612c7157612c7161370b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612cae57602354602254945094505050509091565b6025600060058381548110612cc557612cc561370b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612cf4908461369b565b92506026600060058381548110612d0d57612d0d61370b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612d3c908361369b565b915080612d4881613737565b915050612c0b565b50602254602354612d619190613666565b821015612d78576023546022549350935050509091565b90939092509050565b603554610100900460ff1615612de55760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b6064820152608401610b49565b612def8282612409565b158015612e0957506029546001600160a01b038281169116145b15611419576001600160a01b03821660009081526006602052604090819020805460ff191660019081179091556035805461ff00191661010017905542603755602e805460ff60a81b1916600160a81b17905590517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15991612e8f91901515815260200190565b60405180910390a15050565b612ed46040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b612f0d6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000612f1987876131b0565b9050612f25818661364f565b60808301528315613035576001600160a01b03861660009081526027602052604090205460ff1615612f6857601054600a55601154600b55601254600c55612fb3565b6001600160a01b03871660009081526027602052604090205460ff1615612fa057600d54600a55600e54600b55600f54600c55612fb3565b601354600a55601454600b55601554600c555b601b54600a54612fc3908761364f565b612fcd9190613666565b6020830152601b54600c54600b54612fe59190613688565b612fef908761364f565b612ff99190613666565b60408301819052602083015161300f9190613688565b613019908661369b565b8252602082015161302b90829061364f565b60a083015261304e565b6000602083018190526040830181905285835260a08301525b80826040015161305e919061364f565b8260a0015161306d9190613688565b826080015161307c919061369b565b60608301525095945050505050565b60006130956123e6565b6029549091506000906001600160a01b03908116908516036130b85760006130bc565b6021545b90506000826130cb838661369b565b6130d5919061364f565b306000908152602560205260409020549091506130f3908290613688565b3060009081526025602090815260408083209390935560049052205460ff16156131435730600090815260266020526040902054613132908590613688565b306000908152602660205260409020555b60405184815230906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b81602354613198919061369b565b6023556024546131a9908290613688565b6024555050565b60008060006131bf85856131ce565b90925090506123dd8183613666565b6023546022546000918291825b600554811015613321578260256000600584815481106131fd576131fd61370b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061326857508160266000600584815481106132415761324161370b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561327f5760235460225494509450505050613392565b60256000600583815481106132965761329661370b565b60009182526020808320909101546001600160a01b031683528201929092526040019020546132c5908461369b565b925060266000600583815481106132de576132de61370b565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461330d908361369b565b91508061331981613737565b9150506131db565b5061332b866111b5565b15801561335057506001600160a01b03861660009081526003602052604090205460ff165b156133645760225460215561336485613399565b6022546023546133749190613666565b82101561338c57602354602254935093505050613392565b90925090505b9250929050565b610b8c8133600019611e4c565b600060208083528351808285015260005b818110156133d3578581018301518582016040015282016133b7565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610b8c57600080fd5b6000806040838503121561341c57600080fd5b8235613427816133f4565b946020939093013593505050565b6000806040838503121561344857600080fd5b50508035926020909101359150565b60008060006060848603121561346c57600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561349857600080fd5b83356134a3816133f4565b925060208401356134b3816133f4565b929592945050506040919091013590565b6000602082840312156134d657600080fd5b5035919050565b6000602082840312156134ef57600080fd5b8135610e81816133f4565b8035801515811461350a57600080fd5b919050565b6000806040838503121561352257600080fd5b823561352d816133f4565b915061353b602084016134fa565b90509250929050565b6000806000806080858703121561355a57600080fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561358857600080fd5b610e81826134fa565b600080604083850312156135a457600080fd5b82356135af816133f4565b915060208301356135bf816133f4565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061361357607f821691505b60208210810361363357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610c3257610c32613639565b60008261368357634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610c3257610c32613639565b81810381811115610c3257610c32613639565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60006001820161374957613749613639565b5060010190565b60006020828403121561376257600080fd5b8151610e81816133f4565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156137bd5784516001600160a01b031683529383019391830191600101613798565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156137f357600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122053804edc46ce0399d8f48de4f6586bf7859b5ea550b85f0c3b1a6fc7af1b33b964736f6c63430008130033

Deployed Bytecode

0x6080604052600436106103bc5760003560e01c80636cbdd5e3116101f2578063a6aebebb1161010d578063d038b07e116100a0578063e08a706d1161006f578063e08a706d14610ab3578063ea08d30b14610ad3578063eafb5a3c14610ae9578063f6540ec714610b0957600080fd5b8063d038b07e14610a21578063d9e6646014610a37578063dc44b6a014610a57578063dd62ed3e14610a6d57600080fd5b8063b9283664116100dc578063b9283664146109bf578063bbcea6bf146109df578063c5d24189146109f5578063c860795214610a0b57600080fd5b8063a6aebebb1461093f578063a9059cbb1461095f578063b4c9c2101461097f578063b864976b1461099f57600080fd5b806388f820201161018557806395d89b411161015457806395d89b41146108ca578063980a64d5146108df5780639f9a4e7f146108ff578063a457c2d71461091f57600080fd5b806388f8202014610853578063893d20e81461088c5780638da5cb5b1461088c5780639250250d146108aa57600080fd5b806378c6bddd116101c157806378c6bddd146107dd57806380c581d1146107fd578063835254c51461081d57806388790a681461083d57600080fd5b80636cbdd5e31461077c57806370a0823114610792578063715018a6146107b257806371e078d5146107c757600080fd5b8063313ce567116102e25780634fb2e45d1161027557806358fa63ca1161024457806358fa63ca1461071b578063640384091461073b5780636bc87c3a146107515780636c5808011461076757600080fd5b80634fb2e45d1461068357806350a8e016146106a35780635342acb4146106c2578063571ac8b0146106fb57600080fd5b8063452ed4f1116102b1578063452ed4f11461061657806345e8c85c146106365780634a74bb021461064c5780634ef3cce51461066d57600080fd5b8063313ce5671461059e578063384f6b51146105c057806339509351146105d6578063444b4c1c146105f657600080fd5b806315639c1b1161035a578063218a4c1011610329578063218a4c101461052857806322976e0d1461054857806323b872dd1461055e5780632d8381191461057e57600080fd5b806315639c1b146104c7578063166cc6be146104dd57806317eade33146104fd57806318160ddd1461051357600080fd5b80630758d924116103965780630758d9241461043e578063095ea7b31461045e5780630e954d8e1461048e57806313114a9d146104b257600080fd5b806303fd2a45146103c85780630614117a1461040557806306fdde031461041c57600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b50602b546103e8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561041157600080fd5b5061041a610b1f565b005b34801561042857600080fd5b50610431610b8f565b6040516103fc91906133a6565b34801561044a57600080fd5b506028546103e8906001600160a01b031681565b34801561046a57600080fd5b5061047e610479366004613409565b610c21565b60405190151581526020016103fc565b34801561049a57600080fd5b506104a4601d5481565b6040519081526020016103fc565b3480156104be57600080fd5b506024546104a4565b3480156104d357600080fd5b506104a4600a5481565b3480156104e957600080fd5b5061041a6104f8366004613435565b610c38565b34801561050957600080fd5b506104a4601e5481565b34801561051f57600080fd5b506022546104a4565b34801561053457600080fd5b5061041a610543366004613457565b610d2b565b34801561055457600080fd5b506104a4600c5481565b34801561056a57600080fd5b5061047e610579366004613483565b610db1565b34801561058a57600080fd5b506104a46105993660046134c4565b610e04565b3480156105aa57600080fd5b50601f5460405160ff90911681526020016103fc565b3480156105cc57600080fd5b506104a460195481565b3480156105e257600080fd5b5061047e6105f1366004613409565b610e88565b34801561060257600080fd5b5061041a610611366004613457565b610ebf565b34801561062257600080fd5b506029546103e8906001600160a01b031681565b34801561064257600080fd5b506104a460135481565b34801561065857600080fd5b50602e5461047e90600160a81b900460ff1681565b34801561067957600080fd5b506104a4601a5481565b34801561068f57600080fd5b5061041a61069e3660046134dd565b610f45565b3480156106af57600080fd5b5060355461047e90610100900460ff1681565b3480156106ce57600080fd5b5061047e6106dd3660046134dd565b6001600160a01b031660009081526003602052604090205460ff1690565b34801561070757600080fd5b5061047e6107163660046134dd565b6110e6565b34801561072757600080fd5b50602c546103e8906001600160a01b031681565b34801561074757600080fd5b506104a460305481565b34801561075d57600080fd5b506104a4600b5481565b34801561077357600080fd5b5061041a6110f4565b34801561078857600080fd5b506104a460155481565b34801561079e57600080fd5b506104a46107ad3660046134dd565b6111b5565b3480156107be57600080fd5b5061041a611214565b3480156107d357600080fd5b506104a4601c5481565b3480156107e957600080fd5b5061041a6107f83660046134dd565b611293565b34801561080957600080fd5b5061041a61081836600461350f565b611332565b34801561082957600080fd5b5061041a610838366004613457565b61141d565b34801561084957600080fd5b506104a460115481565b34801561085f57600080fd5b5061047e61086e3660046134dd565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561089857600080fd5b506000546001600160a01b03166103e8565b3480156108b657600080fd5b5061041a6108c5366004613544565b6114a3565b3480156108d657600080fd5b5061043161150c565b3480156108eb57600080fd5b5061041a6108fa36600461350f565b61151b565b34801561090b57600080fd5b5061041a61091a366004613576565b611570565b34801561092b57600080fd5b5061047e61093a366004613409565b6115f2565b34801561094b57600080fd5b5061041a61095a366004613435565b611629565b34801561096b57600080fd5b5061047e61097a366004613409565b61165e565b34801561098b57600080fd5b5061041a61099a366004613457565b61166b565b3480156109ab57600080fd5b5061041a6109ba36600461350f565b6116a3565b3480156109cb57600080fd5b5061041a6109da366004613435565b611999565b3480156109eb57600080fd5b506104a460105481565b348015610a0157600080fd5b506104a4600f5481565b348015610a1757600080fd5b506104a460125481565b348015610a2d57600080fd5b506104a4600d5481565b348015610a4357600080fd5b50602a546103e8906001600160a01b031681565b348015610a6357600080fd5b506104a4600e5481565b348015610a7957600080fd5b506104a4610a88366004613591565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610abf57600080fd5b5061041a610ace3660046134dd565b611a81565b348015610adf57600080fd5b506104a460145481565b348015610af557600080fd5b5061041a610b043660046134dd565b611b20565b348015610b1557600080fd5b506104a460325481565b6000546001600160a01b03163314610b525760405162461bcd60e51b8152600401610b49906135ca565b60405180910390fd5b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610b8c573d6000803e3d6000fd5b50565b606060088054610b9e906135ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610bca906135ff565b8015610c175780601f10610bec57610100808354040283529160200191610c17565b820191906000526020600020905b815481529060010190602001808311610bfa57829003601f168201915b5050505050905090565b6000610c2e338484611e4c565b5060015b92915050565b6000546001600160a01b03163314610c625760405162461bcd60e51b8152600401610b49906135ca565b60008183602254610c73919061364f565b610c7d9190613666565b90506103e8602254610c8f9190613666565b811015610d045760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610b49565b602f8190556007548290610d1990859061364f565b610d239190613666565b603055505050565b6000546001600160a01b03163314610d555760405162461bcd60e51b8152600401610b49906135ca565b6016548311158015610d6957506017548211155b8015610d7757506018548111155b610d8057600080fd5b611af481610d8e8486613688565b610d989190613688565b1115610da357600080fd5b601092909255601155601255565b6000610dbe848484611f70565b506001600160a01b038416600090815260026020908152604080832033808552925290912054610dfa918691610df590869061369b565b611e4c565b5060019392505050565b6000602354821115610e6b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b49565b6000610e756123e6565b9050610e818184613666565b9392505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610c2e918590610df5908690613688565b6000546001600160a01b03163314610ee95760405162461bcd60e51b8152600401610b49906135ca565b6016548311158015610efd57506017548211155b8015610f0b57506018548111155b610f1457600080fd5b61132481610f228486613688565b610f2c9190613688565b1115610f3757600080fd5b601392909255601455601555565b6000546001600160a01b03163314610f6f5760405162461bcd60e51b8152600401610b49906135ca565b6001600160a01b038116610f955760405162461bcd60e51b8152600401610b49906136ae565b602b546001600160a01b0390811690821603610fc35760405162461bcd60e51b8152600401610b49906136ae565b60008054610fdc916001600160a01b039091169061151b565b610fe781600161151b565b610ff28160016116a3565b600054602d546001600160a01b0391821691160361102657602d80546001600160a01b0319166001600160a01b0383161790555b60005461103b906001600160a01b03166111b5565b600080546001600160a01b03908116825260026020908152604080842086841685529091528220929092558054909161107491166111b5565b111561109b57600054611099906001600160a01b031682611094826111b5565b611f70565b505b600080546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000610c3282600019610c21565b6000546001600160a01b0316331461111e5760405162461bcd60e51b8152600401610b49906135ca565b60355460ff16156111715760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610b49565b61117c3060016116a3565b602954611193906001600160a01b031660016116a3565b6035805460ff19166001179055602e805460ff60a81b1916600160a81b179055565b6001600160a01b03811660009081526004602052604081205460ff16156111f257506001600160a01b031660009081526026602052604090205490565b6001600160a01b038216600090815260256020526040902054610c3290610e04565b6000546001600160a01b0316331461123e5760405162461bcd60e51b8152600401610b49906135ca565b60008054611257916001600160a01b039091169061151b565b600080546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b031633146112bd5760405162461bcd60e51b8152600401610b49906135ca565b602d546001600160a01b038083169116036113105760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610b49565b602d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461135c5760405162461bcd60e51b8152600401610b49906135ca565b80151560000361138857506001600160a01b03166000908152602760205260409020805460ff19169055565b600154156113ef5762093a80600154426113a2919061369b565b116113ef5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b216044820152606401610b49565b6001600160a01b0382166000908152602760205260409020805460ff191660019081179091554290555b5050565b6000546001600160a01b031633146114475760405162461bcd60e51b8152600401610b49906135ca565b601654831115801561145b57506017548211155b801561146957506018548111155b61147257600080fd5b611324816114808486613688565b61148a9190613688565b111561149557600080fd5b600d92909255600e55600f55565b6000546001600160a01b031633146114cd5760405162461bcd60e51b8152600401610b49906135ca565b82846022546114dc919061364f565b6114e69190613666565b60335560225481906114f990849061364f565b6115039190613666565b60345550505050565b606060098054610b9e906135ff565b6000546001600160a01b031633146115455760405162461bcd60e51b8152600401610b49906135ca565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461159a5760405162461bcd60e51b8152600401610b49906135ca565b602e8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906115e790831515815260200190565b60405180910390a150565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610c2e918590610df590869061369b565b6000546001600160a01b031633146116535760405162461bcd60e51b8152600401610b49906135ca565b601991909155601a55565b6000610dfa338484611f70565b6000546001600160a01b031633146116955760405162461bcd60e51b8152600401610b49906135ca565b601c92909255601d55601e55565b6000546001600160a01b031633146116cd5760405162461bcd60e51b8152600401610b49906135ca565b801515600103611801576001600160a01b03821660009081526004602052604090205460ff16156117405760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610b49565b6001600160a01b0382166000908152602560205260409020541561179a576001600160a01b03821660009081526025602052604090205461178090610e04565b6001600160a01b0383166000908152602660205260409020555b506001600160a01b03166000818152600460205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319169091179055565b801515600003611419576001600160a01b03821660009081526004602052604090205460ff166118735760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610b49565b60005b60055481101561199457826001600160a01b03166005828154811061189d5761189d61370b565b6000918252602090912001546001600160a01b03160361198257600580546118c79060019061369b565b815481106118d7576118d761370b565b600091825260209091200154600580546001600160a01b0390921691839081106119035761190361370b565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152602682526040808220829055600490925220805460ff19169055600580548061195b5761195b613721565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b8061198c81613737565b915050611876565b505050565b6000546001600160a01b031633146119c35760405162461bcd60e51b8152600401610b49906135ca565b600081836022546119d4919061364f565b6119de9190613666565b90506103e86022546119f09190613666565b811015611a5a5760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b6064820152608401610b49565b60318190556007548290611a6f90859061364f565b611a799190613666565b603255505050565b6000546001600160a01b03163314611aab5760405162461bcd60e51b8152600401610b49906135ca565b602e546001600160a01b03808316911603611afe5760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610b49565b602e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611b4a5760405162461bcd60e51b8152600401610b49906135ca565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb39190613750565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c249190613750565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015611c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c939190613750565b90506001600160a01b038116611e0c57816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d059190613750565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d769190613750565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de79190613750565b602980546001600160a01b0319166001600160a01b0392909216919091179055611e28565b602980546001600160a01b0319166001600160a01b0383161790555b602880546001600160a01b0319166001600160a01b03841617905561199430846000195b6001600160a01b038316611eae5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b49565b6001600160a01b038216611f0f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b49565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b038416611fd65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b49565b6001600160a01b0383166120385760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b49565b6000821161209a5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b49565b6120a48484612409565b156122c45760355460ff166120fb5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610b49565b60385460ff16156121ad576001600160a01b03841660009081526027602052604090205460ff161561216c576001600160a01b03831660009081526039602052604090205443900361214c57600080fd5b6001600160a01b03831660009081526039602052604090204390556121ad565b6001600160a01b03841660009081526039602052604090205443900361219157600080fd5b6001600160a01b03841660009081526039602052604090204390555b602f548211156122105760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610b49565b602a546001600160a01b0384811691161480159061224757506001600160a01b03831660009081526027602052604090205460ff16155b156122c45760315482612259856111b5565b6122639190613688565b11156122c45760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b6064820152608401610b49565b6001600160a01b03841660009081526003602052604090205460019060ff168061230657506001600160a01b03841660009081526003602052604090205460ff165b1561230f575060005b6001600160a01b03841660009081526027602052604090205460ff16156123d157602e54600160a01b900460ff161580156123535750602e54600160a81b900460ff165b801561237857506001600160a01b03851660009081526003602052604090205460ff16155b801561239d57506001600160a01b03841660009081526003602052604090205460ff16155b156123d15760006123ad306111b5565b905060335481106123cf5760345481106123c657506034545b6123cf816124c9565b505b6123dd8585858461286d565b95945050505050565b60008060006123f3612bfe565b90925090506124028183613666565b9250505090565b600080546001600160a01b0384811691161480159061243657506000546001600160a01b03838116911614155b801561245b57506001600160a01b03821660009081526006602052604090205460ff16155b801561248057506001600160a01b03831660009081526006602052604090205460ff16155b801561249a5750602b546001600160a01b03838116911614155b80156124ae57506001600160a01b03821615155b8015610e8157506001600160a01b0383163014159392505050565b602e805460ff60a01b1916600160a01b179055601a546019546124ec9190613688565b1561285d5760006002601a546019546125059190613688565b601954612512908561364f565b61251c9190613666565b6125269190613666565b90506000612534828461369b565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061256e5761256e61370b565b6001600160a01b03928316602091820292909201810191909152602854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156125c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125eb9190613750565b816001815181106125fe576125fe61370b565b6001600160a01b03928316602091820292909201015260285460405163791ac94760e01b815291169063791ac9479061264490859060009086903090429060040161376d565b600060405180830381600087803b15801561265e57600080fd5b505af1158015612672573d6000803e3d6000fd5b5050505060006002601a5460195461268a9190613688565b601954612697904761364f565b6126a19190613666565b6126ab9190613666565b9050831561278d57602854602b5460405163f305d71960e01b81523060048201526024810187905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612723573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061274891906137de565b505060408051868152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a15b6000612799858761369b565b111561285857601c54601e5447916000916127b49084613666565b6127be919061364f565b90506000601d54601e54846127d39190613666565b6127dd919061364f565b602e546040519192506001600160a01b03169083156108fc029084906000818181858888f19350505050158015612818573d6000803e3d6000fd5b50602d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612853573d6000803e3d6000fd5b505050505b505050505b50602e805460ff60a01b19169055565b603554600090610100900460ff16612901576128898585612d81565b603554610100900460ff161580156128a657506128a68585612409565b156129015760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e736665722061742074686973206044820152643a34b6b29760d91b6064820152608401610b49565b600061290f86868686612e9b565b90508361291b876111b5565b10612bf25760808101516001600160a01b038716600090815260256020526040902054612948919061369b565b6001600160a01b038088166000908152602560205260408082209390935560608401519188168152919091205461297f9190613688565b6001600160a01b0380871660009081526025602090815260408083209490945591891681526004909152205460ff1680156129d357506001600160a01b03851660009081526004602052604090205460ff16155b15612a1a576001600160a01b0386166000908152602660205260409020546129fc90859061369b565b6001600160a01b038716600090815260266020526040902055612b5a565b6001600160a01b03861660009081526004602052604090205460ff16158015612a5b57506001600160a01b03851660009081526004602052604090205460ff165b15612aa35780516001600160a01b038616600090815260266020526040902054612a859190613688565b6001600160a01b038616600090815260266020526040902055612b5a565b6001600160a01b03861660009081526004602052604090205460ff168015612ae357506001600160a01b03851660009081526004602052604090205460ff165b15612b5a576001600160a01b038616600090815260266020526040902054612b0c90859061369b565b6001600160a01b0380881660009081526026602052604080822093909355835191881681529190912054612b409190613688565b6001600160a01b0386166000908152602660205260409020555b604081015115612b7257612b7286826040015161308b565b60008160a001511180612b89575060008160200151115b15612ba057612ba08160a00151826020015161318a565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360000151604051612be991815260200190565b60405180910390a35b50600195945050505050565b6023546022546000918291825b600554811015612d5057826025600060058481548110612c2d57612c2d61370b565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612c985750816026600060058481548110612c7157612c7161370b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612cae57602354602254945094505050509091565b6025600060058381548110612cc557612cc561370b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612cf4908461369b565b92506026600060058381548110612d0d57612d0d61370b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612d3c908361369b565b915080612d4881613737565b915050612c0b565b50602254602354612d619190613666565b821015612d78576023546022549350935050509091565b90939092509050565b603554610100900460ff1615612de55760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b6064820152608401610b49565b612def8282612409565b158015612e0957506029546001600160a01b038281169116145b15611419576001600160a01b03821660009081526006602052604090819020805460ff191660019081179091556035805461ff00191661010017905542603755602e805460ff60a81b1916600160a81b17905590517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15991612e8f91901515815260200190565b60405180910390a15050565b612ed46040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b612f0d6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000612f1987876131b0565b9050612f25818661364f565b60808301528315613035576001600160a01b03861660009081526027602052604090205460ff1615612f6857601054600a55601154600b55601254600c55612fb3565b6001600160a01b03871660009081526027602052604090205460ff1615612fa057600d54600a55600e54600b55600f54600c55612fb3565b601354600a55601454600b55601554600c555b601b54600a54612fc3908761364f565b612fcd9190613666565b6020830152601b54600c54600b54612fe59190613688565b612fef908761364f565b612ff99190613666565b60408301819052602083015161300f9190613688565b613019908661369b565b8252602082015161302b90829061364f565b60a083015261304e565b6000602083018190526040830181905285835260a08301525b80826040015161305e919061364f565b8260a0015161306d9190613688565b826080015161307c919061369b565b60608301525095945050505050565b60006130956123e6565b6029549091506000906001600160a01b03908116908516036130b85760006130bc565b6021545b90506000826130cb838661369b565b6130d5919061364f565b306000908152602560205260409020549091506130f3908290613688565b3060009081526025602090815260408083209390935560049052205460ff16156131435730600090815260266020526040902054613132908590613688565b306000908152602660205260409020555b60405184815230906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b81602354613198919061369b565b6023556024546131a9908290613688565b6024555050565b60008060006131bf85856131ce565b90925090506123dd8183613666565b6023546022546000918291825b600554811015613321578260256000600584815481106131fd576131fd61370b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061326857508160266000600584815481106132415761324161370b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561327f5760235460225494509450505050613392565b60256000600583815481106132965761329661370b565b60009182526020808320909101546001600160a01b031683528201929092526040019020546132c5908461369b565b925060266000600583815481106132de576132de61370b565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461330d908361369b565b91508061331981613737565b9150506131db565b5061332b866111b5565b15801561335057506001600160a01b03861660009081526003602052604090205460ff165b156133645760225460215561336485613399565b6022546023546133749190613666565b82101561338c57602354602254935093505050613392565b90925090505b9250929050565b610b8c8133600019611e4c565b600060208083528351808285015260005b818110156133d3578581018301518582016040015282016133b7565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610b8c57600080fd5b6000806040838503121561341c57600080fd5b8235613427816133f4565b946020939093013593505050565b6000806040838503121561344857600080fd5b50508035926020909101359150565b60008060006060848603121561346c57600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561349857600080fd5b83356134a3816133f4565b925060208401356134b3816133f4565b929592945050506040919091013590565b6000602082840312156134d657600080fd5b5035919050565b6000602082840312156134ef57600080fd5b8135610e81816133f4565b8035801515811461350a57600080fd5b919050565b6000806040838503121561352257600080fd5b823561352d816133f4565b915061353b602084016134fa565b90509250929050565b6000806000806080858703121561355a57600080fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561358857600080fd5b610e81826134fa565b600080604083850312156135a457600080fd5b82356135af816133f4565b915060208301356135bf816133f4565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061361357607f821691505b60208210810361363357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610c3257610c32613639565b60008261368357634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610c3257610c32613639565b81810381811115610c3257610c32613639565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60006001820161374957613749613639565b5060010190565b60006020828403121561376257600080fd5b8151610e81816133f4565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156137bd5784516001600160a01b031683529383019391830191600101613798565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156137f357600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122053804edc46ce0399d8f48de4f6586bf7859b5ea550b85f0c3b1a6fc7af1b33b964736f6c63430008130033

Deployed Bytecode Sourcemap

9013:26020:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10996:64;;;;;;;;;;-1:-1:-1;10996:64:0;;;;-1:-1:-1;;;;;10996:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;10996:64:0;;;;;;;;28013:108;;;;;;;;;;;;;:::i;:::-;;14986:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10869:35::-;;;;;;;;;;-1:-1:-1;10869:35:0;;;;-1:-1:-1;;;;;10869:35:0;;;15763:161;;;;;;;;;;-1:-1:-1;15763:161:0;;;;;:::i;:::-;;:::i;:::-;;;1630:14:1;;1623:22;1605:41;;1593:2;1578:18;15763:161:0;1465:187:1;10419:27:0;;;;;;;;;;;;;;;;;;;1803:25:1;;;1791:2;1776:18;10419:27:0;1657:177:1;19339:87:0;;;;;;;;;;-1:-1:-1;19408:10:0;;19339:87;;9572:30;;;;;;;;;;;;;;;;33094:343;;;;;;;;;;-1:-1:-1;33094:343:0;;;;;:::i;:::-;;:::i;10453:31::-;;;;;;;;;;;;;;;;14739:83;;;;;;;;;;-1:-1:-1;14812:7:0;;14739:83;;31820:440;;;;;;;;;;-1:-1:-1;31820:440:0;;;;;:::i;:::-;;:::i;9648:34::-;;;;;;;;;;;;;;;;18054:266;;;;;;;;;;-1:-1:-1;18054:266:0;;;;;:::i;:::-;;:::i;19766:250::-;;;;;;;;;;-1:-1:-1;19766:250:0;;;;;:::i;:::-;;:::i;14828:71::-;;;;;;;;;;-1:-1:-1;14887:9:0;;14828:71;;14887:9;;;;3201:36:1;;3189:2;3174:18;14828:71:0;3059:184:1;10250:34:0;;;;;;;;;;;;;;;;18328:215;;;;;;;;;;-1:-1:-1;18328:215:0;;;;;:::i;:::-;;:::i;32268:458::-;;;;;;;;;;-1:-1:-1;32268:458:0;;;;;:::i;:::-;;:::i;10911:21::-;;;;;;;;;;-1:-1:-1;10911:21:0;;;;-1:-1:-1;;;;;10911:21:0;;;9976:38;;;;;;;;;;;;;;;;11257:41;;;;;;;;;;-1:-1:-1;11257:41:0;;;;-1:-1:-1;;;11257:41:0;;;;;;10291:37;;;;;;;;;;;;;;;;16692:804;;;;;;;;;;-1:-1:-1;16692:804:0;;;;;:::i;:::-;;:::i;11552:36::-;;;;;;;;;;-1:-1:-1;11552:36:0;;;;;;;;;;;18912:123;;;;;;;;;;-1:-1:-1;18912:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;19000:27:0;18976:4;19000:27;;;:18;:27;;;;;;;;;18912:123;15932:120;;;;;;;;;;-1:-1:-1;15932:120:0;;;;;:::i;:::-;;:::i;11067:64::-;;;;;;;;;;-1:-1:-1;11067:64:0;;;;-1:-1:-1;;;;;11067:64:0;;;11340:28;;;;;;;;;;;;;;;;9609:32;;;;;;;;;;;;;;;;19043:288;;;;;;;;;;;;;:::i;10068:42::-;;;;;;;;;;;;;;;;15382:198;;;;;;;;;;-1:-1:-1;15382:198:0;;;;;:::i;:::-;;:::i;17504:197::-;;;;;;;;;;;;;:::i;10382:30::-;;;;;;;;;;;;;;;;31178:190;;;;;;;;;;-1:-1:-1;31178:190:0;;;;;:::i;:::-;;:::i;28690:424::-;;;;;;;;;;-1:-1:-1;28690:424:0;;;;;:::i;:::-;;:::i;31376:436::-;;;;;;;;;;-1:-1:-1;31376:436:0;;;;;:::i;:::-;;:::i;9888:36::-;;;;;;;;;;;;;;;;18784:120;;;;;;;;;;-1:-1:-1;18784:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;18876:20:0;18852:4;18876:20;;;:11;:20;;;;;;;;;18784:120;15063:71;;;;;;;;;;-1:-1:-1;15106:7:0;16670:6;-1:-1:-1;;;;;16670:6:0;15063:71;;30671:292;;;;;;;;;;-1:-1:-1;30671:292:0;;;;;:::i;:::-;;:::i;14905:75::-;;;;;;;;;;;;;:::i;33978:135::-;;;;;;;;;;-1:-1:-1;33978:135:0;;;;;:::i;:::-;;:::i;33796:174::-;;;;;;;;;;-1:-1:-1;33796:174:0;;;;;:::i;:::-;;:::i;18551:225::-;;;;;;;;;;-1:-1:-1;18551:225:0;;;;;:::i;:::-;;:::i;32911:175::-;;;;;;;;;;-1:-1:-1;32911:175:0;;;;;:::i;:::-;;:::i;15588:167::-;;;;;;;;;;-1:-1:-1;15588:167:0;;;;;:::i;:::-;;:::i;32734:169::-;;;;;;;;;;-1:-1:-1;32734:169:0;;;;;:::i;:::-;;:::i;34121:909::-;;;;;;;;;;-1:-1:-1;34121:909:0;;;;;:::i;:::-;;:::i;33445:343::-;;;;;;;;;;-1:-1:-1;33445:343:0;;;;;:::i;:::-;;:::i;9847:34::-;;;;;;;;;;;;;;;;9793:47;;;;;;;;;;;;;;;;9931:38;;;;;;;;;;;;;;;;9689:43;;;;;;;;;;;;;;;;10960:29;;;;;;;;;;-1:-1:-1;10960:29:0;;;;-1:-1:-1;;;;;10960:29:0;;;9739:47;;;;;;;;;;;;;;;;15241:133;;;;;;;;;;-1:-1:-1;15241:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;15343:19:0;;;15325:7;15343:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;15241:133;30971:199;;;;;;;;;;-1:-1:-1;30971:199:0;;;;;:::i;:::-;;:::i;10021:40::-;;;;;;;;;;;;;;;;28129:553;;;;;;;;;;-1:-1:-1;28129:553:0;;;;;:::i;:::-;;:::i;11412:30::-;;;;;;;;;;;;;;;;28013:108;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;;;;;;;;;16643:7;16670:6;;28065:48:::1;::::0;-1:-1:-1;;;;;16670:6:0;;;;28091:21:::1;28065:48:::0;::::1;;;::::0;28091:21;;28065:48;16643:7;28065:48;28091:21;16670:6;28065:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;28013:108::o:0;14986:71::-;15025:13;15049:5;15042:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14986:71;:::o;15763:161::-;15838:4;15855:39;997:10;15878:7;15887:6;15855:8;:39::i;:::-;-1:-1:-1;15912:4:0;15763:161;;;;;:::o;33094:343::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;33186:13:::1;33224:7;33213;33203;;:17;;;;:::i;:::-;33202:29;;;;:::i;:::-;33186:45;;33270:4;33260:7;;:14;;;;:::i;:::-;33250:5;:25;;33242:93;;;::::0;-1:-1:-1;;;33242:93:0;;6688:2:1;33242:93:0::1;::::0;::::1;6670:21:1::0;6727:2;6707:18;;;6700:30;6766:34;6746:18;;;6739:62;6837:25;6817:18;;;6810:53;6880:19;;33242:93:0::1;6486:419:1::0;33242:93:0::1;33346:12;:20:::0;;;33394:14:::1;::::0;33422:7;;33394:24:::1;::::0;33411:7;;33394:24:::1;:::i;:::-;33393:36;;;;:::i;:::-;33377:13;:52:::0;-1:-1:-1;;;33094:343:0:o;31820:440::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;31947:13:::1;;31936:7;:24;;:73;;;;;31994:15;;31981:9;:28;;31936:73;:122;;;;;32043:15;;32030:9;:28;;31936:122;31928:149;;;::::0;::::1;;32131:4;32118:9:::0;32096:19:::1;32106:9:::0;32096:7;:19:::1;:::i;:::-;:31;;;;:::i;:::-;:39;;32088:48;;;::::0;::::1;;32147:15;:25:::0;;;;32183:17:::1;:29:::0;32223:17:::1;:29:::0;31820:440::o;18054:266::-;18152:4;18169:36;18179:6;18187:9;18198:6;18169:9;:36::i;:::-;-1:-1:-1;;;;;;18247:19:0;;;;;;:11;:19;;;;;;;;997:10;18247:33;;;;;;;;;18216:74;;18225:6;;18247:42;;18283:6;;18247:42;:::i;:::-;18216:8;:74::i;:::-;-1:-1:-1;18308:4:0;18054:266;;;;;:::o;19766:250::-;19832:7;19871;;19860;:18;;19852:73;;;;-1:-1:-1;;;19852:73:0;;7375:2:1;19852:73:0;;;7357:21:1;7414:2;7394:18;;;7387:30;7453:34;7433:18;;;7426:62;-1:-1:-1;;;7504:18:1;;;7497:40;7554:19;;19852:73:0;7173:406:1;19852:73:0;19936:19;19959:10;:8;:10::i;:::-;19936:33;-1:-1:-1;19987:21:0;19936:33;19987:7;:21;:::i;:::-;19980:28;19766:250;-1:-1:-1;;;19766:250:0:o;18328:215::-;997:10;18416:4;18465:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18465:34:0;;;;;;;;;;18416:4;;18433:80;;18456:7;;18465:47;;18502:10;;18465:47;:::i;32268:458::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;32401:13:::1;;32390:7;:24;;:73;;;;;32448:15;;32435:9;:28;;32390:73;:122;;;;;32497:15;;32484:9;:28;;32390:122;32382:149;;;::::0;::::1;;32585:4;32572:9:::0;32550:19:::1;32560:9:::0;32550:7;:19:::1;:::i;:::-;:31;;;;:::i;:::-;:39;;32542:48;;;::::0;::::1;;32601:19;:29:::0;;;;32641:21:::1;:33:::0;32685:21:::1;:33:::0;32268:458::o;16692:804::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16773:22:0;::::1;16765:96;;;;-1:-1:-1::0;;;16765:96:0::1;;;;;;;:::i;:::-;16892:4;::::0;-1:-1:-1;;;;;16892:4:0;;::::1;16880:16:::0;;::::1;::::0;16872:90:::1;;;;-1:-1:-1::0;;;16872:90:0::1;;;;;;;:::i;:::-;16995:6;::::0;;16973:36:::1;::::0;-1:-1:-1;;;;;16995:6:0;;::::1;::::0;16973:21:::1;:36::i;:::-;17020:37;17042:8;17052:4;17020:21;:37::i;:::-;17068:40;17093:8;17103:4;17068:24;:40::i;:::-;17155:6;::::0;17133:10:::1;::::0;-1:-1:-1;;;;;17155:6:0;;::::1;17133:10:::0;::::1;:29:::0;17129:78:::1;;17177:10;:30:::0;;-1:-1:-1;;;;;;17177:30:0::1;-1:-1:-1::0;;;;;17177:30:0;::::1;;::::0;;17129:78:::1;17270:6;::::0;17260:17:::1;::::0;-1:-1:-1;;;;;17270:6:0::1;17260:9;:17::i;:::-;17228:19;17240:6:::0;;-1:-1:-1;;;;;17240:6:0;;::::1;17228:19:::0;;:11:::1;:19;::::0;;;;;;;:29;;::::1;::::0;;;;;;;:49;;;;17301:6;;17228:19;;17291:17:::1;::::0;17301:6:::1;17291:9;:17::i;:::-;:21;17288:99;;;17339:6;::::0;17329:46:::1;::::0;-1:-1:-1;;;;;17339:6:0::1;17347:8:::0;17357:17:::1;17339:6:::0;17357:9:::1;:17::i;:::-;17329:9;:46::i;:::-;;17288:99;17407:6;:17:::0;;-1:-1:-1;;;;;;17407:17:0::1;-1:-1:-1::0;;;;;17407:17:0;::::1;::::0;;::::1;::::0;;17440:38:::1;::::0;17407:17;;;;17440:38:::1;::::0;17407:6;17440:38:::1;16692:804:::0;:::o;15932:120::-;15985:4;16009:35;16017:7;-1:-1:-1;;16009:7:0;:35::i;19043:288::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;19102:14:::1;::::0;::::1;;19101:15;19093:52;;;::::0;-1:-1:-1;;;19093:52:0;;8216:2:1;19093:52:0::1;::::0;::::1;8198:21:1::0;8255:2;8235:18;;;8228:30;8294:26;8274:18;;;8267:54;8338:18;;19093:52:0::1;8014:348:1::0;19093:52:0::1;19156:45;19189:4;19196;19156:24;:45::i;:::-;19237:6;::::0;19212:38:::1;::::0;-1:-1:-1;;;;;19237:6:0::1;::::0;19212:24:::1;:38::i;:::-;19263:14;:21:::0;;-1:-1:-1;;19263:21:0::1;19280:4;19263:21;::::0;;19295::::1;:28:::0;;-1:-1:-1;;;;19295:28:0::1;-1:-1:-1::0;;;19295:28:0::1;::::0;;19043:288::o;15382:198::-;-1:-1:-1;;;;;15472:20:0;;15448:7;15472:20;;;:11;:20;;;;;;;;15468:49;;;-1:-1:-1;;;;;;15501:16:0;;;;;:7;:16;;;;;;;15382:198::o;15468:49::-;-1:-1:-1;;;;;15555:16:0;;;;;;:7;:16;;;;;;15535:37;;:19;:37::i;17504:197::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;17593:6:::1;::::0;;17571:36:::1;::::0;-1:-1:-1;;;;;17593:6:0;;::::1;::::0;17571:21:::1;:36::i;:::-;17635:1;17618:19:::0;;-1:-1:-1;;;;;;17618:19:0::1;::::0;;17653:40:::1;::::0;17635:1;;17653:40:::1;::::0;17635:1;;17653:40:::1;17504:197::o:0;31178:190::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;31271:10:::1;::::0;-1:-1:-1;;;;;31271:23:0;;::::1;:10:::0;::::1;:23:::0;31263:55:::1;;;::::0;-1:-1:-1;;;31263:55:0;;8569:2:1;31263:55:0::1;::::0;::::1;8551:21:1::0;8608:2;8588:18;;;8581:30;-1:-1:-1;;;8627:18:1;;;8620:49;8686:18;;31263:55:0::1;8367:343:1::0;31263:55:0::1;31329:10;:31:::0;;-1:-1:-1;;;;;;31329:31:0::1;-1:-1:-1::0;;;;;31329:31:0;;;::::1;::::0;;;::::1;::::0;;31178:190::o;28690:424::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;28771:16;::::1;;28782:5;28771:16:::0;28767:340:::1;;-1:-1:-1::0;;;;;;28804:13:0::1;28820:5;28804:13:::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;28804:21:0::1;::::0;;28690:424::o;28767:340::-:1;28862:17;::::0;:22;28858:153:::1;;28951:7;28931:17;;28913:15;:35;;;;:::i;:::-;:45;28905:90;;;::::0;-1:-1:-1;;;28905:90:0;;8917:2:1;28905:90:0::1;::::0;::::1;8899:21:1::0;;;8936:18;;;8929:30;8995:34;8975:18;;;8968:62;9047:18;;28905:90:0::1;8715:356:1::0;28905:90:0::1;-1:-1:-1::0;;;;;29025:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;:20;;-1:-1:-1;;29025:20:0::1;29041:4;29025:20:::0;;::::1;::::0;;;29080:15:::1;29060:35:::0;;28767:340:::1;28690:424:::0;;:::o;31376:436::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;31502:13:::1;;31491:7;:24;;:73;;;;;31549:15;;31536:9;:28;;31491:73;:122;;;;;31598:15;;31585:9;:28;;31491:122;31483:149;;;::::0;::::1;;31686:4;31673:9:::0;31651:19:::1;31661:9:::0;31651:7;:19:::1;:::i;:::-;:31;;;;:::i;:::-;:39;;31643:48;;;::::0;::::1;;31702:14;:24:::0;;;;31737:16:::1;:28:::0;31776:16:::1;:28:::0;31376:436::o;30671:292::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;30874:16:::1;30854;30844:7;;:26;;;;:::i;:::-;30843:47;;;;:::i;:::-;30827:13;:63:::0;30915:7:::1;::::0;30942:13;;30915:23:::1;::::0;30925:13;;30915:23:::1;:::i;:::-;30914:41;;;;:::i;:::-;30901:10;:54:::0;-1:-1:-1;;;;30671:292:0:o;14905:75::-;14946:13;14970:7;14963:14;;;;;:::i;33978:135::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34068:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:37;;-1:-1:-1;;34068:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33978:135::o;33796:174::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;33876:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;33876:32:0::1;-1:-1:-1::0;;;;33876:32:0;;::::1;;::::0;;33924:38:::1;::::0;::::1;::::0;::::1;::::0;33900:8;1630:14:1;1623:22;1605:41;;1593:2;1578:18;;1465:187;33924:38:0::1;;;;;;;;33796:174:::0;:::o;18551:225::-;997:10;18644:4;18693:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18693:34:0;;;;;;;;;;18644:4;;18661:85;;18684:7;;18693:52;;18730:15;;18693:52;:::i;32911:175::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;33013:15:::1;:27:::0;;;;33051:15:::1;:27:::0;32911:175::o;15588:167::-;15666:4;15683:42;997:10;15707:9;15718:6;15683:9;:42::i;32734:169::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;32827:11:::1;:16:::0;;;;32854:8:::1;:13:::0;32878:12:::1;:17:::0;32734:169::o;34121:909::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;34218:15;::::1;;34229:4;34218:15:::0;34214:809:::1;;-1:-1:-1::0;;;;;34259:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;34258:21;34250:62;;;::::0;-1:-1:-1;;;34250:62:0;;9278:2:1;34250:62:0::1;::::0;::::1;9260:21:1::0;9317:2;9297:18;;;9290:30;9356;9336:18;;;9329:58;9404:18;;34250:62:0::1;9076:352:1::0;34250:62:0::1;-1:-1:-1::0;;;;;34330:16:0;::::1;34349:1;34330:16:::0;;;:7:::1;:16;::::0;;;;;:20;34327:116:::1;;-1:-1:-1::0;;;;;34410:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;34390:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;34371:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;34327:116:::1;-1:-1:-1::0;;;;;;34457:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;34457:27:0::1;34480:4;34457:27:::0;;::::1;::::0;;;34499:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;34499:23:0::1;::::0;;::::1;::::0;;28690:424::o;34214:809::-:1;34544:16:::0;::::1;;34555:5;34544:16:::0;34540:483:::1;;-1:-1:-1::0;;;;;34585:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;34577:61;;;::::0;-1:-1:-1;;;34577:61:0;;9635:2:1;34577:61:0::1;::::0;::::1;9617:21:1::0;9674:2;9654:18;;;9647:30;9713;9693:18;;;9686:58;9761:18;;34577:61:0::1;9433:352:1::0;34577:61:0::1;34658:9;34653:359;34677:9;:16:::0;34673:20;::::1;34653:359;;;34739:7;-1:-1:-1::0;;;;;34723:23:0::1;:9;34733:1;34723:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;34723:12:0::1;:23:::0;34719:278:::1;;34786:9;34796:16:::0;;:20:::1;::::0;34815:1:::1;::::0;34796:20:::1;:::i;:::-;34786:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;34771:9:::1;:12:::0;;-1:-1:-1;;;;;34786:31:0;;::::1;::::0;34781:1;;34771:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;34771:46:0::1;-1:-1:-1::0;;;;;34771:46:0;;::::1;;::::0;;34840:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;34883:11:::1;:20:::0;;;;:28;;-1:-1:-1;;34883:28:0::1;::::0;;34934:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;34934:15:0;;;;;-1:-1:-1;;;;;;34934:15:0::1;::::0;;;;;34653:359:::1;34121:909:::0;;:::o;34719:278::-:1;34695:3:::0;::::1;::::0;::::1;:::i;:::-;;;;34653:359;;;;34121:909:::0;;:::o;33445:343::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;33538:13:::1;33576:7;33565;33555;;:17;;;;:::i;:::-;33554:29;;;;:::i;:::-;33538:45;;33622:4;33612:7;;:14;;;;:::i;:::-;33602:5;:25;;33594:88;;;::::0;-1:-1:-1;;;33594:88:0;;10396:2:1;33594:88:0::1;::::0;::::1;10378:21:1::0;10435:2;10415:18;;;10408:30;10474:34;10454:18;;;10447:62;-1:-1:-1;;;10525:18:1;;;10518:48;10583:19;;33594:88:0::1;10194:414:1::0;33594:88:0::1;33693:14;:22:::0;;;33745:14:::1;::::0;33773:7;;33745:24:::1;::::0;33762:7;;33745:24:::1;:::i;:::-;33744:36;;;;:::i;:::-;33726:15;:54:::0;-1:-1:-1;;;33445:343:0:o;30971:199::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;31067:13:::1;::::0;-1:-1:-1;;;;;31067:26:0;;::::1;:13:::0;::::1;:26:::0;31059:58:::1;;;::::0;-1:-1:-1;;;31059:58:0;;8569:2:1;31059:58:0::1;::::0;::::1;8551:21:1::0;8608:2;8588:18;;;8581:30;-1:-1:-1;;;8627:18:1;;;8620:49;8686:18;;31059:58:0::1;8367:343:1::0;31059:58:0::1;31128:13;:34:::0;;-1:-1:-1;;;;;;31128:34:0::1;-1:-1:-1::0;;;;;31128:34:0;;;::::1;::::0;;;::::1;::::0;;30971:199::o;28129:553::-;12373:6;;-1:-1:-1;;;;;12373:6:0;997:10;12373:22;12365:67;;;;-1:-1:-1;;;12365:67:0;;;;;;;:::i;:::-;28202:29:::1;28253:9;28202:61;;28274:16;28311:10;-1:-1:-1::0;;;;;28311:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28293:47:0::1;;28349:4;28356:10;-1:-1:-1::0;;;;;28356:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28293:81;::::0;-1:-1:-1;;;;;;28293:81:0::1;::::0;;;;;;-1:-1:-1;;;;;11099:15:1;;;28293:81:0::1;::::0;::::1;11081:34:1::0;11151:15;;11131:18;;;11124:43;11016:18;;28293:81:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28274:100:::0;-1:-1:-1;;;;;;28389:22:0;::::1;28385:207;;28455:10;-1:-1:-1::0;;;;;28455:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28437:50:0::1;;28496:4;28503:10;-1:-1:-1::0;;;;;28503:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28437:84;::::0;-1:-1:-1;;;;;;28437:84:0::1;::::0;;;;;;-1:-1:-1;;;;;11099:15:1;;;28437:84:0::1;::::0;::::1;11081:34:1::0;11151:15;;11131:18;;;11124:43;11016:18;;28437:84:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28428:6;:93:::0;;-1:-1:-1;;;;;;28428:93:0::1;-1:-1:-1::0;;;;;28428:93:0;;;::::1;::::0;;;::::1;::::0;;28385:207:::1;;;28563:6;:17:::0;;-1:-1:-1;;;;;;28563:17:0::1;-1:-1:-1::0;;;;;28563:17:0;::::1;;::::0;;28385:207:::1;28602:9;:22:::0;;-1:-1:-1;;;;;;28602:22:0::1;-1:-1:-1::0;;;;;28602:22:0;::::1;;::::0;;28635:39:::1;28652:4;28659:9:::0;-1:-1:-1;;20545:342:0;-1:-1:-1;;;;;20640:20:0;;20632:69;;;;-1:-1:-1;;;20632:69:0;;11380:2:1;20632:69:0;;;11362:21:1;11419:2;11399:18;;;11392:30;11458:34;11438:18;;;11431:62;-1:-1:-1;;;11509:18:1;;;11502:34;11553:19;;20632:69:0;11178:400:1;20632:69:0;-1:-1:-1;;;;;20720:21:0;;20712:68;;;;-1:-1:-1;;;20712:68:0;;11785:2:1;20712:68:0;;;11767:21:1;11824:2;11804:18;;;11797:30;11863:34;11843:18;;;11836:62;-1:-1:-1;;;11914:18:1;;;11907:32;11956:19;;20712:68:0;11583:398:1;20712:68:0;-1:-1:-1;;;;;20793:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;20846:33;;1803:25:1;;;20846:33:0;;1776:18:1;20846:33:0;;;;;;;20545:342;;;:::o;20895:1866::-;20974:4;-1:-1:-1;;;;;20999:18:0;;20991:68;;;;-1:-1:-1;;;20991:68:0;;12188:2:1;20991:68:0;;;12170:21:1;12227:2;12207:18;;;12200:30;12266:34;12246:18;;;12239:62;-1:-1:-1;;;12317:18:1;;;12310:35;12362:19;;20991:68:0;11986:401:1;20991:68:0;-1:-1:-1;;;;;21078:16:0;;21070:64;;;;-1:-1:-1;;;21070:64:0;;12594:2:1;21070:64:0;;;12576:21:1;12633:2;12613:18;;;12606:30;12672:34;12652:18;;;12645:62;-1:-1:-1;;;12723:18:1;;;12716:33;12766:19;;21070:64:0;12392:399:1;21070:64:0;21162:1;21153:6;:10;21145:64;;;;-1:-1:-1;;;21145:64:0;;12998:2:1;21145:64:0;;;12980:21:1;13037:2;13017:18;;;13010:30;13076:34;13056:18;;;13049:62;-1:-1:-1;;;13127:18:1;;;13120:39;13176:19;;21145:64:0;12796:405:1;21145:64:0;21223:20;21234:4;21240:2;21223:10;:20::i;:::-;21220:776;;;21264:14;;;;21260:89;;21299:34;;-1:-1:-1;;;21299:34:0;;13408:2:1;21299:34:0;;;13390:21:1;13447:2;13427:18;;;13420:30;13486:26;13466:18;;;13459:54;13530:18;;21299:34:0;13206:348:1;21260:89:0;21367:15;;;;21363:347;;;-1:-1:-1;;;;;21407:13:0;;;;;;:7;:13;;;;;;;;21403:292;;;-1:-1:-1;;;;;21452:13:0;;;;;;:9;:13;;;;;;21469:12;21452:29;;21444:38;;;;;;-1:-1:-1;;;;;21505:13:0;;;;;;:9;:13;;;;;21521:12;21505:28;;21403:292;;;-1:-1:-1;;;;;21590:15:0;;;;;;:9;:15;;;;;;21609:12;21590:31;;21582:40;;;;;;-1:-1:-1;;;;;21645:15:0;;;;;;:9;:15;;;;;21663:12;21645:30;;21403:292;21742:12;;21732:6;:22;;21724:75;;;;-1:-1:-1;;;21724:75:0;;13761:2:1;21724:75:0;;;13743:21:1;13800:2;13780:18;;;13773:30;13839:34;13819:18;;;13812:62;-1:-1:-1;;;13890:18:1;;;13883:38;13938:19;;21724:75:0;13559:404:1;21724:75:0;21823:14;;-1:-1:-1;;;;;21817:20:0;;;21823:14;;21817:20;;;;:36;;-1:-1:-1;;;;;;21842:11:0;;;;;;:7;:11;;;;;;;;21841:12;21817:36;21814:171;;;21908:14;;21898:6;21882:13;21892:2;21882:9;:13::i;:::-;:22;;;;:::i;:::-;:40;;21874:95;;;;-1:-1:-1;;;21874:95:0;;14170:2:1;21874:95:0;;;14152:21:1;14209:2;14189:18;;;14182:30;14248:34;14228:18;;;14221:62;-1:-1:-1;;;14299:18:1;;;14292:40;14349:19;;21874:95:0;13968:406:1;21874:95:0;-1:-1:-1;;;;;22039:24:0;;22006:12;22039:24;;;:18;:24;;;;;;22021:4;;22039:24;;;:50;;-1:-1:-1;;;;;;22067:22:0;;;;;;:18;:22;;;;;;;;22039:50;22036:96;;;-1:-1:-1;22115:5:0;22036:96;-1:-1:-1;;;;;22148:11:0;;;;;;:7;:11;;;;;;;;22144:547;;;22181:16;;-1:-1:-1;;;22181:16:0;;;;22180:17;:59;;;;-1:-1:-1;22218:21:0;;-1:-1:-1;;;22218:21:0;;;;22180:59;:105;;;;-1:-1:-1;;;;;;22261:24:0;;;;;;:18;:24;;;;;;;;22260:25;22180:105;:149;;;;-1:-1:-1;;;;;;22307:22:0;;;;;;:18;:22;;;;;;;;22306:23;22180:149;22176:498;;;22364:28;22395:24;22413:4;22395:9;:24::i;:::-;22364:55;;22466:13;;22442:20;:37;22438:221;;22531:10;;22507:20;:34;22504:77;;-1:-1:-1;22568:10:0;;22504:77;22603:36;22618:20;22603:14;:36::i;:::-;22345:329;22176:498;22709:44;22727:4;22733:2;22737:6;22745:7;22709:17;:44::i;:::-;22702:51;20895:1866;-1:-1:-1;;;;;20895:1866:0:o;22769:154::-;22811:7;22832:15;22849;22868:12;:10;:12::i;:::-;22831:49;;-1:-1:-1;22831:49:0;-1:-1:-1;22898:17:0;22831:49;;22898:17;:::i;:::-;22891:24;;;;22769:154;:::o;19434:324::-;19503:4;16670:6;;-1:-1:-1;;;;;19527:15:0;;;16670:6;;19527:15;;;;:45;;-1:-1:-1;16643:7:0;16670:6;-1:-1:-1;;;;;19559:13:0;;;16670:6;;19559:13;;19527:45;:84;;;;-1:-1:-1;;;;;;19590:21:0;;;;;;:17;:21;;;;;;;;19589:22;19527:84;:125;;;;-1:-1:-1;;;;;;19629:23:0;;;;;;:17;:23;;;;;;;;19628:24;19527:125;:152;;;;-1:-1:-1;19675:4:0;;-1:-1:-1;;;;;19669:10:0;;;19675:4;;19669:10;;19527:152;:185;;;;-1:-1:-1;;;;;;19696:16:0;;;;19527:185;:223;;;;-1:-1:-1;;;;;;19729:21:0;;19745:4;19729:21;;19520:230;19434:324;-1:-1:-1;;;19434:324:0:o;29122:1541::-;12247:16;:23;;-1:-1:-1;;;;12247:23:0;-1:-1:-1;;;12247:23:0;;;29230:15:::1;::::0;29212::::1;::::0;:33:::1;::::0;29230:15;29212:33:::1;:::i;:::-;29208:64:::0;29265:7:::1;29208:64;29282:17;29385:1;29365:15;;29347;;:33;;;;:::i;:::-;29327:15;::::0;29304:38:::1;::::0;:20;:38:::1;:::i;:::-;29303:78;;;;:::i;:::-;29302:84;;;;:::i;:::-;29282:104:::0;-1:-1:-1;29399:20:0::1;29422:32;29282:104:::0;29422:20;:32:::1;:::i;:::-;29491:16;::::0;;29505:1:::1;29491:16:::0;;;;;::::1;::::0;;29399:55;;-1:-1:-1;29467:21:0::1;::::0;29491:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;29491:16:0::1;29467:40;;29536:4;29518;29523:1;29518:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29518:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;29562:9:::1;::::0;:16:::1;::::0;;-1:-1:-1;;;29562:16:0;;;;:9;;;::::1;::::0;:14:::1;::::0;:16:::1;::::0;;::::1;::::0;29518:7;;29562:16;;;;;:9;:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29552:4;29557:1;29552:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29552:26:0;;::::1;:7;::::0;;::::1;::::0;;;;;:26;29591:9:::1;::::0;:191:::1;::::0;-1:-1:-1;;;29591:191:0;;:9;::::1;::::0;:60:::1;::::0;:191:::1;::::0;29666:12;;29591:9:::1;::::0;29709:4;;29736::::1;::::0;29756:15:::1;::::0;29591:191:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29797:24;29908:1;29888:15;;29870;;:33;;;;:::i;:::-;29850:15;::::0;29826:39:::1;::::0;:21:::1;:39;:::i;:::-;29825:79;;;;:::i;:::-;29824:85;;;;:::i;:::-;29797:112:::0;-1:-1:-1;29926:13:0;;29922:344:::1;;29956:9;::::0;30127:4:::1;::::0;29956:224:::1;::::0;-1:-1:-1;;;29956:224:0;;30033:4:::1;29956:224;::::0;::::1;15837:34:1::0;15887:18;;;15880:34;;;29956:9:0::1;15930:18:1::0;;;15923:34;;;15973:18;;;15966:34;-1:-1:-1;;;;;30127:4:0;;::::1;16016:19:1::0;;;16009:44;30150:15:0::1;16069:19:1::0;;;16062:35;29956:9:0;::::1;::::0;:25:::1;::::0;29989:16;;15771:19:1;;29956:224:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;30200:54:0::1;::::0;;16621:25:1;;;16677:2;16662:18;;16655:34;;;16705:18;;;16698:34;;;30200:54:0::1;::::0;-1:-1:-1;16609:2:1;16594:18;30200:54:0::1;;;;;;;29922:344;30315:1;30280:32;30303:9:::0;30280:20;:32:::1;:::i;:::-;:36;30276:380;;;30447:11;::::0;30432:12:::1;::::0;30360:21:::1;::::0;30335::::1;::::0;30417:28:::1;::::0;30360:21;30417:28:::1;:::i;:::-;:42;;;;:::i;:::-;30397:62;;30474:19;30526:8;;30511:12;;30496:13;:28;;;;:::i;:::-;:39;;;;:::i;:::-;30550:13;::::0;:33:::1;::::0;30474:61;;-1:-1:-1;;;;;;30550:13:0::1;::::0;:33;::::1;;;::::0;30573:9;;30550:13:::1;:33:::0;:13;:33;30573:9;30550:13;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;30598:10:0::1;::::0;:32:::1;::::0;-1:-1:-1;;;;;30598:10:0;;::::1;::::0;:32;::::1;;;::::0;30618:11;;30598:10:::1;:32:::0;:10;:32;30618:11;30598:10;:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;30318:338;;;30276:380;29197:1466;;;;12281:1;-1:-1:-1::0;12293:16:0;:24;;-1:-1:-1;;;;12293:24:0;;;29122:1541::o;24245:1388::-;24371:16;;24347:4;;24371:16;;;;;24366:237;;24408:28;24427:4;24433:2;24408:18;:28::i;:::-;24460:16;;;;;;;24459:17;:41;;;;;24480:20;24491:4;24497:2;24480:10;:20::i;:::-;24455:137;;;24525:47;;-1:-1:-1;;;24525:47:0;;16945:2:1;24525:47:0;;;16927:21:1;16984:2;16964:18;;;16957:30;17023:34;17003:18;;;16996:62;-1:-1:-1;;;17074:18:1;;;17067:35;17119:19;;24525:47:0;16743:401:1;24455:137:0;24623:25;24651:38;24662:4;24668:2;24672:7;24681;24651:10;:38::i;:::-;24623:66;;24725:7;24706:15;24716:4;24706:9;:15::i;:::-;:26;24702:902;;24781:14;;;;-1:-1:-1;;;;;24765:13:0;;;;;;:7;:13;;;;;;:30;;24781:14;24765:30;:::i;:::-;-1:-1:-1;;;;;24749:13:0;;;;;;;:7;:13;;;;;;:46;;;;24838:22;;;;24824:11;;;;;;;;;;:36;;24838:22;24824:36;:::i;:::-;-1:-1:-1;;;;;24810:11:0;;;;;;;:7;:11;;;;;;;;:50;;;;24881:17;;;;;:11;:17;;;;;;;:37;;;;-1:-1:-1;;;;;;24903:15:0;;;;;;:11;:15;;;;;;;;24902:16;24881:37;24877:442;;;-1:-1:-1;;;;;24955:13:0;;;;;;:7;:13;;;;;;:23;;24971:7;;24955:23;:::i;:::-;-1:-1:-1;;;;;24939:13:0;;;;;;:7;:13;;;;;:39;24877:442;;;-1:-1:-1;;;;;25005:17:0;;;;;;:11;:17;;;;;;;;25004:18;:37;;;;-1:-1:-1;;;;;;25026:15:0;;;;;;:11;:15;;;;;;;;25004:37;25000:319;;;25090:22;;-1:-1:-1;;;;;25076:11:0;;25090:22;25076:11;;;:7;:11;;;;;;:36;;25090:22;25076:36;:::i;:::-;-1:-1:-1;;;;;25062:11:0;;;;;;:7;:11;;;;;:50;25000:319;;;-1:-1:-1;;;;;25138:17:0;;;;;;:11;:17;;;;;;;;:36;;;;-1:-1:-1;;;;;;25159:15:0;;;;;;:11;:15;;;;;;;;25138:36;25134:185;;;-1:-1:-1;;;;;25211:13:0;;;;;;:7;:13;;;;;;:23;;25227:7;;25211:23;:::i;:::-;-1:-1:-1;;;;;25195:13:0;;;;;;;:7;:13;;;;;;:39;;;;25281:22;;25267:11;;;;;;;;;;:36;;25281:22;25267:36;:::i;:::-;-1:-1:-1;;;;;25253:11:0;;;;;;:7;:11;;;;;:50;25134:185;25339:17;;;;:21;25335:83;;25379:39;25394:4;25400:6;:17;;;25379:14;:39::i;:::-;25451:1;25437:6;:11;;;:15;:34;;;;25470:1;25456:6;:11;;;:15;25437:34;25433:95;;;25490:38;25503:6;:11;;;25516:6;:11;;;25490:12;:38::i;:::-;25565:2;-1:-1:-1;;;;;25550:42:0;25559:4;-1:-1:-1;;;;;25550:42:0;;25569:6;:22;;;25550:42;;;;1803:25:1;;1791:2;1776:18;;1657:177;25550:42:0;;;;;;;;24702:902;-1:-1:-1;25621:4:0;;24245:1388;-1:-1:-1;;;;;24245:1388:0:o;27310:540::-;27401:7;;27437;;27354;;;;;27455:283;27479:9;:16;27475:20;;27455:283;;;27545:7;27521;:21;27529:9;27539:1;27529:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;27529:12:0;27521:21;;;;;;;;;;;;;:31;;:66;;;27580:7;27556;:21;27564:9;27574:1;27564:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;27564:12:0;27556:21;;;;;;;;;;;;;:31;27521:66;27517:97;;;27597:7;;27606;;27589:25;;;;;;;27310:540;;:::o;27517:97::-;27649:7;:21;27657:9;27667:1;27657:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;27657:12:0;27649:21;;;;;;;;;;;;;27639:31;;:7;:31;:::i;:::-;27629:41;;27705:7;:21;27713:9;27723:1;27713:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;27713:12:0;27705:21;;;;;;;;;;;;;27695:31;;:7;:31;:::i;:::-;27685:41;-1:-1:-1;27497:3:0;;;;:::i;:::-;;;;27455:283;;;;27772:7;;27762;;:17;;;;:::i;:::-;27752:7;:27;27748:58;;;27789:7;;27798;;27781:25;;;;;;27310:540;;:::o;27748:58::-;27825:7;;27834;;-1:-1:-1;27310:540:0;-1:-1:-1;27310:540:0:o;23592:439::-;23675:16;;;;;;;23674:17;23666:65;;;;-1:-1:-1;;;23666:65:0;;17351:2:1;23666:65:0;;;17333:21:1;17390:2;17370:18;;;17363:30;17429:34;17409:18;;;17402:62;-1:-1:-1;;;17480:18:1;;;17473:33;17523:19;;23666:65:0;17149:399:1;23666:65:0;23747:20;23758:4;23764:2;23747:10;:20::i;:::-;23746:21;:37;;;;-1:-1:-1;23777:6:0;;-1:-1:-1;;;;;23771:12:0;;;23777:6;;23771:12;23746:37;23742:282;;;-1:-1:-1;;;;;23800:23:0;;;;;;:17;:23;;;;;;;:30;;-1:-1:-1;;23800:30:0;23826:4;23800:30;;;;;;23845:16;:23;;-1:-1:-1;;23845:23:0;23800:30;23845:23;;;23898:15;23883:12;:30;23930:21;:28;;-1:-1:-1;;;;23930:28:0;-1:-1:-1;;;23930:28:0;;;23978:34;;;;;;1630:14:1;;1623:22;1605:41;;1593:2;1578:18;;1465:187;23978:34:0;;;;;;;;23592:439;;:::o;25641:1472::-;25736:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25736:18:0;25767:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25767:25:0;25803:19;25825:18;25834:4;25840:2;25825:8;:18::i;:::-;25803:40;-1:-1:-1;25873:21:0;25803:40;25873:7;:21;:::i;:::-;25856:14;;;:38;25907:1071;;;;-1:-1:-1;;;;;25938:11:0;;;;;;:7;:11;;;;;;;;25934:561;;;25984:15;;25970:11;:29;26034:17;;26018:13;:33;26086:17;;26070:13;:33;25934:561;;;-1:-1:-1;;;;;26129:13:0;;;;;;:7;:13;;;;;;;;26125:370;;;26177:14;;26163:11;:28;26226:16;;26210:13;:32;26277:16;;26261:13;:32;26125:370;;;26348:19;;26334:11;:33;26402:21;;26386:13;:37;26458:21;;26442:13;:37;26125:370;26551:16;;26536:11;;26526:21;;:7;:21;:::i;:::-;26525:42;;;;:::i;:::-;26511:11;;;:56;26648:16;;26630:13;;26614;;:29;;26630:13;26614:29;:::i;:::-;26603:41;;:7;:41;:::i;:::-;26602:62;;;;:::i;:::-;26582:17;;;:82;;;26715:11;;;;:31;;26582:82;26715:31;:::i;:::-;26704:43;;:7;:43;:::i;:::-;26679:68;;26778:11;;;;:25;;26792:11;;26778:25;:::i;:::-;26764:11;;;:39;25907:1071;;;26850:1;26836:11;;;:15;;;26866:17;;;:21;;;26902:32;;;26951:11;;;:15;25907:1071;27068:11;27048:6;:17;;;:31;;;;:::i;:::-;27033:6;:11;;;:47;;;;:::i;:::-;27015:6;:14;;;:66;;;;:::i;:::-;26990:22;;;:91;-1:-1:-1;26990:22:0;25641:1472;-1:-1:-1;;;;;25641:1472:0:o;20028:509::-;20108:19;20131:10;:8;:10::i;:::-;20188:6;;20108:33;;-1:-1:-1;20152:23:0;;-1:-1:-1;;;;;20188:6:0;;;20178:16;;;;:29;;20206:1;20178:29;;;20197:6;;20178:29;20152:55;-1:-1:-1;20218:18:0;20272:11;20240:28;20152:55;20240:10;:28;:::i;:::-;20239:44;;;;:::i;:::-;20335:4;20319:22;;;;:7;:22;;;;;;20218:65;;-1:-1:-1;20319:35:0;;20218:65;;20319:35;:::i;:::-;20310:4;20294:22;;;;:7;:22;;;;;;;;:60;;;;20368:11;:26;;;;;;20365:104;;;20450:4;20434:22;;;;:7;:22;;;;;;:35;;20459:10;;20434:35;:::i;:::-;20425:4;20409:22;;;;:7;:22;;;;;:60;20365:104;20485:43;;1803:25:1;;;20510:4:0;;-1:-1:-1;;;;;20485:43:0;;;;;1791:2:1;1776:18;20485:43:0;;;;;;;20097:440;;;20028:509;;:::o;27862:143::-;27952:4;27942:7;;:14;;;;:::i;:::-;27932:7;:24;27980:10;;:17;;27993:4;;27980:17;:::i;:::-;27967:10;:30;-1:-1:-1;;27862:143:0:o;27121:181::-;27182:7;27203:15;27220;27239:20;27250:4;27256:2;27239:10;:20::i;:::-;27202:57;;-1:-1:-1;27202:57:0;-1:-1:-1;27277:17:0;27202:57;;27277:17;:::i;22931:653::-;23041:7;;23077;;22994;;;;;23095:283;23119:9;:16;23115:20;;23095:283;;;23185:7;23161;:21;23169:9;23179:1;23169:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;23169:12:0;23161:21;;;;;;;;;;;;;:31;;:66;;;23220:7;23196;:21;23204:9;23214:1;23204:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;23204:12:0;23196:21;;;;;;;;;;;;;:31;23161:66;23157:97;;;23237:7;;23246;;23229:25;;;;;;;;;23157:97;23289:7;:21;23297:9;23307:1;23297:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;23297:12:0;23289:21;;;;;;;;;;;;;23279:31;;:7;:31;:::i;:::-;23269:41;;23345:7;:21;23353:9;23363:1;23353:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;23353:12:0;23345:21;;;;;;;;;;;;;23335:31;;:7;:31;:::i;:::-;23325:41;-1:-1:-1;23137:3:0;;;;:::i;:::-;;;;23095:283;;;;23392:15;23402:4;23392:9;:15::i;:::-;:20;:47;;;;-1:-1:-1;;;;;;19000:27:0;;18976:4;19000:27;;;:18;:27;;;;;;;;23416:23;23388:84;;;23451:7;;23442:6;:16;23460:10;23467:2;23460:6;:10::i;:::-;23506:7;;23496;;:17;;;;:::i;:::-;23486:7;:27;23482:58;;;23523:7;;23532;;23515:25;;;;;;;;23482:58;23559:7;;-1:-1:-1;23568:7:0;-1:-1:-1;22931:653:0;;;;;;:::o;15140:95::-;15183:49;15192:6;997:10;-1:-1:-1;;15183:8:0;:49::i;222:548:1:-;334:4;363:2;392;381:9;374:21;424:6;418:13;467:6;462:2;451:9;447:18;440:34;492:1;502:140;516:6;513:1;510:13;502:140;;;611:14;;;607:23;;601:30;577:17;;;596:2;573:26;566:66;531:10;;502:140;;;506:3;691:1;686:2;677:6;666:9;662:22;658:31;651:42;761:2;754;750:7;745:2;737:6;733:15;729:29;718:9;714:45;710:54;702:62;;;;222:548;;;;:::o;1009:131::-;-1:-1:-1;;;;;1084:31:1;;1074:42;;1064:70;;1130:1;1127;1120:12;1145:315;1213:6;1221;1274:2;1262:9;1253:7;1249:23;1245:32;1242:52;;;1290:1;1287;1280:12;1242:52;1329:9;1316:23;1348:31;1373:5;1348:31;:::i;:::-;1398:5;1450:2;1435:18;;;;1422:32;;-1:-1:-1;;;1145:315:1:o;1839:248::-;1907:6;1915;1968:2;1956:9;1947:7;1943:23;1939:32;1936:52;;;1984:1;1981;1974:12;1936:52;-1:-1:-1;;2007:23:1;;;2077:2;2062:18;;;2049:32;;-1:-1:-1;1839:248:1:o;2092:316::-;2169:6;2177;2185;2238:2;2226:9;2217:7;2213:23;2209:32;2206:52;;;2254:1;2251;2244:12;2206:52;-1:-1:-1;;2277:23:1;;;2347:2;2332:18;;2319:32;;-1:-1:-1;2398:2:1;2383:18;;;2370:32;;2092:316;-1:-1:-1;2092:316:1:o;2413:456::-;2490:6;2498;2506;2559:2;2547:9;2538:7;2534:23;2530:32;2527:52;;;2575:1;2572;2565:12;2527:52;2614:9;2601:23;2633:31;2658:5;2633:31;:::i;:::-;2683:5;-1:-1:-1;2740:2:1;2725:18;;2712:32;2753:33;2712:32;2753:33;:::i;:::-;2413:456;;2805:7;;-1:-1:-1;;;2859:2:1;2844:18;;;;2831:32;;2413:456::o;2874:180::-;2933:6;2986:2;2974:9;2965:7;2961:23;2957:32;2954:52;;;3002:1;2999;2992:12;2954:52;-1:-1:-1;3025:23:1;;2874:180;-1:-1:-1;2874:180:1:o;3248:247::-;3307:6;3360:2;3348:9;3339:7;3335:23;3331:32;3328:52;;;3376:1;3373;3366:12;3328:52;3415:9;3402:23;3434:31;3459:5;3434:31;:::i;3760:160::-;3825:20;;3881:13;;3874:21;3864:32;;3854:60;;3910:1;3907;3900:12;3854:60;3760:160;;;:::o;3925:315::-;3990:6;3998;4051:2;4039:9;4030:7;4026:23;4022:32;4019:52;;;4067:1;4064;4057:12;4019:52;4106:9;4093:23;4125:31;4150:5;4125:31;:::i;:::-;4175:5;-1:-1:-1;4199:35:1;4230:2;4215:18;;4199:35;:::i;:::-;4189:45;;3925:315;;;;;:::o;4245:385::-;4331:6;4339;4347;4355;4408:3;4396:9;4387:7;4383:23;4379:33;4376:53;;;4425:1;4422;4415:12;4376:53;-1:-1:-1;;4448:23:1;;;4518:2;4503:18;;4490:32;;-1:-1:-1;4569:2:1;4554:18;;4541:32;;4620:2;4605:18;4592:32;;-1:-1:-1;4245:385:1;-1:-1:-1;4245:385:1:o;4635:180::-;4691:6;4744:2;4732:9;4723:7;4719:23;4715:32;4712:52;;;4760:1;4757;4750:12;4712:52;4783:26;4799:9;4783:26;:::i;4820:388::-;4888:6;4896;4949:2;4937:9;4928:7;4924:23;4920:32;4917:52;;;4965:1;4962;4955:12;4917:52;5004:9;4991:23;5023:31;5048:5;5023:31;:::i;:::-;5073:5;-1:-1:-1;5130:2:1;5115:18;;5102:32;5143:33;5102:32;5143:33;:::i;:::-;5195:7;5185:17;;;4820:388;;;;;:::o;5213:356::-;5415:2;5397:21;;;5434:18;;;5427:30;5493:34;5488:2;5473:18;;5466:62;5560:2;5545:18;;5213:356::o;5574:380::-;5653:1;5649:12;;;;5696;;;5717:61;;5771:4;5763:6;5759:17;5749:27;;5717:61;5824:2;5816:6;5813:14;5793:18;5790:38;5787:161;;5870:10;5865:3;5861:20;5858:1;5851:31;5905:4;5902:1;5895:15;5933:4;5930:1;5923:15;5787:161;;5574:380;;;:::o;5959:127::-;6020:10;6015:3;6011:20;6008:1;6001:31;6051:4;6048:1;6041:15;6075:4;6072:1;6065:15;6091:168;6164:9;;;6195;;6212:15;;;6206:22;;6192:37;6182:71;;6233:18;;:::i;6264:217::-;6304:1;6330;6320:132;;6374:10;6369:3;6365:20;6362:1;6355:31;6409:4;6406:1;6399:15;6437:4;6434:1;6427:15;6320:132;-1:-1:-1;6466:9:1;;6264:217::o;6910:125::-;6975:9;;;6996:10;;;6993:36;;;7009:18;;:::i;7040:128::-;7107:9;;;7128:11;;;7125:37;;;7142:18;;:::i;7584:425::-;7786:2;7768:21;;;7825:2;7805:18;;;7798:30;7864:34;7859:2;7844:18;;7837:62;7935:31;7930:2;7915:18;;7908:59;7999:3;7984:19;;7584:425::o;9790:127::-;9851:10;9846:3;9842:20;9839:1;9832:31;9882:4;9879:1;9872:15;9906:4;9903:1;9896:15;9922:127;9983:10;9978:3;9974:20;9971:1;9964:31;10014:4;10011:1;10004:15;10038:4;10035:1;10028:15;10054:135;10093:3;10114:17;;;10111:43;;10134:18;;:::i;:::-;-1:-1:-1;10181:1:1;10170:13;;10054:135::o;10613:251::-;10683:6;10736:2;10724:9;10715:7;10711:23;10707:32;10704:52;;;10752:1;10749;10742:12;10704:52;10784:9;10778:16;10803:31;10828:5;10803:31;:::i;14511:980::-;14773:4;14821:3;14810:9;14806:19;14852:6;14841:9;14834:25;14878:2;14916:6;14911:2;14900:9;14896:18;14889:34;14959:3;14954:2;14943:9;14939:18;14932:31;14983:6;15018;15012:13;15049:6;15041;15034:22;15087:3;15076:9;15072:19;15065:26;;15126:2;15118:6;15114:15;15100:29;;15147:1;15157:195;15171:6;15168:1;15165:13;15157:195;;;15236:13;;-1:-1:-1;;;;;15232:39:1;15220:52;;15327:15;;;;15292:12;;;;15268:1;15186:9;15157:195;;;-1:-1:-1;;;;;;;15408:32:1;;;;15403:2;15388:18;;15381:60;-1:-1:-1;;;15472:3:1;15457:19;15450:35;15369:3;14511:980;-1:-1:-1;;;14511:980:1:o;16108:306::-;16196:6;16204;16212;16265:2;16253:9;16244:7;16240:23;16236:32;16233:52;;;16281:1;16278;16271:12;16233:52;16310:9;16304:16;16294:26;;16360:2;16349:9;16345:18;16339:25;16329:35;;16404:2;16393:9;16389:18;16383:25;16373:35;;16108:306;;;;;:::o

Swarm Source

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