Contract Address Details

0xE10A51C2dDBBaC2732707A9fD389c3c8CF894367

Token
CroVision (CROVIS)
Creator
0x5888dd–6734ce at 0xaf4980–002556
Balance
0 CRO ( )
Tokens
Fetching tokens...
Transactions
501 Transactions
Transfers
316 Transfers
Gas Used
19,418,570
Last Balance Update
5898320
Contract name:
CroVision




Optimization enabled
true
Compiler version
v0.6.12+commit.27d51765




Optimization runs
200
EVM Version
default




Verified at
2022-02-08T10:46:19.375934Z

Contract source code

//SPDX-License-Identifier: UNLICENSED
// First Cronos Chain Wallet Tracker Utility Token
// Website : https://crovision.tech/

pragma solidity ^0.6.12;

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

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


interface IERC20 {

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);


}

library SafeMath {

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }


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

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

        return c;
    }

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

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

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

        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {

            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

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

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

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

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

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

    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

    //Added function
    // 1 minute = 60
    // 1h 3600
    // 24h 86400
    // 1w 604800

    function getTime() public view returns (uint256) {
        return now;
    }

    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = now + time;
        emit OwnershipTransferred(_owner, address(0));
    }

    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(now > _lockTime , "Contract is locked");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

// pragma solidity >=0.5.0;

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

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

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


// pragma solidity >=0.5.0;

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}



// pragma solidity >=0.6.2;

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

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


