ETH Price: $3,226.29 (-2.86%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Redeem102642562020-06-14 13:53:002044 days ago1592142780IN
0x04EF8121...4432514e9
0 ETH0.0141838717.9
Redeem95428042020-02-24 0:02:572156 days ago1582502577IN
0x04EF8121...4432514e9
0 ETH0.000859311
Rebalance94849362020-02-15 2:33:222165 days ago1581734002IN
0x04EF8121...4432514e9
0 ETH0.005161468.8
Redeem94754312020-02-13 15:13:362166 days ago1581606816IN
0x04EF8121...4432514e9
0 ETH0.003836676
Redeem94657502020-02-12 3:21:382168 days ago1581477698IN
0x04EF8121...4432514e9
0 ETH0.005234688
Invest94621202020-02-11 14:07:262168 days ago1581430046IN
0x04EF8121...4432514e9
0 ETH0.003745186
Redeem94614952020-02-11 11:48:272169 days ago1581421707IN
0x04EF8121...4432514e9
0 ETH0.003926086
Invest94608602020-02-11 9:29:472169 days ago1581413387IN
0x04EF8121...4432514e9
0 ETH0.000579656
Invest94608602020-02-11 9:29:472169 days ago1581413387IN
0x04EF8121...4432514e9
0 ETH0.003745186
Invest94258502020-02-06 0:27:582174 days ago1580948878IN
0x04EF8121...4432514e9
0 ETH0.003655116
Invest94255612020-02-05 23:23:422174 days ago1580945022IN
0x04EF8121...4432514e9
0 ETH0.003743356
Invest94118482020-02-03 20:45:372176 days ago1580762737IN
0x04EF8121...4432514e9
0 ETH0.001247782
Invest94118192020-02-03 20:39:262176 days ago1580762366IN
0x04EF8121...4432514e9
0 ETH0.001248372
Invest94118062020-02-03 20:37:172176 days ago1580762237IN
0x04EF8121...4432514e9
0 ETH0.001547172
Invest94067772020-02-03 2:15:202177 days ago1580696120IN
0x04EF8121...4432514e9
0 ETH0.004395838
Invest Self94067732020-02-03 2:14:292177 days ago1580696069IN
0x04EF8121...4432514e9
0 ETH0.003677368
Redeem94067542020-02-03 2:11:082177 days ago1580695868IN
0x04EF8121...4432514e9
0 ETH0.004565798
Invest94067452020-02-03 2:08:232177 days ago1580695703IN
0x04EF8121...4432514e9
0 ETH0.005164668

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
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:
yWBTC

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
No with 200 runs

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

pragma solidity ^0.5.0;
pragma experimental ABIEncoderV2;

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

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 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 ReentrancyGuard {
    uint256 private _guardCounter;

    constructor () internal {
        _guardCounter = 1;
    }

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

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () internal {
        _owner = _msgSender();
        emit OwnershipTransferred(address(0), _owner);
    }
    function owner() public view returns (address) {
        return _owner;
    }
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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 Compound {
    function mint ( uint256 mintAmount ) external returns ( uint256 );
    function redeem(uint256 redeemTokens) external returns (uint256);
    function exchangeRateStored() external view returns (uint);
}

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

interface ILendingPoolAddressesProvider {
    function getLendingPool() external view returns (address);
}

interface Aave {
    function deposit(address _reserve, uint256 _amount, uint16 _referralCode) external;
}

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

interface IIEarnManager {
    function recommend(address _token) external view returns (
      string memory choice,
      uint256 capr,
      uint256 iapr,
      uint256 aapr,
      uint256 dapr
    );
}

contract Structs {
    struct Val {
        uint256 value;
    }

    enum ActionType {
        Deposit,   // supply tokens
        Withdraw  // borrow tokens
    }

    enum AssetDenomination {
        Wei // the amount is denominated in wei
    }

    enum AssetReference {
        Delta // the amount is given as a delta from the current value
    }

    struct AssetAmount {
        bool sign; // true if positive
        AssetDenomination denomination;
        AssetReference ref;
        uint256 value;
    }

    struct ActionArgs {
        ActionType actionType;
        uint256 accountId;
        AssetAmount amount;
        uint256 primaryMarketId;
        uint256 secondaryMarketId;
        address otherAddress;
        uint256 otherAccountId;
        bytes data;
    }

    struct Info {
        address owner;  // The address that owns the account
        uint256 number; // A nonce that allows a single address to control many accounts
    }

    struct Wei {
        bool sign; // true if positive
        uint256 value;
    }
}

contract DyDx is Structs {
    function getAccountWei(Info memory account, uint256 marketId) public view returns (Wei memory);
    function operate(Info[] memory, ActionArgs[] memory) public;
}

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

contract yWBTC is ERC20, ERC20Detailed, ReentrancyGuard, Ownable, Structs {
  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 dydx;
  uint256 public dToken;
  address public apr;

  enum Lender {
      NONE,
      DYDX,
      COMPOUND,
      AAVE,
      FULCRUM
  }

  Lender public provider = Lender.NONE;

  constructor () public ERC20Detailed("yBTC", "yBTC", 8) {
    token = address(0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599);
    apr = address(0x318135fbD0b40D48fCEF431CCdF6C7926450edFB);
    dydx = address(0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e);
    aave = address(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8);
    fulcrum = address(0xBA9262578EFef8b3aFf7F60Cd629d6CC8859C8b5);
    aaveToken = address(0xFC4B8ED459e00e5400be803A9BB3954234FD50e3);
    compound = address(0xC11b1268C1A384e55C48c2391d8d480264A3A7F4);
    dToken = 0;
    approveToken();
  }
  function set_new_AAVE(address _new_AAVE) public onlyOwner {
      aave = _new_AAVE;
  }
  function set_new_DYDX(address _new_DYDX) public onlyOwner {
      dydx = _new_DYDX;
  }
  function set_new_APR(address _new_APR) public onlyOwner {
      apr = _new_APR;
  }
  function set_new_FULCRUM(address _new_FULCRUM) public onlyOwner {
      fulcrum = _new_FULCRUM;
  }
  function set_new_ATOKEN(address _new_ATOKEN) public onlyOwner {
      aaveToken = _new_ATOKEN;
  }
  function set_new_COMPOUND(address _new_COMPOUND) public onlyOwner {
      compound = _new_COMPOUND;
  }
  function set_new_DTOKEN(uint256 _new_DTOKEN) public onlyOwner {
      dToken = _new_DTOKEN;
  }

  function() external payable {

  }

  function recommend() public view returns (Lender) {
    (,uint256 capr,uint256 iapr,uint256 aapr,uint256 dapr) = IIEarnManager(apr).recommend(token);
    uint256 max = 0;
    if (capr > max) {
      max = capr;
    }
    if (iapr > max) {
      max = iapr;
    }
    if (aapr > max) {
      max = aapr;
    }
    if (dapr > max) {
      max = dapr;
    }

    Lender newProvider = Lender.NONE;
    if (max == dapr) {
      newProvider = Lender.DYDX;
    }
    if (max == aapr) {
      newProvider = Lender.AAVE;
    }
    if (max == iapr) {
      newProvider = Lender.FULCRUM;
    }
    if (max == capr) {
      newProvider = Lender.COMPOUND;
    }
    return newProvider;
  }

  function supplyDydx(uint256 amount) public returns(uint) {
      Info[] memory infos = new Info[](1);
      infos[0] = Info(address(this), 0);

      AssetAmount memory amt = AssetAmount(true, AssetDenomination.Wei, AssetReference.Delta, amount);
      ActionArgs memory act;
      act.actionType = ActionType.Deposit;
      act.accountId = 0;
      act.amount = amt;
      act.primaryMarketId = dToken;
      act.otherAddress = address(this);

      ActionArgs[] memory args = new ActionArgs[](1);
      args[0] = act;

      DyDx(dydx).operate(infos, args);
  }

  function withdrawDydx(uint256 amount) internal {
      Info[] memory infos = new Info[](1);
      infos[0] = Info(address(this), 0);

      AssetAmount memory amt = AssetAmount(false, AssetDenomination.Wei, AssetReference.Delta, amount);
      ActionArgs memory act;
      act.actionType = ActionType.Withdraw;
      act.accountId = 0;
      act.amount = amt;
      act.primaryMarketId = dToken;
      act.otherAddress = address(this);

      ActionArgs[] memory args = new ActionArgs[](1);
      args[0] = act;

      DyDx(dydx).operate(infos, args);
  }

  function balance() public view returns (uint256) {
    return IERC20(token).balanceOf(address(this));
  }

  function getAave() public view returns (address) {
    return LendingPoolAddressesProvider(aave).getLendingPool();
  }
  function getAaveCore() public view returns (address) {
    return LendingPoolAddressesProvider(aave).getLendingPoolCore();
  }

  function approveToken() public {
      IERC20(token).approve(compound, uint(-1)); //also add to constructor
      IERC20(token).approve(dydx, uint(-1));
      IERC20(token).approve(getAaveCore(), uint(-1));
      IERC20(token).approve(fulcrum, uint(-1));
  }

  function balanceDydx() public view returns (uint256) {
      Wei memory bal = DyDx(dydx).getAccountWei(Info(address(this), 0), dToken);
      return bal.value;
  }
  function balanceCompound() public view returns (uint256) {
      return IERC20(compound).balanceOf(address(this));
  }
  function balanceCompoundInToken() public view returns (uint256) {
    // Mantisa 1e18 to decimals
    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;
  }
  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 withdrawAll() internal {
    uint256 amount = balanceCompound();
    if (amount > 0) {
      withdrawCompound(amount);
    }
    amount = balanceDydx();
    if (amount > 0) {
      withdrawDydx(amount);
    }
    amount = balanceFulcrum();
    if (amount > 0) {
      withdrawFulcrum(amount);
    }
    amount = balanceAave();
    if (amount > 0) {
      withdrawAave(amount);
    }
  }

  function withdrawSomeCompound(uint256 _amount) internal {
    uint256 b = balanceCompound();
    uint256 bT = balanceCompoundInToken();
    require(bT >= _amount, "insufficient funds");
    uint256 amount = b.mul(_amount).div(bT);
    withdrawCompound(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.DYDX) {
      require(balanceDydx() >= _amount, "insufficient funds");
      withdrawDydx(_amount);
    }
    if (provider == Lender.FULCRUM) {
      withdrawFulcrum(_amount);
    }
  }

  function rebalance() public {
    Lender newProvider = recommend();

    if (newProvider != provider) {
      withdrawAll();
    }

    if (balance() > 0) {
      if (newProvider == Lender.DYDX) {
        supplyDydx(balance());
      }
      if (newProvider == Lender.FULCRUM) {
        supplyFulcrum(balance());
      }
      if (newProvider == Lender.COMPOUND) {
        supplyCompound(balance());
      }
      if (newProvider == Lender.AAVE) {
        supplyAave(balance());
      }
    }
    provider = newProvider;
  }

  function supplyAave(uint amount) public {
      Aave(getAave()).deposit(token, amount, 0);
  }
  function supplyFulcrum(uint amount) public {
      require(Fulcrum(fulcrum).mint(address(this), amount) > 0, "FULCRUM: supply failed");
  }
  function supplyCompound(uint amount) public {
      require(Compound(compound).mint(amount) == 0, "COMPOUND: supply failed");
  }
  function withdrawAave(uint amount) internal {
      AToken(aaveToken).redeem(amount);
  }
  function withdrawFulcrum(uint amount) internal {
      require(Fulcrum(fulcrum).burn(address(this), amount) > 0, "FULCRUM: withdraw failed");
  }
  function withdrawCompound(uint amount) internal {
      require(Compound(compound).redeem(amount) == 0, "COMPOUND: withdraw failed");
  }

  // Invest ETH
  function invest(uint256 _amount)
      external
      nonReentrant
  {
      require(_amount > 0, "deposit must be greater than 0");
      pool = calcPoolValueInToken();

      IERC20(token).transferFrom(msg.sender, address(this), _amount);

      rebalance();

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

  // Invest self eth from external profits
  function investSelf()
      external
      nonReentrant
      onlyOwner
  {
      uint b = IERC20(token).balanceOf(address(this));
      require(b > 0, "deposit must be greater than 0");
      rebalance();
      pool = calcPoolValueInToken();
  }

  function calcPoolValueInToken() public view returns (uint) {

    return balanceCompoundInToken()
      .add(balanceFulcrumInToken())
      .add(balanceDydx())
      .add(balanceAave())
      .add(balance());
  }

  function getPricePerFullShare() public view returns (uint) {
    uint _pool = calcPoolValueInToken();
    return _pool.mul(1e18).div(_totalSupply);
  }

  // Redeem any invested tokens from the pool
  function redeem(uint256 _shares)
      external
      nonReentrant
  {
      require(_shares > 0, "withdraw must be greater than 0");

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

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


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

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

      // Check ETH balance
      uint256 b = IERC20(token).balanceOf(address(this));
      if (b < r) {
        withdrawSome(r);
      }

      IERC20(token).transfer(msg.sender, r);

      rebalance();
      pool = calcPoolValueInToken();

  }

  // incase of half-way error
  function inCaseTokenGetsStuck(IERC20 _TokenAddress) onlyOwner public {
      uint qty = _TokenAddress.balanceOf(address(this));
      _TokenAddress.transfer(msg.sender, qty);
  }
  // incase of half-way error
  function inCaseETHGetsStuck() onlyOwner public{
      (bool result, ) = msg.sender.call.value(address(this).balance)("");
      require(result, "transfer of ETH failed");
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"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":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":"apr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":"balanceDydx","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":"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":"dToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"dydx","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":"getAave","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"inCaseETHGetsStuck","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"_TokenAddress","type":"address"}],"name":"inCaseTokenGetsStuck","outputs":[],"payable":false,"stateMutability":"nonpayable","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"}],"name":"invest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"investSelf","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":[],"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 yWBTC.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 yWBTC.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":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_AAVE","type":"address"}],"name":"set_new_AAVE","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_APR","type":"address"}],"name":"set_new_APR","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_ATOKEN","type":"address"}],"name":"set_new_ATOKEN","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_COMPOUND","type":"address"}],"name":"set_new_COMPOUND","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_new_DTOKEN","type":"uint256"}],"name":"set_new_DTOKEN","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_DYDX","type":"address"}],"name":"set_new_DYDX","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_FULCRUM","type":"address"}],"name":"set_new_FULCRUM","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"supplyDydx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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"}]

