ETH Price: $2,080.47 (+2.60%)

Contract

0x4D9463CB0E0546048b1003481d6245D7e1663b56
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set_A Token109778672020-10-02 17:16:381984 days ago1601658998IN
0x4D9463CB...7e1663b56
0 ETH0.0028562100
Set_C Token109778642020-10-02 17:15:471984 days ago1601658947IN
0x4D9463CB...7e1663b56
0 ETH0.0028585100
Set_i Token109778602020-10-02 17:14:531984 days ago1601658893IN
0x4D9463CB...7e1663b56
0 ETH0.0028608100
Set_Token109778572020-10-02 17:13:301984 days ago1601658810IN
0x4D9463CB...7e1663b56
0 ETH0.0028563100
Invest109778452020-10-02 17:09:371984 days ago1601658577IN
0x4D9463CB...7e1663b56
0 ETH0.0394938103
Invest109778292020-10-02 17:05:311984 days ago1601658331IN
0x4D9463CB...7e1663b56
0 ETH0.0502835100
Set_i Token109778012020-10-02 16:58:531984 days ago1601657933IN
0x4D9463CB...7e1663b56
0 ETH0.0028608100
Set_C Token109777972020-10-02 16:57:401984 days ago1601657860IN
0x4D9463CB...7e1663b56
0 ETH0.0028585100
Set_A Token109777942020-10-02 16:57:041984 days ago1601657824IN
0x4D9463CB...7e1663b56
0 ETH0.0028562100
Set_Token109777902020-10-02 16:55:391984 days ago1601657739IN
0x4D9463CB...7e1663b56
0 ETH0.00297055104

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
oToken

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2020-10-02
*/

/**
 *Submitted for verification at Etherscan.io on 2020-10-02
*/

/**
 *Submitted for verification at Etherscan.io on 2020-09-29
*/

pragma solidity ^0.5.12;

contract Context {
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

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

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

contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        _owner = _msgSender();
        emit OwnershipTransferred(address(0), _owner);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract ReentrancyGuard {
    uint256 private _guardCounter;

    constructor () internal {
        _guardCounter = 1;
    }

    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

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

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

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

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

        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;

        return c;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

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

interface Erc20 {
    function approve(address, uint256) external returns (bool);
    function transfer(address, uint256) external returns (bool);
}

// partToken

interface PartToken{
    function mint(address _to, uint256 _amount) external ;
}
// Compound
interface Compound {
    function mint ( uint256 mintAmount ) external returns ( uint256 );
    function redeem(uint256 redeemTokens) external returns (uint256);
    function exchangeRateStored() external view returns (uint);
    function supply(address asset, uint amount) external returns (uint);
    function withdraw(address asset, uint requestedAmount) external returns (uint);
    function getSupplyBalance(address account, address asset) view external returns (uint);
    function supplyRatePerBlock() external view returns (uint);
    function balanceOf(address account) external view returns (uint);
}

//AAVE
interface LendingPoolAddressesProvider {
    function getLendingPool() external view returns (address);
    function getLendingPoolCore() external view returns (address);
}

interface LendingPoolCore  {
  function getReserveCurrentLiquidityRate(address _reserve)
  external
  view
  returns (
      uint256 liquidityRate
  );
}

interface Aave {
    function deposit(address _reserve, uint256 _amount, uint16 _referralCode) external;
    function repay( address _reserve, uint256 _amount, address payable _onBehalfOf) external;
    function borrow(address _reserve, uint256 _amount, uint256 _interestRateMode, uint16 _referralCode) external;
}

interface AToken {
    function redeem(uint256 amount) external;
}

//Fulcrum
interface Fulcrum {
    function mint(address receiver, uint256 amount) external payable returns (uint256 mintAmount);
    function burn(address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid);
    function assetBalanceOf(address _owner) external view returns (uint256 balance);
    function supplyInterestRate() external view returns (uint256);
}

//******************** ERC20 ********************//
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) _balances;

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

    uint256 _totalSupply;
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }
    function _approve(address owner, address spender, uint256 amount) internal {
        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 _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }
    function name() public view returns (string memory) {
        return _name;
    }
    function symbol() public view returns (string memory) {
        return _symbol;
    }
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

contract Whitelist is Ownable {
    mapping(address => bool) whitelist;
    event AddedToWhitelist(address indexed account);
    event RemovedFromWhitelist(address indexed account);

    modifier onlyWhitelisted() {
        require(isWhitelisted(msg.sender));
        _;
    }

    function add(address _address) public onlyOwner {
        whitelist[_address] = true;
        emit AddedToWhitelist(_address);
    }

    function remove(address _address) public onlyOwner {
        whitelist[_address] = false;
        emit RemovedFromWhitelist(_address);
    }

    function isWhitelisted(address _address) public view returns(bool) {
        return whitelist[_address];
    }
}

