ETH Price: $2,523.94 (-0.42%)

Token

YE24 (YE24)
 

Overview

Max Total Supply

100,000,000,000 YE24

Holders

63

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
65,520,629.379658544910407589 YE24

Value
$0.00
0xe236c365EAF2155983fDEe7880119D493538F36B
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Ye24

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-08
*/

/**
 
*/

/*  YE24.io
    https://t.me/yetwentyfour
*/
pragma solidity ^0.8.10;
//SPDX-License-Identifier: none

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key) public view returns (int) {
        if(!map.inserted[key]) {
            return -1;
        }
        return int(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
        return map.keys[index];
    }



    function size(Map storage map) public view returns (uint) {
        return map.keys.length;
    }

    function set(Map storage map, address key, uint val) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

interface IDividendPayingTokenOptional {

  function withdrawableDividendOf(address _owner) external view returns(uint256);

  function withdrawnDividendOf(address _owner) external view returns(uint256);

  function accumulativeDividendOf(address _owner) external view returns(uint256);
}

interface IDividendPayingToken {

  function dividendOf(address _owner) external view returns(uint256);

  function distributeDividends() external payable;

  function withdrawDividend() external;

  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );

  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );
}

library SafeMathInt {
  function mul(int256 a, int256 b) internal pure returns (int256) {

    require(!(a == - 2**255 && b == -1) && !(b == - 2**255 && a == -1));

    int256 c = a * b;
    require((b == 0) || (c / b == a));
    return c;
  }

  function div(int256 a, int256 b) internal pure returns (int256) {

    require(!(a == - 2**255 && b == -1) && (b > 0));

    return a / b;
  }

  function sub(int256 a, int256 b) internal pure returns (int256) {
    require((b >= 0 && a - b <= a) || (b < 0 && a - b > a));

    return a - b;
  }

  function add(int256 a, int256 b) internal pure returns (int256) {
    int256 c = a + b;
    require((b >= 0 && c >= a) || (b < 0 && c < a));
    return c;
  }

  function toUint256Safe(int256 a) internal pure returns (uint256) {
    require(a >= 0);
    return uint256(a);
  }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}

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

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

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

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

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

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

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

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

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual 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 virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _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 virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

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

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

        _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 virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }

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

library SafeMath {

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

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

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

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

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

    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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

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

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

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

contract DividendPayingToken is ERC20, IDividendPayingToken, IDividendPayingTokenOptional, Ownable {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

  uint256 constant internal magnitude = 2**128;

  uint256 internal magnifiedDividendPerShare;
  uint256 internal lastAmount;

  address public DividendsToken = address(0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39);

  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;

  uint256 public totalDividendsDistributed;

  constructor(string memory _name, string memory _symbol) ERC20 (_name, _symbol) {

  }

  receive() external payable {
  }
  
  function updateDividendToken(address _DividendsToken) public onlyOwner {
      DividendsToken = _DividendsToken;
  }

  function distributeDividends() public override payable onlyOwner{
    require(totalSupply() > 0);

    if (msg.value > 0) {
      magnifiedDividendPerShare = magnifiedDividendPerShare.add(
        (msg.value).mul(magnitude) / totalSupply()
      );
      emit DividendsDistributed(msg.sender, msg.value);

      totalDividendsDistributed = totalDividendsDistributed.add(msg.value);
    }
  }

  function distributeDividends(uint256 amount) public onlyOwner {
    require(totalSupply() > 0);

    if (amount > 0) {
      magnifiedDividendPerShare = magnifiedDividendPerShare.add(
        (amount).mul(magnitude) / totalSupply()
      );
      emit DividendsDistributed(msg.sender, amount);

      totalDividendsDistributed = totalDividendsDistributed.add(amount);
    }
  }

  function withdrawDividend() public virtual override onlyOwner {
    _withdrawDividendOfUser(payable(msg.sender));
  }

  function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
    uint256 _withdrawableDividend = withdrawableDividendOf(user);
    if (_withdrawableDividend > 0) {
      withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
      emit DividendWithdrawn(user, _withdrawableDividend);
      bool success = IERC20(DividendsToken).transfer(user, _withdrawableDividend);

      if(!success) {
        withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
        return 0;
      }

      return _withdrawableDividend;
    }

    return 0;
  }

  function dividendOf(address _owner) public view override returns(uint256) {
    return withdrawableDividendOf(_owner);
  }

  function withdrawableDividendOf(address _owner) public view override returns(uint256) {
    return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
  }

  function withdrawnDividendOf(address _owner) public view override returns(uint256) {
    return withdrawnDividends[_owner];
  }

  function accumulativeDividendOf(address _owner) public view override returns(uint256) {
    return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
      .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
  }

  function _transfer(address from, address to, uint256 value) internal virtual override {
      require(false);

    int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
    magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
    magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
  }

  function _mint(address account, uint256 value) internal override {
    super._mint(account, value);

    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  function _burn(address account, uint256 value) internal override {
    super._burn(account, value);

    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  function _setBalance(address account, uint256 newBalance) internal {
    uint256 currentBalance = balanceOf(account);

    if(newBalance > currentBalance) {
      uint256 mintAmount = newBalance.sub(currentBalance);
      _mint(account, mintAmount);
    } else if(newBalance < currentBalance) {
      uint256 burnAmount = currentBalance.sub(newBalance);
      _burn(account, burnAmount);
    }
  }
}

contract Ye24 is Context, ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;

    address public DividendsToken = address(0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39);

    bool private swapping;
	bool private trading;
    bool public burning;

   YE24DividendTracker public dividendTracker;

	address private marketingWallet;
    address private liquidityWallet;
    address private devWallet;
    address private _devWallet;

    uint256 public swapTokensAtAmount;

    uint256 private _buyLiquidityFee;
    uint256 private _buyRewardsFee;
    uint256 private _buyMarketingFee;
    uint256 private _buyDevFee;

    uint256 private _sellRewardsFee;
    uint256 private _sellLiquidityFee;
	uint256 private _sellMarketingFee;
    uint256 private _sellDevFee;

    uint256 public _maxWallet;
    uint256 public _maxBuy;
    uint256 public _maxSell;
    uint256 private _previousMaxWallet;
    uint256 private _previousMaxSell;
    uint256 private _previousMaxBuy;
    uint256 private previousDevFee;

    uint256 public totalBuyFees;
    uint256 public totalSellFees;

	uint256 public contractTokenBalanceAmount;

    uint256 public gasForProcessing = 500000;
    uint256 private biggestBuyReward;
    uint256 private biggestBuyTimer;

    uint256 private constant DefaultTime = 1 days;

    mapping (address => bool) private _isExcludedFromFees;

    mapping (address => bool) public automatedMarketMakerPairs;
    mapping (address => bool) public _isBlacklisted;

    event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress);

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event UpdateDividendsToken(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event blacklist(address indexed account, bool isBlacklisted);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event Rewards(bool _enabled);
    event tradingUpdated(bool _enabled);
    event burningUpdated(bool _enabled);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet);
    event MarketingWalletUpdated(address indexed newMarketingWallet, address indexed oldMarketingWallet);

    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event SendDividends(
    	uint256 tokensSwapped,
    	uint256 amount
    );

    event ProcessedDividendTracker(
    	uint256 iterations,
    	uint256 claims,
        uint256 lastProcessedIndex,
    	bool indexed automatic,
    	uint256 gas,
    	address indexed processor
    );

    constructor() ERC20 ("YE24", "YE24") {
        _buyRewardsFee = 4;
        _buyLiquidityFee = 1;
		_buyMarketingFee = 4;
        _buyDevFee = 1;

        _sellRewardsFee = 5;
        _sellLiquidityFee = 4;
		_sellMarketingFee = 5;
        _sellDevFee = 4;

		contractTokenBalanceAmount = 250000000 * 10**18;
        
        swapTokensAtAmount = 250000000 * (10**18);
        _maxWallet = 1500000000 * (10**18);
        _maxBuy = 1500000000 * (10**18);
        _maxSell = 1500000000 * (10**18);

        totalBuyFees = _buyRewardsFee.add(_buyLiquidityFee).add(_buyMarketingFee).add(_buyDevFee);
        totalSellFees = _sellRewardsFee.add(_sellLiquidityFee).add(_sellMarketingFee).add(_sellDevFee);

    	dividendTracker = new YE24DividendTracker();

    	liquidityWallet = owner();
		
		marketingWallet = payable(0x0eB68fdcD64b387dbca2ec9B9443E2f80043aFA5);
        _devWallet = payable(0x54456737ED617e46B3c81E804ABB6b8E38E943E0);

    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    	//0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3 Testnet
    	//0x10ED43C718714eb63d5aA57B78B54704E256024E Mainnet
    	//0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D Ropsten
    	//0xCDe540d7eAFE93aC5fE6233Bee57E1270D3E330F BakerySwap
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));
        dividendTracker.excludeFromDividends(address(0x000000000000000000000000000000000000dEaD));

        // exclude from paying fees or having max transaction amount
        excludeFromFees(liquidityWallet, true);
        excludeFromFees(marketingWallet, true);
        excludeFromFees(address(this), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), 100000000000 * (10**18));
    }

    receive() external payable {

  	}

    function excludeFromDividends(address _toExclude) public onlyOwner {
          dividendTracker.excludeFromDividends(address(_toExclude));
      }

	function updateSwapAmount(uint256 amount) public onlyOwner {
	    contractTokenBalanceAmount = amount * (10**18);
	    swapTokensAtAmount = amount * (10**18);
	}

    function updateDividendTracker(address newAddress) public onlyOwner {
        require(newAddress != address(dividendTracker), "YE24: The dividend tracker already has that address");

        YE24DividendTracker newDividendTracker = YE24DividendTracker(payable(newAddress));

        require(newDividendTracker.owner() == address(this), "YE24: The new dividend tracker must be owned by the YE24 token contract");

        newDividendTracker.excludeFromDividends(address(newDividendTracker));
        newDividendTracker.excludeFromDividends(address(this));
        newDividendTracker.excludeFromDividends(address(uniswapV2Router));

        emit UpdateDividendTracker(newAddress, address(dividendTracker));

        dividendTracker = newDividendTracker;
    }

    function updateDividendToken(address newAddress) public onlyOwner {
        require(newAddress != address(DividendsToken), "YE24: The router already has that address");
        emit UpdateDividendsToken(newAddress, address(DividendsToken));
        DividendsToken = address(newAddress);
        dividendTracker.updateDividendToken(newAddress);
    }
    
    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "YE24: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(_isExcludedFromFees[account] != excluded, "YE24: Account is already the value of 'excluded'");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }
    
    function addToBlacklist(address account, bool blacklisted) public onlyOwner {
        require(_isBlacklisted[account] != blacklisted, "YE24: Account is already the value of 'blacklisted'");
        _isBlacklisted[account] = blacklisted;

        emit blacklist(account, blacklisted);
    }

    function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) public onlyOwner {
        for(uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "YE24: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "YE24: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;

        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }
    address private _liquidityTokenAddress;
    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyOwner{
        _liquidityTokenAddress=liquidityTokenAddress;
        _liquidityUnlockTime=block.timestamp+DefaultTime;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Liquidity Lock////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //the timestamp when Liquidity unlocks
     uint256 private _liquidityUnlockTime;

    //Sets Liquidity Release to 20% at a time and prolongs liquidity Lock for a Week after Release.
    //Should be called once start was successful.
    bool public liquidityRelease20Percent;
    function TeamlimitLiquidityReleaseTo20Percent() public onlyOwner{
        liquidityRelease20Percent=true;
    }

    function TeamUnlockLiquidityInSeconds(uint256 secondsUntilUnlock) public onlyOwner{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
    }
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime);
        _liquidityUnlockTime=newUnlockTime;
    }

    //Release Liquidity Tokens once unlock time is over
    function TeamReleaseLiquidity() public onlyOwner {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");

        IERC20 liquidityToken = IERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        if(liquidityRelease20Percent)
        {
            _liquidityUnlockTime=block.timestamp+DefaultTime;
            //regular liquidity release, only releases 20% at a time and locks liquidity for another week
            amount=amount*2/10;
            liquidityToken.transfer(liquidityWallet, amount);
        }
        else
        {
            //Liquidity release if something goes wrong at start
            //liquidityRelease20Percent should be called once everything is clear
            liquidityToken.transfer(liquidityWallet, amount);
        }
    }

    function updateLiquidityWallet(address newLiquidityWallet) public onlyOwner {
        require(newLiquidityWallet != liquidityWallet, "YE24: The liquidity wallet is already this address");
        excludeFromFees(newLiquidityWallet, true);
        emit LiquidityWalletUpdated(newLiquidityWallet, liquidityWallet);
        liquidityWallet = newLiquidityWallet;
    }

    function updateMarketingWallet(address newMarketingWallet) public onlyOwner {
        require(newMarketingWallet != marketingWallet, "YE24: The marketing wallet is already this address");
        excludeFromFees(newMarketingWallet, true);
        emit MarketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function getLiquidityReleaseTimeInSeconds() public view returns (uint256){
        if(block.timestamp<_liquidityUnlockTime){
            return _liquidityUnlockTime-block.timestamp;
        }
        return 0;
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200000 && newValue <= 500000, "YE24: gasForProcessing must be between 200,000 and 500,000");
        require(newValue != gasForProcessing, "YE24: Cannot update gasForProcessing to same value");
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }
    
    function updateMinimumTokenRequirement(uint256 minimumTokenBalanceForDividends) external onlyOwner {
        dividendTracker.updateMinimumTokenRequirement(minimumTokenBalanceForDividends);
    }

    function getClaimWait() external view returns(uint256) {
        return dividendTracker.claimWait();
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    function isBlacklisted(address account) public view returns (bool) {
        return _isBlacklisted[account];
    }

    function withdrawableDividendOf(address account) public view returns(uint256) {
    	return dividendTracker.withdrawableDividendOf(account);
  	}

	function dividendTokenBalanceOf(address account) public view returns (uint256) {
		return dividendTracker.balanceOf(account);
	}

    function getAccountDividendsInfo(address account)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccount(account);
    }

	function getAccountDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	return dividendTracker.getAccountAtIndex(index);
    }

	function processDividendTracker(uint256 gas) external {
		(uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
		emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
    }

    function getLastProcessedIndex() external view returns(uint256) {
    	return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }
	
	function tradingEnabled(bool _enabled) public onlyOwner {
        trading = _enabled;
        
        emit tradingUpdated(_enabled);
    }

    function updateBiggestBuy(uint256 timerInMinutes, address payable biggestBuyWallet) public onlyOwner {
        require(biggestBuyTimer != timerInMinutes, "That is already the timer");
        require(biggestBuyWallet != devWallet, "That is already the Dev Wallet");
        biggestBuyTimer = timerInMinutes.mul(60);
        biggestBuyReward = block.timestamp.add(biggestBuyTimer);
        devWallet = payable(biggestBuyWallet);
        previousDevFee = _sellDevFee;
        _sellDevFee = 1;
    }

    function burningEnabled(bool _enabled) public onlyOwner {
        burning = _enabled;
        
        emit burningUpdated(_enabled);
    }

    function checkBiggestBuyTimer() internal {
        if(block.timestamp <= biggestBuyReward)
            return;
        else if (devWallet != _devWallet) {
            devWallet = _devWallet;
            _sellDevFee = previousDevFee;
            return;
        }
        return;
    }

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

        if (from != owner() && to != owner() && to != address(0) && to != address(0xdead) && to != uniswapV2Pair && !_isExcludedFromFees[to] && !_isExcludedFromFees[from]) 
        {
            require(trading == true);

            require(amount <= _maxBuy, "Transfer amount exceeds the maxTxAmount.");

            uint256 contractBalanceRecepient = balanceOf(to);
            require(contractBalanceRecepient + amount <= _maxWallet, "Exceeds maximum wallet token amount.");
            
        }
            
        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if(!swapping && automatedMarketMakerPairs[to] && from != address(uniswapV2Router) && from != owner() && to != owner() && !_isExcludedFromFees[to] && !_isExcludedFromFees[from])
        {
            require(trading == true);

            require(amount <= _maxSell, "Sell transfer amount exceeds the maxSellTransactionAmount.");
        }

		uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
		
		if(canSwap && !swapping && !automatedMarketMakerPairs[from] && from != liquidityWallet && to != liquidityWallet && from != marketingWallet && to != marketingWallet && !_isExcludedFromFees[to] && !_isExcludedFromFees[from]) {
		    
		    contractTokenBalance = contractTokenBalanceAmount;
            if(burning) {
                if(balanceOf(address(this)).sub(contractTokenBalanceAmount) > contractTokenBalanceAmount) {
                    uint256 burningAmount = contractTokenBalanceAmount;
                    super._transfer(address(this), 0x000000000000000000000000000000000000dEaD, burningAmount);

                    emit Transfer(address(this), 0x000000000000000000000000000000000000dEaD, burningAmount);
                } else {
                    uint256 burningAmount = balanceOf(address(this)).sub(contractTokenBalanceAmount);
                    super._transfer(address(this), 0x000000000000000000000000000000000000dEaD, burningAmount);

                    emit Transfer(address(this), 0x000000000000000000000000000000000000dEaD, burningAmount);
                }
            }
		    uint256 swapTokens;
			uint256 swapAmount = _sellMarketingFee.add(_sellRewardsFee).add(_sellLiquidityFee).add(_sellDevFee);
			uint256 liquidityAmount = contractTokenBalance.mul(_sellLiquidityFee).div(swapAmount);
			uint256 half = liquidityAmount.div(2);
			uint256 otherHalf = liquidityAmount.sub(half);
            
            swapping = true;
            
            if (_sellMarketingFee > 0) {

            swapTokens = contractTokenBalance.sub(half);
            swapTokensForEth(swapTokens);
            uint256 marketingAmount = address(this).balance.mul(_sellMarketingFee).div(swapAmount);
            transferToWallet(payable(marketingWallet), marketingAmount);

            emit Transfer(address(this), marketingWallet, address(this).balance.mul(_sellMarketingFee).div(swapAmount));
            }

            if (_sellDevFee > 0) {

            checkBiggestBuyTimer();
            uint256 devAmount = address(this).balance.mul(_sellDevFee).div(swapAmount);
            transferToWallet(payable(devWallet), devAmount);

            emit Transfer(address(this), devWallet, devAmount);
            }

			if (_sellLiquidityFee > 0) {
			    
		    uint256 newBalance = address(this).balance.mul(_sellLiquidityFee).div(swapAmount);
			
            // add liquidity to uniswap
             addLiquidity(half, newBalance);

             emit SwapAndLiquify(otherHalf, newBalance, half);
            }
			
			if (_sellRewardsFee > 0) {
			
			uint256 sellTokens = contractTokenBalanceAmount.mul(_sellRewardsFee).div(swapAmount);
            swapAndSendDividends(sellTokens);
			}
			
            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        if(takeFee) {
            uint256 BuyFees = amount.mul(totalBuyFees).div(100);
            uint256 SellFees = amount.mul(totalSellFees).div(100);

            // if sell
            if(to == uniswapV2Pair) {
                amount = amount.sub(SellFees);
                super._transfer(from, address(this), SellFees);
                super._transfer(from, to, amount);

            }

            // if buy or wallet to wallet transfer
            else {
                amount = amount.sub(BuyFees);
                super._transfer(from, address(this), BuyFees);
                super._transfer(from, to, amount);
            }

        }

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            super._transfer(from, to, amount);

        }

        try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}

        if(!swapping) {
            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
            }
            catch {}
        }
    }
    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function swapETHForRewards(address recipient) private {

        // generate the uniswap pair path of weth -> Rewards
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = DividendsToken;

        _approve(address(this), address(uniswapV2Router), address(this).balance);

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: address(this).balance} (
            0,
            path,
            recipient,
            block.timestamp.add(300)
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {

        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
       uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(this),
            block.timestamp
        );
    }

    function swapAndSendDividends(uint256 tokens) private {
        swapETHForRewards(address(this));
        uint256 dividends = IERC20(DividendsToken).balanceOf(address(this));
        bool success = IERC20(DividendsToken).transfer(address(dividendTracker), dividends);

        if (success) {
            emit SendDividends(tokens, dividends);
        }
    }

    function addLP() external onlyOwner() {
        updateBuyFees(0,0,0,0);
        updateSellFees(0,0,0,0);

		trading = false;

        updateMaxWallet(100000000000);
        updateMaxBuySell((100000000000), (100000000000));
    }
    
	function letsGoLive() external onlyOwner() {
        updateBuyFees(4,5,6,1);
        updateSellFees(5,8,5,2);

        updateMaxWallet(2000000000);
        updateMaxBuySell(2000000000, 2000000000);

		trading = true;
        burning = true;
    }

    function letsGetStarted() external onlyOwner() {
        updateBuyFees(30,30,30,9);
        updateSellFees(5,8,5,2);

        updateMaxWallet(2000000000);
        updateMaxBuySell(2000000000, 2000000000);

		trading = true;
        burning = false;
    }
    
    function updateBuyFees(uint8 newBuyLiquidityFee, uint8 newBuyMarketingFee, uint8 newBuyRewardsFee, uint8 newBuyDevFee) public onlyOwner {
        _buyLiquidityFee = newBuyLiquidityFee;
        _buyMarketingFee = newBuyMarketingFee;
        _buyRewardsFee = newBuyRewardsFee;
        _buyDevFee = newBuyDevFee;
        
        totalFees();
    }

    function updateSellFees(uint8 newSellLiquidityFee, uint8 newSellMarketingFee, uint8 newSellRewardsFee, uint8 newSellDevFee) public onlyOwner {
        _sellLiquidityFee = newSellLiquidityFee;
        _sellMarketingFee = newSellMarketingFee;
        _sellRewardsFee = newSellRewardsFee;
        _sellDevFee = newSellDevFee;
        
        totalFees();
    }

    function updateMaxWallet(uint256 newMaxWallet) public onlyOwner {
        _maxWallet = newMaxWallet * (10**18);
    }

    function updateMaxBuySell(uint256 newMaxBuy, uint256 newMaxSell) public onlyOwner {
        _maxBuy = newMaxBuy * (10**18);
        _maxSell = newMaxSell * (10**18);
    }
    
    function totalFees() private {
        totalBuyFees = _buyRewardsFee.add(_buyLiquidityFee).add(_buyMarketingFee).add(_buyDevFee);
        totalSellFees = _sellRewardsFee.add(_sellLiquidityFee).add(_sellMarketingFee).add(_sellDevFee);
    }
    
    function withdrawRemainingToken(address account) public onlyOwner {
        uint256 balance = balanceOf(address(this));
        super._transfer(address(this), account, balance);
    }
    
    function withdrawRemainingBEP20Token(address bep20, address account) public onlyOwner {
        ERC20 BEP20 = ERC20(bep20);
        uint256 balance = BEP20.balanceOf(address(this));
        BEP20.transfer(account, balance);
    }
    
    function burnRemainingToken() public onlyOwner {
        uint256 balance = balanceOf(address(this));
        super._transfer(address(this), 0x000000000000000000000000000000000000dEaD, balance);
    }
	
	function transferToWallet(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }
}