60806040526000601060146101000a81548160ff021916908360048111156200002457fe5b02179055503480156200003657600080fd5b506040518060400160405280600481526020017f79425443000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f794254430000000000000000000000000000000000000000000000000000000081525060088260039080519060200190620000bd929190620008bd565b508160049080519060200190620000d6929190620008bd565b5080600560006101000a81548160ff021916908360ff16021790555050505060016006819055506200010d6200043b60201b60201c565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3732260fac5e5542a773aa44fbcfedf7c193bc2c599600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073318135fbd0b40d48fcef431ccdf6c7926450edfb601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731e0447b19bb6ecfdae1e4ae1694b0c3659614e4e600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507324a42fd28c976a61df5d00d0599c34c4f90748c8600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ba9262578efef8b3aff7f60cd629d6cc8859c8b5600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073fc4b8ed459e00e5400be803a9bb3954234fd50e3600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c11b1268c1a384e55c48c2391d8d480264a3a7f4600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600f81905550620004356200044360201b60201c565b62000abf565b600033905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620004e492919062000a14565b602060405180830381600087803b158015620004ff57600080fd5b505af115801562000514573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200053a9190810190620009c6565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620005dc92919062000a14565b602060405180830381600087803b158015620005f757600080fd5b505af11580156200060c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620006329190810190620009c6565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3620006816200081260201b60201c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620006c192919062000a14565b602060405180830381600087803b158015620006dc57600080fd5b505af1158015620006f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620007179190810190620009c6565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620007b992919062000a14565b602060405180830381600087803b158015620007d457600080fd5b505af1158015620007e9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200080f9190810190620009c6565b50565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b1580156200087d57600080fd5b505afa15801562000892573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620008b891908101906200099a565b905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200090057805160ff191683800117855562000931565b8280016001018555821562000931579182015b828111156200093057825182559160200191906001019062000913565b5b50905062000940919062000944565b5090565b6200096991905b80821115620009655760008160009055506001016200094b565b5090565b90565b6000815190506200097d8162000a8b565b92915050565b600081519050620009948162000aa5565b92915050565b600060208284031215620009ad57600080fd5b6000620009bd848285016200096c565b91505092915050565b600060208284031215620009d957600080fd5b6000620009e98482850162000983565b91505092915050565b620009fd8162000a41565b82525050565b62000a0e8162000a81565b82525050565b600060408201905062000a2b6000830185620009f2565b62000a3a602083018462000a03565b9392505050565b600062000a4e8262000a61565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b62000a968162000a41565b811462000aa257600080fd5b50565b62000ab08162000a55565b811462000abc57600080fd5b50565b615b9b8062000acf6000396000f3fe6080604052600436106103505760003560e01c8063812adb06116101c6578063bbf31644116100f7578063f5a41dea11610095578063f69e20461161006f578063f69e204614610bf3578063f7c1ec7714610c1e578063f82ce27d14610c49578063fc0c546a14610c7457610350565b8063f5a41dea14610b88578063f5ff191614610bb3578063f60a15ed14610bdc57610350565b8063db006a75116100d1578063db006a7514610ad0578063dd62ed3e14610af9578063e849d65914610b36578063f2fde38b14610b5f57610350565b8063bbf3164414610a51578063cf8ca42614610a7a578063d9d7858a14610aa557610350565b80639ff011b911610164578063a72879711161013e578063a728797114610995578063a9059cbb146109c0578063a9de245b146109fd578063b69ef8a814610a2657610350565b80639ff011b914610904578063a160176d1461092d578063a457c2d71461095857610350565b80638e4ec6ef116101a05780638e4ec6ef1461086c5780638f32d59b1461089757806395d89b41146108c257806399b71d5c146108ed57610350565b8063812adb06146107ed578063819faf7b146108165780638da5cb5b1461084157610350565b806339509351116102a057806365aab7491161023e578063715018a611610218578063715018a61461076b57806377c7b8fc146107825780637d7c2a1c146107ad5780638124955c146107c457610350565b806365aab749146106da57806370a08231146107035780637137ef991461074057610350565b8063463574731161027a578063463574731461063057806357ded9c91461065957806358782c211461068457806361c1ec55146106af57610350565b806339509351146105b15780633990ab4f146105ee57806339c0a7e11461060557610350565b806316f0115b1161030d5780632afcf480116102e75780632afcf4801461050b5780632c7a5ae4146105345780632e8d6e181461055d578063313ce5671461058657610350565b806316f0115b1461047857806318160ddd146104a357806323b872dd146104ce57610350565b806306636c1c1461035257806306a3fe591461038f57806306fdde03146103ba578063085d4883146103e5578063095ea7b3146104105780630eb2a2671461044d575b005b34801561035e57600080fd5b50610379600480360361037491908101906149af565b610c9f565b604051610386919061577c565b60405180910390f35b34801561039b57600080fd5b506103a4610edd565b6040516103b1919061536e565b60405180910390f35b3480156103c657600080fd5b506103cf610f03565b6040516103dc91906154d1565b60405180910390f35b3480156103f157600080fd5b506103fa610fa5565b60405161040791906154b6565b60405180910390f35b34801561041c57600080fd5b5061043760048036036104329190810190614869565b610fb8565b604051610444919061549b565b60405180910390f35b34801561045957600080fd5b50610462610fd6565b60405161046f919061577c565b60405180910390f35b34801561048457600080fd5b5061048d611088565b60405161049a919061577c565b60405180910390f35b3480156104af57600080fd5b506104b861108e565b6040516104c5919061577c565b60405180910390f35b3480156104da57600080fd5b506104f560048036036104f0919081019061481a565b611098565b604051610502919061549b565b60405180910390f35b34801561051757600080fd5b50610532600480360361052d91908101906149af565b611171565b005b34801561054057600080fd5b5061055b6004803603610556919081019061478c565b611340565b005b34801561056957600080fd5b50610584600480360361057f91908101906148ce565b6113cb565b005b34801561059257600080fd5b5061059b611531565b6040516105a89190615797565b60405180910390f35b3480156105bd57600080fd5b506105d860048036036105d39190810190614869565b611548565b6040516105e5919061549b565b60405180910390f35b3480156105fa57600080fd5b506106036115fb565b005b34801561061157600080fd5b5061061a6117aa565b604051610627919061577c565b60405180910390f35b34801561063c57600080fd5b506106576004803603610652919081019061478c565b61189a565b005b34801561066557600080fd5b5061066e611925565b60405161067b919061536e565b60405180910390f35b34801561069057600080fd5b5061069961194b565b6040516106a6919061536e565b60405180910390f35b3480156106bb57600080fd5b506106c4611971565b6040516106d1919061577c565b60405180910390f35b3480156106e657600080fd5b5061070160048036036106fc91908101906149af565b611a23565b005b34801561070f57600080fd5b5061072a6004803603610725919081019061478c565b611abf565b604051610737919061577c565b60405180910390f35b34801561074c57600080fd5b50610755611b07565b604051610762919061577c565b60405180910390f35b34801561077757600080fd5b50610780611b7a565b005b34801561078e57600080fd5b50610797611c82565b6040516107a4919061577c565b60405180910390f35b3480156107b957600080fd5b506107c2611cc4565b005b3480156107d057600080fd5b506107eb60048036036107e691908101906149af565b611dfc565b005b3480156107f957600080fd5b50610814600480360361080f919081019061478c565b611ef0565b005b34801561082257600080fd5b5061082b611f7b565b604051610838919061536e565b60405180910390f35b34801561084d57600080fd5b50610856611fa1565b604051610863919061536e565b60405180910390f35b34801561087857600080fd5b50610881611fcb565b60405161088e919061536e565b60405180910390f35b3480156108a357600080fd5b506108ac611ff1565b6040516108b9919061549b565b60405180910390f35b3480156108ce57600080fd5b506108d7612050565b6040516108e491906154d1565b60405180910390f35b3480156108f957600080fd5b506109026120f2565b005b34801561091057600080fd5b5061092b600480360361092691908101906149af565b6124a1565b005b34801561093957600080fd5b506109426124f2565b60405161094f91906154b6565b60405180910390f35b34801561096457600080fd5b5061097f600480360361097a9190810190614869565b61264f565b60405161098c919061549b565b60405180910390f35b3480156109a157600080fd5b506109aa61271c565b6040516109b7919061577c565b60405180910390f35b3480156109cc57600080fd5b506109e760048036036109e29190810190614869565b612808565b6040516109f4919061549b565b60405180910390f35b348015610a0957600080fd5b50610a246004803603610a1f919081019061478c565b612826565b005b348015610a3257600080fd5b50610a3b6128b1565b604051610a48919061577c565b60405180910390f35b348015610a5d57600080fd5b50610a786004803603610a73919081019061478c565b612963565b005b348015610a8657600080fd5b50610a8f6129ee565b604051610a9c919061577c565b60405180910390f35b348015610ab157600080fd5b50610aba612aa0565b604051610ac7919061577c565b60405180910390f35b348015610adc57600080fd5b50610af76004803603610af291908101906149af565b612aa6565b005b348015610b0557600080fd5b50610b206004803603610b1b91908101906147de565b612ea9565b604051610b2d919061577c565b60405180910390f35b348015610b4257600080fd5b50610b5d6004803603610b5891908101906149af565b612f30565b005b348015610b6b57600080fd5b50610b866004803603610b81919081019061478c565b613022565b005b348015610b9457600080fd5b50610b9d613075565b604051610baa919061577c565b60405180910390f35b348015610bbf57600080fd5b50610bda6004803603610bd5919081019061478c565b613140565b005b348015610be857600080fd5b50610bf16131cb565b005b348015610bff57600080fd5b50610c086132d8565b604051610c15919061536e565b60405180910390f35b348015610c2a57600080fd5b50610c336132fe565b604051610c40919061536e565b60405180910390f35b348015610c5557600080fd5b50610c5e6133a5565b604051610c6b919061536e565b60405180910390f35b348015610c8057600080fd5b50610c8961344c565b604051610c96919061536e565b60405180910390f35b600060606001604051908082528060200260200182016040528015610cde57816020015b610ccb6144ce565b815260200190600190039081610cc35790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff168152602001600081525081600081518110610d1a57fe5b6020026020010181905250610d2d6144fe565b6040518060800160405280600115158152602001600080811115610d4d57fe5b8152602001600080811115610d5e57fe5b8152602001858152509050610d7161453c565b600081600001906001811115610d8357fe5b90816001811115610d9057fe5b815250506000816020018181525050818160400181905250600f54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606001604051908082528060200260200182016040528015610e2957816020015b610e166145a8565b815260200190600190039081610e0e5790505b5090508181600081518110610e3a57fe5b6020026020010181905250600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b8152600401610ea2929190615464565b600060405180830381600087803b158015610ebc57600080fd5b505af1158015610ed0573d6000803e3d6000fd5b5050505050505050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f9b5780601f10610f7057610100808354040283529160200191610f9b565b820191906000526020600020905b815481529060010190602001808311610f7e57829003601f168201915b5050505050905090565b601060149054906101000a900460ff1681565b6000610fcc610fc5613472565b848461347a565b6001905092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110339190615389565b60206040518083038186803b15801561104b57600080fd5b505afa15801561105f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061108391908101906149d8565b905090565b60085481565b6000600254905090565b60006110a5848484613645565b611166846110b1613472565b61116185604051806060016040528060288152602001615b0c60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611117613472565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138cf9092919063ffffffff16565b61347a565b600190509392505050565b600160066000828254019250508190555060006006549050600082116111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c3906156d3565b60405180910390fd5b6111d4611b07565b600881905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401611239939291906153a4565b602060405180830381600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061128b91908101906148a5565b50611294611cc4565b6000809050600060085414156112b357829050826008819055506112df565b6112dc6008546112ce6002548661392a90919063ffffffff16565b61399a90919063ffffffff16565b90505b6112e7611b07565b6008819055506112f733826139e4565b50600654811461133c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133390615713565b60405180910390fd5b5050565b611348611ff1565b611387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137e90615613565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6113d3611ff1565b611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140990615613565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161144d9190615389565b60206040518083038186803b15801561146557600080fd5b505afa158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061149d91908101906149d8565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016114da9291906153db565b602060405180830381600087803b1580156114f457600080fd5b505af1158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061152c91908101906148a5565b505050565b6000600560009054906101000a900460ff16905090565b60006115f1611555613472565b846115ec8560016000611566613472565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b6c90919063ffffffff16565b61347a565b6001905092915050565b60016006600082825401925050819055506000600654905061161b611ff1565b61165a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165190615613565b60405180910390fd5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116b79190615389565b60206040518083038186803b1580156116cf57600080fd5b505afa1580156116e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061170791908101906149d8565b90506000811161174c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611743906156d3565b60405180910390fd5b611754611cc4565b61175c611b07565b6008819055505060065481146117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e90615713565b60405180910390fd5b50565b60006117b4614614565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f546040518363ffffffff1660e01b815260040161183e929190615753565b604080518083038186803b15801561185557600080fd5b505afa158015611869573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061188d9190810190614986565b9050806020015191505090565b6118a2611ff1565b6118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d890615613565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119ce9190615389565b60206040518083038186803b1580156119e657600080fd5b505afa1580156119fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a1e91908101906149d8565b905090565b611a2b6132fe565b73ffffffffffffffffffffffffffffffffffffffff1663d2d0e066600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360006040518463ffffffff1660e01b8152600401611a8a9392919061542d565b600060405180830381600087803b158015611aa457600080fd5b505af1158015611ab8573d6000803e3d6000fd5b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000611b75611b146128b1565b611b67611b1f6129ee565b611b59611b2a6117aa565b611b4b611b35613075565b611b3d61271c565b613b6c90919063ffffffff16565b613b6c90919063ffffffff16565b613b6c90919063ffffffff16565b613b6c90919063ffffffff16565b905090565b611b82611ff1565b611bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb890615613565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080611c8d611b07565b9050611cbe600254611cb0670de0b6b3a76400008461392a90919063ffffffff16565b61399a90919063ffffffff16565b91505090565b6000611cce6124f2565b9050601060149054906101000a900460ff166004811115611ceb57fe5b816004811115611cf757fe5b14611d0557611d04613bc1565b5b6000611d0f6128b1565b1115611dd65760016004811115611d2257fe5b816004811115611d2e57fe5b1415611d4657611d44611d3f6128b1565b610c9f565b505b600480811115611d5257fe5b816004811115611d5e57fe5b1415611d7557611d74611d6f6128b1565b611dfc565b5b60026004811115611d8257fe5b816004811115611d8e57fe5b1415611da557611da4611d9f6128b1565b612f30565b5b60036004811115611db257fe5b816004811115611dbe57fe5b1415611dd557611dd4611dcf6128b1565b611a23565b5b5b80601060146101000a81548160ff02191690836004811115611df457fe5b021790555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b8152600401611e5b9291906153db565b602060405180830381600087803b158015611e7557600080fd5b505af1158015611e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ead91908101906149d8565b11611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee4906156f3565b60405180910390fd5b50565b611ef8611ff1565b611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e90615613565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612034613472565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e85780601f106120bd576101008083540402835291602001916120e8565b820191906000526020600020905b8154815290600101906020018083116120cb57829003601f168201915b5050505050905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612191929190615404565b602060405180830381600087803b1580156121ab57600080fd5b505af11580156121bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121e391908101906148a5565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612283929190615404565b602060405180830381600087803b15801561229d57600080fd5b505af11580156122b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122d591908101906148a5565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b361231c6133a5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161235a929190615404565b602060405180830381600087803b15801561237457600080fd5b505af1158015612388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123ac91908101906148a5565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161244c929190615404565b602060405180830381600087803b15801561246657600080fd5b505af115801561247a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061249e91908101906148a5565b50565b6124a9611ff1565b6124e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124df90615613565b60405180910390fd5b80600f8190555050565b6000806000806000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d88be3c0600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401612577919061536e565b60006040518083038186803b15801561258f57600080fd5b505afa1580156125a3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506125cc91908101906148f7565b9450945094509450506000809050808511156125e6578490505b808411156125f2578390505b808311156125fe578290505b8082111561260a578190505b60008090508282141561261c57600190505b8382141561262957600390505b8482141561263657600490505b8582141561264357600290505b80965050505050505090565b600061271261265c613472565b8461270d85604051806060016040528060258152602001615b346025913960016000612686613472565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138cf9092919063ffffffff16565b61347a565b6001905092915050565b600080612727611971565b90506000811115612801576127fe670de0b6b3a76400006127f0600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b1580156127a957600080fd5b505afa1580156127bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127e191908101906149d8565b8461392a90919063ffffffff16565b61399a90919063ffffffff16565b90505b8091505090565b600061281c612815613472565b8484613645565b6001905092915050565b61282e611ff1565b61286d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286490615613565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161290e9190615389565b60206040518083038186803b15801561292657600080fd5b505afa15801561293a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061295e91908101906149d8565b905090565b61296b611ff1565b6129aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a190615613565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a4b9190615389565b60206040518083038186803b158015612a6357600080fd5b505afa158015612a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a9b91908101906149d8565b905090565b600f5481565b60016006600082825401925050819055506000600654905060008211612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af890615653565b60405180910390fd5b6000612b0c33611abf565b905080831115612b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4890615633565b60405180910390fd5b612b59611b07565b6008819055506000612b8a600254612b7c8660085461392a90919063ffffffff16565b61399a90919063ffffffff16565b9050612c14846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138cf9092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612c6b84600254613c3a90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612ccf919061577c565b60405180910390a36000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612d349190615389565b60206040518083038186803b158015612d4c57600080fd5b505afa158015612d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d8491908101906149d8565b905081811015612d9857612d9782613c84565b5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401612df59291906153db565b602060405180830381600087803b158015612e0f57600080fd5b505af1158015612e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e4791908101906148a5565b50612e50611cc4565b612e58611b07565b6008819055505050506006548114612ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9c90615713565b60405180910390fd5b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401612f8d919061577c565b602060405180830381600087803b158015612fa757600080fd5b505af1158015612fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612fdf91908101906149d8565b1461301f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301690615573565b60405180910390fd5b50565b61302a611ff1565b613069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306090615613565b60405180910390fd5b61307281613dfa565b50565b600080613080610fd6565b9050600081111561313957600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b81526004016130e69190615389565b60206040518083038186803b1580156130fe57600080fd5b505afa158015613112573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061313691908101906149d8565b90505b8091505090565b613148611ff1565b613187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317e90615613565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6131d3611ff1565b613212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320990615613565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff163160405161324f90615359565b60006040518083038185875af1925050503d806000811461328c576040519150601f19603f3d011682016040523d82523d6000602084013e613291565b606091505b50509050806132d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132cc906155b3565b60405180910390fd5b50565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561336857600080fd5b505afa15801561337c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133a091908101906147b5565b905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b15801561340f57600080fd5b505afa158015613423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061344791908101906147b5565b905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134e1906156b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561355a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355190615553565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051613638919061577c565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156136b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ac90615673565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371c906154f3565b60405180910390fd5b61379081604051806060016040528060268152602001615ae6602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138cf9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613823816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b6c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138c2919061577c565b60405180910390a3505050565b6000838311158290613917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390e91906154d1565b60405180910390fd5b5060008385039050809150509392505050565b60008083141561393d5760009050613994565b600082840290508284828161394e57fe5b041461398f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613986906155d3565b60405180910390fd5b809150505b92915050565b60006139dc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613f2a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4b90615733565b60405180910390fd5b613a6981600254613b6c90919063ffffffff16565b600281905550613ac0816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b6c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613b60919061577c565b60405180910390a35050565b600080828401905083811015613bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bae90615593565b60405180910390fd5b8091505092915050565b6000613bcb611971565b90506000811115613be057613bdf81613f8b565b5b613be86117aa565b90506000811115613bfd57613bfc8161407d565b5b613c05610fd6565b90506000811115613c1a57613c19816142b7565b5b613c226129ee565b90506000811115613c3757613c36816143ab565b5b50565b6000613c7c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506138cf565b905092915050565b60026004811115613c9157fe5b601060149054906101000a900460ff166004811115613cac57fe5b1415613cbc57613cbb8161443b565b5b60036004811115613cc957fe5b601060149054906101000a900460ff166004811115613ce457fe5b1415613d3e5780613cf36129ee565b1015613d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d2b90615693565b60405180910390fd5b613d3d816143ab565b5b60016004811115613d4b57fe5b601060149054906101000a900460ff166004811115613d6657fe5b1415613dc05780613d756117aa565b1015613db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dad90615693565b60405180910390fd5b613dbf8161407d565b5b600480811115613dcc57fe5b601060149054906101000a900460ff166004811115613de757fe5b1415613df757613df6816142b7565b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e6190615533565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290613f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f6891906154d1565b60405180910390fd5b506000838581613f7d57fe5b049050809150509392505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75836040518263ffffffff1660e01b8152600401613fe8919061577c565b602060405180830381600087803b15801561400257600080fd5b505af1158015614016573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061403a91908101906149d8565b1461407a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161407190615513565b60405180910390fd5b50565b606060016040519080825280602002602001820160405280156140ba57816020015b6140a76144ce565b81526020019060019003908161409f5790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250816000815181106140f657fe5b60200260200101819052506141096144fe565b604051806080016040528060001515815260200160008081111561412957fe5b815260200160008081111561413a57fe5b815260200184815250905061414d61453c565b60018160000190600181111561415f57fe5b9081600181111561416c57fe5b815250506000816020018181525050818160400181905250600f54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506060600160405190808252806020026020018201604052801561420557816020015b6141f26145a8565b8152602001906001900390816141ea5790505b509050818160008151811061421657fe5b6020026020010181905250600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b815260040161427e929190615464565b600060405180830381600087803b15801561429857600080fd5b505af11580156142ac573d6000803e3d6000fd5b505050505050505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30846040518363ffffffff1660e01b81526004016143169291906153db565b602060405180830381600087803b15801561433057600080fd5b505af1158015614344573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061436891908101906149d8565b116143a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161439f906155f3565b60405180910390fd5b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75826040518263ffffffff1660e01b8152600401614406919061577c565b600060405180830381600087803b15801561442057600080fd5b505af1158015614434573d6000803e3d6000fd5b5050505050565b6000614445611971565b9050600061445161271c565b905082811015614496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161448d90615693565b60405180910390fd5b60006144bd826144af868661392a90919063ffffffff16565b61399a90919063ffffffff16565b90506144c881613f8b565b50505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b604051806080016040528060001515815260200160008081111561451e57fe5b815260200160008081111561452f57fe5b8152602001600081525090565b6040518061010001604052806000600181111561455557fe5b815260200160008152602001614569614630565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b604051806101000160405280600060018111156145c157fe5b8152602001600081526020016145d5614630565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518060400160405280600015158152602001600081525090565b604051806080016040528060001515815260200160008081111561465057fe5b815260200160008081111561466157fe5b8152602001600081525090565b60008135905061467d81615a89565b92915050565b60008151905061469281615a89565b92915050565b6000815190506146a781615aa0565b92915050565b6000813590506146bc81615ab7565b92915050565b600082601f8301126146d357600080fd5b81516146e66146e1826157df565b6157b2565b9150808252602083016020830185838301111561470257600080fd5b61470d838284615a11565b50505092915050565b60006040828403121561472857600080fd5b61473260406157b2565b9050600061474284828501614698565b600083015250602061475684828501614777565b60208301525092915050565b60008135905061477181615ace565b92915050565b60008151905061478681615ace565b92915050565b60006020828403121561479e57600080fd5b60006147ac8482850161466e565b91505092915050565b6000602082840312156147c757600080fd5b60006147d584828501614683565b91505092915050565b600080604083850312156147f157600080fd5b60006147ff8582860161466e565b92505060206148108582860161466e565b9150509250929050565b60008060006060848603121561482f57600080fd5b600061483d8682870161466e565b935050602061484e8682870161466e565b925050604061485f86828701614762565b9150509250925092565b6000806040838503121561487c57600080fd5b600061488a8582860161466e565b925050602061489b85828601614762565b9150509250929050565b6000602082840312156148b757600080fd5b60006148c584828501614698565b91505092915050565b6000602082840312156148e057600080fd5b60006148ee848285016146ad565b91505092915050565b600080600080600060a0868803121561490f57600080fd5b600086015167ffffffffffffffff81111561492957600080fd5b614935888289016146c2565b955050602061494688828901614777565b945050604061495788828901614777565b935050606061496888828901614777565b925050608061497988828901614777565b9150509295509295909350565b60006040828403121561499857600080fd5b60006149a684828501614716565b91505092915050565b6000602082840312156149c157600080fd5b60006149cf84828501614762565b91505092915050565b6000602082840312156149ea57600080fd5b60006149f884828501614777565b91505092915050565b6000614a0d83836151c6565b905092915050565b6000614a2183836152ce565b60408301905092915050565b614a3681615981565b82525050565b614a45816158c0565b82525050565b614a54816158c0565b82525050565b6000614a658261582b565b614a6f8185615871565b935083602082028501614a818561580b565b8060005b85811015614abd5784840389528151614a9e8582614a01565b9450614aa983615857565b925060208a01995050600181019050614a85565b50829750879550505050505092915050565b6000614ada82615836565b614ae48185615882565b9350614aef8361581b565b8060005b83811015614b20578151614b078882614a15565b9750614b1283615864565b925050600181019050614af3565b5085935050505092915050565b614b36816158d2565b82525050565b614b45816158d2565b82525050565b6000614b5682615841565b614b608185615893565b9350614b70818560208601615a11565b614b7981615a44565b840191505092915050565b614b8d81615993565b82525050565b614b9c816159a5565b82525050565b614bab816159b7565b82525050565b614bba816159c9565b82525050565b614bc9816159db565b82525050565b6000614bda8261584c565b614be481856158af565b9350614bf4818560208601615a11565b614bfd81615a44565b840191505092915050565b6000614c156023836158af565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c7b6019836158af565b91507f434f4d504f554e443a207769746864726177206661696c6564000000000000006000830152602082019050919050565b6000614cbb6026836158af565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d216022836158af565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d876017836158af565b91507f434f4d504f554e443a20737570706c79206661696c65640000000000000000006000830152602082019050919050565b6000614dc7601b836158af565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614e076016836158af565b91507f7472616e73666572206f6620455448206661696c6564000000000000000000006000830152602082019050919050565b6000614e476021836158af565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ead6018836158af565b91507f46554c4352554d3a207769746864726177206661696c656400000000000000006000830152602082019050919050565b6000614eed6020836158af565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614f2d6014836158af565b91507f696e73756666696369656e742062616c616e63650000000000000000000000006000830152602082019050919050565b6000614f6d601f836158af565b91507f7769746864726177206d7573742062652067726561746572207468616e2030006000830152602082019050919050565b6000614fad6025836158af565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006150136000836158a4565b9150600082019050919050565b600061502d6012836158af565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b600061506d6024836158af565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006150d3601e836158af565b91507f6465706f736974206d7573742062652067726561746572207468616e203000006000830152602082019050919050565b60006151136016836158af565b91507f46554c4352554d3a20737570706c79206661696c6564000000000000000000006000830152602082019050919050565b6000615153601f836158af565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000615193601f836158af565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6000610160830160008301516151df6000860182614b84565b5060208301516151f2602086018261532c565b5060408301516152056040860182615279565b50606083015161521860c086018261532c565b50608083015161522b60e086018261532c565b5060a083015161523f610100860182614a3c565b5060c083015161525361012086018261532c565b5060e083015184820361014086015261526c8282614b4b565b9150508091505092915050565b60808201600082015161528f6000850182614b2d565b5060208201516152a26020850182614b93565b5060408201516152b56040850182614ba2565b5060608201516152c8606085018261532c565b50505050565b6040820160008201516152e46000850182614a3c565b5060208201516152f7602085018261532c565b50505050565b6040820160008201516153136000850182614a3c565b506020820151615326602085018261532c565b50505050565b6153358161596a565b82525050565b6153448161596a565b82525050565b61535381615974565b82525050565b600061536482615006565b9150819050919050565b60006020820190506153836000830184614a4b565b92915050565b600060208201905061539e6000830184614a2d565b92915050565b60006060820190506153b96000830186614a2d565b6153c66020830185614a2d565b6153d3604083018461533b565b949350505050565b60006040820190506153f06000830185614a2d565b6153fd602083018461533b565b9392505050565b60006040820190506154196000830185614a4b565b615426602083018461533b565b9392505050565b60006060820190506154426000830186614a4b565b61544f602083018561533b565b61545c6040830184614bc0565b949350505050565b6000604082019050818103600083015261547e8185614acf565b905081810360208301526154928184614a5a565b90509392505050565b60006020820190506154b06000830184614b3c565b92915050565b60006020820190506154cb6000830184614bb1565b92915050565b600060208201905081810360008301526154eb8184614bcf565b905092915050565b6000602082019050818103600083015261550c81614c08565b9050919050565b6000602082019050818103600083015261552c81614c6e565b9050919050565b6000602082019050818103600083015261554c81614cae565b9050919050565b6000602082019050818103600083015261556c81614d14565b9050919050565b6000602082019050818103600083015261558c81614d7a565b9050919050565b600060208201905081810360008301526155ac81614dba565b9050919050565b600060208201905081810360008301526155cc81614dfa565b9050919050565b600060208201905081810360008301526155ec81614e3a565b9050919050565b6000602082019050818103600083015261560c81614ea0565b9050919050565b6000602082019050818103600083015261562c81614ee0565b9050919050565b6000602082019050818103600083015261564c81614f20565b9050919050565b6000602082019050818103600083015261566c81614f60565b9050919050565b6000602082019050818103600083015261568c81614fa0565b9050919050565b600060208201905081810360008301526156ac81615020565b9050919050565b600060208201905081810360008301526156cc81615060565b9050919050565b600060208201905081810360008301526156ec816150c6565b9050919050565b6000602082019050818103600083015261570c81615106565b9050919050565b6000602082019050818103600083015261572c81615146565b9050919050565b6000602082019050818103600083015261574c81615186565b9050919050565b600060608201905061576860008301856152fd565b615775604083018461533b565b9392505050565b6000602082019050615791600083018461533b565b92915050565b60006020820190506157ac600083018461534a565b92915050565b6000604051905081810181811067ffffffffffffffff821117156157d557600080fd5b8060405250919050565b600067ffffffffffffffff8211156157f657600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006158cb8261594a565b9050919050565b60008115159050919050565b60006158e9826158c0565b9050919050565b60008190506158fe82615a55565b919050565b600081905061591182615a62565b919050565b600081905061592482615a6f565b919050565b600081905061593782615a7c565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061598c826159ed565b9050919050565b600061599e826158f0565b9050919050565b60006159b082615903565b9050919050565b60006159c282615916565b9050919050565b60006159d482615929565b9050919050565b60006159e68261593c565b9050919050565b60006159f8826159ff565b9050919050565b6000615a0a8261594a565b9050919050565b60005b83811015615a2f578082015181840152602081019050615a14565b83811115615a3e576000848401525b50505050565b6000601f19601f8301169050919050565b60028110615a5f57fe5b50565b60018110615a6c57fe5b50565b60018110615a7957fe5b50565b60058110615a8657fe5b50565b615a92816158c0565b8114615a9d57600080fd5b50565b615aa9816158d2565b8114615ab457600080fd5b50565b615ac0816158de565b8114615acb57600080fd5b50565b615ad78161596a565b8114615ae257600080fd5b5056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa365627a7a723158207dd8b1df3368abaf7ebdf430ccc99de426a596a7b2cc26d347d0f43e87d97bd86c6578706572696d656e74616cf564736f6c634300050c0040