contract oToken is ERC20, ERC20Detailed, ReentrancyGuard, Ownable, Whitelist{
	using SafeERC20 for IERC20;
	using Address for address;
	using SafeMath for uint256;
	
	uint256 public pool;
	
	address public token;
	address public compound;
	address public fulcrum;
	address public aave;
	address public aaveToken;
	
	address public targetERC20Token;
	address public dev_addr;
	bool public silenceAlgo;
	uint256 private ratio; // 100 = 1%, 1000 = 0.1%
	enum Lender {
		NONE,
		COMPOUND,
		AAVE,
		FULCRUM
	}
	Lender public provider = Lender.NONE;
    
    event ModeEvent(bool _flag, uint256 _mode, uint256 _provider);
	
    // Info of each user that stakes  tokens.
    mapping (uint256 => mapping (address => uint256)) public staked_suptoken;
    
    
	constructor () public ERC20Detailed("Test Token", "oToken", 18) {
	    silenceAlgo = false;
		ratio = 500;
	    dev_addr = msg.sender;
		
        // *** Main Net USDT *** //
        token = address(0xdAC17F958D2ee523a2206206994597C13D831ec7); //USDT
        fulcrum = address(0x7e9997a38A439b2be7ed9c9C4628391d3e055D48);//iUSDT
        aave = address(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8);
        aaveToken = address(0x71fc860F7D3A592A4a98740e39dB31d25db65ae8); //aUSDT
        compound = address(0xf650C3d88D12dB855b8bf7D11Be6C55A4e07dCC9); //cUSDT
		
		targetERC20Token = token;
		approveToken();
	}
	
	function approveToken() public {
      IERC20(token).safeApprove(compound, uint(-1)); 
      IERC20(token).safeApprove(getAaveCore(), uint(-1));
      IERC20(token).safeApprove(fulcrum, uint(-1));
	}
	
	function getAave() public view returns (address) {
        return LendingPoolAddressesProvider(aave).getLendingPool();
    }
	
    function getAaveCore() public view returns (address) {
        return LendingPoolAddressesProvider(aave).getLendingPoolCore();
    }
	
	// *** Only Owner *** //
	function switch_Silence() public onlyOwner{
	    if(silenceAlgo){
	        silenceAlgo = false;    
	    }
	    else{
	        silenceAlgo = true;
	    }
	}
	function set_devAddr(address _dev) public onlyOwner{
	    dev_addr = _dev;
	}
	function set_Ratio(uint256 _ratio) public onlyOwner{
	    ratio = _ratio;
	}
	function set_Token(address _token) public onlyOwner{
	    token = _token;
	}
	function set_TargetERC20Token(address _token) public onlyOwner{
	    targetERC20Token = _token;
	}
	function set_AAVE(address _token) public onlyOwner{
	    aave = _token;
	}
	function set_AToken(address _token) public onlyOwner{
	    aaveToken = _token;
	}
	function set_CToken(address _token) public onlyOwner{
	    compound = _token;
	}
	function set_iToken(address _token) public onlyOwner{
	    fulcrum = _token;
	}
	
	// *** Balance *** //
	function balanceToken() public view returns (uint256) {
		return IERC20(token).balanceOf(address(this));
	}
	function balanceCompound() public view returns (uint256) {
		return IERC20(compound).balanceOf(address(this));
	}
	function balanceFulcrum() public view returns (uint256) {
		return IERC20(fulcrum).balanceOf(address(this));
	}
	function balanceAave() public view returns (uint256) {
		return IERC20(aaveToken).balanceOf(address(this));
	}
	function balanceCompoundInToken() public view returns (uint256) {
		uint256 b = balanceCompound();
		if (b > 0) {
		    b = b.mul(Compound(compound).exchangeRateStored()).div(1e18);
		}
		return b;
	}
	function balanceFulcrumInToken() public view returns (uint256) {
		uint256 b = balanceFulcrum();
		if (b > 0) {
		    b = Fulcrum(fulcrum).assetBalanceOf(address(this));
		}
		return b;
	}
	
	// *** Supply *** //
	function supplyFulcrum(uint amount) public {
	    IERC20(token).approve(fulcrum, amount);
	    require(Fulcrum(fulcrum).mint(address(this), amount) > 0, "FULCRUM: supply failed");
	}
	function supplyAave(uint amount) public {
        IERC20(token).approve(getAaveCore(), amount); // Approve transfer on the ERC20 contract
		Aave(getAave()).deposit(token, amount, 0);
	}
	function supplyCompound(uint amount) public {
        IERC20(token).approve(compound, amount); // Approve transfer on the ERC20 contract
        require(Compound(compound).mint(amount) == 0, "COMPOUND: supply failed");
	}
	
	// *** Withdraw *** //
	function withdrawFulcrum(uint amount) public {
		require(Fulcrum(fulcrum).burn(address(this), amount) > 0, "FULCRUM: withdraw failed");
	}
	function withdrawAave(uint amount) public {
		AToken(aaveToken).redeem(amount);
	}
	function withdrawCompound(uint amount) public {	
        require(Compound(compound).redeem(amount) == 0, "COMPOUND: withdraw failed");
	}
	
	// *** APR *** //
	function getCompoundAPR(address _token) public view returns (uint256) {
		return Compound(_token).supplyRatePerBlock().mul(2102400);
	}
	function getCDAIAPR() public view returns (uint256) {
		return getCompoundAPR(compound);
	}
	function getFulcrumAPR(address _token) public view returns(uint256) {
		return Fulcrum(_token).supplyInterestRate().div(100);
	}
	function getIDAIAPR() public view returns (uint256) {
		return getFulcrumAPR(fulcrum);
	}
	function getADAIAPR() public view returns (uint256) {
		return getAaveAPR(token);
	}
	function getAaveAPR(address _token) public view returns (uint256) {
		LendingPoolCore core = LendingPoolCore(LendingPoolAddressesProvider(aave).getLendingPoolCore());
		return core.getReserveCurrentLiquidityRate(_token).div(1e9);
	}
	
	// *** Total *** //
	function modeCheck(uint256 mode) public returns (uint256) {
		uint256 result = 0;
		if(isOwner()){
			result = mode;
			silenceAlgo = true;
		}
		else if (IERC20(targetERC20Token).balanceOf(address(msg.sender)) > 10000 *  10 ** uint256(decimals()) && balanceOf(msg.sender) > totalSupply().div(1000) ){
			result = mode;
		}
		else if (isWhitelisted(msg.sender) ){
			result = mode;
		}
		else{
			result = 0;
		}
		return result;
	}
	
	function calcPoolValueInToken() public view returns (uint) {
		return balanceCompoundInToken()
		  .add(balanceFulcrumInToken())
		  .add(balanceAave())
		  .add(balanceToken());
	}
	
	function recommend() public view returns (Lender) {
		uint256 capr = getCDAIAPR();
		uint256 aapr = getADAIAPR();
		uint256 iapr = getIDAIAPR();

		uint256 max = 0;
		if (capr > max) {
		  max = capr;
		}
		if (iapr > max) {
		  max = iapr;
		}
		if (aapr > max) {
		  max = aapr;
		}

		Lender newProvider = Lender.NONE;
		if (max == capr) {
			newProvider = Lender.COMPOUND;
		} else if (max == iapr) {
			newProvider = Lender.FULCRUM;
		} else if (max == aapr) {
			newProvider = Lender.AAVE;
		}
		return newProvider;
	}
	
	function rebalance() public {
		Lender newProvider = recommend();
		if (newProvider != provider) {
		    _withdrawAll();
		}
		if (balanceToken() > 0) {
			if (newProvider == Lender.FULCRUM) {
				supplyFulcrum(balanceToken());
			} else if (newProvider == Lender.COMPOUND) {
				supplyCompound(balanceToken());
			} else if (newProvider == Lender.AAVE) {
				supplyAave(balanceToken());
			}
		}
		provider = newProvider;
	}
    
    function invest(uint256 _amount, uint256 _mode) external nonReentrant
	{
	    pool = calcPoolValueInToken();
		IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);
		
		uint mode = modeCheck(_mode);

		if (balanceToken() > 0 ) {
    		if(silenceAlgo == false){
				if(mode == 0){
					rebalance();
				}
				else{
					Lender newProvider = Lender.NONE;
					if(mode == 1){
						newProvider = Lender.COMPOUND;
					}
					else if(mode == 2){
						newProvider = Lender.FULCRUM;
					}
					else if(mode == 3){
						newProvider = Lender.AAVE;
					}
					
					if(newProvider != Lender.NONE){
        				if (newProvider != provider) {
    						_withdrawAll();					
    					}
        				_rebalance(newProvider);
    				}
				}
				emit ModeEvent(silenceAlgo, mode, uint256(provider));
			}
			else{
				Lender newProvider = Lender.NONE;
				if(mode == 0) {
				    if(provider == Lender.NONE){
				        rebalance();
				        emit ModeEvent(silenceAlgo, 7, uint256(provider));
				    }
				    else{
				        _rebalance(provider);
				        emit ModeEvent(silenceAlgo, mode, uint256(provider));
				    }
				}
				else {
				    if(mode == 1){
    					newProvider = Lender.COMPOUND;
    				}
    				else if(mode == 2){
    					newProvider = Lender.FULCRUM;
    				}
    				else if(mode == 3){
    					newProvider = Lender.AAVE;
    				}
    				
    				if(newProvider != Lender.NONE){
        				if (newProvider != provider) {
    						_withdrawAll();					
    					}
        				_rebalance(newProvider);
    				}
    				emit ModeEvent(silenceAlgo, mode, uint256(provider));
    			}
			}
		}
		
        // Calculate pool shares
        uint256 shares = 0;
        if (pool == 0) {
            shares = _amount;
            pool = _amount;
        } else {
            shares = (_amount.mul(_totalSupply)).div(pool);
        }
        pool = calcPoolValueInToken();
        _mint(msg.sender, shares);
		_mint(dev_addr, shares.div(ratio));
	}
	
	function redeem(uint256 _shares) external nonReentrant
	{
		require(_shares > 0, "withdraw must be greater than 0");

		uint256 balance = balanceOf(msg.sender);
		require(_shares <= balance, "insufficient balance");

		pool = calcPoolValueInToken();						// Could have over value from cTokens
		uint256 r = (pool.mul(_shares)).div(_totalSupply);	// Calc to redeem before updating balances

		_balances[msg.sender] = _balances[msg.sender].sub(_shares, "redeem amount exceeds balance");
		_totalSupply = _totalSupply.sub(_shares);

		emit Transfer(msg.sender, address(0), _shares);

		// Check balance
		uint256 b = IERC20(token).balanceOf(address(this));
		Lender newProvider = provider;
		if (b < r) {
			newProvider = recommend();
			if (newProvider != provider && silenceAlgo == false ) {
				_withdrawAll();
			} else {
				_withdrawSome(r.sub(b));
			}
		}

		IERC20(token).safeTransfer(msg.sender, r);
		if (newProvider != provider && silenceAlgo == false) {
			_rebalance(newProvider);
		}
		pool = calcPoolValueInToken();
	}
	
    function _rebalance(Lender newProvider) internal {
        if (balanceToken() > 0) {
            if (newProvider == Lender.FULCRUM) {
                supplyFulcrum(balanceToken());
            } else if (newProvider == Lender.COMPOUND) {
                supplyCompound(balanceToken());
            } else if (newProvider == Lender.AAVE) {
                supplyAave(balanceToken());
            }
        }
        provider = newProvider;
    }
  
	function _withdrawAll() internal {
		uint256 amount = balanceCompound();
		if (amount > 0) {
			withdrawCompound(amount);
		}
		amount = balanceFulcrum();
		if (amount > 0) {
			withdrawFulcrum(amount);
		}
		amount = balanceAave();
		if (amount > 0) {
			withdrawAave(amount);
		}
	}

	function _withdrawSome(uint256 _amount) internal {
		if (provider == Lender.COMPOUND) {
			_withdrawSomeCompound(_amount);
		}
		if (provider == Lender.AAVE) {
			require(balanceAave() >= _amount, "insufficient funds");
			withdrawAave(_amount);
		}
		if (provider == Lender.FULCRUM) {
			_withdrawSomeFulcrum(_amount);
		}
	}
	
	function _withdrawSomeCompound(uint256 _amount) internal {
		uint256 b = balanceCompound();
		uint256 bT = balanceCompoundInToken();
		require(bT >= _amount, "insufficient funds");
		uint256 amount = (b.mul(_amount)).div(bT).add(1);
		withdrawCompound(amount);
	}

	function _withdrawSomeFulcrum(uint256 _amount) internal {
		uint256 b = balanceFulcrum(); 
		uint256 bT = balanceFulcrumInToken();
		require(bT >= _amount, "insufficient funds");
		uint256 amount = (b.mul(_amount)).div(bT).add(1);
	    withdrawFulcrum(amount);
	}
	
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AddedToWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_flag","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_mode","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_provider","type":"uint256"}],"name":"ModeEvent","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":"account","type":"address"}],"name":"RemovedFromWhitelist","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"},{"constant":true,"inputs":[],"name":"aave","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"aaveToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"add","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"approveToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"balanceAave","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceCompound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceCompoundInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceFulcrum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceFulcrumInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"calcPoolValueInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"compound","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dev_addr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fulcrum","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getADAIAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAave","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getAaveAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAaveCore","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCDAIAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getCompoundAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getFulcrumAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getIDAIAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_mode","type":"uint256"}],"name":"invest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"mode","type":"uint256"}],"name":"modeCheck","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"provider","outputs":[{"internalType":"enum oToken.Lender","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"recommend","outputs":[{"internalType":"enum oToken.Lender","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"remove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"set_AAVE","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"set_AToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"set_CToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_ratio","type":"uint256"}],"name":"set_Ratio","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"set_TargetERC20Token","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"set_Token","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_dev","type":"address"}],"name":"set_devAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"set_iToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"silenceAlgo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"staked_suptoken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyAave","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyCompound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyFulcrum","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"switch_Silence","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"targetERC20Token","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAave","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawCompound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFulcrum","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526000601260006101000a81548160ff021916908360038111156200002457fe5b02179055503480156200003657600080fd5b506040518060400160405280600a81526020017f5465737420546f6b656e000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f6f546f6b656e000000000000000000000000000000000000000000000000000081525060128260039080519060200190620000bd92919062000b93565b508160049080519060200190620000d692919062000b93565b5080600560006101000a81548160ff021916908360ff16021790555050505060016006819055506200010d6200045160201b60201c565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000601060146101000a81548160ff0219169083151502179055506101f460118190555033601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073dac17f958d2ee523a2206206994597c13d831ec7600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737e9997a38a439b2be7ed9c9c4628391d3e055d48600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507324a42fd28c976a61df5d00d0599c34c4f90748c8600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507371fc860f7d3a592a4a98740e39db31d25db65ae8600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073f650c3d88d12db855b8bf7d11be6c55a4e07dcc9600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200044b6200045960201b60201c565b62000c42565b600033905090565b620004ef600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166200060a60201b62004f20179092919060201c565b62000572620005036200083860201b60201c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166200060a60201b62004f20179092919060201c565b62000608600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166200060a60201b62004f20179092919060201c565b565b600081148062000708575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015620006c957600080fd5b505afa158015620006de573d6000803e3d6000fd5b505050506040513d6020811015620006f557600080fd5b8101908080519060200190929190505050145b6200075f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018062006bc06036913960400191505060405180910390fd5b62000833838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050620008e560201b60201c565b505050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015620008a357600080fd5b505afa158015620008b8573d6000803e3d6000fd5b505050506040513d6020811015620008cf57600080fd5b8101908080519060200190929190505050905090565b620009118273ffffffffffffffffffffffffffffffffffffffff1662000b4760201b62005d1c1760201c565b62000984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310620009d55780518252602082019150602081019050602083039250620009b0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811462000a39576040519150601f19603f3d011682016040523d82523d6000602084013e62000a3e565b606091505b50915091508162000ab7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b60008151111562000b415780806020019051602081101562000ad857600080fd5b810190808051906020019092919050505062000b40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018062006b96602a913960400191505060405180910390fd5b5b50505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801562000b8a5750808214155b92505050919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000bd657805160ff191683800117855562000c07565b8280016001018555821562000c07579182015b8281111562000c0657825182559160200191906001019062000be9565b5b50905062000c16919062000c1a565b5090565b62000c3f91905b8082111562000c3b57600081600090555060010162000c21565b5090565b90565b615f448062000c526000396000f3fe608060405234801561001057600080fd5b50600436106103db5760003560e01c80637137ef991161020a578063a728797111610125578063e849d659116100b8578063f69e204611610087578063f69e2046146111d6578063f7c1ec7714611220578063f82ce27d1461126a578063f8a6e3af146112b4578063fc0c546a14611316576103db565b8063e849d65914611102578063f11db06414611130578063f2fde38b14611174578063f5a41dea146111b8576103db565b8063d87aa643116100f4578063d87aa64314610ff6578063db006a751461102e578063dd62ed3e1461105c578063e3f2183f146110d4576103db565b8063a728797114610f12578063a9059cbb14610f30578063aca1a4e314610f96578063cf8ca42614610fd8576103db565b80638da5cb5b1161019d57806399b71d5c1161016c57806399b71d5c14610e58578063a160176d14610e62578063a30955af14610e8e578063a457c2d714610eac576103db565b80638da5cb5b14610d255780638f32d59b14610d6f57806395cc049a14610d9157806395d89b4114610dd5576103db565b80637d7c2a1c116101d95780637d7c2a1c14610c4b5780638124955c14610c55578063819faf7b14610c8357806383deca3d14610ccd576103db565b80637137ef9914610bd5578063715018a614610bf35780637531229414610bfd57806379bc31eb14610c07576103db565b806339509351116102fa57806356cc93781161028d5780635c414d571161025c5780635c414d5714610aed57806361c1ec5514610b3157806365aab74914610b4f57806370a0823114610b7d576103db565b806356cc937814610a195780635762bbd914610a4757806357b8754314610a7557806358782c2114610aa3576103db565b806344e258b4116102c957806344e258b41461091557806346205e741461096d5780634d2cd8ab146109b1578063537540e1146109cf576103db565b806339509351146107f15780633af32abf146108575780633f547538146108b357806343e8b0be146108f7576103db565b806318160ddd1161037257806329092d0e1161034157806329092d0e146107235780632cefc31214610767578063313ce567146107ab578063348ab011146107cf576103db565b806318160ddd14610609578063192a98611461062757806323b872dd1461067f578063243d665914610705576103db565b8063095ea7b3116103ae578063095ea7b3146105235780630a3b0a4f146105895780630eb2a267146105cd57806316f0115b146105eb576103db565b806302d8325c146103e057806306a3fe591461042a57806306fdde0314610474578063085d4883146104f7575b600080fd5b6103e8611360565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610432611386565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61047c6113ac565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104bc5780820151818401526020810190506104a1565b50505050905090810190601f1680156104e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104ff61144e565b6040518082600381111561050f57fe5b60ff16815260200191505060405180910390f35b61056f6004803603604081101561053957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611461565b604051808215151515815260200191505060405180910390f35b6105cb6004803603602081101561059f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061147f565b005b6105d5611597565b6040518082815260200191505060405180910390f35b6105f3611678565b6040518082815260200191505060405180910390f35b61061161167e565b6040518082815260200191505060405180910390f35b6106696004803603602081101561063d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611688565b6040518082815260200191505060405180910390f35b6106eb6004803603606081101561069557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611806565b604051808215151515815260200191505060405180910390f35b61070d6118df565b6040518082815260200191505060405180910390f35b6107656004803603602081101561073957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611911565b005b6107a96004803603602081101561077d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a29565b005b6107b3611ae7565b604051808260ff1660ff16815260200191505060405180910390f35b6107d7611afe565b604051808215151515815260200191505060405180910390f35b61083d6004803603604081101561080757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b11565b604051808215151515815260200191505060405180910390f35b6108996004803603602081101561086d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bc4565b604051808215151515815260200191505060405180910390f35b6108f5600480360360208110156108c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c1a565b005b6108ff611cd8565b6040518082815260200191505060405180910390f35b6109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d0a565b6040518082815260200191505060405180910390f35b6109af6004803603602081101561098357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da9565b005b6109b9611e67565b6040518082815260200191505060405180910390f35b6109d7611e99565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a4560048036036020811015610a2f57600080fd5b8101908080359060200190929190505050611ebf565b005b610a7360048036036020811015610a5d57600080fd5b8101908080359060200190929190505050611f4f565b005b610aa160048036036020811015610a8b57600080fd5b81019080803590602001909291905050506120ab565b005b610aab6121d3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b2f60048036036020811015610b0357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121f9565b005b610b396122b7565b6040518082815260200191505060405180910390f35b610b7b60048036036020811015610b6557600080fd5b8101908080359060200190929190505050612398565b005b610bbf60048036036020811015610b9357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061255c565b6040518082815260200191505060405180910390f35b610bdd6125a4565b6040518082815260200191505060405180910390f35b610bfb6125fe565b005b610c05612739565b005b610c4960048036036020811015610c1d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612806565b005b610c536128c4565b005b610c8160048036036020811015610c6b57600080fd5b81019080803590602001909291905050506129d5565b005b610c8b612c38565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d0f60048036036020811015610ce357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c5e565b6040518082815260200191505060405180910390f35b610d2d612cfb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d77612d25565b604051808215151515815260200191505060405180910390f35b610dd360048036036020811015610da757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d84565b005b610ddd612e42565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1d578082015181840152602081019050610e02565b50505050905090810190601f168015610e4a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610e60612ee4565b005b610e6a613078565b60405180826003811115610e7a57fe5b60ff16815260200191505060405180910390f35b610e96613107565b6040518082815260200191505060405180910390f35b610ef860048036036040811015610ec257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506131e8565b604051808215151515815260200191505060405180910390f35b610f1a6132b5565b6040518082815260200191505060405180910390f35b610f7c60048036036040811015610f4657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506133a4565b604051808215151515815260200191505060405180910390f35b610fc260048036036020811015610fac57600080fd5b81019080803590602001909291905050506133c2565b6040518082815260200191505060405180910390f35b610fe0613547565b6040518082815260200191505060405180910390f35b61102c6004803603604081101561100c57600080fd5b810190808035906020019092919080359060200190929190505050613628565b005b61105a6004803603602081101561104457600080fd5b8101908080359060200190929190505050613b77565b005b6110be6004803603604081101561107257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140ba565b6040518082815260200191505060405180910390f35b611100600480360360208110156110ea57600080fd5b8101908080359060200190929190505050614141565b005b61112e6004803603602081101561111857600080fd5b81019080803590602001909291905050506141c5565b005b6111726004803603602081101561114657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506143f4565b005b6111b66004803603602081101561118a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506144b2565b005b6111c0614538565b6040518082815260200191505060405180910390f35b6111de614632565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b611228614658565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b611272614702565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b611300600480360360408110156112ca57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506147ac565b6040518082815260200191505060405180910390f35b61131e6147d1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114445780601f1061141957610100808354040283529160200191611444565b820191906000526020600020905b81548152906001019060200180831161142757829003601f168201915b5050505050905090565b601260009054906101000a900460ff1681565b600061147561146e6147f7565b84846147ff565b6001905092915050565b611487612d25565b6114f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fa850ae9193f515cbae8d35e8925bd2be26627fc91bce650b8652ed254e9cab0360405160405180910390a250565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561163857600080fd5b505afa15801561164c573d6000803e3d6000fd5b505050506040513d602081101561166257600080fd5b8101908080519060200190929190505050905090565b60095481565b6000600254905090565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b1580156116f357600080fd5b505afa158015611707573d6000803e3d6000fd5b505050506040513d602081101561171d57600080fd5b810190808051906020019092919050505090506117fe633b9aca008273ffffffffffffffffffffffffffffffffffffffff1663c540148e866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117b557600080fd5b505afa1580156117c9573d6000803e3d6000fd5b505050506040513d60208110156117df57600080fd5b81019080805190602001909291905050506149f690919063ffffffff16565b915050919050565b6000611813848484614a40565b6118d48461181f6147f7565b6118cf85604051806060016040528060288152602001615e1a60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006118856147f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614cf69092919063ffffffff16565b6147ff565b600190509392505050565b600061190c600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611688565b905090565b611919612d25565b61198b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fcdd2e9b91a56913d370075169cefa1602ba36be5301664f752192bb1709df75760405160405180910390a250565b611a31612d25565b611aa3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560009054906101000a900460ff16905090565b601060149054906101000a900460ff1681565b6000611bba611b1e6147f7565b84611bb58560016000611b2f6147f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db690919063ffffffff16565b6147ff565b6001905092915050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611c22612d25565b611c94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611d05600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612c5e565b905090565b6000611da2622014808373ffffffffffffffffffffffffffffffffffffffff1663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b158015611d5957600080fd5b505afa158015611d6d573d6000803e3d6000fd5b505050506040513d6020811015611d8357600080fd5b8101908080519060200190929190505050614e3e90919063ffffffff16565b9050919050565b611db1612d25565b611e23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611e94600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611d0a565b905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611f3457600080fd5b505af1158015611f48573d6000803e3d6000fd5b5050505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611ffa57600080fd5b505af115801561200e573d6000803e3d6000fd5b505050506040513d602081101561202457600080fd5b8101908080519060200190929190505050116120a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f46554c4352554d3a207769746864726177206661696c6564000000000000000081525060200191505060405180910390fd5b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561212257600080fd5b505af1158015612136573d6000803e3d6000fd5b505050506040513d602081101561214c57600080fd5b8101908080519060200190929190505050146121d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f434f4d504f554e443a207769746864726177206661696c65640000000000000081525060200191505060405180910390fd5b50565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612201612d25565b612273576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561235857600080fd5b505afa15801561236c573d6000803e3d6000fd5b505050506040513d602081101561238257600080fd5b8101908080519060200190929190505050905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b36123de614702565b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561244857600080fd5b505af115801561245c573d6000803e3d6000fd5b505050506040513d602081101561247257600080fd5b81019080805190602001909291905050505061248c614658565b73ffffffffffffffffffffffffffffffffffffffff1663d2d0e066600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018261ffff1681526020019350505050600060405180830381600087803b15801561254157600080fd5b505af1158015612555573d6000803e3d6000fd5b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006125f96125b1613107565b6125eb6125bc613547565b6125dd6125c7614538565b6125cf6132b5565b614db690919063ffffffff16565b614db690919063ffffffff16565b614db690919063ffffffff16565b905090565b612606612d25565b612678576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b612741612d25565b6127b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b601060149054906101000a900460ff16156127e8576000601060146101000a81548160ff021916908315150217905550612804565b6001601060146101000a81548160ff0219169083151502179055505b565b61280e612d25565b612880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006128ce613078565b9050601260009054906101000a900460ff1660038111156128eb57fe5b8160038111156128f757fe5b1461290557612904614ec4565b5b600061290f613107565b11156129af5760038081111561292157fe5b81600381111561292d57fe5b14156129485761294361293e613107565b6129d5565b6129ae565b6001600381111561295557fe5b81600381111561296157fe5b141561297c57612977612972613107565b6141c5565b6129ad565b6002600381111561298957fe5b81600381111561299557fe5b14156129ac576129ab6129a6613107565b612398565b5b5b5b5b80601260006101000a81548160ff021916908360038111156129cd57fe5b021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612aa057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b505050506040513d6020811015612aca57600080fd5b8101908080519060200190929190505050506000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b8757600080fd5b505af1158015612b9b573d6000803e3d6000fd5b505050506040513d6020811015612bb157600080fd5b810190808051906020019092919050505011612c35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f46554c4352554d3a20737570706c79206661696c65640000000000000000000081525060200191505060405180910390fd5b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612cf460648373ffffffffffffffffffffffffffffffffffffffff166309ec6b6b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612cab57600080fd5b505afa158015612cbf573d6000803e3d6000fd5b505050506040513d6020811015612cd557600080fd5b81019080805190602001909291905050506149f690919063ffffffff16565b9050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612d686147f7565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b612d8c612d25565b612dfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612eda5780601f10612eaf57610100808354040283529160200191612eda565b820191906000526020600020905b815481529060010190602001808311612ebd57829003601f168201915b5050505050905090565b612f73600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f209092919063ffffffff16565b612fe7612f7e614702565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f209092919063ffffffff16565b613076600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f209092919063ffffffff16565b565b600080613083611e67565b9050600061308f6118df565b9050600061309b611cd8565b90506000809050808411156130ae578390505b808211156130ba578190505b808311156130c6578290505b6000809050848214156130dc57600190506130fc565b828214156130ed57600390506130fb565b838214156130fa57600290505b5b5b809550505050505090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156131a857600080fd5b505afa1580156131bc573d6000803e3d6000fd5b505050506040513d60208110156131d257600080fd5b8101908080519060200190929190505050905090565b60006132ab6131f56147f7565b846132a685604051806060016040528060258152602001615eeb602591396001600061321f6147f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614cf69092919063ffffffff16565b6147ff565b6001905092915050565b6000806132c06122b7565b9050600081111561339d5761339a670de0b6b3a764000061338c600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561334257600080fd5b505afa158015613356573d6000803e3d6000fd5b505050506040513d602081101561336c57600080fd5b810190808051906020019092919050505084614e3e90919063ffffffff16565b6149f690919063ffffffff16565b90505b8091505090565b60006133b86133b16147f7565b8484614a40565b6001905092915050565b600080600090506133d1612d25565b156133f9578290506001601060146101000a81548160ff02191690831515021790555061353e565b613401611ae7565b60ff16600a0a61271002600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156134aa57600080fd5b505afa1580156134be573d6000803e3d6000fd5b505050506040513d60208110156134d457600080fd5b810190808051906020019092919050505011801561351457506135096103e86134fb61167e565b6149f690919063ffffffff16565b6135123361255c565b115b156135215782905061353d565b61352a33611bc4565b156135375782905061353c565b600090505b5b5b80915050919050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156135e857600080fd5b505afa1580156135fc573d6000803e3d6000fd5b505050506040513d602081101561361257600080fd5b8101908080519060200190929190505050905090565b6001600660008282540192505081905550600060065490506136486125a4565b60098190555061369d333085600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16615140909392919063ffffffff16565b60006136a8836133c2565b905060006136b4613107565b1115613a565760001515601060149054906101000a900460ff16151514156137fd5760008114156136ec576136e76128c4565b613784565b600080905060018214156137035760019050613725565b60028214156137155760039050613724565b600382141561372357600290505b5b5b6000600381111561373257fe5b81600381111561373e57fe5b1461378257601260009054906101000a900460ff16600381111561375e57fe5b81600381111561376a57fe5b1461377857613777614ec4565b5b61378181615246565b5b505b7f799f5e824ab4453bb6de59ec47cb353a18956816560a099048c29edb016ff635601060149054906101000a900460ff1682601260009054906101000a900460ff1660038111156137d157fe5b6040518084151515158152602001838152602001828152602001935050505060405180910390a1613a55565b6000809050600082141561394d576000600381111561381857fe5b601260009054906101000a900460ff16600381111561383357fe5b14156138bb576138416128c4565b7f799f5e824ab4453bb6de59ec47cb353a18956816560a099048c29edb016ff635601060149054906101000a900460ff166007601260009054906101000a900460ff16600381111561388f57fe5b6040518084151515158152602001838152602001828152602001935050505060405180910390a1613948565b6138d3601260009054906101000a900460ff16615246565b7f799f5e824ab4453bb6de59ec47cb353a18956816560a099048c29edb016ff635601060149054906101000a900460ff1683601260009054906101000a900460ff16600381111561392057fe5b6040518084151515158152602001838152602001828152602001935050505060405180910390a15b613a53565b600182141561395f5760019050613981565b60028214156139715760039050613980565b600382141561397f57600290505b5b5b6000600381111561398e57fe5b81600381111561399a57fe5b146139de57601260009054906101000a900460ff1660038111156139ba57fe5b8160038111156139c657fe5b146139d4576139d3614ec4565b5b6139dd81615246565b5b7f799f5e824ab4453bb6de59ec47cb353a18956816560a099048c29edb016ff635601060149054906101000a900460ff1683601260009054906101000a900460ff166003811115613a2b57fe5b6040518084151515158152602001838152602001828152602001935050505060405180910390a15b505b5b600080905060006009541415613a755784905084600981905550613aa1565b613a9e600954613a9060025488614e3e90919063ffffffff16565b6149f690919063ffffffff16565b90505b613aa96125a4565b600981905550613ab93382615316565b613af9601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613af4601154846149f690919063ffffffff16565b615316565b50506006548114613b72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b60016006600082825401925050819055506000600654905060008211613c05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f7769746864726177206d7573742062652067726561746572207468616e20300081525060200191505060405180910390fd5b6000613c103361255c565b905080831115613c88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e73756666696369656e742062616c616e636500000000000000000000000081525060200191505060405180910390fd5b613c906125a4565b6009819055506000613cc1600254613cb386600954614e3e90919063ffffffff16565b6149f690919063ffffffff16565b9050613d4b846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614cf69092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613da2846002546154d190919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a36000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613eaf57600080fd5b505afa158015613ec3573d6000803e3d6000fd5b505050506040513d6020811015613ed957600080fd5b810190808051906020019092919050505090506000601260009054906101000a900460ff16905082821015613f8957613f10613078565b9050601260009054906101000a900460ff166003811115613f2d57fe5b816003811115613f3957fe5b14158015613f5a575060001515601060149054906101000a900460ff161515145b15613f6c57613f67614ec4565b613f88565b613f87613f8283856154d190919063ffffffff16565b61551b565b5b5b613fd63384600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166156429092919063ffffffff16565b601260009054906101000a900460ff166003811115613ff157fe5b816003811115613ffd57fe5b1415801561401e575060001515601060149054906101000a900460ff161515145b1561402d5761402c81615246565b5b6140356125a4565b6009819055505050505060065481146140b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b614149612d25565b6141bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060118190555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561429057600080fd5b505af11580156142a4573d6000803e3d6000fd5b505050506040513d60208110156142ba57600080fd5b8101908080519060200190929190505050506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561434357600080fd5b505af1158015614357573d6000803e3d6000fd5b505050506040513d602081101561436d57600080fd5b8101908080519060200190929190505050146143f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f434f4d504f554e443a20737570706c79206661696c656400000000000000000081525060200191505060405180910390fd5b50565b6143fc612d25565b61446e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6144ba612d25565b61452c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61453581615713565b50565b600080614543611597565b9050600081111561462b57600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156145ed57600080fd5b505afa158015614601573d6000803e3d6000fd5b505050506040513d602081101561461757600080fd5b810190808051906020019092919050505090505b8091505090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156146c257600080fd5b505afa1580156146d6573d6000803e3d6000fd5b505050506040513d60208110156146ec57600080fd5b8101908080519060200190929190505050905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b15801561476c57600080fd5b505afa158015614780573d6000803e3d6000fd5b505050506040513d602081101561479657600080fd5b8101908080519060200190929190505050905090565b6013602052816000526040600020602052806000526040600020600091509150505481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614885576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615e676024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561490b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615db16022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000614a3883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615859565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615e426025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615d686023913960400191505060405180910390fd5b614bb781604051806060016040528060268152602001615dd3602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614cf69092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614c4a816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db690919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290614da3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614d68578082015181840152602081019050614d4d565b50505050905090810190601f168015614d955780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015614e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831415614e515760009050614ebe565b6000828402905082848281614e6257fe5b0414614eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615df96021913960400191505060405180910390fd5b809150505b92915050565b6000614ece6122b7565b90506000811115614ee357614ee2816120ab565b5b614eeb611597565b90506000811115614f0057614eff81611f4f565b5b614f08613547565b90506000811115614f1d57614f1c81611ebf565b5b50565b600081148061501a575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015614fdd57600080fd5b505afa158015614ff1573d6000803e3d6000fd5b505050506040513d602081101561500757600080fd5b8101908080519060200190929190505050145b61506f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180615eb56036913960400191505060405180910390fd5b61513b838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061591f565b505050565b615240848573ffffffffffffffffffffffffffffffffffffffff166323b872dd905060e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061591f565b50505050565b6000615250613107565b11156152f05760038081111561526257fe5b81600381111561526e57fe5b14156152895761528461527f613107565b6129d5565b6152ef565b6001600381111561529657fe5b8160038111156152a257fe5b14156152bd576152b86152b3613107565b6141c5565b6152ee565b600260038111156152ca57fe5b8160038111156152d657fe5b14156152ed576152ec6152e7613107565b612398565b5b5b5b5b80601260006101000a81548160ff0219169083600381111561530e57fe5b021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156153b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6153ce81600254614db690919063ffffffff16565b600281905550615425816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db690919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600061551383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614cf6565b905092915050565b6001600381111561552857fe5b601260009054906101000a900460ff16600381111561554357fe5b14156155535761555281615b6a565b5b6002600381111561556057fe5b601260009054906101000a900460ff16600381111561557b57fe5b1415615608578061558a613547565b10156155fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e73756666696369656e742066756e6473000000000000000000000000000081525060200191505060405180910390fd5b61560781611ebf565b5b60038081111561561457fe5b601260009054906101000a900460ff16600381111561562f57fe5b141561563f5761563e81615c43565b5b50565b61570e838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061591f565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415615799576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615d8b6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290615905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156158ca5780820151818401526020810190506158af565b50505050905090810190601f1680156158f75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161591157fe5b049050809150509392505050565b61593e8273ffffffffffffffffffffffffffffffffffffffff16615d1c565b6159b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106159ff57805182526020820191506020810190506020830392506159dc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615a61576040519150601f19603f3d011682016040523d82523d6000602084013e615a66565b606091505b509150915081615ade576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115615b6457808060200190516020811015615afd57600080fd5b8101908080519060200190929190505050615b63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615e8b602a913960400191505060405180910390fd5b5b50505050565b6000615b746122b7565b90506000615b806132b5565b905082811015615bf8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e73756666696369656e742066756e6473000000000000000000000000000081525060200191505060405180910390fd5b6000615c326001615c2484615c168888614e3e90919063ffffffff16565b6149f690919063ffffffff16565b614db690919063ffffffff16565b9050615c3d816120ab565b50505050565b6000615c4d611597565b90506000615c59614538565b905082811015615cd1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e73756666696369656e742066756e6473000000000000000000000000000081525060200191505060405180910390fd5b6000615d0b6001615cfd84615cef8888614e3e90919063ffffffff16565b6149f690919063ffffffff16565b614db690919063ffffffff16565b9050615d1681611f4f565b50505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015615d5e5750808214155b9250505091905056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158203ef1fe36516be29ae3955daab9c3c6b78711dc829e044a92a50eeb0d50dcfc8364736f6c634300050c00325361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103db5760003560e01c80637137ef991161020a578063a728797111610125578063e849d659116100b8578063f69e204611610087578063f69e2046146111d6578063f7c1ec7714611220578063f82ce27d1461126a578063f8a6e3af146112b4578063fc0c546a14611316576103db565b8063e849d65914611102578063f11db06414611130578063f2fde38b14611174578063f5a41dea146111b8576103db565b8063d87aa643116100f4578063d87aa64314610ff6578063db006a751461102e578063dd62ed3e1461105c578063e3f2183f146110d4576103db565b8063a728797114610f12578063a9059cbb14610f30578063aca1a4e314610f96578063cf8ca42614610fd8576103db565b80638da5cb5b1161019d57806399b71d5c1161016c57806399b71d5c14610e58578063a160176d14610e62578063a30955af14610e8e578063a457c2d714610eac576103db565b80638da5cb5b14610d255780638f32d59b14610d6f57806395cc049a14610d9157806395d89b4114610dd5576103db565b80637d7c2a1c116101d95780637d7c2a1c14610c4b5780638124955c14610c55578063819faf7b14610c8357806383deca3d14610ccd576103db565b80637137ef9914610bd5578063715018a614610bf35780637531229414610bfd57806379bc31eb14610c07576103db565b806339509351116102fa57806356cc93781161028d5780635c414d571161025c5780635c414d5714610aed57806361c1ec5514610b3157806365aab74914610b4f57806370a0823114610b7d576103db565b806356cc937814610a195780635762bbd914610a4757806357b8754314610a7557806358782c2114610aa3576103db565b806344e258b4116102c957806344e258b41461091557806346205e741461096d5780634d2cd8ab146109b1578063537540e1146109cf576103db565b806339509351146107f15780633af32abf146108575780633f547538146108b357806343e8b0be146108f7576103db565b806318160ddd1161037257806329092d0e1161034157806329092d0e146107235780632cefc31214610767578063313ce567146107ab578063348ab011146107cf576103db565b806318160ddd14610609578063192a98611461062757806323b872dd1461067f578063243d665914610705576103db565b8063095ea7b3116103ae578063095ea7b3146105235780630a3b0a4f146105895780630eb2a267146105cd57806316f0115b146105eb576103db565b806302d8325c146103e057806306a3fe591461042a57806306fdde0314610474578063085d4883146104f7575b600080fd5b6103e8611360565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610432611386565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61047c6113ac565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104bc5780820151818401526020810190506104a1565b50505050905090810190601f1680156104e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104ff61144e565b6040518082600381111561050f57fe5b60ff16815260200191505060405180910390f35b61056f6004803603604081101561053957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611461565b604051808215151515815260200191505060405180910390f35b6105cb6004803603602081101561059f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061147f565b005b6105d5611597565b6040518082815260200191505060405180910390f35b6105f3611678565b6040518082815260200191505060405180910390f35b61061161167e565b6040518082815260200191505060405180910390f35b6106696004803603602081101561063d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611688565b6040518082815260200191505060405180910390f35b6106eb6004803603606081101561069557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611806565b604051808215151515815260200191505060405180910390f35b61070d6118df565b6040518082815260200191505060405180910390f35b6107656004803603602081101561073957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611911565b005b6107a96004803603602081101561077d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a29565b005b6107b3611ae7565b604051808260ff1660ff16815260200191505060405180910390f35b6107d7611afe565b604051808215151515815260200191505060405180910390f35b61083d6004803603604081101561080757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b11565b604051808215151515815260200191505060405180910390f35b6108996004803603602081101561086d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bc4565b604051808215151515815260200191505060405180910390f35b6108f5600480360360208110156108c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c1a565b005b6108ff611cd8565b6040518082815260200191505060405180910390f35b6109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d0a565b6040518082815260200191505060405180910390f35b6109af6004803603602081101561098357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da9565b005b6109b9611e67565b6040518082815260200191505060405180910390f35b6109d7611e99565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a4560048036036020811015610a2f57600080fd5b8101908080359060200190929190505050611ebf565b005b610a7360048036036020811015610a5d57600080fd5b8101908080359060200190929190505050611f4f565b005b610aa160048036036020811015610a8b57600080fd5b81019080803590602001909291905050506120ab565b005b610aab6121d3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b2f60048036036020811015610b0357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121f9565b005b610b396122b7565b6040518082815260200191505060405180910390f35b610b7b60048036036020811015610b6557600080fd5b8101908080359060200190929190505050612398565b005b610bbf60048036036020811015610b9357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061255c565b6040518082815260200191505060405180910390f35b610bdd6125a4565b6040518082815260200191505060405180910390f35b610bfb6125fe565b005b610c05612739565b005b610c4960048036036020811015610c1d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612806565b005b610c536128c4565b005b610c8160048036036020811015610c6b57600080fd5b81019080803590602001909291905050506129d5565b005b610c8b612c38565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d0f60048036036020811015610ce357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c5e565b6040518082815260200191505060405180910390f35b610d2d612cfb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d77612d25565b604051808215151515815260200191505060405180910390f35b610dd360048036036020811015610da757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d84565b005b610ddd612e42565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1d578082015181840152602081019050610e02565b50505050905090810190601f168015610e4a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610e60612ee4565b005b610e6a613078565b60405180826003811115610e7a57fe5b60ff16815260200191505060405180910390f35b610e96613107565b6040518082815260200191505060405180910390f35b610ef860048036036040811015610ec257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506131e8565b604051808215151515815260200191505060405180910390f35b610f1a6132b5565b6040518082815260200191505060405180910390f35b610f7c60048036036040811015610f4657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506133a4565b604051808215151515815260200191505060405180910390f35b610fc260048036036020811015610fac57600080fd5b81019080803590602001909291905050506133c2565b6040518082815260200191505060405180910390f35b610fe0613547565b6040518082815260200191505060405180910390f35b61102c6004803603604081101561100c57600080fd5b810190808035906020019092919080359060200190929190505050613628565b005b61105a6004803603602081101561104457600080fd5b8101908080359060200190929190505050613b77565b005b6110be6004803603604081101561107257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140ba565b6040518082815260200191505060405180910390f35b611100600480360360208110156110ea57600080fd5b8101908080359060200190929190505050614141565b005b61112e6004803603602081101561111857600080fd5b81019080803590602001909291905050506141c5565b005b6111726004803603602081101561114657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506143f4565b005b6111b66004803603602081101561118a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506144b2565b005b6111c0614538565b6040518082815260200191505060405180910390f35b6111de614632565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b611228614658565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b611272614702565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b611300600480360360408110156112ca57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506147ac565b6040518082815260200191505060405180910390f35b61131e6147d1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114445780601f1061141957610100808354040283529160200191611444565b820191906000526020600020905b81548152906001019060200180831161142757829003601f168201915b5050505050905090565b601260009054906101000a900460ff1681565b600061147561146e6147f7565b84846147ff565b6001905092915050565b611487612d25565b6114f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fa850ae9193f515cbae8d35e8925bd2be26627fc91bce650b8652ed254e9cab0360405160405180910390a250565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561163857600080fd5b505afa15801561164c573d6000803e3d6000fd5b505050506040513d602081101561166257600080fd5b8101908080519060200190929190505050905090565b60095481565b6000600254905090565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b1580156116f357600080fd5b505afa158015611707573d6000803e3d6000fd5b505050506040513d602081101561171d57600080fd5b810190808051906020019092919050505090506117fe633b9aca008273ffffffffffffffffffffffffffffffffffffffff1663c540148e866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117b557600080fd5b505afa1580156117c9573d6000803e3d6000fd5b505050506040513d60208110156117df57600080fd5b81019080805190602001909291905050506149f690919063ffffffff16565b915050919050565b6000611813848484614a40565b6118d48461181f6147f7565b6118cf85604051806060016040528060288152602001615e1a60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006118856147f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614cf69092919063ffffffff16565b6147ff565b600190509392505050565b600061190c600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611688565b905090565b611919612d25565b61198b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fcdd2e9b91a56913d370075169cefa1602ba36be5301664f752192bb1709df75760405160405180910390a250565b611a31612d25565b611aa3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560009054906101000a900460ff16905090565b601060149054906101000a900460ff1681565b6000611bba611b1e6147f7565b84611bb58560016000611b2f6147f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db690919063ffffffff16565b6147ff565b6001905092915050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611c22612d25565b611c94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611d05600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612c5e565b905090565b6000611da2622014808373ffffffffffffffffffffffffffffffffffffffff1663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b158015611d5957600080fd5b505afa158015611d6d573d6000803e3d6000fd5b505050506040513d6020811015611d8357600080fd5b8101908080519060200190929190505050614e3e90919063ffffffff16565b9050919050565b611db1612d25565b611e23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611e94600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611d0a565b905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611f3457600080fd5b505af1158015611f48573d6000803e3d6000fd5b5050505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611ffa57600080fd5b505af115801561200e573d6000803e3d6000fd5b505050506040513d602081101561202457600080fd5b8101908080519060200190929190505050116120a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f46554c4352554d3a207769746864726177206661696c6564000000000000000081525060200191505060405180910390fd5b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561212257600080fd5b505af1158015612136573d6000803e3d6000fd5b505050506040513d602081101561214c57600080fd5b8101908080519060200190929190505050146121d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f434f4d504f554e443a207769746864726177206661696c65640000000000000081525060200191505060405180910390fd5b50565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612201612d25565b612273576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561235857600080fd5b505afa15801561236c573d6000803e3d6000fd5b505050506040513d602081101561238257600080fd5b8101908080519060200190929190505050905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b36123de614702565b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561244857600080fd5b505af115801561245c573d6000803e3d6000fd5b505050506040513d602081101561247257600080fd5b81019080805190602001909291905050505061248c614658565b73ffffffffffffffffffffffffffffffffffffffff1663d2d0e066600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018261ffff1681526020019350505050600060405180830381600087803b15801561254157600080fd5b505af1158015612555573d6000803e3d6000fd5b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006125f96125b1613107565b6125eb6125bc613547565b6125dd6125c7614538565b6125cf6132b5565b614db690919063ffffffff16565b614db690919063ffffffff16565b614db690919063ffffffff16565b905090565b612606612d25565b612678576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b612741612d25565b6127b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b601060149054906101000a900460ff16156127e8576000601060146101000a81548160ff021916908315150217905550612804565b6001601060146101000a81548160ff0219169083151502179055505b565b61280e612d25565b612880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006128ce613078565b9050601260009054906101000a900460ff1660038111156128eb57fe5b8160038111156128f757fe5b1461290557612904614ec4565b5b600061290f613107565b11156129af5760038081111561292157fe5b81600381111561292d57fe5b14156129485761294361293e613107565b6129d5565b6129ae565b6001600381111561295557fe5b81600381111561296157fe5b141561297c57612977612972613107565b6141c5565b6129ad565b6002600381111561298957fe5b81600381111561299557fe5b14156129ac576129ab6129a6613107565b612398565b5b5b5b5b80601260006101000a81548160ff021916908360038111156129cd57fe5b021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612aa057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b505050506040513d6020811015612aca57600080fd5b8101908080519060200190929190505050506000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b8757600080fd5b505af1158015612b9b573d6000803e3d6000fd5b505050506040513d6020811015612bb157600080fd5b810190808051906020019092919050505011612c35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f46554c4352554d3a20737570706c79206661696c65640000000000000000000081525060200191505060405180910390fd5b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612cf460648373ffffffffffffffffffffffffffffffffffffffff166309ec6b6b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612cab57600080fd5b505afa158015612cbf573d6000803e3d6000fd5b505050506040513d6020811015612cd557600080fd5b81019080805190602001909291905050506149f690919063ffffffff16565b9050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612d686147f7565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b612d8c612d25565b612dfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612eda5780601f10612eaf57610100808354040283529160200191612eda565b820191906000526020600020905b815481529060010190602001808311612ebd57829003601f168201915b5050505050905090565b612f73600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f209092919063ffffffff16565b612fe7612f7e614702565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f209092919063ffffffff16565b613076600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f209092919063ffffffff16565b565b600080613083611e67565b9050600061308f6118df565b9050600061309b611cd8565b90506000809050808411156130ae578390505b808211156130ba578190505b808311156130c6578290505b6000809050848214156130dc57600190506130fc565b828214156130ed57600390506130fb565b838214156130fa57600290505b5b5b809550505050505090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156131a857600080fd5b505afa1580156131bc573d6000803e3d6000fd5b505050506040513d60208110156131d257600080fd5b8101908080519060200190929190505050905090565b60006132ab6131f56147f7565b846132a685604051806060016040528060258152602001615eeb602591396001600061321f6147f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614cf69092919063ffffffff16565b6147ff565b6001905092915050565b6000806132c06122b7565b9050600081111561339d5761339a670de0b6b3a764000061338c600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561334257600080fd5b505afa158015613356573d6000803e3d6000fd5b505050506040513d602081101561336c57600080fd5b810190808051906020019092919050505084614e3e90919063ffffffff16565b6149f690919063ffffffff16565b90505b8091505090565b60006133b86133b16147f7565b8484614a40565b6001905092915050565b600080600090506133d1612d25565b156133f9578290506001601060146101000a81548160ff02191690831515021790555061353e565b613401611ae7565b60ff16600a0a61271002600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156134aa57600080fd5b505afa1580156134be573d6000803e3d6000fd5b505050506040513d60208110156134d457600080fd5b810190808051906020019092919050505011801561351457506135096103e86134fb61167e565b6149f690919063ffffffff16565b6135123361255c565b115b156135215782905061353d565b61352a33611bc4565b156135375782905061353c565b600090505b5b5b80915050919050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156135e857600080fd5b505afa1580156135fc573d6000803e3d6000fd5b505050506040513d602081101561361257600080fd5b8101908080519060200190929190505050905090565b6001600660008282540192505081905550600060065490506136486125a4565b60098190555061369d333085600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16615140909392919063ffffffff16565b60006136a8836133c2565b905060006136b4613107565b1115613a565760001515601060149054906101000a900460ff16151514156137fd5760008114156136ec576136e76128c4565b613784565b600080905060018214156137035760019050613725565b60028214156137155760039050613724565b600382141561372357600290505b5b5b6000600381111561373257fe5b81600381111561373e57fe5b1461378257601260009054906101000a900460ff16600381111561375e57fe5b81600381111561376a57fe5b1461377857613777614ec4565b5b61378181615246565b5b505b7f799f5e824ab4453bb6de59ec47cb353a18956816560a099048c29edb016ff635601060149054906101000a900460ff1682601260009054906101000a900460ff1660038111156137d157fe5b6040518084151515158152602001838152602001828152602001935050505060405180910390a1613a55565b6000809050600082141561394d576000600381111561381857fe5b601260009054906101000a900460ff16600381111561383357fe5b14156138bb576138416128c4565b7f799f5e824ab4453bb6de59ec47cb353a18956816560a099048c29edb016ff635601060149054906101000a900460ff166007601260009054906101000a900460ff16600381111561388f57fe5b6040518084151515158152602001838152602001828152602001935050505060405180910390a1613948565b6138d3601260009054906101000a900460ff16615246565b7f799f5e824ab4453bb6de59ec47cb353a18956816560a099048c29edb016ff635601060149054906101000a900460ff1683601260009054906101000a900460ff16600381111561392057fe5b6040518084151515158152602001838152602001828152602001935050505060405180910390a15b613a53565b600182141561395f5760019050613981565b60028214156139715760039050613980565b600382141561397f57600290505b5b5b6000600381111561398e57fe5b81600381111561399a57fe5b146139de57601260009054906101000a900460ff1660038111156139ba57fe5b8160038111156139c657fe5b146139d4576139d3614ec4565b5b6139dd81615246565b5b7f799f5e824ab4453bb6de59ec47cb353a18956816560a099048c29edb016ff635601060149054906101000a900460ff1683601260009054906101000a900460ff166003811115613a2b57fe5b6040518084151515158152602001838152602001828152602001935050505060405180910390a15b505b5b600080905060006009541415613a755784905084600981905550613aa1565b613a9e600954613a9060025488614e3e90919063ffffffff16565b6149f690919063ffffffff16565b90505b613aa96125a4565b600981905550613ab93382615316565b613af9601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613af4601154846149f690919063ffffffff16565b615316565b50506006548114613b72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b60016006600082825401925050819055506000600654905060008211613c05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f7769746864726177206d7573742062652067726561746572207468616e20300081525060200191505060405180910390fd5b6000613c103361255c565b905080831115613c88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e73756666696369656e742062616c616e636500000000000000000000000081525060200191505060405180910390fd5b613c906125a4565b6009819055506000613cc1600254613cb386600954614e3e90919063ffffffff16565b6149f690919063ffffffff16565b9050613d4b846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614cf69092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613da2846002546154d190919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a36000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613eaf57600080fd5b505afa158015613ec3573d6000803e3d6000fd5b505050506040513d6020811015613ed957600080fd5b810190808051906020019092919050505090506000601260009054906101000a900460ff16905082821015613f8957613f10613078565b9050601260009054906101000a900460ff166003811115613f2d57fe5b816003811115613f3957fe5b14158015613f5a575060001515601060149054906101000a900460ff161515145b15613f6c57613f67614ec4565b613f88565b613f87613f8283856154d190919063ffffffff16565b61551b565b5b5b613fd63384600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166156429092919063ffffffff16565b601260009054906101000a900460ff166003811115613ff157fe5b816003811115613ffd57fe5b1415801561401e575060001515601060149054906101000a900460ff161515145b1561402d5761402c81615246565b5b6140356125a4565b6009819055505050505060065481146140b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b614149612d25565b6141bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060118190555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561429057600080fd5b505af11580156142a4573d6000803e3d6000fd5b505050506040513d60208110156142ba57600080fd5b8101908080519060200190929190505050506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561434357600080fd5b505af1158015614357573d6000803e3d6000fd5b505050506040513d602081101561436d57600080fd5b8101908080519060200190929190505050146143f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f434f4d504f554e443a20737570706c79206661696c656400000000000000000081525060200191505060405180910390fd5b50565b6143fc612d25565b61446e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6144ba612d25565b61452c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61453581615713565b50565b600080614543611597565b9050600081111561462b57600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156145ed57600080fd5b505afa158015614601573d6000803e3d6000fd5b505050506040513d602081101561461757600080fd5b810190808051906020019092919050505090505b8091505090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156146c257600080fd5b505afa1580156146d6573d6000803e3d6000fd5b505050506040513d60208110156146ec57600080fd5b8101908080519060200190929190505050905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b15801561476c57600080fd5b505afa158015614780573d6000803e3d6000fd5b505050506040513d602081101561479657600080fd5b8101908080519060200190929190505050905090565b6013602052816000526040600020602052806000526040600020600091509150505481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614885576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615e676024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561490b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615db16022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000614a3883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615859565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615e426025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615d686023913960400191505060405180910390fd5b614bb781604051806060016040528060268152602001615dd3602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614cf69092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614c4a816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db690919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290614da3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614d68578082015181840152602081019050614d4d565b50505050905090810190601f168015614d955780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015614e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831415614e515760009050614ebe565b6000828402905082848281614e6257fe5b0414614eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615df96021913960400191505060405180910390fd5b809150505b92915050565b6000614ece6122b7565b90506000811115614ee357614ee2816120ab565b5b614eeb611597565b90506000811115614f0057614eff81611f4f565b5b614f08613547565b90506000811115614f1d57614f1c81611ebf565b5b50565b600081148061501a575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015614fdd57600080fd5b505afa158015614ff1573d6000803e3d6000fd5b505050506040513d602081101561500757600080fd5b8101908080519060200190929190505050145b61506f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180615eb56036913960400191505060405180910390fd5b61513b838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061591f565b505050565b615240848573ffffffffffffffffffffffffffffffffffffffff166323b872dd905060e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061591f565b50505050565b6000615250613107565b11156152f05760038081111561526257fe5b81600381111561526e57fe5b14156152895761528461527f613107565b6129d5565b6152ef565b6001600381111561529657fe5b8160038111156152a257fe5b14156152bd576152b86152b3613107565b6141c5565b6152ee565b600260038111156152ca57fe5b8160038111156152d657fe5b14156152ed576152ec6152e7613107565b612398565b5b5b5b5b80601260006101000a81548160ff0219169083600381111561530e57fe5b021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156153b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6153ce81600254614db690919063ffffffff16565b600281905550615425816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614db690919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600061551383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614cf6565b905092915050565b6001600381111561552857fe5b601260009054906101000a900460ff16600381111561554357fe5b14156155535761555281615b6a565b5b6002600381111561556057fe5b601260009054906101000a900460ff16600381111561557b57fe5b1415615608578061558a613547565b10156155fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e73756666696369656e742066756e6473000000000000000000000000000081525060200191505060405180910390fd5b61560781611ebf565b5b60038081111561561457fe5b601260009054906101000a900460ff16600381111561562f57fe5b141561563f5761563e81615c43565b5b50565b61570e838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061591f565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415615799576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615d8b6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290615905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156158ca5780820151818401526020810190506158af565b50505050905090810190601f1680156158f75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161591157fe5b049050809150509392505050565b61593e8273ffffffffffffffffffffffffffffffffffffffff16615d1c565b6159b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106159ff57805182526020820191506020810190506020830392506159dc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615a61576040519150601f19603f3d011682016040523d82523d6000602084013e615a66565b606091505b509150915081615ade576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115615b6457808060200190516020811015615afd57600080fd5b8101908080519060200190929190505050615b63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615e8b602a913960400191505060405180910390fd5b5b50505050565b6000615b746122b7565b90506000615b806132b5565b905082811015615bf8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e73756666696369656e742066756e6473000000000000000000000000000081525060200191505060405180910390fd5b6000615c326001615c2484615c168888614e3e90919063ffffffff16565b6149f690919063ffffffff16565b614db690919063ffffffff16565b9050615c3d816120ab565b50505050565b6000615c4d611597565b90506000615c59614538565b905082811015615cd1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e73756666696369656e742066756e6473000000000000000000000000000081525060200191505060405180910390fd5b6000615d0b6001615cfd84615cef8888614e3e90919063ffffffff16565b6149f690919063ffffffff16565b614db690919063ffffffff16565b9050615d1681611f4f565b50505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015615d5e5750808214155b9250505091905056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158203ef1fe36516be29ae3955daab9c3c6b78711dc829e044a92a50eeb0d50dcfc8364736f6c634300050c0032

