false
true
0

Contract Address Details

0xb3781607F5D3Ff89940FAcB9A0722de86FC4435C

Token
Αεί δω (Αδ)
Creator
0x906f21–63c5ee at 0xe3d2b6–1879fd
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
448 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
25889886
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
RewardrToken




Optimization enabled
true
Compiler version
v0.8.20+commit.a1b79de6




Optimization runs
200
EVM Version
default




Verified at
2024-12-28T08:57:54.121453Z

Constructor Arguments

0x00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000033c9900000000000000000000000078d58247be592f3cb7b87a5650c6b466ce4a54760000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000bce91ceb5ceaf20ceb4cf890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ce91ceb400000000000000000000000000000000000000000000000000000000

Arg [0] (string) : Αεί δω
Arg [1] (string) : Αδ
Arg [2] (uint256) : 212121
Arg [3] (address) : 0x78d58247be592f3cb7b87a5650c6b466ce4a5476
Arg [4] (uint256) : 8

              

Contract source code

// SPDX-License-Identifier: MIT

//
// ██▀███  ▓█████  █     █░ ▄▄▄       ██▀███  ▓█████▄  ██▀███  
//▓██ ▒ ██▒▓█   ▀ ▓█░ █ ░█░▒████▄    ▓██ ▒ ██▒▒██▀ ██▌▓██ ▒ ██▒
//▓██ ░▄█ ▒▒███   ▒█░ █ ░█ ▒██  ▀█▄  ▓██ ░▄█ ▒░██   █▌▓██ ░▄█ ▒
//▒██▀▀█▄  ▒▓█  ▄ ░█░ █ ░█ ░██▄▄▄▄██ ▒██▀▀█▄  ░▓█▄   ▌▒██▀▀█▄  
//░██▓ ▒██▒░▒████▒░░██▒██▓  ▓█   ▓██▒░██▓ ▒██▒░▒████▓ ░██▓ ▒██▒
//░ ▒▓ ░▒▓░░░ ▒░ ░░ ▓░▒ ▒   ▒▒   ▓▒█░░ ▒▓ ░▒▓░ ▒▒▓  ▒ ░ ▒▓ ░▒▓░


   
       

pragma solidity 0.8.20;

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

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

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

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

    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        if(currentAllowance != type(uint256).max) { 
            require(
                currentAllowance >= amount,
                "ERC20: transfer amount exceeds allowance"
            );
            unchecked {
                _approve(sender, _msgSender(), currentAllowance - amount);
            }
        }
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

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

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

    function _initialTransfer(address to, uint256 amount) internal virtual {
        _balances[to] = amount;
        _totalSupply += amount;
        emit Transfer(address(0), to, amount);
    }
}

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        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;
    }
}

interface IDividendDistributor {
    function initialize() external;
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _claimAfter) external;
    function setShare(address shareholder, uint256 amount, bool exclude) external;
    function deposit() external payable;
    function claimDividend(address shareholder) external;
    function getUnpaidEarnings(address shareholder) external view returns (uint256);
    function getPaidDividends(address shareholder) external view returns (uint256);
    function getTotalPaid() external view returns (uint256);
    function getClaimTime(address shareholder) external view returns (uint256);
    function getTotalDividends() external view returns (uint256);
    function getTotalDistributed() external view returns (uint256);
    function countShareholders() external view returns (uint256);
    function migrate(address newDistributor) external;
    function process() external;
}

contract DividendDistributor is IDividendDistributor, Ownable {

    address public _token;
    IERC20 public immutable reward;
    address public immutable ETH;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }

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

    mapping (address => Share) public shares;

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

    uint256 public minPeriod = 30 seconds;
    uint256 public minDistribution = 1;
    uint256 public gas = 800000;
    uint256 public currentIndex;

    address constant routerAddress = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
    IDexRouter constant dexRouter = IDexRouter(routerAddress);
    uint256 public slippage = 98;

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

    modifier onlyToken() {
        require(msg.sender == _token); _;
    }
    
    function getTotalDividends() external view override returns (uint256) {
        return totalDividends;
    }
    function getTotalDistributed() external view override returns (uint256) {
        return totalDistributed;
    }

    constructor (address rwd) {
        reward = IERC20(rwd);
        aprv();
        ETH = dexRouter.WPLS();
    }

    function aprv() public {
        reward.approve(routerAddress, type(uint256).max);
    }
    
    function initialize() external override initialization {
        _token = msg.sender;
    }
    
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _gas) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
        gas = _gas;
    }

    function setShare(address shareholder, uint256 amount, bool exclude) external override onlyToken {
        uint256 currentShare = shares[shareholder].amount;
        if(amount > 0 && currentShare == 0){
            addShareholder(shareholder);
            shares[shareholder].totalExcluded = getCumulativeDividends(amount);
            shareholderClaims[shareholder] = block.timestamp;
        }else if(amount == 0 && currentShare > 0){
            removeShareholder(shareholder);
        }

        uint256 unpaid = getUnpaidEarnings(shareholder);
        if(currentShare > 0 && !exclude){
            if(unpaid > 0) {
                if(shouldDistribute(shareholder, unpaid)) {
                    distributeDividend(shareholder, unpaid);
                } else {
                    unclaimed += unpaid;
                }
            }
        }
        
        totalShares = (totalShares - currentShare) + amount;
        
        shares[shareholder].amount = amount;
        
        shares[shareholder].totalExcluded = getCumulativeDividends(amount);
    }

    function deposit() external payable override {
        uint256 amount;
        if(address(reward) != ETH) {
        address[] memory path = new address[](2);
        path[0] = dexRouter.WPLS();
        path[1] = address(reward);

        uint256 spend = address(this).balance;
        uint256[] memory amountsout = dexRouter.getAmountsOut(spend, path);

        uint256 curBal = reward.balanceOf(address(this));

        dexRouter.swapExactETHForTokens{value: spend}(
            amountsout[1] * slippage / 100,
            path,
            address(this),
            block.timestamp
        );

        amount = reward.balanceOf(address(this)) - curBal;
        } else {
            amount = msg.value;
        }
        totalDividends += amount;
        if(totalShares > 0)
            if(dividendsPerShare == 0)
                dividendsPerShare = (dividendsPerShareAccuracyFactor * totalDividends) / totalShares;
            else
                dividendsPerShare += ((dividendsPerShareAccuracyFactor * amount) / totalShares);
    }

    function extractUnclaimed() external onlyOwner {
        uint256 uncl = unclaimed;
        unclaimed = 0;
        reward.transfer(msg.sender, uncl);
    }

    function extractLostETH() external onlyOwner {
        bool success;
        (success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed");
    }

    function setSlippage(uint256 _slip) external onlyOwner {
        require(_slip <= 100, "Min slippage reached");
        require(_slip >= 50, "Probably too much slippage");
        slippage = _slip;
    }

    function migrate(address newDistributor) external onlyToken {
        DividendDistributor newD = DividendDistributor(newDistributor);
        require(!newD.initialized(), "Already initialized");
        bool success;
        (success, ) = newDistributor.call{value: address(this).balance}("");
        reward.transfer(newDistributor, reward.balanceOf(address(this)));
        require(success, "Transfer failed");
    }

    function shouldDistribute(address shareholder, uint256 unpaidEarnings) internal view returns (bool) {
       return shareholderClaims[shareholder] + minPeriod < block.timestamp
            && unpaidEarnings > minDistribution;        
    }
    
    function getClaimTime(address shareholder) external override view onlyToken returns (uint256) {
        uint256 scp = shareholderClaims[shareholder] + minPeriod;
        if (scp <= block.timestamp) {
            return 0;
        } else {
            return scp - block.timestamp;
        }
    }

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

        if(unpaidEarnings > 0){
            totalDistributed = totalDistributed + unpaidEarnings;
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised += unpaidEarnings;
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            if(address(reward) == ETH) {
                bool success;
                (success, ) = shareholder.call{value: unpaidEarnings}("");
            } else
                reward.transfer(shareholder, unpaidEarnings);
        }
    }

    function process() public override {
        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;
            }
            
            uint256 unpaid = getUnpaidEarnings(shareholders[currentIndex]);
            if(shouldDistribute(shareholders[currentIndex], unpaid)){
                distributeDividend(shareholders[currentIndex], unpaid);
            }

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

    function claimDividend(address shareholder) external override onlyToken {
        uint256 unpaid = getUnpaidEarnings(shareholder);
        require(shouldDistribute(shareholder, unpaid), "Dividends not available yet");
        distributeDividend(shareholder, unpaid);
    }

    function processClaim(address shareholder) external onlyOwner {
        uint256 unpaid = getUnpaidEarnings(shareholder);
        require(shouldDistribute(shareholder, unpaid), "Dividends not available yet");
        distributeDividend(shareholder, unpaid);
    }

    function getUnpaidEarnings(address shareholder) public view override 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 - shareholderTotalExcluded;
    }
    
    function getPaidDividends(address shareholder) external view override onlyToken returns (uint256) {
        return shares[shareholder].totalRealised;
    }
    
    function getTotalPaid() external view override onlyToken returns (uint256) {
        return totalDistributed;
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        if(share == 0){ return 0; }
        return (share * dividendsPerShare) / dividendsPerShareAccuracyFactor;
    }

    function countShareholders() public view returns(uint256) {
        return shareholders.length;
    }

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

interface ILpPair {
    function sync() external;
}

interface IDexRouter {
    function factory() external pure returns (address);

    function WPLS() external pure returns (address);

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

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

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );
    
    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 getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

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

