Contract Address Details

0x4DfCAA1180Ee51d74c9541840f61417dd87AE6b4

Token
YODE PRINTER (pYode)
Creator
0x193a86–ab499d at 0x200b02–39caba
Balance
0 Doge
Tokens
Fetching tokens...
Transactions
149 Transactions
Transfers
734 Transfers
Gas Used
12,947,726
Last Balance Update
29319842
Contract name:
YODEPRINTER




Optimization enabled
true
Compiler version
v0.8.9+commit.e5eed63a




Optimization runs
1
EVM Version
default




Verified at
2022-08-20T22:59:16.682687Z

Contract source code

// Website : https://www.yodeprinter.xyz/
// Twitter : https://twitter.com/yodeprinterdc 
// Telegram : https://t.me/yodeprinterdc

// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.7;

/**
 * SAFEMATH LIBRARY
 */
library SafeMath {
    
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

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

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

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

interface IBEP20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    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);
}

abstract contract Auth {
    address internal owner;
    mapping (address => bool) internal authorizations;

    constructor(address _owner) {
        owner = _owner;
        authorizations[_owner] = true;
    }

    /**
     * Function modifier to require caller to be contract owner
     */
    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER"); _;
    }

    /**
     * Function modifier to require caller to be authorized
     */
    modifier authorized() {
        require(isAuthorized(msg.sender), "!AUTHORIZED"); _;
    }

    /**
     * Authorize address. Owner only
     */
    function authorize(address adr) public onlyOwner {
        authorizations[adr] = true;
    }

    /**
     * Remove address' authorization. Owner only
     */
    function unauthorize(address adr) public onlyOwner {
        authorizations[adr] = false;
    }

    /**
     * Check if address is owner
     */
    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    /**
     * Return address' authorization status
     */
    function isAuthorized(address adr) public view returns (bool) {
        return authorizations[adr];
    }

    /**
     * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized
     */
    function transferOwnership(address payable adr) public onlyOwner {
        owner = adr;
        authorizations[adr] = true;
        emit OwnershipTransferred(adr);
    }

    event OwnershipTransferred(address owner);
}

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

interface IUniswapV2Router {
    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 amountWDOGEMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountWDOGE, uint liquidity);

    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 IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function deposit() external payable;
    function process(uint256 gas) external;
}

contract DividendDistributor is IDividendDistributor {
    using SafeMath for uint256;

    address _token;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;// excluded dividend
        uint256 totalRealised;
    }

    IBEP20 EP = IBEP20(0x6FC4563460d5f45932C473334d5c1C5B4aEA0E01); // YODE
    address WDOGE = 0xB7ddC6414bf4F5515b52D8BdD69973Ae205ff101;
    IUniswapV2Router router;

    address[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) shareholderClaims;

    mapping (address => Share) public shares;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    uint256 public minPeriod = 1 hours;
    uint256 public minDistribution = 10 * (10 ** 18);

    uint256 currentIndex;

    bool initialized;
    modifier initialization() {
        require(!initialized);
        _;
        initialized = true;
    }

    modifier onlyToken() {
        require(msg.sender == _token); _;
    }

    constructor (address _router) {
        router = _router != address(0)
        ? IUniswapV2Router(_router)
        : IUniswapV2Router(0x72d85Ab47fBfc5E7E04a8bcfCa1601D8f8cE1a50);
        _token = msg.sender;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
    }

    function setShare(address shareholder, uint256 amount) external override onlyToken {
        if(shares[shareholder].amount > 0){
            distributeDividend(shareholder);
        }

        if(amount > 0 && shares[shareholder].amount == 0){
            addShareholder(shareholder);
        }else if(amount == 0 && shares[shareholder].amount > 0){
            removeShareholder(shareholder);
        }

        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function deposit() external payable override onlyToken {
        uint256 balanceBefore = EP.balanceOf(address(this));

        address[] memory path = new address[](2);
        path[0] = WDOGE;
        path[1] = address(EP);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}(
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amount = EP.balanceOf(address(this)).sub(balanceBefore);

        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
    }

    function process(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

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

        uint256 iterations = 0;

        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount){
                currentIndex = 0;
            }

            if(shouldDistribute(shareholders[currentIndex])){
                distributeDividend(shareholders[currentIndex]);
            }

            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
    }

    function shouldDistribute(address shareholder) internal view returns (bool) {
        return shareholderClaims[shareholder] + minPeriod < block.timestamp
        && getUnpaidEarnings(shareholder) > minDistribution;
    }

    function distributeDividend(address shareholder) internal {
        if(shares[shareholder].amount == 0){ return; }

        uint256 amount = getUnpaidEarnings(shareholder);
        if(amount > 0){
            totalDistributed = totalDistributed.add(amount);
            EP.transfer(shareholder, amount);
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
        }
    }

    function claimDividend() external {
        distributeDividend(msg.sender);
    }
/*
returns the  unpaid earnings
*/
    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }
}

contract YODEPRINTER is IBEP20, Auth {
    using SafeMath for uint256;

    uint256 public constant MASK = type(uint128).max;
    address EP = 0x6FC4563460d5f45932C473334d5c1C5B4aEA0E01; // YODE
    address public WDOGE = 0xB7ddC6414bf4F5515b52D8BdD69973Ae205ff101;
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;
    address DEAD_NON_CHECKSUM = 0x000000000000000000000000000000000000dEaD;

    string constant _name = "YODE PRINTER";
    string constant _symbol = "pYode";
    uint8 constant _decimals = 6;

    uint256 _totalSupply = 1_000_000 * (10 ** _decimals);
    uint256 public _maxTxAmount = _totalSupply.div(50); // 2%
    uint256 public _maxWallet = _totalSupply.div(20); // 5%

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

    mapping (address => bool) isFeeExempt;
    mapping (address => bool) isTxLimitExempt;
    mapping (address => bool) isDividendExempt;
    mapping (address => bool) public _isFree;

    uint256 liquidityFee = 300;
    uint256 buybackFee = 0;
    uint256 reflectionFee = 800;
    uint256 marketingFee = 400;
    uint256 totalFee = 1500;
    uint256 feeDenominator = 10000;

    address public autoLiquidityReceiver=0x193A86aa99f60825a7b25169794DE43387AB499d; //liq address
    address public marketingFeeReceiver=0x193A86aa99f60825a7b25169794DE43387AB499d; // marketing address

    uint256 targetLiquidity = 10;
    uint256 targetLiquidityDenominator = 100;

    IUniswapV2Router public router;
    address public pair;

    uint256 public launchedAt;
    uint256 public launchedAtTimestamp;

    uint256 buybackMultiplierNumerator = 200;
    uint256 buybackMultiplierDenominator = 100;
    uint256 buybackMultiplierTriggeredAt;
    uint256 buybackMultiplierLength = 30 minutes;

    bool public autoBuybackEnabled = false;
    mapping (address => bool) buyBacker;
    uint256 autoBuybackCap;
    uint256 autoBuybackAccumulator;
    uint256 autoBuybackAmount;
    uint256 autoBuybackBlockPeriod;
    uint256 autoBuybackBlockLast;

    DividendDistributor distributor;
    address public distributorAddress;

    uint256 distributorGas = 500000;

    bool public swapEnabled = true;
    uint256 public swapThreshold = _totalSupply / 800; // = 0.25%; 800 = 2%
    bool inSwap;
    modifier swapping() { inSwap = true; _; inSwap = false; }

    constructor () Auth(msg.sender) {
        address _router = 0x72d85Ab47fBfc5E7E04a8bcfCa1601D8f8cE1a50;
        router = IUniswapV2Router(_router);
        pair = IUniswapV2Factory(router.factory()).createPair(WDOGE, address(this));
        _allowances[address(this)][address(router)] = _totalSupply;
        WDOGE = router.WETH();
        distributor = new DividendDistributor(_router);
        distributorAddress = address(distributor);

        isFeeExempt[msg.sender] = true;
        isTxLimitExempt[msg.sender] = true;
        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;
        buyBacker[msg.sender] = true;

        autoLiquidityReceiver = msg.sender;

        approve(_router, _totalSupply);
        approve(address(pair), _totalSupply);
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }
    

    receive() external payable { }

    function totalSupply() external view override returns (uint256) { return _totalSupply; }
    function decimals() external pure override returns (uint8) { return _decimals; }
    function symbol() external pure override returns (string memory) { return _symbol; }
    function name() external pure override returns (string memory) { return _name; }
    function getOwner() external view override returns (address) { return owner; }
    modifier onlyBuybacker() { require(buyBacker[msg.sender] == true, ""); _; }
    function balanceOf(address account) public view override returns (uint256) { return _balances[account]; }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function approveMax(address spender) external returns (bool) {
        return approve(spender, _totalSupply);
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if(_allowances[sender][msg.sender] != _totalSupply){
            _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");
        }

        return _transferFrom(sender, recipient, amount);
    }

    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        if(inSwap){ return _basicTransfer(sender, recipient, amount); }
         
        // Max  tx check
        address routerAddress = 0x72d85Ab47fBfc5E7E04a8bcfCa1601D8f8cE1a50;
        // bool isBuy=sender== pair|| sender == routerAddress;
        bool isSell=recipient== pair|| recipient == routerAddress;
        
        checkTxLimit(sender, amount);
        
        // Max wallet check excluding pair and router
        if (!isSell && !_isFree[recipient]){
            require((_balances[recipient] + amount) < _maxWallet, "Max wallet has been triggered");
        }
        
        // No swapping on buy and tx
        if (isSell) {
            if(shouldSwapBack()){ swapBack(); }
            if(shouldAutoBuyback()){ triggerAutoBuyback(); }
        }
        //        if(!launched() && recipient == pair){ require(_balances[sender] > 0); launch(); }

        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");

        uint256 amountReceived = shouldTakeFee(sender) ? takeFee(sender, recipient, amount) : amount;

        _balances[recipient] = _balances[recipient].add(amountReceived);

        if(!isDividendExempt[sender]){ try distributor.setShare(sender, _balances[sender]) {} catch {} }
        if(!isDividendExempt[recipient]){ try distributor.setShare(recipient, _balances[recipient]) {} catch {} }

        try distributor.process(distributorGas) {} catch {}

        emit Transfer(sender, recipient, amountReceived);
        return true;
    }

    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        _balances[recipient] = _balances[recipient].add(amount);