Deployed Bytecode

0x6080604052600436106103505760003560e01c8063812adb06116101c6578063bbf31644116100f7578063f5a41dea11610095578063f69e20461161006f578063f69e204614610bf3578063f7c1ec7714610c1e578063f82ce27d14610c49578063fc0c546a14610c7457610350565b8063f5a41dea14610b88578063f5ff191614610bb3578063f60a15ed14610bdc57610350565b8063db006a75116100d1578063db006a7514610ad0578063dd62ed3e14610af9578063e849d65914610b36578063f2fde38b14610b5f57610350565b8063bbf3164414610a51578063cf8ca42614610a7a578063d9d7858a14610aa557610350565b80639ff011b911610164578063a72879711161013e578063a728797114610995578063a9059cbb146109c0578063a9de245b146109fd578063b69ef8a814610a2657610350565b80639ff011b914610904578063a160176d1461092d578063a457c2d71461095857610350565b80638e4ec6ef116101a05780638e4ec6ef1461086c5780638f32d59b1461089757806395d89b41146108c257806399b71d5c146108ed57610350565b8063812adb06146107ed578063819faf7b146108165780638da5cb5b1461084157610350565b806339509351116102a057806365aab7491161023e578063715018a611610218578063715018a61461076b57806377c7b8fc146107825780637d7c2a1c146107ad5780638124955c146107c457610350565b806365aab749146106da57806370a08231146107035780637137ef991461074057610350565b8063463574731161027a578063463574731461063057806357ded9c91461065957806358782c211461068457806361c1ec55146106af57610350565b806339509351146105b15780633990ab4f146105ee57806339c0a7e11461060557610350565b806316f0115b1161030d5780632afcf480116102e75780632afcf4801461050b5780632c7a5ae4146105345780632e8d6e181461055d578063313ce5671461058657610350565b806316f0115b1461047857806318160ddd146104a357806323b872dd146104ce57610350565b806306636c1c1461035257806306a3fe591461038f57806306fdde03146103ba578063085d4883146103e5578063095ea7b3146104105780630eb2a2671461044d575b005b34801561035e57600080fd5b50610379600480360361037491908101906149af565b610c9f565b604051610386919061577c565b60405180910390f35b34801561039b57600080fd5b506103a4610edd565b6040516103b1919061536e565b60405180910390f35b3480156103c657600080fd5b506103cf610f03565b6040516103dc91906154d1565b60405180910390f35b3480156103f157600080fd5b506103fa610fa5565b60405161040791906154b6565b60405180910390f35b34801561041c57600080fd5b5061043760048036036104329190810190614869565b610fb8565b604051610444919061549b565b60405180910390f35b34801561045957600080fd5b50610462610fd6565b60405161046f919061577c565b60405180910390f35b34801561048457600080fd5b5061048d611088565b60405161049a919061577c565b60405180910390f35b3480156104af57600080fd5b506104b861108e565b6040516104c5919061577c565b60405180910390f35b3480156104da57600080fd5b506104f560048036036104f0919081019061481a565b611098565b604051610502919061549b565b60405180910390f35b34801561051757600080fd5b50610532600480360361052d91908101906149af565b611171565b005b34801561054057600080fd5b5061055b6004803603610556919081019061478c565b611340565b005b34801561056957600080fd5b50610584600480360361057f91908101906148ce565b6113cb565b005b34801561059257600080fd5b5061059b611531565b6040516105a89190615797565b60405180910390f35b3480156105bd57600080fd5b506105d860048036036105d39190810190614869565b611548565b6040516105e5919061549b565b60405180910390f35b3480156105fa57600080fd5b506106036115fb565b005b34801561061157600080fd5b5061061a6117aa565b604051610627919061577c565b60405180910390f35b34801561063c57600080fd5b506106576004803603610652919081019061478c565b61189a565b005b34801561066557600080fd5b5061066e611925565b60405161067b919061536e565b60405180910390f35b34801561069057600080fd5b5061069961194b565b6040516106a6919061536e565b60405180910390f35b3480156106bb57600080fd5b506106c4611971565b6040516106d1919061577c565b60405180910390f35b3480156106e657600080fd5b5061070160048036036106fc91908101906149af565b611a23565b005b34801561070f57600080fd5b5061072a6004803603610725919081019061478c565b611abf565b604051610737919061577c565b60405180910390f35b34801561074c57600080fd5b50610755611b07565b604051610762919061577c565b60405180910390f35b34801561077757600080fd5b50610780611b7a565b005b34801561078e57600080fd5b50610797611c82565b6040516107a4919061577c565b60405180910390f35b3480156107b957600080fd5b506107c2611cc4565b005b3480156107d057600080fd5b506107eb60048036036107e691908101906149af565b611dfc565b005b3480156107f957600080fd5b50610814600480360361080f919081019061478c565b611ef0565b005b34801561082257600080fd5b5061082b611f7b565b604051610838919061536e565b60405180910390f35b34801561084d57600080fd5b50610856611fa1565b604051610863919061536e565b60405180910390f35b34801561087857600080fd5b50610881611fcb565b60405161088e919061536e565b60405180910390f35b3480156108a357600080fd5b506108ac611ff1565b6040516108b9919061549b565b60405180910390f35b3480156108ce57600080fd5b506108d7612050565b6040516108e491906154d1565b60405180910390f35b3480156108f957600080fd5b506109026120f2565b005b34801561091057600080fd5b5061092b600480360361092691908101906149af565b6124a1565b005b34801561093957600080fd5b506109426124f2565b60405161094f91906154b6565b60405180910390f35b34801561096457600080fd5b5061097f600480360361097a9190810190614869565b61264f565b60405161098c919061549b565b60405180910390f35b3480156109a157600080fd5b506109aa61271c565b6040516109b7919061577c565b60405180910390f35b3480156109cc57600080fd5b506109e760048036036109e29190810190614869565b612808565b6040516109f4919061549b565b60405180910390f35b348015610a0957600080fd5b50610a246004803603610a1f919081019061478c565b612826565b005b348015610a3257600080fd5b50610a3b6128b1565b604051610a48919061577c565b60405180910390f35b348015610a5d57600080fd5b50610a786004803603610a73919081019061478c565b612963565b005b348015610a8657600080fd5b50610a8f6129ee565b604051610a9c919061577c565b60405180910390f35b348015610ab157600080fd5b50610aba612aa0565b604051610ac7919061577c565b60405180910390f35b348015610adc57600080fd5b50610af76004803603610af291908101906149af565b612aa6565b005b348015610b0557600080fd5b50610b206004803603610b1b91908101906147de565b612ea9565b604051610b2d919061577c565b60405180910390f35b348015610b4257600080fd5b50610b5d6004803603610b5891908101906149af565b612f30565b005b348015610b6b57600080fd5b50610b866004803603610b81919081019061478c565b613022565b005b348015610b9457600080fd5b50610b9d613075565b604051610baa919061577c565b60405180910390f35b348015610bbf57600080fd5b50610bda6004803603610bd5919081019061478c565b613140565b005b348015610be857600080fd5b50610bf16131cb565b005b348015610bff57600080fd5b50610c086132d8565b604051610c15919061536e565b60405180910390f35b348015610c2a57600080fd5b50610c336132fe565b604051610c40919061536e565b60405180910390f35b348015610c5557600080fd5b50610c5e6133a5565b604051610c6b919061536e565b60405180910390f35b348015610c8057600080fd5b50610c8961344c565b604051610c96919061536e565b60405180910390f35b600060606001604051908082528060200260200182016040528015610cde57816020015b610ccb6144ce565b815260200190600190039081610cc35790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff168152602001600081525081600081518110610d1a57fe5b6020026020010181905250610d2d6144fe565b6040518060800160405280600115158152602001600080811115610d4d57fe5b8152602001600080811115610d5e57fe5b8152602001858152509050610d7161453c565b600081600001906001811115610d8357fe5b90816001811115610d9057fe5b815250506000816020018181525050818160400181905250600f54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606001604051908082528060200260200182016040528015610e2957816020015b610e166145a8565b815260200190600190039081610e0e5790505b5090508181600081518110610e3a57fe5b6020026020010181905250600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b8152600401610ea2929190615464565b600060405180830381600087803b158015610ebc57600080fd5b505af1158015610ed0573d6000803e3d6000fd5b5050505050505050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f9b5780601f10610f7057610100808354040283529160200191610f9b565b820191906000526020600020905b815481529060010190602001808311610f7e57829003601f168201915b5050505050905090565b601060149054906101000a900460ff1681565b6000610fcc610fc5613472565b848461347a565b6001905092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110339190615389565b60206040518083038186803b15801561104b57600080fd5b505afa15801561105f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061108391908101906149d8565b905090565b60085481565b6000600254905090565b60006110a5848484613645565b611166846110b1613472565b61116185604051806060016040528060288152602001615b0c60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611117613472565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138cf9092919063ffffffff16565b61347a565b600190509392505050565b600160066000828254019250508190555060006006549050600082116111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c3906156d3565b60405180910390fd5b6111d4611b07565b600881905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401611239939291906153a4565b602060405180830381600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061128b91908101906148a5565b50611294611cc4565b6000809050600060085414156112b357829050826008819055506112df565b6112dc6008546112ce6002548661392a90919063ffffffff16565b61399a90919063ffffffff16565b90505b6112e7611b07565b6008819055506112f733826139e4565b50600654811461133c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133390615713565b60405180910390fd5b5050565b611348611ff1565b611387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137e90615613565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6113d3611ff1565b611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140990615613565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161144d9190615389565b60206040518083038186803b15801561146557600080fd5b505afa158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061149d91908101906149d8565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016114da9291906153db565b602060405180830381600087803b1580156114f457600080fd5b505af1158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061152c91908101906148a5565b505050565b6000600560009054906101000a900460ff16905090565b60006115f1611555613472565b846115ec8560016000611566613472565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b6c90919063ffffffff16565b61347a565b6001905092915050565b60016006600082825401925050819055506000600654905061161b611ff1565b61165a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165190615613565b60405180910390fd5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116b79190615389565b60206040518083038186803b1580156116cf57600080fd5b505afa1580156116e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061170791908101906149d8565b90506000811161174c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611743906156d3565b60405180910390fd5b611754611cc4565b61175c611b07565b6008819055505060065481146117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e90615713565b60405180910390fd5b50565b60006117b4614614565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f546040518363ffffffff1660e01b815260040161183e929190615753565b604080518083038186803b15801561185557600080fd5b505afa158015611869573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061188d9190810190614986565b9050806020015191505090565b6118a2611ff1565b6118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d890615613565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119ce9190615389565b60206040518083038186803b1580156119e657600080fd5b505afa1580156119fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a1e91908101906149d8565b905090565b611a2b6132fe565b73ffffffffffffffffffffffffffffffffffffffff1663d2d0e066600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360006040518463ffffffff1660e01b8152600401611a8a9392919061542d565b600060405180830381600087803b158015611aa457600080fd5b505af1158015611ab8573d6000803e3d6000fd5b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000611b75611b146128b1565b611b67611b1f6129ee565b611b59611b2a6117aa565b611b4b611b35613075565b611b3d61271c565b613b6c90919063ffffffff16565b613b6c90919063ffffffff16565b613b6c90919063ffffffff16565b613b6c90919063ffffffff16565b905090565b611b82611ff1565b611bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb890615613565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080611c8d611b07565b9050611cbe600254611cb0670de0b6b3a76400008461392a90919063ffffffff16565b61399a90919063ffffffff16565b91505090565b6000611cce6124f2565b9050601060149054906101000a900460ff166004811115611ceb57fe5b816004811115611cf757fe5b14611d0557611d04613bc1565b5b6000611d0f6128b1565b1115611dd65760016004811115611d2257fe5b816004811115611d2e57fe5b1415611d4657611d44611d3f6128b1565b610c9f565b505b600480811115611d5257fe5b816004811115611d5e57fe5b1415611d7557611d74611d6f6128b1565b611dfc565b5b60026004811115611d8257fe5b816004811115611d8e57fe5b1415611da557611da4611d9f6128b1565b612f30565b5b60036004811115611db257fe5b816004811115611dbe57fe5b1415611dd557611dd4611dcf6128b1565b611a23565b5b5b80601060146101000a81548160ff02191690836004811115611df457fe5b021790555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b8152600401611e5b9291906153db565b602060405180830381600087803b158015611e7557600080fd5b505af1158015611e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ead91908101906149d8565b11611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee4906156f3565b60405180910390fd5b50565b611ef8611ff1565b611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e90615613565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612034613472565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e85780601f106120bd576101008083540402835291602001916120e8565b820191906000526020600020905b8154815290600101906020018083116120cb57829003601f168201915b5050505050905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612191929190615404565b602060405180830381600087803b1580156121ab57600080fd5b505af11580156121bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121e391908101906148a5565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612283929190615404565b602060405180830381600087803b15801561229d57600080fd5b505af11580156122b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122d591908101906148a5565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b361231c6133a5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161235a929190615404565b602060405180830381600087803b15801561237457600080fd5b505af1158015612388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123ac91908101906148a5565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161244c929190615404565b602060405180830381600087803b15801561246657600080fd5b505af115801561247a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061249e91908101906148a5565b50565b6124a9611ff1565b6124e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124df90615613565b60405180910390fd5b80600f8190555050565b6000806000806000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d88be3c0600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401612577919061536e565b60006040518083038186803b15801561258f57600080fd5b505afa1580156125a3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506125cc91908101906148f7565b9450945094509450506000809050808511156125e6578490505b808411156125f2578390505b808311156125fe578290505b8082111561260a578190505b60008090508282141561261c57600190505b8382141561262957600390505b8482141561263657600490505b8582141561264357600290505b80965050505050505090565b600061271261265c613472565b8461270d85604051806060016040528060258152602001615b346025913960016000612686613472565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138cf9092919063ffffffff16565b61347a565b6001905092915050565b600080612727611971565b90506000811115612801576127fe670de0b6b3a76400006127f0600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b1580156127a957600080fd5b505afa1580156127bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127e191908101906149d8565b8461392a90919063ffffffff16565b61399a90919063ffffffff16565b90505b8091505090565b600061281c612815613472565b8484613645565b6001905092915050565b61282e611ff1565b61286d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286490615613565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161290e9190615389565b60206040518083038186803b15801561292657600080fd5b505afa15801561293a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061295e91908101906149d8565b905090565b61296b611ff1565b6129aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a190615613565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a4b9190615389565b60206040518083038186803b158015612a6357600080fd5b505afa158015612a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a9b91908101906149d8565b905090565b600f5481565b60016006600082825401925050819055506000600654905060008211612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af890615653565b60405180910390fd5b6000612b0c33611abf565b905080831115612b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4890615633565b60405180910390fd5b612b59611b07565b6008819055506000612b8a600254612b7c8660085461392a90919063ffffffff16565b61399a90919063ffffffff16565b9050612c14846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138cf9092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612c6b84600254613c3a90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612ccf919061577c565b60405180910390a36000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612d349190615389565b60206040518083038186803b158015612d4c57600080fd5b505afa158015612d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d8491908101906149d8565b905081811015612d9857612d9782613c84565b5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401612df59291906153db565b602060405180830381600087803b158015612e0f57600080fd5b505af1158015612e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e4791908101906148a5565b50612e50611cc4565b612e58611b07565b6008819055505050506006548114612ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9c90615713565b60405180910390fd5b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401612f8d919061577c565b602060405180830381600087803b158015612fa757600080fd5b505af1158015612fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612fdf91908101906149d8565b1461301f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301690615573565b60405180910390fd5b50565b61302a611ff1565b613069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306090615613565b60405180910390fd5b61307281613dfa565b50565b600080613080610fd6565b9050600081111561313957600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b81526004016130e69190615389565b60206040518083038186803b1580156130fe57600080fd5b505afa158015613112573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061313691908101906149d8565b90505b8091505090565b613148611ff1565b613187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317e90615613565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6131d3611ff1565b613212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320990615613565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff163160405161324f90615359565b60006040518083038185875af1925050503d806000811461328c576040519150601f19603f3d011682016040523d82523d6000602084013e613291565b606091505b50509050806132d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132cc906155b3565b60405180910390fd5b50565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561336857600080fd5b505afa15801561337c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133a091908101906147b5565b905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b15801561340f57600080fd5b505afa158015613423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061344791908101906147b5565b905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134e1906156b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561355a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355190615553565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051613638919061577c565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156136b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ac90615673565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371c906154f3565b60405180910390fd5b61379081604051806060016040528060268152602001615ae6602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138cf9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613823816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b6c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138c2919061577c565b60405180910390a3505050565b6000838311158290613917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390e91906154d1565b60405180910390fd5b5060008385039050809150509392505050565b60008083141561393d5760009050613994565b600082840290508284828161394e57fe5b041461398f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613986906155d3565b60405180910390fd5b809150505b92915050565b60006139dc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613f2a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4b90615733565b60405180910390fd5b613a6981600254613b6c90919063ffffffff16565b600281905550613ac0816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b6c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613b60919061577c565b60405180910390a35050565b600080828401905083811015613bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bae90615593565b60405180910390fd5b8091505092915050565b6000613bcb611971565b90506000811115613be057613bdf81613f8b565b5b613be86117aa565b90506000811115613bfd57613bfc8161407d565b5b613c05610fd6565b90506000811115613c1a57613c19816142b7565b5b613c226129ee565b90506000811115613c3757613c36816143ab565b5b50565b6000613c7c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506138cf565b905092915050565b60026004811115613c9157fe5b601060149054906101000a900460ff166004811115613cac57fe5b1415613cbc57613cbb8161443b565b5b60036004811115613cc957fe5b601060149054906101000a900460ff166004811115613ce457fe5b1415613d3e5780613cf36129ee565b1015613d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d2b90615693565b60405180910390fd5b613d3d816143ab565b5b60016004811115613d4b57fe5b601060149054906101000a900460ff166004811115613d6657fe5b1415613dc05780613d756117aa565b1015613db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dad90615693565b60405180910390fd5b613dbf8161407d565b5b600480811115613dcc57fe5b601060149054906101000a900460ff166004811115613de757fe5b1415613df757613df6816142b7565b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e6190615533565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290613f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f6891906154d1565b60405180910390fd5b506000838581613f7d57fe5b049050809150509392505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75836040518263ffffffff1660e01b8152600401613fe8919061577c565b602060405180830381600087803b15801561400257600080fd5b505af1158015614016573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061403a91908101906149d8565b1461407a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161407190615513565b60405180910390fd5b50565b606060016040519080825280602002602001820160405280156140ba57816020015b6140a76144ce565b81526020019060019003908161409f5790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250816000815181106140f657fe5b60200260200101819052506141096144fe565b604051806080016040528060001515815260200160008081111561412957fe5b815260200160008081111561413a57fe5b815260200184815250905061414d61453c565b60018160000190600181111561415f57fe5b9081600181111561416c57fe5b815250506000816020018181525050818160400181905250600f54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506060600160405190808252806020026020018201604052801561420557816020015b6141f26145a8565b8152602001906001900390816141ea5790505b509050818160008151811061421657fe5b6020026020010181905250600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b815260040161427e929190615464565b600060405180830381600087803b15801561429857600080fd5b505af11580156142ac573d6000803e3d6000fd5b505050505050505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30846040518363ffffffff1660e01b81526004016143169291906153db565b602060405180830381600087803b15801561433057600080fd5b505af1158015614344573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061436891908101906149d8565b116143a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161439f906155f3565b60405180910390fd5b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75826040518263ffffffff1660e01b8152600401614406919061577c565b600060405180830381600087803b15801561442057600080fd5b505af1158015614434573d6000803e3d6000fd5b5050505050565b6000614445611971565b9050600061445161271c565b905082811015614496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161448d90615693565b60405180910390fd5b60006144bd826144af868661392a90919063ffffffff16565b61399a90919063ffffffff16565b90506144c881613f8b565b50505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b604051806080016040528060001515815260200160008081111561451e57fe5b815260200160008081111561452f57fe5b8152602001600081525090565b6040518061010001604052806000600181111561455557fe5b815260200160008152602001614569614630565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b604051806101000160405280600060018111156145c157fe5b8152602001600081526020016145d5614630565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518060400160405280600015158152602001600081525090565b604051806080016040528060001515815260200160008081111561465057fe5b815260200160008081111561466157fe5b8152602001600081525090565b60008135905061467d81615a89565b92915050565b60008151905061469281615a89565b92915050565b6000815190506146a781615aa0565b92915050565b6000813590506146bc81615ab7565b92915050565b600082601f8301126146d357600080fd5b81516146e66146e1826157df565b6157b2565b9150808252602083016020830185838301111561470257600080fd5b61470d838284615a11565b50505092915050565b60006040828403121561472857600080fd5b61473260406157b2565b9050600061474284828501614698565b600083015250602061475684828501614777565b60208301525092915050565b60008135905061477181615ace565b92915050565b60008151905061478681615ace565b92915050565b60006020828403121561479e57600080fd5b60006147ac8482850161466e565b91505092915050565b6000602082840312156147c757600080fd5b60006147d584828501614683565b91505092915050565b600080604083850312156147f157600080fd5b60006147ff8582860161466e565b92505060206148108582860161466e565b9150509250929050565b60008060006060848603121561482f57600080fd5b600061483d8682870161466e565b935050602061484e8682870161466e565b925050604061485f86828701614762565b9150509250925092565b6000806040838503121561487c57600080fd5b600061488a8582860161466e565b925050602061489b85828601614762565b9150509250929050565b6000602082840312156148b757600080fd5b60006148c584828501614698565b91505092915050565b6000602082840312156148e057600080fd5b60006148ee848285016146ad565b91505092915050565b600080600080600060a0868803121561490f57600080fd5b600086015167ffffffffffffffff81111561492957600080fd5b614935888289016146c2565b955050602061494688828901614777565b945050604061495788828901614777565b935050606061496888828901614777565b925050608061497988828901614777565b9150509295509295909350565b60006040828403121561499857600080fd5b60006149a684828501614716565b91505092915050565b6000602082840312156149c157600080fd5b60006149cf84828501614762565b91505092915050565b6000602082840312156149ea57600080fd5b60006149f884828501614777565b91505092915050565b6000614a0d83836151c6565b905092915050565b6000614a2183836152ce565b60408301905092915050565b614a3681615981565b82525050565b614a45816158c0565b82525050565b614a54816158c0565b82525050565b6000614a658261582b565b614a6f8185615871565b935083602082028501614a818561580b565b8060005b85811015614abd5784840389528151614a9e8582614a01565b9450614aa983615857565b925060208a01995050600181019050614a85565b50829750879550505050505092915050565b6000614ada82615836565b614ae48185615882565b9350614aef8361581b565b8060005b83811015614b20578151614b078882614a15565b9750614b1283615864565b925050600181019050614af3565b5085935050505092915050565b614b36816158d2565b82525050565b614b45816158d2565b82525050565b6000614b5682615841565b614b608185615893565b9350614b70818560208601615a11565b614b7981615a44565b840191505092915050565b614b8d81615993565b82525050565b614b9c816159a5565b82525050565b614bab816159b7565b82525050565b614bba816159c9565b82525050565b614bc9816159db565b82525050565b6000614bda8261584c565b614be481856158af565b9350614bf4818560208601615a11565b614bfd81615a44565b840191505092915050565b6000614c156023836158af565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c7b6019836158af565b91507f434f4d504f554e443a207769746864726177206661696c6564000000000000006000830152602082019050919050565b6000614cbb6026836158af565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d216022836158af565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d876017836158af565b91507f434f4d504f554e443a20737570706c79206661696c65640000000000000000006000830152602082019050919050565b6000614dc7601b836158af565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614e076016836158af565b91507f7472616e73666572206f6620455448206661696c6564000000000000000000006000830152602082019050919050565b6000614e476021836158af565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ead6018836158af565b91507f46554c4352554d3a207769746864726177206661696c656400000000000000006000830152602082019050919050565b6000614eed6020836158af565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614f2d6014836158af565b91507f696e73756666696369656e742062616c616e63650000000000000000000000006000830152602082019050919050565b6000614f6d601f836158af565b91507f7769746864726177206d7573742062652067726561746572207468616e2030006000830152602082019050919050565b6000614fad6025836158af565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006150136000836158a4565b9150600082019050919050565b600061502d6012836158af565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b600061506d6024836158af565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006150d3601e836158af565b91507f6465706f736974206d7573742062652067726561746572207468616e203000006000830152602082019050919050565b60006151136016836158af565b91507f46554c4352554d3a20737570706c79206661696c6564000000000000000000006000830152602082019050919050565b6000615153601f836158af565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000615193601f836158af565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6000610160830160008301516151df6000860182614b84565b5060208301516151f2602086018261532c565b5060408301516152056040860182615279565b50606083015161521860c086018261532c565b50608083015161522b60e086018261532c565b5060a083015161523f610100860182614a3c565b5060c083015161525361012086018261532c565b5060e083015184820361014086015261526c8282614b4b565b9150508091505092915050565b60808201600082015161528f6000850182614b2d565b5060208201516152a26020850182614b93565b5060408201516152b56040850182614ba2565b5060608201516152c8606085018261532c565b50505050565b6040820160008201516152e46000850182614a3c565b5060208201516152f7602085018261532c565b50505050565b6040820160008201516153136000850182614a3c565b506020820151615326602085018261532c565b50505050565b6153358161596a565b82525050565b6153448161596a565b82525050565b61535381615974565b82525050565b600061536482615006565b9150819050919050565b60006020820190506153836000830184614a4b565b92915050565b600060208201905061539e6000830184614a2d565b92915050565b60006060820190506153b96000830186614a2d565b6153c66020830185614a2d565b6153d3604083018461533b565b949350505050565b60006040820190506153f06000830185614a2d565b6153fd602083018461533b565b9392505050565b60006040820190506154196000830185614a4b565b615426602083018461533b565b9392505050565b60006060820190506154426000830186614a4b565b61544f602083018561533b565b61545c6040830184614bc0565b949350505050565b6000604082019050818103600083015261547e8185614acf565b905081810360208301526154928184614a5a565b90509392505050565b60006020820190506154b06000830184614b3c565b92915050565b60006020820190506154cb6000830184614bb1565b92915050565b600060208201905081810360008301526154eb8184614bcf565b905092915050565b6000602082019050818103600083015261550c81614c08565b9050919050565b6000602082019050818103600083015261552c81614c6e565b9050919050565b6000602082019050818103600083015261554c81614cae565b9050919050565b6000602082019050818103600083015261556c81614d14565b9050919050565b6000602082019050818103600083015261558c81614d7a565b9050919050565b600060208201905081810360008301526155ac81614dba565b9050919050565b600060208201905081810360008301526155cc81614dfa565b9050919050565b600060208201905081810360008301526155ec81614e3a565b9050919050565b6000602082019050818103600083015261560c81614ea0565b9050919050565b6000602082019050818103600083015261562c81614ee0565b9050919050565b6000602082019050818103600083015261564c81614f20565b9050919050565b6000602082019050818103600083015261566c81614f60565b9050919050565b6000602082019050818103600083015261568c81614fa0565b9050919050565b600060208201905081810360008301526156ac81615020565b9050919050565b600060208201905081810360008301526156cc81615060565b9050919050565b600060208201905081810360008301526156ec816150c6565b9050919050565b6000602082019050818103600083015261570c81615106565b9050919050565b6000602082019050818103600083015261572c81615146565b9050919050565b6000602082019050818103600083015261574c81615186565b9050919050565b600060608201905061576860008301856152fd565b615775604083018461533b565b9392505050565b6000602082019050615791600083018461533b565b92915050565b60006020820190506157ac600083018461534a565b92915050565b6000604051905081810181811067ffffffffffffffff821117156157d557600080fd5b8060405250919050565b600067ffffffffffffffff8211156157f657600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006158cb8261594a565b9050919050565b60008115159050919050565b60006158e9826158c0565b9050919050565b60008190506158fe82615a55565b919050565b600081905061591182615a62565b919050565b600081905061592482615a6f565b919050565b600081905061593782615a7c565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061598c826159ed565b9050919050565b600061599e826158f0565b9050919050565b60006159b082615903565b9050919050565b60006159c282615916565b9050919050565b60006159d482615929565b9050919050565b60006159e68261593c565b9050919050565b60006159f8826159ff565b9050919050565b6000615a0a8261594a565b9050919050565b60005b83811015615a2f578082015181840152602081019050615a14565b83811115615a3e576000848401525b50505050565b6000601f19601f8301169050919050565b60028110615a5f57fe5b50565b60018110615a6c57fe5b50565b60018110615a7957fe5b50565b60058110615a8657fe5b50565b615a92816158c0565b8114615a9d57600080fd5b50565b615aa9816158d2565b8114615ab457600080fd5b50565b615ac0816158de565b8114615acb57600080fd5b50565b615ad78161596a565b8114615ae257600080fd5b5056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa365627a7a723158207dd8b1df3368abaf7ebdf430ccc99de426a596a7b2cc26d347d0f43e87d97bd86c6578706572696d656e74616cf564736f6c634300050c0040