contract RewardrToken is ERC20, Ownable {
    IDexRouter public immutable dexRouter;
    address public lpPair;
    uint256 private _fees; 

    mapping(address => uint256) public walletProtection;
    bool public protectionDisabled = false;

    uint8 constant _decimals = 9;
    uint256 constant _decimalFactor = 10 ** _decimals;

    bool private swapping;
    uint256 public swapTokensAtAmount;
    uint256 public maxSwapTokens;

    IDividendDistributor public distributor;
    address public taxCollector;
    uint256 public taxSplit = 100;
    bool public autoProcess = true;

    bool public swapEnabled = true;

    uint256 public tradingActiveTime;

    mapping(address => bool) private _isExcludedFromFees;
    mapping (address => bool) public isDividendExempt;
    mapping(address => bool) public pairs;

    event SetPair(address indexed pair, bool indexed value);
    event ExcludeFromFees(address indexed account, bool isExcluded);

    constructor(string memory name, string memory ticker, uint256 supply, address reward, uint256 initialFees) ERC20(name, ticker) {
        address routerAddress = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
        dexRouter = IDexRouter(routerAddress);
        _fees = initialFees;

        _approve(msg.sender, routerAddress, type(uint256).max);
        _approve(address(this), routerAddress, type(uint256).max);

        uint256 totalSupply = supply * _decimalFactor;

        swapTokensAtAmount = (totalSupply * 1) / 1000000;
        maxSwapTokens = (totalSupply * 5) / 1000;

        excludeFromFees(msg.sender, true);
        excludeFromFees(address(this), true);

        isDividendExempt[routerAddress] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[address(0xdead)] = true;

        _initialTransfer(msg.sender, totalSupply);

        DividendDistributor dist = new DividendDistributor(reward);
        setDistributor(address(dist), false);
    }

    receive() external payable {}

    function decimals() public pure override returns (uint8) {
        return 9;
    }

    function updateSwapTokens(uint256 atAmount, uint256 maxAmount) external onlyOwner {
        require(maxAmount <= (totalSupply() * 1) / 100, "Max swap cannot be higher than 1% supply.");
        swapTokensAtAmount = atAmount;
        maxSwapTokens = maxAmount;
    }

    function setTaxCollector(address wallet) external onlyOwner {
        taxCollector = wallet;
    }

    function toggleSwap() external onlyOwner {
        swapEnabled = !swapEnabled;
    }

    function toggleProcess() external onlyOwner {
        autoProcess = !autoProcess;
    }

    function setPair(address pair, bool value) external {
        require(pair != lpPair, "The pair cannot be removed from pairs");
        require(msg.sender == owner() || msg.sender == taxCollector, "Unauthorised");

        pairs[pair] = value;
        setDividendExempt(pair, true);
        emit SetPair(pair, value);
    }

     function getFees() public view returns (uint256) {
        return _fees;
    }

    function setSplit(uint256 _split) external onlyOwner {
        require (_split <= 100);
        taxSplit = _split;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setDividendExempt(address holder, bool exempt) public onlyOwner {
        isDividendExempt[holder] = exempt;
        if(exempt){
            distributor.setShare(holder, 0, true);
        }else{
            distributor.setShare(holder, balanceOf(holder), false);
        }
    }

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

        if(tradingActiveTime == 0) {
            require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading not yet active");
            super._transfer(from, to, amount);
        }
        else {
            if (!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                uint256 fees = 0;
                uint256 _f = getFees();

                fees = (amount * _f) / 100;
                
                if (fees > 0) {
                    super._transfer(from, address(this), fees);
                }

                if (swapEnabled && !swapping && pairs[to]) {
                    swapping = true;
                    swapBack(amount);
                    swapping = false;
                }

                amount -= fees;
            }

            super._transfer(from, to, amount);

            if(autoProcess){ try distributor.process() {} catch {} }
        }

        _beforeTokenTransfer(from, to);

        if(!isDividendExempt[from]){ try distributor.setShare(from, balanceOf(from), false) {} catch {} }
        if(!isDividendExempt[to]){ try distributor.setShare(to, balanceOf(to), false) {} catch {} }
    }

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

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

    function swapBack(uint256 amount) private {
        uint256 amountToSwap = balanceOf(address(this));
        if (amountToSwap < swapTokensAtAmount) return;
        if (amountToSwap > maxSwapTokens) amountToSwap = maxSwapTokens;
        if (amountToSwap > amount) amountToSwap = amount;
        if (amountToSwap == 0) return;

        uint256 ethBalance = address(this).balance;

        swapTokensForEth(amountToSwap);

        uint256 generated = address(this).balance - ethBalance;

        if(generated > 0) {
            uint256 _split = taxSplit * generated / 100;
            if(_split > 0)
                try distributor.deposit{value: _split}() {} catch {}
            if(generated > _split){
                bool success;
                (success, ) = taxCollector.call{value: address(this).balance}("");
            }
        }
    }

    function withdrawTax() external {
        require(msg.sender == owner() || msg.sender == taxCollector, "Unauthorised");
        bool success;
        (success, ) = address(msg.sender).call{value: address(this).balance}("");
    }

    function addLP(uint256 nativeTokens, uint256 pairedTokens, address pairedWith) external payable onlyOwner {
        require(nativeTokens > 0, "No LP tokens specified");
        address ETH = dexRouter.WPLS();

        lpPair = IDexFactory(dexRouter.factory()).createPair(pairedWith, address(this));
        pairs[lpPair] = true;
        isDividendExempt[lpPair] = true;

        super._transfer(msg.sender, address(this), nativeTokens * _decimalFactor);

        if(pairedWith == ETH) {
            dexRouter.addLiquidityETH{value: msg.value}(address(this),balanceOf(address(this)),0,0,msg.sender,block.timestamp);
        }
        else { 
            IERC20Metadata tok = IERC20Metadata(pairedWith);
            //tok.transferFrom(msg.sender, address(this), pairedTokens * (10**tok.decimals()));
            dexRouter.addLiquidity(address(this), pairedWith, balanceOf(address(this)), tok.balanceOf(address(this)),0,0,msg.sender,block.timestamp);
        }
    }

    function launch() external onlyOwner {
        require(tradingActiveTime == 0);
        tradingActiveTime = block.number;
    }

    function setDistributor(address _distributor, bool migrate) public onlyOwner {
        if(migrate) 
            distributor.migrate(_distributor);

        distributor = IDividendDistributor(_distributor);
        distributor.initialize();
    }

    function claimDistributor(address _distributor) external onlyOwner {
        Ownable(_distributor).transferOwnership(msg.sender);
    }

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

    function manualDeposit() payable external {
        distributor.deposit{value: msg.value}();
    }

    function getPoolStatistics() external view returns (uint256 totalRewards, uint256 totalRewardsPaid, uint256 rewardHolders) {
        totalRewards = distributor.getTotalDividends();
        totalRewardsPaid = distributor.getTotalDistributed();
        rewardHolders = distributor.countShareholders();
    }
    
    function myStatistics(address wallet) external view returns (uint256 reward, uint256 rewardClaimed) {
        reward = distributor.getUnpaidEarnings(wallet);
        rewardClaimed = distributor.getPaidDividends(wallet);
    }
    
    function checkClaimTime(address wallet) external view returns (uint256) {
        return distributor.getClaimTime(wallet);
    }
    
    function claim() external {
        distributor.claimDividend(msg.sender);
    }

    function airdropToWallets(address[] memory wallets, uint256[] memory amountsInTokens, bool dividends) external onlyOwner {
        require(wallets.length == amountsInTokens.length, "Arrays must be the same length");

        for (uint256 i = 0; i < wallets.length; i++) {
            super._transfer(msg.sender, wallets[i], amountsInTokens[i] * _decimalFactor);
            if(dividends)
                distributor.setShare(wallets[i], amountsInTokens[i] * _decimalFactor, false);
        }
    }

    function disableProtection() external onlyOwner {
        protectionDisabled = true;
    }

    function transferProtection(address[] calldata _wallets, uint256 _enabled) external onlyOwner {
        if(_enabled > 0) require(!protectionDisabled, "Disabled");
        for(uint256 i = 0; i < _wallets.length; i++) {
            walletProtection[_wallets[i]] = _enabled;
        }
    }

    function _beforeTokenTransfer(address from, address to) internal view {
        require(walletProtection[from] == 0 || to == owner(), "Wallet protection enabled, please contact support");
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"ticker","internalType":"string"},{"type":"uint256","name":"supply","internalType":"uint256"},{"type":"address","name":"reward","internalType":"address"},{"type":"uint256","name":"initialFees","internalType":"uint256"}]},{"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":"ExcludeFromFees","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"bool","name":"isExcluded","internalType":"bool","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":"SetPair","inputs":[{"type":"address","name":"pair","internalType":"address","indexed":true},{"type":"bool","name":"value","internalType":"bool","indexed":true}],"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":"payable","outputs":[],"name":"addLP","inputs":[{"type":"uint256","name":"nativeTokens","internalType":"uint256"},{"type":"uint256","name":"pairedTokens","internalType":"uint256"},{"type":"address","name":"pairedWith","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"airdropToWallets","inputs":[{"type":"address[]","name":"wallets","internalType":"address[]"},{"type":"uint256[]","name":"amountsInTokens","internalType":"uint256[]"},{"type":"bool","name":"dividends","internalType":"bool"}]},{"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":"bool","name":"","internalType":"bool"}],"name":"autoProcess","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":"uint256","name":"","internalType":"uint256"}],"name":"checkClaimTime","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimDistributor","inputs":[{"type":"address","name":"_distributor","internalType":"address"}]},{"type":"function","stateMutability":"pure","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":"view","outputs":[{"type":"address","name":"","internalType":"contract IDexRouter"}],"name":"dexRouter","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"disableProtection","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDividendDistributor"}],"name":"distributor","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromFees","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"excluded","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalRewards","internalType":"uint256"},{"type":"uint256","name":"totalRewardsPaid","internalType":"uint256"},{"type":"uint256","name":"rewardHolders","internalType":"uint256"}],"name":"getPoolStatistics","inputs":[]},{"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":"isDividendExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"launch","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"lpPair","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"manualDeposit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxSwapTokens","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"reward","internalType":"uint256"},{"type":"uint256","name":"rewardClaimed","internalType":"uint256"}],"name":"myStatistics","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"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":"bool","name":"","internalType":"bool"}],"name":"pairs","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"protectionDisabled","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionCriteria","inputs":[{"type":"uint256","name":"_minPeriod","internalType":"uint256"},{"type":"uint256","name":"_minDistribution","internalType":"uint256"},{"type":"uint256","name":"_claimAfter","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributor","inputs":[{"type":"address","name":"_distributor","internalType":"address"},{"type":"bool","name":"migrate","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDividendExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPair","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSplit","inputs":[{"type":"uint256","name":"_split","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTaxCollector","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapTokensAtAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"taxCollector","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"taxSplit","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"toggleProcess","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"toggleSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tradingActiveTime","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":"nonpayable","outputs":[],"name":"transferProtection","inputs":[{"type":"address[]","name":"_wallets","internalType":"address[]"},{"type":"uint256","name":"_enabled","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateSwapTokens","inputs":[{"type":"uint256","name":"atAmount","internalType":"uint256"},{"type":"uint256","name":"maxAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"walletProtection","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawTax","inputs":[]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x60a06040526009805460ff191690556064600e55600f805461ffff19166101011790553480156200002e575f80fd5b50604051620059ee380380620059ee833981016040819052620000519162000682565b84846003620000618382620007a4565b506004620000708282620007a4565b5050505f620000846200024b60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35073165c3410fc91ef562c50559f7d2289febed552d960808190526007829055620000fe33825f196200024f565b6200010c30825f196200024f565b5f6200011b6009600a6200097b565b62000127908662000992565b9050620f42406200013a82600162000992565b620001469190620009ac565b600a556103e86200015982600562000992565b620001659190620009ac565b600b55620001753360016200037a565b620001823060016200037a565b6001600160a01b0382165f908152601260205260408082208054600160ff199182168117909255308452918320805483168217905561dead9092527f1120e10407cab1193d7c5139d9aae5536deb3d83e855f25f8e42f811c01f56f780549091169091179055620001f4338262000422565b5f846040516200020490620005b6565b6001600160a01b039091168152602001604051809103905ff0801580156200022e573d5f803e3d5ffd5b5090506200023d815f62000499565b5050505050505050620009e2565b3390565b6001600160a01b038316620002b75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b0382166200031a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620002ae565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314620003c45760405162461bcd60e51b815260206004820181905260248201525f80516020620059ce8339815191526044820152606401620002ae565b6001600160a01b0382165f81815260116020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382165f9081526020819052604081208290556002805483929062000450908490620009cc565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620004e35760405162461bcd60e51b815260206004820181905260248201525f80516020620059ce8339815191526044820152606401620002ae565b80156200054757600c5460405163ce5494bb60e01b81526001600160a01b0384811660048301529091169063ce5494bb906024015f604051808303815f87803b1580156200052f575f80fd5b505af115801562000542573d5f803e3d5ffd5b505050505b600c80546001600160a01b0319166001600160a01b0384169081179091556040805163204a7f0760e21b81529051638129fc1c916004808201925f9290919082900301818387803b1580156200059b575f80fd5b505af1158015620005ae573d5f803e3d5ffd5b505050505050565b612060806200396e83390190565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620005e8575f80fd5b81516001600160401b0380821115620006055762000605620005c4565b604051601f8301601f19908116603f01168101908282118183101715620006305762000630620005c4565b816040528381526020925086838588010111156200064c575f80fd5b5f91505b838210156200066f578582018301518183018401529082019062000650565b5f93810190920192909252949350505050565b5f805f805f60a0868803121562000697575f80fd5b85516001600160401b0380821115620006ae575f80fd5b620006bc89838a01620005d8565b96506020880151915080821115620006d2575f80fd5b50620006e188828901620005d8565b60408801516060890151919650945090506001600160a01b038116811462000707575f80fd5b80925050608086015190509295509295909350565b600181811c908216806200073157607f821691505b6020821081036200075057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200079f575f81815260208120601f850160051c810160208610156200077e5750805b601f850160051c820191505b81811015620005ae578281556001016200078a565b505050565b81516001600160401b03811115620007c057620007c0620005c4565b620007d881620007d184546200071c565b8462000756565b602080601f8311600181146200080e575f8415620007f65750858301515b5f19600386901b1c1916600185901b178555620005ae565b5f85815260208120601f198616915b828110156200083e578886015182559484019460019091019084016200081d565b50858210156200085c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115620008c057815f1904821115620008a457620008a46200086c565b80851615620008b257918102915b93841c939080029062000885565b509250929050565b5f82620008d85750600162000975565b81620008e657505f62000975565b8160018114620008ff57600281146200090a576200092a565b600191505062000975565b60ff8411156200091e576200091e6200086c565b50506001821b62000975565b5060208310610133831016604e8410600b84101617156200094f575081810a62000975565b6200095b838362000880565b805f19048211156200097157620009716200086c565b0290505b92915050565b5f6200098b60ff841683620008c8565b9392505050565b80820281158282048414176200097557620009756200086c565b5f82620009c757634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156200097557620009756200086c565b608051612f4962000a255f395f818161033801528181611834015281816118b601528181611a3101528181611b02015281816126a101526127570152612f495ff3fe6080604052600436106102dc575f3560e01c80636ab86dc111610189578063bea1dcf8116100d8578063d59ba0df11610092578063dfa20f0a1161006d578063dfa20f0a14610899578063e2f45605146108ad578063f2fde38b146108c2578063fe33b302146108e1575f80fd5b8063d59ba0df14610822578063db8d55f114610841578063dd62ed3e14610855575f80fd5b8063bea1dcf814610780578063bfe109281461079f578063c0246668146107be578063c3615cba146107dd578063c5363caa146107f6578063d29110c51461080f575f80fd5b806395d89b4111610143578063aceac8561161011e578063aceac856146106df578063ada2eb4814610713578063b572fe3414610732578063ba3194ed14610751575f80fd5b806395d89b411461068d578063a457c2d7146106a1578063a9059cbb146106c0575f80fd5b80636ab86dc1146105f85780636ddd17131461060057806370a082311461061e578063715018a61461063d57806386a22eff146106515780638da5cb5b14610670575f80fd5b8063313ce56711610245578063452ed4f1116101ff5780635031595f116101da5780635031595f1461057a578063535a24371461058f5780635c5d3412146105ba578063674e694f146105d9575f80fd5b8063452ed4f1146105285780634e71d92d146105475780634fc2d8a31461055b575f80fd5b8063313ce5671461047857806336a1efe41461049357806339509351146104a8578063421dd7c7146104c757806342902a84146104db5780634355855a146104fa575f80fd5b80630ca61cb1116102965780630ca61cb1146103df5780631317821d146103fe57806318160ddd146104125780631983f599146104305780631ff8d5071461044557806323b872dd14610459575f80fd5b806301339c21146102e757806306fdde03146102fd5780630758d9241461032757806308695b4114610372578063095ea7b3146103915780630bf1deff146103c0575f80fd5b366102e357005b5f80fd5b3480156102f2575f80fd5b506102fb61090f565b005b348015610308575f80fd5b50610311610954565b60405161031e9190612796565b60405180910390f35b348015610332575f80fd5b5061035a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161031e565b34801561037d575f80fd5b506102fb61038c3660046127f8565b6109e4565b34801561039c575f80fd5b506103b06103ab36600461281a565b610a30565b604051901515815260200161031e565b3480156103cb575f80fd5b506102fb6103da366004612844565b610a46565b3480156103ea575f80fd5b506102fb6103f93660046128b8565b610b1a565b348015610409575f80fd5b506102fb610bb0565b34801561041d575f80fd5b506002545b60405190815260200161031e565b34801561043b575f80fd5b50610422600e5481565b348015610450575f80fd5b506102fb610bee565b348015610464575f80fd5b506103b06104733660046128e1565b610c35565b348015610483575f80fd5b506040516009815260200161031e565b34801561049e575f80fd5b50610422600b5481565b3480156104b3575f80fd5b506103b06104c236600461281a565b610ce5565b3480156104d2575f80fd5b506102fb610d20565b3480156104e6575f80fd5b506104226104f53660046127f8565b610d59565b348015610505575f80fd5b506103b06105143660046127f8565b60126020525f908152604090205460ff1681565b348015610533575f80fd5b5060065461035a906001600160a01b031681565b348015610552575f80fd5b506102fb610dc5565b348015610566575f80fd5b506102fb6105753660046127f8565b610e19565b348015610585575f80fd5b5061042260105481565b34801561059a575f80fd5b506104226105a93660046127f8565b60086020525f908152604090205481565b3480156105c5575f80fd5b506102fb6105d436600461291f565b610e9a565b3480156105e4575f80fd5b506102fb6105f336600461293f565b610f50565b6102fb610f8c565b34801561060b575f80fd5b50600f546103b090610100900460ff1681565b348015610629575f80fd5b506104226106383660046127f8565b610fd9565b348015610648575f80fd5b506102fb610ff3565b34801561065c575f80fd5b506102fb61066b36600461296a565b611066565b34801561067b575f80fd5b506005546001600160a01b031661035a565b348015610698575f80fd5b50610311611199565b3480156106ac575f80fd5b506103b06106bb36600461281a565b6111a8565b3480156106cb575f80fd5b506103b06106da36600461281a565b611240565b3480156106ea575f80fd5b506106fe6106f93660046127f8565b61124c565b6040805192835260208301919091520161031e565b34801561071e575f80fd5b506102fb61072d366004612a6d565b611330565b34801561073d575f80fd5b506102fb61074c36600461296a565b6114d3565b34801561075c575f80fd5b506107656115cd565b6040805193845260208401929092529082015260600161031e565b34801561078b575f80fd5b50600d5461035a906001600160a01b031681565b3480156107aa575f80fd5b50600c5461035a906001600160a01b031681565b3480156107c9575f80fd5b506102fb6107d836600461296a565b611737565b3480156107e8575f80fd5b50600f546103b09060ff1681565b348015610801575f80fd5b506009546103b09060ff1681565b6102fb61081d366004612b38565b6117bf565b34801561082d575f80fd5b506102fb61083c36600461296a565b611c36565b34801561084c575f80fd5b50600754610422565b348015610860575f80fd5b5061042261086f366004612b6e565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b3480156108a4575f80fd5b506102fb611d14565b3480156108b8575f80fd5b50610422600a5481565b3480156108cd575f80fd5b506102fb6108dc3660046127f8565b611db1565b3480156108ec575f80fd5b506103b06108fb3660046127f8565b60136020525f908152604090205460ff1681565b6005546001600160a01b031633146109425760405162461bcd60e51b815260040161093990612ba5565b60405180910390fd5b6010541561094e575f80fd5b43601055565b60606003805461096390612bda565b80601f016020809104026020016040519081016040528092919081815260200182805461098f90612bda565b80156109da5780601f106109b1576101008083540402835291602001916109da565b820191905f5260205f20905b8154815290600101906020018083116109bd57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610a0e5760405162461bcd60e51b815260040161093990612ba5565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b5f610a3c338484611e9b565b5060015b92915050565b6005546001600160a01b03163314610a705760405162461bcd60e51b815260040161093990612ba5565b8015610ab45760095460ff1615610ab45760405162461bcd60e51b8152602060048201526008602482015267111a5cd8589b195960c21b6044820152606401610939565b5f5b82811015610b14578160085f868685818110610ad457610ad4612c12565b9050602002016020810190610ae991906127f8565b6001600160a01b0316815260208101919091526040015f205580610b0c81612c3a565b915050610ab6565b50505050565b6005546001600160a01b03163314610b445760405162461bcd60e51b815260040161093990612ba5565b600c54604051630ca61cb160e01b81526004810185905260248101849052604481018390526001600160a01b0390911690630ca61cb1906064015f604051808303815f87803b158015610b95575f80fd5b505af1158015610ba7573d5f803e3d5ffd5b50505050505050565b6005546001600160a01b03163314610bda5760405162461bcd60e51b815260040161093990612ba5565b600f805460ff19811660ff90911615179055565b6005546001600160a01b03163314610c185760405162461bcd60e51b815260040161093990612ba5565b600f805461ff001981166101009182900460ff1615909102179055565b5f610c41848484611fbe565b6001600160a01b0384165f9081526001602090815260408083203384529091529020545f198114610cda5782811015610ccd5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610939565b610cda8533858403611e9b565b506001949350505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610a3c918590610d1b908690612c52565b611e9b565b6005546001600160a01b03163314610d4a5760405162461bcd60e51b815260040161093990612ba5565b6009805460ff19166001179055565b600c54604051630994fc3160e11b81526001600160a01b0383811660048301525f921690631329f86290602401602060405180830381865afa158015610da1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a409190612c65565b600c54604051630afbf02f60e11b81523360048201526001600160a01b03909116906315f7e05e906024015f604051808303815f87803b158015610e07575f80fd5b505af1158015610b14573d5f803e3d5ffd5b6005546001600160a01b03163314610e435760405162461bcd60e51b815260040161093990612ba5565b60405163f2fde38b60e01b81523360048201526001600160a01b0382169063f2fde38b906024015f604051808303815f87803b158015610e81575f80fd5b505af1158015610e93573d5f803e3d5ffd5b5050505050565b6005546001600160a01b03163314610ec45760405162461bcd60e51b815260040161093990612ba5565b6064610ecf60025490565b610eda906001612c7c565b610ee49190612c93565b811115610f455760405162461bcd60e51b815260206004820152602960248201527f4d617820737761702063616e6e6f7420626520686967686572207468616e2031604482015268129039bab838363c9760b91b6064820152608401610939565b600a91909155600b55565b6005546001600160a01b03163314610f7a5760405162461bcd60e51b815260040161093990612ba5565b6064811115610f87575f80fd5b600e55565b600c5f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015610e81575f80fd5b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b0316331461101d5760405162461bcd60e51b815260040161093990612ba5565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6006546001600160a01b03908116908316036110d25760405162461bcd60e51b815260206004820152602560248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d20604482015264706169727360d81b6064820152608401610939565b6005546001600160a01b03163314806110f55750600d546001600160a01b031633145b6111305760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5cd95960a21b6044820152606401610939565b6001600160a01b0382165f908152601360205260409020805460ff191682151517905561115e8260016114d3565b604051811515906001600160a01b038416907ff40a563af144a84735f7f6c7c3029794b0ac17713e5f048d3fd00ed85aa4ca7a905f90a35050565b60606004805461096390612bda565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156112295760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610939565b6112363385858403611e9b565b5060019392505050565b5f610a3c338484611fbe565b600c5460405163051fa63360e31b81526001600160a01b0383811660048301525f9283929116906328fd319890602401602060405180830381865afa158015611297573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112bb9190612c65565b600c54604051633cbf8a6160e01b81526001600160a01b038681166004830152929450911690633cbf8a6190602401602060405180830381865afa158015611305573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113299190612c65565b9050915091565b6005546001600160a01b0316331461135a5760405162461bcd60e51b815260040161093990612ba5565b81518351146113ab5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610939565b5f5b8351811015610b145761140b338583815181106113cc576113cc612c12565b60200260200101516009600a6113e29190612d92565b8685815181106113f4576113f4612c12565b60200260200101516114069190612c7c565b612320565b81156114c157600c5484516001600160a01b03909116906329cc05cf9086908490811061143a5761143a612c12565b60200260200101516009600a6114509190612d92565b86858151811061146257611462612c12565b60200260200101516114749190612c7c565b5f6040518463ffffffff1660e01b815260040161149393929190612da0565b5f604051808303815f87803b1580156114aa575f80fd5b505af11580156114bc573d5f803e3d5ffd5b505050505b806114cb81612c3a565b9150506113ad565b6005546001600160a01b031633146114fd5760405162461bcd60e51b815260040161093990612ba5565b6001600160a01b0382165f908152601260205260409020805460ff1916821580159190911790915561158f57600c546040516329cc05cf60e01b81526001600160a01b03909116906329cc05cf9061155e9085905f90600190600401612da0565b5f604051808303815f87803b158015611575575f80fd5b505af1158015611587573d5f803e3d5ffd5b505050505050565b600c546001600160a01b03166329cc05cf836115aa81610fd9565b5f6040518463ffffffff1660e01b815260040161155e93929190612da0565b5050565b5f805f600c5f9054906101000a90046001600160a01b03166001600160a01b03166367ee5f096040518163ffffffff1660e01b8152600401602060405180830381865afa158015611620573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116449190612c65565b9250600c5f9054906101000a90046001600160a01b03166001600160a01b0316635695fa586040518163ffffffff1660e01b8152600401602060405180830381865afa158015611696573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ba9190612c65565b9150600c5f9054906101000a90046001600160a01b03166001600160a01b0316639df62df26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561170c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117309190612c65565b9050909192565b6005546001600160a01b031633146117615760405162461bcd60e51b815260040161093990612ba5565b6001600160a01b0382165f81815260116020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146117e95760405162461bcd60e51b815260040161093990612ba5565b5f83116118315760405162461bcd60e51b8152602060048201526016602482015275139bc81314081d1bdad95b9cc81cdc1958da599a595960521b6044820152606401610939565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561188e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118b29190612dc3565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611910573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119349190612dc3565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c65396906044016020604051808303815f875af1158015611981573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a59190612dc3565b600680546001600160a01b0319166001600160a01b0392831690811782555f908152601360209081526040808320805460ff199081166001908117909255945490951683526012909152902080549091169091179055611a163330611a0c6009600a612d92565b6114069088612c7c565b806001600160a01b0316826001600160a01b031603611af7577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7193430611a6930610fd9565b6040516001600160e01b031960e086901b1681526001600160a01b03909216600483015260248201525f6044820181905260648201523360848201524260a482015260c40160606040518083038185885af1158015611aca573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611aef9190612dde565b505050610b14565b816001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663e8e337003083611b3282610fd9565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa158015611b74573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b989190612c65565b6040516001600160e01b031960e087901b1681526001600160a01b039485166004820152939092166024840152604483015260648201525f6084820181905260a48201523360c48201524260e4820152610104016060604051808303815f875af1158015611c08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c2c9190612dde565b5050505050505050565b6005546001600160a01b03163314611c605760405162461bcd60e51b815260040161093990612ba5565b8015611cc157600c5460405163ce5494bb60e01b81526001600160a01b0384811660048301529091169063ce5494bb906024015f604051808303815f87803b158015611caa575f80fd5b505af1158015611cbc573d5f803e3d5ffd5b505050505b600c80546001600160a01b0319166001600160a01b0384169081179091556040805163204a7f0760e21b81529051638129fc1c916004808201925f9290919082900301818387803b158015611575575f80fd5b6005546001600160a01b0316331480611d375750600d546001600160a01b031633145b611d725760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5cd95960a21b6044820152606401610939565b6040515f90339047908381818185875af1925050503d805f8114610b14576040519150601f19603f3d011682016040523d82523d5f602084013e610b14565b6005546001600160a01b03163314611ddb5760405162461bcd60e51b815260040161093990612ba5565b6001600160a01b038116611e405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610939565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611efd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610939565b6001600160a01b038216611f5e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610939565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611fe45760405162461bcd60e51b815260040161093990612e09565b6001600160a01b03821661200a5760405162461bcd60e51b815260040161093990612e4e565b6010545f036120a5576001600160a01b0383165f9081526011602052604090205460ff168061205057506001600160a01b0382165f9081526011602052604090205460ff165b6120955760405162461bcd60e51b815260206004820152601660248201527554726164696e67206e6f74207965742061637469766560501b6044820152606401610939565b6120a0838383612320565b61220f565b6001600160a01b0383165f9081526011602052604090205460ff161580156120e557506001600160a01b0382165f9081526011602052604090205460ff16155b1561219a575f806120f560075490565b905060646121038285612c7c565b61210d9190612c93565b9150811561212057612120853084612320565b600f54610100900460ff16801561213f5750600954610100900460ff16155b801561216257506001600160a01b0384165f9081526013602052604090205460ff165b1561218b576009805461ff00191661010017905561217f83612473565b6009805461ff00191690555b6121958284612e91565b925050505b6121a5838383612320565b600f5460ff161561220f57600c5f9054906101000a90046001600160a01b03166001600160a01b031663c33fb8776040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156121fc575f80fd5b505af192505050801561220d575060015b505b61221983836125b5565b6001600160a01b0383165f9081526012602052604090205460ff1661229c57600c546001600160a01b03166329cc05cf8461225381610fd9565b5f6040518463ffffffff1660e01b815260040161227293929190612da0565b5f604051808303815f87803b158015612289575f80fd5b505af192505050801561229a575060015b505b6001600160a01b0382165f9081526012602052604090205460ff1661231b57600c546001600160a01b03166329cc05cf836122d681610fd9565b5f6040518463ffffffff1660e01b81526004016122f593929190612da0565b5f604051808303815f87803b15801561230c575f80fd5b505af1925050508015610b1457505b505050565b6001600160a01b0383166123465760405162461bcd60e51b815260040161093990612e09565b6001600160a01b03821661236c5760405162461bcd60e51b815260040161093990612e4e565b6001600160a01b0383165f90815260208190526040902054818110156123e35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610939565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290612419908490612c52565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161246591815260200190565b60405180910390a350505050565b5f61247d30610fd9565b9050600a5481101561248d575050565b600b5481111561249c5750600b545b818111156124a75750805b805f036124b2575050565b476124bc8261264c565b5f6124c78247612e91565b90508015610b14575f606482600e546124e09190612c7c565b6124ea9190612c93565b9050801561255357600c5f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b15801561253f575f80fd5b505af193505050508015612551575060015b505b80821115610e9357600d546040515f916001600160a01b03169047908381818185875af1925050503d805f81146125a5576040519150601f19603f3d011682016040523d82523d5f602084013e6125aa565b606091505b505050505050505050565b6001600160a01b0382165f9081526008602052604090205415806125e657506005546001600160a01b038281169116145b6115c95760405162461bcd60e51b815260206004820152603160248201527f57616c6c65742070726f74656374696f6e20656e61626c65642c20706c656173604482015270194818dbdb9d1858dd081cdd5c1c1bdc9d607a1b6064820152608401610939565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061267f5761267f612c12565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061271f9190612dc3565b8160018151811061273257612732612c12565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac9479061155e9085905f90869030904290600401612ea4565b5f6020808352835180828501525f5b818110156127c1578581018301518582016040015282016127a5565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146127f5575f80fd5b50565b5f60208284031215612808575f80fd5b8135612813816127e1565b9392505050565b5f806040838503121561282b575f80fd5b8235612836816127e1565b946020939093013593505050565b5f805f60408486031215612856575f80fd5b833567ffffffffffffffff8082111561286d575f80fd5b818601915086601f830112612880575f80fd5b81358181111561288e575f80fd5b8760208260051b85010111156128a2575f80fd5b6020928301989097509590910135949350505050565b5f805f606084860312156128ca575f80fd5b505081359360208301359350604090920135919050565b5f805f606084860312156128f3575f80fd5b83356128fe816127e1565b9250602084013561290e816127e1565b929592945050506040919091013590565b5f8060408385031215612930575f80fd5b50508035926020909101359150565b5f6020828403121561294f575f80fd5b5035919050565b80358015158114612965575f80fd5b919050565b5f806040838503121561297b575f80fd5b8235612986816127e1565b915061299460208401612956565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129da576129da61299d565b604052919050565b5f67ffffffffffffffff8211156129fb576129fb61299d565b5060051b60200190565b5f82601f830112612a14575f80fd5b81356020612a29612a24836129e2565b6129b1565b82815260059290921b84018101918181019086841115612a47575f80fd5b8286015b84811015612a625780358352918301918301612a4b565b509695505050505050565b5f805f60608486031215612a7f575f80fd5b833567ffffffffffffffff80821115612a96575f80fd5b818601915086601f830112612aa9575f80fd5b81356020612ab9612a24836129e2565b82815260059290921b8401810191818101908a841115612ad7575f80fd5b948201945b83861015612afe578535612aef816127e1565b82529482019490820190612adc565b97505087013592505080821115612b13575f80fd5b50612b2086828701612a05565b925050612b2f60408501612956565b90509250925092565b5f805f60608486031215612b4a575f80fd5b83359250602084013591506040840135612b63816127e1565b809150509250925092565b5f8060408385031215612b7f575f80fd5b8235612b8a816127e1565b91506020830135612b9a816127e1565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612bee57607f821691505b602082108103612c0c57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201612c4b57612c4b612c26565b5060010190565b80820180821115610a4057610a40612c26565b5f60208284031215612c75575f80fd5b5051919050565b8082028115828204841417610a4057610a40612c26565b5f82612cad57634e487b7160e01b5f52601260045260245ffd5b500490565b600181815b80851115612cec57815f1904821115612cd257612cd2612c26565b80851615612cdf57918102915b93841c9390800290612cb7565b509250929050565b5f82612d0257506001610a40565b81612d0e57505f610a40565b8160018114612d245760028114612d2e57612d4a565b6001915050610a40565b60ff841115612d3f57612d3f612c26565b50506001821b610a40565b5060208310610133831016604e8410600b8410161715612d6d575081810a610a40565b612d778383612cb2565b805f1904821115612d8a57612d8a612c26565b029392505050565b5f61281360ff841683612cf4565b6001600160a01b0393909316835260208301919091521515604082015260600190565b5f60208284031215612dd3575f80fd5b8151612813816127e1565b5f805f60608486031215612df0575f80fd5b8351925060208401519150604084015190509250925092565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610a4057610a40612c26565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b81811015612ef25784516001600160a01b031683529383019391830191600101612ecd565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220a5aea976b6b2f04371cc8ee01d9a59a5d5b3768586405055a703dcffd8d2b17364736f6c6343000814003360c06040526ec097ce7bc90715b34b9f1000000000600b55601e600c556001600d55620c3500600e55606260105534801562000039575f80fd5b5060405162002060380380620020608339810160408190526200005c91620001c9565b5f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b038116608052620000b36200013d565b73165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000104573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200012a9190620001c9565b6001600160a01b031660a0525062000219565b60805160405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d960048201525f1960248201526001600160a01b039091169063095ea7b3906044016020604051808303815f875af1158015620001a0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001c69190620001f8565b50565b5f60208284031215620001da575f80fd5b81516001600160a01b0381168114620001f1575f80fd5b9392505050565b5f6020828403121562000209575f80fd5b81518015158114620001f1575f80fd5b60805160a051611dd8620002885f395f81816104cc01528181610f7d01526117ef01525f818161030301528181610ab201528181610e4e01528181610fa70152818161109c01528181611186015281816112c6015281816116860152818161181201526118b70152611dd85ff3fe60806040526004361061023e575f3560e01c8063715018a611610134578063d0e30db0116100b3578063ecd0c0c311610078578063ecd0c0c314610655578063efca2eed14610674578063f0fa55a914610689578063f2fde38b146106a8578063f7bf3f31146106c7578063ffd49c84146106db575f80fd5b8063d0e30db0146105da578063d4fda1f2146105e2578063dabae90b1461060d578063e2d2e2191461062c578063e5e1d94914610641575f80fd5b80639df62df2116100f95780639df62df21461051f578063ab377daa14610533578063c33fb87714610552578063ce5494bb14610566578063ce7c2ac214610585575f80fd5b8063715018a6146104935780638129fc1c146104a75780638322fff2146104bb5780638da5cb5b146104ee578063997664d71461050a575f80fd5b80633cbf8a61116101c057806366817df51161018557806366817df514610416578063669416b8146104415780636793141f1461045657806367ee5f091461046a5780636ca7c2161461047e575f80fd5b80633cbf8a61146103a55780633e032a3b146103c45780634fab0ae8146103d95780635695fa58146103ee578063636b828914610402575f80fd5b8063228cb73311610206578063228cb733146102f257806326987b601461033d57806328fd31981461035257806329cc05cf146103715780633a98ef3914610390575f80fd5b80630ca61cb11461024257806311ce023d146102635780631329f8621461028b578063158ef93e146102aa57806315f7e05e146102d3575b5f80fd5b34801561024d575f80fd5b5061026161025c366004611a5a565b6106f0565b005b34801561026e575f80fd5b50610278600b5481565b6040519081526020015b60405180910390f35b348015610296575f80fd5b506102786102a5366004611a97565b610714565b3480156102b5575f80fd5b506011546102c39060ff1681565b6040519015158152602001610282565b3480156102de575f80fd5b506102616102ed366004611a97565b610774565b3480156102fd575f80fd5b506103257f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610282565b348015610348575f80fd5b50610278600f5481565b34801561035d575f80fd5b5061027861036c366004611a97565b6107ff565b34801561037c575f80fd5b5061026161038b366004611abf565b610885565b34801561039b575f80fd5b5061027860065481565b3480156103b0575f80fd5b506102786103bf366004611a97565b610a2f565b3480156103cf575f80fd5b5061027860105481565b3480156103e4575f80fd5b50610278600d5481565b3480156103f9575f80fd5b50600854610278565b34801561040d575f80fd5b50610261610a65565b348015610421575f80fd5b50610278610430366004611a97565b60046020525f908152604090205481565b34801561044c575f80fd5b5061027860095481565b348015610461575f80fd5b50610278610b24565b348015610475575f80fd5b50600754610278565b348015610489575f80fd5b50610278600e5481565b34801561049e575f80fd5b50610261610b43565b3480156104b2575f80fd5b50610261610bb4565b3480156104c6575f80fd5b506103257f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f9575f80fd5b505f546001600160a01b0316610325565b348015610515575f80fd5b5061027860075481565b34801561052a575f80fd5b50600254610278565b34801561053e575f80fd5b5061032561054d366004611afe565b610be4565b34801561055d575f80fd5b50610261610c0c565b348015610571575f80fd5b50610261610580366004611a97565b610d29565b348015610590575f80fd5b506105bf61059f366004611a97565b60056020525f908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610282565b610261610f7a565b3480156105ed575f80fd5b506102786105fc366004611a97565b60036020525f908152604090205481565b348015610618575f80fd5b50610261610627366004611a97565b6113cd565b348015610637575f80fd5b50610278600a5481565b34801561064c575f80fd5b506102616113f6565b348015610660575f80fd5b50600154610325906001600160a01b031681565b34801561067f575f80fd5b5061027860085481565b348015610694575f80fd5b506102616106a3366004611afe565b6114a8565b3480156106b3575f80fd5b506102616106c2366004611a97565b61156f565b3480156106d2575f80fd5b50610261611656565b3480156106e6575f80fd5b50610278600c5481565b6001546001600160a01b03163314610706575f80fd5b600c92909255600d55600e55565b6001545f906001600160a01b0316331461072c575f80fd5b600c546001600160a01b0383165f90815260046020526040812054909161075291611b29565b905042811161076357505f92915050565b61076d4282611b3c565b9392505050565b6001546001600160a01b0316331461078a575f80fd5b5f610794826107ff565b90506107a082826116f8565b6107f15760405162461bcd60e51b815260206004820152601b60248201527f4469766964656e6473206e6f7420617661696c61626c6520796574000000000060448201526064015b60405180910390fd5b6107fb8282611738565b5050565b6001600160a01b0381165f90815260056020526040812054810361082457505f919050565b6001600160a01b0382165f9081526005602052604081205461084590611921565b6001600160a01b0384165f9081526005602052604090206001015490915080821161087357505f9392505050565b61087d8183611b3c565b949350505050565b6001546001600160a01b0316331461089b575f80fd5b6001600160a01b0383165f9081526005602052604090205482158015906108c0575080155b1561095757600280546001600160a01b0386165f818152600360205260408120839055600183018455929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b031916909117905561092983611921565b6001600160a01b0385165f908152600560209081526040808320600101939093556004905220429055610972565b8215801561096457505f81115b15610972576109728461194a565b5f61097c856107ff565b90505f8211801561098b575082155b156109cb5780156109cb576109a085826116f8565b156109b4576109af8582611738565b6109cb565b8060095f8282546109c59190611b29565b90915550505b83826006546109da9190611b3c565b6109e49190611b29565b6006556001600160a01b0385165f908152600560205260409020849055610a0a84611921565b6001600160a01b039095165f9081526005602052604090206001019490945550505050565b6001545f906001600160a01b03163314610a47575f80fd5b506001600160a01b03165f9081526005602052604090206002015490565b5f546001600160a01b03163314610a8e5760405162461bcd60e51b81526004016107e890611b4f565b600980545f90915560405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015610b00573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fb9190611b84565b6001545f906001600160a01b03163314610b3c575f80fd5b5060085490565b5f546001600160a01b03163314610b6c5760405162461bcd60e51b81526004016107e890611b4f565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b60115460ff1615610bc3575f80fd5b600180546001600160a01b031916331781556011805460ff19169091179055565b60028181548110610bf3575f80fd5b5f918252602090912001546001600160a01b0316905081565b6002545f819003610c1a5750565b5f805a90505f5b600e5483108015610c3157508381105b15610d235783600f5410610c44575f600f555b5f610c766002600f5481548110610c5d57610c5d611b9f565b5f918252602090912001546001600160a01b03166107ff565b9050610caa6002600f5481548110610c9057610c90611b9f565b5f918252602090912001546001600160a01b0316826116f8565b15610ce157610ce16002600f5481548110610cc757610cc7611b9f565b5f918252602090912001546001600160a01b031682611738565b5a610cec9084611b3c565b610cf69085611b29565b93505a600f80549194505f610d0a83611bb3565b91905055508180610d1a90611bb3565b92505050610c21565b50505050565b6001546001600160a01b03163314610d3f575f80fd5b5f819050806001600160a01b031663158ef93e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da39190611b84565b15610de65760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016107e8565b5f826001600160a01b0316476040515f6040518083038185875af1925050503d805f8114610e2f576040519150601f19603f3d011682016040523d82523d5f602084013e610e34565b606091505b50506040516370a0823160e01b81523060048201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90859083906370a0823190602401602060405180830381865afa158015610ea5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec99190611bcb565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610f11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f359190611b84565b5080610f755760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016107e8565b505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461134c576040805160028082526060820183525f9260208301908036833701905050905073165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611044573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110689190611bf6565b815f8151811061107a5761107a611b9f565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106110ce576110ce611b9f565b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b815247905f9073165c3410fc91ef562c50559f7d2289febed552d99063d06ca61f906111239085908790600401611c53565b5f60405180830381865afa15801561113d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111649190810190611c6b565b6040516370a0823160e01b81523060048201529091505f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef9190611bcb565b905073165c3410fc91ef562c50559f7d2289febed552d96001600160a01b0316637ff36ab58460646010548660018151811061122d5761122d611b9f565b602002602001015161123f9190611d24565b6112499190611d3b565b8730426040518663ffffffff1660e01b815260040161126b9493929190611d5a565b5f6040518083038185885af1158015611286573d5f803e3d5ffd5b50505050506040513d5f823e601f3d908101601f191682016040526112ae9190810190611c6b565b506040516370a0823160e01b815230600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611313573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113379190611bcb565b6113419190611b3c565b94505050505061134f565b50345b8060075f8282546113609190611b29565b9091555050600654156113ca57600a545f0361139957600654600754600b546113899190611d24565b6113939190611d3b565b600a5550565b60065481600b546113aa9190611d24565b6113b49190611d3b565b600a5f8282546113c49190611b29565b90915550505b50565b5f546001600160a01b0316331461078a5760405162461bcd60e51b81526004016107e890611b4f565b5f546001600160a01b0316331461141f5760405162461bcd60e51b81526004016107e890611b4f565b6040515f90339047908381818185875af1925050503d805f811461145e576040519150601f19603f3d011682016040523d82523d5f602084013e611463565b606091505b505080915050806113ca5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016107e8565b5f546001600160a01b031633146114d15760405162461bcd60e51b81526004016107e890611b4f565b60648111156115195760405162461bcd60e51b8152602060048201526014602482015273135a5b881cdb1a5c1c1859d9481c995858da195960621b60448201526064016107e8565b603281101561156a5760405162461bcd60e51b815260206004820152601a60248201527f50726f6261626c7920746f6f206d75636820736c69707061676500000000000060448201526064016107e8565b601055565b5f546001600160a01b031633146115985760405162461bcd60e51b81526004016107e890611b4f565b6001600160a01b0381166115fd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107e8565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b60405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d960048201525f1960248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063095ea7b3906044016020604051808303815f875af11580156116d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ca9190611b84565b600c546001600160a01b0383165f90815260046020526040812054909142916117219190611b29565b10801561172f5750600d5482115b90505b92915050565b6001600160a01b0382165f90815260056020526040812054900361175a575050565b80156107fb578060085461176e9190611b29565b6008556001600160a01b0382165f9081526004602090815260408083204290556005909152812060020180548392906117a8908490611b29565b90915550506001600160a01b0382165f908152600560205260409020546117ce90611921565b6001600160a01b038084165f908152600560205260409020600101919091557f000000000000000000000000000000000000000000000000000000000000000081167f000000000000000000000000000000000000000000000000000000000000000090911603611891575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611882576040519150601f19603f3d011682016040523d82523d5f602084013e611887565b606091505b506107fb92505050565b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af11580156118fd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f759190611b84565b5f815f0361193057505f919050565b600b54600a546119409084611d24565b6117329190611d3b565b6002805461195a90600190611b3c565b8154811061196a5761196a611b9f565b5f9182526020808320909101546001600160a01b03848116845260039092526040909220546002805492909316929181106119a7576119a7611b9f565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600391829052604081205460028054919392916119f290600190611b3c565b81548110611a0257611a02611b9f565b5f9182526020808320909101546001600160a01b031683528201929092526040019020556002805480611a3757611a37611d8e565b5f8281526020902081015f1990810180546001600160a01b031916905501905550565b5f805f60608486031215611a6c575f80fd5b505081359360208301359350604090920135919050565b6001600160a01b03811681146113ca575f80fd5b5f60208284031215611aa7575f80fd5b813561076d81611a83565b80151581146113ca575f80fd5b5f805f60608486031215611ad1575f80fd5b8335611adc81611a83565b9250602084013591506040840135611af381611ab2565b809150509250925092565b5f60208284031215611b0e575f80fd5b5035919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561173257611732611b15565b8181038181111561173257611732611b15565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f60208284031215611b94575f80fd5b815161076d81611ab2565b634e487b7160e01b5f52603260045260245ffd5b5f60018201611bc457611bc4611b15565b5060010190565b5f60208284031215611bdb575f80fd5b5051919050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611c06575f80fd5b815161076d81611a83565b5f8151808452602080850194508084015f5b83811015611c485781516001600160a01b031687529582019590820190600101611c23565b509495945050505050565b828152604060208201525f61087d6040830184611c11565b5f6020808385031215611c7c575f80fd5b825167ffffffffffffffff80821115611c93575f80fd5b818501915085601f830112611ca6575f80fd5b815181811115611cb857611cb8611be2565b8060051b604051601f19603f83011681018181108582111715611cdd57611cdd611be2565b604052918252848201925083810185019188831115611cfa575f80fd5b938501935b82851015611d1857845184529385019392850192611cff565b98975050505050505050565b808202811582820484141761173257611732611b15565b5f82611d5557634e487b7160e01b5f52601260045260245ffd5b500490565b848152608060208201525f611d726080830186611c11565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212206ecd50f35d97efbb7eef1f7ec57e312c6a47b738f1fb81ef8a5939e9b87a141264736f6c634300081400334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000033c9900000000000000000000000078d58247be592f3cb7b87a5650c6b466ce4a54760000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000bce91ceb5ceaf20ceb4cf890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ce91ceb400000000000000000000000000000000000000000000000000000000

Deployed ByteCode

0x6080604052600436106102dc575f3560e01c80636ab86dc111610189578063bea1dcf8116100d8578063d59ba0df11610092578063dfa20f0a1161006d578063dfa20f0a14610899578063e2f45605146108ad578063f2fde38b146108c2578063fe33b302146108e1575f80fd5b8063d59ba0df14610822578063db8d55f114610841578063dd62ed3e14610855575f80fd5b8063bea1dcf814610780578063bfe109281461079f578063c0246668146107be578063c3615cba146107dd578063c5363caa146107f6578063d29110c51461080f575f80fd5b806395d89b4111610143578063aceac8561161011e578063aceac856146106df578063ada2eb4814610713578063b572fe3414610732578063ba3194ed14610751575f80fd5b806395d89b411461068d578063a457c2d7146106a1578063a9059cbb146106c0575f80fd5b80636ab86dc1146105f85780636ddd17131461060057806370a082311461061e578063715018a61461063d57806386a22eff146106515780638da5cb5b14610670575f80fd5b8063313ce56711610245578063452ed4f1116101ff5780635031595f116101da5780635031595f1461057a578063535a24371461058f5780635c5d3412146105ba578063674e694f146105d9575f80fd5b8063452ed4f1146105285780634e71d92d146105475780634fc2d8a31461055b575f80fd5b8063313ce5671461047857806336a1efe41461049357806339509351146104a8578063421dd7c7146104c757806342902a84146104db5780634355855a146104fa575f80fd5b80630ca61cb1116102965780630ca61cb1146103df5780631317821d146103fe57806318160ddd146104125780631983f599146104305780631ff8d5071461044557806323b872dd14610459575f80fd5b806301339c21146102e757806306fdde03146102fd5780630758d9241461032757806308695b4114610372578063095ea7b3146103915780630bf1deff146103c0575f80fd5b366102e357005b5f80fd5b3480156102f2575f80fd5b506102fb61090f565b005b348015610308575f80fd5b50610311610954565b60405161031e9190612796565b60405180910390f35b348015610332575f80fd5b5061035a7f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d981565b6040516001600160a01b03909116815260200161031e565b34801561037d575f80fd5b506102fb61038c3660046127f8565b6109e4565b34801561039c575f80fd5b506103b06103ab36600461281a565b610a30565b604051901515815260200161031e565b3480156103cb575f80fd5b506102fb6103da366004612844565b610a46565b3480156103ea575f80fd5b506102fb6103f93660046128b8565b610b1a565b348015610409575f80fd5b506102fb610bb0565b34801561041d575f80fd5b506002545b60405190815260200161031e565b34801561043b575f80fd5b50610422600e5481565b348015610450575f80fd5b506102fb610bee565b348015610464575f80fd5b506103b06104733660046128e1565b610c35565b348015610483575f80fd5b506040516009815260200161031e565b34801561049e575f80fd5b50610422600b5481565b3480156104b3575f80fd5b506103b06104c236600461281a565b610ce5565b3480156104d2575f80fd5b506102fb610d20565b3480156104e6575f80fd5b506104226104f53660046127f8565b610d59565b348015610505575f80fd5b506103b06105143660046127f8565b60126020525f908152604090205460ff1681565b348015610533575f80fd5b5060065461035a906001600160a01b031681565b348015610552575f80fd5b506102fb610dc5565b348015610566575f80fd5b506102fb6105753660046127f8565b610e19565b348015610585575f80fd5b5061042260105481565b34801561059a575f80fd5b506104226105a93660046127f8565b60086020525f908152604090205481565b3480156105c5575f80fd5b506102fb6105d436600461291f565b610e9a565b3480156105e4575f80fd5b506102fb6105f336600461293f565b610f50565b6102fb610f8c565b34801561060b575f80fd5b50600f546103b090610100900460ff1681565b348015610629575f80fd5b506104226106383660046127f8565b610fd9565b348015610648575f80fd5b506102fb610ff3565b34801561065c575f80fd5b506102fb61066b36600461296a565b611066565b34801561067b575f80fd5b506005546001600160a01b031661035a565b348015610698575f80fd5b50610311611199565b3480156106ac575f80fd5b506103b06106bb36600461281a565b6111a8565b3480156106cb575f80fd5b506103b06106da36600461281a565b611240565b3480156106ea575f80fd5b506106fe6106f93660046127f8565b61124c565b6040805192835260208301919091520161031e565b34801561071e575f80fd5b506102fb61072d366004612a6d565b611330565b34801561073d575f80fd5b506102fb61074c36600461296a565b6114d3565b34801561075c575f80fd5b506107656115cd565b6040805193845260208401929092529082015260600161031e565b34801561078b575f80fd5b50600d5461035a906001600160a01b031681565b3480156107aa575f80fd5b50600c5461035a906001600160a01b031681565b3480156107c9575f80fd5b506102fb6107d836600461296a565b611737565b3480156107e8575f80fd5b50600f546103b09060ff1681565b348015610801575f80fd5b506009546103b09060ff1681565b6102fb61081d366004612b38565b6117bf565b34801561082d575f80fd5b506102fb61083c36600461296a565b611c36565b34801561084c575f80fd5b50600754610422565b348015610860575f80fd5b5061042261086f366004612b6e565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b3480156108a4575f80fd5b506102fb611d14565b3480156108b8575f80fd5b50610422600a5481565b3480156108cd575f80fd5b506102fb6108dc3660046127f8565b611db1565b3480156108ec575f80fd5b506103b06108fb3660046127f8565b60136020525f908152604090205460ff1681565b6005546001600160a01b031633146109425760405162461bcd60e51b815260040161093990612ba5565b60405180910390fd5b6010541561094e575f80fd5b43601055565b60606003805461096390612bda565b80601f016020809104026020016040519081016040528092919081815260200182805461098f90612bda565b80156109da5780601f106109b1576101008083540402835291602001916109da565b820191905f5260205f20905b8154815290600101906020018083116109bd57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610a0e5760405162461bcd60e51b815260040161093990612ba5565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b5f610a3c338484611e9b565b5060015b92915050565b6005546001600160a01b03163314610a705760405162461bcd60e51b815260040161093990612ba5565b8015610ab45760095460ff1615610ab45760405162461bcd60e51b8152602060048201526008602482015267111a5cd8589b195960c21b6044820152606401610939565b5f5b82811015610b14578160085f868685818110610ad457610ad4612c12565b9050602002016020810190610ae991906127f8565b6001600160a01b0316815260208101919091526040015f205580610b0c81612c3a565b915050610ab6565b50505050565b6005546001600160a01b03163314610b445760405162461bcd60e51b815260040161093990612ba5565b600c54604051630ca61cb160e01b81526004810185905260248101849052604481018390526001600160a01b0390911690630ca61cb1906064015f604051808303815f87803b158015610b95575f80fd5b505af1158015610ba7573d5f803e3d5ffd5b50505050505050565b6005546001600160a01b03163314610bda5760405162461bcd60e51b815260040161093990612ba5565b600f805460ff19811660ff90911615179055565b6005546001600160a01b03163314610c185760405162461bcd60e51b815260040161093990612ba5565b600f805461ff001981166101009182900460ff1615909102179055565b5f610c41848484611fbe565b6001600160a01b0384165f9081526001602090815260408083203384529091529020545f198114610cda5782811015610ccd5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610939565b610cda8533858403611e9b565b506001949350505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610a3c918590610d1b908690612c52565b611e9b565b6005546001600160a01b03163314610d4a5760405162461bcd60e51b815260040161093990612ba5565b6009805460ff19166001179055565b600c54604051630994fc3160e11b81526001600160a01b0383811660048301525f921690631329f86290602401602060405180830381865afa158015610da1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a409190612c65565b600c54604051630afbf02f60e11b81523360048201526001600160a01b03909116906315f7e05e906024015f604051808303815f87803b158015610e07575f80fd5b505af1158015610b14573d5f803e3d5ffd5b6005546001600160a01b03163314610e435760405162461bcd60e51b815260040161093990612ba5565b60405163f2fde38b60e01b81523360048201526001600160a01b0382169063f2fde38b906024015f604051808303815f87803b158015610e81575f80fd5b505af1158015610e93573d5f803e3d5ffd5b5050505050565b6005546001600160a01b03163314610ec45760405162461bcd60e51b815260040161093990612ba5565b6064610ecf60025490565b610eda906001612c7c565b610ee49190612c93565b811115610f455760405162461bcd60e51b815260206004820152602960248201527f4d617820737761702063616e6e6f7420626520686967686572207468616e2031604482015268129039bab838363c9760b91b6064820152608401610939565b600a91909155600b55565b6005546001600160a01b03163314610f7a5760405162461bcd60e51b815260040161093990612ba5565b6064811115610f87575f80fd5b600e55565b600c5f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015610e81575f80fd5b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b0316331461101d5760405162461bcd60e51b815260040161093990612ba5565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6006546001600160a01b03908116908316036110d25760405162461bcd60e51b815260206004820152602560248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d20604482015264706169727360d81b6064820152608401610939565b6005546001600160a01b03163314806110f55750600d546001600160a01b031633145b6111305760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5cd95960a21b6044820152606401610939565b6001600160a01b0382165f908152601360205260409020805460ff191682151517905561115e8260016114d3565b604051811515906001600160a01b038416907ff40a563af144a84735f7f6c7c3029794b0ac17713e5f048d3fd00ed85aa4ca7a905f90a35050565b60606004805461096390612bda565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156112295760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610939565b6112363385858403611e9b565b5060019392505050565b5f610a3c338484611fbe565b600c5460405163051fa63360e31b81526001600160a01b0383811660048301525f9283929116906328fd319890602401602060405180830381865afa158015611297573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112bb9190612c65565b600c54604051633cbf8a6160e01b81526001600160a01b038681166004830152929450911690633cbf8a6190602401602060405180830381865afa158015611305573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113299190612c65565b9050915091565b6005546001600160a01b0316331461135a5760405162461bcd60e51b815260040161093990612ba5565b81518351146113ab5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610939565b5f5b8351811015610b145761140b338583815181106113cc576113cc612c12565b60200260200101516009600a6113e29190612d92565b8685815181106113f4576113f4612c12565b60200260200101516114069190612c7c565b612320565b81156114c157600c5484516001600160a01b03909116906329cc05cf9086908490811061143a5761143a612c12565b60200260200101516009600a6114509190612d92565b86858151811061146257611462612c12565b60200260200101516114749190612c7c565b5f6040518463ffffffff1660e01b815260040161149393929190612da0565b5f604051808303815f87803b1580156114aa575f80fd5b505af11580156114bc573d5f803e3d5ffd5b505050505b806114cb81612c3a565b9150506113ad565b6005546001600160a01b031633146114fd5760405162461bcd60e51b815260040161093990612ba5565b6001600160a01b0382165f908152601260205260409020805460ff1916821580159190911790915561158f57600c546040516329cc05cf60e01b81526001600160a01b03909116906329cc05cf9061155e9085905f90600190600401612da0565b5f604051808303815f87803b158015611575575f80fd5b505af1158015611587573d5f803e3d5ffd5b505050505050565b600c546001600160a01b03166329cc05cf836115aa81610fd9565b5f6040518463ffffffff1660e01b815260040161155e93929190612da0565b5050565b5f805f600c5f9054906101000a90046001600160a01b03166001600160a01b03166367ee5f096040518163ffffffff1660e01b8152600401602060405180830381865afa158015611620573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116449190612c65565b9250600c5f9054906101000a90046001600160a01b03166001600160a01b0316635695fa586040518163ffffffff1660e01b8152600401602060405180830381865afa158015611696573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ba9190612c65565b9150600c5f9054906101000a90046001600160a01b03166001600160a01b0316639df62df26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561170c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117309190612c65565b9050909192565b6005546001600160a01b031633146117615760405162461bcd60e51b815260040161093990612ba5565b6001600160a01b0382165f81815260116020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146117e95760405162461bcd60e51b815260040161093990612ba5565b5f83116118315760405162461bcd60e51b8152602060048201526016602482015275139bc81314081d1bdad95b9cc81cdc1958da599a595960521b6044820152606401610939565b5f7f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561188e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118b29190612dc3565b90507f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611910573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119349190612dc3565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c65396906044016020604051808303815f875af1158015611981573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a59190612dc3565b600680546001600160a01b0319166001600160a01b0392831690811782555f908152601360209081526040808320805460ff199081166001908117909255945490951683526012909152902080549091169091179055611a163330611a0c6009600a612d92565b6114069088612c7c565b806001600160a01b0316826001600160a01b031603611af7577f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031663f305d7193430611a6930610fd9565b6040516001600160e01b031960e086901b1681526001600160a01b03909216600483015260248201525f6044820181905260648201523360848201524260a482015260c40160606040518083038185885af1158015611aca573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611aef9190612dde565b505050610b14565b816001600160a01b037f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d91663e8e337003083611b3282610fd9565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa158015611b74573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b989190612c65565b6040516001600160e01b031960e087901b1681526001600160a01b039485166004820152939092166024840152604483015260648201525f6084820181905260a48201523360c48201524260e4820152610104016060604051808303815f875af1158015611c08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c2c9190612dde565b5050505050505050565b6005546001600160a01b03163314611c605760405162461bcd60e51b815260040161093990612ba5565b8015611cc157600c5460405163ce5494bb60e01b81526001600160a01b0384811660048301529091169063ce5494bb906024015f604051808303815f87803b158015611caa575f80fd5b505af1158015611cbc573d5f803e3d5ffd5b505050505b600c80546001600160a01b0319166001600160a01b0384169081179091556040805163204a7f0760e21b81529051638129fc1c916004808201925f9290919082900301818387803b158015611575575f80fd5b6005546001600160a01b0316331480611d375750600d546001600160a01b031633145b611d725760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5cd95960a21b6044820152606401610939565b6040515f90339047908381818185875af1925050503d805f8114610b14576040519150601f19603f3d011682016040523d82523d5f602084013e610b14565b6005546001600160a01b03163314611ddb5760405162461bcd60e51b815260040161093990612ba5565b6001600160a01b038116611e405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610939565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611efd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610939565b6001600160a01b038216611f5e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610939565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611fe45760405162461bcd60e51b815260040161093990612e09565b6001600160a01b03821661200a5760405162461bcd60e51b815260040161093990612e4e565b6010545f036120a5576001600160a01b0383165f9081526011602052604090205460ff168061205057506001600160a01b0382165f9081526011602052604090205460ff165b6120955760405162461bcd60e51b815260206004820152601660248201527554726164696e67206e6f74207965742061637469766560501b6044820152606401610939565b6120a0838383612320565b61220f565b6001600160a01b0383165f9081526011602052604090205460ff161580156120e557506001600160a01b0382165f9081526011602052604090205460ff16155b1561219a575f806120f560075490565b905060646121038285612c7c565b61210d9190612c93565b9150811561212057612120853084612320565b600f54610100900460ff16801561213f5750600954610100900460ff16155b801561216257506001600160a01b0384165f9081526013602052604090205460ff165b1561218b576009805461ff00191661010017905561217f83612473565b6009805461ff00191690555b6121958284612e91565b925050505b6121a5838383612320565b600f5460ff161561220f57600c5f9054906101000a90046001600160a01b03166001600160a01b031663c33fb8776040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156121fc575f80fd5b505af192505050801561220d575060015b505b61221983836125b5565b6001600160a01b0383165f9081526012602052604090205460ff1661229c57600c546001600160a01b03166329cc05cf8461225381610fd9565b5f6040518463ffffffff1660e01b815260040161227293929190612da0565b5f604051808303815f87803b158015612289575f80fd5b505af192505050801561229a575060015b505b6001600160a01b0382165f9081526012602052604090205460ff1661231b57600c546001600160a01b03166329cc05cf836122d681610fd9565b5f6040518463ffffffff1660e01b81526004016122f593929190612da0565b5f604051808303815f87803b15801561230c575f80fd5b505af1925050508015610b1457505b505050565b6001600160a01b0383166123465760405162461bcd60e51b815260040161093990612e09565b6001600160a01b03821661236c5760405162461bcd60e51b815260040161093990612e4e565b6001600160a01b0383165f90815260208190526040902054818110156123e35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610939565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290612419908490612c52565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161246591815260200190565b60405180910390a350505050565b5f61247d30610fd9565b9050600a5481101561248d575050565b600b5481111561249c5750600b545b818111156124a75750805b805f036124b2575050565b476124bc8261264c565b5f6124c78247612e91565b90508015610b14575f606482600e546124e09190612c7c565b6124ea9190612c93565b9050801561255357600c5f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b15801561253f575f80fd5b505af193505050508015612551575060015b505b80821115610e9357600d546040515f916001600160a01b03169047908381818185875af1925050503d805f81146125a5576040519150601f19603f3d011682016040523d82523d5f602084013e6125aa565b606091505b505050505050505050565b6001600160a01b0382165f9081526008602052604090205415806125e657506005546001600160a01b038281169116145b6115c95760405162461bcd60e51b815260206004820152603160248201527f57616c6c65742070726f74656374696f6e20656e61626c65642c20706c656173604482015270194818dbdb9d1858dd081cdd5c1c1bdc9d607a1b6064820152608401610939565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061267f5761267f612c12565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061271f9190612dc3565b8160018151811061273257612732612c12565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d99091169063791ac9479061155e9085905f90869030904290600401612ea4565b5f6020808352835180828501525f5b818110156127c1578581018301518582016040015282016127a5565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146127f5575f80fd5b50565b5f60208284031215612808575f80fd5b8135612813816127e1565b9392505050565b5f806040838503121561282b575f80fd5b8235612836816127e1565b946020939093013593505050565b5f805f60408486031215612856575f80fd5b833567ffffffffffffffff8082111561286d575f80fd5b818601915086601f830112612880575f80fd5b81358181111561288e575f80fd5b8760208260051b85010111156128a2575f80fd5b6020928301989097509590910135949350505050565b5f805f606084860312156128ca575f80fd5b505081359360208301359350604090920135919050565b5f805f606084860312156128f3575f80fd5b83356128fe816127e1565b9250602084013561290e816127e1565b929592945050506040919091013590565b5f8060408385031215612930575f80fd5b50508035926020909101359150565b5f6020828403121561294f575f80fd5b5035919050565b80358015158114612965575f80fd5b919050565b5f806040838503121561297b575f80fd5b8235612986816127e1565b915061299460208401612956565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129da576129da61299d565b604052919050565b5f67ffffffffffffffff8211156129fb576129fb61299d565b5060051b60200190565b5f82601f830112612a14575f80fd5b81356020612a29612a24836129e2565b6129b1565b82815260059290921b84018101918181019086841115612a47575f80fd5b8286015b84811015612a625780358352918301918301612a4b565b509695505050505050565b5f805f60608486031215612a7f575f80fd5b833567ffffffffffffffff80821115612a96575f80fd5b818601915086601f830112612aa9575f80fd5b81356020612ab9612a24836129e2565b82815260059290921b8401810191818101908a841115612ad7575f80fd5b948201945b83861015612afe578535612aef816127e1565b82529482019490820190612adc565b97505087013592505080821115612b13575f80fd5b50612b2086828701612a05565b925050612b2f60408501612956565b90509250925092565b5f805f60608486031215612b4a575f80fd5b83359250602084013591506040840135612b63816127e1565b809150509250925092565b5f8060408385031215612b7f575f80fd5b8235612b8a816127e1565b91506020830135612b9a816127e1565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612bee57607f821691505b602082108103612c0c57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201612c4b57612c4b612c26565b5060010190565b80820180821115610a4057610a40612c26565b5f60208284031215612c75575f80fd5b5051919050565b8082028115828204841417610a4057610a40612c26565b5f82612cad57634e487b7160e01b5f52601260045260245ffd5b500490565b600181815b80851115612cec57815f1904821115612cd257612cd2612c26565b80851615612cdf57918102915b93841c9390800290612cb7565b509250929050565b5f82612d0257506001610a40565b81612d0e57505f610a40565b8160018114612d245760028114612d2e57612d4a565b6001915050610a40565b60ff841115612d3f57612d3f612c26565b50506001821b610a40565b5060208310610133831016604e8410600b8410161715612d6d575081810a610a40565b612d778383612cb2565b805f1904821115612d8a57612d8a612c26565b029392505050565b5f61281360ff841683612cf4565b6001600160a01b0393909316835260208301919091521515604082015260600190565b5f60208284031215612dd3575f80fd5b8151612813816127e1565b5f805f60608486031215612df0575f80fd5b8351925060208401519150604084015190509250925092565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610a4057610a40612c26565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b81811015612ef25784516001600160a01b031683529383019391830191600101612ecd565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220a5aea976b6b2f04371cc8ee01d9a59a5d5b3768586405055a703dcffd8d2b17364736f6c63430008140033