//        emit Transfer(sender, recipient, amount);
        return true;
    }



    function checkTxLimit(address sender, uint256 amount) internal view {
        require(amount <= _maxTxAmount || isTxLimitExempt[sender], "TX Limit Exceeded");
    }

    function shouldTakeFee(address sender) internal view returns (bool) {
        return !isFeeExempt[sender];
    }

    function getTotalFee(bool selling) public view returns (uint256) {
        if(launchedAt + 1 >= block.number){ return totalFee; }
        if(selling){ return totalFee; }
        return totalFee;
    }

    function getMultipliedFee() public view returns (uint256) {
        /**
         * if (launchedAtTimestamp + 1 days > block.timestamp) {
            return totalFee.mul(18000).div(feeDenominator);
        } else if (buybackMultiplierTriggeredAt.add(buybackMultiplierLength) > block.timestamp) {
            uint256 remainingTime = buybackMultiplierTriggeredAt.add(buybackMultiplierLength).sub(block.timestamp);
            uint256 feeIncrease = totalFee.mul(buybackMultiplierNumerator).div(buybackMultiplierDenominator).sub(totalFee);
            return totalFee.add(feeIncrease.mul(remainingTime).div(buybackMultiplierLength));
        }
        */
        return totalFee;
    }

    function takeFee(address sender, address receiver, uint256 amount) internal returns (uint256) {
        uint256 feeAmount = amount.mul(getTotalFee(receiver == pair)).div(feeDenominator);

        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);

        return amount.sub(feeAmount);
    }

    function shouldSwapBack() internal view returns (bool) {
        return msg.sender != pair
        && !inSwap
        && swapEnabled
        && _balances[address(this)] >= swapThreshold;
    }

    function swapBack() internal swapping {
        uint256 dynamicLiquidityFee = isOverLiquified(targetLiquidity, targetLiquidityDenominator) ? 0 : liquidityFee;
        uint256 amountToLiquify = swapThreshold.mul(dynamicLiquidityFee).div(totalFee).div(2);
        uint256 amountToSwap = swapThreshold.sub(amountToLiquify);

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WDOGE;
        uint256 balanceBefore = address(this).balance;

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountDOGE = address(this).balance.sub(balanceBefore);

        uint256 totalDOGEFee = totalFee.sub(dynamicLiquidityFee.div(2));

        uint256 amountDOGELiquidity = amountDOGE.mul(dynamicLiquidityFee).div(totalDOGEFee).div(2);
        uint256 amountDOGEReflection = amountDOGE.mul(reflectionFee).div(totalDOGEFee);
        uint256 amountDOGEMarketing = amountDOGE.mul(marketingFee).div(totalDOGEFee);

        try distributor.deposit{value: amountDOGEReflection}() {} catch {}
        payable(marketingFeeReceiver).transfer(amountDOGEMarketing);
            
        

        if(amountToLiquify > 0){
            router.addLiquidityETH{value: amountDOGELiquidity}(
                address(this),
                amountToLiquify,
                0,
                0,
                autoLiquidityReceiver,
                block.timestamp
            );
            emit AutoLiquify(amountDOGELiquidity, amountToLiquify);
        }
    }

    function shouldAutoBuyback() internal view returns (bool) {
        return msg.sender != pair
        && !inSwap
        && autoBuybackEnabled
        && autoBuybackBlockLast + autoBuybackBlockPeriod <= block.number // After N blocks from last buyback
        && address(this).balance >= autoBuybackAmount;
    }

    function clearBuybackMultiplier() external authorized {
        buybackMultiplierTriggeredAt = 0;
    }

    function triggerAutoBuyback() internal {
        buyTokens(autoBuybackAmount, DEAD);
        autoBuybackBlockLast = block.number;
        autoBuybackAccumulator = autoBuybackAccumulator.add(autoBuybackAmount);
        if(autoBuybackAccumulator > autoBuybackCap){ autoBuybackEnabled = false; }
    }

    function buyTokens(uint256 amount, address to) internal swapping {
        address[] memory path = new address[](2);
        path[0] = WDOGE;
        path[1] = address(this);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            to,
            block.timestamp
        );
    }
    
    function Sweep() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }


    function setAutoBuybackSettings(bool _enabled, uint256 _cap, uint256 _amount, uint256 _period) external authorized {
        autoBuybackEnabled = _enabled;
        autoBuybackCap = _cap;
        autoBuybackAccumulator = 0;
        autoBuybackAmount = _amount;
        autoBuybackBlockPeriod = _period;
        autoBuybackBlockLast = block.number;
    }

    function setBuybackMultiplierSettings(uint256 numerator, uint256 denominator, uint256 length) external authorized {
        require(numerator / denominator <= 2 && numerator > denominator);
        buybackMultiplierNumerator = numerator;
        buybackMultiplierDenominator = denominator;
        buybackMultiplierLength = length;
    }

    function launched() internal view returns (bool) {
        return launchedAt != 0;
    }

    function launch() public authorized {
        require(launchedAt == 0, "Already launched boi");
        launchedAt = block.number;
        launchedAtTimestamp = block.timestamp;
    }
    
    function setMaxWallet(uint256 amount) external authorized {
        require(amount >= _totalSupply / 1000);
        _maxWallet = amount;
    }

    function setTxLimit(uint256 amount) external authorized {
        require(amount >= _totalSupply / 1000);
        _maxTxAmount = amount;
    }

    function setIsDividendExempt(address holder, bool exempt) external authorized {
        require(holder != address(this) && holder != pair);
        isDividendExempt[holder] = exempt;
        if(exempt){
            distributor.setShare(holder, 0);
        }else{
            distributor.setShare(holder, _balances[holder]);
        }
    }

    function setIsFeeExempt(address holder, bool exempt) external authorized {
        isFeeExempt[holder] = exempt;
    }

    function setIsTxLimitExempt(address holder, bool exempt) external authorized {
        isTxLimitExempt[holder] = exempt;
    }
    
    function setFree(address holder) public onlyOwner {
        _isFree[holder] = true;
    }
    
    function unSetFree(address holder) public onlyOwner {
        _isFree[holder] = false;
    }
    
    function checkFree(address holder) public view onlyOwner returns(bool){
        return _isFree[holder];
    }

    function setFees(uint256 _liquidityFee, uint256 _buybackFee, uint256 _reflectionFee, uint256 _marketingFee, uint256 _feeDenominator) external authorized {
        liquidityFee = _liquidityFee;
        buybackFee = _buybackFee;
        reflectionFee = _reflectionFee;
        marketingFee = _marketingFee;
        totalFee = _liquidityFee.add(_buybackFee).add(_reflectionFee).add(_marketingFee);
        feeDenominator = _feeDenominator;
        require(totalFee < feeDenominator/4);
    }

    function setFeeReceivers(address _autoLiquidityReceiver, address _marketingFeeReceiver) external authorized {
        autoLiquidityReceiver = _autoLiquidityReceiver;
        marketingFeeReceiver = _marketingFeeReceiver;
    }

    function setSwapBackSettings(bool _enabled, uint256 _amount) external authorized {
        swapEnabled = _enabled;
        swapThreshold = _amount;
    }

    function setTargetLiquidity(uint256 _target, uint256 _denominator) external authorized {
        targetLiquidity = _target;
        targetLiquidityDenominator = _denominator;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external authorized {
        distributor.setDistributionCriteria(_minPeriod, _minDistribution);
    }

    function setDistributorSettings(uint256 gas) external authorized {
        require(gas < 750000);
        distributorGas = gas;
    }

    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO));
    }

    function getLiquidityBacking(uint256 accuracy) public view returns (uint256) {
        return accuracy.mul(balanceOf(pair).mul(2)).div(getCirculatingSupply());
    }

    function isOverLiquified(uint256 target, uint256 accuracy) public view returns (bool) {
        return getLiquidityBacking(accuracy) > target;
    }

    event AutoLiquify(uint256 amountDOGE, uint256 amountBOG);
    event BuybackMultiplierActive(uint256 duration);
}
        

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":"AutoLiquify","inputs":[{"type":"uint256","name":"amountDOGE","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountBOG","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"BuybackMultiplierActive","inputs":[{"type":"uint256","name":"duration","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"owner","internalType":"address","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":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MASK","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"Sweep","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"WDOGE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_isFree","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"holder","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":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approveMax","inputs":[{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"authorize","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"autoBuybackEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"autoLiquidityReceiver","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"checkFree","inputs":[{"type":"address","name":"holder","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"clearBuybackMultiplier","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"distributorAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCirculatingSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getLiquidityBacking","inputs":[{"type":"uint256","name":"accuracy","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMultipliedFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalFee","inputs":[{"type":"bool","name":"selling","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAuthorized","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOverLiquified","inputs":[{"type":"uint256","name":"target","internalType":"uint256"},{"type":"uint256","name":"accuracy","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOwner","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"launch","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"launchedAt","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"launchedAtTimestamp","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"marketingFeeReceiver","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAutoBuybackSettings","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"},{"type":"uint256","name":"_cap","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint256","name":"_period","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuybackMultiplierSettings","inputs":[{"type":"uint256","name":"numerator","internalType":"uint256"},{"type":"uint256","name":"denominator","internalType":"uint256"},{"type":"uint256","name":"length","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionCriteria","inputs":[{"type":"uint256","name":"_minPeriod","internalType":"uint256"},{"type":"uint256","name":"_minDistribution","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributorSettings","inputs":[{"type":"uint256","name":"gas","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeReceivers","inputs":[{"type":"address","name":"_autoLiquidityReceiver","internalType":"address"},{"type":"address","name":"_marketingFeeReceiver","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"uint256","name":"_liquidityFee","internalType":"uint256"},{"type":"uint256","name":"_buybackFee","internalType":"uint256"},{"type":"uint256","name":"_reflectionFee","internalType":"uint256"},{"type":"uint256","name":"_marketingFee","internalType":"uint256"},{"type":"uint256","name":"_feeDenominator","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFree","inputs":[{"type":"address","name":"holder","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsDividendExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsFeeExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsTxLimitExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxWallet","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapBackSettings","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTargetLiquidity","inputs":[{"type":"uint256","name":"_target","internalType":"uint256"},{"type":"uint256","name":"_denominator","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTxLimit","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapThreshold","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","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":"adr","internalType":"address payable"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unSetFree","inputs":[{"type":"address","name":"holder","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unauthorize","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
            

Contract Creation Code

0x6080604052600280546001600160a01b0319908116736fc4563460d5f45932c473334d5c1c5b4aea0e011790915560038054821673b7ddc6414bf4f5515b52d8bdd69973ae205ff10117905560048054821661dead9081179091556005805483169055600680549092161781556200007990600a620006b3565b6200008890620f4240620006c4565b600755620000a860326007546200050e60201b620013a11790919060201c565b600855620000c860146007546200050e60201b620013a11790919060201c565b60095561012c601055600060115561032060128190556101906013556105dc6014556127106015556016805473193a86aa99f60825a7b25169794de43387ab499d6001600160a01b03199182168117909255601780549091169091179055600a6018556064601981905560c8601e55601f556107086021556022805460ff199081169091556207a120602b55602c805490911660011790556007546200016f9190620006e6565b602d553480156200017f57600080fd5b5060008054336001600160a01b031991821681178355825260016020818152604093849020805460ff1916909217909155601a80547372d85ab47fbfc5e7e04a8bcfca1601d8f8ce1a50931683179055825163c45a015560e01b815292519192839263c45a015592600480840193919291829003018186803b1580156200020557600080fd5b505afa1580156200021a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000240919062000709565b6003546040516364e329cb60e11b81526001600160a01b03918216600482015230602482015291169063c9c6539690604401602060405180830381600087803b1580156200028d57600080fd5b505af1158015620002a2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c8919062000709565b601b80546001600160a01b0319166001600160a01b03928316179055600754306000908152600b60209081526040808320601a8054871685529083529281902093909355905482516315ab88c960e31b8152925193169263ad5c4648926004808201939291829003018186803b1580156200034257600080fd5b505afa15801562000357573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037d919062000709565b600380546001600160a01b0319166001600160a01b03929092169190911790556040518190620003ad9062000592565b6001600160a01b039091168152602001604051809103906000f080158015620003da573d6000803e3d6000fd5b50602980546001600160a01b039283166001600160a01b03199182168117909255602a80548216909217909155336000818152600c60209081526040808320805460ff199081166001908117909255600d84528285208054821683179055601b5488168552600e8452828520805482168317905530855282852080548216831790556004549097168452818420805488168217905584845260239092529091208054909416179092556016805490911690911790556007546200049f90829062000525565b50601b54600754620004bb916001600160a01b03169062000525565b50600754336000818152600a6020908152604080832085905551938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3506200073b565b60006200051c8284620006e6565b90505b92915050565b336000818152600b602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590620005819086815260200190565b60405180910390a350600192915050565b610e468062002b0e83390190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005f7578160001904821115620005db57620005db620005a0565b80851615620005e957918102915b93841c9390800290620005bb565b509250929050565b60008262000610575060016200051f565b816200061f575060006200051f565b8160018114620006385760028114620006435762000663565b60019150506200051f565b60ff841115620006575762000657620005a0565b50506001821b6200051f565b5060208310610133831016604e8410600b841016171562000688575081810a6200051f565b620006948383620005b6565b8060001904821115620006ab57620006ab620005a0565b029392505050565b60006200051c60ff841683620005ff565b6000816000190483118215151615620006e157620006e1620005a0565b500290565b6000826200070457634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200071c57600080fd5b81516001600160a01b03811681146200073457600080fd5b9392505050565b6123c3806200074b6000396000f3fe6080604052600436106102745760003560e01c806301339c21146102805780630445b66714610297578063048c7baf146102c057806304a66b48146102e057806306fdde031461030057806307c89fe81461033e5780630949a9261461036e578063095ea7b31461039b5780631161ae39146103bb57806318160ddd146103db578063201e7991146103f05780632375ce401461041057806323b872dd14610430578063296020e7146104505780632b112e49146104805780632d48e896146104955780632f54bf6e146104b5578063313ce567146104d55780633425c001146104f15780633bb8a8d414610511578063571ac8b01461052b5780635c85974f1461054b5780635d0044ca1461056b578063658d4b7f1461058b5780636ddd1713146105ab5780637088fb7f146105c557806370a08231146105da5780637d1db4a5146105fa57806382247ec014610610578063893d20e81461062657806389ef69f61461064457806395d89b41146106645780639d1944f514610692578063a4b45c00146106b2578063a51af4c5146106d2578063a8aa1b31146106f2578063a9059cbb14610712578063b210b06d14610732578063b6a5d7de14610747578063bf56b37114610767578063c6d2577d1461077d578063ca33e64c14610793578063d51ed1c8146107b3578063d806d12f146107d3578063dd62ed3e146107e8578063df20fd491461082e578063e91f214e1461084e578063e96fada214610869578063f0b37c0414610889578063f1f3bca3146108a9578063f2fde38b146108c9578063f708a64f146108e9578063f84ba65d14610909578063f887ea4014610929578063fe9fbb801461094957600080fd5b3661027b57005b600080fd5b34801561028c57600080fd5b50610295610969565b005b3480156102a357600080fd5b506102ad602d5481565b6040519081526020015b60405180910390f35b3480156102cc57600080fd5b506102956102db366004611f05565b6109e8565b3480156102ec57600080fd5b506102956102fb366004611f3e565b610a36565b34801561030c57600080fd5b5060408051808201909152600c81526b2ca7a22290282924a72a22a960a11b60208201525b6040516102b79190611f79565b34801561034a57600080fd5b5061035e610359366004611fe6565b610aac565b60405190151581526020016102b7565b34801561037a57600080fd5b5060035461038e906001600160a01b031681565b6040516102b79190612003565b3480156103a757600080fd5b5061035e6103b6366004612017565b610af6565b3480156103c757600080fd5b5061035e6103d6366004612043565b610b62565b3480156103e757600080fd5b506007546102ad565b3480156103fc57600080fd5b5061029561040b366004612043565b610b76565b34801561041c57600080fd5b5061029561042b366004612065565b610ba6565b34801561043c57600080fd5b5061035e61044b366004612091565b610bfb565b34801561045c57600080fd5b5061035e61046b366004611fe6565b600f6020526000908152604090205460ff1681565b34801561048c57600080fd5b506102ad610cbf565b3480156104a157600080fd5b506102956104b0366004612043565b610d08565b3480156104c157600080fd5b5061035e6104d0366004611fe6565b610d97565b3480156104e157600080fd5b50604051600681526020016102b7565b3480156104fd57600080fd5b5061029561050c366004611fe6565b610dab565b34801561051d57600080fd5b5060225461035e9060ff1681565b34801561053757600080fd5b5061035e610546366004611fe6565b610df1565b34801561055757600080fd5b506102956105663660046120d2565b610e05565b34801561057757600080fd5b506102956105863660046120d2565b610e4b565b34801561059757600080fd5b506102956105a63660046120eb565b610e91565b3480156105b757600080fd5b50602c5461035e9060ff1681565b3480156105d157600080fd5b50610295610ee1565b3480156105e657600080fd5b506102ad6105f5366004611fe6565b610f39565b34801561060657600080fd5b506102ad60085481565b34801561061c57600080fd5b506102ad60095481565b34801561063257600080fd5b506000546001600160a01b031661038e565b34801561065057600080fd5b5061029561065f366004611fe6565b610f54565b34801561067057600080fd5b5060408051808201909152600581526470596f646560d81b6020820152610331565b34801561069e57600080fd5b506102956106ad3660046120d2565b610f9d565b3480156106be57600080fd5b506102956106cd366004612120565b610fd6565b3480156106de57600080fd5b50602a5461038e906001600160a01b031681565b3480156106fe57600080fd5b50601b5461038e906001600160a01b031681565b34801561071e57600080fd5b5061035e61072d366004612017565b611029565b34801561073e57600080fd5b50610295611036565b34801561075357600080fd5b50610295610762366004611fe6565b611062565b34801561077357600080fd5b506102ad601c5481565b34801561078957600080fd5b506102ad601d5481565b34801561079f57600080fd5b5060165461038e906001600160a01b031681565b3480156107bf57600080fd5b506102ad6107ce3660046120d2565b6110ae565b3480156107df57600080fd5b506014546102ad565b3480156107f457600080fd5b506102ad610803366004612120565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b34801561083a57600080fd5b50610295610849366004612159565b6110ee565b34801561085a57600080fd5b506102ad6001600160801b0381565b34801561087557600080fd5b5060175461038e906001600160a01b031681565b34801561089557600080fd5b506102956108a4366004611fe6565b61112a565b3480156108b557600080fd5b506102ad6108c4366004612175565b611170565b3480156108d557600080fd5b506102956108e4366004611fe6565b6111a5565b3480156108f557600080fd5b506102956109043660046120eb565b61123a565b34801561091557600080fd5b506102956109243660046120eb565b611333565b34801561093557600080fd5b50601a5461038e906001600160a01b031681565b34801561095557600080fd5b5061035e610964366004611fe6565b611383565b61097233611383565b6109975760405162461bcd60e51b815260040161098e90612190565b60405180910390fd5b601c54156109de5760405162461bcd60e51b8152602060048201526014602482015273416c7265616479206c61756e6368656420626f6960601b604482015260640161098e565b43601c5542601d55565b6109f133611383565b610a0d5760405162461bcd60e51b815260040161098e90612190565b6022805460ff191694151594909417909355602491909155600060255560265560275543602855565b610a3f33611383565b610a5b5760405162461bcd60e51b815260040161098e90612190565b6010859055601184905560128390556013829055610a8582610a7f858189896113ad565b906113ad565b6014556015819055610a986004826121cb565b60145410610aa557600080fd5b5050505050565b6000610ab733610d97565b610ad35760405162461bcd60e51b815260040161098e906121ed565b506001600160a01b0381166000908152600f602052604090205460ff165b919050565b336000818152600b602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610b519086815260200190565b60405180910390a350600192915050565b600082610b6e836110ae565b119392505050565b610b7f33611383565b610b9b5760405162461bcd60e51b815260040161098e90612190565b601891909155601955565b610baf33611383565b610bcb5760405162461bcd60e51b815260040161098e90612190565b6002610bd783856121cb565b11158015610be457508183115b610bed57600080fd5b601e92909255601f55602155565b6007546001600160a01b0384166000908152600b60209081526040808320338452909152812054909114610caa576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600b82528381203382529091529190912054610c859184906113b9565b6001600160a01b0385166000908152600b602090815260408083203384529091529020555b610cb58484846113e5565b90505b9392505050565b600554600090610d0390610cdb906001600160a01b0316610f39565b600454610cfd90610cf4906001600160a01b0316610f39565b600754906117c0565b906117c0565b905090565b610d1133611383565b610d2d5760405162461bcd60e51b815260040161098e90612190565b6029546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015b600060405180830381600087803b158015610d7b57600080fd5b505af1158015610d8f573d6000803e3d6000fd5b505050505050565b6000546001600160a01b0391821691161490565b610db433610d97565b610dd05760405162461bcd60e51b815260040161098e906121ed565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610dff82600754610af6565b92915050565b610e0e33611383565b610e2a5760405162461bcd60e51b815260040161098e90612190565b6103e8600754610e3a91906121cb565b811015610e4657600080fd5b600855565b610e5433611383565b610e705760405162461bcd60e51b815260040161098e90612190565b6103e8600754610e8091906121cb565b811015610e8c57600080fd5b600955565b610e9a33611383565b610eb65760405162461bcd60e51b815260040161098e90612190565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b610eea33610d97565b610f065760405162461bcd60e51b815260040161098e906121ed565b6040514790339082156108fc029083906000818181858888f19350505050158015610f35573d6000803e3d6000fd5b5050565b6001600160a01b03166000908152600a602052604090205490565b610f5d33610d97565b610f795760405162461bcd60e51b815260040161098e906121ed565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b610fa633611383565b610fc25760405162461bcd60e51b815260040161098e90612190565b620b71b08110610fd157600080fd5b602b55565b610fdf33611383565b610ffb5760405162461bcd60e51b815260040161098e90612190565b601680546001600160a01b039384166001600160a01b03199182161790915560178054929093169116179055565b6000610cb83384846113e5565b61103f33611383565b61105b5760405162461bcd60e51b815260040161098e90612190565b6000602055565b61106b33610d97565b6110875760405162461bcd60e51b815260040161098e906121ed565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b6000610dff6110bb610cbf565b601b546110e8906110e1906002906110db906001600160a01b0316610f39565b906117cc565b85906117cc565b906113a1565b6110f733611383565b6111135760405162461bcd60e51b815260040161098e90612190565b602c805460ff191692151592909217909155602d55565b61113333610d97565b61114f5760405162461bcd60e51b815260040161098e906121ed565b6001600160a01b03166000908152600160205260409020805460ff19169055565b600043601c546001611182919061220d565b1061118f57505060145490565b811561119d57505060145490565b505060145490565b6111ae33610d97565b6111ca5760405162461bcd60e51b815260040161098e906121ed565b600080546001600160a01b0319166001600160a01b0383169081178255815260016020819052604091829020805460ff19169091179055517f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639061122f908390612003565b60405180910390a150565b61124333611383565b61125f5760405162461bcd60e51b815260040161098e90612190565b6001600160a01b03821630148015906112865750601b546001600160a01b03838116911614155b61128f57600080fd5b6001600160a01b0382166000908152600e60205260409020805460ff191682158015919091179091556112ef57602954604051630a5b654b60e11b81526001600160a01b03909116906314b6ca9690610d61908590600090600401612225565b6029546001600160a01b038381166000908152600a602052604090819020549051630a5b654b60e11b815291909216916314b6ca9691610d61918691600401612225565b61133c33611383565b6113585760405162461bcd60e51b815260040161098e90612190565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b6001600160a01b031660009081526001602052604090205460ff1690565b6000610cb882846121cb565b6000610cb8828461220d565b600081848411156113dd5760405162461bcd60e51b815260040161098e9190611f79565b505050900390565b602e5460009060ff1615611405576113fe8484846117d8565b9050610cb8565b601b547372d85ab47fbfc5e7e04a8bcfca1601d8f8ce1a50906000906001600160a01b038681169116148061144b5750816001600160a01b0316856001600160a01b0316145b9050611457868561187b565b8015801561147e57506001600160a01b0385166000908152600f602052604090205460ff16155b156114f7576009546001600160a01b0386166000908152600a60205260409020546114aa90869061220d565b106114f75760405162461bcd60e51b815260206004820152601d60248201527f4d61782077616c6c657420686173206265656e20747269676765726564000000604482015260640161098e565b8015611527576115056118e4565b1561151257611512611933565b61151a611ca1565b1561152757611527611cfc565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0389166000908152600a90915291909120546115799186906113b9565b6001600160a01b0387166000908152600a6020908152604080832093909355600c90529081205460ff16156115ae57846115b9565b6115b9878787611d43565b6001600160a01b0387166000908152600a60205260409020549091506115df90826113ad565b6001600160a01b038088166000908152600a6020908152604080832094909455918a168152600e909152205460ff16611683576029546001600160a01b038881166000908152600a602052604090819020549051630a5b654b60e11b815291909216916314b6ca9691611656918b91600401612225565b600060405180830381600087803b15801561167057600080fd5b505af1925050508015611681575060015b505b6001600160a01b0386166000908152600e602052604090205460ff16611714576029546001600160a01b038781166000908152600a602052604090819020549051630a5b654b60e11b815291909216916314b6ca96916116e7918a91600401612225565b600060405180830381600087803b15801561170157600080fd5b505af1925050508015611712575060015b505b602954602b546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c4799161174c9160040190815260200190565b600060405180830381600087803b15801561176657600080fd5b505af1925050508015611777575060015b50856001600160a01b0316876001600160a01b031660008051602061236e833981519152836040516117ab91815260200190565b60405180910390a35060019695505050505050565b6000610cb8828461223e565b6000610cb88284612255565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600a909152918220546118299184906113b9565b6001600160a01b038086166000908152600a6020526040808220939093559085168152205461185890836113ad565b6001600160a01b0384166000908152600a60205260409020555060019392505050565b600854811115806118a457506001600160a01b0382166000908152600d602052604090205460ff165b610f355760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b604482015260640161098e565b601b546000906001600160a01b031633148015906119055750602e5460ff16155b80156119135750602c5460ff165b8015610d03575050602d54306000908152600a6020526040902054101590565b602e805460ff1916600117905560185460195460009161195291610b62565b61195e57601054611961565b60005b9050600061198560026110e86014546110e886602d546117cc90919063ffffffff16565b9050600061199e82602d546117c090919063ffffffff16565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106119d8576119d8612274565b6001600160a01b039283166020918202929092010152600354825191169082906001908110611a0957611a09612274565b6001600160a01b039283166020918202929092010152601a5460405163791ac94760e01b81524792919091169063791ac94790611a539086906000908790309042906004016122ce565b600060405180830381600087803b158015611a6d57600080fd5b505af1158015611a81573d6000803e3d6000fd5b505050506000611a9a82476117c090919063ffffffff16565b90506000611ab5611aac8860026113a1565b601454906117c0565b90506000611aca60026110e88481878d6117cc565b90506000611ae7836110e8601254876117cc90919063ffffffff16565b90506000611b04846110e8601354886117cc90919063ffffffff16565b9050602960009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b5657600080fd5b505af193505050508015611b68575060015b506017546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611ba3573d6000803e3d6000fd5b508815611c8b57601a5460165460405163f305d71960e01b8152306004820152602481018c905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990859060c4016060604051808303818588803b158015611c1557600080fd5b505af1158015611c29573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611c4e919061230a565b505060408051858152602081018c90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b5050602e805460ff191690555050505050505050565b601b546000906001600160a01b03163314801590611cc25750602e5460ff16155b8015611cd0575060225460ff165b8015611ceb575043602754602854611ce8919061220d565b11155b8015610d0357505060265447101590565b602654600454611d1591906001600160a01b0316611dec565b43602855602654602554611d28916113ad565b60258190556024541015611d41576022805460ff191690555b565b601554601b546000918291611d7591906110e890611d6e906001600160a01b03898116911614611170565b86906117cc565b306000908152600a6020526040902054909150611d9290826113ad565b306000818152600a6020526040908190209290925590516001600160a01b0387169060008051602061236e83398151915290611dd19085815260200190565b60405180910390a3611de383826117c0565b95945050505050565b602e805460ff19166001179055604080516002808252606082018352600092602083019080368337505060035482519293506001600160a01b031691839150600090611e3a57611e3a612274565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611e6e57611e6e612274565b6001600160a01b039283166020918202929092010152601a5460405163b6f9de9560e01b815291169063b6f9de95908590611eb490600090869088904290600401612338565b6000604051808303818588803b158015611ecd57600080fd5b505af1158015611ee1573d6000803e3d6000fd5b5050602e805460ff19169055505050505050565b80358015158114610af157600080fd5b60008060008060808587031215611f1b57600080fd5b611f2485611ef5565b966020860135965060408601359560600135945092505050565b600080600080600060a08688031215611f5657600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600060208083528351808285015260005b81811015611fa657858101830151858201604001528201611f8a565b81811115611fb8576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611fe357600080fd5b50565b600060208284031215611ff857600080fd5b8135610cb881611fce565b6001600160a01b0391909116815260200190565b6000806040838503121561202a57600080fd5b823561203581611fce565b946020939093013593505050565b6000806040838503121561205657600080fd5b50508035926020909101359150565b60008060006060848603121561207a57600080fd5b505081359360208301359350604090920135919050565b6000806000606084860312156120a657600080fd5b83356120b181611fce565b925060208401356120c181611fce565b929592945050506040919091013590565b6000602082840312156120e457600080fd5b5035919050565b600080604083850312156120fe57600080fd5b823561210981611fce565b915061211760208401611ef5565b90509250929050565b6000806040838503121561213357600080fd5b823561213e81611fce565b9150602083013561214e81611fce565b809150509250929050565b6000806040838503121561216c57600080fd5b61203583611ef5565b60006020828403121561218757600080fd5b610cb882611ef5565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000826121e857634e487b7160e01b600052601260045260246000fd5b500490565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60008219821115612220576122206121b5565b500190565b6001600160a01b03929092168252602082015260400190565b600082821015612250576122506121b5565b500390565b600081600019048311821515161561226f5761226f6121b5565b500290565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156122c35781516001600160a01b03168752958201959082019060010161229e565b509495945050505050565b85815284602082015260a0604082015260006122ed60a083018661228a565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561231f57600080fd5b8351925060208401519150604084015190509250925092565b848152608060208201526000612351608083018661228a565b6001600160a01b0394909416604083015250606001529291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212208118026252d80afacd97e1c78741c4c027d2d54e3d97fb7f57a3d62f7627c78d64736f6c634300080900336080604052600180546001600160a01b0319908116736fc4563460d5f45932c473334d5c1c5b4aea0e01179091556002805490911673b7ddc6414bf4f5515b52d8bdd69973ae205ff1011790556ec097ce7bc90715b34b9f1000000000600c55610e10600d55678ac7230489e80000600e5534801561007d57600080fd5b50604051610e46380380610e4683398101604081905261009c916100f6565b6001600160a01b0381166100c4577372d85ab47fbfc5e7e04a8bcfca1601d8f8ce1a506100c6565b805b600380546001600160a01b03929092166001600160a01b0319928316179055600080549091163317905550610126565b60006020828403121561010857600080fd5b81516001600160a01b038116811461011f57600080fd5b9392505050565b610d11806101356000396000f3fe6080604052600436106100ad5760003560e01c806311ce023d146100b257806314b6ca96146100db57806328fd3198146100fd5780632d48e8961461011d5780633a98ef391461013d5780634fab0ae814610153578063997664d714610169578063ce7c2ac21461017f578063d0e30db0146101d6578063e2d2e219146101de578063efca2eed146101f4578063f0fc6bca1461020a578063ffb2c4791461021f578063ffd49c841461023f575b600080fd5b3480156100be57600080fd5b506100c8600c5481565b6040519081526020015b60405180910390f35b3480156100e757600080fd5b506100fb6100f6366004610ad5565b610255565b005b34801561010957600080fd5b506100c8610118366004610aff565b6103cd565b34801561012957600080fd5b506100fb610138366004610b1a565b610456565b34801561014957600080fd5b506100c860085481565b34801561015f57600080fd5b506100c8600e5481565b34801561017557600080fd5b506100c860095481565b34801561018b57600080fd5b506101bb61019a366004610aff565b60076020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016100d2565b6100fb610478565b3480156101ea57600080fd5b506100c8600b5481565b34801561020057600080fd5b506100c8600a5481565b34801561021657600080fd5b506100fb6106cf565b34801561022b57600080fd5b506100fb61023a366004610b3c565b6106da565b34801561024b57600080fd5b506100c8600d5481565b6000546001600160a01b0316331461026c57600080fd5b6001600160a01b0382166000908152600760205260409020541561029357610293826107da565b6000811180156102b957506001600160a01b038216600090815260076020526040902054155b1561031f57600480546001600160a01b0384166000818152600560205260408120839055600183018455929092527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319169091179055610352565b8015801561034457506001600160a01b03821660009081526007602052604090205415155b156103525761035282610905565b6001600160a01b03821660009081526007602052604090205460085461038391839161037d91610a1a565b90610a2d565b6008556001600160a01b03821660009081526007602052604090208190556103aa81610a39565b6001600160a01b0390921660009081526007602052604090206001019190915550565b6001600160a01b0381166000908152600760205260408120546103f257506000919050565b6001600160a01b03821660009081526007602052604081205461041490610a39565b6001600160a01b038416600090815260076020526040902060010154909150808211610444575060009392505050565b61044e8282610a1a565b949350505050565b6000546001600160a01b0316331461046d57600080fd5b600d91909155600e55565b6000546001600160a01b0316331461048f57600080fd5b6001546040516370a0823160e01b81526000916001600160a01b0316906370a08231906104c0903090600401610b55565b60206040518083038186803b1580156104d857600080fd5b505afa1580156104ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105109190610b69565b6040805160028082526060820183529293506000929091602083019080368337505060025482519293506001600160a01b03169183915060009061055657610556610b82565b6001600160a01b039283166020918202929092010152600180548351921691839190811061058657610586610b82565b6001600160a01b03928316602091820292909201015260035460405163b6f9de9560e01b815291169063b6f9de959034906105cc90600090869030904290600401610b98565b6000604051808303818588803b1580156105e557600080fd5b505af11580156105f9573d6000803e3d6000fd5b50506001546040516370a0823160e01b81526000945061068d93508692506001600160a01b03909116906370a0823190610637903090600401610b55565b60206040518083038186803b15801561064f57600080fd5b505afa158015610663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106879190610b69565b90610a1a565b60095490915061069d9082610a2d565b600955600854600c546106c7916106be916106b89085610a5c565b90610a68565b600b5490610a2d565b600b55505050565b6106d8336107da565b565b6000546001600160a01b031633146106f157600080fd5b600454806106fd575050565b6000805a905060005b848310801561071457508381105b156107d35783600f5410610728576000600f555b61075a6004600f548154811061074057610740610b82565b6000918252602090912001546001600160a01b0316610a74565b15610791576107916004600f548154811061077757610777610b82565b6000918252602090912001546001600160a01b03166107da565b6107a661079f5a8490610a1a565b8490610a2d565b92505a600f805491935060006107bb83610c18565b919050555080806107cb90610c18565b915050610706565b5050505050565b6001600160a01b0381166000908152600760205260409020546107fa5750565b6000610805826103cd565b9050801561090157600a5461081a9082610a2d565b600a5560015460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b15801561086b57600080fd5b505af115801561087f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a39190610c33565b506001600160a01b038216600090815260066020908152604080832042905560079091529020600201546108d79082610a2d565b6001600160a01b03831660009081526007602052604090206002810191909155546103aa90610a39565b5050565b6004805461091590600190610c55565b8154811061092557610925610b82565b60009182526020808320909101546001600160a01b038481168452600590925260409092205460048054929093169291811061096357610963610b82565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600591829052604081205460048054919392916109af90600190610c55565b815481106109bf576109bf610b82565b60009182526020808320909101546001600160a01b0316835282019290925260400190205560048054806109f5576109f5610c6c565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000610a268284610c55565b9392505050565b6000610a268284610c82565b6000610a56600c546106b8600b5485610a5c90919063ffffffff16565b92915050565b6000610a268284610c9a565b6000610a268284610cb9565b600d546001600160a01b03821660009081526006602052604081205490914291610a9e9190610c82565b108015610a565750600e54610ab2836103cd565b1192915050565b80356001600160a01b0381168114610ad057600080fd5b919050565b60008060408385031215610ae857600080fd5b610af183610ab9565b946020939093013593505050565b600060208284031215610b1157600080fd5b610a2682610ab9565b60008060408385031215610b2d57600080fd5b50508035926020909101359150565b600060208284031215610b4e57600080fd5b5035919050565b6001600160a01b0391909116815260200190565b600060208284031215610b7b57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015610be25784516001600160a01b031683529383019391830191600101610bbd565b50506001600160a01b039690961660408501525050506060015292915050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415610c2c57610c2c610c02565b5060010190565b600060208284031215610c4557600080fd5b81518015158114610a2657600080fd5b600082821015610c6757610c67610c02565b500390565b634e487b7160e01b600052603160045260246000fd5b60008219821115610c9557610c95610c02565b500190565b6000816000190483118215151615610cb457610cb4610c02565b500290565b600082610cd657634e487b7160e01b600052601260045260246000fd5b50049056fea264697066735822122065c6b19da68718ef2358a9cfcd82a11415b8cc3ada7a8a7a807b8c81ee3cca3664736f6c63430008090033

Deployed ByteCode

0x6080604052600436106102745760003560e01c806301339c21146102805780630445b66714610297578063048c7baf146102c057806304a66b48146102e057806306fdde031461030057806307c89fe81461033e5780630949a9261461036e578063095ea7b31461039b5780631161ae39146103bb57806318160ddd146103db578063201e7991146103f05780632375ce401461041057806323b872dd14610430578063296020e7146104505780632b112e49146104805780632d48e896146104955780632f54bf6e146104b5578063313ce567146104d55780633425c001146104f15780633bb8a8d414610511578063571ac8b01461052b5780635c85974f1461054b5780635d0044ca1461056b578063658d4b7f1461058b5780636ddd1713146105ab5780637088fb7f146105c557806370a08231146105da5780637d1db4a5146105fa57806382247ec014610610578063893d20e81461062657806389ef69f61461064457806395d89b41146106645780639d1944f514610692578063a4b45c00146106b2578063a51af4c5146106d2578063a8aa1b31146106f2578063a9059cbb14610712578063b210b06d14610732578063b6a5d7de14610747578063bf56b37114610767578063c6d2577d1461077d578063ca33e64c14610793578063d51ed1c8146107b3578063d806d12f146107d3578063dd62ed3e146107e8578063df20fd491461082e578063e91f214e1461084e578063e96fada214610869578063f0b37c0414610889578063f1f3bca3146108a9578063f2fde38b146108c9578063f708a64f146108e9578063f84ba65d14610909578063f887ea4014610929578063fe9fbb801461094957600080fd5b3661027b57005b600080fd5b34801561028c57600080fd5b50610295610969565b005b3480156102a357600080fd5b506102ad602d5481565b6040519081526020015b60405180910390f35b3480156102cc57600080fd5b506102956102db366004611f05565b6109e8565b3480156102ec57600080fd5b506102956102fb366004611f3e565b610a36565b34801561030c57600080fd5b5060408051808201909152600c81526b2ca7a22290282924a72a22a960a11b60208201525b6040516102b79190611f79565b34801561034a57600080fd5b5061035e610359366004611fe6565b610aac565b60405190151581526020016102b7565b34801561037a57600080fd5b5060035461038e906001600160a01b031681565b6040516102b79190612003565b3480156103a757600080fd5b5061035e6103b6366004612017565b610af6565b3480156103c757600080fd5b5061035e6103d6366004612043565b610b62565b3480156103e757600080fd5b506007546102ad565b3480156103fc57600080fd5b5061029561040b366004612043565b610b76565b34801561041c57600080fd5b5061029561042b366004612065565b610ba6565b34801561043c57600080fd5b5061035e61044b366004612091565b610bfb565b34801561045c57600080fd5b5061035e61046b366004611fe6565b600f6020526000908152604090205460ff1681565b34801561048c57600080fd5b506102ad610cbf565b3480156104a157600080fd5b506102956104b0366004612043565b610d08565b3480156104c157600080fd5b5061035e6104d0366004611fe6565b610d97565b3480156104e157600080fd5b50604051600681526020016102b7565b3480156104fd57600080fd5b5061029561050c366004611fe6565b610dab565b34801561051d57600080fd5b5060225461035e9060ff1681565b34801561053757600080fd5b5061035e610546366004611fe6565b610df1565b34801561055757600080fd5b506102956105663660046120d2565b610e05565b34801561057757600080fd5b506102956105863660046120d2565b610e4b565b34801561059757600080fd5b506102956105a63660046120eb565b610e91565b3480156105b757600080fd5b50602c5461035e9060ff1681565b3480156105d157600080fd5b50610295610ee1565b3480156105e657600080fd5b506102ad6105f5366004611fe6565b610f39565b34801561060657600080fd5b506102ad60085481565b34801561061c57600080fd5b506102ad60095481565b34801561063257600080fd5b506000546001600160a01b031661038e565b34801561065057600080fd5b5061029561065f366004611fe6565b610f54565b34801561067057600080fd5b5060408051808201909152600581526470596f646560d81b6020820152610331565b34801561069e57600080fd5b506102956106ad3660046120d2565b610f9d565b3480156106be57600080fd5b506102956106cd366004612120565b610fd6565b3480156106de57600080fd5b50602a5461038e906001600160a01b031681565b3480156106fe57600080fd5b50601b5461038e906001600160a01b031681565b34801561071e57600080fd5b5061035e61072d366004612017565b611029565b34801561073e57600080fd5b50610295611036565b34801561075357600080fd5b50610295610762366004611fe6565b611062565b34801561077357600080fd5b506102ad601c5481565b34801561078957600080fd5b506102ad601d5481565b34801561079f57600080fd5b5060165461038e906001600160a01b031681565b3480156107bf57600080fd5b506102ad6107ce3660046120d2565b6110ae565b3480156107df57600080fd5b506014546102ad565b3480156107f457600080fd5b506102ad610803366004612120565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b34801561083a57600080fd5b50610295610849366004612159565b6110ee565b34801561085a57600080fd5b506102ad6001600160801b0381565b34801561087557600080fd5b5060175461038e906001600160a01b031681565b34801561089557600080fd5b506102956108a4366004611fe6565b61112a565b3480156108b557600080fd5b506102ad6108c4366004612175565b611170565b3480156108d557600080fd5b506102956108e4366004611fe6565b6111a5565b3480156108f557600080fd5b506102956109043660046120eb565b61123a565b34801561091557600080fd5b506102956109243660046120eb565b611333565b34801561093557600080fd5b50601a5461038e906001600160a01b031681565b34801561095557600080fd5b5061035e610964366004611fe6565b611383565b61097233611383565b6109975760405162461bcd60e51b815260040161098e90612190565b60405180910390fd5b601c54156109de5760405162461bcd60e51b8152602060048201526014602482015273416c7265616479206c61756e6368656420626f6960601b604482015260640161098e565b43601c5542601d55565b6109f133611383565b610a0d5760405162461bcd60e51b815260040161098e90612190565b6022805460ff191694151594909417909355602491909155600060255560265560275543602855565b610a3f33611383565b610a5b5760405162461bcd60e51b815260040161098e90612190565b6010859055601184905560128390556013829055610a8582610a7f858189896113ad565b906113ad565b6014556015819055610a986004826121cb565b60145410610aa557600080fd5b5050505050565b6000610ab733610d97565b610ad35760405162461bcd60e51b815260040161098e906121ed565b506001600160a01b0381166000908152600f602052604090205460ff165b919050565b336000818152600b602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610b519086815260200190565b60405180910390a350600192915050565b600082610b6e836110ae565b119392505050565b610b7f33611383565b610b9b5760405162461bcd60e51b815260040161098e90612190565b601891909155601955565b610baf33611383565b610bcb5760405162461bcd60e51b815260040161098e90612190565b6002610bd783856121cb565b11158015610be457508183115b610bed57600080fd5b601e92909255601f55602155565b6007546001600160a01b0384166000908152600b60209081526040808320338452909152812054909114610caa576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600b82528381203382529091529190912054610c859184906113b9565b6001600160a01b0385166000908152600b602090815260408083203384529091529020555b610cb58484846113e5565b90505b9392505050565b600554600090610d0390610cdb906001600160a01b0316610f39565b600454610cfd90610cf4906001600160a01b0316610f39565b600754906117c0565b906117c0565b905090565b610d1133611383565b610d2d5760405162461bcd60e51b815260040161098e90612190565b6029546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015b600060405180830381600087803b158015610d7b57600080fd5b505af1158015610d8f573d6000803e3d6000fd5b505050505050565b6000546001600160a01b0391821691161490565b610db433610d97565b610dd05760405162461bcd60e51b815260040161098e906121ed565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610dff82600754610af6565b92915050565b610e0e33611383565b610e2a5760405162461bcd60e51b815260040161098e90612190565b6103e8600754610e3a91906121cb565b811015610e4657600080fd5b600855565b610e5433611383565b610e705760405162461bcd60e51b815260040161098e90612190565b6103e8600754610e8091906121cb565b811015610e8c57600080fd5b600955565b610e9a33611383565b610eb65760405162461bcd60e51b815260040161098e90612190565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b610eea33610d97565b610f065760405162461bcd60e51b815260040161098e906121ed565b6040514790339082156108fc029083906000818181858888f19350505050158015610f35573d6000803e3d6000fd5b5050565b6001600160a01b03166000908152600a602052604090205490565b610f5d33610d97565b610f795760405162461bcd60e51b815260040161098e906121ed565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b610fa633611383565b610fc25760405162461bcd60e51b815260040161098e90612190565b620b71b08110610fd157600080fd5b602b55565b610fdf33611383565b610ffb5760405162461bcd60e51b815260040161098e90612190565b601680546001600160a01b039384166001600160a01b03199182161790915560178054929093169116179055565b6000610cb83384846113e5565b61103f33611383565b61105b5760405162461bcd60e51b815260040161098e90612190565b6000602055565b61106b33610d97565b6110875760405162461bcd60e51b815260040161098e906121ed565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b6000610dff6110bb610cbf565b601b546110e8906110e1906002906110db906001600160a01b0316610f39565b906117cc565b85906117cc565b906113a1565b6110f733611383565b6111135760405162461bcd60e51b815260040161098e90612190565b602c805460ff191692151592909217909155602d55565b61113333610d97565b61114f5760405162461bcd60e51b815260040161098e906121ed565b6001600160a01b03166000908152600160205260409020805460ff19169055565b600043601c546001611182919061220d565b1061118f57505060145490565b811561119d57505060145490565b505060145490565b6111ae33610d97565b6111ca5760405162461bcd60e51b815260040161098e906121ed565b600080546001600160a01b0319166001600160a01b0383169081178255815260016020819052604091829020805460ff19169091179055517f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639061122f908390612003565b60405180910390a150565b61124333611383565b61125f5760405162461bcd60e51b815260040161098e90612190565b6001600160a01b03821630148015906112865750601b546001600160a01b03838116911614155b61128f57600080fd5b6001600160a01b0382166000908152600e60205260409020805460ff191682158015919091179091556112ef57602954604051630a5b654b60e11b81526001600160a01b03909116906314b6ca9690610d61908590600090600401612225565b6029546001600160a01b038381166000908152600a602052604090819020549051630a5b654b60e11b815291909216916314b6ca9691610d61918691600401612225565b61133c33611383565b6113585760405162461bcd60e51b815260040161098e90612190565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b6001600160a01b031660009081526001602052604090205460ff1690565b6000610cb882846121cb565b6000610cb8828461220d565b600081848411156113dd5760405162461bcd60e51b815260040161098e9190611f79565b505050900390565b602e5460009060ff1615611405576113fe8484846117d8565b9050610cb8565b601b547372d85ab47fbfc5e7e04a8bcfca1601d8f8ce1a50906000906001600160a01b038681169116148061144b5750816001600160a01b0316856001600160a01b0316145b9050611457868561187b565b8015801561147e57506001600160a01b0385166000908152600f602052604090205460ff16155b156114f7576009546001600160a01b0386166000908152600a60205260409020546114aa90869061220d565b106114f75760405162461bcd60e51b815260206004820152601d60248201527f4d61782077616c6c657420686173206265656e20747269676765726564000000604482015260640161098e565b8015611527576115056118e4565b1561151257611512611933565b61151a611ca1565b1561152757611527611cfc565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0389166000908152600a90915291909120546115799186906113b9565b6001600160a01b0387166000908152600a6020908152604080832093909355600c90529081205460ff16156115ae57846115b9565b6115b9878787611d43565b6001600160a01b0387166000908152600a60205260409020549091506115df90826113ad565b6001600160a01b038088166000908152600a6020908152604080832094909455918a168152600e909152205460ff16611683576029546001600160a01b038881166000908152600a602052604090819020549051630a5b654b60e11b815291909216916314b6ca9691611656918b91600401612225565b600060405180830381600087803b15801561167057600080fd5b505af1925050508015611681575060015b505b6001600160a01b0386166000908152600e602052604090205460ff16611714576029546001600160a01b038781166000908152600a602052604090819020549051630a5b654b60e11b815291909216916314b6ca96916116e7918a91600401612225565b600060405180830381600087803b15801561170157600080fd5b505af1925050508015611712575060015b505b602954602b546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c4799161174c9160040190815260200190565b600060405180830381600087803b15801561176657600080fd5b505af1925050508015611777575060015b50856001600160a01b0316876001600160a01b031660008051602061236e833981519152836040516117ab91815260200190565b60405180910390a35060019695505050505050565b6000610cb8828461223e565b6000610cb88284612255565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600a909152918220546118299184906113b9565b6001600160a01b038086166000908152600a6020526040808220939093559085168152205461185890836113ad565b6001600160a01b0384166000908152600a60205260409020555060019392505050565b600854811115806118a457506001600160a01b0382166000908152600d602052604090205460ff165b610f355760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b604482015260640161098e565b601b546000906001600160a01b031633148015906119055750602e5460ff16155b80156119135750602c5460ff165b8015610d03575050602d54306000908152600a6020526040902054101590565b602e805460ff1916600117905560185460195460009161195291610b62565b61195e57601054611961565b60005b9050600061198560026110e86014546110e886602d546117cc90919063ffffffff16565b9050600061199e82602d546117c090919063ffffffff16565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106119d8576119d8612274565b6001600160a01b039283166020918202929092010152600354825191169082906001908110611a0957611a09612274565b6001600160a01b039283166020918202929092010152601a5460405163791ac94760e01b81524792919091169063791ac94790611a539086906000908790309042906004016122ce565b600060405180830381600087803b158015611a6d57600080fd5b505af1158015611a81573d6000803e3d6000fd5b505050506000611a9a82476117c090919063ffffffff16565b90506000611ab5611aac8860026113a1565b601454906117c0565b90506000611aca60026110e88481878d6117cc565b90506000611ae7836110e8601254876117cc90919063ffffffff16565b90506000611b04846110e8601354886117cc90919063ffffffff16565b9050602960009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b5657600080fd5b505af193505050508015611b68575060015b506017546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611ba3573d6000803e3d6000fd5b508815611c8b57601a5460165460405163f305d71960e01b8152306004820152602481018c905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990859060c4016060604051808303818588803b158015611c1557600080fd5b505af1158015611c29573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611c4e919061230a565b505060408051858152602081018c90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b5050602e805460ff191690555050505050505050565b601b546000906001600160a01b03163314801590611cc25750602e5460ff16155b8015611cd0575060225460ff165b8015611ceb575043602754602854611ce8919061220d565b11155b8015610d0357505060265447101590565b602654600454611d1591906001600160a01b0316611dec565b43602855602654602554611d28916113ad565b60258190556024541015611d41576022805460ff191690555b565b601554601b546000918291611d7591906110e890611d6e906001600160a01b03898116911614611170565b86906117cc565b306000908152600a6020526040902054909150611d9290826113ad565b306000818152600a6020526040908190209290925590516001600160a01b0387169060008051602061236e83398151915290611dd19085815260200190565b60405180910390a3611de383826117c0565b95945050505050565b602e805460ff19166001179055604080516002808252606082018352600092602083019080368337505060035482519293506001600160a01b031691839150600090611e3a57611e3a612274565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611e6e57611e6e612274565b6001600160a01b039283166020918202929092010152601a5460405163b6f9de9560e01b815291169063b6f9de95908590611eb490600090869088904290600401612338565b6000604051808303818588803b158015611ecd57600080fd5b505af1158015611ee1573d6000803e3d6000fd5b5050602e805460ff19169055505050505050565b80358015158114610af157600080fd5b60008060008060808587031215611f1b57600080fd5b611f2485611ef5565b966020860135965060408601359560600135945092505050565b600080600080600060a08688031215611f5657600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600060208083528351808285015260005b81811015611fa657858101830151858201604001528201611f8a565b81811115611fb8576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611fe357600080fd5b50565b600060208284031215611ff857600080fd5b8135610cb881611fce565b6001600160a01b0391909116815260200190565b6000806040838503121561202a57600080fd5b823561203581611fce565b946020939093013593505050565b6000806040838503121561205657600080fd5b50508035926020909101359150565b60008060006060848603121561207a57600080fd5b505081359360208301359350604090920135919050565b6000806000606084860312156120a657600080fd5b83356120b181611fce565b925060208401356120c181611fce565b929592945050506040919091013590565b6000602082840312156120e457600080fd5b5035919050565b600080604083850312156120fe57600080fd5b823561210981611fce565b915061211760208401611ef5565b90509250929050565b6000806040838503121561213357600080fd5b823561213e81611fce565b9150602083013561214e81611fce565b809150509250929050565b6000806040838503121561216c57600080fd5b61203583611ef5565b60006020828403121561218757600080fd5b610cb882611ef5565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000826121e857634e487b7160e01b600052601260045260246000fd5b500490565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60008219821115612220576122206121b5565b500190565b6001600160a01b03929092168252602082015260400190565b600082821015612250576122506121b5565b500390565b600081600019048311821515161561226f5761226f6121b5565b500290565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156122c35781516001600160a01b03168752958201959082019060010161229e565b509495945050505050565b85815284602082015260a0604082015260006122ed60a083018661228a565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561231f57600080fd5b8351925060208401519150604084015190509250925092565b848152608060208201526000612351608083018661228a565b6001600160a01b0394909416604083015250606001529291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212208118026252d80afacd97e1c78741c4c027d2d54e3d97fb7f57a3d62f7627c78d64736f6c63430008090033