Deployed Bytecode Sourcemap

15066:11985:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15066:11985:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15430:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15364:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14089:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;14089:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15596:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11109:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11109:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14653:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14653:135:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;18094:113;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15238:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10592:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20338:235;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20338:235:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11267:304;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11267:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20249:86;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14796:143;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14796:143:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;17319:78;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17319:78:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;14271:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15457:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11577:210;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11577:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14947:112;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14947:112:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17503:76;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17503:76:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;20155:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19786:137;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19786:137:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17156:79;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17156:79:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;19926:93;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15395:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19534:84;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19534:84:0;;;;;;;;;;;;;;;;;:::i;:::-;;19391:140;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19391:140:0;;;;;;;;;;;;;;;;;:::i;:::-;;19621:139;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19621:139:0;;;;;;;;;;;;;;;;;:::i;:::-;;15315:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17400:100;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17400:100:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;17976:115;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18945:188;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18945:188:0;;;;;;;;;;;;;;;;;:::i;:::-;;10689:110;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10689:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21055:186;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1890:140;;;:::i;:::-;;16990:163;;;:::i;:::-;;17753:81;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17753:81:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;21802:440;;;:::i;:::-;;18757:185;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18757:185:0;;;;;;;;;;;;;;;;;:::i;:::-;;15341:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20022:130;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20022:130:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1079:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1445:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17668:82;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17668:82:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;14178:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;14178:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16479:203;;;:::i;:::-;;21247:549;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17864:109;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11793:261;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11793:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18325:206;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10805:158;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10805:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20601:448;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20601:448:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18210:112;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22254:2063;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22254:2063:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24323:1063;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24323:1063:0;;;;;;;;;;;;;;;;;:::i;:::-;;10969:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10969:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17238:78;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17238:78:0;;;;;;;;;;;;;;;;;:::i;:::-;;19136:224;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19136:224:0;;;;;;;;;;;;;;;;;:::i;:::-;;17582:83;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17582:83:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;2185:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2185:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;18534:194;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15288:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16688:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16823:134;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15763:72;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15763:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15264:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15430:23;;;;;;;;;;;;;:::o;15364:24::-;;;;;;;;;;;;;:::o;14089:83::-;14126:13;14159:5;14152:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14089:83;:::o;15596:36::-;;;;;;;;;;;;;:::o;11109:152::-;11175:4;11192:39;11201:12;:10;:12::i;:::-;11215:7;11224:6;11192:8;:39::i;:::-;11249:4;11242:11;;11109:152;;;;:::o;14653:135::-;1291:9;:7;:9::i;:::-;1283:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14734:4;14712:9;:19;14722:8;14712:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;14771:8;14754:26;;;;;;;;;;;;14653:135;:::o;18094:113::-;18141:7;18169;;;;;;;;;;;18162:25;;;18196:4;18162:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18162:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18162:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18162:40:0;;;;;;;;;;;;;;;;18155:47;;18094:113;:::o;15238:19::-;;;;:::o;10592:91::-;10636:7;10663:12;;10656:19;;10592:91;:::o;20338:235::-;20395:7;20409:20;20477:4;;;;;;;;;;;20448:53;;;:55;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20448:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20448:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20448:55:0;;;;;;;;;;;;;;;;20409:95;;20516:52;20564:3;20516:4;:35;;;20552:6;20516:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20516:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20516:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20516:43:0;;;;;;;;;;;;;;;;:47;;:52;;;;:::i;:::-;20509:59;;;20338:235;;;:::o;11267:304::-;11356:4;11373:36;11383:6;11391:9;11402:6;11373:9;:36::i;:::-;11420:121;11429:6;11437:12;:10;:12::i;:::-;11451:89;11489:6;11451:89;;;;;;;;;;;;;;;;;:11;:19;11463:6;11451:19;;;;;;;;;;;;;;;:33;11471:12;:10;:12::i;:::-;11451:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;11420:8;:121::i;:::-;11559:4;11552:11;;11267:304;;;;;:::o;20249:86::-;20292:7;20313:17;20324:5;;;;;;;;;;;20313:10;:17::i;:::-;20306:24;;20249:86;:::o;14796:143::-;1291:9;:7;:9::i;:::-;1283:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14880:5;14858:9;:19;14868:8;14858:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;14922:8;14901:30;;;;;;;;;;;;14796:143;:::o;17319:78::-;1291:9;:7;:9::i;:::-;1283:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17386:6;17378:5;;:14;;;;;;;;;;;;;;;;;;17319:78;:::o;14271:83::-;14312:5;14337:9;;;;;;;;;;;14330:16;;14271:83;:::o;15457:23::-;;;;;;;;;;;;;:::o;11577:210::-;11657:4;11674:83;11683:12;:10;:12::i;:::-;11697:7;11706:50;11745:10;11706:11;:25;11718:12;:10;:12::i;:::-;11706:25;;;;;;;;;;;;;;;:34;11732:7;11706:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;11674:8;:83::i;:::-;11775:4;11768:11;;11577:210;;;;:::o;14947:112::-;15008:4;15032:9;:19;15042:8;15032:19;;;;;;;;;;;;;;;;;;;;;;;;;15025:26;;14947:112;;;:::o;17503:76::-;1291:9;:7;:9::i;:::-;1283:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17568:6;17561:4;;:13;;;;;;;;;;;;;;;;;;17503:76;:::o;20155:91::-;20198:7;20219:22;20233:7;;;;;;;;;;;20219:13;:22::i;:::-;20212:29;;20155:91;:::o;19786:137::-;19847:7;19868:50;19910:7;19877:6;19868:35;;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19868:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19868:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19868:37:0;;;;;;;;;;;;;;;;:41;;:50;;;;:::i;:::-;19861:57;;19786:137;;;:::o;17156:79::-;1291:9;:7;:9::i;:::-;1283:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17226:4;17215:8;;:15;;;;;;;;;;;;;;;;;;17156:79;:::o;19926:93::-;19969:7;19990:24;20005:8;;;;;;;;;;;19990:14;:24::i;:::-;19983:31;;19926:93;:::o;15395:31::-;;;;;;;;;;;;;:::o;19534:84::-;19588:9;;;;;;;;;;;19581:24;;;19606:6;19581:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19581:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19581:32:0;;;;19534:84;:::o;19391:140::-;19496:1;19457:7;;;;;;;;;;;19449:21;;;19479:4;19486:6;19449:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19449:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19449:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19449:44:0;;;;;;;;;;;;;;;;:48;19441:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19391:140;:::o;19621:139::-;19724:1;19696:8;;;;;;;;;;;19687:25;;;19713:6;19687:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19687:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19687:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19687:33:0;;;;;;;;;;;;;;;;:38;19679:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19621:139;:::o;15315:22::-;;;;;;;;;;;;;:::o;17400:100::-;1291:9;:7;:9::i;:::-;1283:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17489:6;17470:16;;:25;;;;;;;;;;;;;;;;;;17400:100;:::o;17976:115::-;18024:7;18052:8;;;;;;;;;;;18045:26;;;18080:4;18045:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18045:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18045:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18045:41:0;;;;;;;;;;;;;;;;18038:48;;17976:115;:::o;18945:188::-;19003:5;;;;;;;;;;;18996:21;;;19018:13;:11;:13::i;:::-;19033:6;18996:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18996:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18996:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18996:44:0;;;;;;;;;;;;;;;;;19092:9;:7;:9::i;:::-;19087:23;;;19111:5;;;;;;;;;;;19118:6;19126:1;19087:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19087:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19087:41:0;;;;18945:188;:::o;10689:110::-;10746:7;10773:9;:18;10783:7;10773:18;;;;;;;;;;;;;;;;10766:25;;10689:110;;;:::o;21055:186::-;21108:4;21126:110;21221:14;:12;:14::i;:::-;21126:84;21196:13;:11;:13::i;:::-;21126:59;21161:23;:21;:23::i;:::-;21126:24;:22;:24::i;:::-;:34;;:59;;;;:::i;:::-;:69;;:84;;;;:::i;:::-;:94;;:110;;;;:::i;:::-;21119:117;;21055:186;:::o;1890:140::-;1291:9;:7;:9::i;:::-;1283:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1989:1;1952:40;;1973:6;;;;;;;;;;;1952:40;;;;;;;;;;;;2020:1;2003:6;;:19;;;;;;;;;;;;;;;;;;1890:140::o;16990:163::-;1291:9;:7;:9::i;:::-;1283:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17043:11;;;;;;;;;;;17040:109;;;17081:5;17067:11;;:19;;;;;;;;;;;;;;;;;;17040:109;;;17136:4;17122:11;;:18;;;;;;;;;;;;;;;;;;17040:109;16990:163::o;17753:81::-;1291:9;:7;:9::i;:::-;1283:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17823:6;17813:7;;:16;;;;;;;;;;;;;;;;;;17753:81;:::o;21802:440::-;21835:18;21856:11;:9;:11::i;:::-;21835:32;;21891:8;;;;;;;;;;;21876:23;;;;;;;;:11;:23;;;;;;;;;21872:58;;21910:14;:12;:14::i;:::-;21872:58;21955:1;21938:14;:12;:14::i;:::-;:18;21934:277;;;21983:14;21968:29;;;;;;;;:11;:29;;;;;;;;;21964:242;;;22006:29;22020:14;:12;:14::i;:::-;22006:13;:29::i;:::-;21964:242;;;22067:15;22052:30;;;;;;;;:11;:30;;;;;;;;;22048:158;;;22091:30;22106:14;:12;:14::i;:::-;22091;:30::i;:::-;22048:158;;;22153:11;22138:26;;;;;;;;:11;:26;;;;;;;;;22134:72;;;22173:26;22184:14;:12;:14::i;:::-;22173:10;:26::i;:::-;22134:72;22048:158;21964:242;21934:277;22226:11;22215:8;;:22;;;;;;;;;;;;;;;;;;;;;;;;21802:440;:::o;18757:185::-;18815:5;;;;;;;;;;;18808:21;;;18830:7;;;;;;;;;;;18839:6;18808:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18808:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18808:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18808:38:0;;;;;;;;;;;;;;;;;18909:1;18870:7;;;;;;;;;;;18862:21;;;18892:4;18899:6;18862:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18862:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18862:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18862:44:0;;;;;;;;;;;;;;;;:48;18854:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18757:185;:::o;15341:19::-;;;;;;;;;;;;;:::o;20022:130::-;20081:7;20102:45;20143:3;20110:6;20102:34;;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20102:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20102:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20102:36:0;;;;;;;;;;;;;;;;:40;;:45;;;;:::i;:::-;20095:52;;20022:130;;;:::o;1079:79::-;1117:7;1144:6;;;;;;;;;;;1137:13;;1079:79;:::o;1445:94::-;1485:4;1525:6;;;;;;;;;;;1509:22;;:12;:10;:12::i;:::-;:22;;;1502:29;;1445:94;:::o;17668:82::-;1291:9;:7;:9::i;:::-;1283:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17739:6;17728:8;;:17;;;;;;;;;;;;;;;;;;17668:82;:::o;14178:87::-;14217:13;14250:7;14243:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14178:87;:::o;16479:203::-;16519:45;16545:8;;;;;;;;;;;16560:2;16526:5;;;;;;;;;;;16519:25;;;;:45;;;;;:::i;:::-;16574:50;16600:13;:11;:13::i;:::-;16620:2;16581:5;;;;;;;;;;;16574:25;;;;:50;;;;;:::i;:::-;16633:44;16659:7;;;;;;;;;;;16673:2;16640:5;;;;;;;;;;;16633:25;;;;:44;;;;;:::i;:::-;16479:203::o;21247:549::-;21289:6;21302:12;21317;:10;:12::i;:::-;21302:27;;21334:12;21349;:10;:12::i;:::-;21334:27;;21366:12;21381;:10;:12::i;:::-;21366:27;;21400:11;21414:1;21400:15;;21431:3;21424:4;:10;21420:39;;;21449:4;21443:10;;21420:39;21474:3;21467:4;:10;21463:39;;;21492:4;21486:10;;21463:39;21517:3;21510:4;:10;21506:39;;;21535:4;21529:10;;21506:39;21551:18;21572:11;21551:32;;21599:4;21592:3;:11;21588:181;;;21625:15;21611:29;;21588:181;;;21663:4;21656:3;:11;21652:117;;;21689:14;21675:28;;21652:117;;;21726:4;21719:3;:11;21715:54;;;21752:11;21738:25;;21715:54;21652:117;21588:181;21780:11;21773:18;;;;;;;21247:549;:::o;17864:109::-;17909:7;17937:5;;;;;;;;;;;17930:23;;;17962:4;17930:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17930:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17930:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17930:38:0;;;;;;;;;;;;;;;;17923:45;;17864:109;:::o;11793:261::-;11878:4;11895:129;11904:12;:10;:12::i;:::-;11918:7;11927:96;11966:15;11927:96;;;;;;;;;;;;;;;;;:11;:25;11939:12;:10;:12::i;:::-;11927:25;;;;;;;;;;;;;;;:34;11953:7;11927:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;11895:8;:129::i;:::-;12042:4;12035:11;;11793:261;;;;:::o;18325:206::-;18380:7;18394:9;18406:17;:15;:17::i;:::-;18394:29;;18436:1;18432;:5;18428:86;;;18452:56;18503:4;18452:46;18467:8;;;;;;;;;;;18458:37;;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18458:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18458:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18458:39:0;;;;;;;;;;;;;;;;18452:1;:5;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;18448:60;;18428:86;18525:1;18518:8;;;18325:206;:::o;10805:158::-;10874:4;10891:42;10901:12;:10;:12::i;:::-;10915:9;10926:6;10891:9;:42::i;:::-;10951:4;10944:11;;10805:158;;;;:::o;20601:448::-;20650:7;20664:14;20681:1;20664:18;;20690:9;:7;:9::i;:::-;20687:340;;;20715:4;20706:13;;20739:4;20725:11;;:18;;;;;;;;;;;;;;;;;;20687:340;;;20843:10;:8;:10::i;:::-;20835:19;;20829:2;:25;20820:5;:34;20769:16;;;;;;;;;;;20762:34;;;20805:10;20762:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20762:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20762:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20762:55:0;;;;;;;;;;;;;;;;:92;:143;;;;;20882:23;20900:4;20882:13;:11;:13::i;:::-;:17;;:23;;;;:::i;:::-;20858:21;20868:10;20858:9;:21::i;:::-;:47;20762:143;20758:269;;;20922:4;20913:13;;20758:269;;;20945:25;20959:10;20945:13;:25::i;:::-;20941:86;;;20987:4;20978:13;;20941:86;;;21020:1;21011:10;;20941:86;20758:269;20687:340;21038:6;21031:13;;;20601:448;;;:::o;18210:112::-;18254:7;18282:9;;;;;;;;;;;18275:27;;;18311:4;18275:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18275:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18275:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18275:42:0;;;;;;;;;;;;;;;;18268:49;;18210:112;:::o;22254:2063::-;2826:1;2809:13;;:18;;;;;;;;;;;2838:20;2861:13;;2838:36;;22341:22;:20;:22::i;:::-;22334:4;:29;;;;22368:66;22399:10;22419:4;22426:7;22375:5;;;;;;;;;;;22368:30;;;;:66;;;;;;:::i;:::-;22443:9;22455:16;22465:5;22455:9;:16::i;:::-;22443:28;;22499:1;22482:14;:12;:14::i;:::-;:18;22478:1477;;;22530:5;22515:20;;:11;;;;;;;;;;;:20;;;22512:1438;;;22554:1;22546:4;:9;22543:486;;;22564:11;:9;:11::i;:::-;22543:486;;;22601:18;22622:11;22601:32;;22652:1;22644:4;:9;22641:199;;;22677:15;22663:29;;22641:199;;;22724:1;22716:4;:9;22713:127;;;22749:14;22735:28;;22713:127;;;22795:1;22787:4;:9;22784:56;;;22820:11;22806:25;;22784:56;22713:127;22641:199;22872:11;22857:26;;;;;;;;:11;:26;;;;;;;;;22854:168;;22918:8;;;;;;;;;;;22903:23;;;;;;;;:11;:23;;;;;;;;;22899:74;;22941:14;:12;:14::i;:::-;22899:74;22987:23;22998:11;22987:10;:23::i;:::-;22854:168;22543:486;;23040:47;23050:11;;;;;;;;;;;23063:4;23077:8;;;;;;;;;;;23069:17;;;;;;;;23040:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22512:1438;;;23110:18;23131:11;23110:32;;23160:1;23152:4;:9;23149:795;;;23189:11;23177:23;;;;;;;;:8;;;;;;;;;;;:23;;;;;;;;;23174:257;;;23216:11;:9;:11::i;:::-;23247:44;23257:11;;;;;;;;;;;23270:1;23281:8;;;;;;;;;;;23273:17;;;;;;;;23247:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23174:257;;;23332:20;23343:8;;;;;;;;;;;23332:10;:20::i;:::-;23372:47;23382:11;;;;;;;;;;;23395:4;23409:8;;;;;;;;;;;23401:17;;;;;;;;23372:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23174:257;23149:795;;;23471:1;23463:4;:9;23460:223;;;23499:15;23485:29;;23460:223;;;23552:1;23544:4;:9;23541:142;;;23580:14;23566:28;;23541:142;;;23632:1;23624:4;:9;23621:62;;;23660:11;23646:25;;23621:62;23541:142;23460:223;23721:11;23706:26;;;;;;;;:11;:26;;;;;;;;;23703:168;;23767:8;;;;;;;;;;;23752:23;;;;;;;;:11;:23;;;;;;;;;23748:74;;23790:14;:12;:14::i;:::-;23748:74;23836:23;23847:11;23836:10;:23::i;:::-;23703:168;23886:47;23896:11;;;;;;;;;;;23909:4;23923:8;;;;;;;;;;;23915:17;;;;;;;;23886:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23149:795;22512:1438;;22478:1477;24003:14;24020:1;24003:18;;24044:1;24036:4;;:9;24032:166;;;24071:7;24062:16;;24100:7;24093:4;:14;;;;24032:166;;;24149:37;24181:4;;24150:25;24162:12;;24150:7;:11;;:25;;;;:::i;:::-;24149:31;;:37;;;;:::i;:::-;24140:46;;24032:166;24215:22;:20;:22::i;:::-;24208:4;:29;;;;24248:25;24254:10;24266:6;24248:5;:25::i;:::-;24278:34;24284:8;;;;;;;;;;;24294:17;24305:5;;24294:6;:10;;:17;;;;:::i;:::-;24278:5;:34::i;:::-;2885:1;;2921:13;;2905:12;:29;2897:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22254:2063;;;:::o;24323:1063::-;2826:1;2809:13;;:18;;;;;;;;;;;2838:20;2861:13;;2838:36;;24403:1;24393:7;:11;24385:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24447:15;24465:21;24475:10;24465:9;:21::i;:::-;24447:39;;24510:7;24499;:18;;24491:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24556:22;:20;:22::i;:::-;24549:4;:29;;;;24626:9;24638:37;24662:12;;24639:17;24648:7;24639:4;;:8;;:17;;;;:::i;:::-;24638:23;;:37;;;;:::i;:::-;24626:49;;24749:67;24775:7;24749:67;;;;;;;;;;;;;;;;;:9;:21;24759:10;24749:21;;;;;;;;;;;;;;;;:25;;:67;;;;;:::i;:::-;24725:9;:21;24735:10;24725:21;;;;;;;;;;;;;;;:91;;;;24836:25;24853:7;24836:12;;:16;;:25;;;;:::i;:::-;24821:12;:40;;;;24902:1;24873:41;;24882:10;24873:41;;;24906:7;24873:41;;;;;;;;;;;;;;;;;;24941:9;24960:5;;;;;;;;;;;24953:23;;;24985:4;24953:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24953:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24953:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24953:38:0;;;;;;;;;;;;;;;;24941:50;;24996:18;25017:8;;;;;;;;;;;24996:29;;25038:1;25034;:5;25030:178;;;25061:11;:9;:11::i;:::-;25047:25;;25097:8;;;;;;;;;;;25082:23;;;;;;;;:11;:23;;;;;;;;;;:47;;;;;25124:5;25109:20;;:11;;;;;;;;;;;:20;;;25082:47;25078:125;;;25139:14;:12;:14::i;:::-;25078:125;;;25173:23;25187:8;25193:1;25187;:5;;:8;;;;:::i;:::-;25173:13;:23::i;:::-;25078:125;25030:178;25214:41;25241:10;25253:1;25221:5;;;;;;;;;;;25214:26;;;;:41;;;;;:::i;:::-;25279:8;;;;;;;;;;;25264:23;;;;;;;;:11;:23;;;;;;;;;;:47;;;;;25306:5;25291:20;;:11;;;;;;;;;;;:20;;;25264:47;25260:88;;;25319:23;25330:11;25319:10;:23::i;:::-;25260:88;25359:22;:20;:22::i;:::-;25352:4;:29;;;;2885:1;;;;2921:13;;2905:12;:29;2897:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24323:1063;;:::o;10969:134::-;11041:7;11068:11;:18;11080:5;11068:18;;;;;;;;;;;;;;;:27;11087:7;11068:27;;;;;;;;;;;;;;;;11061:34;;10969:134;;;;:::o;17238:78::-;1291:9;:7;:9::i;:::-;1283:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17305:6;17297:5;:14;;;;17238:78;:::o;19136:224::-;19198:5;;;;;;;;;;;19191:21;;;19213:8;;;;;;;;;;;19223:6;19191:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19191:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19191:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19191:39:0;;;;;;;;;;;;;;;;;19326:1;19300:8;;;;;;;;;;;19291:23;;;19315:6;19291:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19291:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19291:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19291:31:0;;;;;;;;;;;;;;;;:36;19283:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19136:224;:::o;17582:83::-;1291:9;:7;:9::i;:::-;1283:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17654:6;17642:9;;:18;;;;;;;;;;;;;;;;;;17582:83;:::o;2185:109::-;1291:9;:7;:9::i;:::-;1283:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2258:28;2277:8;2258:18;:28::i;:::-;2185:109;:::o;18534:194::-;18588:7;18602:9;18614:16;:14;:16::i;:::-;18602:28;;18643:1;18639;:5;18635:76;;;18667:7;;;;;;;;;;;18659:31;;;18699:4;18659:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18659:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18659:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18659:46:0;;;;;;;;;;;;;;;;18655:50;;18635:76;18722:1;18715:8;;;18534:194;:::o;15288:23::-;;;;;;;;;;;;;:::o;16688:126::-;16728:7;16784:4;;;;;;;;;;;16755:49;;;:51;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16755:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16755:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16755:51:0;;;;;;;;;;;;;;;;16748:58;;16688:126;:::o;16823:134::-;16867:7;16923:4;;;;;;;;;;;16894:53;;;:55;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16894:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16894:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16894:55:0;;;;;;;;;;;;;;;;16887:62;;16823:134;:::o;15763:72::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15264:20::-;;;;;;;;;;;;;:::o;283:98::-;328:15;363:10;356:17;;283:98;:::o;13205:338::-;13316:1;13299:19;;:5;:19;;;;13291:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13397:1;13378:21;;:7;:21;;;;13370:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13481:6;13451:11;:18;13463:5;13451:18;;;;;;;;;;;;;;;:27;13470:7;13451:27;;;;;;;;;;;;;;;:36;;;;13519:7;13503:32;;13512:5;13503:32;;;13528:6;13503:32;;;;;;;;;;;;;;;;;;13205:338;;;:::o;3847:132::-;3905:7;3932:39;3936:1;3939;3932:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3925:46;;3847:132;;;;:::o;12060:471::-;12176:1;12158:20;;:6;:20;;;;12150:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12260:1;12239:23;;:9;:23;;;;12231:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12335;12357:6;12335:71;;;;;;;;;;;;;;;;;:9;:17;12345:6;12335:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;12315:9;:17;12325:6;12315:17;;;;;;;;;;;;;;;:91;;;;12440:32;12465:6;12440:9;:20;12450:9;12440:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;12417:9;:20;12427:9;12417:20;;;;;;;;;;;;;;;:55;;;;12505:9;12488:35;;12497:6;12488:35;;;12516:6;12488:35;;;;;;;;;;;;;;;;;;12060:471;;;:::o;3393:192::-;3479:7;3512:1;3507;:6;;3515:12;3499:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3499:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3539:9;3555:1;3551;:5;3539:17;;3576:1;3569:8;;;3393:192;;;;;:::o;3064:181::-;3122:7;3142:9;3158:1;3154;:5;3142:17;;3183:1;3178;:6;;3170:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3236:1;3229:8;;;3064:181;;;;:::o;3591:250::-;3649:7;3678:1;3673;:6;3669:47;;;3703:1;3696:8;;;;3669:47;3728:9;3744:1;3740;:5;3728:17;;3773:1;3768;3764;:5;;;;;;:10;3756:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3832:1;3825:8;;;3591:250;;;;;:::o;25857:297::-;25895:14;25912:17;:15;:17::i;:::-;25895:34;;25947:1;25938:6;:10;25934:52;;;25956:24;25973:6;25956:16;:24::i;:::-;25934:52;25999:16;:14;:16::i;:::-;25990:25;;26033:1;26024:6;:10;26020:51;;;26042:23;26058:6;26042:15;:23::i;:::-;26020:51;26084:13;:11;:13::i;:::-;26075:22;;26115:1;26106:6;:10;26102:48;;;26124:20;26137:6;26124:12;:20::i;:::-;26102:48;25857:297;:::o;5960:347::-;6065:1;6056:5;:10;6055:62;;;;6115:1;6072:5;:15;;;6096:4;6103:7;6072:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6072:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6072:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6072:39:0;;;;;;;;;;;;;;;;:44;6055:62;6047:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6210:89;6229:5;6259;:13;;;:22;;;;6283:7;6292:5;6236:62;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;6236:62:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;6236:62:0;6210:18;:89::i;:::-;5960:347;;;:::o;5748:204::-;5849:95;5868:5;5898;:18;;;:27;;;;5927:4;5933:2;5937:5;5875:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5875:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;5875:68:0;5849:18;:95::i;:::-;5748:204;;;;:::o;25395:455::-;25476:1;25459:14;:12;:14::i;:::-;:18;25455:355;;;25513:14;25498:29;;;;;;;;:11;:29;;;;;;;;;25494:305;;;25548:29;25562:14;:12;:14::i;:::-;25548:13;:29::i;:::-;25494:305;;;25618:15;25603:30;;;;;;;;:11;:30;;;;;;;;;25599:200;;;25654:30;25669:14;:12;:14::i;:::-;25654;:30::i;:::-;25599:200;;;25725:11;25710:26;;;;;;;;:11;:26;;;;;;;;;25706:93;;;25757:26;25768:14;:12;:14::i;:::-;25757:10;:26::i;:::-;25706:93;25599:200;25494:305;25455:355;25831:11;25820:8;;:22;;;;;;;;;;;;;;;;;;;;;;;;25395:455;:::o;12537:308::-;12632:1;12613:21;;:7;:21;;;;12605:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12698:24;12715:6;12698:12;;:16;;:24;;;;:::i;:::-;12683:12;:39;;;;12754:30;12777:6;12754:9;:18;12764:7;12754:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;12733:9;:18;12743:7;12733:18;;;;;;;;;;;;;;;:51;;;;12821:7;12800:37;;12817:1;12800:37;;;12830:6;12800:37;;;;;;;;;;;;;;;;;;12537:308;;:::o;3251:136::-;3309:7;3336:43;3340:1;3343;3336:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;3329:50;;3251:136;;;;:::o;26159:337::-;26229:15;26217:27;;;;;;;;:8;;;;;;;;;;;:27;;;;;;;;;26213:75;;;26252:30;26274:7;26252:21;:30::i;:::-;26213:75;26308:11;26296:23;;;;;;;;:8;;;;;;;;;;;:23;;;;;;;;;26292:123;;;26352:7;26335:13;:11;:13::i;:::-;:24;;26327:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26388:21;26401:7;26388:12;:21::i;:::-;26292:123;26435:14;26423:26;;;;;;;;:8;;;;;;;;;;;:26;;;;;;;;;26419:73;;;26457:29;26478:7;26457:20;:29::i;:::-;26419:73;26159:337;:::o;5564:176::-;5647:85;5666:5;5696;:14;;;:23;;;;5721:2;5725:5;5673:58;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5673:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;5673:58:0;5647:18;:85::i;:::-;5564:176;;;:::o;2400:229::-;2494:1;2474:22;;:8;:22;;;;2466:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2584:8;2555:38;;2576:6;;;;;;;;;;;2555:38;;;;;;;;;;;;2613:8;2604:6;;:17;;;;;;;;;;;;;;;;;;2400:229;:::o;3985:258::-;4071:7;4170:1;4166;:5;4173:12;4158:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4158:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4197:9;4213:1;4209;:5;;;;;;4197:17;;4234:1;4227:8;;;3985:258;;;;;:::o;6944:598::-;7032:27;7040:5;7032:25;;;:27::i;:::-;7024:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7169:12;7183:23;7218:5;7210:19;;7230:4;7210:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;7210:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;7168:67:0;;;;7254:7;7246:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7335:1;7315:10;:17;:21;7311:224;;;7457:10;7446:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7446:30:0;;;;;;;;;;;;;;;;7438:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7311:224;6944:598;;;;:::o;26502:269::-;26564:9;26576:17;:15;:17::i;:::-;26564:29;;26598:10;26611:24;:22;:24::i;:::-;26598:37;;26654:7;26648:2;:13;;26640:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26689:14;26706:31;26735:1;26706:24;26727:2;26707:14;26713:7;26707:1;:5;;:14;;;;:::i;:::-;26706:20;;:24;;;;:::i;:::-;:28;;:31;;;;:::i;:::-;26689:48;;26742:24;26759:6;26742:16;:24::i;:::-;26502:269;;;;:::o;26776:::-;26837:9;26849:16;:14;:16::i;:::-;26837:28;;26871:10;26884:23;:21;:23::i;:::-;26871:36;;26926:7;26920:2;:13;;26912:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26961:14;26978:31;27007:1;26978:24;26999:2;26979:14;26985:7;26979:1;:5;;:14;;;;:::i;:::-;26978:20;;:24;;;;:::i;:::-;:28;;:31;;;;:::i;:::-;26961:48;;27017:23;27033:6;27017:15;:23::i;:::-;26776:269;;;;:::o;4581:374::-;4641:4;4658:16;4685:19;4707:66;4685:88;;;;4876:7;4864:20;4852:32;;4916:3;4904:15;;:8;:15;;:42;;;;;4935:11;4923:8;:23;;4904:42;4896:51;;;;4581:374;;;:::o

Swarm Source

bzzr://3ef1fe36516be29ae3955daab9c3c6b78711dc829e044a92a50eeb0d50dcfc83

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.