contract YE24DividendTracker is Ownable, DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping (address => bool) public excludedFromDividends;
    mapping (address => bool) private isAuth;

    mapping (address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event MinimumTokenRequirementUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    constructor() DividendPayingToken("YE24_Dividend_Tracker", "YE24_Dividend_Tracker") {
    	claimWait = 1800;
        minimumTokenBalanceForDividends = 1 * (10**18);
        isAuth[owner()] = true;
    }

    function addToAuth(address newAuth) public {
        require(isAuth[msg.sender]);
        require(isAuth[newAuth] != true);

        isAuth[newAuth] = true;
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        require(isAuth[msg.sender], "You do not have perrmission to transfer");

        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function withdrawDividend() public pure override {
        require(false, "YE24_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main YE24 contract.");
    }

    function excludeFromDividends(address account) external onlyOwner {
    	require(!excludedFromDividends[account]);
    	excludedFromDividends[account] = true;

    	_setBalance(account, 0);
    	tokenHoldersMap.remove(account);

    	emit ExcludeFromDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 0 && newClaimWait <= 86400, "YE24_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "YE24_Dividend_Tracker: Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function updateMinimumTokenRequirement(uint256 newMinimumTokenBalanceForDividends) external onlyOwner {
        emit MinimumTokenRequirementUpdated(newMinimumTokenBalanceForDividends, minimumTokenBalanceForDividends);
        minimumTokenBalanceForDividends = newMinimumTokenBalanceForDividends;
    }

    function getLastProcessedIndex() external view returns(uint256) {
    	return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns(uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getAccount(address _account)
        public view returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable) {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if(index >= 0) {
            if(uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ?
                                                        tokenHoldersMap.keys.length.sub(lastProcessedIndex) :
                                                        0;


                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }


        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ?
                                    lastClaimTime.add(claimWait) :
                                    0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
                                                    nextClaimTime.sub(block.timestamp) :
                                                    0;
    }

    function getAccountAtIndex(uint256 index)
        public view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	if(index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
    	if(lastClaimTime > block.timestamp)  {
    		return false;
    	}

    	return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
    	if(excludedFromDividends[account]) {
    		return;
    	}

    	if(newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
    		tokenHoldersMap.set(account, newBalance);
    	}
    	else {
            _setBalance(account, 0);
    		tokenHoldersMap.remove(account);
    	}

    	processAccount(account, true);
    }

    function process(uint256 gas) public returns (uint256, uint256, uint256) {
    	uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        address canClaim = tokenHoldersMap.keys[lastProcessedIndex++];

        if(lastProcessedIndex++ >= tokenHoldersMap.keys.length) {
            canClaim = tokenHoldersMap.keys[0];
        }
        if(canAutoClaim(lastClaimTimes[canClaim])) {
            uint256 dividends = ERC20(DividendsToken).balanceOf(address(this));
            distributeDividends(dividends);
        }

    	if(numberOfTokenHolders == 0) {
    		return (0, 0, lastProcessedIndex);
    	}

    	uint256 _lastProcessedIndex = lastProcessedIndex;

    	uint256 gasUsed = 0;

    	uint256 gasLeft = gasleft();

    	uint256 iterations = 0;
    	uint256 claims = 0;

    	while(gasUsed < gas && iterations < numberOfTokenHolders) {
    		_lastProcessedIndex++;

    		if(_lastProcessedIndex >= tokenHoldersMap.keys.length) {
    			_lastProcessedIndex = 0;
    		}

    		address account = tokenHoldersMap.keys[_lastProcessedIndex];

    		if(canAutoClaim(lastClaimTimes[account])) {
                if(processAccount(payable(account), true)) {
                    claims++;
                }
    		}

    		iterations++;

    		uint256 newGasLeft = gasleft();

    		if(gasLeft > newGasLeft) {
    			gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
    		}

    		gasLeft = newGasLeft;
    	}

    	lastProcessedIndex = _lastProcessedIndex;

    	return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);

    	if(amount > 0) {
    		lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
    		return true;
    	}

    	return false;
    }
      
    function withdrawRemainingBEP20Token(address token, address account) public {
        require(isAuth[msg.sender]);
        IERC20(token).transfer(address(account), IERC20(token).balanceOf(address(this)));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"}],"name":"MarketingWalletUpdated","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":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"Rewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendsToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"blacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"burningUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"tradingUpdated","type":"event"},{"inputs":[],"name":"DividendsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamReleaseLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamUnlockLiquidityInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamlimitLiquidityReleaseTo20Percent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"addToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRemainingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burning","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"burningEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractTokenBalanceAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract YE24DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toExclude","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"letsGetStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"letsGoLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityRelease20Percent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"tradingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timerInMinutes","type":"uint256"},{"internalType":"address payable","name":"biggestBuyWallet","type":"address"}],"name":"updateBiggestBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newBuyLiquidityFee","type":"uint8"},{"internalType":"uint8","name":"newBuyMarketingFee","type":"uint8"},{"internalType":"uint8","name":"newBuyRewardsFee","type":"uint8"},{"internalType":"uint8","name":"newBuyDevFee","type":"uint8"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"},{"internalType":"uint256","name":"newMaxSell","type":"uint256"}],"name":"updateMaxBuySell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWallet","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minimumTokenBalanceForDividends","type":"uint256"}],"name":"updateMinimumTokenRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newSellLiquidityFee","type":"uint8"},{"internalType":"uint8","name":"newSellMarketingFee","type":"uint8"},{"internalType":"uint8","name":"newSellRewardsFee","type":"uint8"},{"internalType":"uint8","name":"newSellDevFee","type":"uint8"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateSwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bep20","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"withdrawRemainingBEP20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawRemainingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052600780546001600160a01b031916732b591e99afe9f32eaa6214f7b7629768c40eeb391790556207a1206020553480156200003e57600080fd5b5060408051808201825260048082526316514c8d60e21b6020808401828152855180870190965292855284015281519192916200007e9160039162000a1c565b5080516200009490600490602084019062000a1c565b50506005805460ff19166012179055506000620000ae3390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506004600f8190556001600e8190556010829055601181905560056012819055601383905560145560158290556acecb8f27f4200f3a000000601f819055600d556b04d8c55aefb8c05b5c0000006016819055601781905560185562000191916200017d9081818462000604602090811b62002bd217901c565b6200060460201b62002bd21790919060201c565b601d81905550620001c36015546200017d6014546200017d6013546012546200060460201b62002bd21790919060201c565b601e55604051620001d49062000aab565b604051809103906000f080158015620001f1573d6000803e3d6000fd5b50600880546001600160a01b0319166001600160a01b03928316179055600554610100900416600a80546001600160a01b03929092166001600160a01b0319928316179055600980548216730eb68fdcd64b387dbca2ec9b9443e2f80043afa5179055600c80549091167354456737ed617e46b3c81e804abb6b8e38e943e01790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a01559160048083019260209291908290030181865afa158015620002c9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ef919062000ad0565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200033d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000363919062000ad0565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620003b1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003d7919062000ad0565b600680546001600160a01b0319166001600160a01b0385811691909117909155811660805290506200040b81600162000672565b60085460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200045257600080fd5b505af115801562000467573d6000803e3d6000fd5b505060085460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620004b157600080fd5b505af1158015620004c6573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200051257600080fd5b505af115801562000527573d6000803e3d6000fd5b505060085460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200057357600080fd5b505af115801562000588573d6000803e3d6000fd5b5050600a54620005a692506001600160a01b031690506001620007d5565b600954620005bf906001600160a01b03166001620007d5565b620005cc306001620007d5565b620005fc620005e860055461010090046001600160a01b031690565b6c01431e0fae6d7217caa000000062000920565b505062000b5f565b60008062000613838562000afb565b9050838110156200066b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6001600160a01b03821660009081526024602052604090205460ff1615158115151415620007095760405162461bcd60e51b815260206004820152603e60248201527f594532343a204175746f6d61746564206d61726b6574206d616b65722070616960448201527f7220697320616c72656164792073657420746f20746861742076616c75650000606482015260840162000662565b6001600160a01b0382166000908152602460205260409020805460ff19168215801591909117909155620007995760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200077f57600080fd5b505af115801562000794573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03610100909104163314620008375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000662565b6001600160a01b03821660009081526023602052604090205460ff1615158115151415620008c15760405162461bcd60e51b815260206004820152603060248201527f594532343a204163636f756e7420697320616c7265616479207468652076616c60448201526f7565206f6620276578636c756465642760801b606482015260840162000662565b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620009785760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000662565b62000994816002546200060460201b62002bd21790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620009c791839062002bd262000604821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b82805462000a2a9062000b22565b90600052602060002090601f01602090048101928262000a4e576000855562000a99565b82601f1062000a6957805160ff191683800117855562000a99565b8280016001018555821562000a99579182015b8281111562000a9957825182559160200191906001019062000a7c565b5062000aa792915062000ab9565b5090565b61287980620054f483390190565b5b8082111562000aa7576000815560010162000aba565b60006020828403121562000ae357600080fd5b81516001600160a01b03811681146200066b57600080fd5b6000821982111562000b1d57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c9082168062000b3757607f821691505b6020821081141562000b5957634e487b7160e01b600052602260045260246000fd5b50919050565b60805161496462000b90600039600081816106fc01528181611f7901528181612e5e01526135fb01526149646000f3fe60806040526004361061042a5760003560e01c806388bdd9be11610229578063b9e937001161012e578063e1ccbba6116100b6578063f27fd2541161007a578063f27fd25414610cc7578063f298f42c14610ce7578063f2fde38b14610d07578063f657099014610d27578063fe575a8714610d4757600080fd5b8063e1ccbba614610c3c578063e2f4560514610c5c578063e37ba8f914610c72578063e7841ec014610c92578063e98030c714610ca757600080fd5b8063c3a3c032116100fd578063c3a3c03214610b96578063c492f04614610bab578063d0a3981414610bcb578063d63607d814610be1578063dd62ed3e14610bf657600080fd5b8063b9e9370014610b2b578063bc37e1a314610b41578063c024666814610b56578063c23be47f14610b7657600080fd5b8063a457c2d7116101b1578063aacebbe311610180578063aacebbe314610a40578063ab3b554514610a60578063ad56c13c14610a80578063b1ff3b5c14610ae5578063b62496f514610afb57600080fd5b8063a457c2d7146109ca578063a8b9d240146109ea578063a9059cbb14610a0a578063a9dec43614610a2a57600080fd5b80639693ec09116101f85780639693ec091461094a57806396c74c641461096a5780639a7a23d61461097f5780639c1b8af51461099f578063a26579ad146109b557600080fd5b806388bdd9be146108d25780638da5cb5b146108f257806395b0a1e01461091557806395d89b411461093557600080fd5b80633320f5851161032f57806364b0f653116102b7578063700bb19111610286578063700bb1911461084757806370a0823114610867578063715018a61461088757806382247ec01461089c578063871c128d146108b257600080fd5b806364b0f653146107d257806365b8dbc0146107e75780636843cd84146108075780636ec0227a1461082757600080fd5b806349bdf873116102fe57806349bdf8731461071e5780634c12b33f146107385780634cdaf0ae146107595780634fbee19314610779578063553ad0dc146107b257600080fd5b80633320f5851461069557806339509351146106b55780633c7a309b146106d557806349bd5a5e146106ea57600080fd5b806323b872dd116103b25780632c889d18116103815780632c889d18146105fe5780632de3f9561461061e57806330bb4cff1461063e578063313ce5671461065357806331e79db01461067557600080fd5b806323b872dd14610589578063270924c7146105a9578063296d3de0146105be5780632c1f5216146105de57600080fd5b8063095ea7b3116103f9578063095ea7b3146104bc5780631694505e146104ec57806318160ddd146105245780631c499ab0146105395780631cdd3be31461055957600080fd5b8063021954661461043657806306fdde031461044d5780630773d31d146104785780630920dacb1461049c57600080fd5b3661043157005b600080fd5b34801561044257600080fd5b5061044b610d80565b005b34801561045957600080fd5b50610462610e09565b60405161046f91906141d4565b60405180910390f35b34801561048457600080fd5b5061048e60185481565b60405190815260200161046f565b3480156104a857600080fd5b5061044b6104b736600461423e565b610e9b565b3480156104c857600080fd5b506104dc6104d7366004614277565b610fb6565b604051901515815260200161046f565b3480156104f857600080fd5b5060065461050c906001600160a01b031681565b6040516001600160a01b03909116815260200161046f565b34801561053057600080fd5b5060025461048e565b34801561054557600080fd5b5061044b6105543660046142a3565b610fcd565b34801561056557600080fd5b506104dc6105743660046142bc565b60256020526000908152604090205460ff1681565b34801561059557600080fd5b506104dc6105a43660046142d9565b611015565b3480156105b557600080fd5b5061044b61107e565b3480156105ca57600080fd5b5061044b6105d936600461431a565b611100565b3480156105ea57600080fd5b5060085461050c906001600160a01b031681565b34801561060a57600080fd5b5061044b6106193660046142a3565b61115e565b34801561062a57600080fd5b5061044b61063936600461434a565b6111a3565b34801561064a57600080fd5b5061048e61122b565b34801561065f57600080fd5b5060055460405160ff909116815260200161046f565b34801561068157600080fd5b5061044b6106903660046142bc565b61129e565b3480156106a157600080fd5b5061044b6106b036600461437d565b61132a565b3480156106c157600080fd5b506104dc6106d0366004614277565b611381565b3480156106e157600080fd5b5061044b6113b7565b3480156106f657600080fd5b5061050c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561072a57600080fd5b506028546104dc9060ff1681565b34801561074457600080fd5b506007546104dc90600160b01b900460ff1681565b34801561076557600080fd5b5061044b6107743660046142bc565b61158e565b34801561078557600080fd5b506104dc6107943660046142bc565b6001600160a01b031660009081526023602052604090205460ff1690565b3480156107be57600080fd5b5061044b6107cd36600461434a565b6115ec565b3480156107de57600080fd5b5061048e611669565b3480156107f357600080fd5b5061044b6108023660046142bc565b6116b3565b34801561081357600080fd5b5061048e6108223660046142bc565b61176e565b34801561083357600080fd5b5061044b61084236600461437d565b6117de565b34801561085357600080fd5b5061044b6108623660046142a3565b61182f565b34801561087357600080fd5b5061048e6108823660046142bc565b611901565b34801561089357600080fd5b5061044b61191c565b3480156108a857600080fd5b5061048e60165481565b3480156108be57600080fd5b5061044b6108cd3660046142a3565b61199c565b3480156108de57600080fd5b5061044b6108ed3660046142bc565b611af4565b3480156108fe57600080fd5b5060055461010090046001600160a01b031661050c565b34801561092157600080fd5b5061044b6109303660046142bc565b611e0c565b34801561094157600080fd5b50610462611eee565b34801561095657600080fd5b5060075461050c906001600160a01b031681565b34801561097657600080fd5b5061044b611efd565b34801561098b57600080fd5b5061044b61099a3660046143d1565b611f47565b3480156109ab57600080fd5b5061048e60205481565b3480156109c157600080fd5b5061048e61203d565b3480156109d657600080fd5b506104dc6109e5366004614277565b612087565b3480156109f657600080fd5b5061048e610a053660046142bc565b6120d6565b348015610a1657600080fd5b506104dc610a25366004614277565b612109565b348015610a3657600080fd5b5061048e60175481565b348015610a4c57600080fd5b5061044b610a5b3660046142bc565b612116565b348015610a6c57600080fd5b5061044b610a7b3660046142a3565b612227565b348015610a8c57600080fd5b50610aa0610a9b3660046142bc565b612284565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161046f565b348015610af157600080fd5b5061048e601f5481565b348015610b0757600080fd5b506104dc610b163660046142bc565b60246020526000908152604090205460ff1681565b348015610b3757600080fd5b5061048e601d5481565b348015610b4d57600080fd5b5061044b61231f565b348015610b6257600080fd5b5061044b610b713660046143d1565b612397565b348015610b8257600080fd5b5061044b610b913660046142bc565b6124af565b348015610ba257600080fd5b5061048e6124f7565b348015610bb757600080fd5b5061044b610bc63660046143ff565b612517565b348015610bd757600080fd5b5061048e601e5481565b348015610bed57600080fd5b5061044b6125f9565b348015610c0257600080fd5b5061048e610c1136600461423e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610c4857600080fd5b5061044b610c573660046142a3565b612638565b348015610c6857600080fd5b5061048e600d5481565b348015610c7e57600080fd5b5061044b610c8d3660046142bc565b612699565b348015610c9e57600080fd5b5061048e6127aa565b348015610cb357600080fd5b5061044b610cc23660046142a3565b6127f4565b348015610cd357600080fd5b50610aa0610ce23660046142a3565b612855565b348015610cf357600080fd5b5061044b610d023660046143d1565b612897565b348015610d1357600080fd5b5061044b610d223660046142bc565b6129aa565b348015610d3357600080fd5b5061044b610d42366004614485565b612aa6565b348015610d5357600080fd5b506104dc610d623660046142bc565b6001600160a01b031660009081526025602052604090205460ff1690565b6005546001600160a01b03610100909104163314610db95760405162461bcd60e51b8152600401610db0906144aa565b60405180910390fd5b610dc8601e80601e60096117de565b610dd8600560086005600261132a565b610de56377359400610fcd565b610df3637735940080611100565b6007805461ffff60a81b1916600160a81b179055565b606060038054610e18906144df565b80601f0160208091040260200160405190810160405280929190818152602001828054610e44906144df565b8015610e915780601f10610e6657610100808354040283529160200191610e91565b820191906000526020600020905b815481529060010190602001808311610e7457829003601f168201915b5050505050905090565b6005546001600160a01b03610100909104163314610ecb5760405162461bcd60e51b8152600401610db0906144aa565b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f38919061451a565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509083169063a9059cbb906044016020604051808303816000875af1158015610f8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610faf9190614533565b5050505050565b6000610fc3338484612c38565b5060015b92915050565b6005546001600160a01b03610100909104163314610ffd5760405162461bcd60e51b8152600401610db0906144aa565b61100f81670de0b6b3a7640000614566565b60165550565b6000611022848484612d5d565b611074843361106f856040518060600160405280602881526020016148c2602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613896565b612c38565b5060019392505050565b6005546001600160a01b036101009091041633146110ae5760405162461bcd60e51b8152600401610db0906144aa565b6110be60046005600660016117de565b6110ce600560086005600261132a565b6110db6377359400610fcd565b6110e9637735940080611100565b6007805461ffff60a81b191661010160a81b179055565b6005546001600160a01b036101009091041633146111305760405162461bcd60e51b8152600401610db0906144aa565b61114282670de0b6b3a7640000614566565b60175561115781670de0b6b3a7640000614566565b6018555050565b6005546001600160a01b0361010090910416331461118e5760405162461bcd60e51b8152600401610db0906144aa565b6111a061119b4283614585565b6138cd565b50565b6005546001600160a01b036101009091041633146111d35760405162461bcd60e51b8152600401610db0906144aa565b60078054821515600160a81b0260ff60a81b199091161790556040517fd92566aec3731c43bc7ec6a90c119de538d83f226f301b29d5139a4b670abfb29061122090831515815260200190565b60405180910390a150565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611275573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611299919061451a565b905090565b6005546001600160a01b036101009091041633146112ce5760405162461bcd60e51b8152600401610db0906144aa565b60085460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b15801561131657600080fd5b505af1158015610faf573d6000803e3d6000fd5b6005546001600160a01b0361010090910416331461135a5760405162461bcd60e51b8152600401610db0906144aa565b60ff808516601355838116601455828116601255811660155561137b6138e0565b50505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610fc391859061106f9086612bd2565b6005546001600160a01b036101009091041633146113e75760405162461bcd60e51b8152600401610db0906144aa565b60275442101561142c5760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610db0565b6026546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149d919061451a565b60285490915060ff1615611551576114b86201518042614585565b602755600a6114c8826002614566565b6114d2919061459d565b600a5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044015b6020604051808303816000875af1158015611528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154c9190614533565b505050565b600a5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb90604401611509565b5050565b6005546001600160a01b036101009091041633146115be5760405162461bcd60e51b8152600401610db0906144aa565b602680546001600160a01b0319166001600160a01b0383161790556115e66201518042614585565b60275550565b6005546001600160a01b0361010090910416331461161c5760405162461bcd60e51b8152600401610db0906144aa565b60078054821515600160b01b0260ff60b01b199091161790556040517f6225104598bca03a23e6426058f298b0ff0510d263e9c7c61317dbbf41da0eb09061122090831515815260200190565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611275573d6000803e3d6000fd5b6005546001600160a01b036101009091041633146116e35760405162461bcd60e51b8152600401610db0906144aa565b6006546001600160a01b03828116911614156117115760405162461bcd60e51b8152600401610db0906145bf565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa1580156117ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc7919061451a565b6005546001600160a01b0361010090910416331461180e5760405162461bcd60e51b8152600401610db0906144aa565b60ff808516600e55838116601055828116600f55811660115561137b6138e0565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a69190614608565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0361010090910416331461194c5760405162461bcd60e51b8152600401610db0906144aa565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b036101009091041633146119cc5760405162461bcd60e51b8152600401610db0906144aa565b62030d4081101580156119e257506207a1208111155b611a545760405162461bcd60e51b815260206004820152603a60248201527f594532343a20676173466f7250726f63657373696e67206d757374206265206260448201527f65747765656e203230302c30303020616e64203530302c3030300000000000006064820152608401610db0565b602054811415611ac15760405162461bcd60e51b815260206004820152603260248201527f594532343a2043616e6e6f742075706461746520676173466f7250726f63657360448201527173696e6720746f2073616d652076616c756560701b6064820152608401610db0565b60205460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3602055565b6005546001600160a01b03610100909104163314611b245760405162461bcd60e51b8152600401610db0906144aa565b6008546001600160a01b0382811691161415611b9e5760405162461bcd60e51b815260206004820152603360248201527f594532343a20546865206469766964656e6420747261636b657220616c7265616044820152726479206861732074686174206164647265737360681b6064820152608401610db0565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0f9190614636565b6001600160a01b031614611c9b5760405162461bcd60e51b815260206004820152604760248201527f594532343a20546865206e6577206469766964656e6420747261636b6572206d60448201527f757374206265206f776e656420627920746865205945323420746f6b656e20636064820152661bdb9d1c9858dd60ca1b608482015260a401610db0565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611cdd57600080fd5b505af1158015611cf1573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611d3657600080fd5b505af1158015611d4a573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611d9557600080fd5b505af1158015611da9573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b03610100909104163314611e3c5760405162461bcd60e51b8152600401610db0906144aa565b6007546001600160a01b0382811691161415611e6a5760405162461bcd60e51b8152600401610db0906145bf565b6007546040516001600160a01b03918216918316907f523400a476dc1f49f3cc8e7dc4ea8fbd97c0b7c17be259fbc3a8ff8f67a71fd290600090a3600780546001600160a01b0319166001600160a01b038381169182179092556008546040516304ad850f60e51b81526004810192909252909116906395b0a1e0906024016112fc565b606060048054610e18906144df565b6005546001600160a01b03610100909104163314611f2d5760405162461bcd60e51b8152600401610db0906144aa565b6000611f3830611901565b90506111a03061dead83613931565b6005546001600160a01b03610100909104163314611f775760405162461bcd60e51b8152600401610db0906144aa565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156120335760405162461bcd60e51b815260206004820152604b60248201527f594532343a205468652050616e63616b655377617020706169722063616e6e6f60448201527f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b6560648201526a744d616b6572506169727360a81b608482015260a401610db0565b61158a8282613a28565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611275573d6000803e3d6000fd5b6000610fc3338461106f8560405180606001604052806025815260200161490a602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613896565b6008546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161179d565b6000610fc3338484612d5d565b6005546001600160a01b036101009091041633146121465760405162461bcd60e51b8152600401610db0906144aa565b6009546001600160a01b03828116911614156121bf5760405162461bcd60e51b815260206004820152603260248201527f594532343a20546865206d61726b6574696e672077616c6c657420697320616c60448201527172656164792074686973206164647265737360701b6064820152608401610db0565b6121ca816001612397565b6009546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146122575760405162461bcd60e51b8152600401610db0906144aa565b61226981670de0b6b3a7640000614566565b601f5561227e81670de0b6b3a7640000614566565b600d5550565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa1580156122e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123049190614653565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b0361010090910416331461234f5760405162461bcd60e51b8152600401610db0906144aa565b61235d6000806000806117de565b61236b60008060008061132a565b6007805460ff60a81b1916905561238664174876e800610fcd565b61239564174876e80080611100565b565b6005546001600160a01b036101009091041633146123c75760405162461bcd60e51b8152600401610db0906144aa565b6001600160a01b03821660009081526023602052604090205460ff161515811515141561244f5760405162461bcd60e51b815260206004820152603060248201527f594532343a204163636f756e7420697320616c7265616479207468652076616c60448201526f7565206f6620276578636c756465642760801b6064820152608401610db0565b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b6005546001600160a01b036101009091041633146124df5760405162461bcd60e51b8152600401610db0906144aa565b60006124ea30611901565b905061158a308383613931565b6000602754421015612511574260275461129991906146bd565b50600090565b6005546001600160a01b036101009091041633146125475760405162461bcd60e51b8152600401610db0906144aa565b60005b828110156125b8578160236000868685818110612569576125696146d4565b905060200201602081019061257e91906142bc565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806125b0816146ea565b91505061254a565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516125ec93929190614705565b60405180910390a1505050565b6005546001600160a01b036101009091041633146126295760405162461bcd60e51b8152600401610db0906144aa565b6028805460ff19166001179055565b6005546001600160a01b036101009091041633146126685760405162461bcd60e51b8152600401610db0906144aa565b6008546040516370e65dd360e11b8152600481018390526001600160a01b039091169063e1ccbba6906024016112fc565b6005546001600160a01b036101009091041633146126c95760405162461bcd60e51b8152600401610db0906144aa565b600a546001600160a01b03828116911614156127425760405162461bcd60e51b815260206004820152603260248201527f594532343a20546865206c69717569646974792077616c6c657420697320616c60448201527172656164792074686973206164647265737360701b6064820152608401610db0565b61274d816001612397565b600a546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611275573d6000803e3d6000fd5b6005546001600160a01b036101009091041633146128245760405162461bcd60e51b8152600401610db0906144aa565b60085460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c7906024016112fc565b600854604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016122c2565b6005546001600160a01b036101009091041633146128c75760405162461bcd60e51b8152600401610db0906144aa565b6001600160a01b03821660009081526025602052604090205460ff16151581151514156129525760405162461bcd60e51b815260206004820152603360248201527f594532343a204163636f756e7420697320616c7265616479207468652076616c6044820152727565206f662027626c61636b6c69737465642760681b6064820152608401610db0565b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f404e512903f1ca111aaa7db3f548b1969d86eda85df18088582f13feba1e412c91016124a3565b6005546001600160a01b036101009091041633146129da5760405162461bcd60e51b8152600401610db0906144aa565b6001600160a01b038116612a3f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610db0565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b03610100909104163314612ad65760405162461bcd60e51b8152600401610db0906144aa565b816022541415612b285760405162461bcd60e51b815260206004820152601960248201527f5468617420697320616c7265616479207468652074696d6572000000000000006044820152606401610db0565b600b546001600160a01b0382811691161415612b865760405162461bcd60e51b815260206004820152601e60248201527f5468617420697320616c726561647920746865204465762057616c6c657400006044820152606401610db0565b612b9182603c613b86565b6022819055612ba1904290612bd2565b602155600b80546001600160a01b0319166001600160a01b03929092169190911790555060158054601c5560019055565b600080612bdf8385614585565b905083811015612c315760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610db0565b9392505050565b6001600160a01b038316612c9a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610db0565b6001600160a01b038216612cfb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610db0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612d835760405162461bcd60e51b8152600401610db09061475e565b6001600160a01b038216612da95760405162461bcd60e51b8152600401610db0906147a3565b6001600160a01b03831660009081526025602052604090205460ff16158015612deb57506001600160a01b03821660009081526025602052604090205460ff16155b612df457600080fd5b6005546001600160a01b038481166101009092041614801590612e2a57506005546001600160a01b038381166101009092041614155b8015612e3e57506001600160a01b03821615155b8015612e5557506001600160a01b03821661dead14155b8015612e9357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b8015612eb857506001600160a01b03821660009081526023602052604090205460ff16155b8015612edd57506001600160a01b03831660009081526023602052604090205460ff16155b15612fd757600754600160a81b900460ff161515600114612efd57600080fd5b601754811115612f605760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610db0565b6000612f6b83611901565b601654909150612f7b8383614585565b1115612fd55760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610db0565b505b80612fe85761154c83836000613931565b600754600160a01b900460ff1615801561301a57506001600160a01b03821660009081526024602052604090205460ff165b801561303457506006546001600160a01b03848116911614155b801561305357506005546001600160a01b038481166101009092041614155b801561307257506005546001600160a01b038381166101009092041614155b801561309757506001600160a01b03821660009081526023602052604090205460ff16155b80156130bc57506001600160a01b03831660009081526023602052604090205460ff16155b1561315457600754600160a81b900460ff1615156001146130dc57600080fd5b6018548111156131545760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610db0565b600061315f30611901565b600d54909150811080159081906131805750600754600160a01b900460ff16155b80156131a557506001600160a01b03851660009081526024602052604090205460ff16155b80156131bf5750600a546001600160a01b03868116911614155b80156131d95750600a546001600160a01b03858116911614155b80156131f357506009546001600160a01b03868116911614155b801561320d57506009546001600160a01b03858116911614155b801561323257506001600160a01b03841660009081526023602052604090205460ff16155b801561325757506001600160a01b03851660009081526023602052604090205460ff16155b1561356057601f54600754909250600160b01b900460ff161561331657601f5461328a8161328430611901565b90613c05565b11156132cd57601f546132a03061dead83613931565b60405181815261dead9030906000805160206148ea8339815191529060200160405180910390a350613316565b60006132de601f5461328430611901565b90506132ed3061dead83613931565b60405181815261dead9030906000805160206148ea8339815191529060200160405180910390a3505b60008061334260155461333c60135461333c601254601454612bd290919063ffffffff16565b90612bd2565b905060006133658261335f60135488613b8690919063ffffffff16565b90613c61565b90506000613374826002613c61565b905060006133828383613c05565b6007805460ff60a01b1916600160a01b17905560145490915015613431576133aa8783613c05565b94506133b585613cbc565b60006133d08561335f60145447613b8690919063ffffffff16565b6009549091506133e9906001600160a01b031682613e0e565b6009546014546001600160a01b039091169030906000805160206148ea8339815191529061341e90899061335f904790613b86565b60405190815260200160405180910390a3505b601554156134a957613441613e44565b600061345c8561335f60155447613b8690919063ffffffff16565b600b54909150613475906001600160a01b031682613e0e565b600b546040518281526001600160a01b039091169030906000805160206148ea8339815191529060200160405180910390a3505b6013541561351b5760006134cc8561335f60135447613b8690919063ffffffff16565b90506134d88382613e91565b60408051838152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505b6012541561354d5760006135408561335f601254601f54613b8690919063ffffffff16565b905061354b81613f3b565b505b50506007805460ff60a01b191690555050505b6007546001600160a01b03861660009081526023602052604090205460ff600160a01b9092048216159116806135ae57506001600160a01b03851660009081526023602052604090205460ff165b156135b7575060005b801561367f5760006135d9606461335f601d5488613b8690919063ffffffff16565b905060006135f7606461335f601e5489613b8690919063ffffffff16565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316141561365a5761363d8682613c05565b955061364a883083613931565b613655888888613931565b61367c565b6136648683613c05565b9550613671883084613931565b61367c888888613931565b50505b6001600160a01b03861660009081526023602052604090205460ff16806136be57506001600160a01b03851660009081526023602052604090205460ff165b156136ce576136ce868686613931565b6008546001600160a01b031663e30443bc876136e981611901565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561372f57600080fd5b505af1925050508015613740575060015b506008546001600160a01b031663e30443bc8661375c81611901565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156137a257600080fd5b505af19250505080156137b3575060015b50600754600160a01b900460ff1661388e576020546008546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613832575060408051601f3d908101601f1916820190925261382f91810190614608565b60015b61383b5761388c565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050565b600081848411156138ba5760405162461bcd60e51b8152600401610db091906141d4565b506138c583856146bd565b949350505050565b60275481116138db57600080fd5b602755565b61390360115461333c60105461333c600e54600f54612bd290919063ffffffff16565b601d8190555061392c60155461333c60145461333c601354601254612bd290919063ffffffff16565b601e55565b6001600160a01b0383166139575760405162461bcd60e51b8152600401610db09061475e565b6001600160a01b03821661397d5760405162461bcd60e51b8152600401610db0906147a3565b6139ba8160405180606001604052806026815260200161489c602691396001600160a01b0386166000908152602081905260409020549190613896565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546139e99082612bd2565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616916000805160206148ea8339815191529101612d50565b6001600160a01b03821660009081526024602052604090205460ff1615158115151415613abd5760405162461bcd60e51b815260206004820152603e60248201527f594532343a204175746f6d61746564206d61726b6574206d616b65722070616960448201527f7220697320616c72656164792073657420746f20746861742076616c756500006064820152608401610db0565b6001600160a01b0382166000908152602460205260409020805460ff19168215801591909117909155613b4a5760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613b3157600080fd5b505af1158015613b45573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600082613b9557506000610fc7565b6000613ba18385614566565b905082613bae858361459d565b14612c315760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610db0565b600082821115613c575760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610db0565b612c3182846146bd565b6000808211613cb25760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610db0565b612c31828461459d565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613cf157613cf16146d4565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d6e9190614636565b81600181518110613d8157613d816146d4565b6001600160a01b039283166020918202929092010152600654613da79130911684612c38565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613de090859060009086903090429060040161482a565b600060405180830381600087803b158015613dfa57600080fd5b505af115801561388e573d6000803e3d6000fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561154c573d6000803e3d6000fd5b6021544211613e4f57565b600c54600b546001600160a01b0390811691161461239557600c54600b80546001600160a01b0319166001600160a01b03909216919091179055601c54601555565b600654613ea99030906001600160a01b031684612c38565b60065460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613f16573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610faf9190614608565b613f443061406e565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb1919061451a565b60075460085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905292935060009291169063a9059cbb906044016020604051808303816000875af115801561400c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140309190614533565b9050801561154c5760408051848152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc391016125ec565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156140d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140fc9190614636565b8160008151811061410f5761410f6146d4565b6001600160a01b039283166020918202929092010152600754825191169082906001908110614140576141406146d4565b6001600160a01b0392831660209182029290920101526006546141669130911647612c38565b6006546001600160a01b031663b6f9de9547600084866141884261012c612bd2565b6040518663ffffffff1660e01b81526004016141a79493929190614866565b6000604051808303818588803b1580156141c057600080fd5b505af115801561388c573d6000803e3d6000fd5b600060208083528351808285015260005b81811015614201578581018301518582016040015282016141e5565b81811115614213576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146111a057600080fd5b6000806040838503121561425157600080fd5b823561425c81614229565b9150602083013561426c81614229565b809150509250929050565b6000806040838503121561428a57600080fd5b823561429581614229565b946020939093013593505050565b6000602082840312156142b557600080fd5b5035919050565b6000602082840312156142ce57600080fd5b8135612c3181614229565b6000806000606084860312156142ee57600080fd5b83356142f981614229565b9250602084013561430981614229565b929592945050506040919091013590565b6000806040838503121561432d57600080fd5b50508035926020909101359150565b80151581146111a057600080fd5b60006020828403121561435c57600080fd5b8135612c318161433c565b803560ff8116811461437857600080fd5b919050565b6000806000806080858703121561439357600080fd5b61439c85614367565b93506143aa60208601614367565b92506143b860408601614367565b91506143c660608601614367565b905092959194509250565b600080604083850312156143e457600080fd5b82356143ef81614229565b9150602083013561426c8161433c565b60008060006040848603121561441457600080fd5b833567ffffffffffffffff8082111561442c57600080fd5b818601915086601f83011261444057600080fd5b81358181111561444f57600080fd5b8760208260051b850101111561446457600080fd5b6020928301955093505084013561447a8161433c565b809150509250925092565b6000806040838503121561449857600080fd5b82359150602083013561426c81614229565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806144f357607f821691505b6020821081141561451457634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561452c57600080fd5b5051919050565b60006020828403121561454557600080fd5b8151612c318161433c565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561458057614580614550565b500290565b6000821982111561459857614598614550565b500190565b6000826145ba57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526029908201527f594532343a2054686520726f7574657220616c7265616479206861732074686160408201526874206164647265737360b81b606082015260800190565b60008060006060848603121561461d57600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561464857600080fd5b8151612c3181614229565b600080600080600080600080610100898b03121561467057600080fd5b885161467b81614229565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b6000828210156146cf576146cf614550565b500390565b634e487b7160e01b600052603260045260246000fd5b60006000198214156146fe576146fe614550565b5060010190565b6040808252810183905260008460608301825b8681101561474857823561472b81614229565b6001600160a01b0316825260209283019290910190600101614718565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600081518084526020808501945080840160005b8381101561481f5781516001600160a01b0316875295820195908201906001016147fa565b509495945050505050565b85815284602082015260a06040820152600061484960a08301866147e6565b6001600160a01b0394909416606083015250608001529392505050565b84815260806020820152600061487f60808301866147e6565b6001600160a01b0394909416604083015250606001529291505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205f4593e81b9705576bd2a12afe7005c3fafdfa1ea5a7ddef531e3a0717a2073764736f6c634300080a00336080604052600880546001600160a01b031916732b591e99afe9f32eaa6214f7b7629768c40eeb391790553480156200003757600080fd5b5060408051808201825260158082527f594532345f4469766964656e645f547261636b657200000000000000000000006020808401828152855180870190965292855284015281519192918391839162000094916003916200017a565b508051620000aa9060049060208401906200017a565b50506005805460ff19166012179055506000620000c43390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3505061070860145550670de0b6b3a76400006015556001601260006200014c60055461010090046001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556200025d565b828054620001889062000220565b90600052602060002090601f016020900481019282620001ac5760008555620001f7565b82601f10620001c757805160ff1916838001178555620001f7565b82800160010185558215620001f7579182015b82811115620001f7578251825591602001919060010190620001da565b506200020592915062000209565b5090565b5b808211156200020557600081556001016200020a565b600181811c908216806200023557607f821691505b602082108114156200025757634e487b7160e01b600052602260045260246000fd5b50919050565b61260c806200026d6000396000f3fe60806040526004361061024a5760003560e01c806385a6b3ae11610139578063aafd847a116100b6578063e30443bc1161007a578063e30443bc14610733578063e7841ec014610753578063e98030c714610768578063f2fde38b14610788578063fbcbc0f1146107a8578063ffb2c479146107c857600080fd5b8063aafd847a14610661578063bc4c4b3714610697578063be10b614146106b7578063dd62ed3e146106cd578063e1ccbba61461071357600080fd5b806395d89b41116100fd57806395d89b41146105cc5780639693ec09146105e1578063a457c2d714610601578063a8b9d24014610621578063a9059cbb1461064157600080fd5b806385a6b3ae1461051f5780638da5cb5b1461053557806391b89fba1461056c578063927bf1e91461058c57806395b0a1e0146105ac57600080fd5b8063313ce567116101c75780635183d6fd1161018b5780635183d6fd146104445780636a474002146104a95780636f2789ec146104be57806370a08231146104d4578063715018a61461050a57600080fd5b8063313ce5671461039257806331e79db0146103b45780633243c791146103d457806339509351146103f45780634e7b827f1461041457600080fd5b806318160ddd1161020e57806318160ddd146102fa578063226cfa3d1461030f57806323b872dd1461033c57806327ce01471461035c5780633009a6091461037c57600080fd5b806303c833021461025657806306fdde03146102605780630920dacb1461028b578063095ea7b3146102ab57806309bbedde146102db57600080fd5b3661025157005b600080fd5b61025e610803565b005b34801561026c57600080fd5b506102756108cf565b60405161028291906121eb565b60405180910390f35b34801561029757600080fd5b5061025e6102a6366004612255565b610961565b3480156102b757600080fd5b506102cb6102c636600461228e565b610a63565b6040519015158152602001610282565b3480156102e757600080fd5b50600c545b604051908152602001610282565b34801561030657600080fd5b506002546102ec565b34801561031b57600080fd5b506102ec61032a3660046122ba565b60136020526000908152604090205481565b34801561034857600080fd5b506102cb6103573660046122d7565b610a7a565b34801561036857600080fd5b506102ec6103773660046122ba565b610ae3565b34801561038857600080fd5b506102ec60105481565b34801561039e57600080fd5b5060055460405160ff9091168152602001610282565b3480156103c057600080fd5b5061025e6103cf3660046122ba565b610b3f565b3480156103e057600080fd5b5061025e6103ef366004612318565b610c6c565b34801561040057600080fd5b506102cb61040f36600461228e565b610d1d565b34801561042057600080fd5b506102cb61042f3660046122ba565b60116020526000908152604090205460ff1681565b34801561045057600080fd5b5061046461045f366004612318565b610d53565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610282565b3480156104b557600080fd5b5061025e610ea7565b3480156104ca57600080fd5b506102ec60145481565b3480156104e057600080fd5b506102ec6104ef3660046122ba565b6001600160a01b031660009081526020819052604090205490565b34801561051657600080fd5b5061025e610f49565b34801561052b57600080fd5b506102ec600b5481565b34801561054157600080fd5b5060055461010090046001600160a01b03165b6040516001600160a01b039091168152602001610282565b34801561057857600080fd5b506102ec6105873660046122ba565b610fc9565b34801561059857600080fd5b5061025e6105a73660046122ba565b610fd4565b3480156105b857600080fd5b5061025e6105c73660046122ba565b61103f565b3480156105d857600080fd5b50610275611091565b3480156105ed57600080fd5b50600854610554906001600160a01b031681565b34801561060d57600080fd5b506102cb61061c36600461228e565b6110a0565b34801561062d57600080fd5b506102ec61063c3660046122ba565b6110ef565b34801561064d57600080fd5b506102cb61065c36600461228e565b61111b565b34801561066d57600080fd5b506102ec61067c3660046122ba565b6001600160a01b03166000908152600a602052604090205490565b3480156106a357600080fd5b506102cb6106b236600461233f565b611195565b3480156106c357600080fd5b506102ec60155481565b3480156106d957600080fd5b506102ec6106e8366004612255565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561071f57600080fd5b5061025e61072e366004612318565b611249565b34801561073f57600080fd5b5061025e61074e36600461228e565b6112ac565b34801561075f57600080fd5b506010546102ec565b34801561077457600080fd5b5061025e610783366004612318565b61141b565b34801561079457600080fd5b5061025e6107a33660046122ba565b611582565b3480156107b457600080fd5b506104646107c33660046122ba565b61167e565b3480156107d457600080fd5b506107e86107e3366004612318565b6117e7565b60408051938452602084019290925290820152606001610282565b6005546001600160a01b0361010090910416331461083c5760405162461bcd60e51b81526004016108339061236d565b60405180910390fd5b600061084760025490565b1161085157600080fd5b34156108cd5761088461086360025490565b61087134600160801b611a2c565b61087b91906123b8565b60065490611ab2565b60065560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600b546108c99034611ab2565b600b555b565b6060600380546108de906123da565b80601f016020809104026020016040519081016040528092919081815260200182805461090a906123da565b80156109575780601f1061092c57610100808354040283529160200191610957565b820191906000526020600020905b81548152906001019060200180831161093a57829003601f168201915b5050505050905090565b3360009081526012602052604090205460ff1661097d57600080fd5b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa1580156109cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ef9190612415565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610a3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5e919061242e565b505050565b6000610a70338484611b11565b5060015b92915050565b6000610a87848484600080fd5b610ad98433610ad48560405180606001604052806028815260200161258a602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611c35565b611b11565b5060019392505050565b6001600160a01b03811660009081526009602090815260408083205491839052822054600654600160801b92610b3592610b3092610b2a91610b259190611a2c565b611c6c565b90611c7c565b611cba565b610a7491906123b8565b6005546001600160a01b03610100909104163314610b6f5760405162461bcd60e51b81526004016108339061236d565b6001600160a01b03811660009081526011602052604090205460ff1615610b9557600080fd5b6001600160a01b0381166000908152601160205260408120805460ff19166001179055610bc3908290611ccd565b60405163131836e760e21b8152600c60048201526001600160a01b0382166024820152739b5bdfcbdc72e7a62ee57652dc459b8da5090fd490634c60db9c9060440160006040518083038186803b158015610c1d57600080fd5b505af4158015610c31573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b6005546001600160a01b03610100909104163314610c9c5760405162461bcd60e51b81526004016108339061236d565b6000610ca760025490565b11610cb157600080fd5b8015610d1a57610cd1610cc360025490565b61087183600160801b611a2c565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600b54610d169082611ab2565b600b555b50565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610a70918590610ad49086611ab2565b600080600080600080600080600c739b5bdfcbdc72e7a62ee57652dc459b8da5090fd463deb3d89690916040518263ffffffff1660e01b8152600401610d9b91815260200190565b602060405180830381865af4158015610db8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddc9190612415565b8910610e01575060009650600019955085945086935083925082915081905080610e9c565b6040516368d54f3f60e11b8152600c6004820152602481018a9052600090739b5bdfcbdc72e7a62ee57652dc459b8da5090fd49063d1aa9e7e90604401602060405180830381865af4158015610e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7f919061244b565b9050610e8a8161167e565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152606560248201527f594532345f4469766964656e645f547261636b65723a2077697468647261774460448201527f69766964656e642064697361626c65642e20557365207468652027636c61696d60648201527f272066756e6374696f6e206f6e20746865206d61696e205945323420636f6e746084820152643930b1ba1760d91b60a482015260c401610833565b6005546001600160a01b03610100909104163314610f795760405162461bcd60e51b81526004016108339061236d565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6000610a74826110ef565b3360009081526012602052604090205460ff16610ff057600080fd5b6001600160a01b03811660009081526012602052604090205460ff1615156001141561101b57600080fd5b6001600160a01b03166000908152601260205260409020805460ff19166001179055565b6005546001600160a01b0361010090910416331461106f5760405162461bcd60e51b81526004016108339061236d565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6060600480546108de906123da565b6000610a703384610ad4856040518060600160405280602581526020016125b2602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611c35565b6001600160a01b0381166000908152600a6020526040812054610a749061111584610ae3565b90611d2c565b3360009081526012602052604081205460ff1661118a5760405162461bcd60e51b815260206004820152602760248201527f596f7520646f206e6f74206861766520706572726d697373696f6e20746f20746044820152663930b739b332b960c91b6064820152608401610833565b610a70338484600080fd5b6005546000906001600160a01b036101009091041633146111c85760405162461bcd60e51b81526004016108339061236d565b60006111d384611d88565b9050801561123f576001600160a01b038416600081815260136020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0929061122d9085815260200190565b60405180910390a36001915050610a74565b5060009392505050565b6005546001600160a01b036101009091041633146112795760405162461bcd60e51b81526004016108339061236d565b60155460405182907f512469f9f8a9fc56d42c21fcb6664be0954f18a308cebed44dc3bcf34add033090600090a3601555565b6005546001600160a01b036101009091041633146112dc5760405162461bcd60e51b81526004016108339061236d565b6001600160a01b03821660009081526011602052604090205460ff1615611301575050565b6015548110611392576113148282611ccd565b604051632f0ad01760e21b8152600c60048201526001600160a01b038316602482015260448101829052739b5bdfcbdc72e7a62ee57652dc459b8da5090fd49063bc2b405c9060640160006040518083038186803b15801561137557600080fd5b505af4158015611389573d6000803e3d6000fd5b50505050611410565b61139d826000611ccd565b60405163131836e760e21b8152600c60048201526001600160a01b0383166024820152739b5bdfcbdc72e7a62ee57652dc459b8da5090fd490634c60db9c9060440160006040518083038186803b1580156113f757600080fd5b505af415801561140b573d6000803e3d6000fd5b505050505b610a5e826001611195565b6005546001600160a01b0361010090910416331461144b5760405162461bcd60e51b81526004016108339061236d565b620151808111156114d75760405162461bcd60e51b815260206004820152604a60248201527f594532345f4469766964656e645f547261636b65723a20636c61696d5761697460448201527f206d757374206265207570646174656420746f206265747765656e203120616e6064820152696420323420686f75727360b01b608482015260a401610833565b60145481141561154f5760405162461bcd60e51b815260206004820152603c60248201527f594532345f4469766964656e645f547261636b65723a2043616e6e6f7420757060448201527f6461746520636c61696d5761697420746f2073616d652076616c7565000000006064820152608401610833565b60145460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601455565b6005546001600160a01b036101009091041633146115b25760405162461bcd60e51b81526004016108339061236d565b6001600160a01b0381166116175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610833565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6040516317e142d160e01b8152600c60048201526001600160a01b03821660248201528190600090819081908190819081908190739b5bdfcbdc72e7a62ee57652dc459b8da5090fd4906317e142d190604401602060405180830381865af41580156116ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117129190612415565b96506000199550600087126117745760105487111561174057601054611739908890611eed565b9550611774565b601054600c5460009110611755576000611764565b601054600c5461176491611d2c565b90506117708882611c7c565b9650505b61177d886110ef565b945061178888610ae3565b6001600160a01b0389166000908152601360205260409020549094509250826117b25760006117c0565b6014546117c0908490611ab2565b91504282116117d05760006117da565b6117da8242611d2c565b9050919395975091939597565b600c8054601080546000938493849390928492918361180583612468565b919050558154811061181957611819612483565b6000918252602082200154600c54601080546001600160a01b039093169450909261184383612468565b919050551061187757600c805460009061185f5761185f612483565b6000918252602090912001546001600160a01b031690505b6001600160a01b03811660009081526013602052604090205461189990611f39565b15611918576008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156118e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190b9190612415565b905061191681610c6c565b505b81611930576000806010549450945094505050611a25565b6010546000805a90506000805b8a8410801561194b57508682105b15611a13578461195a81612468565b600c549096508610905061196d57600094505b6000600c600001868154811061198557611985612483565b60009182526020808320909101546001600160a01b031680835260139091526040909120549091506119b690611f39565b156119d9576119c6816001611195565b156119d957816119d581612468565b9250505b826119e381612468565b93505060005a905080851115611a0a57611a07611a008683611d2c565b8790611ab2565b95505b935061193d9050565b60108590559098509650919450505050505b9193909250565b600082611a3b57506000610a74565b6000611a478385612499565b905082611a5485836123b8565b14611aab5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610833565b9392505050565b600080611abf83856124b8565b905083811015611aab5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610833565b6001600160a01b038316611b735760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610833565b6001600160a01b038216611bd45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610833565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60008184841115611c595760405162461bcd60e51b815260040161083391906121eb565b50611c6483856124d0565b949350505050565b60008181811215610a7457600080fd5b600080611c8983856124e7565b905060008312158015611c9c5750838112155b80611cb15750600083128015611cb157508381125b611aab57600080fd5b600080821215611cc957600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611d0c576000611cfa8383611d2c565b9050611d068482611f60565b50505050565b80821015610a5e576000611d208284611d2c565b9050611d068482611fc4565b600082821115611d7e5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610833565b611aab82846124d0565b600080611d94836110ef565b90508015611ee4576001600160a01b0383166000908152600a6020526040902054611dbf9082611ab2565b6001600160a01b0384166000818152600a6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90611e0e9084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb906044016020604051808303816000875af1158015611e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e919061242e565b905080611edd576001600160a01b0384166000908152600a6020526040902054611eb89083611d2c565b6001600160a01b039094166000908152600a6020526040812094909455509192915050565b5092915050565b50600092915050565b6000808212158015611f08575082611f058382612528565b13155b80611f265750600082128015611f26575082611f248382612528565b135b611f2f57600080fd5b611aab8284612528565b600042821115611f4b57506000919050565b601454611f584284611d2c565b101592915050565b611f6a8282612008565b611fa4611f85610b2583600654611a2c90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611eed565b6001600160a01b0390921660009081526009602052604090209190915550565b611fce82826120e7565b611fa4611fe9610b2583600654611a2c90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611c7c565b6001600160a01b03821661205e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610833565b60025461206b9082611ab2565b6002556001600160a01b0382166000908152602081905260409020546120919082611ab2565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166121475760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610833565b61218481604051806060016040528060228152602001612568602291396001600160a01b0385166000908152602081905260409020549190611c35565b6001600160a01b0383166000908152602081905260409020556002546121aa9082611d2c565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016120db565b600060208083528351808285015260005b81811015612218578581018301518582016040015282016121fc565b8181111561222a576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610d1a57600080fd5b6000806040838503121561226857600080fd5b823561227381612240565b9150602083013561228381612240565b809150509250929050565b600080604083850312156122a157600080fd5b82356122ac81612240565b946020939093013593505050565b6000602082840312156122cc57600080fd5b8135611aab81612240565b6000806000606084860312156122ec57600080fd5b83356122f781612240565b9250602084013561230781612240565b929592945050506040919091013590565b60006020828403121561232a57600080fd5b5035919050565b8015158114610d1a57600080fd5b6000806040838503121561235257600080fd5b823561235d81612240565b9150602083013561228381612331565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000826123d557634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806123ee57607f821691505b6020821081141561240f57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561242757600080fd5b5051919050565b60006020828403121561244057600080fd5b8151611aab81612331565b60006020828403121561245d57600080fd5b8151611aab81612240565b600060001982141561247c5761247c6123a2565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156124b3576124b36123a2565b500290565b600082198211156124cb576124cb6123a2565b500190565b6000828210156124e2576124e26123a2565b500390565b600080821280156001600160ff1b0384900385131615612509576125096123a2565b600160ff1b8390038412811615612522576125226123a2565b50500190565b60008083128015600160ff1b850184121615612546576125466123a2565b6001600160ff1b0384018313811615612561576125616123a2565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200cc605fca0bfb169f76ccb2be8f1a6dae533b4a317724a8d7b090acab2dce1a564736f6c634300080a0033

Deployed Bytecode

0x60806040526004361061042a5760003560e01c806388bdd9be11610229578063b9e937001161012e578063e1ccbba6116100b6578063f27fd2541161007a578063f27fd25414610cc7578063f298f42c14610ce7578063f2fde38b14610d07578063f657099014610d27578063fe575a8714610d4757600080fd5b8063e1ccbba614610c3c578063e2f4560514610c5c578063e37ba8f914610c72578063e7841ec014610c92578063e98030c714610ca757600080fd5b8063c3a3c032116100fd578063c3a3c03214610b96578063c492f04614610bab578063d0a3981414610bcb578063d63607d814610be1578063dd62ed3e14610bf657600080fd5b8063b9e9370014610b2b578063bc37e1a314610b41578063c024666814610b56578063c23be47f14610b7657600080fd5b8063a457c2d7116101b1578063aacebbe311610180578063aacebbe314610a40578063ab3b554514610a60578063ad56c13c14610a80578063b1ff3b5c14610ae5578063b62496f514610afb57600080fd5b8063a457c2d7146109ca578063a8b9d240146109ea578063a9059cbb14610a0a578063a9dec43614610a2a57600080fd5b80639693ec09116101f85780639693ec091461094a57806396c74c641461096a5780639a7a23d61461097f5780639c1b8af51461099f578063a26579ad146109b557600080fd5b806388bdd9be146108d25780638da5cb5b146108f257806395b0a1e01461091557806395d89b411461093557600080fd5b80633320f5851161032f57806364b0f653116102b7578063700bb19111610286578063700bb1911461084757806370a0823114610867578063715018a61461088757806382247ec01461089c578063871c128d146108b257600080fd5b806364b0f653146107d257806365b8dbc0146107e75780636843cd84146108075780636ec0227a1461082757600080fd5b806349bdf873116102fe57806349bdf8731461071e5780634c12b33f146107385780634cdaf0ae146107595780634fbee19314610779578063553ad0dc146107b257600080fd5b80633320f5851461069557806339509351146106b55780633c7a309b146106d557806349bd5a5e146106ea57600080fd5b806323b872dd116103b25780632c889d18116103815780632c889d18146105fe5780632de3f9561461061e57806330bb4cff1461063e578063313ce5671461065357806331e79db01461067557600080fd5b806323b872dd14610589578063270924c7146105a9578063296d3de0146105be5780632c1f5216146105de57600080fd5b8063095ea7b3116103f9578063095ea7b3146104bc5780631694505e146104ec57806318160ddd146105245780631c499ab0146105395780631cdd3be31461055957600080fd5b8063021954661461043657806306fdde031461044d5780630773d31d146104785780630920dacb1461049c57600080fd5b3661043157005b600080fd5b34801561044257600080fd5b5061044b610d80565b005b34801561045957600080fd5b50610462610e09565b60405161046f91906141d4565b60405180910390f35b34801561048457600080fd5b5061048e60185481565b60405190815260200161046f565b3480156104a857600080fd5b5061044b6104b736600461423e565b610e9b565b3480156104c857600080fd5b506104dc6104d7366004614277565b610fb6565b604051901515815260200161046f565b3480156104f857600080fd5b5060065461050c906001600160a01b031681565b6040516001600160a01b03909116815260200161046f565b34801561053057600080fd5b5060025461048e565b34801561054557600080fd5b5061044b6105543660046142a3565b610fcd565b34801561056557600080fd5b506104dc6105743660046142bc565b60256020526000908152604090205460ff1681565b34801561059557600080fd5b506104dc6105a43660046142d9565b611015565b3480156105b557600080fd5b5061044b61107e565b3480156105ca57600080fd5b5061044b6105d936600461431a565b611100565b3480156105ea57600080fd5b5060085461050c906001600160a01b031681565b34801561060a57600080fd5b5061044b6106193660046142a3565b61115e565b34801561062a57600080fd5b5061044b61063936600461434a565b6111a3565b34801561064a57600080fd5b5061048e61122b565b34801561065f57600080fd5b5060055460405160ff909116815260200161046f565b34801561068157600080fd5b5061044b6106903660046142bc565b61129e565b3480156106a157600080fd5b5061044b6106b036600461437d565b61132a565b3480156106c157600080fd5b506104dc6106d0366004614277565b611381565b3480156106e157600080fd5b5061044b6113b7565b3480156106f657600080fd5b5061050c7f0000000000000000000000004ba2fd871821ac6367b7f64f30d3769370301cf281565b34801561072a57600080fd5b506028546104dc9060ff1681565b34801561074457600080fd5b506007546104dc90600160b01b900460ff1681565b34801561076557600080fd5b5061044b6107743660046142bc565b61158e565b34801561078557600080fd5b506104dc6107943660046142bc565b6001600160a01b031660009081526023602052604090205460ff1690565b3480156107be57600080fd5b5061044b6107cd36600461434a565b6115ec565b3480156107de57600080fd5b5061048e611669565b3480156107f357600080fd5b5061044b6108023660046142bc565b6116b3565b34801561081357600080fd5b5061048e6108223660046142bc565b61176e565b34801561083357600080fd5b5061044b61084236600461437d565b6117de565b34801561085357600080fd5b5061044b6108623660046142a3565b61182f565b34801561087357600080fd5b5061048e6108823660046142bc565b611901565b34801561089357600080fd5b5061044b61191c565b3480156108a857600080fd5b5061048e60165481565b3480156108be57600080fd5b5061044b6108cd3660046142a3565b61199c565b3480156108de57600080fd5b5061044b6108ed3660046142bc565b611af4565b3480156108fe57600080fd5b5060055461010090046001600160a01b031661050c565b34801561092157600080fd5b5061044b6109303660046142bc565b611e0c565b34801561094157600080fd5b50610462611eee565b34801561095657600080fd5b5060075461050c906001600160a01b031681565b34801561097657600080fd5b5061044b611efd565b34801561098b57600080fd5b5061044b61099a3660046143d1565b611f47565b3480156109ab57600080fd5b5061048e60205481565b3480156109c157600080fd5b5061048e61203d565b3480156109d657600080fd5b506104dc6109e5366004614277565b612087565b3480156109f657600080fd5b5061048e610a053660046142bc565b6120d6565b348015610a1657600080fd5b506104dc610a25366004614277565b612109565b348015610a3657600080fd5b5061048e60175481565b348015610a4c57600080fd5b5061044b610a5b3660046142bc565b612116565b348015610a6c57600080fd5b5061044b610a7b3660046142a3565b612227565b348015610a8c57600080fd5b50610aa0610a9b3660046142bc565b612284565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161046f565b348015610af157600080fd5b5061048e601f5481565b348015610b0757600080fd5b506104dc610b163660046142bc565b60246020526000908152604090205460ff1681565b348015610b3757600080fd5b5061048e601d5481565b348015610b4d57600080fd5b5061044b61231f565b348015610b6257600080fd5b5061044b610b713660046143d1565b612397565b348015610b8257600080fd5b5061044b610b913660046142bc565b6124af565b348015610ba257600080fd5b5061048e6124f7565b348015610bb757600080fd5b5061044b610bc63660046143ff565b612517565b348015610bd757600080fd5b5061048e601e5481565b348015610bed57600080fd5b5061044b6125f9565b348015610c0257600080fd5b5061048e610c1136600461423e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610c4857600080fd5b5061044b610c573660046142a3565b612638565b348015610c6857600080fd5b5061048e600d5481565b348015610c7e57600080fd5b5061044b610c8d3660046142bc565b612699565b348015610c9e57600080fd5b5061048e6127aa565b348015610cb357600080fd5b5061044b610cc23660046142a3565b6127f4565b348015610cd357600080fd5b50610aa0610ce23660046142a3565b612855565b348015610cf357600080fd5b5061044b610d023660046143d1565b612897565b348015610d1357600080fd5b5061044b610d223660046142bc565b6129aa565b348015610d3357600080fd5b5061044b610d42366004614485565b612aa6565b348015610d5357600080fd5b506104dc610d623660046142bc565b6001600160a01b031660009081526025602052604090205460ff1690565b6005546001600160a01b03610100909104163314610db95760405162461bcd60e51b8152600401610db0906144aa565b60405180910390fd5b610dc8601e80601e60096117de565b610dd8600560086005600261132a565b610de56377359400610fcd565b610df3637735940080611100565b6007805461ffff60a81b1916600160a81b179055565b606060038054610e18906144df565b80601f0160208091040260200160405190810160405280929190818152602001828054610e44906144df565b8015610e915780601f10610e6657610100808354040283529160200191610e91565b820191906000526020600020905b815481529060010190602001808311610e7457829003601f168201915b5050505050905090565b6005546001600160a01b03610100909104163314610ecb5760405162461bcd60e51b8152600401610db0906144aa565b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f38919061451a565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509083169063a9059cbb906044016020604051808303816000875af1158015610f8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610faf9190614533565b5050505050565b6000610fc3338484612c38565b5060015b92915050565b6005546001600160a01b03610100909104163314610ffd5760405162461bcd60e51b8152600401610db0906144aa565b61100f81670de0b6b3a7640000614566565b60165550565b6000611022848484612d5d565b611074843361106f856040518060600160405280602881526020016148c2602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613896565b612c38565b5060019392505050565b6005546001600160a01b036101009091041633146110ae5760405162461bcd60e51b8152600401610db0906144aa565b6110be60046005600660016117de565b6110ce600560086005600261132a565b6110db6377359400610fcd565b6110e9637735940080611100565b6007805461ffff60a81b191661010160a81b179055565b6005546001600160a01b036101009091041633146111305760405162461bcd60e51b8152600401610db0906144aa565b61114282670de0b6b3a7640000614566565b60175561115781670de0b6b3a7640000614566565b6018555050565b6005546001600160a01b0361010090910416331461118e5760405162461bcd60e51b8152600401610db0906144aa565b6111a061119b4283614585565b6138cd565b50565b6005546001600160a01b036101009091041633146111d35760405162461bcd60e51b8152600401610db0906144aa565b60078054821515600160a81b0260ff60a81b199091161790556040517fd92566aec3731c43bc7ec6a90c119de538d83f226f301b29d5139a4b670abfb29061122090831515815260200190565b60405180910390a150565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611275573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611299919061451a565b905090565b6005546001600160a01b036101009091041633146112ce5760405162461bcd60e51b8152600401610db0906144aa565b60085460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b15801561131657600080fd5b505af1158015610faf573d6000803e3d6000fd5b6005546001600160a01b0361010090910416331461135a5760405162461bcd60e51b8152600401610db0906144aa565b60ff808516601355838116601455828116601255811660155561137b6138e0565b50505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610fc391859061106f9086612bd2565b6005546001600160a01b036101009091041633146113e75760405162461bcd60e51b8152600401610db0906144aa565b60275442101561142c5760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610db0565b6026546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149d919061451a565b60285490915060ff1615611551576114b86201518042614585565b602755600a6114c8826002614566565b6114d2919061459d565b600a5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044015b6020604051808303816000875af1158015611528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154c9190614533565b505050565b600a5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb90604401611509565b5050565b6005546001600160a01b036101009091041633146115be5760405162461bcd60e51b8152600401610db0906144aa565b602680546001600160a01b0319166001600160a01b0383161790556115e66201518042614585565b60275550565b6005546001600160a01b0361010090910416331461161c5760405162461bcd60e51b8152600401610db0906144aa565b60078054821515600160b01b0260ff60b01b199091161790556040517f6225104598bca03a23e6426058f298b0ff0510d263e9c7c61317dbbf41da0eb09061122090831515815260200190565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611275573d6000803e3d6000fd5b6005546001600160a01b036101009091041633146116e35760405162461bcd60e51b8152600401610db0906144aa565b6006546001600160a01b03828116911614156117115760405162461bcd60e51b8152600401610db0906145bf565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa1580156117ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc7919061451a565b6005546001600160a01b0361010090910416331461180e5760405162461bcd60e51b8152600401610db0906144aa565b60ff808516600e55838116601055828116600f55811660115561137b6138e0565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a69190614608565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0361010090910416331461194c5760405162461bcd60e51b8152600401610db0906144aa565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b036101009091041633146119cc5760405162461bcd60e51b8152600401610db0906144aa565b62030d4081101580156119e257506207a1208111155b611a545760405162461bcd60e51b815260206004820152603a60248201527f594532343a20676173466f7250726f63657373696e67206d757374206265206260448201527f65747765656e203230302c30303020616e64203530302c3030300000000000006064820152608401610db0565b602054811415611ac15760405162461bcd60e51b815260206004820152603260248201527f594532343a2043616e6e6f742075706461746520676173466f7250726f63657360448201527173696e6720746f2073616d652076616c756560701b6064820152608401610db0565b60205460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3602055565b6005546001600160a01b03610100909104163314611b245760405162461bcd60e51b8152600401610db0906144aa565b6008546001600160a01b0382811691161415611b9e5760405162461bcd60e51b815260206004820152603360248201527f594532343a20546865206469766964656e6420747261636b657220616c7265616044820152726479206861732074686174206164647265737360681b6064820152608401610db0565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0f9190614636565b6001600160a01b031614611c9b5760405162461bcd60e51b815260206004820152604760248201527f594532343a20546865206e6577206469766964656e6420747261636b6572206d60448201527f757374206265206f776e656420627920746865205945323420746f6b656e20636064820152661bdb9d1c9858dd60ca1b608482015260a401610db0565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611cdd57600080fd5b505af1158015611cf1573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611d3657600080fd5b505af1158015611d4a573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611d9557600080fd5b505af1158015611da9573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b03610100909104163314611e3c5760405162461bcd60e51b8152600401610db0906144aa565b6007546001600160a01b0382811691161415611e6a5760405162461bcd60e51b8152600401610db0906145bf565b6007546040516001600160a01b03918216918316907f523400a476dc1f49f3cc8e7dc4ea8fbd97c0b7c17be259fbc3a8ff8f67a71fd290600090a3600780546001600160a01b0319166001600160a01b038381169182179092556008546040516304ad850f60e51b81526004810192909252909116906395b0a1e0906024016112fc565b606060048054610e18906144df565b6005546001600160a01b03610100909104163314611f2d5760405162461bcd60e51b8152600401610db0906144aa565b6000611f3830611901565b90506111a03061dead83613931565b6005546001600160a01b03610100909104163314611f775760405162461bcd60e51b8152600401610db0906144aa565b7f0000000000000000000000004ba2fd871821ac6367b7f64f30d3769370301cf26001600160a01b0316826001600160a01b031614156120335760405162461bcd60e51b815260206004820152604b60248201527f594532343a205468652050616e63616b655377617020706169722063616e6e6f60448201527f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b6560648201526a744d616b6572506169727360a81b608482015260a401610db0565b61158a8282613a28565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611275573d6000803e3d6000fd5b6000610fc3338461106f8560405180606001604052806025815260200161490a602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613896565b6008546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161179d565b6000610fc3338484612d5d565b6005546001600160a01b036101009091041633146121465760405162461bcd60e51b8152600401610db0906144aa565b6009546001600160a01b03828116911614156121bf5760405162461bcd60e51b815260206004820152603260248201527f594532343a20546865206d61726b6574696e672077616c6c657420697320616c60448201527172656164792074686973206164647265737360701b6064820152608401610db0565b6121ca816001612397565b6009546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146122575760405162461bcd60e51b8152600401610db0906144aa565b61226981670de0b6b3a7640000614566565b601f5561227e81670de0b6b3a7640000614566565b600d5550565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa1580156122e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123049190614653565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b0361010090910416331461234f5760405162461bcd60e51b8152600401610db0906144aa565b61235d6000806000806117de565b61236b60008060008061132a565b6007805460ff60a81b1916905561238664174876e800610fcd565b61239564174876e80080611100565b565b6005546001600160a01b036101009091041633146123c75760405162461bcd60e51b8152600401610db0906144aa565b6001600160a01b03821660009081526023602052604090205460ff161515811515141561244f5760405162461bcd60e51b815260206004820152603060248201527f594532343a204163636f756e7420697320616c7265616479207468652076616c60448201526f7565206f6620276578636c756465642760801b6064820152608401610db0565b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b6005546001600160a01b036101009091041633146124df5760405162461bcd60e51b8152600401610db0906144aa565b60006124ea30611901565b905061158a308383613931565b6000602754421015612511574260275461129991906146bd565b50600090565b6005546001600160a01b036101009091041633146125475760405162461bcd60e51b8152600401610db0906144aa565b60005b828110156125b8578160236000868685818110612569576125696146d4565b905060200201602081019061257e91906142bc565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806125b0816146ea565b91505061254a565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516125ec93929190614705565b60405180910390a1505050565b6005546001600160a01b036101009091041633146126295760405162461bcd60e51b8152600401610db0906144aa565b6028805460ff19166001179055565b6005546001600160a01b036101009091041633146126685760405162461bcd60e51b8152600401610db0906144aa565b6008546040516370e65dd360e11b8152600481018390526001600160a01b039091169063e1ccbba6906024016112fc565b6005546001600160a01b036101009091041633146126c95760405162461bcd60e51b8152600401610db0906144aa565b600a546001600160a01b03828116911614156127425760405162461bcd60e51b815260206004820152603260248201527f594532343a20546865206c69717569646974792077616c6c657420697320616c60448201527172656164792074686973206164647265737360701b6064820152608401610db0565b61274d816001612397565b600a546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611275573d6000803e3d6000fd5b6005546001600160a01b036101009091041633146128245760405162461bcd60e51b8152600401610db0906144aa565b60085460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c7906024016112fc565b600854604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016122c2565b6005546001600160a01b036101009091041633146128c75760405162461bcd60e51b8152600401610db0906144aa565b6001600160a01b03821660009081526025602052604090205460ff16151581151514156129525760405162461bcd60e51b815260206004820152603360248201527f594532343a204163636f756e7420697320616c7265616479207468652076616c6044820152727565206f662027626c61636b6c69737465642760681b6064820152608401610db0565b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f404e512903f1ca111aaa7db3f548b1969d86eda85df18088582f13feba1e412c91016124a3565b6005546001600160a01b036101009091041633146129da5760405162461bcd60e51b8152600401610db0906144aa565b6001600160a01b038116612a3f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610db0565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b03610100909104163314612ad65760405162461bcd60e51b8152600401610db0906144aa565b816022541415612b285760405162461bcd60e51b815260206004820152601960248201527f5468617420697320616c7265616479207468652074696d6572000000000000006044820152606401610db0565b600b546001600160a01b0382811691161415612b865760405162461bcd60e51b815260206004820152601e60248201527f5468617420697320616c726561647920746865204465762057616c6c657400006044820152606401610db0565b612b9182603c613b86565b6022819055612ba1904290612bd2565b602155600b80546001600160a01b0319166001600160a01b03929092169190911790555060158054601c5560019055565b600080612bdf8385614585565b905083811015612c315760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610db0565b9392505050565b6001600160a01b038316612c9a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610db0565b6001600160a01b038216612cfb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610db0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612d835760405162461bcd60e51b8152600401610db09061475e565b6001600160a01b038216612da95760405162461bcd60e51b8152600401610db0906147a3565b6001600160a01b03831660009081526025602052604090205460ff16158015612deb57506001600160a01b03821660009081526025602052604090205460ff16155b612df457600080fd5b6005546001600160a01b038481166101009092041614801590612e2a57506005546001600160a01b038381166101009092041614155b8015612e3e57506001600160a01b03821615155b8015612e5557506001600160a01b03821661dead14155b8015612e9357507f0000000000000000000000004ba2fd871821ac6367b7f64f30d3769370301cf26001600160a01b0316826001600160a01b031614155b8015612eb857506001600160a01b03821660009081526023602052604090205460ff16155b8015612edd57506001600160a01b03831660009081526023602052604090205460ff16155b15612fd757600754600160a81b900460ff161515600114612efd57600080fd5b601754811115612f605760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610db0565b6000612f6b83611901565b601654909150612f7b8383614585565b1115612fd55760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610db0565b505b80612fe85761154c83836000613931565b600754600160a01b900460ff1615801561301a57506001600160a01b03821660009081526024602052604090205460ff165b801561303457506006546001600160a01b03848116911614155b801561305357506005546001600160a01b038481166101009092041614155b801561307257506005546001600160a01b038381166101009092041614155b801561309757506001600160a01b03821660009081526023602052604090205460ff16155b80156130bc57506001600160a01b03831660009081526023602052604090205460ff16155b1561315457600754600160a81b900460ff1615156001146130dc57600080fd5b6018548111156131545760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610db0565b600061315f30611901565b600d54909150811080159081906131805750600754600160a01b900460ff16155b80156131a557506001600160a01b03851660009081526024602052604090205460ff16155b80156131bf5750600a546001600160a01b03868116911614155b80156131d95750600a546001600160a01b03858116911614155b80156131f357506009546001600160a01b03868116911614155b801561320d57506009546001600160a01b03858116911614155b801561323257506001600160a01b03841660009081526023602052604090205460ff16155b801561325757506001600160a01b03851660009081526023602052604090205460ff16155b1561356057601f54600754909250600160b01b900460ff161561331657601f5461328a8161328430611901565b90613c05565b11156132cd57601f546132a03061dead83613931565b60405181815261dead9030906000805160206148ea8339815191529060200160405180910390a350613316565b60006132de601f5461328430611901565b90506132ed3061dead83613931565b60405181815261dead9030906000805160206148ea8339815191529060200160405180910390a3505b60008061334260155461333c60135461333c601254601454612bd290919063ffffffff16565b90612bd2565b905060006133658261335f60135488613b8690919063ffffffff16565b90613c61565b90506000613374826002613c61565b905060006133828383613c05565b6007805460ff60a01b1916600160a01b17905560145490915015613431576133aa8783613c05565b94506133b585613cbc565b60006133d08561335f60145447613b8690919063ffffffff16565b6009549091506133e9906001600160a01b031682613e0e565b6009546014546001600160a01b039091169030906000805160206148ea8339815191529061341e90899061335f904790613b86565b60405190815260200160405180910390a3505b601554156134a957613441613e44565b600061345c8561335f60155447613b8690919063ffffffff16565b600b54909150613475906001600160a01b031682613e0e565b600b546040518281526001600160a01b039091169030906000805160206148ea8339815191529060200160405180910390a3505b6013541561351b5760006134cc8561335f60135447613b8690919063ffffffff16565b90506134d88382613e91565b60408051838152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505b6012541561354d5760006135408561335f601254601f54613b8690919063ffffffff16565b905061354b81613f3b565b505b50506007805460ff60a01b191690555050505b6007546001600160a01b03861660009081526023602052604090205460ff600160a01b9092048216159116806135ae57506001600160a01b03851660009081526023602052604090205460ff165b156135b7575060005b801561367f5760006135d9606461335f601d5488613b8690919063ffffffff16565b905060006135f7606461335f601e5489613b8690919063ffffffff16565b90507f0000000000000000000000004ba2fd871821ac6367b7f64f30d3769370301cf26001600160a01b0316876001600160a01b0316141561365a5761363d8682613c05565b955061364a883083613931565b613655888888613931565b61367c565b6136648683613c05565b9550613671883084613931565b61367c888888613931565b50505b6001600160a01b03861660009081526023602052604090205460ff16806136be57506001600160a01b03851660009081526023602052604090205460ff165b156136ce576136ce868686613931565b6008546001600160a01b031663e30443bc876136e981611901565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561372f57600080fd5b505af1925050508015613740575060015b506008546001600160a01b031663e30443bc8661375c81611901565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156137a257600080fd5b505af19250505080156137b3575060015b50600754600160a01b900460ff1661388e576020546008546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613832575060408051601f3d908101601f1916820190925261382f91810190614608565b60015b61383b5761388c565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050565b600081848411156138ba5760405162461bcd60e51b8152600401610db091906141d4565b506138c583856146bd565b949350505050565b60275481116138db57600080fd5b602755565b61390360115461333c60105461333c600e54600f54612bd290919063ffffffff16565b601d8190555061392c60155461333c60145461333c601354601254612bd290919063ffffffff16565b601e55565b6001600160a01b0383166139575760405162461bcd60e51b8152600401610db09061475e565b6001600160a01b03821661397d5760405162461bcd60e51b8152600401610db0906147a3565b6139ba8160405180606001604052806026815260200161489c602691396001600160a01b0386166000908152602081905260409020549190613896565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546139e99082612bd2565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616916000805160206148ea8339815191529101612d50565b6001600160a01b03821660009081526024602052604090205460ff1615158115151415613abd5760405162461bcd60e51b815260206004820152603e60248201527f594532343a204175746f6d61746564206d61726b6574206d616b65722070616960448201527f7220697320616c72656164792073657420746f20746861742076616c756500006064820152608401610db0565b6001600160a01b0382166000908152602460205260409020805460ff19168215801591909117909155613b4a5760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613b3157600080fd5b505af1158015613b45573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600082613b9557506000610fc7565b6000613ba18385614566565b905082613bae858361459d565b14612c315760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610db0565b600082821115613c575760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610db0565b612c3182846146bd565b6000808211613cb25760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610db0565b612c31828461459d565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613cf157613cf16146d4565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d6e9190614636565b81600181518110613d8157613d816146d4565b6001600160a01b039283166020918202929092010152600654613da79130911684612c38565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613de090859060009086903090429060040161482a565b600060405180830381600087803b158015613dfa57600080fd5b505af115801561388e573d6000803e3d6000fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561154c573d6000803e3d6000fd5b6021544211613e4f57565b600c54600b546001600160a01b0390811691161461239557600c54600b80546001600160a01b0319166001600160a01b03909216919091179055601c54601555565b600654613ea99030906001600160a01b031684612c38565b60065460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613f16573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610faf9190614608565b613f443061406e565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb1919061451a565b60075460085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905292935060009291169063a9059cbb906044016020604051808303816000875af115801561400c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140309190614533565b9050801561154c5760408051848152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc391016125ec565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156140d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140fc9190614636565b8160008151811061410f5761410f6146d4565b6001600160a01b039283166020918202929092010152600754825191169082906001908110614140576141406146d4565b6001600160a01b0392831660209182029290920101526006546141669130911647612c38565b6006546001600160a01b031663b6f9de9547600084866141884261012c612bd2565b6040518663ffffffff1660e01b81526004016141a79493929190614866565b6000604051808303818588803b1580156141c057600080fd5b505af115801561388c573d6000803e3d6000fd5b600060208083528351808285015260005b81811015614201578581018301518582016040015282016141e5565b81811115614213576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146111a057600080fd5b6000806040838503121561425157600080fd5b823561425c81614229565b9150602083013561426c81614229565b809150509250929050565b6000806040838503121561428a57600080fd5b823561429581614229565b946020939093013593505050565b6000602082840312156142b557600080fd5b5035919050565b6000602082840312156142ce57600080fd5b8135612c3181614229565b6000806000606084860312156142ee57600080fd5b83356142f981614229565b9250602084013561430981614229565b929592945050506040919091013590565b6000806040838503121561432d57600080fd5b50508035926020909101359150565b80151581146111a057600080fd5b60006020828403121561435c57600080fd5b8135612c318161433c565b803560ff8116811461437857600080fd5b919050565b6000806000806080858703121561439357600080fd5b61439c85614367565b93506143aa60208601614367565b92506143b860408601614367565b91506143c660608601614367565b905092959194509250565b600080604083850312156143e457600080fd5b82356143ef81614229565b9150602083013561426c8161433c565b60008060006040848603121561441457600080fd5b833567ffffffffffffffff8082111561442c57600080fd5b818601915086601f83011261444057600080fd5b81358181111561444f57600080fd5b8760208260051b850101111561446457600080fd5b6020928301955093505084013561447a8161433c565b809150509250925092565b6000806040838503121561449857600080fd5b82359150602083013561426c81614229565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806144f357607f821691505b6020821081141561451457634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561452c57600080fd5b5051919050565b60006020828403121561454557600080fd5b8151612c318161433c565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561458057614580614550565b500290565b6000821982111561459857614598614550565b500190565b6000826145ba57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526029908201527f594532343a2054686520726f7574657220616c7265616479206861732074686160408201526874206164647265737360b81b606082015260800190565b60008060006060848603121561461d57600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561464857600080fd5b8151612c3181614229565b600080600080600080600080610100898b03121561467057600080fd5b885161467b81614229565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b6000828210156146cf576146cf614550565b500390565b634e487b7160e01b600052603260045260246000fd5b60006000198214156146fe576146fe614550565b5060010190565b6040808252810183905260008460608301825b8681101561474857823561472b81614229565b6001600160a01b0316825260209283019290910190600101614718565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600081518084526020808501945080840160005b8381101561481f5781516001600160a01b0316875295820195908201906001016147fa565b509495945050505050565b85815284602082015260a06040820152600061484960a08301866147e6565b6001600160a01b0394909416606083015250608001529392505050565b84815260806020820152600061487f60808301866147e6565b6001600160a01b0394909416604083015250606001529291505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205f4593e81b9705576bd2a12afe7005c3fafdfa1ea5a7ddef531e3a0717a2073764736f6c634300080a0033

Libraries Used


Deployed Bytecode Sourcemap

24592:27088:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49329:263;;;;;;;;;;;;;:::i;:::-;;13962:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25536:23;;;;;;;;;;;;;;;;;;;762:25:1;;;750:2;735:18;25536:23:0;616:177:1;51102:233:0;;;;;;;;;;-1:-1:-1;51102:233:0;;;;;:::i;:::-;;:::i;14856:169::-;;;;;;;;;;-1:-1:-1;14856:169:0;;;;;:::i;:::-;;:::i;:::-;;;1812:14:1;;1805:22;1787:41;;1775:2;1760:18;14856:169:0;1647:187:1;24675:41:0;;;;;;;;;;-1:-1:-1;24675:41:0;;;;-1:-1:-1;;;;;24675:41:0;;;;;;-1:-1:-1;;;;;2029:32:1;;;2011:51;;1999:2;1984:18;24675:41:0;1839:229:1;14263:108:0;;;;;;;;;;-1:-1:-1;14351:12:0;;14263:108;;50337:119;;;;;;;;;;-1:-1:-1;50337:119:0;;;;;:::i;:::-;;:::i;26148:47::-;;;;;;;;;;-1:-1:-1;26148:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;15033:321;;;;;;;;;;-1:-1:-1;15033:321:0;;;;;:::i;:::-;;:::i;49066:255::-;;;;;;;;;;;;;:::i;50464:174::-;;;;;;;;;;-1:-1:-1;50464:174:0;;;;;:::i;:::-;;:::i;24941:42::-;;;;;;;;;;-1:-1:-1;24941:42:0;;;;-1:-1:-1;;;;;24941:42:0;;;34589:158;;;;;;;;;;-1:-1:-1;34589:158:0;;;;;:::i;:::-;;:::i;39710:143::-;;;;;;;;;;-1:-1:-1;39710:143:0;;;;;:::i;:::-;;:::i;37809:141::-;;;;;;;;;;;;;:::i;14164:91::-;;;;;;;;;;-1:-1:-1;14238:9:0;;14164:91;;14238:9;;;;3979:36:1;;3967:2;3952:18;14164:91:0;3837:184:1;30141:147:0;;;;;;;;;;-1:-1:-1;30141:147:0;;;;;:::i;:::-;;:::i;49964:365::-;;;;;;;;;;-1:-1:-1;49964:365:0;;;;;:::i;:::-;;:::i;15362:218::-;;;;;;;;;;-1:-1:-1;15362:218:0;;;;;:::i;:::-;;:::i;35048:903::-;;;;;;;;;;;;;:::i;24723:38::-;;;;;;;;;;;;;;;34424:37;;;;;;;;;;-1:-1:-1;34424:37:0;;;;;;;;24914:19;;;;;;;;;;-1:-1:-1;24914:19:0;;;;-1:-1:-1;;;24914:19:0;;;;;;33639:205;;;;;;;;;;-1:-1:-1;33639:205:0;;;;;:::i;:::-;;:::i;37958:125::-;;;;;;;;;;-1:-1:-1;37958:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;38047:28:0;38023:4;38047:28;;;:19;:28;;;;;;;;;37958:125;40373:143;;;;;;;;;;-1:-1:-1;40373:143:0;;;;;:::i;:::-;;:::i;39563:141::-;;;;;;;;;;;;;:::i;31610:313::-;;;;;;;;;;-1:-1:-1;31610:313:0;;;;;:::i;:::-;;:::i;38371:130::-;;;;;;;;;;-1:-1:-1;38371:130:0;;;;;:::i;:::-;;:::i;49604:352::-;;;;;;;;;;-1:-1:-1;49604:352:0;;;;;:::i;:::-;;:::i;39162:259::-;;;;;;;;;;-1:-1:-1;39162:259:0;;;;;:::i;:::-;;:::i;14379:127::-;;;;;;;;;;-1:-1:-1;14379:127:0;;;;;:::i;:::-;;:::i;11362:148::-;;;;;;;;;;;;;:::i;25475:25::-;;;;;;;;;;;;;;;;36941:404;;;;;;;;;;-1:-1:-1;36941:404:0;;;;;:::i;:::-;;:::i;30465:771::-;;;;;;;;;;-1:-1:-1;30465:771:0;;;;;:::i;:::-;;:::i;11139:87::-;;;;;;;;;;-1:-1:-1;11212:6:0;;;;;-1:-1:-1;;;;;11212:6:0;11139:87;;31244:354;;;;;;;;;;-1:-1:-1;31244:354:0;;;;;:::i;:::-;;:::i;14061:95::-;;;;;;;;;;;;;:::i;24770:83::-;;;;;;;;;;-1:-1:-1;24770:83:0;;;;-1:-1:-1;;;;;24770:83:0;;;51347:202;;;;;;;;;;;;;:::i;32853:262::-;;;;;;;;;;-1:-1:-1;32853:262:0;;;;;:::i;:::-;;:::i;25841:40::-;;;;;;;;;;;;;;;;37693:108;;;;;;;;;;;;;:::i;15588:269::-;;;;;;;;;;-1:-1:-1;15588:269:0;;;;;:::i;:::-;;:::i;38219:147::-;;;;;;;;;;-1:-1:-1;38219:147:0;;;;;:::i;:::-;;:::i;14514:175::-;;;;;;;;;;-1:-1:-1;14514:175:0;;;;;:::i;:::-;;:::i;25507:22::-;;;;;;;;;;;;;;;;36336:369;;;;;;;;;;-1:-1:-1;36336:369:0;;;;;:::i;:::-;;:::i;30293:164::-;;;;;;;;;;-1:-1:-1;30293:164:0;;;;;:::i;:::-;;:::i;38509:318::-;;;;;;;;;;-1:-1:-1;38509:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5537:32:1;;;5519:51;;5601:2;5586:18;;5579:34;;;;5629:18;;;5622:34;;;;5687:2;5672:18;;5665:34;;;;5730:3;5715:19;;5708:35;5557:3;5759:19;;5752:35;5818:3;5803:19;;5796:35;5862:3;5847:19;;5840:35;5506:3;5491:19;38509:318:0;5180:701:1;25791:41:0;;;;;;;;;;;;;;;;26083:58;;;;;;;;;;-1:-1:-1;26083:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25723:27;;;;;;;;;;;;;;;;48821:236;;;;;;;;;;;;;:::i;31931:296::-;;;;;;;;;;-1:-1:-1;31931:296:0;;;;;:::i;:::-;;:::i;50904:186::-;;;;;;;;;;-1:-1:-1;50904:186:0;;;;;:::i;:::-;;:::i;36713:220::-;;;;;;;;;;;;;:::i;32541:304::-;;;;;;;;;;-1:-1:-1;32541:304:0;;;;;:::i;:::-;;:::i;25757:28::-;;;;;;;;;;;;;;;;34468:113;;;;;;;;;;;;;:::i;14697:151::-;;;;;;;;;;-1:-1:-1;14697:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;14813:18:0;;;14786:7;14813:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14697:151;37489:196;;;;;;;;;;-1:-1:-1;37489:196:0;;;;;:::i;:::-;;:::i;25132:33::-;;;;;;;;;;;;;;;;35959:369;;;;;;;;;;-1:-1:-1;35959:369:0;;;;;:::i;:::-;;:::i;39429:126::-;;;;;;;;;;;;;:::i;37353:124::-;;;;;;;;;;-1:-1:-1;37353:124:0;;;;;:::i;:::-;;:::i;38832:325::-;;;;;;;;;;-1:-1:-1;38832:325:0;;;;;:::i;:::-;;:::i;32239:294::-;;;;;;;;;;-1:-1:-1;32239:294:0;;;;;:::i;:::-;;:::i;11518:244::-;;;;;;;;;;-1:-1:-1;11518:244:0;;;;;:::i;:::-;;:::i;39861:504::-;;;;;;;;;;-1:-1:-1;39861:504:0;;;;;:::i;:::-;;:::i;38095:116::-;;;;;;;;;;-1:-1:-1;38095:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;38180:23:0;38156:4;38180:23;;;:14;:23;;;;;;;;;38095:116;49329:263;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;;;;;;;;;49387:25:::1;49401:2;49404::::0;49407::::1;49410:1;49387:13;:25::i;:::-;49423:23;49438:1;49440;49442;49444;49423:14;:23::i;:::-;49459:27;49475:10;49459:15;:27::i;:::-;49497:40;49514:10;49526::::0;49497:16:::1;:40::i;:::-;49544:7;:14:::0;;-1:-1:-1;;;;49569:15:0;-1:-1:-1;;;49569:15:0;;;49329:263::o;13962:91::-;14007:13;14040:5;14033:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13962:91;:::o;51102:233::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;51254:30:::1;::::0;-1:-1:-1;;;51254:30:0;;51278:4:::1;51254:30;::::0;::::1;2011:51:1::0;51219:5:0;;51199:11:::1;::::0;-1:-1:-1;;;;;51254:15:0;::::1;::::0;::::1;::::0;1984:18:1;;51254:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51295:32;::::0;-1:-1:-1;;;51295:32:0;;-1:-1:-1;;;;;8096:32:1;;;51295::0::1;::::0;::::1;8078:51:1::0;8145:18;;;8138:34;;;51236:48:0;;-1:-1:-1;51295:14:0;;::::1;::::0;::::1;::::0;8051:18:1;;51295:32:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51188:147;;51102:233:::0;;:::o;14856:169::-;14939:4;14956:39;945:10;14979:7;14988:6;14956:8;:39::i;:::-;-1:-1:-1;15013:4:0;14856:169;;;;;:::o;50337:119::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;50425:23:::1;:12:::0;50441:6:::1;50425:23;:::i;:::-;50412:10;:36:::0;-1:-1:-1;50337:119:0:o;15033:321::-;15139:4;15156:36;15166:6;15174:9;15185:6;15156:9;:36::i;:::-;15203:121;15212:6;945:10;15234:89;15272:6;15234:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15234:19:0;;;;;;:11;:19;;;;;;;;945:10;15234:33;;;;;;;;;;:37;:89::i;:::-;15203:8;:121::i;:::-;-1:-1:-1;15342:4:0;15033:321;;;;;:::o;49066:255::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;49120:22:::1;49134:1;49136;49138;49140;49120:13;:22::i;:::-;49153:23;49168:1;49170;49172;49174;49153:14;:23::i;:::-;49189:27;49205:10;49189:15;:27::i;:::-;49227:40;49244:10;49256::::0;49227:16:::1;:40::i;:::-;49274:7;:14:::0;;-1:-1:-1;;;;49299:14:0;-1:-1:-1;;;49299:14:0;;;49066:255::o;50464:174::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;50567:20:::1;:9:::0;50580:6:::1;50567:20;:::i;:::-;50557:7;:30:::0;50609:21:::1;:10:::0;50623:6:::1;50609:21;:::i;:::-;50598:8;:32:::0;-1:-1:-1;;50464:174:0:o;34589:158::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;34682:57:::1;34704:34;34723:15;34704:18:::0;:34:::1;:::i;:::-;34682:21;:57::i;:::-;34589:158:::0;:::o;39710:143::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;39777:7:::1;:18:::0;;;::::1;;-1:-1:-1::0;;;39777:18:0::1;-1:-1:-1::0;;;;39777:18:0;;::::1;;::::0;;39821:24:::1;::::0;::::1;::::0;::::1;::::0;39787:8;1812:14:1;1805:22;1787:41;;1775:2;1760:18;;1647:187;39821:24:0::1;;;;;;;;39710:143:::0;:::o;37809:141::-;37899:15;;:43;;;-1:-1:-1;;;37899:43:0;;;;37872:7;;-1:-1:-1;;;;;37899:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37892:50;;37809:141;:::o;30141:147::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;30221:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;30221:57:0;;-1:-1:-1;;;;;2029:32:1;;;30221:57:0::1;::::0;::::1;2011:51:1::0;30221:15:0;;::::1;::::0;:36:::1;::::0;1984:18:1;;30221:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;49964:365:::0;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;50116:39:::1;::::0;;::::1;:17;:39:::0;50166;;::::1;:17;:39:::0;50216:35;;::::1;:15;:35:::0;50262:27;::::1;:11;:27:::0;50310:11:::1;:9;:11::i;:::-;49964:365:::0;;;;:::o;15362:218::-;945:10;15450:4;15499:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;15499:34:0;;;;;;;;;;15450:4;;15467:83;;15490:7;;15499:50;;15538:10;15499:38;:50::i;35048:903::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;35193:20:::1;;35174:15;:39;;35166:68;;;::::0;-1:-1:-1;;;35166:68:0;;9073:2:1;35166:68:0::1;::::0;::::1;9055:21:1::0;9112:2;9092:18;;;9085:30;-1:-1:-1;;;9131:18:1;;;9124:46;9187:18;;35166:68:0::1;8871:340:1::0;35166:68:0::1;35278:22;::::0;35329:39:::1;::::0;-1:-1:-1;;;35329:39:0;;35362:4:::1;35329:39;::::0;::::1;2011:51:1::0;-1:-1:-1;;;;;35278:22:0;;::::1;::::0;35247:21:::1;::::0;35278:22;;35329:24:::1;::::0;1984:18:1;;35329:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35382:25;::::0;35312:56;;-1:-1:-1;35382:25:0::1;;35379:565;;;35454:27;26006:6;35454:15;:27;:::i;:::-;35433:20;:48:::0;35619:2:::1;35610:8;:6:::0;35617:1:::1;35610:8;:::i;:::-;:11;;;;:::i;:::-;35660:15;::::0;35636:48:::1;::::0;-1:-1:-1;;;35636:48:0;;-1:-1:-1;;;;;35660:15:0;;::::1;35636:48;::::0;::::1;8078:51:1::0;8145:18;;;8138:34;;;35603:18:0;;-1:-1:-1;35636:23:0;::::1;::::0;::::1;::::0;8051:18:1;;35636:48:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35097:854;;35048:903::o:0;35379:565::-:1;35908:15;::::0;35884:48:::1;::::0;-1:-1:-1;;;35884:48:0;;-1:-1:-1;;;;;35908:15:0;;::::1;35884:48;::::0;::::1;8078:51:1::0;8145:18;;;8138:34;;;35884:23:0;;::::1;::::0;::::1;::::0;8051:18:1;;35884:48:0::1;7904:274:1::0;35379:565:0::1;35097:854;;35048:903::o:0;33639:205::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;33733:22:::1;:44:::0;;-1:-1:-1;;;;;;33733:44:0::1;-1:-1:-1::0;;;;;33733:44:0;::::1;;::::0;;33809:27:::1;26006:6;33809:15;:27;:::i;:::-;33788:20;:48:::0;-1:-1:-1;33639:205:0:o;40373:143::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;40440:7:::1;:18:::0;;;::::1;;-1:-1:-1::0;;;40440:18:0::1;-1:-1:-1::0;;;;40440:18:0;;::::1;;::::0;;40484:24:::1;::::0;::::1;::::0;::::1;::::0;40450:8;1812:14:1;1805:22;1787:41;;1775:2;1760:18;;1647:187;39563:141:0;39655:15;;:41;;;-1:-1:-1;;;39655:41:0;;;;39628:7;;-1:-1:-1;;;;;39655:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;31610:313;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;31719:15:::1;::::0;-1:-1:-1;;;;;31697:38:0;;::::1;31719:15:::0;::::1;31697:38;;31689:92;;;;-1:-1:-1::0;;;31689:92:0::1;;;;;;;:::i;:::-;31839:15;::::0;31797:59:::1;::::0;-1:-1:-1;;;;;31839:15:0;;::::1;::::0;31797:59;::::1;::::0;::::1;::::0;31839:15:::1;::::0;31797:59:::1;31867:15;:48:::0;;-1:-1:-1;;;;;;31867:48:0::1;-1:-1:-1::0;;;;;31867:48:0;;;::::1;::::0;;;::::1;::::0;;31610:313::o;38371:130::-;38462:15;;:34;;-1:-1:-1;;;38462:34:0;;-1:-1:-1;;;;;2029:32:1;;;38462:34:0;;;2011:51:1;38441:7:0;;38462:15;;:25;;1984:18:1;;38462:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49604:352::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;49751:37:::1;::::0;;::::1;:16;:37:::0;49799;;::::1;:16;:37:::0;49847:33;;::::1;:14;:33:::0;49891:25;::::1;:10;:25:::0;49937:11:::1;:9;:11::i;39162:259::-:0;39288:15;;:28;;-1:-1:-1;;;;;;39288:28:0;;;;;762:25:1;;;39222:18:0;;;;;;-1:-1:-1;;;;;39288:15:0;;:23;;735:18:1;;39288:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39326:87;;;10390:25:1;;;10446:2;10431:18;;10424:34;;;10474:18;;;10467:34;;;10532:2;10517:18;;10510:34;;;39221:95:0;;-1:-1:-1;39221:95:0;;-1:-1:-1;39221:95:0;-1:-1:-1;39403:9:0;;39391:5;;39326:87;;10377:3:1;10362:19;39326:87:0;;;;;;;39216:205;;;39162:259;:::o;14379:127::-;-1:-1:-1;;;;;14480:18:0;14453:7;14480:18;;;;;;;;;;;;14379:127::o;11362:148::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;11453:6:::1;::::0;11432:40:::1;::::0;11469:1:::1;::::0;11453:6:::1;::::0;::::1;-1:-1:-1::0;;;;;11453:6:0::1;::::0;11432:40:::1;::::0;11469:1;;11432:40:::1;11483:6;:19:::0;;-1:-1:-1;;;;;;11483:19:0::1;::::0;;11362:148::o;36941:404::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;37039:6:::1;37027:8;:18;;:40;;;;;37061:6;37049:8;:18;;37027:40;37019:111;;;::::0;-1:-1:-1;;;37019:111:0;;10757:2:1;37019:111:0::1;::::0;::::1;10739:21:1::0;10796:2;10776:18;;;10769:30;10835:34;10815:18;;;10808:62;10906:28;10886:18;;;10879:56;10952:19;;37019:111:0::1;10555:422:1::0;37019:111:0::1;37161:16;;37149:8;:28;;37141:91;;;::::0;-1:-1:-1;;;37141:91:0;;11184:2:1;37141:91:0::1;::::0;::::1;11166:21:1::0;11223:2;11203:18;;;11196:30;11262:34;11242:18;;;11235:62;-1:-1:-1;;;11313:18:1;;;11306:48;11371:19;;37141:91:0::1;10982:414:1::0;37141:91:0::1;37282:16;::::0;37248:51:::1;::::0;37272:8;;37248:51:::1;::::0;;;::::1;37310:16;:27:::0;36941:404::o;30465:771::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;30574:15:::1;::::0;-1:-1:-1;;;;;30552:38:0;;::::1;30574:15:::0;::::1;30552:38;;30544:102;;;::::0;-1:-1:-1;;;30544:102:0;;11603:2:1;30544:102:0::1;::::0;::::1;11585:21:1::0;11642:2;11622:18;;;11615:30;11681:34;11661:18;;;11654:62;-1:-1:-1;;;11732:18:1;;;11725:49;11791:19;;30544:102:0::1;11401:415:1::0;30544:102:0::1;30659:38;30728:10;30659:81;;30799:4;-1:-1:-1::0;;;;;30761:43:0::1;:18;-1:-1:-1::0;;;;;30761:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30761:43:0::1;;30753:127;;;::::0;-1:-1:-1;;;30753:127:0;;12279:2:1;30753:127:0::1;::::0;::::1;12261:21:1::0;12318:2;12298:18;;;12291:30;12357:34;12337:18;;;12330:62;12428:34;12408:18;;;12401:62;-1:-1:-1;;;12479:19:1;;;12472:38;12527:19;;30753:127:0::1;12077:475:1::0;30753:127:0::1;30893:68;::::0;-1:-1:-1;;;30893:68:0;;-1:-1:-1;;;;;30893:39:0;::::1;:68;::::0;::::1;2011:51:1::0;;;30893:39:0;::::1;::::0;1984:18:1;;30893:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;30972:54:0::1;::::0;-1:-1:-1;;;30972:54:0;;31020:4:::1;30972:54;::::0;::::1;2011:51:1::0;-1:-1:-1;;;;;30972:39:0;::::1;::::0;-1:-1:-1;30972:39:0::1;::::0;-1:-1:-1;1984:18:1;;30972:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31085:15:0::1;::::0;31037:65:::1;::::0;-1:-1:-1;;;31037:65:0;;-1:-1:-1;;;;;31085:15:0;;::::1;31037:65;::::0;::::1;2011:51:1::0;31037:39:0;;::::1;::::0;-1:-1:-1;31037:39:0::1;::::0;-1:-1:-1;1984:18:1;;31037:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31162:15:0::1;::::0;31120:59:::1;::::0;-1:-1:-1;;;;;31162:15:0;;::::1;::::0;-1:-1:-1;31120:59:0;;::::1;::::0;-1:-1:-1;31120:59:0::1;::::0;31162:15:::1;::::0;31120:59:::1;31192:15;:36:::0;;-1:-1:-1;;;;;;31192:36:0::1;-1:-1:-1::0;;;;;31192:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;30465:771:0:o;31244:354::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;31351:14:::1;::::0;-1:-1:-1;;;;;31329:37:0;;::::1;31351:14:::0;::::1;31329:37;;31321:91;;;;-1:-1:-1::0;;;31321:91:0::1;;;;;;;:::i;:::-;31469:14;::::0;31428:57:::1;::::0;-1:-1:-1;;;;;31469:14:0;;::::1;::::0;31428:57;::::1;::::0;::::1;::::0;31469:14:::1;::::0;31428:57:::1;31496:14;:36:::0;;-1:-1:-1;;;;;;31496:36:0::1;-1:-1:-1::0;;;;;31496:36:0;;::::1;::::0;;::::1;::::0;;;31543:15:::1;::::0;:47:::1;::::0;-1:-1:-1;;;31543:47:0;;::::1;::::0;::::1;2011:51:1::0;;;;31543:15:0;;::::1;::::0;:35:::1;::::0;1984:18:1;;31543:47:0::1;1839:229:1::0;14061:95:0;14108:13;14141:7;14134:14;;;;;:::i;51347:202::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;51405:15:::1;51423:24;51441:4;51423:9;:24::i;:::-;51405:42;;51458:83;51482:4;51489:42;51533:7;51458:15;:83::i;32853:262::-:0;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;32960:13:::1;-1:-1:-1::0;;;;;32952:21:0::1;:4;-1:-1:-1::0;;;;;32952:21:0::1;;;32944:109;;;::::0;-1:-1:-1;;;32944:109:0;;12759:2:1;32944:109:0::1;::::0;::::1;12741:21:1::0;12798:2;12778:18;;;12771:30;12837:34;12817:18;;;12810:62;12908:34;12888:18;;;12881:62;-1:-1:-1;;;12959:19:1;;;12952:42;13011:19;;32944:109:0::1;12557:479:1::0;32944:109:0::1;33066:41;33095:4;33101:5;33066:28;:41::i;37693:108::-:0;37766:15;;:27;;;-1:-1:-1;;;37766:27:0;;;;37739:7;;-1:-1:-1;;;;;37766:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;15588:269;15681:4;15698:129;945:10;15721:7;15730:96;15769:15;15730:96;;;;;;;;;;;;;;;;;945:10;15730:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;15730:34:0;;;;;;;;;;;;:38;:96::i;38219:147::-;38312:15;;:47;;-1:-1:-1;;;38312:47:0;;-1:-1:-1;;;;;2029:32:1;;;38312:47:0;;;2011:51:1;38288:7:0;;38312:15;;:38;;1984:18:1;;38312:47:0;1839:229:1;14514:175:0;14600:4;14617:42;945:10;14641:9;14652:6;14617:9;:42::i;36336:369::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;36453:15:::1;::::0;-1:-1:-1;;;;;36431:37:0;;::::1;36453:15:::0;::::1;36431:37;;36423:100;;;::::0;-1:-1:-1;;;36423:100:0;;13243:2:1;36423:100:0::1;::::0;::::1;13225:21:1::0;13282:2;13262:18;;;13255:30;13321:34;13301:18;;;13294:62;-1:-1:-1;;;13372:18:1;;;13365:48;13430:19;;36423:100:0::1;13041:414:1::0;36423:100:0::1;36534:41;36550:18;36570:4;36534:15;:41::i;:::-;36634:15;::::0;36591:59:::1;::::0;-1:-1:-1;;;;;36634:15:0;;::::1;::::0;36591:59;::::1;::::0;::::1;::::0;36634:15:::1;::::0;36591:59:::1;36661:15;:36:::0;;-1:-1:-1;;;;;;36661:36:0::1;-1:-1:-1::0;;;;;36661:36:0;;;::::1;::::0;;;::::1;::::0;;36336:369::o;30293:164::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;30389:17:::1;:6:::0;30399::::1;30389:17;:::i;:::-;30360:26;:46:::0;30435:17:::1;:6:::0;30445::::1;30435:17;:::i;:::-;30414:18;:38:::0;-1:-1:-1;30293:164:0:o;38509:318::-;38784:15;;:35;;-1:-1:-1;;;38784:35:0;;-1:-1:-1;;;;;2029:32:1;;;38784:35:0;;;2011:51:1;38605:7:0;;;;;;;;;;;;;;;;38784:15;;;:26;;1984:18:1;;38784:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38777:42;;;;;;;;;;;;;;;;38509:318;;;;;;;;;:::o;48821:236::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;48870:22:::1;48884:1;48886::::0;48888::::1;48890::::0;48870:13:::1;:22::i;:::-;48903:23;48918:1;48920::::0;48922::::1;48924::::0;48903:14:::1;:23::i;:::-;48933:7;:15:::0;;-1:-1:-1;;;;48933:15:0::1;::::0;;48961:29:::1;48977:12;48961:15;:29::i;:::-;49001:48;49019:12;49035::::0;49001:16:::1;:48::i;:::-;48821:236::o:0;31931:296::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32024:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;32016:101;;;::::0;-1:-1:-1;;;32016:101:0;;14348:2:1;32016:101:0::1;::::0;::::1;14330:21:1::0;14387:2;14367:18;;;14360:30;14426:34;14406:18;;;14399:62;-1:-1:-1;;;14477:18:1;;;14470:46;14533:19;;32016:101:0::1;14146:412:1::0;32016:101:0::1;-1:-1:-1::0;;;;;32128:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;32128:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;32185:34;;1787:41:1;;;32185:34:0::1;::::0;1760:18:1;32185:34:0::1;;;;;;;;31931:296:::0;;:::o;50904:186::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;50981:15:::1;50999:24;51017:4;50999:9;:24::i;:::-;50981:42;;51034:48;51058:4;51065:7;51074;51034:15;:48::i;36713:220::-:0;36778:7;36816:20;;36800:15;:36;36797:110;;;36880:15;36859:20;;:36;;;;:::i;36797:110::-;-1:-1:-1;36924:1:0;;36713:220::o;32541:304::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;32658:9:::1;32654:115;32673:19:::0;;::::1;32654:115;;;32749:8;32714:19;:32;32734:8;;32743:1;32734:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32714:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;32714:32:0;:43;;-1:-1:-1;;32714:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32694:3;::::1;::::0;::::1;:::i;:::-;;;;32654:115;;;;32786:51;32818:8;;32828;32786:51;;;;;;;;:::i;:::-;;;;;;;;32541:304:::0;;;:::o;34468:113::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;34543:25:::1;:30:::0;;-1:-1:-1;;34543:30:0::1;34569:4;34543:30;::::0;;34468:113::o;37489:196::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;37599:15:::1;::::0;:78:::1;::::0;-1:-1:-1;;;37599:78:0;;::::1;::::0;::::1;762:25:1::0;;;-1:-1:-1;;;;;37599:15:0;;::::1;::::0;:45:::1;::::0;735:18:1;;37599:78:0::1;616:177:1::0;35959:369:0;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;36076:15:::1;::::0;-1:-1:-1;;;;;36054:37:0;;::::1;36076:15:::0;::::1;36054:37;;36046:100;;;::::0;-1:-1:-1;;;36046:100:0;;15966:2:1;36046:100:0::1;::::0;::::1;15948:21:1::0;16005:2;15985:18;;;15978:30;16044:34;16024:18;;;16017:62;-1:-1:-1;;;16095:18:1;;;16088:48;16153:19;;36046:100:0::1;15764:414:1::0;36046:100:0::1;36157:41;36173:18;36193:4;36157:15;:41::i;:::-;36257:15;::::0;36214:59:::1;::::0;-1:-1:-1;;;;;36257:15:0;;::::1;::::0;36214:59;::::1;::::0;::::1;::::0;36257:15:::1;::::0;36214:59:::1;36284:15;:36:::0;;-1:-1:-1;;;;;;36284:36:0::1;-1:-1:-1::0;;;;;36284:36:0;;;::::1;::::0;;;::::1;::::0;;35959:369::o;39429:126::-;39508:15;;:39;;;-1:-1:-1;;;39508:39:0;;;;39484:7;;-1:-1:-1;;;;;39508:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;37353:124;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;37427:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;37427:42:0;;::::1;::::0;::::1;762:25:1::0;;;-1:-1:-1;;;;;37427:15:0;;::::1;::::0;:31:::1;::::0;735:18:1;;37427:42:0::1;616:177:1::0;38832:325:0;39109:15;;:40;;-1:-1:-1;;;39109:40:0;;;;;762:25:1;;;38933:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39109:15:0;;;;:33;;735:18:1;;39109:40:0;616:177:1;32239:294:0;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32334:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;:38;;::::0;::::1;;;;32326:102;;;::::0;-1:-1:-1;;;32326:102:0;;16385:2:1;32326:102:0::1;::::0;::::1;16367:21:1::0;16424:2;16404:18;;;16397:30;16463:34;16443:18;;;16436:62;-1:-1:-1;;;16514:18:1;;;16507:49;16573:19;;32326:102:0::1;16183:415:1::0;32326:102:0::1;-1:-1:-1::0;;;;;32439:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;;:37;;-1:-1:-1;;32439:37:0::1;::::0;::::1;;::::0;;::::1;::::0;;;32494:31;;1787:41:1;;;32494:31:0::1;::::0;1760:18:1;32494:31:0::1;1647:187:1::0;11518:244:0;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11607:22:0;::::1;11599:73;;;::::0;-1:-1:-1;;;11599:73:0;;16805:2:1;11599:73:0::1;::::0;::::1;16787:21:1::0;16844:2;16824:18;;;16817:30;16883:34;16863:18;;;16856:62;-1:-1:-1;;;16934:18:1;;;16927:36;16980:19;;11599:73:0::1;16603:402:1::0;11599:73:0::1;11709:6;::::0;11688:38:::1;::::0;-1:-1:-1;;;;;11688:38:0;;::::1;::::0;11709:6:::1;::::0;::::1;;::::0;11688:38:::1;::::0;;;::::1;11737:6;:17:::0;;-1:-1:-1;;;;;11737:17:0;;::::1;;;-1:-1:-1::0;;;;;;11737:17:0;;::::1;::::0;;;::::1;::::0;;11518:244::o;39861:504::-;11212:6;;-1:-1:-1;;;;;11212:6:0;;;;;945:10;11274:23;11266:68;;;;-1:-1:-1;;;11266:68:0;;;;;;;:::i;:::-;40000:14:::1;39981:15;;:33;;39973:71;;;::::0;-1:-1:-1;;;39973:71:0;;17212:2:1;39973:71:0::1;::::0;::::1;17194:21:1::0;17251:2;17231:18;;;17224:30;17290:27;17270:18;;;17263:55;17335:18;;39973:71:0::1;17010:349:1::0;39973:71:0::1;40083:9;::::0;-1:-1:-1;;;;;40063:29:0;;::::1;40083:9:::0;::::1;40063:29;;40055:72;;;::::0;-1:-1:-1;;;40055:72:0;;17566:2:1;40055:72:0::1;::::0;::::1;17548:21:1::0;17605:2;17585:18;;;17578:30;17644:32;17624:18;;;17617:60;17694:18;;40055:72:0::1;17364:354:1::0;40055:72:0::1;40156:22;:14:::0;40175:2:::1;40156:18;:22::i;:::-;40138:15;:40:::0;;;40208:36:::1;::::0;:15:::1;::::0;:19:::1;:36::i;:::-;40189:16;:55:::0;40255:9:::1;:37:::0;;-1:-1:-1;;;;;;40255:37:0::1;-1:-1:-1::0;;;;;40255:37:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;40320:11:0::1;::::0;;40303:14:::1;:28:::0;-1:-1:-1;40342:15:0;;39861:504::o;18713:179::-;18771:7;;18803:5;18807:1;18803;:5;:::i;:::-;18791:17;;18832:1;18827;:6;;18819:46;;;;-1:-1:-1;;;18819:46:0;;17925:2:1;18819:46:0;;;17907:21:1;17964:2;17944:18;;;17937:30;18003:29;17983:18;;;17976:57;18050:18;;18819:46:0;17723:351:1;18819:46:0;18883:1;18713:179;-1:-1:-1;;;18713:179:0:o;17224:346::-;-1:-1:-1;;;;;17326:19:0;;17318:68;;;;-1:-1:-1;;;17318:68:0;;18281:2:1;17318:68:0;;;18263:21:1;18320:2;18300:18;;;18293:30;18359:34;18339:18;;;18332:62;-1:-1:-1;;;18410:18:1;;;18403:34;18454:19;;17318:68:0;18079:400:1;17318:68:0;-1:-1:-1;;;;;17405:21:0;;17397:68;;;;-1:-1:-1;;;17397:68:0;;18686:2:1;17397:68:0;;;18668:21:1;18725:2;18705:18;;;18698:30;18764:34;18744:18;;;18737:62;-1:-1:-1;;;18815:18:1;;;18808:32;18857:19;;17397:68:0;18484:398:1;17397:68:0;-1:-1:-1;;;;;17478:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17530:32;;762:25:1;;;17530:32:0;;735:18:1;17530:32:0;;;;;;;;17224:346;;;:::o;40825:5896::-;-1:-1:-1;;;;;40957:18:0;;40949:68;;;;-1:-1:-1;;;40949:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41036:16:0;;41028:64;;;;-1:-1:-1;;;41028:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41112:20:0;;;;;;:14;:20;;;;;;;;41111:21;:45;;;;-1:-1:-1;;;;;;41138:18:0;;;;;;:14;:18;;;;;;;;41137:19;41111:45;41103:54;;;;;;11212:6;;-1:-1:-1;;;;;41174:15:0;;;11212:6;;;;;41174:15;;;;:32;;-1:-1:-1;11212:6:0;;-1:-1:-1;;;;;41193:13:0;;;11212:6;;;;;41193:13;;41174:32;:52;;;;-1:-1:-1;;;;;;41210:16:0;;;;41174:52;:77;;;;-1:-1:-1;;;;;;41230:21:0;;41244:6;41230:21;;41174:77;:100;;;;;41261:13;-1:-1:-1;;;;;41255:19:0;:2;-1:-1:-1;;;;;41255:19:0;;;41174:100;:128;;;;-1:-1:-1;;;;;;41279:23:0;;;;;;:19;:23;;;;;;;;41278:24;41174:128;:158;;;;-1:-1:-1;;;;;;41307:25:0;;;;;;:19;:25;;;;;;;;41306:26;41174:158;41170:502;;;41367:7;;-1:-1:-1;;;41367:7:0;;;;:15;;41378:4;41367:15;41359:24;;;;;;41418:7;;41408:6;:17;;41400:70;;;;-1:-1:-1;;;41400:70:0;;19899:2:1;41400:70:0;;;19881:21:1;19938:2;19918:18;;;19911:30;19977:34;19957:18;;;19950:62;-1:-1:-1;;;20028:18:1;;;20021:38;20076:19;;41400:70:0;19697:404:1;41400:70:0;41487:32;41522:13;41532:2;41522:9;:13::i;:::-;41595:10;;41487:48;;-1:-1:-1;41558:33:0;41585:6;41487:48;41558:33;:::i;:::-;:47;;41550:96;;;;-1:-1:-1;;;41550:96:0;;20308:2:1;41550:96:0;;;20290:21:1;20347:2;20327:18;;;20320:30;20386:34;20366:18;;;20359:62;-1:-1:-1;;;20437:18:1;;;20430:34;20481:19;;41550:96:0;20106:400:1;41550:96:0;41344:328;41170:502;41699:11;41696:92;;41727:28;41743:4;41749:2;41753:1;41727:15;:28::i;41696:92::-;41804:8;;-1:-1:-1;;;41804:8:0;;;;41803:9;:42;;;;-1:-1:-1;;;;;;41816:29:0;;;;;;:25;:29;;;;;;;;41803:42;:78;;;;-1:-1:-1;41865:15:0;;-1:-1:-1;;;;;41849:32:0;;;41865:15;;41849:32;;41803:78;:97;;;;-1:-1:-1;11212:6:0;;-1:-1:-1;;;;;41885:15:0;;;11212:6;;;;;41885:15;;41803:97;:114;;;;-1:-1:-1;11212:6:0;;-1:-1:-1;;;;;41904:13:0;;;11212:6;;;;;41904:13;;41803:114;:142;;;;-1:-1:-1;;;;;;41922:23:0;;;;;;:19;:23;;;;;;;;41921:24;41803:142;:172;;;;-1:-1:-1;;;;;;41950:25:0;;;;;;:19;:25;;;;;;;;41949:26;41803:172;41800:343;;;42009:7;;-1:-1:-1;;;42009:7:0;;;;:15;;42020:4;42009:15;42001:24;;;;;;42060:8;;42050:6;:18;;42042:89;;;;-1:-1:-1;;;42042:89:0;;20713:2:1;42042:89:0;;;20695:21:1;20752:2;20732:18;;;20725:30;20791:34;20771:18;;;20764:62;20862:28;20842:18;;;20835:56;20908:19;;42042:89:0;20511:422:1;42042:89:0;42149:28;42180:24;42198:4;42180:9;:24::i;:::-;42256:18;;42149:55;;-1:-1:-1;42232:42:0;;;;;;;42286:20;;-1:-1:-1;42298:8:0;;-1:-1:-1;;;42298:8:0;;;;42297:9;42286:20;:56;;;;-1:-1:-1;;;;;;42311:31:0;;;;;;:25;:31;;;;;;;;42310:32;42286:56;:83;;;;-1:-1:-1;42354:15:0;;-1:-1:-1;;;;;42346:23:0;;;42354:15;;42346:23;;42286:83;:108;;;;-1:-1:-1;42379:15:0;;-1:-1:-1;;;;;42373:21:0;;;42379:15;;42373:21;;42286:108;:135;;;;-1:-1:-1;42406:15:0;;-1:-1:-1;;;;;42398:23:0;;;42406:15;;42398:23;;42286:135;:160;;;;-1:-1:-1;42431:15:0;;-1:-1:-1;;;;;42425:21:0;;;42431:15;;42425:21;;42286:160;:188;;;;-1:-1:-1;;;;;;42451:23:0;;;;;;:19;:23;;;;;;;;42450:24;42286:188;:218;;;;-1:-1:-1;;;;;;42479:25:0;;;;;;:19;:25;;;;;;;;42478:26;42286:218;42283:2792;;;42546:26;;42590:7;;42546:26;;-1:-1:-1;;;;42590:7:0;;;;42587:806;;;42680:26;;42621:56;42680:26;42621:24;42639:4;42621:9;:24::i;:::-;:28;;:56::i;:::-;:85;42618:760;;;42755:26;;42804:89;42828:4;42835:42;42755:26;42804:15;:89::i;:::-;42923:82;;762:25:1;;;42947:42:0;;42940:4;;-1:-1:-1;;;;;;;;;;;42923:82:0;750:2:1;735:18;42923:82:0;;;;;;;42708:317;42618:760;;;43054:21;43078:56;43107:26;;43078:24;43096:4;43078:9;:24::i;:56::-;43054:80;;43157:89;43181:4;43188:42;43232:13;43157:15;:89::i;:::-;43276:82;;762:25:1;;;43300:42:0;;43293:4;;-1:-1:-1;;;;;;;;;;;43276:82:0;750:2:1;735:18;43276:82:0;;;;;;;43031:347;42618:760;43401:18;43425;43446:78;43512:11;;43446:61;43489:17;;43446:38;43468:15;;43446:17;;:21;;:38;;;;:::i;:::-;:42;;:61::i;:78::-;43425:99;;43530:23;43556:59;43604:10;43556:43;43581:17;;43556:20;:24;;:43;;;;:::i;:::-;:47;;:59::i;:::-;43530:85;-1:-1:-1;43621:12:0;43636:22;43530:85;43656:1;43636:19;:22::i;:::-;43621:37;-1:-1:-1;43664:17:0;43684:25;:15;43621:37;43684:19;:25::i;:::-;43738:8;:15;;-1:-1:-1;;;;43738:15:0;-1:-1:-1;;;43738:15:0;;;:8;43786:17;43664:45;;-1:-1:-1;43786:21:0;43782:445;;43839:30;:20;43864:4;43839:24;:30::i;:::-;43826:43;;43884:28;43901:10;43884:16;:28::i;:::-;43927:23;43953:60;44002:10;43953:44;43979:17;;43953:21;:25;;:44;;;;:::i;:60::-;44053:15;;43927:86;;-1:-1:-1;44028:59:0;;-1:-1:-1;;;;;44053:15:0;43927:86;44028:16;:59::i;:::-;44133:15;;44176:17;;-1:-1:-1;;;;;44133:15:0;;;;44126:4;;-1:-1:-1;;;;;;;;;;;44109:102:0;44150:60;;44199:10;;44150:44;;:21;;:25;:44::i;:60::-;44109:102;;762:25:1;;;750:2;735:18;44109:102:0;;;;;;;43809:418;43782:445;44247:11;;:15;44243:294;;44281:22;:20;:22::i;:::-;44318:17;44338:54;44381:10;44338:38;44364:11;;44338:21;:25;;:38;;;;:::i;:54::-;44432:9;;44318:74;;-1:-1:-1;44407:47:0;;-1:-1:-1;;;;;44432:9:0;44318:74;44407:16;:47::i;:::-;44500:9;;44476:45;;762:25:1;;;-1:-1:-1;;;;;44500:9:0;;;;44493:4;;-1:-1:-1;;;;;;;;;;;44476:45:0;750:2:1;735:18;44476:45:0;;;;;;;44264:273;44243:294;44548:17;;:21;44544:300;;44589:18;44610:60;44659:10;44610:44;44636:17;;44610:21;:25;;:44;;;;:::i;:60::-;44589:81;;44732:30;44745:4;44751:10;44732:12;:30::i;:::-;44785:43;;;21140:25:1;;;21196:2;21181:18;;21174:34;;;21224:18;;;21217:34;;;44785:43:0;;21128:2:1;21113:18;44785:43:0;;;;;;;44571:273;44544:300;44858:15;;:19;44854:174;;44890:18;44911:63;44963:10;44911:47;44942:15;;44911:26;;:30;;:47;;;;:::i;:63::-;44890:84;;44989:32;45010:10;44989:20;:32::i;:::-;44879:149;44854:174;-1:-1:-1;;45047:8:0;:16;;-1:-1:-1;;;;45047:16:0;;;-1:-1:-1;;;42283:2792:0;45103:8;;-1:-1:-1;;;;;45212:25:0;;45087:12;45212:25;;;:19;:25;;;;;;45103:8;-1:-1:-1;;;45103:8:0;;;;;45102:9;;45212:25;;:52;;-1:-1:-1;;;;;;45241:23:0;;;;;;:19;:23;;;;;;;;45212:52;45209:99;;;-1:-1:-1;45291:5:0;45209:99;45323:7;45320:659;;;45347:15;45365:33;45394:3;45365:24;45376:12;;45365:6;:10;;:24;;;;:::i;:33::-;45347:51;;45413:16;45432:34;45462:3;45432:25;45443:13;;45432:6;:10;;:25;;;;:::i;:34::-;45413:53;;45516:13;-1:-1:-1;;;;;45510:19:0;:2;-1:-1:-1;;;;;45510:19:0;;45507:459;;;45559:20;:6;45570:8;45559:10;:20::i;:::-;45550:29;;45598:46;45614:4;45628;45635:8;45598:15;:46::i;:::-;45663:33;45679:4;45685:2;45689:6;45663:15;:33::i;:::-;45507:459;;;45815:19;:6;45826:7;45815:10;:19::i;:::-;45806:28;;45853:45;45869:4;45883;45890:7;45853:15;:45::i;:::-;45917:33;45933:4;45939:2;45943:6;45917:15;:33::i;:::-;45332:647;;45320:659;-1:-1:-1;;;;;46079:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;46108:23:0;;;;;;:19;:23;;;;;;;;46079:52;46076:119;;;46148:33;46164:4;46170:2;46174:6;46148:15;:33::i;:::-;46211:15;;-1:-1:-1;;;;;46211:15:0;:26;46246:4;46253:15;46246:4;46253:9;:15::i;:::-;46211:58;;-1:-1:-1;;;;;;46211:58:0;;;;;;;-1:-1:-1;;;;;8096:32:1;;;46211:58:0;;;8078:51:1;8145:18;;;8138:34;8051:18;;46211:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46207:74;46295:15;;-1:-1:-1;;;;;46295:15:0;:26;46330:2;46335:13;46330:2;46335:9;:13::i;:::-;46295:54;;-1:-1:-1;;;;;;46295:54:0;;;;;;;-1:-1:-1;;;;;8096:32:1;;;46295:54:0;;;8078:51:1;8145:18;;;8138:34;8051:18;;46295:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46291:70;46377:8;;-1:-1:-1;;;46377:8:0;;;;46373:341;;46416:16;;46453:15;;:28;;-1:-1:-1;;;;;;46453:28:0;;;;;762:25:1;;;-1:-1:-1;;;;;46453:15:0;;;;:23;;735:18:1;;46453:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;46453:28:0;;;;;;;;-1:-1:-1;;46453:28:0;;;;;;;;;;;;:::i;:::-;;;46449:254;;;;;46579:86;;;10390:25:1;;;10446:2;10431:18;;10424:34;;;10474:18;;;10467:34;;;10532:2;10517:18;;10510:34;;;46655:9:0;;46644:4;;46579:86;;10377:3:1;10362:19;46579:86:0;;;;;;;46482:199;;;46449:254;46387:327;46373:341;40938:5783;;;40825:5896;;;:::o;19614:166::-;19700:7;19736:12;19728:6;;;;19720:29;;;;-1:-1:-1;;;19720:29:0;;;;;;;;:::i;:::-;-1:-1:-1;19767:5:0;19771:1;19767;:5;:::i;:::-;19760:12;19614:166;-1:-1:-1;;;;19614:166:0:o;34753:230::-;34909:20;;34895:13;:34;34887:43;;;;;;34941:20;:34;34753:230::o;50650:242::-;50705:74;50768:10;;50705:58;50746:16;;50705:36;50724:16;;50705:14;;:18;;:36;;;;:::i;:74::-;50690:12;:89;;;;50806:78;50872:11;;50806:61;50849:17;;50806:38;50826:17;;50806:15;;:19;;:38;;;;:::i;:78::-;50790:13;:94;50650:242::o;15865:539::-;-1:-1:-1;;;;;15971:20:0;;15963:70;;;;-1:-1:-1;;;15963:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16052:23:0;;16044:71;;;;-1:-1:-1;;;16044:71:0;;;;;;;:::i;:::-;16208;16230:6;16208:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16208:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;16188:17:0;;;:9;:17;;;;;;;;;;;:91;;;;16313:20;;;;;;;:32;;16338:6;16313:24;:32::i;:::-;-1:-1:-1;;;;;16290:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;16361:35;762:25:1;;;16290:20:0;;16361:35;;;;-1:-1:-1;;;;;;;;;;;16361:35:0;735:18:1;16361:35:0;616:177:1;33123:405:0;-1:-1:-1;;;;;33214:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;33206:115;;;;-1:-1:-1;;;33206:115:0;;21759:2:1;33206:115:0;;;21741:21:1;21798:2;21778:18;;;21771:30;21837:34;21817:18;;;21810:62;21908:32;21888:18;;;21881:60;21958:19;;33206:115:0;21557:426:1;33206:115:0;-1:-1:-1;;;;;33332:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;33332:39:0;;;;;;;;;;;;33384:79;;33409:15;;:42;;-1:-1:-1;;;33409:42:0;;-1:-1:-1;;;;;2029:32:1;;;33409:42:0;;;2011:51:1;33409:15:0;;;;:36;;1984:18:1;;33409:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33384:79;33480:40;;;;;;-1:-1:-1;;;;;33480:40:0;;;;;;;;33123:405;;:::o;19066:220::-;19124:7;19148:6;19144:20;;-1:-1:-1;19163:1:0;19156:8;;19144:20;19175:9;19187:5;19191:1;19187;:5;:::i;:::-;19175:17;-1:-1:-1;19220:1:0;19211:5;19215:1;19175:17;19211:5;:::i;:::-;:10;19203:56;;;;-1:-1:-1;;;19203:56:0;;22190:2:1;19203:56:0;;;22172:21:1;22229:2;22209:18;;;22202:30;22268:34;22248:18;;;22241:62;-1:-1:-1;;;22319:18:1;;;22312:31;22360:19;;19203:56:0;21988:397:1;18900:158:0;18958:7;18991:1;18986;:6;;18978:49;;;;-1:-1:-1;;;18978:49:0;;22592:2:1;18978:49:0;;;22574:21:1;22631:2;22611:18;;;22604:30;22670:32;22650:18;;;22643:60;22720:18;;18978:49:0;22390:354:1;18978:49:0;19045:5;19049:1;19045;:5;:::i;19294:153::-;19352:7;19384:1;19380;:5;19372:44;;;;-1:-1:-1;;;19372:44:0;;22951:2:1;19372:44:0;;;22933:21:1;22990:2;22970:18;;;22963:30;23029:28;23009:18;;;23002:56;23075:18;;19372:44:0;22749:350:1;19372:44:0;19434:5;19438:1;19434;:5;:::i;46727:591::-;46879:16;;;46893:1;46879:16;;;;;;;;46855:21;;46879:16;;;;;;;;;;-1:-1:-1;46879:16:0;46855:40;;46924:4;46906;46911:1;46906:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46906:23:0;;;:7;;;;;;;;;;:23;;;;46950:15;;:22;;;-1:-1:-1;;;46950:22:0;;;;:15;;;;;:20;;:22;;;;;46906:7;;46950:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46940:4;46945:1;46940:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46940:32:0;;;:7;;;;;;;;;:32;47017:15;;46985:62;;47002:4;;47017:15;47035:11;46985:8;:62::i;:::-;47086:15;;:224;;-1:-1:-1;;;47086:224:0;;-1:-1:-1;;;;;47086:15:0;;;;:66;;:224;;47167:11;;47086:15;;47237:4;;47264;;47284:15;;47086:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51555:122;51643:26;;-1:-1:-1;;;;;51643:18:0;;;:26;;;;;51662:6;;51643:26;;;;51662:6;51643:18;:26;;;;;;;;;;;;;;;;;;;40524:293;40598:16;;40579:15;:35;40576:217;;40524:293::o;40576:217::-;40668:10;;40655:9;;-1:-1:-1;;;;;40655:9:0;;;40668:10;;40655:23;40651:142;;40707:10;;40695:9;:22;;-1:-1:-1;;;;;;40695:22:0;-1:-1:-1;;;;;40707:10:0;;;40695:22;;;;;;40746:14;;40732:11;:28;40524:293::o;47919:520::-;48101:15;;48069:62;;48086:4;;-1:-1:-1;;;;;48101:15:0;48119:11;48069:8;:62::i;:::-;48173:15;;:258;;-1:-1:-1;;;48173:258:0;;48245:4;48173:258;;;24630:34:1;;;24680:18;;;24673:34;;;48173:15:0;24723:18:1;;;24716:34;;;24766:18;;;24759:34;24809:19;;;24802:44;48405:15:0;24862:19:1;;;24855:35;-1:-1:-1;;;;;48173:15:0;;;;:31;;48212:9;;24564:19:1;;48173:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48447:366::-;48512:32;48538:4;48512:17;:32::i;:::-;48582:14;;48575:47;;-1:-1:-1;;;48575:47:0;;48616:4;48575:47;;;2011:51:1;48555:17:0;;-1:-1:-1;;;;;48582:14:0;;48575:32;;1984:18:1;;48575:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48655:14;;48688:15;;48648:68;;-1:-1:-1;;;48648:68:0;;-1:-1:-1;;;;;48688:15:0;;;48648:68;;;8078:51:1;8145:18;;;8138:34;;;48555:67:0;;-1:-1:-1;48633:12:0;;48655:14;;;48648:31;;8051:18:1;;48648:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48633:83;;48733:7;48729:77;;;48762:32;;;25075:25:1;;;25131:2;25116:18;;25109:34;;;48762:32:0;;25048:18:1;48762:32:0;24901:248:1;47326:585:0;47479:16;;;47493:1;47479:16;;;;;;;;47455:21;;47479:16;;;;;;;;-1:-1:-1;;47516:15:0;;:22;;;-1:-1:-1;;;47516:22:0;;;;47455:40;;-1:-1:-1;;;;;;47516:15:0;;;;:20;;-1:-1:-1;47516:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47506:4;47511:1;47506:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47506:32:0;;;:7;;;;;;;;;:32;47559:14;;47549:7;;47559:14;;;47549:4;;47559:14;;47549:7;;;;;;:::i;:::-;-1:-1:-1;;;;;47549:24:0;;;:7;;;;;;;;;:24;47618:15;;47586:72;;47603:4;;47618:15;47636:21;47586:8;:72::i;:::-;47697:15;;-1:-1:-1;;;;;47697:15:0;:66;47771:21;47697:15;47825:4;47844:9;47868:24;:15;47888:3;47868:19;:24::i;:::-;47697:206;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:597:1;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;798:131::-;-1:-1:-1;;;;;873:31:1;;863:42;;853:70;;919:1;916;909:12;934:388;1002:6;1010;1063:2;1051:9;1042:7;1038:23;1034:32;1031:52;;;1079:1;1076;1069:12;1031:52;1118:9;1105:23;1137:31;1162:5;1137:31;:::i;:::-;1187:5;-1:-1:-1;1244:2:1;1229:18;;1216:32;1257:33;1216:32;1257:33;:::i;:::-;1309:7;1299:17;;;934:388;;;;;:::o;1327:315::-;1395:6;1403;1456:2;1444:9;1435:7;1431:23;1427:32;1424:52;;;1472:1;1469;1462:12;1424:52;1511:9;1498:23;1530:31;1555:5;1530:31;:::i;:::-;1580:5;1632:2;1617:18;;;;1604:32;;-1:-1:-1;;;1327:315:1:o;2073:180::-;2132:6;2185:2;2173:9;2164:7;2160:23;2156:32;2153:52;;;2201:1;2198;2191:12;2153:52;-1:-1:-1;2224:23:1;;2073:180;-1:-1:-1;2073:180:1:o;2258:247::-;2317:6;2370:2;2358:9;2349:7;2345:23;2341:32;2338:52;;;2386:1;2383;2376:12;2338:52;2425:9;2412:23;2444:31;2469:5;2444:31;:::i;2510:456::-;2587:6;2595;2603;2656:2;2644:9;2635:7;2631:23;2627:32;2624:52;;;2672:1;2669;2662:12;2624:52;2711:9;2698:23;2730:31;2755:5;2730:31;:::i;:::-;2780:5;-1:-1:-1;2837:2:1;2822:18;;2809:32;2850:33;2809:32;2850:33;:::i;:::-;2510:456;;2902:7;;-1:-1:-1;;;2956:2:1;2941:18;;;;2928:32;;2510:456::o;2971:248::-;3039:6;3047;3100:2;3088:9;3079:7;3075:23;3071:32;3068:52;;;3116:1;3113;3106:12;3068:52;-1:-1:-1;;3139:23:1;;;3209:2;3194:18;;;3181:32;;-1:-1:-1;2971:248:1:o;3468:118::-;3554:5;3547:13;3540:21;3533:5;3530:32;3520:60;;3576:1;3573;3566:12;3591:241;3647:6;3700:2;3688:9;3679:7;3675:23;3671:32;3668:52;;;3716:1;3713;3706:12;3668:52;3755:9;3742:23;3774:28;3796:5;3774:28;:::i;4026:156::-;4092:20;;4152:4;4141:16;;4131:27;;4121:55;;4172:1;4169;4162:12;4121:55;4026:156;;;:::o;4187:393::-;4265:6;4273;4281;4289;4342:3;4330:9;4321:7;4317:23;4313:33;4310:53;;;4359:1;4356;4349:12;4310:53;4382:27;4399:9;4382:27;:::i;:::-;4372:37;;4428:36;4460:2;4449:9;4445:18;4428:36;:::i;:::-;4418:46;;4483:36;4515:2;4504:9;4500:18;4483:36;:::i;:::-;4473:46;;4538:36;4570:2;4559:9;4555:18;4538:36;:::i;:::-;4528:46;;4187:393;;;;;;;:::o;4793:382::-;4858:6;4866;4919:2;4907:9;4898:7;4894:23;4890:32;4887:52;;;4935:1;4932;4925:12;4887:52;4974:9;4961:23;4993:31;5018:5;4993:31;:::i;:::-;5043:5;-1:-1:-1;5100:2:1;5085:18;;5072:32;5113:30;5072:32;5113:30;:::i;5886:750::-;5978:6;5986;5994;6047:2;6035:9;6026:7;6022:23;6018:32;6015:52;;;6063:1;6060;6053:12;6015:52;6103:9;6090:23;6132:18;6173:2;6165:6;6162:14;6159:34;;;6189:1;6186;6179:12;6159:34;6227:6;6216:9;6212:22;6202:32;;6272:7;6265:4;6261:2;6257:13;6253:27;6243:55;;6294:1;6291;6284:12;6243:55;6334:2;6321:16;6360:2;6352:6;6349:14;6346:34;;;6376:1;6373;6366:12;6346:34;6431:7;6424:4;6414:6;6411:1;6407:14;6403:2;6399:23;6395:34;6392:47;6389:67;;;6452:1;6449;6442:12;6389:67;6483:4;6475:13;;;;-1:-1:-1;6507:6:1;-1:-1:-1;;6548:20:1;;6535:34;6578:28;6535:34;6578:28;:::i;:::-;6625:5;6615:15;;;5886:750;;;;;:::o;6641:323::-;6717:6;6725;6778:2;6766:9;6757:7;6753:23;6749:32;6746:52;;;6794:1;6791;6784:12;6746:52;6830:9;6817:23;6807:33;;6890:2;6879:9;6875:18;6862:32;6903:31;6928:5;6903:31;:::i;6969:356::-;7171:2;7153:21;;;7190:18;;;7183:30;7249:34;7244:2;7229:18;;7222:62;7316:2;7301:18;;6969:356::o;7330:380::-;7409:1;7405:12;;;;7452;;;7473:61;;7527:4;7519:6;7515:17;7505:27;;7473:61;7580:2;7572:6;7569:14;7549:18;7546:38;7543:161;;;7626:10;7621:3;7617:20;7614:1;7607:31;7661:4;7658:1;7651:15;7689:4;7686:1;7679:15;7543:161;;7330:380;;;:::o;7715:184::-;7785:6;7838:2;7826:9;7817:7;7813:23;7809:32;7806:52;;;7854:1;7851;7844:12;7806:52;-1:-1:-1;7877:16:1;;7715:184;-1:-1:-1;7715:184:1:o;8183:245::-;8250:6;8303:2;8291:9;8282:7;8278:23;8274:32;8271:52;;;8319:1;8316;8309:12;8271:52;8351:9;8345:16;8370:28;8392:5;8370:28;:::i;8433:127::-;8494:10;8489:3;8485:20;8482:1;8475:31;8525:4;8522:1;8515:15;8549:4;8546:1;8539:15;8565:168;8605:7;8671:1;8667;8663:6;8659:14;8656:1;8653:21;8648:1;8641:9;8634:17;8630:45;8627:71;;;8678:18;;:::i;:::-;-1:-1:-1;8718:9:1;;8565:168::o;8738:128::-;8778:3;8809:1;8805:6;8802:1;8799:13;8796:39;;;8815:18;;:::i;:::-;-1:-1:-1;8851:9:1;;8738:128::o;9216:217::-;9256:1;9282;9272:132;;9326:10;9321:3;9317:20;9314:1;9307:31;9361:4;9358:1;9351:15;9389:4;9386:1;9379:15;9272:132;-1:-1:-1;9418:9:1;;9216:217::o;9438:405::-;9640:2;9622:21;;;9679:2;9659:18;;;9652:30;9718:34;9713:2;9698:18;;9691:62;-1:-1:-1;;;9784:2:1;9769:18;;9762:39;9833:3;9818:19;;9438:405::o;9848:306::-;9936:6;9944;9952;10005:2;9993:9;9984:7;9980:23;9976:32;9973:52;;;10021:1;10018;10011:12;9973:52;10050:9;10044:16;10034:26;;10100:2;10089:9;10085:18;10079:25;10069:35;;10144:2;10133:9;10129:18;10123:25;10113:35;;9848:306;;;;;:::o;11821:251::-;11891:6;11944:2;11932:9;11923:7;11919:23;11915:32;11912:52;;;11960:1;11957;11950:12;11912:52;11992:9;11986:16;12011:31;12036:5;12011:31;:::i;13460:681::-;13591:6;13599;13607;13615;13623;13631;13639;13647;13700:3;13688:9;13679:7;13675:23;13671:33;13668:53;;;13717:1;13714;13707:12;13668:53;13749:9;13743:16;13768:31;13793:5;13768:31;:::i;:::-;13818:5;13808:15;;;13863:2;13852:9;13848:18;13842:25;13832:35;;13907:2;13896:9;13892:18;13886:25;13876:35;;13951:2;13940:9;13936:18;13930:25;13920:35;;13995:3;13984:9;13980:19;13974:26;13964:36;;14040:3;14029:9;14025:19;14019:26;14009:36;;14085:3;14074:9;14070:19;14064:26;14054:36;;14130:3;14119:9;14115:19;14109:26;14099:36;;13460:681;;;;;;;;;;;:::o;14563:125::-;14603:4;14631:1;14628;14625:8;14622:34;;;14636:18;;:::i;:::-;-1:-1:-1;14673:9:1;;14563:125::o;14693:127::-;14754:10;14749:3;14745:20;14742:1;14735:31;14785:4;14782:1;14775:15;14809:4;14806:1;14799:15;14825:135;14864:3;-1:-1:-1;;14885:17:1;;14882:43;;;14905:18;;:::i;:::-;-1:-1:-1;14952:1:1;14941:13;;14825:135::o;14965:794::-;15187:2;15199:21;;;15172:18;;15255:22;;;15139:4;15334:6;15308:2;15293:18;;15139:4;15368:304;15382:6;15379:1;15376:13;15368:304;;;15457:6;15444:20;15477:31;15502:5;15477:31;:::i;:::-;-1:-1:-1;;;;;15533:31:1;15521:44;;15588:4;15647:15;;;;15612:12;;;;15561:1;15397:9;15368:304;;;15372:3;15689;15681:11;;;;15744:6;15737:14;15730:22;15723:4;15712:9;15708:20;15701:52;14965:794;;;;;;:::o;18887:401::-;19089:2;19071:21;;;19128:2;19108:18;;;19101:30;19167:34;19162:2;19147:18;;19140:62;-1:-1:-1;;;19233:2:1;19218:18;;19211:35;19278:3;19263:19;;18887:401::o;19293:399::-;19495:2;19477:21;;;19534:2;19514:18;;;19507:30;19573:34;19568:2;19553:18;;19546:62;-1:-1:-1;;;19639:2:1;19624:18;;19617:33;19682:3;19667:19;;19293:399::o;23236:461::-;23289:3;23327:5;23321:12;23354:6;23349:3;23342:19;23380:4;23409:2;23404:3;23400:12;23393:19;;23446:2;23439:5;23435:14;23467:1;23477:195;23491:6;23488:1;23485:13;23477:195;;;23556:13;;-1:-1:-1;;;;;23552:39:1;23540:52;;23612:12;;;;23647:15;;;;23588:1;23506:9;23477:195;;;-1:-1:-1;23688:3:1;;23236:461;-1:-1:-1;;;;;23236:461:1:o;23702:582::-;24001:6;23990:9;23983:25;24044:6;24039:2;24028:9;24024:18;24017:34;24087:3;24082:2;24071:9;24067:18;24060:31;23964:4;24108:57;24160:3;24149:9;24145:19;24137:6;24108:57;:::i;:::-;-1:-1:-1;;;;;24201:32:1;;;;24196:2;24181:18;;24174:60;-1:-1:-1;24265:3:1;24250:19;24243:35;24100:65;23702:582;-1:-1:-1;;;23702:582:1:o;25154:510::-;25425:6;25414:9;25407:25;25468:3;25463:2;25452:9;25448:18;25441:31;25388:4;25489:57;25541:3;25530:9;25526:19;25518:6;25489:57;:::i;:::-;-1:-1:-1;;;;;25582:32:1;;;;25577:2;25562:18;;25555:60;-1:-1:-1;25646:2:1;25631:18;25624:34;25481:65;25154:510;-1:-1:-1;;25154:510:1:o

Swarm Source

ipfs://0cc605fca0bfb169f76ccb2be8f1a6dae533b4a317724a8d7b090acab2dce1a5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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