ETH Price: $3,344.19 (-8.98%)
 

Overview

Max Total Supply

500,000,000,000 VSWARM

Holders

93

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
984,747,688.477792560759890339 VSWARM

Value
$0.00
0x26396f19d84a11fe243637740e913d9d96c5e86e
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ValidatorSwarm

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : swarm.sol
/**
 * https://vswarm.xyz/ | https://t.me/vswarm
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    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 to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), 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 _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

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

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

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

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

contract ValidatorSwarm is ERC20, Ownable {
    using SafeMath for uint256;

    uint256 public maxSupply; // what the total supply can reach and not go beyond

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;

    bool private _swapping;

    address private _swapFeeReceiver;
    
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;

    uint256 public swapTokensThreshold;
        
    bool public limitsInEffect = true;

    bool public tradingEnabled = false;

    uint256 public totalFees;
    uint256 private _marketingFee;
    uint256 private _liquidityFee;
    uint256 private _validatorFee;
    
    uint256 private _tokensForMarketing;
    uint256 private _tokensForLiquidity;
    uint256 private _tokensForValidator;
    
    // staking vars
    uint256 public totalStaked;
    address public stakingToken;
    address public rewardToken;
    uint256 public apr;

    bool public stakingEnabled = false;
    uint256 public totalClaimed;

    struct Validator {
        uint256 creationTime;
        uint256 staked;
    }

    struct Staker {
        address staker;
        uint256 start;
        uint256 staked;
        uint256 earned;
    }

    struct ClaimHistory {
        uint256[] dates;
        uint256[] amounts;
    }

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) private _automatedMarketMakerPairs;

    // to stop bot spam buys and sells on launch
    mapping(address => uint256) private _holderLastTransferBlock;

    // stake data
    mapping(address => mapping(uint256 => Staker)) private _stakers;
    mapping(address => ClaimHistory) private _claimHistory;
    Validator[] public validators;

    /**
     * @dev Throws if called by any account other than the _swapFeeReceiver
     */
    modifier teamOROwner() {
        require(_swapFeeReceiver == _msgSender() || owner() == _msgSender(), "Caller is not the _swapFeeReceiver address nor owner.");
        _;
    }

    modifier isStakingEnabled() {
        require(stakingEnabled, "Staking is not enabled.");
        _;
    }

    constructor() ERC20("Validator Swarm", "VSWARM") payable {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        _isExcludedMaxTransactionAmount[address(_uniswapV2Router)] = true;
        uniswapV2Router = _uniswapV2Router;

        uint256 marketingFee = 2;
        uint256 liquidityFee = 1;
        uint256 validatorFee = 3;

        uint256 totalSupply = 5e11 * 1e18;
        maxSupply = 1e12 * 1e18;

        maxTransactionAmount = totalSupply * 1 / 100; // 1%
        maxWallet = totalSupply * 1 / 100; // 1%
        swapTokensThreshold = totalSupply * 1 / 1000;
        
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _validatorFee = validatorFee;
        totalFees = _marketingFee + _liquidityFee + _validatorFee;

        _swapFeeReceiver = owner();

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        _isExcludedMaxTransactionAmount[owner()] = true;
        _isExcludedMaxTransactionAmount[address(this)] = true;
        _isExcludedMaxTransactionAmount[address(0xdead)] = true;
        
        stakingToken = address(this);
        rewardToken = address(this);
        apr = 50;

        _mint(msg.sender, totalSupply);
    }

    /**
    * @dev Once live, can never be switched off
    */
    function enableTrading() external teamOROwner {
        require(!tradingEnabled, "Can only enable once.");
        tradingEnabled = true;
    }

    /**
    * @dev Remove limits after token is somewhat stable
    */
    function removeLimits() external teamOROwner {
        limitsInEffect = false;
    }

    /**
    * @dev Exclude from fee calculation
    */
    function excludeFromFees(address account, bool excluded) public teamOROwner {
        _isExcludedFromFees[account] = excluded;
    }
    
    /**
    * @dev Update token fees (max set to initial fee)
    */
    function updateFees(uint256 marketingFee, uint256 liquidityFee, uint256 validatorFee) external onlyOwner {
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _validatorFee = validatorFee;

        totalFees = _marketingFee + _liquidityFee + _validatorFee;

        require(totalFees <= 6, "Must keep fees at 6% or less");
    }

    /**
    * @dev Update wallet that receives fees and newly added LP
    */
    function updateFeeReceiver(address newWallet) external teamOROwner {
        _swapFeeReceiver = newWallet;
    }

    /**
    * @dev Very important function. 
    * Updates the threshold of how many tokens that must be in the contract calculation for fees to be taken
    */
    function updateSwapTokensThreshold(uint256 newThreshold) external teamOROwner returns (bool) {
  	    require(newThreshold >= totalSupply() * 1 / 100000, "Swap threshold cannot be lower than 0.001% total supply.");
  	    require(newThreshold <= totalSupply() * 5 / 1000, "Swap threshold cannot be higher than 0.5% total supply.");
  	    swapTokensThreshold = newThreshold;
  	    return true;
  	}

    /**
    * @dev Check if an address is excluded from the fee calculation
    */
    function isExcludedFromFees(address account) external view returns(bool) {
        return _isExcludedFromFees[account];
    }

    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 (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        // all to secure a smooth launch
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0xdead) &&
                !_swapping
            ) {
                if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                    require(tradingEnabled, "Trading is not enabled.");
                    require(_holderLastTransferBlock[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                    _holderLastTransferBlock[tx.origin] = block.number;
                }

                // on buy
                if (_automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
                
                // on sell
                else if (_automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensThreshold;
        if (
            canSwap &&
            !_swapping &&
            !_automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            _swapping = true;
            swapBack();
            _swapping = false;
        }

        bool takeFee = !_swapping;

        // if any addy belongs to _isExcludedFromFee or isn't a swap then remove the fee
        if (
            _isExcludedFromFees[from] || 
            _isExcludedFromFees[to] || 
            (!_automatedMarketMakerPairs[from] && !_automatedMarketMakerPairs[to])
        ) takeFee = false;
        
        uint256 fees = 0;
        if (takeFee) {
            fees = amount.mul(totalFees).div(100);
            _tokensForLiquidity += fees * _liquidityFee / totalFees;
            _tokensForValidator += fees * _validatorFee / totalFees;
            _tokensForMarketing += fees * _marketingFee / totalFees;
            
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

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

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

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

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            _swapFeeReceiver,
            block.timestamp
        );
    }

    function swapBack() internal {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + _tokensForValidator;
        
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > swapTokensThreshold) contractBalance = swapTokensThreshold;
        
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * _tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        _swapTokensForEth(amountToSwapForETH);
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForValidator = ethBalance.mul(_tokensForValidator).div(totalTokensToSwap);
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForValidator;
        
        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForValidator = 0;

        payable(_swapFeeReceiver).transfer(ethForMarketing.add(ethForValidator));
                
        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
        }
    }

    /**
    * @dev Transfer eth stuck in contract to _swapFeeReceiver
    */
    function withdrawContractETH() external {
        payable(_swapFeeReceiver).transfer(address(this).balance);
    }

    /**
    * @dev In case swap wont do it and sells/buys might be blocked
    */
    function forceSwap() external teamOROwner {
        _swapTokensForEth(balanceOf(address(this)));
    }

    /**
        *
        * @dev Staking part starts here
        *
    */

    /**
    * @dev Checks if holder is staking
    */
    function isStaking(address stakerAddr, uint256 validator) public view returns (bool) {
        return _stakers[stakerAddr][validator].staker == stakerAddr;
    }

    /**
    * @dev Returns how much staker is staking
    */
    function userStaked(address staker, uint256 validator) public view returns (uint256) {
        return _stakers[staker][validator].staked;
    }

    /**
    * @dev Returns how much staker has claimed over time
    */
    function userClaimHistory(address staker) public view returns (ClaimHistory memory) {
        return _claimHistory[staker];
    }

    /**
    * @dev Returns how much staker has earned
    */
    function userEarned(address staker, uint256 validator) public view returns (uint256) {
        uint256 currentlyEarned = _userEarned(staker, validator);
        uint256 previouslyEarned = _stakers[msg.sender][validator].earned;

        if (previouslyEarned > 0) return currentlyEarned.add(previouslyEarned);
        return currentlyEarned;
    }

    function _userEarned(address staker, uint256 validator) private view returns (uint256) {
        require(isStaking(staker, validator), "User is not staking.");

        uint256 staked = userStaked(staker, validator);
        uint256 stakersStartInSeconds = _stakers[staker][validator].start.div(1 seconds);
        uint256 blockTimestampInSeconds = block.timestamp.div(1 seconds);
        uint256 secondsStaked = blockTimestampInSeconds.sub(stakersStartInSeconds);

        uint256 earn = staked.mul(apr).div(100);
        uint256 rewardPerSec = earn.div(365).div(24).div(60).div(60);
        uint256 earned = rewardPerSec.mul(secondsStaked);

        return earned;
    }
 
    /**
    * @dev Stake tokens in validator
    */
    function stake(uint256 stakeAmount, uint256 validator) external isStakingEnabled {
        require(totalSupply() <= maxSupply, "There are no more rewards left to be claimed.");

        // Check user is registered as staker
        if (isStaking(msg.sender, validator)) {
            _stakers[msg.sender][validator].staked += stakeAmount;
            _stakers[msg.sender][validator].earned += _userEarned(msg.sender, validator);
            _stakers[msg.sender][validator].start = block.timestamp;
        } else {
            _stakers[msg.sender][validator] = Staker(msg.sender, block.timestamp, stakeAmount, 0);
        }

        validators[validator].staked += stakeAmount;
        totalStaked += stakeAmount;
        _burn(msg.sender, stakeAmount);
    }
    
    /**
    * @dev Claim earned tokens from stake in validator
    */
    function claim(uint256 validator) external isStakingEnabled {
        require(isStaking(msg.sender, validator), "You are not staking!?");
        require(totalSupply() <= maxSupply, "There are no more rewards left to be claimed.");

        uint256 reward = userEarned(msg.sender, validator);

        _claimHistory[msg.sender].dates.push(block.timestamp);
        _claimHistory[msg.sender].amounts.push(reward);
        totalClaimed += reward;

        _mint(msg.sender, reward);

        _stakers[msg.sender][validator].start = block.timestamp;
        _stakers[msg.sender][validator].earned = 0;
    }

    /**
    * @dev Claim earned and staked tokens from validator
    */
    function unstake(uint256 validator) external {
        require(isStaking(msg.sender, validator), "You are not staking!?");

        uint256 reward = userEarned(msg.sender, validator);

        if (totalSupply().add(reward) < maxSupply && stakingEnabled) {
            _claimHistory[msg.sender].dates.push(block.timestamp);
            _claimHistory[msg.sender].amounts.push(reward);
            totalClaimed += reward;

            _mint(msg.sender, _stakers[msg.sender][validator].staked.add(reward));
        } else {
            _mint(msg.sender, _stakers[msg.sender][validator].staked);
        }

        validators[validator].staked -= _stakers[msg.sender][validator].staked;
        totalStaked -= _stakers[msg.sender][validator].staked;

        delete _stakers[msg.sender][validator];
    }

    /**
    * @dev Creates validator 
    */
    function createValidator() external teamOROwner {
        Validator memory validator = Validator(block.timestamp, 0);
        validators.push(validator);
    }

    /**
    * @dev Returns amount of validators
    */
    function amountOfValidators() public view returns (uint256) {
        return validators.length;
    }

    /**
    * @dev Enables/disables staking
    */
    function setStakingState(bool onoff) external teamOROwner {
        stakingEnabled = onoff;
    }

    receive() external payable {}
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountOfValidators","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"apr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakerAddr","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"isStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setStakingState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"validatorFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"updateSwapTokensThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"userClaimHistory","outputs":[{"components":[{"internalType":"uint256[]","name":"dates","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct ValidatorSwarm.ClaimHistory","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"userEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"userStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"validators","outputs":[{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"staked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawContractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506000601960006101000a81548160ff0219169083151502179055506040518060400160405280600f81526020017f56616c696461746f7220537761726d00000000000000000000000000000000008152506040518060400160405280600681526020017f56535741524d00000000000000000000000000000000000000000000000000008152508160039080519060200190620000d9929190620008cc565b508060049080519060200190620000f2929190620008cc565b5050506200011562000109620004ff60201b60201c565b6200050760201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506001601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006002905060006001905060006003905060006c064f964e68233a76f52000000090506c0c9f2c9cd04674edea40000000600681905550606460018262000210919062000ae2565b6200021c919062000aaa565b600a81905550606460018262000233919062000ae2565b6200023f919062000aaa565b600b819055506103e860018262000257919062000ae2565b62000263919062000aaa565b600c8190555083600f819055508260108190555081601181905550601154601054600f5462000293919062000a4d565b6200029f919062000a4d565b600e81905550620002b5620005cd60201b60201c565b600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200031762000309620005cd60201b60201c565b6001620005f760201b60201c565b6200032a306001620005f760201b60201c565b6200033f61dead6001620005f760201b60201c565b6001601c600062000355620005cd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601c60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601c600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555030601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555030601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506032601881905550620004f433826200074960201b60201c565b505050505062000c88565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62000607620004ff60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480620006ac57506200066e620004ff60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000694620005cd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16145b620006ee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006e590620009db565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620007bc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007b390620009fd565b60405180910390fd5b620007d060008383620008c260201b60201c565b8060026000828254620007e4919062000a4d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200083b919062000a4d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620008a2919062000a1f565b60405180910390a3620008be60008383620008c760201b60201c565b5050565b505050565b505050565b828054620008da9062000b4d565b90600052602060002090601f016020900481019282620008fe57600085556200094a565b82601f106200091957805160ff19168380011785556200094a565b828001600101855582156200094a579182015b82811115620009495782518255916020019190600101906200092c565b5b5090506200095991906200095d565b5090565b5b80821115620009785760008160009055506001016200095e565b5090565b60006200098b60358362000a3c565b9150620009988262000c10565b604082019050919050565b6000620009b2601f8362000a3c565b9150620009bf8262000c5f565b602082019050919050565b620009d58162000b43565b82525050565b60006020820190508181036000830152620009f6816200097c565b9050919050565b6000602082019050818103600083015262000a1881620009a3565b9050919050565b600060208201905062000a366000830184620009ca565b92915050565b600082825260208201905092915050565b600062000a5a8262000b43565b915062000a678362000b43565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000a9f5762000a9e62000b83565b5b828201905092915050565b600062000ab78262000b43565b915062000ac48362000b43565b92508262000ad75762000ad662000bb2565b5b828204905092915050565b600062000aef8262000b43565b915062000afc8362000b43565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000b385762000b3762000b83565b5b828202905092915050565b6000819050919050565b6000600282049050600182168062000b6657607f821691505b6020821081141562000b7d5762000b7c62000be1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660008201527f65722061646472657373206e6f72206f776e65722e0000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b615c4c8062000c986000396000f3fe60806040526004361061028c5760003560e01c8063715018a61161015a578063c0246668116100c1578063d5abeb011161007a578063d5abeb01146109f4578063dd62ed3e14610a1f578063df778d2614610a5c578063f2fde38b14610a73578063f7c618c114610a9c578063f8b45b0514610ac757610293565b8063c02466681461090a578063c69bebe414610933578063c8c8ebe41461095c578063cef8513914610987578063d125ca18146109b2578063d54ad2a1146109c957610293565b80638baa63b2116101135780638baa63b2146107c05780638da5cb5b146107fd57806395d89b4114610828578063a39b215314610853578063a457c2d714610890578063a9059cbb146108cd57610293565b8063715018a6146106fc57806372f702f314610713578063751039fc1461073e5780637b0472f014610755578063817b1cd21461077e5780638a8c523c146107a957610293565b8063379607f5116101fe5780634ada218b116101b75780634ada218b146105c45780634fbee193146105ef57806357ded9c91461062c578063590654e9146106575780636ceb23a11461068257806370a08231146106bf57610293565b8063379607f5146104b657806339509351146104df5780633b51e5cf1461051c5780633dd5b2da146105455780634093e7d51461055c5780634a62bb651461059957610293565b80632242908511610250578063224290851461038157806323b872dd146103aa578063245fc1ba146103e75780632e17de7814610424578063313ce5671461044d57806335aa2e441461047857610293565b806306fdde0314610298578063095ea7b3146102c357806313114a9d1461030057806318160ddd1461032b5780631cfff51b1461035657610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610af2565b6040516102ba9190614d28565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e591906145b1565b610b84565b6040516102f79190614d0d565b60405180910390f35b34801561030c57600080fd5b50610315610ba7565b60405161032291906150ac565b60405180910390f35b34801561033757600080fd5b50610340610bad565b60405161034d91906150ac565b60405180910390f35b34801561036257600080fd5b5061036b610bb7565b6040516103789190614d0d565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a3919061468b565b610bca565b005b3480156103b657600080fd5b506103d160048036038101906103cc919061451e565b610cc9565b6040516103de9190614d0d565b60405180910390f35b3480156103f357600080fd5b5061040e600480360381019061040991906145b1565b610cf8565b60405161041b9190614d0d565b60405180910390f35b34801561043057600080fd5b5061044b6004803603810190610446919061461e565b610da4565b005b34801561045957600080fd5b50610462611184565b60405161046f919061514a565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a919061461e565b61118d565b6040516104ad929190615121565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d8919061461e565b6111c1565b005b3480156104eb57600080fd5b50610506600480360381019061050191906145b1565b61145d565b6040516105139190614d0d565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e91906145f1565b611507565b005b34801561055157600080fd5b5061055a6115ff565b005b34801561056857600080fd5b50610583600480360381019061057e91906145b1565b61166a565b60405161059091906150ac565b60405180910390f35b3480156105a557600080fd5b506105ae611702565b6040516105bb9190614d0d565b60405180910390f35b3480156105d057600080fd5b506105d9611715565b6040516105e69190614d0d565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190614484565b611728565b6040516106239190614d0d565b60405180910390f35b34801561063857600080fd5b5061064161177e565b60405161064e91906150ac565b60405180910390f35b34801561066357600080fd5b5061066c611784565b60405161067991906150ac565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a49190614484565b611791565b6040516106b6919061508a565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190614484565b61189a565b6040516106f391906150ac565b60405180910390f35b34801561070857600080fd5b506107116118e2565b005b34801561071f57600080fd5b5061072861196a565b6040516107359190614c91565b60405180910390f35b34801561074a57600080fd5b50610753611990565b005b34801561076157600080fd5b5061077c6004803603810190610777919061464b565b611a88565b005b34801561078a57600080fd5b50610793611dc0565b6040516107a091906150ac565b60405180910390f35b3480156107b557600080fd5b506107be611dc6565b005b3480156107cc57600080fd5b506107e760048036038101906107e2919061461e565b611f0e565b6040516107f49190614d0d565b60405180910390f35b34801561080957600080fd5b506108126120c2565b60405161081f9190614c91565b60405180910390f35b34801561083457600080fd5b5061083d6120ec565b60405161084a9190614d28565b60405180910390f35b34801561085f57600080fd5b5061087a600480360381019061087591906145b1565b61217e565b60405161088791906150ac565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b291906145b1565b6121dc565b6040516108c49190614d0d565b60405180910390f35b3480156108d957600080fd5b506108f460048036038101906108ef91906145b1565b6122c6565b6040516109019190614d0d565b60405180910390f35b34801561091657600080fd5b50610931600480360381019061092c9190614571565b6122e9565b005b34801561093f57600080fd5b5061095a60048036038101906109559190614484565b61241f565b005b34801561096857600080fd5b5061097161253e565b60405161097e91906150ac565b60405180910390f35b34801561099357600080fd5b5061099c612544565b6040516109a991906150ac565b60405180910390f35b3480156109be57600080fd5b506109c761254a565b005b3480156109d557600080fd5b506109de612684565b6040516109eb91906150ac565b60405180910390f35b348015610a0057600080fd5b50610a0961268a565b604051610a1691906150ac565b60405180910390f35b348015610a2b57600080fd5b50610a466004803603810190610a4191906144de565b612690565b604051610a5391906150ac565b60405180910390f35b348015610a6857600080fd5b50610a71612717565b005b348015610a7f57600080fd5b50610a9a6004803603810190610a959190614484565b612805565b005b348015610aa857600080fd5b50610ab16128fd565b604051610abe9190614c91565b60405180910390f35b348015610ad357600080fd5b50610adc612923565b604051610ae991906150ac565b60405180910390f35b606060038054610b01906153a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d906153a2565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905090565b600080610b8f612929565b9050610b9c818585612931565b600191505092915050565b600e5481565b6000600254905090565b601960009054906101000a900460ff1681565b610bd2612929565b73ffffffffffffffffffffffffffffffffffffffff16610bf06120c2565b73ffffffffffffffffffffffffffffffffffffffff1614610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d90614f4a565b60405180910390fd5b82600f819055508160108190555080601181905550601154601054600f54610c6e91906151f3565b610c7891906151f3565b600e819055506006600e541115610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90614e8a565b60405180910390fd5b505050565b600080610cd4612929565b9050610ce1858285612afc565b610cec858585612b88565b60019150509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff16601f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b610dae3382610cf8565b610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490614f6a565b60405180910390fd5b6000610df9338361166a565b9050600654610e1882610e0a610bad565b61363a90919063ffffffff16565b108015610e315750601960009054906101000a900460ff165b15610f9557602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a6000828254610f1a91906151f3565b92505081905550610f9033610f8b83601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015461363a90919063ffffffff16565b613650565b610ff3565b610ff233601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060020154613650565b5b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201546021838154811061105b5761105a615461565b5b9060005260206000209060020201600101600082825461107b91906152d4565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154601560008282546110e791906152d4565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055600382016000905550505050565b60006012905090565b6021818154811061119d57600080fd5b90600052602060002090600202016000915090508060000154908060010154905082565b601960009054906101000a900460ff16611210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120790614f2a565b60405180910390fd5b61121a3382610cf8565b611259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125090614f6a565b60405180910390fd5b600654611264610bad565b11156112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c90614d8a565b60405180910390fd5b60006112b1338361166a565b9050602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a600082825461139791906151f3565b925050819055506113a83382613650565b42601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600101819055506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600301819055505050565b600080611468612929565b90506114fc818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114f791906151f3565b612931565b600191505092915050565b61150f612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806115a3575061156d612929565b73ffffffffffffffffffffffffffffffffffffffff1661158b6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6115e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d990614eaa565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611667573d6000803e3d6000fd5b50565b60008061167784846137b0565b90506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060030154905060008111156116f6576116ed818361363a90919063ffffffff16565b925050506116fc565b81925050505b92915050565b600d60009054906101000a900460ff1681565b600d60019054906101000a900460ff1681565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60185481565b6000602180549050905090565b611799614401565b602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820180548060200260200160405190810160405280929190818152602001828054801561183257602002820191906000526020600020905b81548152602001906001019080831161181e575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561188a57602002820191906000526020600020905b815481526020019060010190808311611876575b5050505050815250509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118ea612929565b73ffffffffffffffffffffffffffffffffffffffff166119086120c2565b73ffffffffffffffffffffffffffffffffffffffff161461195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590614f4a565b60405180910390fd5b6119686000613948565b565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611998612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611a2c57506119f6612929565b73ffffffffffffffffffffffffffffffffffffffff16611a146120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b611a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6290614eaa565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b601960009054906101000a900460ff16611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90614f2a565b60405180910390fd5b600654611ae2610bad565b1115611b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1a90614d8a565b60405180910390fd5b611b2d3382610cf8565b15611c6c5781601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206002016000828254611b9591906151f3565b92505081905550611ba633826137b0565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206003016000828254611c0891906151f3565b9250508190555042601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010181905550611d5d565b60405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018381526020016000815250601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301559050505b8160218281548110611d7257611d71615461565b5b90600052602060002090600202016001016000828254611d9291906151f3565b925050819055508160156000828254611dab91906151f3565b92505081905550611dbc3383613a0e565b5050565b60155481565b611dce612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611e625750611e2c612929565b73ffffffffffffffffffffffffffffffffffffffff16611e4a6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9890614eaa565b60405180910390fd5b600d60019054906101000a900460ff1615611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee890614f0a565b60405180910390fd5b6001600d60016101000a81548160ff021916908315150217905550565b6000611f18612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611fac5750611f76612929565b73ffffffffffffffffffffffffffffffffffffffff16611f946120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614eaa565b60405180910390fd5b620186a06001611ff9610bad565b612003919061527a565b61200d9190615249565b82101561204f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204690614e6a565b60405180910390fd5b6103e8600561205c610bad565b612066919061527a565b6120709190615249565b8211156120b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a990614e4a565b60405180910390fd5b81600c8190555060019050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546120fb906153a2565b80601f0160208091040260200160405190810160405280929190818152602001828054612127906153a2565b80156121745780601f1061214957610100808354040283529160200191612174565b820191906000526020600020905b81548152906001019060200180831161215757829003601f168201915b5050505050905090565b6000601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154905092915050565b6000806121e7612929565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156122ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a49061504a565b60405180910390fd5b6122ba8286868403612931565b60019250505092915050565b6000806122d1612929565b90506122de818585612b88565b600191505092915050565b6122f1612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612385575061234f612929565b73ffffffffffffffffffffffffffffffffffffffff1661236d6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb90614eaa565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612427612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806124bb5750612485612929565b73ffffffffffffffffffffffffffffffffffffffff166124a36120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6124fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f190614eaa565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600c5481565b612552612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806125e657506125b0612929565b73ffffffffffffffffffffffffffffffffffffffff166125ce6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b612625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261c90614eaa565b60405180910390fd5b600060405180604001604052804281526020016000815250905060218190806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505050565b601a5481565b60065481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61271f612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806127b3575061277d612929565b73ffffffffffffffffffffffffffffffffffffffff1661279b6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6127f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e990614eaa565b60405180910390fd5b6128036127fe3061189a565b613be5565b565b61280d612929565b73ffffffffffffffffffffffffffffffffffffffff1661282b6120c2565b73ffffffffffffffffffffffffffffffffffffffff1614612881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287890614f4a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e890614dca565b60405180910390fd5b6128fa81613948565b50565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299890614fea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0890614dea565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612aef91906150ac565b60405180910390a3505050565b6000612b088484612690565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612b825781811015612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90614e0a565b60405180910390fd5b612b818484848403612931565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bef90614fca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5f90614d6a565b60405180910390fd5b6000811415612c8257612c7d83836000613e37565b613635565b600d60009054906101000a900460ff161561325457612c9f6120c2565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d0d5750612cdd6120c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d47575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d605750600860149054906101000a900460ff16155b1561325357612d6d6120c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015612df65750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612e505750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612f6a57600d60019054906101000a900460ff16612ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9b90614eea565b60405180910390fd5b43601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1c90614eca565b60405180910390fd5b43601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561300d5750601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130b457600a54811115613057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304e9061500a565b60405180910390fd5b600b546130638361189a565b8261306e91906151f3565b11156130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a69061502a565b60405180910390fd5b613252565b601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156131575750601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156131a657600a548111156131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614faa565b60405180910390fd5b613251565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661325057600b546132038361189a565b8261320e91906151f3565b111561324f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132469061502a565b60405180910390fd5b5b5b5b5b5b600061325f3061189a565b90506000600c5482101590508080156132855750600860149054906101000a900460ff16155b80156132db5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133315750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133875750601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156133cb576001600860146101000a81548160ff0219169083151502179055506133af6140b8565b6000600860146101000a81548160ff0219169083151502179055505b6000600860149054906101000a900460ff16159050601b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806134815750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061352c5750601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561352b5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b1561353657600090505b60008115613625576135666064613558600e54886142a690919063ffffffff16565b6142bc90919063ffffffff16565b9050600e5460105482613579919061527a565b6135839190615249565b6013600082825461359491906151f3565b92505081905550600e54601154826135ac919061527a565b6135b69190615249565b601460008282546135c791906151f3565b92505081905550600e54600f54826135df919061527a565b6135e99190615249565b601260008282546135fa91906151f3565b92505081905550600081111561361657613615873083613e37565b5b808561362291906152d4565b94505b613630878787613e37565b505050505b505050565b6000818361364891906151f3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b79061506a565b60405180910390fd5b6136cc600083836142d2565b80600260008282546136de91906151f3565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461373391906151f3565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161379891906150ac565b60405180910390a36137ac600083836142d7565b5050565b60006137bc8383610cf8565b6137fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f290614d4a565b60405180910390fd5b6000613807848461217e565b905060006138726001601f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600101546142bc90919063ffffffff16565b9050600061388a6001426142bc90919063ffffffff16565b905060006138a183836142dc90919063ffffffff16565b905060006138cd60646138bf601854886142a690919063ffffffff16565b6142bc90919063ffffffff16565b9050600061391f603c613911603c61390360186138f561016d896142bc90919063ffffffff16565b6142bc90919063ffffffff16565b6142bc90919063ffffffff16565b6142bc90919063ffffffff16565b9050600061393684836142a690919063ffffffff16565b90508097505050505050505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7590614f8a565b60405180910390fd5b613a8a826000836142d2565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0790614daa565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254613b6791906152d4565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613bcc91906150ac565b60405180910390a3613be0836000846142d7565b505050565b6000600267ffffffffffffffff811115613c0257613c01615490565b5b604051908082528060200260200182016040528015613c305781602001602082028036833780820191505090505b5090503081600081518110613c4857613c47615461565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613cea57600080fd5b505afa158015613cfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d2291906144b1565b81600181518110613d3657613d35615461565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613d9d30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612931565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613e019594939291906150c7565b600060405180830381600087803b158015613e1b57600080fd5b505af1158015613e2f573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e9e90614fca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f0e90614d6a565b60405180910390fd5b613f228383836142d2565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f9f90614e2a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461403b91906151f3565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161409f91906150ac565b60405180910390a36140b28484846142d7565b50505050565b60006140c33061189a565b905060006014546012546013546140da91906151f3565b6140e491906151f3565b905060008214806140f55750600081145b156141015750506142a4565b600c5482111561411157600c5491505b600060028260135485614124919061527a565b61412e9190615249565b6141389190615249565b9050600061414f82856142dc90919063ffffffff16565b9050600047905061415f82613be5565b600061417482476142dc90919063ffffffff16565b9050600061419f86614191601254856142a690919063ffffffff16565b6142bc90919063ffffffff16565b905060006141ca876141bc601454866142a690919063ffffffff16565b6142bc90919063ffffffff16565b905060008183856141db91906152d4565b6141e591906152d4565b9050600060138190555060006012819055506000601481905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61424e848661363a90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015614279573d6000803e3d6000fd5b5060008711801561428a5750600081115b1561429a5761429987826142f2565b5b5050505050505050505b565b600081836142b4919061527a565b905092915050565b600081836142ca9190615249565b905092915050565b505050565b505050565b600081836142ea91906152d4565b905092915050565b61431f30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612931565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b81526004016143a896959493929190614cac565b6060604051808303818588803b1580156143c157600080fd5b505af11580156143d5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906143fa91906146de565b5050505050565b604051806040016040528060608152602001606081525090565b60008135905061442a81615bd1565b92915050565b60008151905061443f81615bd1565b92915050565b60008135905061445481615be8565b92915050565b60008135905061446981615bff565b92915050565b60008151905061447e81615bff565b92915050565b60006020828403121561449a576144996154bf565b5b60006144a88482850161441b565b91505092915050565b6000602082840312156144c7576144c66154bf565b5b60006144d584828501614430565b91505092915050565b600080604083850312156144f5576144f46154bf565b5b60006145038582860161441b565b92505060206145148582860161441b565b9150509250929050565b600080600060608486031215614537576145366154bf565b5b60006145458682870161441b565b93505060206145568682870161441b565b92505060406145678682870161445a565b9150509250925092565b60008060408385031215614588576145876154bf565b5b60006145968582860161441b565b92505060206145a785828601614445565b9150509250929050565b600080604083850312156145c8576145c76154bf565b5b60006145d68582860161441b565b92505060206145e78582860161445a565b9150509250929050565b600060208284031215614607576146066154bf565b5b600061461584828501614445565b91505092915050565b600060208284031215614634576146336154bf565b5b60006146428482850161445a565b91505092915050565b60008060408385031215614662576146616154bf565b5b60006146708582860161445a565b92505060206146818582860161445a565b9150509250929050565b6000806000606084860312156146a4576146a36154bf565b5b60006146b28682870161445a565b93505060206146c38682870161445a565b92505060406146d48682870161445a565b9150509250925092565b6000806000606084860312156146f7576146f66154bf565b5b60006147058682870161446f565b93505060206147168682870161446f565b92505060406147278682870161446f565b9150509250925092565b600061473d8383614761565b60208301905092915050565b60006147558383614c64565b60208301905092915050565b61476a81615308565b82525050565b61477981615308565b82525050565b600061478a82615185565b61479481856151c0565b935061479f83615165565b8060005b838110156147d05781516147b78882614731565b97506147c2836151a6565b9250506001810190506147a3565b5085935050505092915050565b60006147e882615190565b6147f281856151d1565b93506147fd83615175565b8060005b8381101561482e5781516148158882614749565b9750614820836151b3565b925050600181019050614801565b5085935050505092915050565b6148448161531a565b82525050565b6148538161535d565b82525050565b60006148648261519b565b61486e81856151e2565b935061487e81856020860161536f565b614887816154c4565b840191505092915050565b600061489f6014836151e2565b91506148aa826154d5565b602082019050919050565b60006148c26023836151e2565b91506148cd826154fe565b604082019050919050565b60006148e5602d836151e2565b91506148f08261554d565b604082019050919050565b60006149086022836151e2565b91506149138261559c565b604082019050919050565b600061492b6026836151e2565b9150614936826155eb565b604082019050919050565b600061494e6022836151e2565b91506149598261563a565b604082019050919050565b6000614971601d836151e2565b915061497c82615689565b602082019050919050565b60006149946026836151e2565b915061499f826156b2565b604082019050919050565b60006149b76037836151e2565b91506149c282615701565b604082019050919050565b60006149da6038836151e2565b91506149e582615750565b604082019050919050565b60006149fd601c836151e2565b9150614a088261579f565b602082019050919050565b6000614a206035836151e2565b9150614a2b826157c8565b604082019050919050565b6000614a436049836151e2565b9150614a4e82615817565b606082019050919050565b6000614a666017836151e2565b9150614a718261588c565b602082019050919050565b6000614a896015836151e2565b9150614a94826158b5565b602082019050919050565b6000614aac6017836151e2565b9150614ab7826158de565b602082019050919050565b6000614acf6020836151e2565b9150614ada82615907565b602082019050919050565b6000614af26015836151e2565b9150614afd82615930565b602082019050919050565b6000614b156021836151e2565b9150614b2082615959565b604082019050919050565b6000614b386042836151e2565b9150614b43826159a8565b606082019050919050565b6000614b5b6025836151e2565b9150614b6682615a1d565b604082019050919050565b6000614b7e6024836151e2565b9150614b8982615a6c565b604082019050919050565b6000614ba16041836151e2565b9150614bac82615abb565b606082019050919050565b6000614bc4601f836151e2565b9150614bcf82615b30565b602082019050919050565b6000614be76025836151e2565b9150614bf282615b59565b604082019050919050565b6000614c0a601f836151e2565b9150614c1582615ba8565b602082019050919050565b60006040830160008301518482036000860152614c3d82826147dd565b91505060208301518482036020860152614c5782826147dd565b9150508091505092915050565b614c6d81615346565b82525050565b614c7c81615346565b82525050565b614c8b81615350565b82525050565b6000602082019050614ca66000830184614770565b92915050565b600060c082019050614cc16000830189614770565b614cce6020830188614c73565b614cdb604083018761484a565b614ce8606083018661484a565b614cf56080830185614770565b614d0260a0830184614c73565b979650505050505050565b6000602082019050614d22600083018461483b565b92915050565b60006020820190508181036000830152614d428184614859565b905092915050565b60006020820190508181036000830152614d6381614892565b9050919050565b60006020820190508181036000830152614d83816148b5565b9050919050565b60006020820190508181036000830152614da3816148d8565b9050919050565b60006020820190508181036000830152614dc3816148fb565b9050919050565b60006020820190508181036000830152614de38161491e565b9050919050565b60006020820190508181036000830152614e0381614941565b9050919050565b60006020820190508181036000830152614e2381614964565b9050919050565b60006020820190508181036000830152614e4381614987565b9050919050565b60006020820190508181036000830152614e63816149aa565b9050919050565b60006020820190508181036000830152614e83816149cd565b9050919050565b60006020820190508181036000830152614ea3816149f0565b9050919050565b60006020820190508181036000830152614ec381614a13565b9050919050565b60006020820190508181036000830152614ee381614a36565b9050919050565b60006020820190508181036000830152614f0381614a59565b9050919050565b60006020820190508181036000830152614f2381614a7c565b9050919050565b60006020820190508181036000830152614f4381614a9f565b9050919050565b60006020820190508181036000830152614f6381614ac2565b9050919050565b60006020820190508181036000830152614f8381614ae5565b9050919050565b60006020820190508181036000830152614fa381614b08565b9050919050565b60006020820190508181036000830152614fc381614b2b565b9050919050565b60006020820190508181036000830152614fe381614b4e565b9050919050565b6000602082019050818103600083015261500381614b71565b9050919050565b6000602082019050818103600083015261502381614b94565b9050919050565b6000602082019050818103600083015261504381614bb7565b9050919050565b6000602082019050818103600083015261506381614bda565b9050919050565b6000602082019050818103600083015261508381614bfd565b9050919050565b600060208201905081810360008301526150a48184614c20565b905092915050565b60006020820190506150c16000830184614c73565b92915050565b600060a0820190506150dc6000830188614c73565b6150e9602083018761484a565b81810360408301526150fb818661477f565b905061510a6060830185614770565b6151176080830184614c73565b9695505050505050565b60006040820190506151366000830185614c73565b6151436020830184614c73565b9392505050565b600060208201905061515f6000830184614c82565b92915050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006151fe82615346565b915061520983615346565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561523e5761523d6153d4565b5b828201905092915050565b600061525482615346565b915061525f83615346565b92508261526f5761526e615403565b5b828204905092915050565b600061528582615346565b915061529083615346565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152c9576152c86153d4565b5b828202905092915050565b60006152df82615346565b91506152ea83615346565b9250828210156152fd576152fc6153d4565b5b828203905092915050565b600061531382615326565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061536882615346565b9050919050565b60005b8381101561538d578082015181840152602081019050615372565b8381111561539c576000848401525b50505050565b600060028204905060018216806153ba57607f821691505b602082108114156153ce576153cd615432565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f55736572206973206e6f74207374616b696e672e000000000000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f546865726520617265206e6f206d6f72652072657761726473206c656674207460008201527f6f20626520636c61696d65642e00000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f53776170207468726573686f6c642063616e6e6f74206265206869676865722060008201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000602082015250565b7f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460008201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000602082015250565b7f4d757374206b6565702066656573206174203625206f72206c65737300000000600082015250565b7f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660008201527f65722061646472657373206e6f72206f776e65722e0000000000000000000000602082015250565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b7f54726164696e67206973206e6f7420656e61626c65642e000000000000000000600082015250565b7f43616e206f6e6c7920656e61626c65206f6e63652e0000000000000000000000600082015250565b7f5374616b696e67206973206e6f7420656e61626c65642e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f7520617265206e6f74207374616b696e67213f0000000000000000000000600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460008201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e60208201527f742e000000000000000000000000000000000000000000000000000000000000604082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060008201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e7460208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b7f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b615bda81615308565b8114615be557600080fd5b50565b615bf18161531a565b8114615bfc57600080fd5b50565b615c0881615346565b8114615c1357600080fd5b5056fea2646970667358221220e3735902f995326fcd605c90007226809c414eeae3fe70ecddbae12387e2291d64736f6c63430008070033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c8063715018a61161015a578063c0246668116100c1578063d5abeb011161007a578063d5abeb01146109f4578063dd62ed3e14610a1f578063df778d2614610a5c578063f2fde38b14610a73578063f7c618c114610a9c578063f8b45b0514610ac757610293565b8063c02466681461090a578063c69bebe414610933578063c8c8ebe41461095c578063cef8513914610987578063d125ca18146109b2578063d54ad2a1146109c957610293565b80638baa63b2116101135780638baa63b2146107c05780638da5cb5b146107fd57806395d89b4114610828578063a39b215314610853578063a457c2d714610890578063a9059cbb146108cd57610293565b8063715018a6146106fc57806372f702f314610713578063751039fc1461073e5780637b0472f014610755578063817b1cd21461077e5780638a8c523c146107a957610293565b8063379607f5116101fe5780634ada218b116101b75780634ada218b146105c45780634fbee193146105ef57806357ded9c91461062c578063590654e9146106575780636ceb23a11461068257806370a08231146106bf57610293565b8063379607f5146104b657806339509351146104df5780633b51e5cf1461051c5780633dd5b2da146105455780634093e7d51461055c5780634a62bb651461059957610293565b80632242908511610250578063224290851461038157806323b872dd146103aa578063245fc1ba146103e75780632e17de7814610424578063313ce5671461044d57806335aa2e441461047857610293565b806306fdde0314610298578063095ea7b3146102c357806313114a9d1461030057806318160ddd1461032b5780631cfff51b1461035657610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610af2565b6040516102ba9190614d28565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e591906145b1565b610b84565b6040516102f79190614d0d565b60405180910390f35b34801561030c57600080fd5b50610315610ba7565b60405161032291906150ac565b60405180910390f35b34801561033757600080fd5b50610340610bad565b60405161034d91906150ac565b60405180910390f35b34801561036257600080fd5b5061036b610bb7565b6040516103789190614d0d565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a3919061468b565b610bca565b005b3480156103b657600080fd5b506103d160048036038101906103cc919061451e565b610cc9565b6040516103de9190614d0d565b60405180910390f35b3480156103f357600080fd5b5061040e600480360381019061040991906145b1565b610cf8565b60405161041b9190614d0d565b60405180910390f35b34801561043057600080fd5b5061044b6004803603810190610446919061461e565b610da4565b005b34801561045957600080fd5b50610462611184565b60405161046f919061514a565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a919061461e565b61118d565b6040516104ad929190615121565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d8919061461e565b6111c1565b005b3480156104eb57600080fd5b50610506600480360381019061050191906145b1565b61145d565b6040516105139190614d0d565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e91906145f1565b611507565b005b34801561055157600080fd5b5061055a6115ff565b005b34801561056857600080fd5b50610583600480360381019061057e91906145b1565b61166a565b60405161059091906150ac565b60405180910390f35b3480156105a557600080fd5b506105ae611702565b6040516105bb9190614d0d565b60405180910390f35b3480156105d057600080fd5b506105d9611715565b6040516105e69190614d0d565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190614484565b611728565b6040516106239190614d0d565b60405180910390f35b34801561063857600080fd5b5061064161177e565b60405161064e91906150ac565b60405180910390f35b34801561066357600080fd5b5061066c611784565b60405161067991906150ac565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a49190614484565b611791565b6040516106b6919061508a565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190614484565b61189a565b6040516106f391906150ac565b60405180910390f35b34801561070857600080fd5b506107116118e2565b005b34801561071f57600080fd5b5061072861196a565b6040516107359190614c91565b60405180910390f35b34801561074a57600080fd5b50610753611990565b005b34801561076157600080fd5b5061077c6004803603810190610777919061464b565b611a88565b005b34801561078a57600080fd5b50610793611dc0565b6040516107a091906150ac565b60405180910390f35b3480156107b557600080fd5b506107be611dc6565b005b3480156107cc57600080fd5b506107e760048036038101906107e2919061461e565b611f0e565b6040516107f49190614d0d565b60405180910390f35b34801561080957600080fd5b506108126120c2565b60405161081f9190614c91565b60405180910390f35b34801561083457600080fd5b5061083d6120ec565b60405161084a9190614d28565b60405180910390f35b34801561085f57600080fd5b5061087a600480360381019061087591906145b1565b61217e565b60405161088791906150ac565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b291906145b1565b6121dc565b6040516108c49190614d0d565b60405180910390f35b3480156108d957600080fd5b506108f460048036038101906108ef91906145b1565b6122c6565b6040516109019190614d0d565b60405180910390f35b34801561091657600080fd5b50610931600480360381019061092c9190614571565b6122e9565b005b34801561093f57600080fd5b5061095a60048036038101906109559190614484565b61241f565b005b34801561096857600080fd5b5061097161253e565b60405161097e91906150ac565b60405180910390f35b34801561099357600080fd5b5061099c612544565b6040516109a991906150ac565b60405180910390f35b3480156109be57600080fd5b506109c761254a565b005b3480156109d557600080fd5b506109de612684565b6040516109eb91906150ac565b60405180910390f35b348015610a0057600080fd5b50610a0961268a565b604051610a1691906150ac565b60405180910390f35b348015610a2b57600080fd5b50610a466004803603810190610a4191906144de565b612690565b604051610a5391906150ac565b60405180910390f35b348015610a6857600080fd5b50610a71612717565b005b348015610a7f57600080fd5b50610a9a6004803603810190610a959190614484565b612805565b005b348015610aa857600080fd5b50610ab16128fd565b604051610abe9190614c91565b60405180910390f35b348015610ad357600080fd5b50610adc612923565b604051610ae991906150ac565b60405180910390f35b606060038054610b01906153a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d906153a2565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905090565b600080610b8f612929565b9050610b9c818585612931565b600191505092915050565b600e5481565b6000600254905090565b601960009054906101000a900460ff1681565b610bd2612929565b73ffffffffffffffffffffffffffffffffffffffff16610bf06120c2565b73ffffffffffffffffffffffffffffffffffffffff1614610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d90614f4a565b60405180910390fd5b82600f819055508160108190555080601181905550601154601054600f54610c6e91906151f3565b610c7891906151f3565b600e819055506006600e541115610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90614e8a565b60405180910390fd5b505050565b600080610cd4612929565b9050610ce1858285612afc565b610cec858585612b88565b60019150509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff16601f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b610dae3382610cf8565b610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490614f6a565b60405180910390fd5b6000610df9338361166a565b9050600654610e1882610e0a610bad565b61363a90919063ffffffff16565b108015610e315750601960009054906101000a900460ff165b15610f9557602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a6000828254610f1a91906151f3565b92505081905550610f9033610f8b83601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015461363a90919063ffffffff16565b613650565b610ff3565b610ff233601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060020154613650565b5b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201546021838154811061105b5761105a615461565b5b9060005260206000209060020201600101600082825461107b91906152d4565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154601560008282546110e791906152d4565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055600382016000905550505050565b60006012905090565b6021818154811061119d57600080fd5b90600052602060002090600202016000915090508060000154908060010154905082565b601960009054906101000a900460ff16611210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120790614f2a565b60405180910390fd5b61121a3382610cf8565b611259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125090614f6a565b60405180910390fd5b600654611264610bad565b11156112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c90614d8a565b60405180910390fd5b60006112b1338361166a565b9050602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a600082825461139791906151f3565b925050819055506113a83382613650565b42601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600101819055506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600301819055505050565b600080611468612929565b90506114fc818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114f791906151f3565b612931565b600191505092915050565b61150f612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806115a3575061156d612929565b73ffffffffffffffffffffffffffffffffffffffff1661158b6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6115e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d990614eaa565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611667573d6000803e3d6000fd5b50565b60008061167784846137b0565b90506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060030154905060008111156116f6576116ed818361363a90919063ffffffff16565b925050506116fc565b81925050505b92915050565b600d60009054906101000a900460ff1681565b600d60019054906101000a900460ff1681565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60185481565b6000602180549050905090565b611799614401565b602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820180548060200260200160405190810160405280929190818152602001828054801561183257602002820191906000526020600020905b81548152602001906001019080831161181e575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561188a57602002820191906000526020600020905b815481526020019060010190808311611876575b5050505050815250509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118ea612929565b73ffffffffffffffffffffffffffffffffffffffff166119086120c2565b73ffffffffffffffffffffffffffffffffffffffff161461195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590614f4a565b60405180910390fd5b6119686000613948565b565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611998612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611a2c57506119f6612929565b73ffffffffffffffffffffffffffffffffffffffff16611a146120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b611a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6290614eaa565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b601960009054906101000a900460ff16611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90614f2a565b60405180910390fd5b600654611ae2610bad565b1115611b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1a90614d8a565b60405180910390fd5b611b2d3382610cf8565b15611c6c5781601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206002016000828254611b9591906151f3565b92505081905550611ba633826137b0565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206003016000828254611c0891906151f3565b9250508190555042601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010181905550611d5d565b60405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018381526020016000815250601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301559050505b8160218281548110611d7257611d71615461565b5b90600052602060002090600202016001016000828254611d9291906151f3565b925050819055508160156000828254611dab91906151f3565b92505081905550611dbc3383613a0e565b5050565b60155481565b611dce612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611e625750611e2c612929565b73ffffffffffffffffffffffffffffffffffffffff16611e4a6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9890614eaa565b60405180910390fd5b600d60019054906101000a900460ff1615611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee890614f0a565b60405180910390fd5b6001600d60016101000a81548160ff021916908315150217905550565b6000611f18612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611fac5750611f76612929565b73ffffffffffffffffffffffffffffffffffffffff16611f946120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614eaa565b60405180910390fd5b620186a06001611ff9610bad565b612003919061527a565b61200d9190615249565b82101561204f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204690614e6a565b60405180910390fd5b6103e8600561205c610bad565b612066919061527a565b6120709190615249565b8211156120b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a990614e4a565b60405180910390fd5b81600c8190555060019050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546120fb906153a2565b80601f0160208091040260200160405190810160405280929190818152602001828054612127906153a2565b80156121745780601f1061214957610100808354040283529160200191612174565b820191906000526020600020905b81548152906001019060200180831161215757829003601f168201915b5050505050905090565b6000601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154905092915050565b6000806121e7612929565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156122ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a49061504a565b60405180910390fd5b6122ba8286868403612931565b60019250505092915050565b6000806122d1612929565b90506122de818585612b88565b600191505092915050565b6122f1612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612385575061234f612929565b73ffffffffffffffffffffffffffffffffffffffff1661236d6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb90614eaa565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612427612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806124bb5750612485612929565b73ffffffffffffffffffffffffffffffffffffffff166124a36120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6124fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f190614eaa565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600c5481565b612552612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806125e657506125b0612929565b73ffffffffffffffffffffffffffffffffffffffff166125ce6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b612625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261c90614eaa565b60405180910390fd5b600060405180604001604052804281526020016000815250905060218190806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505050565b601a5481565b60065481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61271f612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806127b3575061277d612929565b73ffffffffffffffffffffffffffffffffffffffff1661279b6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6127f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e990614eaa565b60405180910390fd5b6128036127fe3061189a565b613be5565b565b61280d612929565b73ffffffffffffffffffffffffffffffffffffffff1661282b6120c2565b73ffffffffffffffffffffffffffffffffffffffff1614612881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287890614f4a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e890614dca565b60405180910390fd5b6128fa81613948565b50565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299890614fea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0890614dea565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612aef91906150ac565b60405180910390a3505050565b6000612b088484612690565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612b825781811015612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90614e0a565b60405180910390fd5b612b818484848403612931565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bef90614fca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5f90614d6a565b60405180910390fd5b6000811415612c8257612c7d83836000613e37565b613635565b600d60009054906101000a900460ff161561325457612c9f6120c2565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d0d5750612cdd6120c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d47575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d605750600860149054906101000a900460ff16155b1561325357612d6d6120c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015612df65750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612e505750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612f6a57600d60019054906101000a900460ff16612ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9b90614eea565b60405180910390fd5b43601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1c90614eca565b60405180910390fd5b43601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561300d5750601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130b457600a54811115613057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304e9061500a565b60405180910390fd5b600b546130638361189a565b8261306e91906151f3565b11156130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a69061502a565b60405180910390fd5b613252565b601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156131575750601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156131a657600a548111156131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614faa565b60405180910390fd5b613251565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661325057600b546132038361189a565b8261320e91906151f3565b111561324f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132469061502a565b60405180910390fd5b5b5b5b5b5b600061325f3061189a565b90506000600c5482101590508080156132855750600860149054906101000a900460ff16155b80156132db5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133315750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133875750601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156133cb576001600860146101000a81548160ff0219169083151502179055506133af6140b8565b6000600860146101000a81548160ff0219169083151502179055505b6000600860149054906101000a900460ff16159050601b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806134815750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061352c5750601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561352b5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b1561353657600090505b60008115613625576135666064613558600e54886142a690919063ffffffff16565b6142bc90919063ffffffff16565b9050600e5460105482613579919061527a565b6135839190615249565b6013600082825461359491906151f3565b92505081905550600e54601154826135ac919061527a565b6135b69190615249565b601460008282546135c791906151f3565b92505081905550600e54600f54826135df919061527a565b6135e99190615249565b601260008282546135fa91906151f3565b92505081905550600081111561361657613615873083613e37565b5b808561362291906152d4565b94505b613630878787613e37565b505050505b505050565b6000818361364891906151f3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b79061506a565b60405180910390fd5b6136cc600083836142d2565b80600260008282546136de91906151f3565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461373391906151f3565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161379891906150ac565b60405180910390a36137ac600083836142d7565b5050565b60006137bc8383610cf8565b6137fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f290614d4a565b60405180910390fd5b6000613807848461217e565b905060006138726001601f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600101546142bc90919063ffffffff16565b9050600061388a6001426142bc90919063ffffffff16565b905060006138a183836142dc90919063ffffffff16565b905060006138cd60646138bf601854886142a690919063ffffffff16565b6142bc90919063ffffffff16565b9050600061391f603c613911603c61390360186138f561016d896142bc90919063ffffffff16565b6142bc90919063ffffffff16565b6142bc90919063ffffffff16565b6142bc90919063ffffffff16565b9050600061393684836142a690919063ffffffff16565b90508097505050505050505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7590614f8a565b60405180910390fd5b613a8a826000836142d2565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0790614daa565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254613b6791906152d4565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613bcc91906150ac565b60405180910390a3613be0836000846142d7565b505050565b6000600267ffffffffffffffff811115613c0257613c01615490565b5b604051908082528060200260200182016040528015613c305781602001602082028036833780820191505090505b5090503081600081518110613c4857613c47615461565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613cea57600080fd5b505afa158015613cfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d2291906144b1565b81600181518110613d3657613d35615461565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613d9d30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612931565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613e019594939291906150c7565b600060405180830381600087803b158015613e1b57600080fd5b505af1158015613e2f573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e9e90614fca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f0e90614d6a565b60405180910390fd5b613f228383836142d2565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f9f90614e2a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461403b91906151f3565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161409f91906150ac565b60405180910390a36140b28484846142d7565b50505050565b60006140c33061189a565b905060006014546012546013546140da91906151f3565b6140e491906151f3565b905060008214806140f55750600081145b156141015750506142a4565b600c5482111561411157600c5491505b600060028260135485614124919061527a565b61412e9190615249565b6141389190615249565b9050600061414f82856142dc90919063ffffffff16565b9050600047905061415f82613be5565b600061417482476142dc90919063ffffffff16565b9050600061419f86614191601254856142a690919063ffffffff16565b6142bc90919063ffffffff16565b905060006141ca876141bc601454866142a690919063ffffffff16565b6142bc90919063ffffffff16565b905060008183856141db91906152d4565b6141e591906152d4565b9050600060138190555060006012819055506000601481905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61424e848661363a90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015614279573d6000803e3d6000fd5b5060008711801561428a5750600081115b1561429a5761429987826142f2565b5b5050505050505050505b565b600081836142b4919061527a565b905092915050565b600081836142ca9190615249565b905092915050565b505050565b505050565b600081836142ea91906152d4565b905092915050565b61431f30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612931565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b81526004016143a896959493929190614cac565b6060604051808303818588803b1580156143c157600080fd5b505af11580156143d5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906143fa91906146de565b5050505050565b604051806040016040528060608152602001606081525090565b60008135905061442a81615bd1565b92915050565b60008151905061443f81615bd1565b92915050565b60008135905061445481615be8565b92915050565b60008135905061446981615bff565b92915050565b60008151905061447e81615bff565b92915050565b60006020828403121561449a576144996154bf565b5b60006144a88482850161441b565b91505092915050565b6000602082840312156144c7576144c66154bf565b5b60006144d584828501614430565b91505092915050565b600080604083850312156144f5576144f46154bf565b5b60006145038582860161441b565b92505060206145148582860161441b565b9150509250929050565b600080600060608486031215614537576145366154bf565b5b60006145458682870161441b565b93505060206145568682870161441b565b92505060406145678682870161445a565b9150509250925092565b60008060408385031215614588576145876154bf565b5b60006145968582860161441b565b92505060206145a785828601614445565b9150509250929050565b600080604083850312156145c8576145c76154bf565b5b60006145d68582860161441b565b92505060206145e78582860161445a565b9150509250929050565b600060208284031215614607576146066154bf565b5b600061461584828501614445565b91505092915050565b600060208284031215614634576146336154bf565b5b60006146428482850161445a565b91505092915050565b60008060408385031215614662576146616154bf565b5b60006146708582860161445a565b92505060206146818582860161445a565b9150509250929050565b6000806000606084860312156146a4576146a36154bf565b5b60006146b28682870161445a565b93505060206146c38682870161445a565b92505060406146d48682870161445a565b9150509250925092565b6000806000606084860312156146f7576146f66154bf565b5b60006147058682870161446f565b93505060206147168682870161446f565b92505060406147278682870161446f565b9150509250925092565b600061473d8383614761565b60208301905092915050565b60006147558383614c64565b60208301905092915050565b61476a81615308565b82525050565b61477981615308565b82525050565b600061478a82615185565b61479481856151c0565b935061479f83615165565b8060005b838110156147d05781516147b78882614731565b97506147c2836151a6565b9250506001810190506147a3565b5085935050505092915050565b60006147e882615190565b6147f281856151d1565b93506147fd83615175565b8060005b8381101561482e5781516148158882614749565b9750614820836151b3565b925050600181019050614801565b5085935050505092915050565b6148448161531a565b82525050565b6148538161535d565b82525050565b60006148648261519b565b61486e81856151e2565b935061487e81856020860161536f565b614887816154c4565b840191505092915050565b600061489f6014836151e2565b91506148aa826154d5565b602082019050919050565b60006148c26023836151e2565b91506148cd826154fe565b604082019050919050565b60006148e5602d836151e2565b91506148f08261554d565b604082019050919050565b60006149086022836151e2565b91506149138261559c565b604082019050919050565b600061492b6026836151e2565b9150614936826155eb565b604082019050919050565b600061494e6022836151e2565b91506149598261563a565b604082019050919050565b6000614971601d836151e2565b915061497c82615689565b602082019050919050565b60006149946026836151e2565b915061499f826156b2565b604082019050919050565b60006149b76037836151e2565b91506149c282615701565b604082019050919050565b60006149da6038836151e2565b91506149e582615750565b604082019050919050565b60006149fd601c836151e2565b9150614a088261579f565b602082019050919050565b6000614a206035836151e2565b9150614a2b826157c8565b604082019050919050565b6000614a436049836151e2565b9150614a4e82615817565b606082019050919050565b6000614a666017836151e2565b9150614a718261588c565b602082019050919050565b6000614a896015836151e2565b9150614a94826158b5565b602082019050919050565b6000614aac6017836151e2565b9150614ab7826158de565b602082019050919050565b6000614acf6020836151e2565b9150614ada82615907565b602082019050919050565b6000614af26015836151e2565b9150614afd82615930565b602082019050919050565b6000614b156021836151e2565b9150614b2082615959565b604082019050919050565b6000614b386042836151e2565b9150614b43826159a8565b606082019050919050565b6000614b5b6025836151e2565b9150614b6682615a1d565b604082019050919050565b6000614b7e6024836151e2565b9150614b8982615a6c565b604082019050919050565b6000614ba16041836151e2565b9150614bac82615abb565b606082019050919050565b6000614bc4601f836151e2565b9150614bcf82615b30565b602082019050919050565b6000614be76025836151e2565b9150614bf282615b59565b604082019050919050565b6000614c0a601f836151e2565b9150614c1582615ba8565b602082019050919050565b60006040830160008301518482036000860152614c3d82826147dd565b91505060208301518482036020860152614c5782826147dd565b9150508091505092915050565b614c6d81615346565b82525050565b614c7c81615346565b82525050565b614c8b81615350565b82525050565b6000602082019050614ca66000830184614770565b92915050565b600060c082019050614cc16000830189614770565b614cce6020830188614c73565b614cdb604083018761484a565b614ce8606083018661484a565b614cf56080830185614770565b614d0260a0830184614c73565b979650505050505050565b6000602082019050614d22600083018461483b565b92915050565b60006020820190508181036000830152614d428184614859565b905092915050565b60006020820190508181036000830152614d6381614892565b9050919050565b60006020820190508181036000830152614d83816148b5565b9050919050565b60006020820190508181036000830152614da3816148d8565b9050919050565b60006020820190508181036000830152614dc3816148fb565b9050919050565b60006020820190508181036000830152614de38161491e565b9050919050565b60006020820190508181036000830152614e0381614941565b9050919050565b60006020820190508181036000830152614e2381614964565b9050919050565b60006020820190508181036000830152614e4381614987565b9050919050565b60006020820190508181036000830152614e63816149aa565b9050919050565b60006020820190508181036000830152614e83816149cd565b9050919050565b60006020820190508181036000830152614ea3816149f0565b9050919050565b60006020820190508181036000830152614ec381614a13565b9050919050565b60006020820190508181036000830152614ee381614a36565b9050919050565b60006020820190508181036000830152614f0381614a59565b9050919050565b60006020820190508181036000830152614f2381614a7c565b9050919050565b60006020820190508181036000830152614f4381614a9f565b9050919050565b60006020820190508181036000830152614f6381614ac2565b9050919050565b60006020820190508181036000830152614f8381614ae5565b9050919050565b60006020820190508181036000830152614fa381614b08565b9050919050565b60006020820190508181036000830152614fc381614b2b565b9050919050565b60006020820190508181036000830152614fe381614b4e565b9050919050565b6000602082019050818103600083015261500381614b71565b9050919050565b6000602082019050818103600083015261502381614b94565b9050919050565b6000602082019050818103600083015261504381614bb7565b9050919050565b6000602082019050818103600083015261506381614bda565b9050919050565b6000602082019050818103600083015261508381614bfd565b9050919050565b600060208201905081810360008301526150a48184614c20565b905092915050565b60006020820190506150c16000830184614c73565b92915050565b600060a0820190506150dc6000830188614c73565b6150e9602083018761484a565b81810360408301526150fb818661477f565b905061510a6060830185614770565b6151176080830184614c73565b9695505050505050565b60006040820190506151366000830185614c73565b6151436020830184614c73565b9392505050565b600060208201905061515f6000830184614c82565b92915050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006151fe82615346565b915061520983615346565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561523e5761523d6153d4565b5b828201905092915050565b600061525482615346565b915061525f83615346565b92508261526f5761526e615403565b5b828204905092915050565b600061528582615346565b915061529083615346565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152c9576152c86153d4565b5b828202905092915050565b60006152df82615346565b91506152ea83615346565b9250828210156152fd576152fc6153d4565b5b828203905092915050565b600061531382615326565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061536882615346565b9050919050565b60005b8381101561538d578082015181840152602081019050615372565b8381111561539c576000848401525b50505050565b600060028204905060018216806153ba57607f821691505b602082108114156153ce576153cd615432565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f55736572206973206e6f74207374616b696e672e000000000000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f546865726520617265206e6f206d6f72652072657761726473206c656674207460008201527f6f20626520636c61696d65642e00000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f53776170207468726573686f6c642063616e6e6f74206265206869676865722060008201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000602082015250565b7f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460008201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000602082015250565b7f4d757374206b6565702066656573206174203625206f72206c65737300000000600082015250565b7f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660008201527f65722061646472657373206e6f72206f776e65722e0000000000000000000000602082015250565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b7f54726164696e67206973206e6f7420656e61626c65642e000000000000000000600082015250565b7f43616e206f6e6c7920656e61626c65206f6e63652e0000000000000000000000600082015250565b7f5374616b696e67206973206e6f7420656e61626c65642e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f7520617265206e6f74207374616b696e67213f0000000000000000000000600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460008201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e60208201527f742e000000000000000000000000000000000000000000000000000000000000604082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060008201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e7460208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b7f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b615bda81615308565b8114615be557600080fd5b50565b615bf18161531a565b8114615bfc57600080fd5b50565b615c0881615346565b8114615c1357600080fd5b5056fea2646970667358221220e3735902f995326fcd605c90007226809c414eeae3fe70ecddbae12387e2291d64736f6c63430008070033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.