contract CroVision is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcludedFromFee;

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

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1 * 10**12 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    uint256 private _tBurnTotal;
    uint256 private _tLiquidityAndMarkTotal;

    string private _name = "CroVision";
    string private _symbol = "CROVIS";
    uint8 private _decimals = 9;


    uint256 public _taxFee = 1;
    uint256 private _previousTaxFee = _taxFee;

    uint256 public _burnFee = 1;
    uint256 private _previousBurnFee = _burnFee;


    uint256 public _liquidityAndMarketingFee = 6;
    uint256 private _previousLiquidityAndMarketingFee = _liquidityAndMarketingFee;

    uint256 public _buyTaxFee = 2;
    uint256 public _buyBurnFee = 1;
    uint256 public _buyLiquidityAndMarketingFee = 5;

    uint256 public _sellTaxFee = 6;
    uint256 public _sellBurnFee = 2;
    uint256 public _sellLiquidityAndMarketingFee = 10;

    uint256 public _maxTxAmount = 1 * 10**12 * 10**9;
    uint256 private minimumTokensBeforeSwap = 500000 * 10**9;

    address payable public mwallet = 0xEF2754fE2c5C451213b8d17bAd85d04dDaE1D5B3;

    uint256 public _buySellSetTaxCap = 20; // Dev cannot set more than 20 as tax

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    address public routerAddressForCrowFi = 0xd30d3aC04E2325E19A2227cfE6Bc860376Ba20b1;

    event RewardLiquidityProviders(uint256 tokenAmount);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor () public {
        _rOwned[_msgSender()] = _rTotal;

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

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

    function decimals() public view returns (uint8) {
        return _decimals;
    }

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

    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 allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

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

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

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

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

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

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

    function totalBurn() public view returns (uint256) {
        return _tBurnTotal;
    }

    function totalLiquidity() public view returns (uint256) {

        return _tLiquidityAndMarkTotal;
    }

    function minimumTokensBeforeSwapAmount() public view returns (uint256) {
        return minimumTokensBeforeSwap;
    }

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }


    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) public onlyOwner() {
        // require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude Uniswap router.');
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        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(from != owner() && to != owner())
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");


        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap;
        if (
            overMinimumTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = minimumTokensBeforeSwap;
            swapAndLiquify(contractTokenBalance);
        }


        bool takeFee = true;

        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
        else{
            // TAX WHEN Buying CROVIS TOKEN
            if(from == uniswapV2Pair){
                removeAllFee();
                _taxFee = _buyTaxFee;
                _burnFee = _buyBurnFee;
                _liquidityAndMarketingFee = _buyLiquidityAndMarketingFee;


            }
            // TAX WHEN Selling CROVIS TOKEN
            if(to == uniswapV2Pair){
                removeAllFee();
                _taxFee = _sellTaxFee;
                _burnFee = _sellBurnFee;
                _liquidityAndMarketingFee = _sellLiquidityAndMarketingFee;
            }
        }

        _tokenTransfer(from,to,amount,takeFee);
    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        swapTokensForEth(contractTokenBalance);
        _tLiquidityAndMarkTotal = _tLiquidityAndMarkTotal.add(address(this).balance);
        TransferCRO(mwallet, address(this).balance);
    }

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

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

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


    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee)
            removeAllFee();

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }

        if(!takeFee)
            restoreAllFee();
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tBurn, uint256 tLiquidity) = _getValues(tAmount);
        uint256 rBurn =  tBurn.mul(currentRate);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, rBurn, tFee, tBurn);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tBurn, uint256 tLiquidity) = _getValues(tAmount);
        uint256 rBurn =  tBurn.mul(currentRate);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, rBurn, tFee, tBurn);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tBurn, uint256 tLiquidity) = _getValues(tAmount);
        uint256 rBurn =  tBurn.mul(currentRate);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, rBurn, tFee, tBurn);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tBurn, uint256 tLiquidity) = _getValues(tAmount);
        uint256 rBurn =  tBurn.mul(currentRate);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, rBurn, tFee, tBurn);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _reflectFee(uint256 rFee, uint256 rBurn, uint256 tFee, uint256 tBurn) private {
        _rTotal = _rTotal.sub(rFee).sub(rBurn);
        _tFeeTotal = _tFeeTotal.add(tFee);
        _tBurnTotal = _tBurnTotal.add(tBurn);
        _tTotal = _tTotal.sub(tBurn);
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tBurn, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tBurn, tLiquidity, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tBurn, tLiquidity);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tBurn = calculateBurnFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tBurn).sub(tLiquidity);
        return (tTransferAmount, tFee, tBurn, tLiquidity);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tBurn, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rBurn = tBurn.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rBurn).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private 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.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(
            10**2
        );
    }

    function calculateBurnFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_burnFee).div(
            10**2
        );
    }

    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_liquidityAndMarketingFee).div(
            10**2
        );
    }

    function removeAllFee() private {
        if(_taxFee == 0 && _burnFee == 0 && _liquidityAndMarketingFee == 0) return;

        _previousTaxFee = _taxFee;
        _previousBurnFee = _burnFee;
        _previousLiquidityAndMarketingFee = _liquidityAndMarketingFee;

        _taxFee = 0;
        _burnFee = 0;
        _liquidityAndMarketingFee = 0;
    }

    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _burnFee = _previousBurnFee;
        _liquidityAndMarketingFee = _previousLiquidityAndMarketingFee;
    }

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

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function setTaxFeePercent(uint256 taxFee) external onlyOwner() {
        _taxFee = taxFee;
    }

    function setBurnFeePercent(uint256 burnFee) external onlyOwner() {
        _burnFee = burnFee;
    }

    function setLiquidityFeePercent(uint256 value) external onlyOwner() {
        _liquidityAndMarketingFee = value;
    }

    //buy tax function setters
    function setBuyTaxFeePercent(uint256 taxFee) external onlyOwner() {
        require(taxFee <= _buySellSetTaxCap, "Tax is capped");
        _buyTaxFee = taxFee;
    }

    function setBuyBurnFeePercent(uint256 burnFee) external onlyOwner() {
        require(burnFee <= _buySellSetTaxCap, "Tax is capped");
        _buyBurnFee = burnFee;
    }

    function setBuyFeePercent(uint256 value) external onlyOwner() {
        require(value <= _buySellSetTaxCap, "Tax is capped");
        _buyLiquidityAndMarketingFee = value;
    }

    //sell tax function setters
    function setSellTaxFeePercent(uint256 taxFee) external onlyOwner() {
        require(taxFee <= _buySellSetTaxCap, "Tax is capped");
        _sellTaxFee = taxFee;
    }

    function setSellBurnFeePercent(uint256 burnFee) external onlyOwner() {
        require(burnFee <= _buySellSetTaxCap, "Tax is capped");
        _sellBurnFee = burnFee;
    }

    function setSellFeePercent(uint256 value) external onlyOwner() {
        require(value <= _buySellSetTaxCap, "Tax is capped");
        _sellLiquidityAndMarketingFee = value;
    }

    function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner() {
        _maxTxAmount = maxTxPercent;
    }

    function setNumTokensSellToAddToLiquidity(uint256 _minimumTokensBeforeSwap) external onlyOwner() {
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
    }

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

    function changeRouterVersion(address _router) public onlyOwner returns(address _pair) {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(_router);

        _pair = IUniswapV2Factory(_uniswapV2Router.factory()).getPair(address(this), _uniswapV2Router.WETH());
        if(_pair == address(0)){
            // Pair doesn't exist
            _pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        }
        uniswapV2Pair = _pair;

        // Set the router of the contract variables
        uniswapV2Router = _uniswapV2Router;
    }


    function TransferCRO(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }

    function Sweeper() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(owner()).transfer(balance);
        //used in case of refund when someone mistakenly sends CRO to contract address
    }