Deployed Bytecode Sourcemap

13652:10547:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16215:579;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16215:579:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13953:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13953:24:0;;;:::i;:::-;;;;;;;;;;;;;;;;4915:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4915:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;14152:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14152:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;1935:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1935:152:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18770:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18770:116:0;;;:::i;:::-;;;;;;;;;;;;;;;;13825:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13825:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;1418:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1418:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;2093:304;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2093:304:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;21543:565;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21543:565:0;;;;;;;;;;;;;;;;:::i;:::-;;14858:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14858:89:0;;;;;;;;;;;;;;;;:::i;:::-;;23803:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23803:181:0;;;;;;;;;;;;;;;;:::i;:::-;;5097:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5097:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;2403:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2403:210:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22158:255;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22158:255:0;;;:::i;:::-;;18017:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18017:166:0;;;:::i;:::-;;;;;;;;;;;;;;;;14951:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14951:85:0;;;;;;;;;;;;;;;;:::i;:::-;;14032:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14032:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;13902:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13902:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;18187:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18187:120:0;;;:::i;:::-;;;;;;;;;;;;;;;;20755:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20755:96:0;;;;;;;;;;;;;;;;:::i;:::-;;1515:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1515:110:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22419:219;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22419:219:0;;;:::i;:::-;;;;;;;;;;;;;;;;6115:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6115:140:0;;;:::i;:::-;;22644:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22644:154:0;;;:::i;:::-;;;;;;;;;;;;;;;;20203:546;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20203:546:0;;;:::i;:::-;;20855:141;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20855:141:0;;;;;;;;;;;;;;;;:::i;:::-;;14765:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14765:89:0;;;;;;;;;;;;;;;;:::i;:::-;;13929:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13929:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;5818:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5818:79:0;;;:::i;:::-;;;;;;;;;;;;;;;;13982:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13982:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;6015:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6015:94:0;;;:::i;:::-;;;;;;;;;;;;;;;;5004:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5004:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;17748:263;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17748:263:0;;;:::i;:::-;;15358:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15358:97:0;;;;;;;;;;;;;;;;:::i;:::-;;15503:706;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15503:706:0;;;:::i;:::-;;;;;;;;;;;;;;;;2619:261;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2619:261:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18311:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18311:248:0;;;:::i;:::-;;;;;;;;;;;;;;;;1631:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1631:158:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;15145:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15145:100:0;;;;;;;;;;;;;;;;:::i;:::-;;17377:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17377:107:0;;;:::i;:::-;;;;;;;;;;;;;;;;15040:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15040:101:0;;;;;;;;;;;;;;;;:::i;:::-;;18890:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18890:115:0;;;:::i;:::-;;;;;;;;;;;;;;;;14006:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14006:21:0;;;:::i;:::-;;;;;;;;;;;;;;;;22851:915;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22851:915:0;;;;;;;;;;;;;;;;:::i;:::-;;1795:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1795:134:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;21000:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21000:131:0;;;;;;;;;;;;;;;;:::i;:::-;;6261:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6261:109:0;;;;;;;;;;;;;;;;:::i;:::-;;18563:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18563:203:0;;;:::i;:::-;;;;;;;;;;;;;;;;15249:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15249:105:0;;;;;;;;;;;;;;;;:::i;:::-;;24019:177;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24019:177:0;;;:::i;:::-;;13874:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13874:23:0;;;:::i;:::-;;;;;;;;;;;;;;;;17490:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17490:120:0;;;:::i;:::-;;;;;;;;;;;;;;;;17614:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17614:128:0;;;:::i;:::-;;;;;;;;;;;;;;;;13849:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13849:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;16215:579;16266:4;16281:19;16314:1;16303:13;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;16281:35;;16336:22;;;;;;;;16349:4;16336:22;;;;;;16356:1;16336:22;;;16325:5;16331:1;16325:8;;;;;;;;;;;;;:33;;;;16369:22;;:::i;:::-;16394:70;;;;;;;;16406:4;16394:70;;;;;;16412:21;16394:70;;;;;;;;;;;;16435:20;16394:70;;;;;;;;;;;;16457:6;16394:70;;;16369:95;;16473:21;;:::i;:::-;16520:18;16503:3;:14;;:35;;;;;;;;;;;;;;;;;;;;;;;16563:1;16547:3;:13;;:17;;;;;16586:3;16573;:10;;:16;;;;16620:6;;16598:3;:19;;:28;;;;;16662:4;16635:3;:16;;:32;;;;;;;;;;;16678:24;16722:1;16705:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;16678:46;;16743:3;16733:4;16738:1;16733:7;;;;;;;;;;;;;:13;;;;16762:4;;;;;;;;;;;16757:18;;;16776:5;16783:4;16757:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16757:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16757:31:0;;;;16215:579;;;;;;;:::o;13953:24::-;;;;;;;;;;;;;:::o;4915:83::-;4952:13;4985:5;4978:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4915:83;:::o;14152:36::-;;;;;;;;;;;;;:::o;1935:152::-;2001:4;2018:39;2027:12;:10;:12::i;:::-;2041:7;2050:6;2018:8;:39::i;:::-;2075:4;2068:11;;1935:152;;;;:::o;18770:116::-;18817:7;18847;;;;;;;;;;;18840:25;;;18874:4;18840:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18840:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18840:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18840:40:0;;;;;;;;;18833:47;;18770:116;:::o;13825:19::-;;;;:::o;1418:91::-;1462:7;1489:12;;1482:19;;1418:91;:::o;2093:304::-;2182:4;2199:36;2209:6;2217:9;2228:6;2199:9;:36::i;:::-;2246:121;2255:6;2263:12;:10;:12::i;:::-;2277:89;2315:6;2277:89;;;;;;;;;;;;;;;;;:11;:19;2289:6;2277:19;;;;;;;;;;;;;;;:33;2297:12;:10;:12::i;:::-;2277:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;2246:8;:121::i;:::-;2385:4;2378:11;;2093:304;;;;;:::o;21543:565::-;5377:1;5360:13;;:18;;;;;;;;;;;5389:20;5412:13;;5389:36;;21642:1;21632:7;:11;21624:54;;;;;;;;;;;;;;;;;;;;;;21694:22;:20;:22::i;:::-;21687:4;:29;;;;21734:5;;;;;;;;;;;21727:26;;;21754:10;21774:4;21781:7;21727:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21727:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21727:62:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21727:62:0;;;;;;;;;;21800:11;:9;:11::i;:::-;21854:14;21871:1;21854:18;;21893:1;21885:4;;:9;21881:150;;;21916:7;21907:16;;21941:7;21934:4;:14;;;;21881:150;;;21984:37;22016:4;;21985:25;21997:12;;21985:7;:11;;:25;;;;:::i;:::-;21984:31;;:37;;;;:::i;:::-;21975:46;;21881:150;22046:22;:20;:22::i;:::-;22039:4;:29;;;;22077:25;22083:10;22095:6;22077:5;:25::i;:::-;5436:1;5472:13;;5456:12;:29;5448:73;;;;;;;;;;;;;;;;;;;;;;21543:565;;:::o;14858:89::-;5943:9;:7;:9::i;:::-;5935:54;;;;;;;;;;;;;;;;;;;;;;14932:9;14925:4;;:16;;;;;;;;;;;;;;;;;;14858:89;:::o;23803:181::-;5943:9;:7;:9::i;:::-;5935:54;;;;;;;;;;;;;;;;;;;;;;23881:8;23892:13;:23;;;23924:4;23892:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23892:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23892:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23892:38:0;;;;;;;;;23881:49;;23939:13;:22;;;23962:10;23974:3;23939:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23939:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23939:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23939:39:0;;;;;;;;;;6000:1;23803:181;:::o;5097:83::-;5138:5;5163:9;;;;;;;;;;;5156:16;;5097:83;:::o;2403:210::-;2483:4;2500:83;2509:12;:10;:12::i;:::-;2523:7;2532:50;2571:10;2532:11;:25;2544:12;:10;:12::i;:::-;2532:25;;;;;;;;;;;;;;;:34;2558:7;2532:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;2500:8;:83::i;:::-;2601:4;2594:11;;2403:210;;;;:::o;22158:255::-;5377:1;5360:13;;:18;;;;;;;;;;;5389:20;5412:13;;5389:36;;5943:9;:7;:9::i;:::-;5935:54;;;;;;;;;;;;;;;;;;;;;;22245:6;22261:5;;;;;;;;;;;22254:23;;;22286:4;22254:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22254:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22254:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;22254:38:0;;;;;;;;;22245:47;;22313:1;22309;:5;22301:48;;;;;;;;;;;;;;;;;;;;;;22358:11;:9;:11::i;:::-;22385:22;:20;:22::i;:::-;22378:4;:29;;;;6000:1;5472:13;;5456:12;:29;5448:73;;;;;;;;;;;;;;;;;;;;;;22158:255;:::o;18017:166::-;18061:7;18079:14;;:::i;:::-;18101:4;;;;;;;;;;;18096:24;;;18121:22;;;;;;;;18134:4;18121:22;;;;;;18141:1;18121:22;;;18145:6;;18096:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18096:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18096:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18096:56:0;;;;;;;;;18079:73;;18168:3;:9;;;18161:16;;;18017:166;:::o;14951:85::-;5943:9;:7;:9::i;:::-;5935:54;;;;;;;;;;;;;;;;;;;;;;15022:8;15016:3;;:14;;;;;;;;;;;;;;;;;;14951:85;:::o;14032:18::-;;;;;;;;;;;;;:::o;13902:22::-;;;;;;;;;;;;;:::o;18187:120::-;18235:7;18267:8;;;;;;;;;;;18260:26;;;18295:4;18260:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18260:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18260:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18260:41:0;;;;;;;;;18253:48;;18187:120;:::o;20755:96::-;20809:9;:7;:9::i;:::-;20804:23;;;20828:5;;;;;;;;;;;20835:6;20843:1;20804:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20804:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20804:41:0;;;;20755:96;:::o;1515:110::-;1572:7;1599:9;:18;1609:7;1599:18;;;;;;;;;;;;;;;;1592:25;;1515:110;;;:::o;22419:219::-;22472:4;22494:138;22622:9;:7;:9::i;:::-;22494:115;22595:13;:11;:13::i;:::-;22494:88;22568:13;:11;:13::i;:::-;22494:61;22531:23;:21;:23::i;:::-;22494:24;:22;:24::i;:::-;:36;;:61;;;;:::i;:::-;:73;;:88;;;;:::i;:::-;:100;;:115;;;;:::i;:::-;:127;;:138;;;;:::i;:::-;22487:145;;22419:219;:::o;6115:140::-;5943:9;:7;:9::i;:::-;5935:54;;;;;;;;;;;;;;;;;;;;;;6214:1;6177:40;;6198:6;;;;;;;;;;;6177:40;;;;;;;;;;;;6245:1;6228:6;;:19;;;;;;;;;;;;;;;;;;6115:140::o;22644:154::-;22697:4;22710:10;22723:22;:20;:22::i;:::-;22710:35;;22759:33;22779:12;;22759:15;22769:4;22759:5;:9;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;22752:40;;;22644:154;:::o;20203:546::-;20238:18;20259:11;:9;:11::i;:::-;20238:32;;20298:8;;;;;;;;;;;20283:23;;;;;;;;:11;:23;;;;;;;;;20279:59;;20317:13;:11;:13::i;:::-;20279:59;20362:1;20350:9;:7;:9::i;:::-;:13;20346:369;;;20393:11;20378:26;;;;;;;;:11;:26;;;;;;;;;20374:74;;;20417:21;20428:9;:7;:9::i;:::-;20417:10;:21::i;:::-;;20374:74;20475:14;20460:29;;;;;;;;:11;:29;;;;;;;;;20456:80;;;20502:24;20516:9;:7;:9::i;:::-;20502:13;:24::i;:::-;20456:80;20563:15;20548:30;;;;;;;;:11;:30;;;;;;;;;20544:82;;;20591:25;20606:9;:7;:9::i;:::-;20591:14;:25::i;:::-;20544:82;20653:11;20638:26;;;;;;;;:11;:26;;;;;;;;;20634:74;;;20677:21;20688:9;:7;:9::i;:::-;20677:10;:21::i;:::-;20634:74;20346:369;20732:11;20721:8;;:22;;;;;;;;;;;;;;;;;;;;;;;;20203:546;:::o;20855:141::-;20962:1;20923:7;;;;;;;;;;;20915:21;;;20945:4;20952:6;20915:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20915:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20915:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20915:44:0;;;;;;;;;:48;20907:83;;;;;;;;;;;;;;;;;;;;;;20855:141;:::o;14765:89::-;5943:9;:7;:9::i;:::-;5935:54;;;;;;;;;;;;;;;;;;;;;;14839:9;14832:4;;:16;;;;;;;;;;;;;;;;;;14765:89;:::o;13929:19::-;;;;;;;;;;;;;:::o;5818:79::-;5856:7;5883:6;;;;;;;;;;;5876:13;;5818:79;:::o;13982:19::-;;;;;;;;;;;;;:::o;6015:94::-;6055:4;6095:6;;;;;;;;;;;6079:22;;:12;:10;:12::i;:::-;:22;;;6072:29;;6015:94;:::o;5004:87::-;5043:13;5076:7;5069:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5004:87;:::o;17748:263::-;17795:5;;;;;;;;;;;17788:21;;;17810:8;;;;;;;;;;;17825:2;17788:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17788:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17788:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17788:41:0;;;;;;;;;;17871:5;;;;;;;;;;;17864:21;;;17886:4;;;;;;;;;;;17897:2;17864:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17864:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17864:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17864:37:0;;;;;;;;;;17917:5;;;;;;;;;;;17910:21;;;17932:13;:11;:13::i;:::-;17952:2;17910:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17910:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17910:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17910:46:0;;;;;;;;;;17972:5;;;;;;;;;;;17965:21;;;17987:7;;;;;;;;;;;18001:2;17965:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17965:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17965:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17965:40:0;;;;;;;;;;17748:263::o;15358:97::-;5943:9;:7;:9::i;:::-;5935:54;;;;;;;;;;;;;;;;;;;;;;15438:11;15429:6;:20;;;;15358:97;:::o;15503:706::-;15545:6;15562:12;15575;15588;15601;15631:3;;;;;;;;;;;15617:28;;;15646:5;;;;;;;;;;;15617:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15617:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15617:35:0;;;;;;39:16:-1;36:1;17:17;2:54;15617:35:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15617:35:0;;;;;;;;;15560:92;;;;;;;;;15659:11;15673:1;15659:15;;15692:3;15685:4;:10;15681:43;;;15712:4;15706:10;;15681:43;15741:3;15734:4;:10;15730:43;;;15761:4;15755:10;;15730:43;15790:3;15783:4;:10;15779:43;;;15810:4;15804:10;;15779:43;15839:3;15832:4;:10;15828:43;;;15859:4;15853:10;;15828:43;15879:18;15900:11;15879:32;;15929:4;15922:3;:11;15918:59;;;15958:11;15944:25;;15918:59;15994:4;15987:3;:11;15983:59;;;16023:11;16009:25;;15983:59;16059:4;16052:3;:11;16048:62;;;16088:14;16074:28;;16048:62;16127:4;16120:3;:11;16116:63;;;16156:15;16142:29;;16116:63;16192:11;16185:18;;;;;;;;15503:706;:::o;2619:261::-;2704:4;2721:129;2730:12;:10;:12::i;:::-;2744:7;2753:96;2792:15;2753:96;;;;;;;;;;;;;;;;;:11;:25;2765:12;:10;:12::i;:::-;2753:25;;;;;;;;;;;;;;;:34;2779:7;2753:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;2721:8;:129::i;:::-;2868:4;2861:11;;2619:261;;;;:::o;18311:248::-;18366:7;18415:9;18427:17;:15;:17::i;:::-;18415:29;;18459:1;18455;:5;18451:88;;;18475:56;18526:4;18475:46;18490:8;;;;;;;;;;;18481:37;;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18481:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18481:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18481:39:0;;;;;;;;;18475:1;:5;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;18471:60;;18451:88;18552:1;18545:8;;;18311:248;:::o;1631:158::-;1700:4;1717:42;1727:12;:10;:12::i;:::-;1741:9;1752:6;1717:9;:42::i;:::-;1777:4;1770:11;;1631:158;;;;:::o;15145:100::-;5943:9;:7;:9::i;:::-;5935:54;;;;;;;;;;;;;;;;;;;;;;15228:11;15216:9;;:23;;;;;;;;;;;;;;;;;;15145:100;:::o;17377:107::-;17417:7;17447:5;;;;;;;;;;;17440:23;;;17472:4;17440:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17440:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17440:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17440:38:0;;;;;;;;;17433:45;;17377:107;:::o;15040:101::-;5943:9;:7;:9::i;:::-;5935:54;;;;;;;;;;;;;;;;;;;;;;15123:12;15113:7;;:22;;;;;;;;;;;;;;;;;;15040:101;:::o;18890:115::-;18934:7;18964:9;;;;;;;;;;;18957:27;;;18993:4;18957:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18957:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18957:42:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18957:42:0;;;;;;;;;18950:49;;18890:115;:::o;14006:21::-;;;;:::o;22851:915::-;5377:1;5360:13;;:18;;;;;;;;;;;5389:20;5412:13;;5389:36;;22950:1;22940:7;:11;22932:55;;;;;;;;;;;;;;;;;;;;;;22998:16;23017:21;23027:10;23017:9;:21::i;:::-;22998:40;;23066:8;23055:7;:19;;23047:52;;;;;;;;;;;;;;;;;;;;;;23162:22;:20;:22::i;:::-;23155:4;:29;;;;23247:9;23259:37;23283:12;;23260:17;23269:7;23260:4;;:8;;:17;;;;:::i;:::-;23259:23;;:37;;;;:::i;:::-;23247:49;;23333:67;23359:7;23333:67;;;;;;;;;;;;;;;;;:9;:21;23343:10;23333:21;;;;;;;;;;;;;;;;:25;;:67;;;;;:::i;:::-;23309:9;:21;23319:10;23309:21;;;;;;;;;;;;;;;:91;;;;23424:25;23441:7;23424:12;;:16;;:25;;;;:::i;:::-;23409:12;:40;;;;23494:1;23465:41;;23474:10;23465:41;;;23498:7;23465:41;;;;;;;;;;;;;;;23545:9;23564:5;;;;;;;;;;;23557:23;;;23589:4;23557:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23557:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23557:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23557:38:0;;;;;;;;;23545:50;;23612:1;23608;:5;23604:47;;;23626:15;23639:1;23626:12;:15::i;:::-;23604:47;23668:5;;;;;;;;;;;23661:22;;;23684:10;23696:1;23661:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23661:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23661:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23661:37:0;;;;;;;;;;23709:11;:9;:11::i;:::-;23736:22;:20;:22::i;:::-;23729:4;:29;;;;5436:1;;;5472:13;;5456:12;:29;5448:73;;;;;;;;;;;;;;;;;;;;;;22851:915;;:::o;1795:134::-;1867:7;1894:11;:18;1906:5;1894:18;;;;;;;;;;;;;;;:27;1913:7;1894:27;;;;;;;;;;;;;;;;1887:34;;1795:134;;;;:::o;21000:131::-;21096:1;21070:8;;;;;;;;;;;21061:23;;;21085:6;21061:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21061:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21061:31:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21061:31:0;;;;;;;;;:36;21053:72;;;;;;;;;;;;;;;;;;;;;;21000:131;:::o;6261:109::-;5943:9;:7;:9::i;:::-;5935:54;;;;;;;;;;;;;;;;;;;;;;6334:28;6353:8;6334:18;:28::i;:::-;6261:109;:::o;18563:203::-;18617:7;18633:9;18645:16;:14;:16::i;:::-;18633:28;;18676:1;18672;:5;18668:78;;;18700:7;;;;;;;;;;;18692:31;;;18732:4;18692:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18692:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18692:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18692:46:0;;;;;;;;;18688:50;;18668:78;18759:1;18752:8;;;18563:203;:::o;15249:105::-;5943:9;:7;:9::i;:::-;5935:54;;;;;;;;;;;;;;;;;;;;;;15335:13;15324:8;;:24;;;;;;;;;;;;;;;;;;15249:105;:::o;24019:177::-;5943:9;:7;:9::i;:::-;5935:54;;;;;;;;;;;;;;;;;;;;;;24075:11;24092:10;:15;;24122:4;24114:21;;;24092:48;;;;;;;;;;;;;;;;;;;;;;;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;;24074:66:0;;;24157:6;24149:41;;;;;;;;;;;;;;;;;;;;;;6000:1;24019:177::o;13874:23::-;;;;;;;;;;;;;:::o;17490:120::-;17530:7;17582:4;;;;;;;;;;;17553:49;;;:51;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17553:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17553:51:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17553:51:0;;;;;;;;;17546:58;;17490:120;:::o;17614:128::-;17658:7;17710:4;;;;;;;;;;;17681:53;;;:55;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17681:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17681:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17681:55:0;;;;;;;;;17674:62;;17614:128;:::o;13849:20::-;;;;;;;;;;;;;:::o;852:98::-;897:15;932:10;925:17;;852:98;:::o;4031:338::-;4142:1;4125:19;;:5;:19;;;;4117:68;;;;;;;;;;;;;;;;;;;;;;4223:1;4204:21;;:7;:21;;;;4196:68;;;;;;;;;;;;;;;;;;;;;;4307:6;4277:11;:18;4289:5;4277:18;;;;;;;;;;;;;;;:27;4296:7;4277:27;;;;;;;;;;;;;;;:36;;;;4345:7;4329:32;;4338:5;4329:32;;;4354:6;4329:32;;;;;;;;;;;;;;;4031:338;;;:::o;2886:471::-;3002:1;2984:20;;:6;:20;;;;2976:70;;;;;;;;;;;;;;;;;;;;;;3086:1;3065:23;;:9;:23;;;;3057:71;;;;;;;;;;;;;;;;;;;;;;3161;3183:6;3161:71;;;;;;;;;;;;;;;;;:9;:17;3171:6;3161:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;3141:9;:17;3151:6;3141:17;;;;;;;;;;;;;;;:91;;;;3266:32;3291:6;3266:9;:20;3276:9;3266:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;3243:9;:20;3253:9;3243:20;;;;;;;;;;;;;;;:55;;;;3331:9;3314:35;;3323:6;3314:35;;;3342:6;3314:35;;;;;;;;;;;;;;;2886:471;;;:::o;6965:192::-;7051:7;7084:1;7079;:6;;7087:12;7071:29;;;;;;;;;;;;;;;;;;;;;;;;;7111:9;7127:1;7123;:5;7111:17;;7148:1;7141:8;;;6965:192;;;;;:::o;7163:250::-;7221:7;7250:1;7245;:6;7241:47;;;7275:1;7268:8;;;;7241:47;7300:9;7316:1;7312;:5;7300:17;;7345:1;7340;7336;:5;;;;;;:10;7328:56;;;;;;;;;;;;;;;;;;;;;;7404:1;7397:8;;;7163:250;;;;;:::o;7419:132::-;7477:7;7504:39;7508:1;7511;7504:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7497:46;;7419:132;;;;:::o;3363:308::-;3458:1;3439:21;;:7;:21;;;;3431:65;;;;;;;;;;;;;;;;;;;;;;3524:24;3541:6;3524:12;;:16;;:24;;;;:::i;:::-;3509:12;:39;;;;3580:30;3603:6;3580:9;:18;3590:7;3580:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;3559:9;:18;3569:7;3559:18;;;;;;;;;;;;;;;:51;;;;3647:7;3626:37;;3643:1;3626:37;;;3656:6;3626:37;;;;;;;;;;;;;;;3363:308;;:::o;6636:181::-;6694:7;6714:9;6730:1;6726;:5;6714:17;;6755:1;6750;:6;;6742:46;;;;;;;;;;;;;;;;;;;;;;6808:1;6801:8;;;6636:181;;;;:::o;19011:412::-;19050:14;19067:17;:15;:17::i;:::-;19050:34;;19104:1;19095:6;:10;19091:57;;;19116:24;19133:6;19116:16;:24::i;:::-;19091:57;19163:13;:11;:13::i;:::-;19154:22;;19196:1;19187:6;:10;19183:53;;;19208:20;19221:6;19208:12;:20::i;:::-;19183:53;19251:16;:14;:16::i;:::-;19242:25;;19287:1;19278:6;:10;19274:56;;;19299:23;19315:6;19299:15;:23::i;:::-;19274:56;19345:13;:11;:13::i;:::-;19336:22;;19378:1;19369:6;:10;19365:53;;;19390:20;19403:6;19390:12;:20::i;:::-;19365:53;19011:412;:::o;6823:136::-;6881:7;6908:43;6912:1;6915;6908:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6901:50;;6823:136;;;;:::o;19705:492::-;19776:15;19764:27;;;;;;;;:8;;;;;;;;;;;:27;;;;;;;;;19760:79;;;19802:29;19823:7;19802:20;:29::i;:::-;19760:79;19861:11;19849:23;;;;;;;;:8;;;;;;;;;;;:23;;;;;;;;;19845:131;;;19908:7;19891:13;:11;:13::i;:::-;:24;;19883:55;;;;;;;;;;;;;;;;;;;;;;19947:21;19960:7;19947:12;:21::i;:::-;19845:131;19998:11;19986:23;;;;;;;;:8;;;;;;;;;;;:23;;;;;;;;;19982:131;;;20045:7;20028:13;:11;:13::i;:::-;:24;;20020:55;;;;;;;;;;;;;;;;;;;;;;20084:21;20097:7;20084:12;:21::i;:::-;19982:131;20135:14;20123:26;;;;;;;;:8;;;;;;;;;;;:26;;;;;;;;;20119:73;;;20160:24;20176:7;20160:15;:24::i;:::-;20119:73;19705:492;:::o;6376:229::-;6470:1;6450:22;;:8;:22;;;;6442:73;;;;;;;;;;;;;;;;;;;;;;6560:8;6531:38;;6552:6;;;;;;;;;;;6531:38;;;;;;;;;;;;6589:8;6580:6;;:17;;;;;;;;;;;;;;;;;;6376:229;:::o;7557:258::-;7643:7;7742:1;7738;:5;7745:12;7730:28;;;;;;;;;;;;;;;;;;;;;;;;;7769:9;7785:1;7781;:5;;;;;;7769:17;;7806:1;7799:8;;;7557:258;;;;;:::o;21381:139::-;21483:1;21455:8;;;;;;;;;;;21446:25;;;21472:6;21446:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21446:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21446:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21446:33:0;;;;;;;;;:38;21438:76;;;;;;;;;;;;;;;;;;;;;;21381:139;:::o;16800:571::-;16856:19;16889:1;16878:13;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;16856:35;;16911:22;;;;;;;;16924:4;16911:22;;;;;;16931:1;16911:22;;;16900:5;16906:1;16900:8;;;;;;;;;;;;;:33;;;;16944:22;;:::i;:::-;16969:71;;;;;;;;16981:5;16969:71;;;;;;16988:21;16969:71;;;;;;;;;;;;17011:20;16969:71;;;;;;;;;;;;17033:6;16969:71;;;16944:96;;17049:21;;:::i;:::-;17096:19;17079:3;:14;;:36;;;;;;;;;;;;;;;;;;;;;;;17140:1;17124:3;:13;;:17;;;;;17163:3;17150;:10;;:16;;;;17197:6;;17175:3;:19;;:28;;;;;17239:4;17212:3;:16;;:32;;;;;;;;;;;17255:24;17299:1;17282:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;17255:46;;17320:3;17310:4;17315:1;17310:7;;;;;;;;;;;;;:13;;;;17339:4;;;;;;;;;;;17334:18;;;17353:5;17360:4;17334:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17334:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17334:31:0;;;;16800:571;;;;;:::o;21230:147::-;21341:1;21302:7;;;;;;;;;;;21294:21;;;21324:4;21331:6;21294:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21294:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21294:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21294:44:0;;;;;;;;;:48;21286:85;;;;;;;;;;;;;;;;;;;;;;21230:147;:::o;21135:91::-;21195:9;;;;;;;;;;;21188:24;;;21213:6;21188:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21188:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21188:32:0;;;;21135:91;:::o;19429:270::-;19492:9;19504:17;:15;:17::i;:::-;19492:29;;19528:10;19541:24;:22;:24::i;:::-;19528:37;;19586:7;19580:2;:13;;19572:44;;;;;;;;;;;;;;;;;;;;;;19623:14;19640:22;19659:2;19640:14;19646:7;19640:1;:5;;:14;;;;:::i;:::-;:18;;:22;;;;:::i;:::-;19623:39;;19669:24;19686:6;19669:16;:24::i;:::-;19429:270;;;;:::o;13652:10547::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:134;;226:6;220:13;211:22;;238:33;265:5;238:33;;;205:71;;;;;283:128;;364:6;358:13;349:22;;376:30;400:5;376:30;;;343:68;;;;;418:156;;511:6;498:20;489:29;;523:46;563:5;523:46;;;483:91;;;;;582:444;;695:3;688:4;680:6;676:17;672:27;662:2;;713:1;710;703:12;662:2;743:6;737:13;765:65;780:49;822:6;780:49;;;765:65;;;756:74;;850:6;843:5;836:21;886:4;878:6;874:17;919:4;912:5;908:16;954:3;945:6;940:3;936:16;933:25;930:2;;;971:1;968;961:12;930:2;981:39;1013:6;1008:3;1003;981:39;;;655:371;;;;;;;;1059:493;;1180:4;1168:9;1163:3;1159:19;1155:30;1152:2;;;1198:1;1195;1188:12;1152:2;1216:20;1231:4;1216:20;;;1207:29;;1286:1;1317:57;1370:3;1361:6;1350:9;1346:22;1317:57;;;1311:3;1304:5;1300:15;1293:82;1246:140;1437:2;1470:60;1526:3;1517:6;1506:9;1502:22;1470:60;;;1463:4;1456:5;1452:16;1445:86;1396:146;1146:406;;;;;1559:130;;1639:6;1626:20;1617:29;;1651:33;1678:5;1651:33;;;1611:78;;;;;1696:134;;1780:6;1774:13;1765:22;;1792:33;1819:5;1792:33;;;1759:71;;;;;1837:241;;1941:2;1929:9;1920:7;1916:23;1912:32;1909:2;;;1957:1;1954;1947:12;1909:2;1992:1;2009:53;2054:7;2045:6;2034:9;2030:22;2009:53;;;1999:63;;1971:97;1903:175;;;;;2085:263;;2200:2;2188:9;2179:7;2175:23;2171:32;2168:2;;;2216:1;2213;2206:12;2168:2;2251:1;2268:64;2324:7;2315:6;2304:9;2300:22;2268:64;;;2258:74;;2230:108;2162:186;;;;;2355:366;;;2476:2;2464:9;2455:7;2451:23;2447:32;2444:2;;;2492:1;2489;2482:12;2444:2;2527:1;2544:53;2589:7;2580:6;2569:9;2565:22;2544:53;;;2534:63;;2506:97;2634:2;2652:53;2697:7;2688:6;2677:9;2673:22;2652:53;;;2642:63;;2613:98;2438:283;;;;;;2728:491;;;;2866:2;2854:9;2845:7;2841:23;2837:32;2834:2;;;2882:1;2879;2872:12;2834:2;2917:1;2934:53;2979:7;2970:6;2959:9;2955:22;2934:53;;;2924:63;;2896:97;3024:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;;;3032:63;;3003:98;3132:2;3150:53;3195:7;3186:6;3175:9;3171:22;3150:53;;;3140:63;;3111:98;2828:391;;;;;;3226:366;;;3347:2;3335:9;3326:7;3322:23;3318:32;3315:2;;;3363:1;3360;3353:12;3315:2;3398:1;3415:53;3460:7;3451:6;3440:9;3436:22;3415:53;;;3405:63;;3377:97;3505:2;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;;;3513:63;;3484:98;3309:283;;;;;;3599:257;;3711:2;3699:9;3690:7;3686:23;3682:32;3679:2;;;3727:1;3724;3717:12;3679:2;3762:1;3779:61;3832:7;3823:6;3812:9;3808:22;3779:61;;;3769:71;;3741:105;3673:183;;;;;3863:267;;3980:2;3968:9;3959:7;3955:23;3951:32;3948:2;;;3996:1;3993;3986:12;3948:2;4031:1;4048:66;4106:7;4097:6;4086:9;4082:22;4048:66;;;4038:76;;4010:110;3942:188;;;;;4137:908;;;;;;4330:3;4318:9;4309:7;4305:23;4301:33;4298:2;;;4347:1;4344;4337:12;4298:2;4403:1;4392:9;4388:17;4382:24;4426:18;4418:6;4415:30;4412:2;;;4458:1;4455;4448:12;4412:2;4478:74;4544:7;4535:6;4524:9;4520:22;4478:74;;;4468:84;;4361:197;4589:2;4607:64;4663:7;4654:6;4643:9;4639:22;4607:64;;;4597:74;;4568:109;4708:2;4726:64;4782:7;4773:6;4762:9;4758:22;4726:64;;;4716:74;;4687:109;4827:2;4845:64;4901:7;4892:6;4881:9;4877:22;4845:64;;;4835:74;;4806:109;4946:3;4965:64;5021:7;5012:6;5001:9;4997:22;4965:64;;;4955:74;;4925:110;4292:753;;;;;;;;;5052:305;;5188:2;5176:9;5167:7;5163:23;5159:32;5156:2;;;5204:1;5201;5194:12;5156:2;5239:1;5256:85;5333:7;5324:6;5313:9;5309:22;5256:85;;;5246:95;;5218:129;5150:207;;;;;5364:241;;5468:2;5456:9;5447:7;5443:23;5439:32;5436:2;;;5484:1;5481;5474:12;5436:2;5519:1;5536:53;5581:7;5572:6;5561:9;5557:22;5536:53;;;5526:63;;5498:97;5430:175;;;;;5612:263;;5727:2;5715:9;5706:7;5702:23;5698:32;5695:2;;;5743:1;5740;5733:12;5695:2;5778:1;5795:64;5851:7;5842:6;5831:9;5827:22;5795:64;;;5785:74;;5757:108;5689:186;;;;;5883:253;;6032:98;6126:3;6118:6;6032:98;;;6018:112;;6011:125;;;;;6145:249;;6268:86;6350:3;6342:6;6268:86;;;6383:4;6378:3;6374:14;6360:28;;6261:133;;;;;6402:142;6493:45;6532:5;6493:45;;;6488:3;6481:58;6475:69;;;6551:103;6624:24;6642:5;6624:24;;;6619:3;6612:37;6606:48;;;6661:113;6744:24;6762:5;6744:24;;;6739:3;6732:37;6726:48;;;6848:1040;;7041:78;7113:5;7041:78;;;7132:110;7235:6;7230:3;7132:110;;;7125:117;;7265:3;7307:4;7299:6;7295:17;7290:3;7286:27;7334:80;7408:5;7334:80;;;7434:7;7462:1;7447:402;7472:6;7469:1;7466:13;7447:402;;;7534:9;7528:4;7524:20;7519:3;7512:33;7579:6;7573:13;7601:112;7708:4;7693:13;7601:112;;;7593:120;;7730:84;7807:6;7730:84;;;7720:94;;7837:4;7832:3;7828:14;7821:21;;7504:345;7494:1;7491;7487:9;7482:14;;7447:402;;;7451:14;7862:4;7855:11;;7879:3;7872:10;;7020:868;;;;;;;;;;7951:834;;8132:72;8198:5;8132:72;;;8217:104;8314:6;8309:3;8217:104;;;8210:111;;8342:74;8410:5;8342:74;;;8436:7;8464:1;8449:314;8474:6;8471:1;8468:13;8449:314;;;8541:6;8535:13;8562:99;8657:3;8642:13;8562:99;;;8555:106;;8678:78;8749:6;8678:78;;;8668:88;;8506:257;8496:1;8493;8489:9;8484:14;;8449:314;;;8453:14;8776:3;8769:10;;8111:674;;;;;;;;8793:94;8860:21;8875:5;8860:21;;;8855:3;8848:34;8842:45;;;8894:104;8971:21;8986:5;8971:21;;;8966:3;8959:34;8953:45;;;9005:315;;9101:34;9129:5;9101:34;;;9147:60;9200:6;9195:3;9147:60;;;9140:67;;9212:52;9257:6;9252:3;9245:4;9238:5;9234:16;9212:52;;;9285:29;9307:6;9285:29;;;9280:3;9276:39;9269:46;;9081:239;;;;;;9327:142;9413:50;9457:5;9413:50;;;9408:3;9401:63;9395:74;;;9476:156;9569:57;9620:5;9569:57;;;9564:3;9557:70;9551:81;;;9639:150;9729:54;9777:5;9729:54;;;9724:3;9717:67;9711:78;;;9796:144;9888:46;9928:5;9888:46;;;9883:3;9876:59;9870:70;;;9947:140;10037:44;10075:5;10037:44;;;10032:3;10025:57;10019:68;;;10094:347;;10206:39;10239:5;10206:39;;;10257:71;10321:6;10316:3;10257:71;;;10250:78;;10333:52;10378:6;10373:3;10366:4;10359:5;10355:16;10333:52;;;10406:29;10428:6;10406:29;;;10401:3;10397:39;10390:46;;10186:255;;;;;;10449:465;;10609:67;10673:2;10668:3;10609:67;;;10602:74;;10709:66;10705:1;10700:3;10696:11;10689:87;10810:66;10805:2;10800:3;10796:12;10789:88;10905:2;10900:3;10896:12;10889:19;;10595:319;;;;10923:364;;11083:67;11147:2;11142:3;11083:67;;;11076:74;;11183:66;11179:1;11174:3;11170:11;11163:87;11278:2;11273:3;11269:12;11262:19;;11069:218;;;;11296:465;;11456:67;11520:2;11515:3;11456:67;;;11449:74;;11556:66;11552:1;11547:3;11543:11;11536:87;11657:66;11652:2;11647:3;11643:12;11636:88;11752:2;11747:3;11743:12;11736:19;;11442:319;;;;11770:465;;11930:67;11994:2;11989:3;11930:67;;;11923:74;;12030:66;12026:1;12021:3;12017:11;12010:87;12131:66;12126:2;12121:3;12117:12;12110:88;12226:2;12221:3;12217:12;12210:19;;11916:319;;;;12244:364;;12404:67;12468:2;12463:3;12404:67;;;12397:74;;12504:66;12500:1;12495:3;12491:11;12484:87;12599:2;12594:3;12590:12;12583:19;;12390:218;;;;12617:364;;12777:67;12841:2;12836:3;12777:67;;;12770:74;;12877:66;12873:1;12868:3;12864:11;12857:87;12972:2;12967:3;12963:12;12956:19;;12763:218;;;;12990:364;;13150:67;13214:2;13209:3;13150:67;;;13143:74;;13250:66;13246:1;13241:3;13237:11;13230:87;13345:2;13340:3;13336:12;13329:19;;13136:218;;;;13363:465;;13523:67;13587:2;13582:3;13523:67;;;13516:74;;13623:66;13619:1;13614:3;13610:11;13603:87;13724:66;13719:2;13714:3;13710:12;13703:88;13819:2;13814:3;13810:12;13803:19;;13509:319;;;;13837:364;;13997:67;14061:2;14056:3;13997:67;;;13990:74;;14097:66;14093:1;14088:3;14084:11;14077:87;14192:2;14187:3;14183:12;14176:19;;13983:218;;;;14210:364;;14370:67;14434:2;14429:3;14370:67;;;14363:74;;14470:66;14466:1;14461:3;14457:11;14450:87;14565:2;14560:3;14556:12;14549:19;;14356:218;;;;14583:364;;14743:67;14807:2;14802:3;14743:67;;;14736:74;;14843:66;14839:1;14834:3;14830:11;14823:87;14938:2;14933:3;14929:12;14922:19;;14729:218;;;;14956:364;;15116:67;15180:2;15175:3;15116:67;;;15109:74;;15216:66;15212:1;15207:3;15203:11;15196:87;15311:2;15306:3;15302:12;15295:19;;15102:218;;;;15329:465;;15489:67;15553:2;15548:3;15489:67;;;15482:74;;15589:66;15585:1;15580:3;15576:11;15569:87;15690:66;15685:2;15680:3;15676:12;15669:88;15785:2;15780:3;15776:12;15769:19;;15475:319;;;;15803:296;;15980:83;16061:1;16056:3;15980:83;;;15973:90;;16091:1;16086:3;16082:11;16075:18;;15966:133;;;;16108:364;;16268:67;16332:2;16327:3;16268:67;;;16261:74;;16368:66;16364:1;16359:3;16355:11;16348:87;16463:2;16458:3;16454:12;16447:19;;16254:218;;;;16481:465;;16641:67;16705:2;16700:3;16641:67;;;16634:74;;16741:66;16737:1;16732:3;16728:11;16721:87;16842:66;16837:2;16832:3;16828:12;16821:88;16937:2;16932:3;16928:12;16921:19;;16627:319;;;;16955:364;;17115:67;17179:2;17174:3;17115:67;;;17108:74;;17215:66;17211:1;17206:3;17202:11;17195:87;17310:2;17305:3;17301:12;17294:19;;17101:218;;;;17328:364;;17488:67;17552:2;17547:3;17488:67;;;17481:74;;17588:66;17584:1;17579:3;17575:11;17568:87;17683:2;17678:3;17674:12;17667:19;;17474:218;;;;17701:364;;17861:67;17925:2;17920:3;17861:67;;;17854:74;;17961:66;17957:1;17952:3;17948:11;17941:87;18056:2;18051:3;18047:12;18040:19;;17847:218;;;;18074:364;;18234:67;18298:2;18293:3;18234:67;;;18227:74;;18334:66;18330:1;18325:3;18321:11;18314:87;18429:2;18424:3;18420:12;18413:19;;18220:218;;;;18507:1605;;18650:5;18645:3;18641:15;18740:3;18733:5;18729:15;18723:22;18751:75;18821:3;18816;18812:13;18798:12;18751:75;;;18671:161;18910:4;18903:5;18899:16;18893:23;18922:63;18979:4;18974:3;18970:14;18956:12;18922:63;;;18842:149;19066:4;19059:5;19055:16;19049:23;19078:117;19189:4;19184:3;19180:14;19166:12;19078:117;;;19001:200;19285:4;19278:5;19274:16;19268:23;19297:63;19354:4;19349:3;19345:14;19331:12;19297:63;;;19211:155;19452:4;19445:5;19441:16;19435:23;19464:63;19521:4;19516:3;19512:14;19498:12;19464:63;;;19376:157;19614:4;19607:5;19603:16;19597:23;19626:64;19683:5;19678:3;19674:15;19660:12;19626:64;;;19543:153;19779:4;19772:5;19768:16;19762:23;19791:64;19848:5;19843:3;19839:15;19825:12;19791:64;;;19706:155;19934:4;19927:5;19923:16;19917:23;19987:3;19981:4;19977:14;19969:5;19964:3;19960:15;19953:39;20007:67;20069:4;20055:12;20007:67;;;19999:75;;19871:215;20103:4;20096:11;;18623:1489;;;;;;20182:815;20319:4;20314:3;20310:14;20402:3;20395:5;20391:15;20385:22;20413:56;20464:3;20459;20455:13;20441:12;20413:56;;;20339:136;20556:4;20549:5;20545:16;20539:23;20568:83;20645:4;20640:3;20636:14;20622:12;20568:83;;;20485:172;20729:4;20722:5;20718:16;20712:23;20741:80;20815:4;20810:3;20806:14;20792:12;20741:80;;;20667:160;20901:4;20894:5;20890:16;20884:23;20913:63;20970:4;20965:3;20961:14;20947:12;20913:63;;;20837:145;20292:705;;;;21053:457;21176:4;21171:3;21167:14;21260:3;21253:5;21249:15;21243:22;21271:62;21328:3;21323;21319:13;21305:12;21271:62;;;21196:143;21414:4;21407:5;21403:16;21397:23;21426:63;21483:4;21478:3;21474:14;21460:12;21426:63;;;21349:146;21149:361;;;;21566:467;21699:4;21694:3;21690:14;21783:3;21776:5;21772:15;21766:22;21794:62;21851:3;21846;21842:13;21828:12;21794:62;;;21719:143;21937:4;21930:5;21926:16;21920:23;21949:63;22006:4;22001:3;21997:14;21983:12;21949:63;;;21872:146;21672:361;;;;22040:103;22113:24;22131:5;22113:24;;;22108:3;22101:37;22095:48;;;22150:113;22233:24;22251:5;22233:24;;;22228:3;22221:37;22215:48;;;22270:107;22349:22;22365:5;22349:22;;;22344:3;22337:35;22331:46;;;22384:370;;22582:147;22725:3;22582:147;;;22575:154;;22746:3;22739:10;;22563:191;;;;22761:213;;22879:2;22868:9;22864:18;22856:26;;22893:71;22961:1;22950:9;22946:17;22937:6;22893:71;;;22850:124;;;;;22981:229;;23107:2;23096:9;23092:18;23084:26;;23121:79;23197:1;23186:9;23182:17;23173:6;23121:79;;;23078:132;;;;;23217:467;;23407:2;23396:9;23392:18;23384:26;;23421:79;23497:1;23486:9;23482:17;23473:6;23421:79;;;23511:80;23587:2;23576:9;23572:18;23563:6;23511:80;;;23602:72;23670:2;23659:9;23655:18;23646:6;23602:72;;;23378:306;;;;;;;23691:340;;23845:2;23834:9;23830:18;23822:26;;23859:79;23935:1;23924:9;23920:17;23911:6;23859:79;;;23949:72;24017:2;24006:9;24002:18;23993:6;23949:72;;;23816:215;;;;;;24038:324;;24184:2;24173:9;24169:18;24161:26;;24198:71;24266:1;24255:9;24251:17;24242:6;24198:71;;;24280:72;24348:2;24337:9;24333:18;24324:6;24280:72;;;24155:207;;;;;;24369:449;;24550:2;24539:9;24535:18;24527:26;;24564:71;24632:1;24621:9;24617:17;24608:6;24564:71;;;24646:72;24714:2;24703:9;24699:18;24690:6;24646:72;;;24729:79;24804:2;24793:9;24789:18;24780:6;24729:79;;;24521:297;;;;;;;24825:788;;25155:2;25144:9;25140:18;25132:26;;25205:9;25199:4;25195:20;25191:1;25180:9;25176:17;25169:47;25230:144;25369:4;25360:6;25230:144;;;25222:152;;25422:9;25416:4;25412:20;25407:2;25396:9;25392:18;25385:48;25447:156;25598:4;25589:6;25447:156;;;25439:164;;25126:487;;;;;;25620:201;;25732:2;25721:9;25717:18;25709:26;;25746:65;25808:1;25797:9;25793:17;25784:6;25746:65;;;25703:118;;;;;25828:231;;25955:2;25944:9;25940:18;25932:26;;25969:80;26046:1;26035:9;26031:17;26022:6;25969:80;;;25926:133;;;;;26066:301;;26204:2;26193:9;26189:18;26181:26;;26254:9;26248:4;26244:20;26240:1;26229:9;26225:17;26218:47;26279:78;26352:4;26343:6;26279:78;;;26271:86;;26175:192;;;;;26374:407;;26565:2;26554:9;26550:18;26542:26;;26615:9;26609:4;26605:20;26601:1;26590:9;26586:17;26579:47;26640:131;26766:4;26640:131;;;26632:139;;26536:245;;;;26788:407;;26979:2;26968:9;26964:18;26956:26;;27029:9;27023:4;27019:20;27015:1;27004:9;27000:17;26993:47;27054:131;27180:4;27054:131;;;27046:139;;26950:245;;;;27202:407;;27393:2;27382:9;27378:18;27370:26;;27443:9;27437:4;27433:20;27429:1;27418:9;27414:17;27407:47;27468:131;27594:4;27468:131;;;27460:139;;27364:245;;;;27616:407;;27807:2;27796:9;27792:18;27784:26;;27857:9;27851:4;27847:20;27843:1;27832:9;27828:17;27821:47;27882:131;28008:4;27882:131;;;27874:139;;27778:245;;;;28030:407;;28221:2;28210:9;28206:18;28198:26;;28271:9;28265:4;28261:20;28257:1;28246:9;28242:17;28235:47;28296:131;28422:4;28296:131;;;28288:139;;28192:245;;;;28444:407;;28635:2;28624:9;28620:18;28612:26;;28685:9;28679:4;28675:20;28671:1;28660:9;28656:17;28649:47;28710:131;28836:4;28710:131;;;28702:139;;28606:245;;;;28858:407;;29049:2;29038:9;29034:18;29026:26;;29099:9;29093:4;29089:20;29085:1;29074:9;29070:17;29063:47;29124:131;29250:4;29124:131;;;29116:139;;29020:245;;;;29272:407;;29463:2;29452:9;29448:18;29440:26;;29513:9;29507:4;29503:20;29499:1;29488:9;29484:17;29477:47;29538:131;29664:4;29538:131;;;29530:139;;29434:245;;;;29686:407;;29877:2;29866:9;29862:18;29854:26;;29927:9;29921:4;29917:20;29913:1;29902:9;29898:17;29891:47;29952:131;30078:4;29952:131;;;29944:139;;29848:245;;;;30100:407;;30291:2;30280:9;30276:18;30268:26;;30341:9;30335:4;30331:20;30327:1;30316:9;30312:17;30305:47;30366:131;30492:4;30366:131;;;30358:139;;30262:245;;;;30514:407;;30705:2;30694:9;30690:18;30682:26;;30755:9;30749:4;30745:20;30741:1;30730:9;30726:17;30719:47;30780:131;30906:4;30780:131;;;30772:139;;30676:245;;;;30928:407;;31119:2;31108:9;31104:18;31096:26;;31169:9;31163:4;31159:20;31155:1;31144:9;31140:17;31133:47;31194:131;31320:4;31194:131;;;31186:139;;31090:245;;;;31342:407;;31533:2;31522:9;31518:18;31510:26;;31583:9;31577:4;31573:20;31569:1;31558:9;31554:17;31547:47;31608:131;31734:4;31608:131;;;31600:139;;31504:245;;;;31756:407;;31947:2;31936:9;31932:18;31924:26;;31997:9;31991:4;31987:20;31983:1;31972:9;31968:17;31961:47;32022:131;32148:4;32022:131;;;32014:139;;31918:245;;;;32170:407;;32361:2;32350:9;32346:18;32338:26;;32411:9;32405:4;32401:20;32397:1;32386:9;32382:17;32375:47;32436:131;32562:4;32436:131;;;32428:139;;32332:245;;;;32584:407;;32775:2;32764:9;32760:18;32752:26;;32825:9;32819:4;32815:20;32811:1;32800:9;32796:17;32789:47;32850:131;32976:4;32850:131;;;32842:139;;32746:245;;;;32998:407;;33189:2;33178:9;33174:18;33166:26;;33239:9;33233:4;33229:20;33225:1;33214:9;33210:17;33203:47;33264:131;33390:4;33264:131;;;33256:139;;33160:245;;;;33412:407;;33603:2;33592:9;33588:18;33580:26;;33653:9;33647:4;33643:20;33639:1;33628:9;33624:17;33617:47;33678:131;33804:4;33678:131;;;33670:139;;33574:245;;;;33826:407;;34017:2;34006:9;34002:18;33994:26;;34067:9;34061:4;34057:20;34053:1;34042:9;34038:17;34031:47;34092:131;34218:4;34092:131;;;34084:139;;33988:245;;;;34240:404;;34426:2;34415:9;34411:18;34403:26;;34440:111;34548:1;34537:9;34533:17;34524:6;34440:111;;;34562:72;34630:2;34619:9;34615:18;34606:6;34562:72;;;34397:247;;;;;;34651:213;;34769:2;34758:9;34754:18;34746:26;;34783:71;34851:1;34840:9;34836:17;34827:6;34783:71;;;34740:124;;;;;34871:205;;34985:2;34974:9;34970:18;34962:26;;34999:67;35063:1;35052:9;35048:17;35039:6;34999:67;;;34956:120;;;;;35083:256;;35145:2;35139:9;35129:19;;35183:4;35175:6;35171:17;35282:6;35270:10;35267:22;35246:18;35234:10;35231:34;35228:62;35225:2;;;35303:1;35300;35293:12;35225:2;35323:10;35319:2;35312:22;35123:216;;;;;35346:322;;35490:18;35482:6;35479:30;35476:2;;;35522:1;35519;35512:12;35476:2;35589:4;35585:9;35578:4;35570:6;35566:17;35562:33;35554:41;;35653:4;35647;35643:15;35635:23;;35413:255;;;;35675:175;;35785:3;35777:11;;35823:4;35818:3;35814:14;35806:22;;35771:79;;;;35857:169;;35961:3;35953:11;;35999:4;35994:3;35990:14;35982:22;;35947:79;;;;36033:161;;36166:5;36160:12;36150:22;;36131:63;;;;36201:155;;36328:5;36322:12;36312:22;;36293:63;;;;36363:117;;36452:5;36446:12;36436:22;;36417:63;;;;36487:122;;36581:5;36575:12;36565:22;;36546:63;;;;36616:132;;36738:4;36733:3;36729:14;36721:22;;36715:33;;;;36755:126;;36871:4;36866:3;36862:14;36854:22;;36848:33;;;;36889:202;;37043:6;37038:3;37031:19;37080:4;37075:3;37071:14;37056:29;;37024:67;;;;;37100:196;;37248:6;37243:3;37236:19;37285:4;37280:3;37276:14;37261:29;;37229:67;;;;;37305:152;;37409:6;37404:3;37397:19;37446:4;37441:3;37437:14;37422:29;;37390:67;;;;;37466:144;;37601:3;37586:18;;37579:31;;;;;37619:163;;37734:6;37729:3;37722:19;37771:4;37766:3;37762:14;37747:29;;37715:67;;;;;37790:91;;37852:24;37870:5;37852:24;;;37841:35;;37835:46;;;;37888:85;;37961:5;37954:13;37947:21;37936:32;;37930:43;;;;37980:104;;38055:24;38073:5;38055:24;;;38044:35;;38038:46;;;;38091:136;;38168:5;38157:16;;38174:48;38216:5;38174:48;;;38151:76;;;;38234:150;;38318:5;38307:16;;38324:55;38373:5;38324:55;;;38301:83;;;;38391:144;;38472:5;38461:16;;38478:52;38524:5;38478:52;;;38455:80;;;;38542:128;;38615:5;38604:16;;38621:44;38659:5;38621:44;;;38598:72;;;;38677:84;;38749:6;38742:5;38738:18;38727:29;;38721:40;;;;38768:121;;38841:42;38834:5;38830:54;38819:65;;38813:76;;;;38896:72;;38958:5;38947:16;;38941:27;;;;38975:81;;39046:4;39039:5;39035:16;39024:27;;39018:38;;;;39063:129;;39150:37;39181:5;39150:37;;;39137:50;;39131:61;;;;39199:136;;39291:39;39324:5;39291:39;;;39278:52;;39272:63;;;;39342:150;;39441:46;39481:5;39441:46;;;39428:59;;39422:70;;;;39499:144;;39595:43;39632:5;39595:43;;;39582:56;;39576:67;;;;39650:128;;39738:35;39767:5;39738:35;;;39725:48;;39719:59;;;;39785:114;;39871:23;39888:5;39871:23;;;39858:36;;39852:47;;;;39906:121;;39985:37;40016:5;39985:37;;;39972:50;;39966:61;;;;40034:108;;40113:24;40131:5;40113:24;;;40100:37;;40094:48;;;;40150:268;40215:1;40222:101;40236:6;40233:1;40230:13;40222:101;;;40312:1;40307:3;40303:11;40297:18;40293:1;40288:3;40284:11;40277:39;40258:2;40255:1;40251:10;40246:15;;40222:101;;;40338:6;40335:1;40332:13;40329:2;;;40403:1;40394:6;40389:3;40385:16;40378:27;40329:2;40199:219;;;;;40426:97;;40514:2;40510:7;40505:2;40498:5;40494:14;40490:28;40480:38;;40474:49;;;;40531:106;40615:1;40608:5;40605:12;40595:2;;40621:9;40595:2;40589:48;;40644:113;40735:1;40728:5;40725:12;40715:2;;40741:9;40715:2;40709:48;;40764:110;40852:1;40845:5;40842:12;40832:2;;40858:9;40832:2;40826:48;;40881:102;40961:1;40954:5;40951:12;40941:2;;40967:9;40941:2;40935:48;;40990:117;41059:24;41077:5;41059:24;;;41052:5;41049:35;41039:2;;41098:1;41095;41088:12;41039:2;41033:74;;41114:111;41180:21;41195:5;41180:21;;;41173:5;41170:32;41160:2;;41216:1;41213;41206:12;41160:2;41154:71;;41232:143;41314:37;41345:5;41314:37;;;41307:5;41304:48;41294:2;;41366:1;41363;41356:12;41294:2;41288:87;;41382:117;41451:24;41469:5;41451:24;;;41444:5;41441:35;41431:2;;41490:1;41487;41480:12;41431:2;41425:74;

Swarm Source

bzzr://7dd8b1df3368abaf7ebdf430ccc99de426a596a7b2cc26d347d0f43e87d97bd8

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.