//to recieve CRO from uniswapV2Router when swaping
receive() external payable {}
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RewardLiquidityProviders","inputs":[{"type":"uint256","name":"tokenAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapAndLiquify","inputs":[{"type":"uint256","name":"tokensSwapped","internalType":"uint256","indexed":false},{"type":"uint256","name":"ethReceived","internalType":"uint256","indexed":false},{"type":"uint256","name":"tokensIntoLiqudity","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapAndLiquifyEnabledUpdated","inputs":[{"type":"bool","name":"enabled","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"Sweeper","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_burnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_buyBurnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_buyLiquidityAndMarketingFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_buySellSetTaxCap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_buyTaxFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_liquidityAndMarketingFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_sellBurnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_sellLiquidityAndMarketingFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_sellTaxFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_taxFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"address","name":"_pair","internalType":"address"}],"name":"changeRouterVersion","inputs":[{"type":"address","name":"_router","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deliver","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUnlockTime","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"lock","inputs":[{"type":"uint256","name":"time","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minimumTokensBeforeSwapAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"mwallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFromToken","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"},{"type":"bool","name":"deductTransferFee","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"routerAddressForCrowFi","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBurnFeePercent","inputs":[{"type":"uint256","name":"burnFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuyBurnFeePercent","inputs":[{"type":"uint256","name":"burnFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuyFeePercent","inputs":[{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuyTaxFeePercent","inputs":[{"type":"uint256","name":"taxFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLiquidityFeePercent","inputs":[{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxTxPercent","inputs":[{"type":"uint256","name":"maxTxPercent","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNumTokensSellToAddToLiquidity","inputs":[{"type":"uint256","name":"_minimumTokensBeforeSwap","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSellBurnFeePercent","inputs":[{"type":"uint256","name":"burnFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSellFeePercent","inputs":[{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSellTaxFeePercent","inputs":[{"type":"uint256","name":"taxFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapAndLiquifyEnabled","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTaxFeePercent","inputs":[{"type":"uint256","name":"taxFee","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapAndLiquifyEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenFromReflection","inputs":[{"type":"uint256","name":"rAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalBurn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalLiquidity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"uniswapV2Pair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router02"}],"name":"uniswapV2Router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlock","inputs":[]},{"type":"receive","stateMutability":"payable"}]
            

Deployed ByteCode

0x6080604052600436106103a65760003560e01c806370a08231116101e7578063bd92931a1161010d578063dd62ed3e116100a0578063ebf786631161006f578063ebf7866314610c32578063efcc52de14610c5c578063f0f165af14610c71578063f2fde38b14610c9b576103ad565b8063dd62ed3e14610b9a578063de41756114610bd5578063e4ad4dbc14610bea578063ea2f0b3714610bff576103ad565b8063d0e03523116100dc578063d0e0352314610b07578063d543dbeb14610b31578063d56fcd9c14610b5b578063dd46706414610b70576103ad565b8063bd92931a14610a87578063c0b0fda214610a9c578063c49b9a8014610ab1578063cea2695814610add576103ad565b8063950eb5d511610185578063a457c2d711610154578063a457c2d7146109eb578063a69df4b514610a24578063a9059cbb14610a39578063ad68ff7214610a72576103ad565b8063950eb5d51461096d57806395d89b4114610997578063a073d37f146109ac578063a2b8a947146109c1576103ad565b80637d1db4a5116101c15780637d1db4a5146108e657806388f82020146108fb5780638da5cb5b1461092e5780638ee88c5314610943576103ad565b806370a0823114610889578063715018a6146108bc5780637abdc1ca146108d1576103ad565b806339509351116102cc57806349bd5a5e1161026a578063557ed1ba11610239578063557ed1ba146108175780635881f3ef1461082c5780635e5b77801461085f578063602bc62b14610874576103ad565b806349bd5a5e146107875780634a74bb021461079c57806352390c02146107b15780635342acb4146107e4576103ad565b80633c9f861d116102a65780633c9f861d146106e3578063437823ec146106f85780634549b0391461072b578063470409e11461075d576103ad565b8063395093511461066b5780633b124fe7146106a45780633bd5d173146106b9576103ad565b80631694505e1161034457806323b872dd1161031357806323b872dd146105a05780632d838119146105e3578063313ce5671461060d5780633685d41914610638576103ad565b80631694505e1461053057806316f2f1a81461056157806318160ddd14610576578063200a692d1461058b576103ad565b806310499f441161038057806310499f44146104b557806311889b76146104dc57806313114a9d1461050657806315770f921461051b576103ad565b8063061c82d0146103b257806306fdde03146103de578063095ea7b314610468576103ad565b366103ad57005b600080fd5b3480156103be57600080fd5b506103dc600480360360208110156103d557600080fd5b5035610cce565b005b3480156103ea57600080fd5b506103f3610d2b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561042d578181015183820152602001610415565b50505050905090810190601f16801561045a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561047457600080fd5b506104a16004803603604081101561048b57600080fd5b506001600160a01b038135169060200135610dc1565b604080519115158252519081900360200190f35b3480156104c157600080fd5b506104ca610ddf565b60408051918252519081900360200190f35b3480156104e857600080fd5b506103dc600480360360208110156104ff57600080fd5b5035610de5565b34801561051257600080fd5b506104ca610e89565b34801561052757600080fd5b506104ca610e8f565b34801561053c57600080fd5b50610545610e95565b604080516001600160a01b039092168252519081900360200190f35b34801561056d57600080fd5b506104ca610ea4565b34801561058257600080fd5b506104ca610eaa565b34801561059757600080fd5b506104ca610eb0565b3480156105ac57600080fd5b506104a1600480360360608110156105c357600080fd5b506001600160a01b03813581169160208101359091169060400135610eb6565b3480156105ef57600080fd5b506104ca6004803603602081101561060657600080fd5b5035610f3d565b34801561061957600080fd5b50610622610f9f565b6040805160ff9092168252519081900360200190f35b34801561064457600080fd5b506103dc6004803603602081101561065b57600080fd5b50356001600160a01b0316610fa8565b34801561067757600080fd5b506104a16004803603604081101561068e57600080fd5b506001600160a01b038135169060200135611169565b3480156106b057600080fd5b506104ca6111b7565b3480156106c557600080fd5b506103dc600480360360208110156106dc57600080fd5b50356111bd565b3480156106ef57600080fd5b506104ca611299565b34801561070457600080fd5b506103dc6004803603602081101561071b57600080fd5b50356001600160a01b031661129f565b34801561073757600080fd5b506104ca6004803603604081101561074e57600080fd5b5080359060200135151561131b565b34801561076957600080fd5b506103dc6004803603602081101561078057600080fd5b50356113af565b34801561079357600080fd5b50610545611453565b3480156107a857600080fd5b506104a1611462565b3480156107bd57600080fd5b506103dc600480360360208110156107d457600080fd5b50356001600160a01b0316611472565b3480156107f057600080fd5b506104a16004803603602081101561080757600080fd5b50356001600160a01b03166115f8565b34801561082357600080fd5b506104ca611616565b34801561083857600080fd5b506105456004803603602081101561084f57600080fd5b50356001600160a01b031661161a565b34801561086b57600080fd5b506103dc611974565b34801561088057600080fd5b506104ca611a0d565b34801561089557600080fd5b506104ca600480360360208110156108ac57600080fd5b50356001600160a01b0316611a13565b3480156108c857600080fd5b506103dc611a75565b3480156108dd57600080fd5b506104ca611b05565b3480156108f257600080fd5b506104ca611b0b565b34801561090757600080fd5b506104a16004803603602081101561091e57600080fd5b50356001600160a01b0316611b11565b34801561093a57600080fd5b50610545611b2f565b34801561094f57600080fd5b506103dc6004803603602081101561096657600080fd5b5035611b3e565b34801561097957600080fd5b506103dc6004803603602081101561099057600080fd5b5035611b9b565b3480156109a357600080fd5b506103f3611c3f565b3480156109b857600080fd5b506104ca611ca0565b3480156109cd57600080fd5b506103dc600480360360208110156109e457600080fd5b5035611ca6565b3480156109f757600080fd5b506104a160048036036040811015610a0e57600080fd5b506001600160a01b038135169060200135611d4a565b348015610a3057600080fd5b506103dc611db2565b348015610a4557600080fd5b506104a160048036036040811015610a5c57600080fd5b506001600160a01b038135169060200135611e95565b348015610a7e57600080fd5b50610545611ea9565b348015610a9357600080fd5b506104ca611eb8565b348015610aa857600080fd5b506104ca611ebe565b348015610abd57600080fd5b506103dc60048036036020811015610ad457600080fd5b50351515611ec4565b348015610ae957600080fd5b506103dc60048036036020811015610b0057600080fd5b5035611f6f565b348015610b1357600080fd5b506103dc60048036036020811015610b2a57600080fd5b5035611fcc565b348015610b3d57600080fd5b506103dc60048036036020811015610b5457600080fd5b5035612070565b348015610b6757600080fd5b506105456120cd565b348015610b7c57600080fd5b506103dc60048036036020811015610b9357600080fd5b50356120dc565b348015610ba657600080fd5b506104ca60048036036040811015610bbd57600080fd5b506001600160a01b038135811691602001351661217a565b348015610be157600080fd5b506104ca6121a5565b348015610bf657600080fd5b506104ca6121ab565b348015610c0b57600080fd5b506103dc60048036036020811015610c2257600080fd5b50356001600160a01b03166121b1565b348015610c3e57600080fd5b506103dc60048036036020811015610c5557600080fd5b503561222a565b348015610c6857600080fd5b506104ca6122ce565b348015610c7d57600080fd5b506103dc60048036036020811015610c9457600080fd5b50356122d4565b348015610ca757600080fd5b506103dc60048036036020811015610cbe57600080fd5b50356001600160a01b0316612331565b610cd6612417565b6000546001600160a01b03908116911614610d26576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b601255565b600f8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610db75780601f10610d8c57610100808354040283529160200191610db7565b820191906000526020600020905b815481529060010190602001808311610d9a57829003601f168201915b5050505050905090565b6000610dd5610dce612417565b848461241b565b5060015b92915050565b60215481565b610ded612417565b6000546001600160a01b03908116911614610e3d576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b602154811115610e84576040805162461bcd60e51b815260206004820152600d60248201526c15185e081a5cc818d85c1c1959609a1b604482015290519081900360640190fd5b601855565b600c5490565b600e5490565b6022546001600160a01b031681565b60195481565b600a5490565b601b5481565b6000610ec3848484612507565b610f3384610ecf612417565b610f2e85604051806060016040528060288152602001613591602891396001600160a01b038a16600090815260066020526040812090610f0d612417565b6001600160a01b03168152602081019190915260400160002054919061278b565b61241b565b5060019392505050565b6000600b54821115610f805760405162461bcd60e51b815260040180806020018281038252602a8152602001806134d6602a913960400191505060405180910390fd5b6000610f8a612822565b9050610f968382612845565b9150505b919050565b60115460ff1690565b610fb0612417565b6000546001600160a01b03908116911614611000576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526008602052604090205460ff1661106d576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b60005b60095481101561116557816001600160a01b03166009828154811061109157fe5b6000918252602090912001546001600160a01b0316141561115d576009805460001981019081106110be57fe5b600091825260209091200154600980546001600160a01b0390921691839081106110e457fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055600890925220805460ff19169055600980548061113657fe5b600082815260209020810160001990810180546001600160a01b0319169055019055611165565b600101611070565b5050565b6000610dd5611176612417565b84610f2e8560066000611187612417565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061288e565b60125481565b60006111c7612417565b6001600160a01b03811660009081526008602052604090205490915060ff16156112225760405162461bcd60e51b815260040180806020018281038252602c81526020018061366b602c913960400191505060405180910390fd5b600061122d836128e8565b5050506001600160a01b03861660009081526004602052604090205493945061125b93925084915050612943565b6001600160a01b038316600090815260046020526040902055600b546112819082612943565b600b55600c54611291908461288e565b600c55505050565b600d5490565b6112a7612417565b6000546001600160a01b039081169116146112f7576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000600a54831115611374576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b81611394576000611384846128e8565b50949650610dd995505050505050565b600061139f846128e8565b50939650610dd995505050505050565b6113b7612417565b6000546001600160a01b03908116911614611407576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b60215481111561144e576040805162461bcd60e51b815260206004820152600d60248201526c15185e081a5cc818d85c1c1959609a1b604482015290519081900360640190fd5b601955565b6023546001600160a01b031681565b602354600160a81b900460ff1681565b61147a612417565b6000546001600160a01b039081169116146114ca576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526008602052604090205460ff1615611538576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205415611592576001600160a01b03811660009081526004602052604090205461157890610f3d565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b03166000818152600860205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6001600160a01b031660009081526007602052604090205460ff1690565b4290565b6000611624612417565b6000546001600160a01b03908116911614611674576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b6000829050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b257600080fd5b505afa1580156116c6573d6000803e3d6000fd5b505050506040513d60208110156116dc57600080fd5b5051604080516315ab88c960e31b815290516001600160a01b039283169263e6a439059230929186169163ad5c464891600480820192602092909190829003018186803b15801561172c57600080fd5b505afa158015611740573d6000803e3d6000fd5b505050506040513d602081101561175657600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039384166004820152929091166024830152516044808301926020929190829003018186803b1580156117a657600080fd5b505afa1580156117ba573d6000803e3d6000fd5b505050506040513d60208110156117d057600080fd5b505191506001600160a01b03821661194057806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561181b57600080fd5b505afa15801561182f573d6000803e3d6000fd5b505050506040513d602081101561184557600080fd5b5051604080516315ab88c960e31b815290516001600160a01b039283169263c9c653969230929186169163ad5c464891600480820192602092909190829003018186803b15801561189557600080fd5b505afa1580156118a9573d6000803e3d6000fd5b505050506040513d60208110156118bf57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b15801561191157600080fd5b505af1158015611925573d6000803e3d6000fd5b505050506040513d602081101561193b57600080fd5b505191505b602380546001600160a01b038085166001600160a01b03199283161790925560228054939092169216919091179055919050565b61197c612417565b6000546001600160a01b039081169116146119cc576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b476119d5611b2f565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015611165573d6000803e3d6000fd5b60025490565b6001600160a01b03811660009081526008602052604081205460ff1615611a5357506001600160a01b038116600090815260056020526040902054610f9a565b6001600160a01b038216600090815260046020526040902054610dd990610f3d565b611a7d612417565b6000546001600160a01b03908116911614611acd576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116906000805160206135d9833981519152908390a3600080546001600160a01b0319169055565b601c5481565b601e5481565b6001600160a01b031660009081526008602052604090205460ff1690565b6000546001600160a01b031690565b611b46612417565b6000546001600160a01b03908116911614611b96576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b601655565b611ba3612417565b6000546001600160a01b03908116911614611bf3576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b602154811115611c3a576040805162461bcd60e51b815260206004820152600d60248201526c15185e081a5cc818d85c1c1959609a1b604482015290519081900360640190fd5b601a55565b60108054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610db75780601f10610d8c57610100808354040283529160200191610db7565b601f5490565b611cae612417565b6000546001600160a01b03908116911614611cfe576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b602154811115611d45576040805162461bcd60e51b815260206004820152600d60248201526c15185e081a5cc818d85c1c1959609a1b604482015290519081900360640190fd5b601d55565b6000610dd5611d57612417565b84610f2e856040518060600160405280602581526020016136ba6025913960066000611d81612417565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061278b565b6001546001600160a01b03163314611dfb5760405162461bcd60e51b81526004018080602001828103825260238152602001806136976023913960400191505060405180910390fd5b6002544211611e46576040805162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81b1bd8dad95960721b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116916000805160206135d983398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000610dd5611ea2612417565b8484612507565b6020546001600160a01b031681565b601a5481565b60145481565b611ecc612417565b6000546001600160a01b03908116911614611f1c576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b60238054821515600160a81b810260ff60a81b199092169190911790915560408051918252517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599181900360200190a150565b611f77612417565b6000546001600160a01b03908116911614611fc7576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b601455565b611fd4612417565b6000546001600160a01b03908116911614612024576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b60215481111561206b576040805162461bcd60e51b815260206004820152600d60248201526c15185e081a5cc818d85c1c1959609a1b604482015290519081900360640190fd5b601b55565b612078612417565b6000546001600160a01b039081169116146120c8576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b601e55565b6024546001600160a01b031681565b6120e4612417565b6000546001600160a01b03908116911614612134576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b60008054600180546001600160a01b03199081166001600160a01b0384161790915516815542820160025560405181906000805160206135d9833981519152908290a350565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b601d5481565b60165481565b6121b9612417565b6000546001600160a01b03908116911614612209576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600760205260409020805460ff19169055565b612232612417565b6000546001600160a01b03908116911614612282576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b6021548111156122c9576040805162461bcd60e51b815260206004820152600d60248201526c15185e081a5cc818d85c1c1959609a1b604482015290519081900360640190fd5b601c55565b60185481565b6122dc612417565b6000546001600160a01b0390811691161461232c576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b601f55565b612339612417565b6000546001600160a01b03908116911614612389576040805162461bcd60e51b815260206004820181905260248201526000805160206135b9833981519152604482015290519081900360640190fd5b6001600160a01b0381166123ce5760405162461bcd60e51b81526004018080602001828103825260268152602001806135006026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216916000805160206135d983398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b0383166124605760405162461bcd60e51b81526004018080602001828103825260248152602001806136476024913960400191505060405180910390fd5b6001600160a01b0382166124a55760405162461bcd60e51b81526004018080602001828103825260228152602001806135266022913960400191505060405180910390fd5b6001600160a01b03808416600081815260066020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661254c5760405162461bcd60e51b81526004018080602001828103825260258152602001806136226025913960400191505060405180910390fd5b6001600160a01b0382166125915760405162461bcd60e51b81526004018080602001828103825260238152602001806134b36023913960400191505060405180910390fd5b600081116125d05760405162461bcd60e51b81526004018080602001828103825260298152602001806135f96029913960400191505060405180910390fd5b6125d8611b2f565b6001600160a01b0316836001600160a01b03161415801561261257506125fc611b2f565b6001600160a01b0316826001600160a01b031614155b1561265857601e548111156126585760405162461bcd60e51b81526004018080602001828103825260288152602001806135486028913960400191505060405180910390fd5b600061266330611a13565b601f54909150811080159081906126845750602354600160a01b900460ff16155b801561269e57506023546001600160a01b03868116911614155b80156126b35750602354600160a81b900460ff165b156126c657601f5491506126c682612985565b6001600160a01b03851660009081526007602052604090205460019060ff168061270857506001600160a01b03851660009081526007602052604090205460ff165b1561271557506000612777565b6023546001600160a01b0387811691161415612746576127336129d7565b601854601255601954601455601a546016555b6023546001600160a01b0386811691161415612777576127646129d7565b601b54601255601c54601455601d546016555b61278386868684612a20565b505050505050565b6000818484111561281a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127df5781810151838201526020016127c7565b50505050905090810190601f16801561280c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080600061282f612b94565b909250905061283e8282612845565b9250505090565b600061288783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612cf7565b9392505050565b600082820183811015612887576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060008060008060008060008060006129028c612d5c565b935093509350935060008060006129238f87878761291e612822565b612db1565b919f509d509b509599509397509195509350505050919395979092949650565b600061288783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061278b565b6023805460ff60a01b1916600160a01b1790556129a181612e13565b600e546129ae904761288e565b600e556020546129c7906001600160a01b031647612fb9565b506023805460ff60a01b19169055565b6012541580156129e75750601454155b80156129f35750601654155b156129fd57612a1e565b60128054601355601480546015556016805460175560009283905590829055555b565b80612a2d57612a2d6129d7565b6001600160a01b03841660009081526008602052604090205460ff168015612a6e57506001600160a01b03831660009081526008602052604090205460ff16155b15612a8357612a7e848484612ff4565b612b81565b6001600160a01b03841660009081526008602052604090205460ff16158015612ac457506001600160a01b03831660009081526008602052604090205460ff165b15612ad457612a7e848484613142565b6001600160a01b03841660009081526008602052604090205460ff16158015612b1657506001600160a01b03831660009081526008602052604090205460ff16155b15612b2657612a7e848484613210565b6001600160a01b03841660009081526008602052604090205460ff168015612b6657506001600160a01b03831660009081526008602052604090205460ff165b15612b7657612a7e848484613279565b612b81848484613210565b80612b8e57612b8e613311565b50505050565b600b54600a546000918291825b600954811015612cc557826004600060098481548110612bbd57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612c225750816005600060098481548110612bfb57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612c3957600b54600a5494509450505050612cf3565b612c796004600060098481548110612c4d57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612943565b9250612cbb6005600060098481548110612c8f57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612943565b9150600101612ba1565b50600a54600b54612cd591612845565b821015612ced57600b54600a54935093505050612cf3565b90925090505b9091565b60008183612d465760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156127df5781810151838201526020016127c7565b506000838581612d5257fe5b0495945050505050565b6000806000806000612d6d86613325565b90506000612d7a87613347565b90506000612d8788613363565b90506000612da182612d9b85818d89612943565b90612943565b9993985091965094509092505050565b6000808080612dc0898661337f565b90506000612dce898761337f565b90506000612ddc898861337f565b90506000612dea898961337f565b90506000612dfe82612d9b85818989612943565b949d949c50929a509298505050505050505050565b60408051600280825260608083018452926020830190803683370190505090503081600081518110612e4157fe5b6001600160a01b03928316602091820292909201810191909152602254604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612e9557600080fd5b505afa158015612ea9573d6000803e3d6000fd5b505050506040513d6020811015612ebf57600080fd5b5051815182906001908110612ed057fe5b6001600160a01b039283166020918202929092010152602254612ef6913091168461241b565b60225460405163791ac94760e01b8152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a487015287516001600160a01b039097169663791ac947968a968a9594939092909160c40190602080880191028083838b5b83811015612f7c578181015183820152602001612f64565b505050509050019650505050505050600060405180830381600087803b158015612fa557600080fd5b505af1158015612783573d6000803e3d6000fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612fef573d6000803e3d6000fd5b505050565b6000612ffe612822565b90506000806000806000806000613014896128e8565b96509650965096509650965096506000613037898461337f90919063ffffffff16565b6001600160a01b038d1660009081526005602052604090205490915061305d908b612943565b6001600160a01b038d1660009081526005602090815260408083209390935560049052205461308c9089612943565b6001600160a01b03808e1660009081526004602052604080822093909355908d16815220546130bb908861288e565b6001600160a01b038c166000908152600460205260409020556130dd826133d8565b6130e986828686613460565b8a6001600160a01b03168c6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a3505050505050505050505050565b600061314c612822565b90506000806000806000806000613162896128e8565b96509650965096509650965096506000613185898461337f90919063ffffffff16565b6001600160a01b038d166000908152600460205260409020549091506131ab9089612943565b6001600160a01b03808e16600090815260046020908152604080832094909455918e168152600590915220546131e1908661288e565b6001600160a01b038c166000908152600560209081526040808320939093556004905220546130bb908861288e565b600061321a612822565b90506000806000806000806000613230896128e8565b96509650965096509650965096506000613253898461337f90919063ffffffff16565b6001600160a01b038d1660009081526004602052604090205490915061308c9089612943565b6000613283612822565b90506000806000806000806000613299896128e8565b965096509650965096509650965060006132bc898461337f90919063ffffffff16565b6001600160a01b038d166000908152600560205260409020549091506132e2908b612943565b6001600160a01b038d166000908152600560209081526040808320939093556004905220546131ab9089612943565b601354601255601554601455601754601655565b6000610dd960646133416012548561337f90919063ffffffff16565b90612845565b6000610dd960646133416014548561337f90919063ffffffff16565b6000610dd960646133416016548561337f90919063ffffffff16565b60008261338e57506000610dd9565b8282028284828161339b57fe5b04146128875760405162461bcd60e51b81526004018080602001828103825260218152602001806135706021913960400191505060405180910390fd5b60006133e2612822565b905060006133f0838361337f565b3060009081526004602052604090205490915061340d908261288e565b3060009081526004602090815260408083209390935560089052205460ff1615612fef573060009081526005602052604090205461344b908461288e565b30600090815260056020526040902055505050565b61347983612d9b86600b5461294390919063ffffffff16565b600b55600c54613489908361288e565b600c55600d54613499908261288e565b600d55600a546134a99082612943565b600a555050505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573735472616e7366657220616d6f756e74206578636565647320746865206d61785478416d6f756e742e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6f636b45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220beb345d8e5922578d0277ad189e3e44901ccbea2a5df43284e6cb54f6a007dbf64736f6c634300060c0033