ETH Price: $3,455.54 (+1.00%)
Gas: 9 Gwei

Token

Poolgenics (PLGN)
 

Overview

Max Total Supply

1,000,000,000 PLGN

Holders

48

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,758,928.918373585166239354 PLGN

Value
$0.00
0x4e947f0f67913969e9c0a92253a9ab9696ad8171
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:
Poolgenics

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-18
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
 
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;
    }
}
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 IERC20 {
    function totalSupply() external view returns (uint256);
 
    function balanceOf(address account) external view returns (uint256);
 
    function transfer(address recipient, uint256 amount) external returns (bool);
 
    function allowance(address owner, address spender) external view returns (uint256);
 
    function approve(address spender, uint256 amount) external returns (bool);
 
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
 
    event Transfer(address indexed from, address indexed to, uint256 value);
 
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
 
contract 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 { }
}
 
 
interface IDividendPayingToken {
  function dividendOf(address _owner) external view returns(uint256);
 
  function withdrawDividend() external;
 
  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );
 
  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );
}
 
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);
}
 
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 dividendToken;
 
 
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;
  mapping(address => bool) _isAuth;
 
  uint256 public totalDividendsDistributed;
 
  modifier onlyAuth() {
    require(_isAuth[msg.sender], "Auth: caller is not the authorized");
    _;
  }
 
  constructor(string memory _name, string memory _symbol, address _token) ERC20(_name, _symbol) {
    dividendToken = _token;
    _isAuth[msg.sender] = true;
  }
 
  function setAuth(address account) external onlyOwner{
      _isAuth[account] = true;
  }
 
 
  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 {
    _withdrawDividendOfUser(payable(msg.sender));
  }
 
  function setDividendTokenAddress(address newToken) external virtual onlyOwner{
      dividendToken = newToken;
  }
 
  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(dividendToken).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);
    }
  }
}
 
////////////////////////////////
///////// Interfaces ///////////
////////////////////////////////
 
interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
 
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
 
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
 
    function createPair(address tokenA, address tokenB) external returns (address pair);
 
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}
 
interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);
 
    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
 
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
 
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
 
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
 
    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);
 
    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);
 
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;
 
    function initialize(address, address) external;
}
 
interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
 
    function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); 
function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); 
function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); 
function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); 
function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); 
function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); 
function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); 
function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); 
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); 
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); 
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); 
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); 
 
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
 
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); 
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); 
 
 
function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; 
function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; 
function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; 
 
}
 
////////////////////////////////
////////// Libraries ///////////
////////////////////////////////
 
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();
    }
}
 
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) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }
 
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        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;
    }
}
 
library SafeMathInt {
  function mul(int256 a, int256 b) internal pure returns (int256) {
    // Prevent overflow when multiplying INT256_MIN with -1
    // https://github.com/RequestNetwork/requestNetwork/issues/43
    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) {
    // Prevent overflow when dividing INT256_MIN by -1
    // https://github.com/RequestNetwork/requestNetwork/issues/43
    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;
  }
}
 
////////////////////////////////
/////////// Tokens /////////////
////////////////////////////////
 
 
contract USDCDividendTracker is 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 => uint256) public lastClaimTimes;
 
    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;
 
    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
 
    event Claim(address indexed account, uint256 amount, bool indexed automatic);
 
    constructor(address _dividentToken) DividendPayingToken("Poolgenics_Usdc_Dividend_Tracker", "Poolgenics_Usdc_Dividend_Tracker",_dividentToken) {
    	claimWait = 3600;
        minimumTokenBalanceForDividends = 1000 * (10**18); //must hold 3,000,000,000+ tokens
    }
 
    function _transfer(address, address, uint256) pure internal override {
        require(false, "Poolgenics_Usdc_Dividend_Tracker: No transfers allowed");
    }
 
    function withdrawDividend() pure public override {
        require(false, "Poolgenics_Usdc_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main Poolgenics contract.");
    }
 
    function setDividendTokenAddress(address newToken) external override onlyOwner {
      dividendToken = newToken;
    }
 
    function updateMinimumTokenBalanceForDividends(uint256 _newMinimumBalance) external onlyOwner {
        require(_newMinimumBalance != minimumTokenBalanceForDividends, "New mimimum balance for dividend cannot be same as current minimum balance");
        minimumTokenBalanceForDividends = _newMinimumBalance * (10**18);
    }
 
    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 >= 3600 && newClaimWait <= 86400, "Poolgenics_Usdc_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "Poolgenics_Usdc_Dividend_Tracker: Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }
 
    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;
 
    	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;
    }
}

contract Poolgenics is ERC20, Ownable {
    using SafeMath for uint256;
 
    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;
 
    address public usdcDividendToken;
    address public deadAddress = 0x000000000000000000000000000000000000dEaD;
 
    bool private swapping;
    bool public tradingIsEnabled = true;
    bool public marketingEnabled = true;
    bool public swapAndLiquifyEnabled = true;
    bool public usdcDividendEnabled = true;

 
    USDCDividendTracker public usdcDividendTracker;
    
    address public marketingWallet;
 
    uint256 public maxBuyTranscationAmount = 10000000 * (10**18);
    uint256 public maxSellTransactionAmount = 2000000 * (10**18);
    uint256 public maxWalletBalance = 1000000000 * (10**18);
    uint256 public swapTokensAtAmount = 100000 * 10**18;
 
    uint256 public liquidityFee;
    uint256 public previousLiquidityFee;

    uint256 public usdcDividendRewardsFee;
    uint256 public previousUsdcDividendRewardsFee;

    uint256 public marketingFee;
    uint256 public previousMarketingFee;

    uint256 public totalFees = usdcDividendRewardsFee.add(marketingFee).add(liquidityFee);
    
    uint256 public _usdcDividendRewardsFeeBuy = 2;
    uint256 public _marketingFeeBuy = 8;
    uint256 public _LpFeeBuy = 0;

    uint256 public _usdcDividendRewardsFeeSell=2;
    uint256 public _LpFeeSell=0;
    uint256 public _marketingFeeSell=8;  
 
    uint256 public usdcDividedRewardsInContract;
    uint256 public tokensForLpInContract;

    uint256 public sellFeeIncreaseFactor = 130;
 
    uint256 public gasForProcessing = 600000;
 
    mapping (address => bool) private isExcludedFromFees;
 
    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;
 
    event UpdateusdcDividendTracker(address indexed newAddress, address indexed oldAddress);
    
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
 
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event MarketingEnabledUpdated(bool enabled);
    event UsdcDividendEnabledUpdated(bool enabled);
    
 
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
 
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
 
    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 amount
    );
 
    event ProcessedusdcDividendTracker(
    	uint256 iterations,
    	uint256 claims,
        uint256 lastProcessedIndex,
    	bool indexed automatic,
    	uint256 gas,
    	address indexed processor
    );
 
   

    constructor() ERC20("Poolgenics", "PLGN") {
        	
    	marketingWallet = 0xBfCa7e7387f60Eb8cdF48A0692D5A5076B421F2D; 
    	usdcDividendToken = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; 

        usdcDividendTracker = new USDCDividendTracker(usdcDividendToken);

    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
         // 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);
 
        excludeFromDividend(address(usdcDividendTracker));
        excludeFromDividend(address(this));
        excludeFromDividend(address(_uniswapV2Router));
        excludeFromDividend(deadAddress);
 
        // exclude from paying fees or having max transaction amount
        excludeFromFees(marketingWallet, true);
        excludeFromFees(address(this), true);
        excludeFromFees(deadAddress, true);
        excludeFromFees(owner(), true);
 
        setAuthOnDividends(owner());
 
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), 1000000000 * (10**18));
    }
 
    receive() external payable {
 
  	}
       mapping (address => bool) private _isBlackListedBot;
    address[] private _blackListedBots;
 
  	function prepareForPartherOrExchangeListing(address _partnerOrExchangeAddress) external onlyOwner {
  	    usdcDividendTracker.excludeFromDividends(_partnerOrExchangeAddress);
        excludeFromFees(_partnerOrExchangeAddress, true);
  	}
 
  	function setWalletBalance(uint256 _maxWalletBalance) external onlyOwner{
  	    maxWalletBalance = _maxWalletBalance;
  	}
 
  	function setMaxBuyTransaction(uint256 _maxTxn) external onlyOwner {
  	    maxBuyTranscationAmount = _maxTxn * (10**18);
  	}

    
  	function setMaxSellTransaction(uint256 _maxTxn) external onlyOwner {
  	    maxSellTransactionAmount = _maxTxn * (10**18);
  	}
 
 
  	function updateUsdcDividendToken(address _newContract) external onlyOwner {
  	    usdcDividendToken = _newContract;
  	    usdcDividendTracker.setDividendTokenAddress(_newContract);
  	}
 
  	function updateMarketingWallet(address _newWallet) external onlyOwner {
  	    require(_newWallet != marketingWallet, "Poolgenics: The marketing wallet is already this address");
        excludeFromFees(_newWallet, true);
        emit MarketingWalletUpdated(marketingWallet, _newWallet);
  	    marketingWallet = _newWallet;
  	}
 
  	function setSwapTokensAtAmount(uint256 _swapAmount) external onlyOwner {
  	    swapTokensAtAmount = _swapAmount * (10**18);
  	}
 
  	function setSellTransactionMultiplier(uint256 _multiplier) external onlyOwner {
  	    sellFeeIncreaseFactor = _multiplier;
  	}
 
 
    function setTradingIsEnabled(bool _enabled) external onlyOwner {
        tradingIsEnabled = _enabled;
    }
 
    function setAuthOnDividends(address account) public onlyOwner {
        usdcDividendTracker.setAuth(account);
    }
 
    function setUsdcDividendEnabled(bool _enabled) external onlyOwner {
        require(usdcDividendEnabled != _enabled, "Can't set flag to same status");
        if (_enabled == false) {
            previousUsdcDividendRewardsFee = usdcDividendRewardsFee;
            usdcDividendRewardsFee = 0;
            usdcDividendEnabled = _enabled;
        }
 
        emit UsdcDividendEnabledUpdated(_enabled);
    }
 
 
    function setMarketingEnabled(bool _enabled) external onlyOwner {
        require(marketingEnabled != _enabled, "Can't set flag to same status");
        if (_enabled == false) {
            previousMarketingFee = marketingFee;
            marketingFee = 0;
            marketingEnabled = _enabled;
        } 
 
        emit MarketingEnabledUpdated(_enabled);
    }
 
    function setSwapAndLiquifyEnabled(bool _enabled) external onlyOwner {
        require(swapAndLiquifyEnabled != _enabled, "Can't set flag to same status");
        if (_enabled == false) {
            previousLiquidityFee = liquidityFee;
            liquidityFee = 0;
            swapAndLiquifyEnabled = _enabled;
        } 
 
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }
 
 
    function updateusdcDividendTracker(address newAddress) external onlyOwner {
        require(newAddress != address(usdcDividendTracker), "Poolgenics: The dividend tracker already has that address");
 
        USDCDividendTracker newusdcDividendTracker = USDCDividendTracker(payable(newAddress));
 
        require(newusdcDividendTracker.owner() == address(this), "Poolgenics: The new dividend tracker must be owned by the Poolgenics token contract");
 
        newusdcDividendTracker.excludeFromDividends(address(newusdcDividendTracker));
        newusdcDividendTracker.excludeFromDividends(address(this));
        newusdcDividendTracker.excludeFromDividends(address(uniswapV2Router));
        newusdcDividendTracker.excludeFromDividends(address(deadAddress));
 
        emit UpdateusdcDividendTracker(newAddress, address(usdcDividendTracker));
 
        usdcDividendTracker = newusdcDividendTracker;
    }
 
    function updateUniswapV2Router(address newAddress) external onlyOwner {
        require(newAddress != address(uniswapV2Router), "Poolgenics: 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, "Poolgenics: Account is already exluded from fees");
        isExcludedFromFees[account] = excluded;
 
        emit ExcludeFromFees(account, excluded);
    }
 
    function excludeFromDividend(address account) public onlyOwner {
        usdcDividendTracker.excludeFromDividends(address(account));
       
    }
 
    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "Poolgenics: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");
 
        _setAutomatedMarketMakerPair(pair, value);
    }
 
    function _setAutomatedMarketMakerPair(address pair, bool value) private onlyOwner {
        require(automatedMarketMakerPairs[pair] != value, "Poolgenics: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;
 
        if(value) {
            usdcDividendTracker.excludeFromDividends(pair);
          
        }
 
        emit SetAutomatedMarketMakerPair(pair, value);
    }
 
    function updateGasForProcessing(uint256 newValue) external onlyOwner {
        require(newValue != gasForProcessing, "Poolgenics: Cannot update gasForProcessing to same value");
        gasForProcessing = newValue;
        emit GasForProcessingUpdated(newValue, gasForProcessing);
    }
 
    function updateMinimumBalanceForDividends(uint256 newMinimumBalance) external onlyOwner {
        usdcDividendTracker.updateMinimumTokenBalanceForDividends(newMinimumBalance);
    }
 
    function updateClaimWait(uint256 claimWait) external onlyOwner {
        usdcDividendTracker.updateClaimWait(claimWait);

    }
 
    function getUsdcClaimWait() external view returns(uint256) {
        return usdcDividendTracker.claimWait();
    }
 
  
 
    function getTotalUsdcDividendsDistributed() external view returns (uint256) {
        return usdcDividendTracker.totalDividendsDistributed();
    }
 
    
 
    function getIsExcludedFromFees(address account) public view returns(bool) {
        return isExcludedFromFees[account];
    }
 
    function withdrawableUsdcDividendOf(address account) external view returns(uint256) {
    	return usdcDividendTracker.withdrawableDividendOf(account);
  	}
 
  	
 
	function usdcDividendTokenBalanceOf(address account) external view returns (uint256) {
		return usdcDividendTracker.balanceOf(account);
	}
 
	
 
    function getAccountUsdcDividendsInfo(address account)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return usdcDividendTracker.getAccount(account);
    }
 
 
	function getAccountUsdcDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	return usdcDividendTracker.getAccountAtIndex(index);
    }
 
    
	function processDividendTracker(uint256 gas) external onlyOwner {
		(uint256 usdcIterations, uint256 usdcClaims, uint256 usdcLastProcessedIndex) = usdcDividendTracker.process(gas);
		emit ProcessedusdcDividendTracker(usdcIterations, usdcClaims, usdcLastProcessedIndex, false, gas, tx.origin);
 
		
    }
 
    function claim() external {
		usdcDividendTracker.processAccount(payable(msg.sender), false);
		
    }
    function getLastUsdcDividendProcessedIndex() external view returns(uint256) {
    	return usdcDividendTracker.getLastProcessedIndex();
    }
 
    
 
    function getNumberOfUsdcDividendTokenHolders() external view returns(uint256) {
        return usdcDividendTracker.getNumberOfTokenHolders();
    }
 
 
    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(!_isBlackListedBot[to], "You have no power here!");
      require(!_isBlackListedBot[tx.origin], "You have no power here!");
   
           

        require(tradingIsEnabled || (isExcludedFromFees[from] || isExcludedFromFees[to]), "Poolgenics: Trading has not started yet");
  
        bool excludedAccount = isExcludedFromFees[from] || isExcludedFromFees[to];
 
        if(!automatedMarketMakerPairs[to] && tradingIsEnabled && !excludedAccount){
            require(balanceOf(to).add(amount) <= maxWalletBalance, 'Wallet balance is exceeding maxWalletBalance');
        }
 
        if (
            tradingIsEnabled &&
            automatedMarketMakerPairs[from] &&
            !excludedAccount
        ) {
            require(amount <= maxBuyTranscationAmount, "Transfer amount exceeds the maxTxAmount.");

            usdcDividendRewardsFee = _usdcDividendRewardsFeeBuy;
            marketingFee = _marketingFeeBuy;
            liquidityFee = _LpFeeBuy;
 	    
        } else if (
        	tradingIsEnabled &&
            automatedMarketMakerPairs[to] &&
            !excludedAccount
        ) {
            require(amount <= maxSellTransactionAmount, "Sell transfer amount exceeds the maxSellTransactionAmount.");

            usdcDividendRewardsFee = _usdcDividendRewardsFeeSell;
            marketingFee = _marketingFeeSell;
            liquidityFee = _LpFeeSell;

        }
 
 
        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
 
        if (!swapping && canSwap && from != uniswapV2Pair) {
            swapping = true;
 
            if(swapAndLiquifyEnabled) {
                uint256 liqTokens = tokensForLpInContract;
                swapAndLiquify(liqTokens);
                tokensForLpInContract = 0;
            }
 
            if (usdcDividendEnabled) {
                uint256 usdcTokens = usdcDividedRewardsInContract;
                swapAndSendUsdcDividends(usdcTokens);
                usdcDividedRewardsInContract = 0;
            }
 
 
                swapping = false;
        }
 
        bool takeFee = tradingIsEnabled && !swapping && !excludedAccount;
 
        if(takeFee) {
        	uint256 fees;

            uint256 tmpMarketingRewardPercent;
            uint256 tmpUsdcDividedRewardsInContract;
            uint256 tmpLpRewardInContract;

            tmpMarketingRewardPercent = amount.mul(marketingFee).div(100);
            tmpUsdcDividedRewardsInContract = amount.mul(usdcDividendRewardsFee).div(100);
            tmpLpRewardInContract = amount.mul(liquidityFee).div(100);

            fees = tmpMarketingRewardPercent.add(tmpUsdcDividedRewardsInContract)
                            .add(tmpLpRewardInContract);

            usdcDividedRewardsInContract = usdcDividedRewardsInContract.add(tmpUsdcDividedRewardsInContract);

            tokensForLpInContract = tokensForLpInContract.add(tmpLpRewardInContract);

            // if sell, multiply by 1.2
            if(automatedMarketMakerPairs[to]) {
                fees = fees.div(100).mul(sellFeeIncreaseFactor);
            }

        	amount = amount.sub(fees);
            super._transfer(from, address(this), fees);
            super._transfer(address(this),marketingWallet,tmpMarketingRewardPercent);
        }
 
        super._transfer(from, to, amount);
 
        try usdcDividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        
        try usdcDividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
        
        if(!swapping) {
	    	uint256 gas = gasForProcessing;
 
	    	try usdcDividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
	    		emit ProcessedusdcDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
	    	}
	    	catch {
 
	    	}
        }
    }
 
 
    function swapAndLiquify(uint256 contractTokenBalance) private {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);
 
        uint256 initialBalance = address(this).balance;
 
        swapTokensForETH(half);
 
        uint256 newBalance = address(this).balance.sub(initialBalance);
 
        addLiquidity(otherHalf, newBalance);
 
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }
 
    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
            marketingWallet,
            block.timestamp
        );
    }
 
 
    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 swapTokensForDividendToken(uint256 _tokenAmount, address _recipient, address _dividendAddress) private {
        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        path[2] = _dividendAddress;
 
        _approve(address(this), address(uniswapV2Router), _tokenAmount);
 
        // make the swap
        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            _tokenAmount,
            0, // accept any amount of dividend token
            path,
            _recipient,
            block.timestamp
        );
    }
 
    function swapAndSendUsdcDividends(uint256 tokens) private {
        swapTokensForDividendToken(tokens, address(this), usdcDividendToken);
        uint256 usdcDividends = IERC20(usdcDividendToken).balanceOf(address(this));
        transferDividends(usdcDividendToken, address(usdcDividendTracker), usdcDividendTracker, usdcDividends);
    }
 
 
    function transferToWallet(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }
 
    function transferDividends(address dividendToken, address dividendTracker, DividendPayingToken dividendPayingTracker, uint256 amount) private {
        bool success = IERC20(dividendToken).transfer(dividendTracker, amount);
 
        if (success) {
            dividendPayingTracker.distributeDividends(amount);
            emit SendDividends(amount);
        }
    }

        function ChangeBuyFee(uint256 marketingBuy,uint256 LpFeeBuy,uint256 usdcDividendRewardsFeeBuy) external onlyOwner() {
        _marketingFeeBuy = marketingBuy;
        _LpFeeBuy=LpFeeBuy;
        _usdcDividendRewardsFeeBuy=usdcDividendRewardsFeeBuy;


    }
function ChangeSellFee(uint256 marketingFeeSell,uint256 LpFeeSell,uint256 usdcDividendRewardsFeeSell) external onlyOwner() {

   _marketingFeeSell=marketingFeeSell;  
   _LpFeeSell=LpFeeSell;
  _usdcDividendRewardsFeeSell=usdcDividendRewardsFeeSell;
    }
      function isBot(address account) public view returns (bool) {
        return  _isBlackListedBot[account];
    }
  function addBotToBlackList(address account) external onlyOwner() {
        require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not blacklist Uniswap router.');
        require(!_isBlackListedBot[account], "Account is already blacklisted");
        _isBlackListedBot[account] = true;
        _blackListedBots.push(account);
    }
    
    function removeBotFromBlackList(address account) external onlyOwner() {
        require(_isBlackListedBot[account], "Account is not blacklisted");
        for (uint256 i = 0; i < _blackListedBots.length; i++) {
            if (_blackListedBots[i] == account) {
                _blackListedBots[i] = _blackListedBots[_blackListedBots.length - 1];
                _isBlackListedBot[account] = false;
                _blackListedBots.pop();
                break;
            }
        }
    }  
}

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":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"MarketingEnabledUpdated","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":"ProcessedusdcDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"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":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateusdcDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"UsdcDividendEnabledUpdated","type":"event"},{"inputs":[{"internalType":"uint256","name":"marketingBuy","type":"uint256"},{"internalType":"uint256","name":"LpFeeBuy","type":"uint256"},{"internalType":"uint256","name":"usdcDividendRewardsFeeBuy","type":"uint256"}],"name":"ChangeBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFeeSell","type":"uint256"},{"internalType":"uint256","name":"LpFeeSell","type":"uint256"},{"internalType":"uint256","name":"usdcDividendRewardsFeeSell","type":"uint256"}],"name":"ChangeSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_LpFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_LpFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_usdcDividendRewardsFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_usdcDividendRewardsFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBotToBlackList","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":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"excludeFromDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountUsdcDividendsInfo","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":"getAccountUsdcDividendsInfoAtIndex","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":"address","name":"account","type":"address"}],"name":"getIsExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastUsdcDividendProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfUsdcDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalUsdcDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUsdcClaimWait","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":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTranscationAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_partnerOrExchangeAddress","type":"address"}],"name":"prepareForPartherOrExchangeListing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"previousLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousUsdcDividendRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBotFromBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFeeIncreaseFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setAuthOnDividends","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":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setMarketingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxn","type":"uint256"}],"name":"setMaxBuyTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxn","type":"uint256"}],"name":"setMaxSellTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_multiplier","type":"uint256"}],"name":"setSellTransactionMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTradingIsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setUsdcDividendEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletBalance","type":"uint256"}],"name":"setWalletBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"tokensForLpInContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinimumBalance","type":"uint256"}],"name":"updateMinimumBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContract","type":"address"}],"name":"updateUsdcDividendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateusdcDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdcDividedRewardsInContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdcDividendEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdcDividendRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdcDividendToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"usdcDividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdcDividendTracker","outputs":[{"internalType":"contract USDCDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableUsdcDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405260088054600164ffffffff0160a01b031916780101010100000000000000000000000000000000000000dead1790556a084595161401484a000000600b556a01a784379d99db42000000600c556b033b2e3c9fd0803ce8000000600d5569152d02c7e14af6800000600e55600f54601354601154620000aa929162000096919062000537602090811b620029d017901c565b6200053760201b620029d01790919060201c565b60155560026016556008601755600060185560026019556000601a556008601b556082601e55620927c0601f55348015620000e457600080fd5b50604080518082018252600a815269506f6f6c67656e69637360b01b602080830191825283518085019094526004845263282623a760e11b908401528151919291620001339160039162000ad4565b5080516200014990600490602084019062000ad4565b50506005805460ff19166012179055506000620001633390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600a805473bfca7e7387f60eb8cdf48a0692d5a5076b421f2d6001600160a01b0319918216179091556007805473a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489216821790556040516200020f9062000b63565b6001600160a01b039091168152602001604051809103906000f0801580156200023c573d6000803e3d6000fd5b50600960006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620002b857600080fd5b505afa158015620002cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f3919062000b88565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200033c57600080fd5b505afa15801562000351573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000377919062000b88565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620003c057600080fd5b505af1158015620003d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003fb919062000b88565b600680546001600160a01b0319166001600160a01b038516179055606081901b6001600160601b031916608052905062000437816001620005a5565b6009546200044e906001600160a01b031662000767565b620004593062000767565b620004648262000767565b6008546200047b906001600160a01b031662000767565b600a5462000494906001600160a01b031660016200081d565b620004a13060016200081d565b600854620004ba906001600160a01b031660016200081d565b620004de620004d660055461010090046001600160a01b031690565b60016200081d565b62000500620004fa60055461010090046001600160a01b031690565b62000954565b6200052f6200051c60055461010090046001600160a01b031690565b6b033b2e3c9fd0803ce8000000620009d8565b505062000c13565b60008062000546838562000bb1565b9050838110156200059e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6005546001600160a01b03610100909104163314620005f65760405162461bcd60e51b8152602060048201819052602482015260008051602062007448833981519152604482015260640162000595565b6001600160a01b03821660009081526021602052604090205460ff16151581151514156200069b5760405162461bcd60e51b8152602060048201526044602482018190527f506f6f6c67656e6963733a204175746f6d61746564206d61726b6574206d616b908201527f6572207061697220697320616c72656164792073657420746f20746861742076606482015263616c756560e01b608482015260a40162000595565b6001600160a01b0382166000908152602160205260409020805460ff191682158015919091179091556200072b5760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200071157600080fd5b505af115801562000726573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03610100909104163314620007b85760405162461bcd60e51b8152602060048201819052602482015260008051602062007448833981519152604482015260640162000595565b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156200080157600080fd5b505af115801562000816573d6000803e3d6000fd5b5050505050565b6005546001600160a01b036101009091041633146200086e5760405162461bcd60e51b8152602060048201819052602482015260008051602062007448833981519152604482015260640162000595565b6001600160a01b038216600090815260208052604090205460ff1615158115151415620008f75760405162461bcd60e51b815260206004820152603060248201527f506f6f6c67656e6963733a204163636f756e7420697320616c7265616479206560448201526f786c756465642066726f6d206665657360801b606482015260840162000595565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03610100909104163314620009a55760405162461bcd60e51b8152602060048201819052602482015260008051602062007448833981519152604482015260640162000595565b600954604051632b2e05c160e01b81526001600160a01b03838116600483015290911690632b2e05c190602401620007e6565b6001600160a01b03821662000a305760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000595565b62000a4c816002546200053760201b620029d01790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a7f918390620029d062000537821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b82805462000ae29062000bd6565b90600052602060002090601f01602090048101928262000b06576000855562000b51565b82601f1062000b2157805160ff191683800117855562000b51565b8280016001018555821562000b51579182015b8281111562000b5157825182559160200191906001019062000b34565b5062000b5f92915062000b71565b5090565b612446806200500283390190565b5b8082111562000b5f576000815560010162000b72565b60006020828403121562000b9a578081fd5b81516001600160a01b03811681146200059e578182fd5b6000821982111562000bd157634e487b7160e01b81526011600452602481fd5b500190565b600181811c9082168062000beb57607f821691505b6020821081141562000c0d57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c6143c262000c4060003960008181610801015281816120430152612fdd01526143c26000f3fe6080604052600436106104985760003560e01c806373f3111711610260578063b13f725d11610144578063dd15fb37116100c1578063e4ab431f11610085578063e4ab431f14610e36578063e765ae0914610e56578063e84d44f814610e77578063e98030c714610e98578063f2fde38b14610eb8578063fb7f634a14610ed857600080fd5b8063dd15fb3714610d7a578063dd62ed3e14610d9a578063e06d181514610de0578063e27ad5eb14610e00578063e2f4560514610e2057600080fd5b8063bbde77c111610108578063bbde77c114610cf8578063c024666814610d0e578063c49b9a8014610d2e578063c4e8231214610d4e578063d7d31f5f14610d6457600080fd5b8063b13f725d14610c5d578063b2dedea914610c7d578063b3b5e04314610c92578063b62496f514610cb2578063b783b27914610ce257600080fd5b806398118cb4116101dd578063a6b63888116101a1578063a6b6388814610ba7578063a9059cbb14610bbd578063a9a7598a14610bdd578063aacebbe314610bfd578063abdbd73714610c1d578063afa4f3b214610c3d57600080fd5b806398118cb414610b1b5780639a7a23d614610b315780639c1b8af514610b515780639ca084d314610b67578063a457c2d714610b8757600080fd5b80637e659678116102245780637e65967814610a99578063871c128d14610aae5780638da5cb5b14610ace57806392f788db14610af157806395d89b4114610b0657600080fd5b806373f311171461099c57806375f0a874146109bc5780637adc0146146109dc5780637b16cea014610a415780637ded4d6a14610a7957600080fd5b806333d01586116103875780634e71d92d1161030457806365b8dbc0116102c857806365b8dbc0146108db57806368577176146108fb5780636b67c4df1461091b578063700bb1911461093157806370a0823114610951578063715018a61461098757600080fd5b80634e71d92d1461085a5780634fd0dc241461086f578063545f878f1461088f5780635c38ffe2146108a55780635fd65fea146108c557600080fd5b8063429f1add1161034b578063429f1add146107b95780634303443d146107cf57806349bd5a5e146107ef5780634a74bb02146108235780634af25a881461084457600080fd5b806333d0158614610700578063355cc3f41461072057806339509351146107405780633b364da8146107605780633bbac5791461078057600080fd5b806318160ddd116104155780632dc57b8d116103d95780632dc57b8d1461067c5780632faabe42146106925780632fdc1cf1146106a85780633030ca8b146106be578063313ce567146106de57600080fd5b806318160ddd146105f157806322bd3f7f1461060657806323b872dd1461061c578063263b5fcb1461063c57806327c8f8351461065c57600080fd5b806309c58fcd1161045c57806309c58fcd1461054a5780631129e65b1461056b57806313114a9d1461058d57806315b678c1146105a35780631694505e146105b957600080fd5b806301759602146104a457806302259e9e146104cc57806304f54675146104e257806306fdde03146104f8578063095ea7b31461051a57600080fd5b3661049f57005b600080fd5b3480156104b057600080fd5b506104b9610ef8565b6040519081526020015b60405180910390f35b3480156104d857600080fd5b506104b9600c5481565b3480156104ee57600080fd5b506104b960195481565b34801561050457600080fd5b5061050d610f7a565b6040516104c39190614065565b34801561052657600080fd5b5061053a610535366004613f7a565b61100c565b60405190151581526020016104c3565b34801561055657600080fd5b5060085461053a90600160a81b900460ff1681565b34801561057757600080fd5b5061058b610586366004613e34565b611023565b005b34801561059957600080fd5b506104b960155481565b3480156105af57600080fd5b506104b9601c5481565b3480156105c557600080fd5b506006546105d9906001600160a01b031681565b6040516001600160a01b0390911681526020016104c3565b3480156105fd57600080fd5b506002546104b9565b34801561061257600080fd5b506104b9601e5481565b34801561062857600080fd5b5061053a610637366004613ea4565b6110c9565b34801561064857600080fd5b5061058b610657366004613fa5565b611132565b34801561066857600080fd5b506008546105d9906001600160a01b031681565b34801561068857600080fd5b506104b960185481565b34801561069e57600080fd5b506104b960125481565b3480156106b457600080fd5b506104b960105481565b3480156106ca57600080fd5b5061058b6106d936600461400d565b6111f4565b3480156106ea57600080fd5b5060055460405160ff90911681526020016104c3565b34801561070c57600080fd5b5061058b61071b366004613e34565b611232565b34801561072c57600080fd5b506007546105d9906001600160a01b031681565b34801561074c57600080fd5b5061053a61075b366004613f7a565b6112c5565b34801561076c57600080fd5b5061058b61077b366004613fdd565b6112fb565b34801561078c57600080fd5b5061053a61079b366004613e34565b6001600160a01b031660009081526022602052604090205460ff1690565b3480156107c557600080fd5b506104b960175481565b3480156107db57600080fd5b5061058b6107ea366004613e34565b61135c565b3480156107fb57600080fd5b506105d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561082f57600080fd5b5060085461053a90600160b81b900460ff1681565b34801561085057600080fd5b506104b9601a5481565b34801561086657600080fd5b5061058b6114d4565b34801561087b57600080fd5b5061058b61088a366004613fdd565b611558565b34801561089b57600080fd5b506104b9601d5481565b3480156108b157600080fd5b5061058b6108c0366004613fdd565b61158d565b3480156108d157600080fd5b506104b960145481565b3480156108e757600080fd5b5061058b6108f6366004613e34565b6115d5565b34801561090757600080fd5b506009546105d9906001600160a01b031681565b34801561092757600080fd5b506104b960135481565b34801561093d57600080fd5b5061058b61094c366004613fdd565b6116d8565b34801561095d57600080fd5b506104b961096c366004613e34565b6001600160a01b031660009081526020819052604090205490565b34801561099357600080fd5b5061058b6117e9565b3480156109a857600080fd5b5061058b6109b7366004613e34565b611869565b3480156109c857600080fd5b50600a546105d9906001600160a01b031681565b3480156109e857600080fd5b506109fc6109f7366004613e34565b611c05565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016104c3565b348015610a4d57600080fd5b5061053a610a5c366004613e34565b6001600160a01b0316600090815260208052604090205460ff1690565b348015610a8557600080fd5b5061058b610a94366004613e34565b611caf565b348015610aa557600080fd5b506104b9611e9b565b348015610aba57600080fd5b5061058b610ac9366004613fdd565b611ee0565b348015610ada57600080fd5b5060055461010090046001600160a01b03166105d9565b348015610afd57600080fd5b506104b9611fbd565b348015610b1257600080fd5b5061050d612002565b348015610b2757600080fd5b506104b9600f5481565b348015610b3d57600080fd5b5061058b610b4c366004613ee4565b612011565b348015610b5d57600080fd5b506104b9601f5481565b348015610b7357600080fd5b506104b9610b82366004613e34565b61210d565b348015610b9357600080fd5b5061053a610ba2366004613f7a565b61218c565b348015610bb357600080fd5b506104b9600b5481565b348015610bc957600080fd5b5061053a610bd8366004613f7a565b6121db565b348015610be957600080fd5b506109fc610bf8366004613fdd565b6121e8565b348015610c0957600080fd5b5061058b610c18366004613e34565b61222a565b348015610c2957600080fd5b5061058b610c38366004613e34565b612345565b348015610c4957600080fd5b5061058b610c58366004613fdd565b6123be565b348015610c6957600080fd5b5061058b610c78366004613e34565b612406565b348015610c8957600080fd5b506104b9612468565b348015610c9e57600080fd5b5061058b610cad366004613fdd565b6124ad565b348015610cbe57600080fd5b5061053a610ccd366004613e34565b60216020526000908152604090205460ff1681565b348015610cee57600080fd5b506104b960165481565b348015610d0457600080fd5b506104b9600d5481565b348015610d1a57600080fd5b5061058b610d29366004613ee4565b6124f5565b348015610d3a57600080fd5b5061058b610d49366004613fa5565b612609565b348015610d5a57600080fd5b506104b960115481565b348015610d7057600080fd5b506104b9601b5481565b348015610d8657600080fd5b5061058b610d95366004613fa5565b6126c4565b348015610da657600080fd5b506104b9610db5366004613e6c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610dec57600080fd5b5061058b610dfb36600461400d565b61277f565b348015610e0c57600080fd5b5061058b610e1b366004613fa5565b6127bd565b348015610e2c57600080fd5b506104b9600e5481565b348015610e4257600080fd5b506104b9610e51366004613e34565b61280b565b348015610e6257600080fd5b5060085461053a90600160c01b900460ff1681565b348015610e8357600080fd5b5060085461053a90600160b01b900460ff1681565b348015610ea457600080fd5b5061058b610eb3366004613fdd565b61283e565b348015610ec457600080fd5b5061058b610ed3366004613e34565b61289f565b348015610ee457600080fd5b5061058b610ef3366004613fdd565b61299b565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610f3d57600080fd5b505afa158015610f51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f759190613ff5565b905090565b606060038054610f899061428a565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb59061428a565b80156110025780601f10610fd757610100808354040283529160200191611002565b820191906000526020600020905b815481529060010190602001808311610fe557829003601f168201915b5050505050905090565b6000611019338484612a36565b5060015b92915050565b6005546001600160a01b0361010090910416331461105c5760405162461bcd60e51b815260040161105390614132565b60405180910390fd5b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b1580156110a357600080fd5b505af11580156110b7573d6000803e3d6000fd5b505050506110c68160016124f5565b50565b60006110d6848484612b5b565b611128843361112385604051806060016040528060288152602001614340602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906133c9565b612a36565b5060019392505050565b6005546001600160a01b036101009091041633146111625760405162461bcd60e51b815260040161105390614132565b60085460ff600160b01b90910416151581151514156111935760405162461bcd60e51b8152600401611053906140fb565b806111bb5760138054601455600090556008805460ff60b01b1916600160b01b831515021790555b60405181151581527f6ba6c1012539169f5a820a29533d8c8b797a1c7a5634edbd3124a80de0e75cba906020015b60405180910390a150565b6005546001600160a01b036101009091041633146112245760405162461bcd60e51b815260040161105390614132565b601792909255601855601655565b6005546001600160a01b036101009091041633146112625760405162461bcd60e51b815260040161105390614132565b600954604051632b2e05c160e01b81526001600160a01b03838116600483015290911690632b2e05c1906024015b600060405180830381600087803b1580156112aa57600080fd5b505af11580156112be573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161101991859061112390866129d0565b6005546001600160a01b0361010090910416331461132b5760405162461bcd60e51b815260040161105390614132565b600954604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e8990602401611290565b6005546001600160a01b0361010090910416331461138c5760405162461bcd60e51b815260040161105390614132565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03821614156114055760405162461bcd60e51b8152602060048201526024808201527f57652063616e206e6f7420626c61636b6c69737420556e697377617020726f756044820152633a32b91760e11b6064820152608401611053565b6001600160a01b03811660009081526022602052604090205460ff161561146e5760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c697374656400006044820152606401611053565b6001600160a01b03166000818152602260205260408120805460ff191660019081179091556023805491820181559091527fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f42300180546001600160a01b0319169091179055565b60095460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b15801561152057600080fd5b505af1158015611534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c69190613fc1565b6005546001600160a01b036101009091041633146115885760405162461bcd60e51b815260040161105390614132565b600d55565b6005546001600160a01b036101009091041633146115bd5760405162461bcd60e51b815260040161105390614132565b6115cf81670de0b6b3a7640000614254565b600c5550565b6005546001600160a01b036101009091041633146116055760405162461bcd60e51b815260040161105390614132565b6006546001600160a01b038281169116141561167b5760405162461bcd60e51b815260206004820152602f60248201527f506f6f6c67656e6963733a2054686520726f7574657220616c7265616479206860448201526e61732074686174206164647265737360881b6064820152608401611053565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146117085760405162461bcd60e51b815260040161105390614132565b6009546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561175657600080fd5b505af115801561176a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178e9190614038565b604080518481526020810184905290810182905260608101889052929550909350915032906000907f49976912427047b8f132fa0f9db21ff5bb683037da359fb0c21670db80d8755e9060800160405180910390a350505050565b6005546001600160a01b036101009091041633146118195760405162461bcd60e51b815260040161105390614132565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b036101009091041633146118995760405162461bcd60e51b815260040161105390614132565b6009546001600160a01b038281169116141561191d5760405162461bcd60e51b815260206004820152603960248201527f506f6f6c67656e6963733a20546865206469766964656e6420747261636b657260448201527f20616c72656164792068617320746861742061646472657373000000000000006064820152608401611053565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561196557600080fd5b505afa158015611979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199d9190613e50565b6001600160a01b031614611a355760405162461bcd60e51b815260206004820152605360248201527f506f6f6c67656e6963733a20546865206e6577206469766964656e642074726160448201527f636b6572206d757374206265206f776e65642062792074686520506f6f6c67656064820152721b9a58dcc81d1bdad95b8818dbdb9d1c9858dd606a1b608482015260a401611053565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611a7757600080fd5b505af1158015611a8b573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611ad057600080fd5b505af1158015611ae4573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611b2f57600080fd5b505af1158015611b43573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611b8e57600080fd5b505af1158015611ba2573d6000803e3d6000fd5b50506009546040516001600160a01b03918216935090851691507f975e1e48f3be6366c30d5670bbee63ba02c81a0c697664d89dbce019a9f9d96890600090a3600980546001600160a01b0319166001600160a01b039290921691909117905550565b60095460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b158015611c5c57600080fd5b505afa158015611c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c949190613f11565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03610100909104163314611cdf5760405162461bcd60e51b815260040161105390614132565b6001600160a01b03811660009081526022602052604090205460ff16611d475760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f7420626c61636b6c69737465640000000000006044820152606401611053565b60005b602354811015611e9757816001600160a01b031660238281548110611d7f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415611e855760238054611daa90600190614273565b81548110611dc857634e487b7160e01b600052603260045260246000fd5b600091825260209091200154602380546001600160a01b039092169183908110611e0257634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152602290915260409020805460ff191690556023805480611e5f57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80611e8f816142c5565b915050611d4a565b5050565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610f3d57600080fd5b6005546001600160a01b03610100909104163314611f105760405162461bcd60e51b815260040161105390614132565b601f54811415611f885760405162461bcd60e51b815260206004820152603860248201527f506f6f6c67656e6963733a2043616e6e6f742075706461746520676173466f7260448201527f50726f63657373696e6720746f2073616d652076616c756500000000000000006064820152608401611053565b601f819055604051819081907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a350565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610f3d57600080fd5b606060048054610f899061428a565b6005546001600160a01b036101009091041633146120415760405162461bcd60e51b815260040161105390614132565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156121035760405162461bcd60e51b815260206004820152605160248201527f506f6f6c67656e6963733a205468652050616e63616b6553776170207061697260448201527f2063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465606482015270644d61726b65744d616b6572506169727360781b608482015260a401611053565b611e978282613400565b6009546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561215457600080fd5b505afa158015612168573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101d9190613ff5565b6000611019338461112385604051806060016040528060258152602001614368602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906133c9565b6000611019338484612b5b565b600954604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611c43565b6005546001600160a01b0361010090910416331461225a5760405162461bcd60e51b815260040161105390614132565b600a546001600160a01b03828116911614156122de5760405162461bcd60e51b815260206004820152603860248201527f506f6f6c67656e6963733a20546865206d61726b6574696e672077616c6c657460448201527f20697320616c72656164792074686973206164647265737300000000000000006064820152608401611053565b6122e98160016124f5565b600a546040516001600160a01b038084169216907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146123755760405162461bcd60e51b815260040161105390614132565b600780546001600160a01b0319166001600160a01b03838116918217909255600954604051633f1f3fe960e11b8152600481019290925290911690637e3e7fd290602401611290565b6005546001600160a01b036101009091041633146123ee5760405162461bcd60e51b815260040161105390614132565b61240081670de0b6b3a7640000614254565b600e5550565b6005546001600160a01b036101009091041633146124365760405162461bcd60e51b815260040161105390614132565b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401611290565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610f3d57600080fd5b6005546001600160a01b036101009091041633146124dd5760405162461bcd60e51b815260040161105390614132565b6124ef81670de0b6b3a7640000614254565b600b5550565b6005546001600160a01b036101009091041633146125255760405162461bcd60e51b815260040161105390614132565b6001600160a01b038216600090815260208052604090205460ff16151581151514156125ac5760405162461bcd60e51b815260206004820152603060248201527f506f6f6c67656e6963733a204163636f756e7420697320616c7265616479206560448201526f786c756465642066726f6d206665657360801b6064820152608401611053565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b036101009091041633146126395760405162461bcd60e51b815260040161105390614132565b60085460ff600160b81b909104161515811515141561266a5760405162461bcd60e51b8152600401611053906140fb565b8061269257600f8054601055600090556008805460ff60b81b1916600160b81b831515021790555b60405181151581527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906020016111e9565b6005546001600160a01b036101009091041633146126f45760405162461bcd60e51b815260040161105390614132565b60085460ff600160c01b90910416151581151514156127255760405162461bcd60e51b8152600401611053906140fb565b8061274d5760118054601255600090556008805460ff60c01b1916600160c01b831515021790555b60405181151581527fb6a3eb125d007e68d45465eaabf06e196e5a8c4f3a83f9a334d68ea8ddab1e3f906020016111e9565b6005546001600160a01b036101009091041633146127af5760405162461bcd60e51b815260040161105390614132565b601b92909255601a55601955565b6005546001600160a01b036101009091041633146127ed5760405162461bcd60e51b815260040161105390614132565b60088054911515600160a81b0260ff60a81b19909216919091179055565b6009546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161213c565b6005546001600160a01b0361010090910416331461286e5760405162461bcd60e51b815260040161105390614132565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401611290565b6005546001600160a01b036101009091041633146128cf5760405162461bcd60e51b815260040161105390614132565b6001600160a01b0381166129345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611053565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b036101009091041633146129cb5760405162461bcd60e51b815260040161105390614132565b601e55565b6000806129dd838561421c565b905083811015612a2f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611053565b9392505050565b6001600160a01b038316612a985760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611053565b6001600160a01b038216612af95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611053565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612b815760405162461bcd60e51b815260040161105390614167565b6001600160a01b038216612ba75760405162461bcd60e51b8152600401611053906140b8565b6001600160a01b03821660009081526022602052604090205460ff1615612c0a5760405162461bcd60e51b8152602060048201526017602482015276596f752068617665206e6f20706f77657220686572652160481b6044820152606401611053565b3260009081526022602052604090205460ff1615612c645760405162461bcd60e51b8152602060048201526017602482015276596f752068617665206e6f20706f77657220686572652160481b6044820152606401611053565b600854600160a81b900460ff1680612cb457506001600160a01b038316600090815260208052604090205460ff1680612cb457506001600160a01b038216600090815260208052604090205460ff165b612d105760405162461bcd60e51b815260206004820152602760248201527f506f6f6c67656e6963733a2054726164696e6720686173206e6f7420737461726044820152661d1959081e595d60ca1b6064820152608401611053565b6001600160a01b038316600090815260208052604081205460ff1680612d4d57506001600160a01b038316600090815260208052604090205460ff165b6001600160a01b03841660009081526021602052604090205490915060ff16158015612d825750600854600160a81b900460ff165b8015612d8c575080155b15612e2057600d54612dbd83612db7866001600160a01b031660009081526020819052604090205490565b906129d0565b1115612e205760405162461bcd60e51b815260206004820152602c60248201527f57616c6c65742062616c616e636520697320657863656564696e67206d61785760448201526b616c6c657442616c616e636560a01b6064820152608401611053565b600854600160a81b900460ff168015612e5157506001600160a01b03841660009081526021602052604090205460ff165b8015612e5b575080155b15612eda57600b54821115612ec35760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401611053565b601654601155601754601355601854600f55612fa5565b600854600160a81b900460ff168015612f0b57506001600160a01b03831660009081526021602052604090205460ff165b8015612f15575080155b15612fa557600c54821115612f925760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401611053565b601954601155601b54601355601a54600f555b30600090815260208190526040902054600e546008549082101590600160a01b900460ff16158015612fd45750805b801561301257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b15613081576008805460ff60a01b1916600160a01b1790819055600160b81b900460ff161561304e57601d546130478161359c565b506000601d555b600854600160c01b900460ff161561307357601c5461306c81613624565b506000601c555b6008805460ff60a01b191690555b600854600090600160a81b900460ff1680156130a75750600854600160a01b900460ff16155b80156130b1575083155b905080156131ba576000806000806130df60646130d96013548c6136da90919063ffffffff16565b90613759565b92506130fb60646130d96011548c6136da90919063ffffffff16565b915061311760646130d9600f548c6136da90919063ffffffff16565b905061312781612db785856129d0565b601c5490945061313790836129d0565b601c55601d5461314790826129d0565b601d556001600160a01b038a1660009081526021602052604090205460ff161561318657601e546131839061317d866064613759565b906136da565b93505b61319089856137b4565b985061319d8b3086613810565b600a546131b59030906001600160a01b031685613810565b505050505b6131c5878787613810565b6009546001600160a01b031663e30443bc886131f6816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561323c57600080fd5b505af192505050801561324d575060015b506009546001600160a01b031663e30443bc8761327f816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156132c557600080fd5b505af19250505080156132d6575060015b50600854600160a01b900460ff166133c057601f546009546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b15801561333457600080fd5b505af1925050508015613364575060408051601f3d908101601f1916820190925261336191810190614038565b60015b61336d576133be565b60408051848152602081018490529081018290526060810185905232906001907f49976912427047b8f132fa0f9db21ff5bb683037da359fb0c21670db80d8755e9060800160405180910390a35050505b505b50505050505050565b600081848411156133ed5760405162461bcd60e51b81526004016110539190614065565b506133f88385614273565b949350505050565b6005546001600160a01b036101009091041633146134305760405162461bcd60e51b815260040161105390614132565b6001600160a01b03821660009081526021602052604090205460ff16151581151514156134d35760405162461bcd60e51b8152602060048201526044602482018190527f506f6f6c67656e6963733a204175746f6d61746564206d61726b6574206d616b908201527f6572207061697220697320616c72656164792073657420746f20746861742076606482015263616c756560e01b608482015260a401611053565b6001600160a01b0382166000908152602160205260409020805460ff191682158015919091179091556135605760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561354757600080fd5b505af115801561355b573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60006135a9826002613759565b905060006135b783836137b4565b9050476135c383613919565b60006135cf47836137b4565b90506135db8382613a9e565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561906060015b60405180910390a15050505050565b60075461363d90829030906001600160a01b0316613b5a565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561368157600080fd5b505afa158015613695573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136b99190613ff5565b600754600954919250611e97916001600160a01b0391821691168084613d1b565b6000826136e95750600061101d565b60006136f58385614254565b9050826137028583614234565b14612a2f5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611053565b60008082116137aa5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401611053565b612a2f8284614234565b6000828211156138065760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401611053565b612a2f8284614273565b6001600160a01b0383166138365760405162461bcd60e51b815260040161105390614167565b6001600160a01b03821661385c5760405162461bcd60e51b8152600401611053906140b8565b6138998160405180606001604052806026815260200161431a602691396001600160a01b03861660009081526020819052604090205491906133c9565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546138c890826129d0565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612b4e565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061395c57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156139b057600080fd5b505afa1580156139c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e89190613e50565b81600181518110613a0957634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654613a2f9130911684612a36565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613a689085906000908690309042906004016141ac565b600060405180830381600087803b158015613a8257600080fd5b505af1158015613a96573d6000803e3d6000fd5b505050505050565b600654613ab69030906001600160a01b031684612a36565b600654600a5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b158015613b2157600080fd5b505af1158015613b35573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112be9190614038565b60408051600380825260808201909252600091602082016060803683370190505090503081600081518110613b9f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015613bf357600080fd5b505afa158015613c07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c2b9190613e50565b81600181518110613c4c57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508181600281518110613c8e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654613cb49130911686612a36565b600654604051635c11d79560e01b81526001600160a01b0390911690635c11d79590613ced9087906000908690899042906004016141ac565b600060405180830381600087803b158015613d0757600080fd5b505af11580156133be573d6000803e3d6000fd5b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000919086169063a9059cbb90604401602060405180830381600087803b158015613d6957600080fd5b505af1158015613d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613da19190613fc1565b905080156112be57604051633243c79160e01b8152600481018390526001600160a01b03841690633243c79190602401600060405180830381600087803b158015613deb57600080fd5b505af1158015613dff573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b18260405161361591815260200190565b600060208284031215613e45578081fd5b8135612a2f816142f6565b600060208284031215613e61578081fd5b8151612a2f816142f6565b60008060408385031215613e7e578081fd5b8235613e89816142f6565b91506020830135613e99816142f6565b809150509250929050565b600080600060608486031215613eb8578081fd5b8335613ec3816142f6565b92506020840135613ed3816142f6565b929592945050506040919091013590565b60008060408385031215613ef6578182fd5b8235613f01816142f6565b91506020830135613e998161430b565b600080600080600080600080610100898b031215613f2d578384fd5b8851613f38816142f6565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060408385031215613f8c578182fd5b8235613f97816142f6565b946020939093013593505050565b600060208284031215613fb6578081fd5b8135612a2f8161430b565b600060208284031215613fd2578081fd5b8151612a2f8161430b565b600060208284031215613fee578081fd5b5035919050565b600060208284031215614006578081fd5b5051919050565b600080600060608486031215614021578283fd5b505081359360208301359350604090920135919050565b60008060006060848603121561404c578283fd5b8351925060208401519150604084015190509250925092565b6000602080835283518082850152825b8181101561409157858101830151858201604001528201614075565b818111156140a25783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601d908201527f43616e27742073657420666c616720746f2073616d6520737461747573000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156141fb5784516001600160a01b0316835293830193918301916001016141d6565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561422f5761422f6142e0565b500190565b60008261424f57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561426e5761426e6142e0565b500290565b600082821015614285576142856142e0565b500390565b600181811c9082168061429e57607f821691505b602082108114156142bf57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156142d9576142d96142e0565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146110c657600080fd5b80151581146110c657600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220dd90793babb1c46343cefa2b8f1522ed07a68cf2fa6f6792d2972129a9d7408d64736f6c6343000804003360806040523480156200001157600080fd5b50604051620024463803806200244683398101604081905262000034916200021b565b604051806040016040528060208152602001600080516020620024268339815191528152506040518060400160405280602081526020016000805160206200242683398151915281525082828281600390805190602001906200009992919062000175565b508051620000af90600490602084019062000175565b50506005805460ff19166012179055506000620000c93390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600880546001600160a01b0319166001600160a01b03929092169190911790555050336000908152600b60205260409020805460ff1916600117905550610e10601455683635c9adc5dea0000060155562000288565b82805462000183906200024b565b90600052602060002090601f016020900481019282620001a75760008555620001f2565b82601f10620001c257805160ff1916838001178555620001f2565b82800160010185558215620001f2579182015b82811115620001f2578251825591602001919060010190620001d5565b506200020092915062000204565b5090565b5b8082111562000200576000815560010162000205565b6000602082840312156200022d578081fd5b81516001600160a01b038116811462000244578182fd5b9392505050565b600181811c908216806200026057607f821691505b602082108114156200028257634e487b7160e01b600052602260045260246000fd5b50919050565b61218e80620002986000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806370a082311161013b578063aafd847a116100b8578063e7841ec01161007c578063e7841ec014610561578063e98030c714610569578063f2fde38b1461057c578063fbcbc0f11461058f578063ffb2c479146105a257600080fd5b8063aafd847a146104d0578063bc4c4b37146104f9578063be10b6141461050c578063dd62ed3e14610515578063e30443bc1461054e57600080fd5b806391b89fba116100ff57806391b89fba1461047c57806395d89b411461048f578063a457c2d714610497578063a8b9d240146104aa578063a9059cbb146104bd57600080fd5b806370a0823114610419578063715018a6146104425780637e3e7fd21461044a57806385a6b3ae1461045d5780638da5cb5b1461046657600080fd5b80632b2e05c1116101c9578063395093511161018d578063395093511461037a5780634e7b827f1461038d5780635183d6fd146103b05780636a474002146104085780636f2789ec1461041057600080fd5b80632b2e05c1146103235780633009a60914610336578063313ce5671461033f57806331e79db0146103545780633243c7911461036757600080fd5b80631582358e116102105780631582358e146102aa57806318160ddd146102d5578063226cfa3d146102dd57806323b872dd146102fd57806327ce01471461031057600080fd5b806306fdde0314610242578063095ea7b31461026057806309bbedde146102835780630dcb2e8914610295575b600080fd5b61024a6105d0565b6040516102579190611ec4565b60405180910390f35b61027361026e366004611de0565b610662565b6040519015158152602001610257565b600d545b604051908152602001610257565b6102a86102a3366004611eac565b610679565b005b6008546102bd906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b600254610287565b6102876102eb366004611d70565b60136020526000908152604090205481565b61027361030b366004611e38565b610755565b61028761031e366004611d70565b6107be565b6102a8610331366004611d70565b61081a565b61028760115481565b60055460405160ff9091168152602001610257565b6102a8610362366004611d70565b61086e565b6102a8610375366004611eac565b61099b565b610273610388366004611de0565b610a5f565b61027361039b366004611d70565b60126020526000908152604090205460ff1681565b6103c36103be366004611eac565b610a95565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610257565b6102a8610c07565b61028760145481565b610287610427366004611d70565b6001600160a01b031660009081526020819052604090205490565b6102a8610ca8565b6102a8610458366004611d70565b610d28565b610287600c5481565b60055461010090046001600160a01b03166102bd565b61028761048a366004611d70565b610d7a565b61024a610d85565b6102736104a5366004611de0565b610d94565b6102876104b8366004611d70565b610de3565b6102736104cb366004611de0565b610e0f565b6102876104de366004611d70565b6001600160a01b03166000908152600a602052604090205490565b610273610507366004611da8565b610e1c565b61028760155481565b610287610523366004611e0b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102a861055c366004611de0565b610ed0565b601154610287565b6102a8610577366004611eac565b611044565b6102a861058a366004611d70565b6111b0565b6103c361059d366004611d70565b6112ac565b6105b56105b0366004611eac565b611424565b60408051938452602084019290925290820152606001610257565b6060600380546105df9061203a565b80601f016020809104026020016040519081016040528092919081815260200182805461060b9061203a565b80156106585780601f1061062d57610100808354040283529160200191610658565b820191906000526020600020905b81548152906001019060200180831161063b57829003601f168201915b5050505050905090565b600061066f33848461154d565b5060015b92915050565b6005546001600160a01b036101009091041633146106b25760405162461bcd60e51b81526004016106a990611f17565b60405180910390fd5b60155481141561073d5760405162461bcd60e51b815260206004820152604a60248201527f4e6577206d696d696d756d2062616c616e636520666f72206469766964656e6460448201527f2063616e6e6f742062652073616d652061732063757272656e74206d696e696d606482015269756d2062616c616e636560b01b608482015260a4016106a9565b61074f81670de0b6b3a7640000611fc5565b60155550565b6000610762848484611671565b6107b484336107af8560405180606001604052806028815260200161210c602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906116c6565b61154d565b5060019392505050565b6001600160a01b03811660009081526009602090815260408083205491839052822054600654600160801b926108109261080b926108059161080091906116fd565b611783565b90611793565b6117d1565b6106739190611fa5565b6005546001600160a01b0361010090910416331461084a5760405162461bcd60e51b81526004016106a990611f17565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6005546001600160a01b0361010090910416331461089e5760405162461bcd60e51b81526004016106a990611f17565b6001600160a01b03811660009081526012602052604090205460ff16156108c457600080fd5b6001600160a01b0381166000908152601260205260408120805460ff191660011790556108f29082906117e4565b60405163131836e760e21b8152600d60048201526001600160a01b038216602482015273a94a3d2ba5851e9b2e6e962f7e5f180ee8b857fa90634c60db9c9060440160006040518083038186803b15801561094c57600080fd5b505af4158015610960573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b6005546001600160a01b036101009091041633146109cb5760405162461bcd60e51b81526004016106a990611f17565b60006109d660025490565b116109e057600080fd5b8015610a5c57610a136109f260025490565b610a0083600160801b6116fd565b610a0a9190611fa5565b60065490611843565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600c54610a589082611843565b600c555b50565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161066f9185906107af9086611843565b600080600080600080600080600d73a94a3d2ba5851e9b2e6e962f7e5f180ee8b857fa63deb3d89690916040518263ffffffff1660e01b8152600401610add91815260200190565b60206040518083038186803b158015610af557600080fd5b505af4158015610b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2d9190611e94565b8910610b52575060009650600019955085945086935083925082915081905080610bfc565b6040516368d54f3f60e11b8152600d6004820152602481018a905260009073a94a3d2ba5851e9b2e6e962f7e5f180ee8b857fa9063d1aa9e7e9060440160206040518083038186803b158015610ba757600080fd5b505af4158015610bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdf9190611d8c565b9050610bea816112ac565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152607660248201526000805160206120ec83398151915260448201527f3a2077697468647261774469766964656e642064697361626c65642e2055736560648201527f207468652027636c61696d272066756e6374696f6e206f6e20746865206d616960848201527537102837b7b633b2b734b1b99031b7b73a3930b1ba1760511b60a482015260c4016106a9565b6005546001600160a01b03610100909104163314610cd85760405162461bcd60e51b81526004016106a990611f17565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b03610100909104163314610d585760405162461bcd60e51b81526004016106a990611f17565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600061067382610de3565b6060600480546105df9061203a565b600061066f33846107af85604051806060016040528060258152602001612134602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906116c6565b6001600160a01b0381166000908152600a602052604081205461067390610e09846107be565b906118a2565b600061066f338484611671565b6005546000906001600160a01b03610100909104163314610e4f5760405162461bcd60e51b81526004016106a990611f17565b6000610e5a846118fe565b90508015610ec6576001600160a01b038416600081815260136020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610eb49085815260200190565b60405180910390a36001915050610673565b5060009392505050565b6005546001600160a01b03610100909104163314610f005760405162461bcd60e51b81526004016106a990611f17565b6001600160a01b03821660009081526012602052604090205460ff1615610f25575050565b6015548110610fb657610f3882826117e4565b604051632f0ad01760e21b8152600d60048201526001600160a01b03831660248201526044810182905273a94a3d2ba5851e9b2e6e962f7e5f180ee8b857fa9063bc2b405c9060640160006040518083038186803b158015610f9957600080fd5b505af4158015610fad573d6000803e3d6000fd5b50505050611034565b610fc18260006117e4565b60405163131836e760e21b8152600d60048201526001600160a01b038316602482015273a94a3d2ba5851e9b2e6e962f7e5f180ee8b857fa90634c60db9c9060440160006040518083038186803b15801561101b57600080fd5b505af415801561102f573d6000803e3d6000fd5b505050505b61103f826001610e1c565b505050565b6005546001600160a01b036101009091041633146110745760405162461bcd60e51b81526004016106a990611f17565b610e1081101580156110895750620151808111155b6111075760405162461bcd60e51b815260206004820152605560248201526000805160206120ec83398151915260448201527f3a20636c61696d57616974206d757374206265207570646174656420746f206260648201527465747765656e203120616e6420323420686f75727360581b608482015260a4016106a9565b60145481141561117d5760405162461bcd60e51b815260206004820152604760248201526000805160206120ec83398151915260448201527f3a2043616e6e6f742075706461746520636c61696d5761697420746f2073616d606482015266652076616c756560c81b608482015260a4016106a9565b60145460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601455565b6005546001600160a01b036101009091041633146111e05760405162461bcd60e51b81526004016106a990611f17565b6001600160a01b0381166112455760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a9565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6040516317e142d160e01b8152600d60048201526001600160a01b0382166024820152819060009081908190819081908190819073a94a3d2ba5851e9b2e6e962f7e5f180ee8b857fa906317e142d19060440160206040518083038186803b15801561131757600080fd5b505af415801561132b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134f9190611e94565b96506000199550600087126113b15760115487111561137d57601154611376908890611a72565b95506113b1565b601154600d54600091106113925760006113a1565b601154600d546113a1916118a2565b90506113ad8882611793565b9650505b6113ba88610de3565b94506113c5886107be565b6001600160a01b0389166000908152601360205260409020549094509250826113ef5760006113fd565b6014546113fd908490611843565b915042821161140d576000611417565b61141782426118a2565b9050919395975091939597565b600d54600090819081908061144457505060115460009250829150611546565b6011546000805a90506000805b898410801561145f57508582105b15611535578461146e81612075565b600d549096508610905061148157600094505b6000600d60000186815481106114a757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031680835260139091526040909120549091506114d890611abe565b156114fb576114e8816001610e1c565b156114fb57816114f781612075565b9250505b8261150581612075565b93505060005a90508085111561152c5761152961152286836118a2565b8790611843565b95505b93506114519050565b601185905590975095509193505050505b9193909250565b6001600160a01b0383166115af5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106a9565b6001600160a01b0382166116105760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106a9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152603660248201526000805160206120ec8339815191526044820152750e88139bc81d1c985b9cd9995c9cc8185b1b1bddd95960521b60648201526084016106a9565b600081848411156116ea5760405162461bcd60e51b81526004016106a99190611ec4565b506116f58385612023565b949350505050565b60008261170c57506000610673565b60006117188385611fc5565b9050826117258583611fa5565b1461177c5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016106a9565b9392505050565b6000818181121561067357600080fd5b6000806117a08385611f4c565b9050600083121580156117b35750838112155b806117c857506000831280156117c857508381125b61177c57600080fd5b6000808212156117e057600080fd5b5090565b6001600160a01b0382166000908152602081905260409020548082111561182357600061181183836118a2565b905061181d8482611ae5565b50505050565b8082101561103f57600061183782846118a2565b905061181d8482611b49565b6000806118508385611f8d565b90508381101561177c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016106a9565b6000828211156118f45760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f77000060448201526064016106a9565b61177c8284612023565b60008061190a83610de3565b90508015611a69576001600160a01b0383166000908152600a60205260409020546119359082611843565b6001600160a01b0384166000818152600a6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906119849084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb90604401602060405180830381600087803b1580156119db57600080fd5b505af11580156119ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a139190611e78565b905080611a62576001600160a01b0384166000908152600a6020526040902054611a3d90836118a2565b6001600160a01b039094166000908152600a6020526040812094909455509192915050565b5092915050565b50600092915050565b6000808212158015611a8d575082611a8a8382611fe4565b13155b80611aab5750600082128015611aab575082611aa98382611fe4565b135b611ab457600080fd5b61177c8284611fe4565b600042821115611ad057506000919050565b601454611add42846118a2565b101592915050565b611aef8282611b8d565b611b29611b0a610800836006546116fd90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611a72565b6001600160a01b0390921660009081526009602052604090209190915550565b611b538282611c6c565b611b29611b6e610800836006546116fd90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611793565b6001600160a01b038216611be35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106a9565b600254611bf09082611843565b6002556001600160a01b038216600090815260208190526040902054611c169082611843565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216611ccc5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106a9565b611d09816040518060600160405280602281526020016120ca602291396001600160a01b03851660009081526020819052604090205491906116c6565b6001600160a01b038316600090815260208190526040902055600254611d2f90826118a2565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611c60565b600060208284031215611d81578081fd5b813561177c816120a6565b600060208284031215611d9d578081fd5b815161177c816120a6565b60008060408385031215611dba578081fd5b8235611dc5816120a6565b91506020830135611dd5816120bb565b809150509250929050565b60008060408385031215611df2578182fd5b8235611dfd816120a6565b946020939093013593505050565b60008060408385031215611e1d578182fd5b8235611e28816120a6565b91506020830135611dd5816120a6565b600080600060608486031215611e4c578081fd5b8335611e57816120a6565b92506020840135611e67816120a6565b929592945050506040919091013590565b600060208284031215611e89578081fd5b815161177c816120bb565b600060208284031215611ea5578081fd5b5051919050565b600060208284031215611ebd578081fd5b5035919050565b6000602080835283518082850152825b81811015611ef057858101830151858201604001528201611ed4565b81811115611f015783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600080821280156001600160ff1b0384900385131615611f6e57611f6e612090565b600160ff1b8390038412811615611f8757611f87612090565b50500190565b60008219821115611fa057611fa0612090565b500190565b600082611fc057634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611fdf57611fdf612090565b500290565b60008083128015600160ff1b85018412161561200257612002612090565b6001600160ff1b038401831381161561201d5761201d612090565b50500390565b60008282101561203557612035612090565b500390565b600181811c9082168061204e57607f821691505b6020821081141561206f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561208957612089612090565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610a5c57600080fd5b8015158114610a5c57600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e6365506f6f6c67656e6963735f557364635f4469766964656e645f547261636b657245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e3f6cf25ef1c485958c1a5f253ae25bfabecf2bf7d84f9d769f864472eb0819364736f6c63430008040033506f6f6c67656e6963735f557364635f4469766964656e645f547261636b65724f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106104985760003560e01c806373f3111711610260578063b13f725d11610144578063dd15fb37116100c1578063e4ab431f11610085578063e4ab431f14610e36578063e765ae0914610e56578063e84d44f814610e77578063e98030c714610e98578063f2fde38b14610eb8578063fb7f634a14610ed857600080fd5b8063dd15fb3714610d7a578063dd62ed3e14610d9a578063e06d181514610de0578063e27ad5eb14610e00578063e2f4560514610e2057600080fd5b8063bbde77c111610108578063bbde77c114610cf8578063c024666814610d0e578063c49b9a8014610d2e578063c4e8231214610d4e578063d7d31f5f14610d6457600080fd5b8063b13f725d14610c5d578063b2dedea914610c7d578063b3b5e04314610c92578063b62496f514610cb2578063b783b27914610ce257600080fd5b806398118cb4116101dd578063a6b63888116101a1578063a6b6388814610ba7578063a9059cbb14610bbd578063a9a7598a14610bdd578063aacebbe314610bfd578063abdbd73714610c1d578063afa4f3b214610c3d57600080fd5b806398118cb414610b1b5780639a7a23d614610b315780639c1b8af514610b515780639ca084d314610b67578063a457c2d714610b8757600080fd5b80637e659678116102245780637e65967814610a99578063871c128d14610aae5780638da5cb5b14610ace57806392f788db14610af157806395d89b4114610b0657600080fd5b806373f311171461099c57806375f0a874146109bc5780637adc0146146109dc5780637b16cea014610a415780637ded4d6a14610a7957600080fd5b806333d01586116103875780634e71d92d1161030457806365b8dbc0116102c857806365b8dbc0146108db57806368577176146108fb5780636b67c4df1461091b578063700bb1911461093157806370a0823114610951578063715018a61461098757600080fd5b80634e71d92d1461085a5780634fd0dc241461086f578063545f878f1461088f5780635c38ffe2146108a55780635fd65fea146108c557600080fd5b8063429f1add1161034b578063429f1add146107b95780634303443d146107cf57806349bd5a5e146107ef5780634a74bb02146108235780634af25a881461084457600080fd5b806333d0158614610700578063355cc3f41461072057806339509351146107405780633b364da8146107605780633bbac5791461078057600080fd5b806318160ddd116104155780632dc57b8d116103d95780632dc57b8d1461067c5780632faabe42146106925780632fdc1cf1146106a85780633030ca8b146106be578063313ce567146106de57600080fd5b806318160ddd146105f157806322bd3f7f1461060657806323b872dd1461061c578063263b5fcb1461063c57806327c8f8351461065c57600080fd5b806309c58fcd1161045c57806309c58fcd1461054a5780631129e65b1461056b57806313114a9d1461058d57806315b678c1146105a35780631694505e146105b957600080fd5b806301759602146104a457806302259e9e146104cc57806304f54675146104e257806306fdde03146104f8578063095ea7b31461051a57600080fd5b3661049f57005b600080fd5b3480156104b057600080fd5b506104b9610ef8565b6040519081526020015b60405180910390f35b3480156104d857600080fd5b506104b9600c5481565b3480156104ee57600080fd5b506104b960195481565b34801561050457600080fd5b5061050d610f7a565b6040516104c39190614065565b34801561052657600080fd5b5061053a610535366004613f7a565b61100c565b60405190151581526020016104c3565b34801561055657600080fd5b5060085461053a90600160a81b900460ff1681565b34801561057757600080fd5b5061058b610586366004613e34565b611023565b005b34801561059957600080fd5b506104b960155481565b3480156105af57600080fd5b506104b9601c5481565b3480156105c557600080fd5b506006546105d9906001600160a01b031681565b6040516001600160a01b0390911681526020016104c3565b3480156105fd57600080fd5b506002546104b9565b34801561061257600080fd5b506104b9601e5481565b34801561062857600080fd5b5061053a610637366004613ea4565b6110c9565b34801561064857600080fd5b5061058b610657366004613fa5565b611132565b34801561066857600080fd5b506008546105d9906001600160a01b031681565b34801561068857600080fd5b506104b960185481565b34801561069e57600080fd5b506104b960125481565b3480156106b457600080fd5b506104b960105481565b3480156106ca57600080fd5b5061058b6106d936600461400d565b6111f4565b3480156106ea57600080fd5b5060055460405160ff90911681526020016104c3565b34801561070c57600080fd5b5061058b61071b366004613e34565b611232565b34801561072c57600080fd5b506007546105d9906001600160a01b031681565b34801561074c57600080fd5b5061053a61075b366004613f7a565b6112c5565b34801561076c57600080fd5b5061058b61077b366004613fdd565b6112fb565b34801561078c57600080fd5b5061053a61079b366004613e34565b6001600160a01b031660009081526022602052604090205460ff1690565b3480156107c557600080fd5b506104b960175481565b3480156107db57600080fd5b5061058b6107ea366004613e34565b61135c565b3480156107fb57600080fd5b506105d97f000000000000000000000000fc0711496b6dcb072bbe82ed629ec14eaf26b3e781565b34801561082f57600080fd5b5060085461053a90600160b81b900460ff1681565b34801561085057600080fd5b506104b9601a5481565b34801561086657600080fd5b5061058b6114d4565b34801561087b57600080fd5b5061058b61088a366004613fdd565b611558565b34801561089b57600080fd5b506104b9601d5481565b3480156108b157600080fd5b5061058b6108c0366004613fdd565b61158d565b3480156108d157600080fd5b506104b960145481565b3480156108e757600080fd5b5061058b6108f6366004613e34565b6115d5565b34801561090757600080fd5b506009546105d9906001600160a01b031681565b34801561092757600080fd5b506104b960135481565b34801561093d57600080fd5b5061058b61094c366004613fdd565b6116d8565b34801561095d57600080fd5b506104b961096c366004613e34565b6001600160a01b031660009081526020819052604090205490565b34801561099357600080fd5b5061058b6117e9565b3480156109a857600080fd5b5061058b6109b7366004613e34565b611869565b3480156109c857600080fd5b50600a546105d9906001600160a01b031681565b3480156109e857600080fd5b506109fc6109f7366004613e34565b611c05565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016104c3565b348015610a4d57600080fd5b5061053a610a5c366004613e34565b6001600160a01b0316600090815260208052604090205460ff1690565b348015610a8557600080fd5b5061058b610a94366004613e34565b611caf565b348015610aa557600080fd5b506104b9611e9b565b348015610aba57600080fd5b5061058b610ac9366004613fdd565b611ee0565b348015610ada57600080fd5b5060055461010090046001600160a01b03166105d9565b348015610afd57600080fd5b506104b9611fbd565b348015610b1257600080fd5b5061050d612002565b348015610b2757600080fd5b506104b9600f5481565b348015610b3d57600080fd5b5061058b610b4c366004613ee4565b612011565b348015610b5d57600080fd5b506104b9601f5481565b348015610b7357600080fd5b506104b9610b82366004613e34565b61210d565b348015610b9357600080fd5b5061053a610ba2366004613f7a565b61218c565b348015610bb357600080fd5b506104b9600b5481565b348015610bc957600080fd5b5061053a610bd8366004613f7a565b6121db565b348015610be957600080fd5b506109fc610bf8366004613fdd565b6121e8565b348015610c0957600080fd5b5061058b610c18366004613e34565b61222a565b348015610c2957600080fd5b5061058b610c38366004613e34565b612345565b348015610c4957600080fd5b5061058b610c58366004613fdd565b6123be565b348015610c6957600080fd5b5061058b610c78366004613e34565b612406565b348015610c8957600080fd5b506104b9612468565b348015610c9e57600080fd5b5061058b610cad366004613fdd565b6124ad565b348015610cbe57600080fd5b5061053a610ccd366004613e34565b60216020526000908152604090205460ff1681565b348015610cee57600080fd5b506104b960165481565b348015610d0457600080fd5b506104b9600d5481565b348015610d1a57600080fd5b5061058b610d29366004613ee4565b6124f5565b348015610d3a57600080fd5b5061058b610d49366004613fa5565b612609565b348015610d5a57600080fd5b506104b960115481565b348015610d7057600080fd5b506104b9601b5481565b348015610d8657600080fd5b5061058b610d95366004613fa5565b6126c4565b348015610da657600080fd5b506104b9610db5366004613e6c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610dec57600080fd5b5061058b610dfb36600461400d565b61277f565b348015610e0c57600080fd5b5061058b610e1b366004613fa5565b6127bd565b348015610e2c57600080fd5b506104b9600e5481565b348015610e4257600080fd5b506104b9610e51366004613e34565b61280b565b348015610e6257600080fd5b5060085461053a90600160c01b900460ff1681565b348015610e8357600080fd5b5060085461053a90600160b01b900460ff1681565b348015610ea457600080fd5b5061058b610eb3366004613fdd565b61283e565b348015610ec457600080fd5b5061058b610ed3366004613e34565b61289f565b348015610ee457600080fd5b5061058b610ef3366004613fdd565b61299b565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610f3d57600080fd5b505afa158015610f51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f759190613ff5565b905090565b606060038054610f899061428a565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb59061428a565b80156110025780601f10610fd757610100808354040283529160200191611002565b820191906000526020600020905b815481529060010190602001808311610fe557829003601f168201915b5050505050905090565b6000611019338484612a36565b5060015b92915050565b6005546001600160a01b0361010090910416331461105c5760405162461bcd60e51b815260040161105390614132565b60405180910390fd5b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b1580156110a357600080fd5b505af11580156110b7573d6000803e3d6000fd5b505050506110c68160016124f5565b50565b60006110d6848484612b5b565b611128843361112385604051806060016040528060288152602001614340602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906133c9565b612a36565b5060019392505050565b6005546001600160a01b036101009091041633146111625760405162461bcd60e51b815260040161105390614132565b60085460ff600160b01b90910416151581151514156111935760405162461bcd60e51b8152600401611053906140fb565b806111bb5760138054601455600090556008805460ff60b01b1916600160b01b831515021790555b60405181151581527f6ba6c1012539169f5a820a29533d8c8b797a1c7a5634edbd3124a80de0e75cba906020015b60405180910390a150565b6005546001600160a01b036101009091041633146112245760405162461bcd60e51b815260040161105390614132565b601792909255601855601655565b6005546001600160a01b036101009091041633146112625760405162461bcd60e51b815260040161105390614132565b600954604051632b2e05c160e01b81526001600160a01b03838116600483015290911690632b2e05c1906024015b600060405180830381600087803b1580156112aa57600080fd5b505af11580156112be573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161101991859061112390866129d0565b6005546001600160a01b0361010090910416331461132b5760405162461bcd60e51b815260040161105390614132565b600954604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e8990602401611290565b6005546001600160a01b0361010090910416331461138c5760405162461bcd60e51b815260040161105390614132565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03821614156114055760405162461bcd60e51b8152602060048201526024808201527f57652063616e206e6f7420626c61636b6c69737420556e697377617020726f756044820152633a32b91760e11b6064820152608401611053565b6001600160a01b03811660009081526022602052604090205460ff161561146e5760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c697374656400006044820152606401611053565b6001600160a01b03166000818152602260205260408120805460ff191660019081179091556023805491820181559091527fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f42300180546001600160a01b0319169091179055565b60095460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b15801561152057600080fd5b505af1158015611534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c69190613fc1565b6005546001600160a01b036101009091041633146115885760405162461bcd60e51b815260040161105390614132565b600d55565b6005546001600160a01b036101009091041633146115bd5760405162461bcd60e51b815260040161105390614132565b6115cf81670de0b6b3a7640000614254565b600c5550565b6005546001600160a01b036101009091041633146116055760405162461bcd60e51b815260040161105390614132565b6006546001600160a01b038281169116141561167b5760405162461bcd60e51b815260206004820152602f60248201527f506f6f6c67656e6963733a2054686520726f7574657220616c7265616479206860448201526e61732074686174206164647265737360881b6064820152608401611053565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146117085760405162461bcd60e51b815260040161105390614132565b6009546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561175657600080fd5b505af115801561176a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178e9190614038565b604080518481526020810184905290810182905260608101889052929550909350915032906000907f49976912427047b8f132fa0f9db21ff5bb683037da359fb0c21670db80d8755e9060800160405180910390a350505050565b6005546001600160a01b036101009091041633146118195760405162461bcd60e51b815260040161105390614132565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b036101009091041633146118995760405162461bcd60e51b815260040161105390614132565b6009546001600160a01b038281169116141561191d5760405162461bcd60e51b815260206004820152603960248201527f506f6f6c67656e6963733a20546865206469766964656e6420747261636b657260448201527f20616c72656164792068617320746861742061646472657373000000000000006064820152608401611053565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561196557600080fd5b505afa158015611979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199d9190613e50565b6001600160a01b031614611a355760405162461bcd60e51b815260206004820152605360248201527f506f6f6c67656e6963733a20546865206e6577206469766964656e642074726160448201527f636b6572206d757374206265206f776e65642062792074686520506f6f6c67656064820152721b9a58dcc81d1bdad95b8818dbdb9d1c9858dd606a1b608482015260a401611053565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611a7757600080fd5b505af1158015611a8b573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611ad057600080fd5b505af1158015611ae4573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611b2f57600080fd5b505af1158015611b43573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611b8e57600080fd5b505af1158015611ba2573d6000803e3d6000fd5b50506009546040516001600160a01b03918216935090851691507f975e1e48f3be6366c30d5670bbee63ba02c81a0c697664d89dbce019a9f9d96890600090a3600980546001600160a01b0319166001600160a01b039290921691909117905550565b60095460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b158015611c5c57600080fd5b505afa158015611c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c949190613f11565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03610100909104163314611cdf5760405162461bcd60e51b815260040161105390614132565b6001600160a01b03811660009081526022602052604090205460ff16611d475760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f7420626c61636b6c69737465640000000000006044820152606401611053565b60005b602354811015611e9757816001600160a01b031660238281548110611d7f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415611e855760238054611daa90600190614273565b81548110611dc857634e487b7160e01b600052603260045260246000fd5b600091825260209091200154602380546001600160a01b039092169183908110611e0257634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152602290915260409020805460ff191690556023805480611e5f57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80611e8f816142c5565b915050611d4a565b5050565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610f3d57600080fd5b6005546001600160a01b03610100909104163314611f105760405162461bcd60e51b815260040161105390614132565b601f54811415611f885760405162461bcd60e51b815260206004820152603860248201527f506f6f6c67656e6963733a2043616e6e6f742075706461746520676173466f7260448201527f50726f63657373696e6720746f2073616d652076616c756500000000000000006064820152608401611053565b601f819055604051819081907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a350565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610f3d57600080fd5b606060048054610f899061428a565b6005546001600160a01b036101009091041633146120415760405162461bcd60e51b815260040161105390614132565b7f000000000000000000000000fc0711496b6dcb072bbe82ed629ec14eaf26b3e76001600160a01b0316826001600160a01b031614156121035760405162461bcd60e51b815260206004820152605160248201527f506f6f6c67656e6963733a205468652050616e63616b6553776170207061697260448201527f2063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465606482015270644d61726b65744d616b6572506169727360781b608482015260a401611053565b611e978282613400565b6009546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561215457600080fd5b505afa158015612168573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101d9190613ff5565b6000611019338461112385604051806060016040528060258152602001614368602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906133c9565b6000611019338484612b5b565b600954604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611c43565b6005546001600160a01b0361010090910416331461225a5760405162461bcd60e51b815260040161105390614132565b600a546001600160a01b03828116911614156122de5760405162461bcd60e51b815260206004820152603860248201527f506f6f6c67656e6963733a20546865206d61726b6574696e672077616c6c657460448201527f20697320616c72656164792074686973206164647265737300000000000000006064820152608401611053565b6122e98160016124f5565b600a546040516001600160a01b038084169216907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146123755760405162461bcd60e51b815260040161105390614132565b600780546001600160a01b0319166001600160a01b03838116918217909255600954604051633f1f3fe960e11b8152600481019290925290911690637e3e7fd290602401611290565b6005546001600160a01b036101009091041633146123ee5760405162461bcd60e51b815260040161105390614132565b61240081670de0b6b3a7640000614254565b600e5550565b6005546001600160a01b036101009091041633146124365760405162461bcd60e51b815260040161105390614132565b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401611290565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610f3d57600080fd5b6005546001600160a01b036101009091041633146124dd5760405162461bcd60e51b815260040161105390614132565b6124ef81670de0b6b3a7640000614254565b600b5550565b6005546001600160a01b036101009091041633146125255760405162461bcd60e51b815260040161105390614132565b6001600160a01b038216600090815260208052604090205460ff16151581151514156125ac5760405162461bcd60e51b815260206004820152603060248201527f506f6f6c67656e6963733a204163636f756e7420697320616c7265616479206560448201526f786c756465642066726f6d206665657360801b6064820152608401611053565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b036101009091041633146126395760405162461bcd60e51b815260040161105390614132565b60085460ff600160b81b909104161515811515141561266a5760405162461bcd60e51b8152600401611053906140fb565b8061269257600f8054601055600090556008805460ff60b81b1916600160b81b831515021790555b60405181151581527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906020016111e9565b6005546001600160a01b036101009091041633146126f45760405162461bcd60e51b815260040161105390614132565b60085460ff600160c01b90910416151581151514156127255760405162461bcd60e51b8152600401611053906140fb565b8061274d5760118054601255600090556008805460ff60c01b1916600160c01b831515021790555b60405181151581527fb6a3eb125d007e68d45465eaabf06e196e5a8c4f3a83f9a334d68ea8ddab1e3f906020016111e9565b6005546001600160a01b036101009091041633146127af5760405162461bcd60e51b815260040161105390614132565b601b92909255601a55601955565b6005546001600160a01b036101009091041633146127ed5760405162461bcd60e51b815260040161105390614132565b60088054911515600160a81b0260ff60a81b19909216919091179055565b6009546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161213c565b6005546001600160a01b0361010090910416331461286e5760405162461bcd60e51b815260040161105390614132565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401611290565b6005546001600160a01b036101009091041633146128cf5760405162461bcd60e51b815260040161105390614132565b6001600160a01b0381166129345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611053565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b036101009091041633146129cb5760405162461bcd60e51b815260040161105390614132565b601e55565b6000806129dd838561421c565b905083811015612a2f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611053565b9392505050565b6001600160a01b038316612a985760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611053565b6001600160a01b038216612af95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611053565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612b815760405162461bcd60e51b815260040161105390614167565b6001600160a01b038216612ba75760405162461bcd60e51b8152600401611053906140b8565b6001600160a01b03821660009081526022602052604090205460ff1615612c0a5760405162461bcd60e51b8152602060048201526017602482015276596f752068617665206e6f20706f77657220686572652160481b6044820152606401611053565b3260009081526022602052604090205460ff1615612c645760405162461bcd60e51b8152602060048201526017602482015276596f752068617665206e6f20706f77657220686572652160481b6044820152606401611053565b600854600160a81b900460ff1680612cb457506001600160a01b038316600090815260208052604090205460ff1680612cb457506001600160a01b038216600090815260208052604090205460ff165b612d105760405162461bcd60e51b815260206004820152602760248201527f506f6f6c67656e6963733a2054726164696e6720686173206e6f7420737461726044820152661d1959081e595d60ca1b6064820152608401611053565b6001600160a01b038316600090815260208052604081205460ff1680612d4d57506001600160a01b038316600090815260208052604090205460ff165b6001600160a01b03841660009081526021602052604090205490915060ff16158015612d825750600854600160a81b900460ff165b8015612d8c575080155b15612e2057600d54612dbd83612db7866001600160a01b031660009081526020819052604090205490565b906129d0565b1115612e205760405162461bcd60e51b815260206004820152602c60248201527f57616c6c65742062616c616e636520697320657863656564696e67206d61785760448201526b616c6c657442616c616e636560a01b6064820152608401611053565b600854600160a81b900460ff168015612e5157506001600160a01b03841660009081526021602052604090205460ff165b8015612e5b575080155b15612eda57600b54821115612ec35760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401611053565b601654601155601754601355601854600f55612fa5565b600854600160a81b900460ff168015612f0b57506001600160a01b03831660009081526021602052604090205460ff165b8015612f15575080155b15612fa557600c54821115612f925760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401611053565b601954601155601b54601355601a54600f555b30600090815260208190526040902054600e546008549082101590600160a01b900460ff16158015612fd45750805b801561301257507f000000000000000000000000fc0711496b6dcb072bbe82ed629ec14eaf26b3e76001600160a01b0316866001600160a01b031614155b15613081576008805460ff60a01b1916600160a01b1790819055600160b81b900460ff161561304e57601d546130478161359c565b506000601d555b600854600160c01b900460ff161561307357601c5461306c81613624565b506000601c555b6008805460ff60a01b191690555b600854600090600160a81b900460ff1680156130a75750600854600160a01b900460ff16155b80156130b1575083155b905080156131ba576000806000806130df60646130d96013548c6136da90919063ffffffff16565b90613759565b92506130fb60646130d96011548c6136da90919063ffffffff16565b915061311760646130d9600f548c6136da90919063ffffffff16565b905061312781612db785856129d0565b601c5490945061313790836129d0565b601c55601d5461314790826129d0565b601d556001600160a01b038a1660009081526021602052604090205460ff161561318657601e546131839061317d866064613759565b906136da565b93505b61319089856137b4565b985061319d8b3086613810565b600a546131b59030906001600160a01b031685613810565b505050505b6131c5878787613810565b6009546001600160a01b031663e30443bc886131f6816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561323c57600080fd5b505af192505050801561324d575060015b506009546001600160a01b031663e30443bc8761327f816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156132c557600080fd5b505af19250505080156132d6575060015b50600854600160a01b900460ff166133c057601f546009546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b15801561333457600080fd5b505af1925050508015613364575060408051601f3d908101601f1916820190925261336191810190614038565b60015b61336d576133be565b60408051848152602081018490529081018290526060810185905232906001907f49976912427047b8f132fa0f9db21ff5bb683037da359fb0c21670db80d8755e9060800160405180910390a35050505b505b50505050505050565b600081848411156133ed5760405162461bcd60e51b81526004016110539190614065565b506133f88385614273565b949350505050565b6005546001600160a01b036101009091041633146134305760405162461bcd60e51b815260040161105390614132565b6001600160a01b03821660009081526021602052604090205460ff16151581151514156134d35760405162461bcd60e51b8152602060048201526044602482018190527f506f6f6c67656e6963733a204175746f6d61746564206d61726b6574206d616b908201527f6572207061697220697320616c72656164792073657420746f20746861742076606482015263616c756560e01b608482015260a401611053565b6001600160a01b0382166000908152602160205260409020805460ff191682158015919091179091556135605760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561354757600080fd5b505af115801561355b573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60006135a9826002613759565b905060006135b783836137b4565b9050476135c383613919565b60006135cf47836137b4565b90506135db8382613a9e565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561906060015b60405180910390a15050505050565b60075461363d90829030906001600160a01b0316613b5a565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561368157600080fd5b505afa158015613695573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136b99190613ff5565b600754600954919250611e97916001600160a01b0391821691168084613d1b565b6000826136e95750600061101d565b60006136f58385614254565b9050826137028583614234565b14612a2f5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611053565b60008082116137aa5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401611053565b612a2f8284614234565b6000828211156138065760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401611053565b612a2f8284614273565b6001600160a01b0383166138365760405162461bcd60e51b815260040161105390614167565b6001600160a01b03821661385c5760405162461bcd60e51b8152600401611053906140b8565b6138998160405180606001604052806026815260200161431a602691396001600160a01b03861660009081526020819052604090205491906133c9565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546138c890826129d0565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612b4e565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061395c57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156139b057600080fd5b505afa1580156139c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e89190613e50565b81600181518110613a0957634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654613a2f9130911684612a36565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613a689085906000908690309042906004016141ac565b600060405180830381600087803b158015613a8257600080fd5b505af1158015613a96573d6000803e3d6000fd5b505050505050565b600654613ab69030906001600160a01b031684612a36565b600654600a5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b158015613b2157600080fd5b505af1158015613b35573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112be9190614038565b60408051600380825260808201909252600091602082016060803683370190505090503081600081518110613b9f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015613bf357600080fd5b505afa158015613c07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c2b9190613e50565b81600181518110613c4c57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508181600281518110613c8e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654613cb49130911686612a36565b600654604051635c11d79560e01b81526001600160a01b0390911690635c11d79590613ced9087906000908690899042906004016141ac565b600060405180830381600087803b158015613d0757600080fd5b505af11580156133be573d6000803e3d6000fd5b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000919086169063a9059cbb90604401602060405180830381600087803b158015613d6957600080fd5b505af1158015613d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613da19190613fc1565b905080156112be57604051633243c79160e01b8152600481018390526001600160a01b03841690633243c79190602401600060405180830381600087803b158015613deb57600080fd5b505af1158015613dff573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b18260405161361591815260200190565b600060208284031215613e45578081fd5b8135612a2f816142f6565b600060208284031215613e61578081fd5b8151612a2f816142f6565b60008060408385031215613e7e578081fd5b8235613e89816142f6565b91506020830135613e99816142f6565b809150509250929050565b600080600060608486031215613eb8578081fd5b8335613ec3816142f6565b92506020840135613ed3816142f6565b929592945050506040919091013590565b60008060408385031215613ef6578182fd5b8235613f01816142f6565b91506020830135613e998161430b565b600080600080600080600080610100898b031215613f2d578384fd5b8851613f38816142f6565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060408385031215613f8c578182fd5b8235613f97816142f6565b946020939093013593505050565b600060208284031215613fb6578081fd5b8135612a2f8161430b565b600060208284031215613fd2578081fd5b8151612a2f8161430b565b600060208284031215613fee578081fd5b5035919050565b600060208284031215614006578081fd5b5051919050565b600080600060608486031215614021578283fd5b505081359360208301359350604090920135919050565b60008060006060848603121561404c578283fd5b8351925060208401519150604084015190509250925092565b6000602080835283518082850152825b8181101561409157858101830151858201604001528201614075565b818111156140a25783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601d908201527f43616e27742073657420666c616720746f2073616d6520737461747573000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156141fb5784516001600160a01b0316835293830193918301916001016141d6565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561422f5761422f6142e0565b500190565b60008261424f57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561426e5761426e6142e0565b500290565b600082821015614285576142856142e0565b500390565b600181811c9082168061429e57607f821691505b602082108114156142bf57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156142d9576142d96142e0565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146110c657600080fd5b80151581146110c657600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220dd90793babb1c46343cefa2b8f1522ed07a68cf2fa6f6792d2972129a9d7408d64736f6c63430008040033

Libraries Used


Deployed Bytecode Sourcemap

31565:21940:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42487:149;;;;;;;;;;;;;:::i;:::-;;;19135:25:1;;;19123:2;19108:18;42487:149:0;;;;;;;;32237:60;;;;;;;;;;;;;;;;32910:44;;;;;;;;;;;;;;;;2611:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3512:169::-;;;;;;;;;;-1:-1:-1;3512:169:0;;;;;:::i;:::-;;:::i;:::-;;;6971:14:1;;6964:22;6946:41;;6934:2;6919:18;3512:169:0;6901:92:1;31890:35:0;;;;;;;;;;-1:-1:-1;31890:35:0;;;;-1:-1:-1;;;31890:35:0;;;;;;36339:241;;;;;;;;;;-1:-1:-1;36339:241:0;;;;;:::i;:::-;;:::i;:::-;;32681:85;;;;;;;;;;;;;;;;33041:43;;;;;;;;;;;;;;;;31646:41;;;;;;;;;;-1:-1:-1;31646:41:0;;;;-1:-1:-1;;;;;31646:41:0;;;;;;-1:-1:-1;;;;;4565:32:1;;;4547:51;;4535:2;4520:18;31646:41:0;4502:102:1;2915:108:0;;;;;;;;;;-1:-1:-1;3003:12:0;;2915:108;;33136:42;;;;;;;;;;;;;;;;3690:325;;;;;;;;;;-1:-1:-1;3690:325:0;;;;;:::i;:::-;;:::i;38491:373::-;;;;;;;;;;-1:-1:-1;38491:373:0;;;;;:::i;:::-;;:::i;31781:71::-;;;;;;;;;;-1:-1:-1;31781:71:0;;;;-1:-1:-1;;;;;31781:71:0;;;32873:28;;;;;;;;;;;;;;;;32549:45;;;;;;;;;;;;;;;;32461:35;;;;;;;;;;;;;;;;51988:262;;;;;;;;;;-1:-1:-1;51988:262:0;;;;;:::i;:::-;;:::i;2815:91::-;;;;;;;;;;-1:-1:-1;2889:9:0;;2815:91;;2889:9;;;;21021:36:1;;21009:2;20994:18;2815:91:0;20976:87:1;37939:117:0;;;;;;;;;;-1:-1:-1;37939:117:0;;;;;:::i;:::-;;:::i;31742:32::-;;;;;;;;;;-1:-1:-1;31742:32:0;;;;-1:-1:-1;;;;;31742:32:0;;;4024:218;;;;;;;;;;-1:-1:-1;4024:218:0;;;;;:::i;:::-;;:::i;42024:183::-;;;;;;;;;;-1:-1:-1;42024:183:0;;;;;:::i;:::-;;:::i;52520:112::-;;;;;;;;;;-1:-1:-1;52520:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;52598:26:0;52573:4;52598:26;;;:17;:26;;;;;;;;;52520:112;32831:35;;;;;;;;;;;;;;;;52636:352;;;;;;;;;;-1:-1:-1;52636:352:0;;;;;:::i;:::-;;:::i;31694:38::-;;;;;;;;;;;;;;;31974:40;;;;;;;;;;-1:-1:-1;31974:40:0;;;;-1:-1:-1;;;31974:40:0;;;;;;32961:27;;;;;;;;;;;;;;;;44113:105;;;;;;;;;;;;;:::i;36588:124::-;;;;;;;;;;-1:-1:-1;36588:124:0;;;;;:::i;:::-;;:::i;33091:36::-;;;;;;;;;;;;;;;;36860:129;;;;;;;;;;-1:-1:-1;36860:129:0;;;;;:::i;:::-;;:::i;32637:35::-;;;;;;;;;;;;;;;;40207:321;;;;;;;;;;-1:-1:-1;40207:321:0;;;;;:::i;:::-;;:::i;32071:46::-;;;;;;;;;;-1:-1:-1;32071:46:0;;;;-1:-1:-1;;;;;32071:46:0;;;32603:27;;;;;;;;;;;;;;;;43796:308;;;;;;;;;;-1:-1:-1;43796:308:0;;;;;:::i;:::-;;:::i;3032:127::-;;;;;;;;;;-1:-1:-1;3032:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;3133:18:0;3106:7;3133:18;;;;;;;;;;;;3032:127;1013:148;;;;;;;;;;;;;:::i;39278:920::-;;;;;;;;;;-1:-1:-1;39278:920:0;;;;;:::i;:::-;;:::i;32130:30::-;;;;;;;;;;-1:-1:-1;32130:30:0;;;;-1:-1:-1;;;;;32130:30:0;;;43116:326;;;;;;;;;;-1:-1:-1;43116:326:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5566:32:1;;;5548:51;;5630:2;5615:18;;5608:34;;;;5658:18;;;5651:34;;;;5716:2;5701:18;;5694:34;;;;5759:3;5744:19;;5737:35;5586:3;5788:19;;5781:35;5847:3;5832:19;;5825:35;5891:3;5876:19;;5869:35;5535:3;5520:19;43116:326:0;5502:408:1;42654:127:0;;;;;;;;;;-1:-1:-1;42654:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;42746:27:0;42722:4;42746:27;;;:18;:27;;;;;;;;;42654:127;53000:500;;;;;;;;;;-1:-1:-1;53000:500:0;;;;;:::i;:::-;;:::i;44384:149::-;;;;;;;;;;;;;:::i;41725:290::-;;;;;;;;;;-1:-1:-1;41725:290:0;;;;;:::i;:::-;;:::i;788:87::-;;;;;;;;;;-1:-1:-1;861:6:0;;;;;-1:-1:-1;;;;;861:6:0;788:87;;44224:142;;;;;;;;;;;;;:::i;2711:95::-;;;;;;;;;;;;;:::i;32427:27::-;;;;;;;;;;;;;;;;40999:269;;;;;;;;;;-1:-1:-1;40999:269:0;;;;;:::i;:::-;;:::i;33188:40::-;;;;;;;;;;;;;;;;42961:140;;;;;;;;;;-1:-1:-1;42961:140:0;;;;;:::i;:::-;;:::i;4251:269::-;;;;;;;;;;-1:-1:-1;4251:269:0;;;;;:::i;:::-;;:::i;32170:60::-;;;;;;;;;;;;;;;;3168:175;;;;;;;;;;-1:-1:-1;3168:175:0;;;;;:::i;:::-;;:::i;43451:333::-;;;;;;;;;;-1:-1:-1;43451:333:0;;;;;:::i;:::-;;:::i;37198:334::-;;;;;;;;;;-1:-1:-1;37198:334:0;;;;;:::i;:::-;;:::i;37000:190::-;;;;;;;;;;-1:-1:-1;37000:190:0;;;;;:::i;:::-;;:::i;37540:131::-;;;;;;;;;;-1:-1:-1;37540:131:0;;;;;:::i;:::-;;:::i;40841:149::-;;;;;;;;;;-1:-1:-1;40841:149:0;;;;;:::i;:::-;;:::i;42355:116::-;;;;;;;;;;;;;:::i;36720:127::-;;;;;;;;;;-1:-1:-1;36720:127:0;;;;;:::i;:::-;;:::i;33449:58::-;;;;;;;;;;-1:-1:-1;33449:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;32779:45;;;;;;;;;;;;;;;;32304:55;;;;;;;;;;;;;;;;40537:295;;;;;;;;;;-1:-1:-1;40537:295:0;;;;;:::i;:::-;;:::i;38873:393::-;;;;;;;;;;-1:-1:-1;38873:393:0;;;;;:::i;:::-;;:::i;32505:37::-;;;;;;;;;;;;;;;;32995:34;;;;;;;;;;;;;;;;38065:414;;;;;;;;;;-1:-1:-1;38065:414:0;;;;;:::i;:::-;;:::i;3352:151::-;;;;;;;;;;-1:-1:-1;3352:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;3468:18:0;;;3441:7;3468:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3352:151;52252:260;;;;;;;;;;-1:-1:-1;52252:260:0;;;;;:::i;:::-;;:::i;37821:109::-;;;;;;;;;;-1:-1:-1;37821:109:0;;;;;:::i;:::-;;:::i;32366:51::-;;;;;;;;;;;;;;;;42790:157;;;;;;;;;;-1:-1:-1;42790:157:0;;;;;:::i;:::-;;:::i;32021:38::-;;;;;;;;;;-1:-1:-1;32021:38:0;;;;-1:-1:-1;;;32021:38:0;;;;;;31932:35;;;;;;;;;;-1:-1:-1;31932:35:0;;;;-1:-1:-1;;;31932:35:0;;;;;;42216:130;;;;;;;;;;-1:-1:-1;42216:130:0;;;;;:::i;:::-;;:::i;1170:244::-;;;;;;;;;;-1:-1:-1;1170:244:0;;;;;:::i;:::-;;:::i;37679:130::-;;;;;;;;;;-1:-1:-1;37679:130:0;;;;;:::i;:::-;;:::i;42487:149::-;42581:19;;:47;;;-1:-1:-1;;;42581:47:0;;;;42554:7;;-1:-1:-1;;;;;42581:19:0;;:45;;:47;;;;;;;;;;;;;;:19;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42574:54;;42487:149;:::o;2611:91::-;2656:13;2689:5;2682:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2611:91;:::o;3512:169::-;3595:4;3612:39;190:10;3635:7;3644:6;3612:8;:39::i;:::-;-1:-1:-1;3669:4:0;3512:169;;;;;:::o;36339:241::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;;;;;;;;;36447:19:::1;::::0;:67:::1;::::0;-1:-1:-1;;;36447:67:0;;-1:-1:-1;;;;;4565:32:1;;;36447:67:0::1;::::0;::::1;4547:51:1::0;36447:19:0;;::::1;::::0;:40:::1;::::0;4520:18:1;;36447:67:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36525:48;36541:25;36568:4;36525:15;:48::i;:::-;36339:241:::0;:::o;3690:325::-;3796:4;3817:36;3827:6;3835:9;3846:6;3817:9;:36::i;:::-;3864:121;3873:6;190:10;3895:89;3933:6;3895:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3895:19:0;;;;;;:11;:19;;;;;;;;190:10;3895:33;;;;;;;;;;:37;:89::i;:::-;3864:8;:121::i;:::-;-1:-1:-1;4003:4:0;3690:325;;;;;:::o;38491:373::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;38573:16:::1;::::0;::::1;-1:-1:-1::0;;;38573:16:0;;::::1;;:28;;::::0;::::1;;;;38565:70;;;;-1:-1:-1::0;;;38565:70:0::1;;;;;;;:::i;:::-;38650:17:::0;38646:158:::1;;38707:12;::::0;;38684:20:::1;:35:::0;-1:-1:-1;38734:16:0;;38765::::1;:27:::0;;-1:-1:-1;;;;38765:27:0::1;-1:-1:-1::0;;;38765:27:0;::::1;;;;::::0;;38646:158:::1;38823:33;::::0;6971:14:1;;6964:22;6946:41;;38823:33:0::1;::::0;6934:2:1;6919:18;38823:33:0::1;;;;;;;;38491:373:::0;:::o;51988:262::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;52115:16:::1;:31:::0;;;;52157:9:::1;:18:::0;52186:26:::1;:52:::0;51988:262::o;37939:117::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;38012:19:::1;::::0;:36:::1;::::0;-1:-1:-1;;;38012:36:0;;-1:-1:-1;;;;;4565:32:1;;;38012:36:0::1;::::0;::::1;4547:51:1::0;38012:19:0;;::::1;::::0;:27:::1;::::0;4520:18:1;;38012:36:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37939:117:::0;:::o;4024:218::-;190:10;4112:4;4161:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;4161:34:0;;;;;;;;;;4112:4;;4129:83;;4152:7;;4161:50;;4200:10;4161:38;:50::i;42024:183::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;42123:19:::1;::::0;:76:::1;::::0;-1:-1:-1;;;42123:76:0;;::::1;::::0;::::1;19135:25:1::0;;;-1:-1:-1;;;;;42123:19:0;;::::1;::::0;:57:::1;::::0;19108:18:1;;42123:76:0::1;19090::1::0;52636:352:0;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;52731:42:::1;-1:-1:-1::0;;;;;52720:53:0;::::1;;;52712:102;;;::::0;-1:-1:-1;;;52712:102:0;;15311:2:1;52712:102:0::1;::::0;::::1;15293:21:1::0;15350:2;15330:18;;;15323:30;15389:34;15369:18;;;15362:62;-1:-1:-1;;;15440:18:1;;;15433:34;15484:19;;52712:102:0::1;15283:226:1::0;52712:102:0::1;-1:-1:-1::0;;;;;52834:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;::::1;;52833:27;52825:70;;;::::0;-1:-1:-1;;;52825:70:0;;11049:2:1;52825:70:0::1;::::0;::::1;11031:21:1::0;11088:2;11068:18;;;11061:30;11127:32;11107:18;;;11100:60;11177:18;;52825:70:0::1;11021:180:1::0;52825:70:0::1;-1:-1:-1::0;;;;;52906:26:0::1;;::::0;;;:17:::1;:26;::::0;;;;:33;;-1:-1:-1;;52906:33:0::1;52935:4;52906:33:::0;;::::1;::::0;;;52950:16:::1;:30:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;52950:30:0::1;::::0;;::::1;::::0;;52636:352::o;44113:105::-;44144:19;;:62;;-1:-1:-1;;;44144:62:0;;44187:10;44144:62;;;4793:51:1;44144:19:0;4860:18:1;;;4853:50;-1:-1:-1;;;;;44144:19:0;;;;:34;;4766:18:1;;44144:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36588:124::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;36669:16:::1;:36:::0;36588:124::o;36860:129::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;36964:18:::1;:7:::0;36975:6:::1;36964:18;:::i;:::-;36937:24;:45:::0;-1:-1:-1;36860:129:0:o;40207:321::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;40318:15:::1;::::0;-1:-1:-1;;;;;40296:38:0;;::::1;40318:15:::0;::::1;40296:38;;40288:98;;;::::0;-1:-1:-1;;;40288:98:0;;9493:2:1;40288:98:0::1;::::0;::::1;9475:21:1::0;9532:2;9512:18;;;9505:30;9571:34;9551:18;;;9544:62;-1:-1:-1;;;9622:18:1;;;9615:45;9677:19;;40288:98:0::1;9465:237:1::0;40288:98:0::1;40444:15;::::0;40402:59:::1;::::0;-1:-1:-1;;;;;40444:15:0;;::::1;::::0;40402:59;::::1;::::0;::::1;::::0;40444:15:::1;::::0;40402:59:::1;40472:15;:48:::0;;-1:-1:-1;;;;;;40472:48:0::1;-1:-1:-1::0;;;;;40472:48:0;;;::::1;::::0;;;::::1;::::0;;40207:321::o;43796:308::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;43944:19:::1;::::0;:32:::1;::::0;-1:-1:-1;;;;;;43944:32:0;;::::1;::::0;::::1;19135:25:1::0;;;43866:22:0::1;::::0;;;;;-1:-1:-1;;;;;43944:19:0::1;::::0;:27:::1;::::0;19108:18:1;;43944:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43986:103;::::0;;20714:25:1;;;20770:2;20755:18;;20748:34;;;20798:18;;;20791:34;;;20856:2;20841:18;;20834:34;;;43865:111:0;;-1:-1:-1;43865:111:0;;-1:-1:-1;43865:111:0;-1:-1:-1;44079:9:0::1;::::0;44067:5:::1;::::0;43986:103:::1;::::0;20701:3:1;20686:19;43986:103:0::1;;;;;;;995:1;;;43796:308:::0;:::o;1013:148::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;1104:6:::1;::::0;1083:40:::1;::::0;1120:1:::1;::::0;1104:6:::1;::::0;::::1;-1:-1:-1::0;;;;;1104:6:0::1;::::0;1083:40:::1;::::0;1120:1;;1083:40:::1;1134:6;:19:::0;;-1:-1:-1;;;;;;1134:19:0::1;::::0;;1013:148::o;39278:920::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;39393:19:::1;::::0;-1:-1:-1;;;;;39371:42:0;;::::1;39393:19:::0;::::1;39371:42;;39363:112;;;::::0;-1:-1:-1;;;39363:112:0;;17431:2:1;39363:112:0::1;::::0;::::1;17413:21:1::0;17470:2;17450:18;;;17443:30;17509:34;17489:18;;;17482:62;17580:27;17560:18;;;17553:55;17625:19;;39363:112:0::1;17403:247:1::0;39363:112:0::1;39489:42;39562:10;39489:85;;39638:4;-1:-1:-1::0;;;;;39596:47:0::1;:22;-1:-1:-1::0;;;;;39596:28:0::1;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39596:47:0::1;;39588:143;;;::::0;-1:-1:-1;;;39588:143:0;;17857:2:1;39588:143:0::1;::::0;::::1;17839:21:1::0;17896:2;17876:18;;;17869:30;17935:34;17915:18;;;17908:62;18006:34;17986:18;;;17979:62;-1:-1:-1;;;18057:19:1;;;18050:50;18117:19;;39588:143:0::1;17829:313:1::0;39588:143:0::1;39745:76;::::0;-1:-1:-1;;;39745:76:0;;-1:-1:-1;;;;;39745:43:0;::::1;:76;::::0;::::1;4547:51:1::0;;;39745:43:0;::::1;::::0;4520:18:1;;39745:76:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;39832:58:0::1;::::0;-1:-1:-1;;;39832:58:0;;39884:4:::1;39832:58;::::0;::::1;4547:51:1::0;-1:-1:-1;;;;;39832:43:0;::::1;::::0;-1:-1:-1;39832:43:0::1;::::0;-1:-1:-1;4520:18:1;;39832:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;39953:15:0::1;::::0;39901:69:::1;::::0;-1:-1:-1;;;39901:69:0;;-1:-1:-1;;;;;39953:15:0;;::::1;39901:69;::::0;::::1;4547:51:1::0;39901:43:0;;::::1;::::0;-1:-1:-1;39901:43:0::1;::::0;-1:-1:-1;4520:18:1;;39901:69:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40033:11:0::1;::::0;39981:65:::1;::::0;-1:-1:-1;;;39981:65:0;;-1:-1:-1;;;;;40033:11:0;;::::1;39981:65;::::0;::::1;4547:51:1::0;39981:43:0;;::::1;::::0;-1:-1:-1;39981:43:0::1;::::0;-1:-1:-1;4520:18:1;;39981:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40111:19:0::1;::::0;40065:67:::1;::::0;-1:-1:-1;;;;;40111:19:0;;::::1;::::0;-1:-1:-1;40065:67:0;;::::1;::::0;-1:-1:-1;40065:67:0::1;::::0;40111:19:::1;::::0;40065:67:::1;40146:19;:44:::0;;-1:-1:-1;;;;;;40146:44:0::1;-1:-1:-1::0;;;;;40146:44:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;39278:920:0:o;43116:326::-;43395:19;;:39;;-1:-1:-1;;;43395:39:0;;-1:-1:-1;;;;;4565:32:1;;;43395:39:0;;;4547:51:1;43216:7:0;;;;;;;;;;;;;;;;43395:19;;;:30;;4520:18:1;;43395:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43388:46;;;;;;;;;;;;;;;;43116:326;;;;;;;;;:::o;53000:500::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53089:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;::::1;;53081:65;;;::::0;-1:-1:-1;;;53081:65:0;;14539:2:1;53081:65:0::1;::::0;::::1;14521:21:1::0;14578:2;14558:18;;;14551:30;14617:28;14597:18;;;14590:56;14663:18;;53081:65:0::1;14511:176:1::0;53081:65:0::1;53162:9;53157:336;53181:16;:23:::0;53177:27;::::1;53157:336;;;53253:7;-1:-1:-1::0;;;;;53230:30:0::1;:16;53247:1;53230:19;;;;;;-1:-1:-1::0;;;53230:19:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;53230:19:0::1;:30;53226:256;;;53303:16;53320:23:::0;;:27:::1;::::0;53346:1:::1;::::0;53320:27:::1;:::i;:::-;53303:45;;;;;;-1:-1:-1::0;;;53303:45:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;53281:16:::1;:19:::0;;-1:-1:-1;;;;;53303:45:0;;::::1;::::0;53298:1;;53281:19;::::1;;;-1:-1:-1::0;;;53281:19:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:67:::0;;-1:-1:-1;;;;;;53281:67:0::1;-1:-1:-1::0;;;;;53281:67:0;;::::1;;::::0;;53367:26;;::::1;::::0;;:17:::1;:26:::0;;;;;;:34;;-1:-1:-1;;53367:34:0::1;::::0;;53420:16:::1;:22:::0;;;::::1;;-1:-1:-1::0;;;53420:22:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;53420:22:0;;;;;-1:-1:-1;;;;;;53420:22:0::1;::::0;;;;;53157:336:::1;53000:500:::0;:::o;53226:256::-:1;53206:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53157:336;;;;53000:500:::0;:::o;44384:149::-;44480:19;;:45;;;-1:-1:-1;;;44480:45:0;;;;44453:7;;-1:-1:-1;;;;;44480:19:0;;:43;;:45;;;;;;;;;;;;;;:19;:45;;;;;;;;;;41725:290;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;41825:16:::1;;41813:8;:28;;41805:97;;;::::0;-1:-1:-1;;;41805:97:0;;11763:2:1;41805:97:0::1;::::0;::::1;11745:21:1::0;11802:2;11782:18;;;11775:30;11841:34;11821:18;;;11814:62;11912:26;11892:18;;;11885:54;11956:19;;41805:97:0::1;11735:246:1::0;41805:97:0::1;41913:16;:27:::0;;;41956:51:::1;::::0;41932:8;;;;41956:51:::1;::::0;;;::::1;41725:290:::0;:::o;44224:142::-;44315:19;;:43;;;-1:-1:-1;;;44315:43:0;;;;44291:7;;-1:-1:-1;;;;;44315:19:0;;:41;;:43;;;;;;;;;;;;;;:19;:43;;;;;;;;;;2711:95;2758:13;2791:7;2784:14;;;;;:::i;40999:269::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;41106:13:::1;-1:-1:-1::0;;;;;41098:21:0::1;:4;-1:-1:-1::0;;;;;41098:21:0::1;;;41090:115;;;::::0;-1:-1:-1;;;41090:115:0;;18349:2:1;41090:115:0::1;::::0;::::1;18331:21:1::0;18388:2;18368:18;;;18361:30;18427:34;18407:18;;;18400:62;18498:34;18478:18;;;18471:62;-1:-1:-1;;;18549:19:1;;;18542:48;18607:19;;41090:115:0::1;18321:311:1::0;41090:115:0::1;41219:41;41248:4;41254:5;41219:28;:41::i;42961:140::-:0;43058:19;;:38;;-1:-1:-1;;;43058:38:0;;-1:-1:-1;;;;;4565:32:1;;;43058:38:0;;;4547:51:1;43037:7:0;;43058:19;;:29;;4520:18:1;;43058:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4251:269::-;4344:4;4361:129;190:10;4384:7;4393:96;4432:15;4393:96;;;;;;;;;;;;;;;;;190:10;4393:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;4393:34:0;;;;;;;;;;;;:38;:96::i;3168:175::-;3254:4;3271:42;190:10;3295:9;3306:6;3271:9;:42::i;43451:333::-;43732:19;;:44;;-1:-1:-1;;;43732:44:0;;;;;19135:25:1;;;43556:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43732:19:0;;;;:37;;19108:18:1;;43732:44:0;19090:76:1;37198:334:0;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;37300:15:::1;::::0;-1:-1:-1;;;;;37286:29:0;;::::1;37300:15:::0;::::1;37286:29;;37278:98;;;::::0;-1:-1:-1;;;37278:98:0;;10265:2:1;37278:98:0::1;::::0;::::1;10247:21:1::0;10304:2;10284:18;;;10277:30;10343:34;10323:18;;;10316:62;10414:26;10394:18;;;10387:54;10458:19;;37278:98:0::1;10237:246:1::0;37278:98:0::1;37387:33;37403:10;37415:4;37387:15;:33::i;:::-;37459:15;::::0;37436:51:::1;::::0;-1:-1:-1;;;;;37436:51:0;;::::1;::::0;37459:15:::1;::::0;37436:51:::1;::::0;37459:15:::1;::::0;37436:51:::1;37497:15;:28:::0;;-1:-1:-1;;;;;;37497:28:0::1;-1:-1:-1::0;;;;;37497:28:0;;;::::1;::::0;;;::::1;::::0;;37198:334::o;37000:190::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;37084:17:::1;:32:::0;;-1:-1:-1;;;;;;37084:32:0::1;-1:-1:-1::0;;;;;37084:32:0;;::::1;::::0;;::::1;::::0;;;37126:19:::1;::::0;:57:::1;::::0;-1:-1:-1;;;37126:57:0;;::::1;::::0;::::1;4547:51:1::0;;;;37126:19:0;;::::1;::::0;:43:::1;::::0;4520:18:1;;37126:57:0::1;4502:102:1::0;37540:131:0;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;37642:22:::1;:11:::0;37657:6:::1;37642:22;:::i;:::-;37621:18;:43:::0;-1:-1:-1;37540:131:0:o;40841:149::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;40915:19:::1;::::0;:58:::1;::::0;-1:-1:-1;;;40915:58:0;;-1:-1:-1;;;;;4565:32:1;;;40915:58:0::1;::::0;::::1;4547:51:1::0;40915:19:0;;::::1;::::0;:40:::1;::::0;4520:18:1;;40915:58:0::1;4502:102:1::0;42355:116:0;42432:19;;:31;;;-1:-1:-1;;;42432:31:0;;;;42405:7;;-1:-1:-1;;;;;42432:19:0;;:29;;:31;;;;;;;;;;;;;;:19;:31;;;;;;;;;;36720:127;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;36822:18:::1;:7:::0;36833:6:::1;36822:18;:::i;:::-;36796:23;:44:::0;-1:-1:-1;36720:127:0:o;40537:295::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40630:27:0;::::1;;::::0;;;:18:::1;:27:::0;;;;;;::::1;;:39;;::::0;::::1;;;;40622:100;;;::::0;-1:-1:-1;;;40622:100:0;;14894:2:1;40622:100:0::1;::::0;::::1;14876:21:1::0;14933:2;14913:18;;;14906:30;14972:34;14952:18;;;14945:62;-1:-1:-1;;;15023:18:1;;;15016:46;15079:19;;40622:100:0::1;14866:238:1::0;40622:100:0::1;-1:-1:-1::0;;;;;40733:27:0;::::1;;::::0;;;:18:::1;:27:::0;;;;;;;;:38;;-1:-1:-1;;40733:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;40790:34;;6946:41:1;;;40790:34:0::1;::::0;6919:18:1;40790:34:0::1;;;;;;;40537:295:::0;;:::o;38873:393::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;38960:21:::1;::::0;::::1;-1:-1:-1::0;;;38960:21:0;;::::1;;:33;;::::0;::::1;;;;38952:75;;;;-1:-1:-1::0;;;38952:75:0::1;;;;;;;:::i;:::-;39042:17:::0;39038:163:::1;;39099:12;::::0;;39076:20:::1;:35:::0;-1:-1:-1;39126:16:0;;39157:21:::1;:32:::0;;-1:-1:-1;;;;39157:32:0::1;-1:-1:-1::0;;;39157:32:0;::::1;;;;::::0;;39038:163:::1;39220:38;::::0;6971:14:1;;6964:22;6946:41;;39220:38:0::1;::::0;6934:2:1;6919:18;39220:38:0::1;6901:92:1::0;38065:414:0;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;38150:19:::1;::::0;::::1;-1:-1:-1::0;;;38150:19:0;;::::1;;:31;;::::0;::::1;;;;38142:73;;;;-1:-1:-1::0;;;38142:73:0::1;;;;;;;:::i;:::-;38230:17:::0;38226:191:::1;;38297:22;::::0;;38264:30:::1;:55:::0;-1:-1:-1;38334:26:0;;38375:19:::1;:30:::0;;-1:-1:-1;;;;38375:30:0::1;-1:-1:-1::0;;;38375:30:0;::::1;;;;::::0;;38226:191:::1;38435:36;::::0;6971:14:1;;6964:22;6946:41;;38435:36:0::1;::::0;6934:2:1;6919:18;38435:36:0::1;6901:92:1::0;52252:260:0;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;52383:17:::1;:34:::0;;;;52425:10:::1;:20:::0;52450:27:::1;:54:::0;52252:260::o;37821:109::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;37895:16:::1;:27:::0;;;::::1;;-1:-1:-1::0;;;37895:27:0::1;-1:-1:-1::0;;;;37895:27:0;;::::1;::::0;;;::::1;::::0;;37821:109::o;42790:157::-;42889:19;;:51;;-1:-1:-1;;;42889:51:0;;-1:-1:-1;;;;;4565:32:1;;;42889:51:0;;;4547::1;42865:7:0;;42889:19;;:42;;4520:18:1;;42889:51:0;4502:102:1;42216:130:0;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;42290:19:::1;::::0;:46:::1;::::0;-1:-1:-1;;;42290:46:0;;::::1;::::0;::::1;19135:25:1::0;;;-1:-1:-1;;;;;42290:19:0;;::::1;::::0;:35:::1;::::0;19108:18:1;;42290:46:0::1;19090:76:1::0;1170:244:0;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1259:22:0;::::1;1251:73;;;::::0;-1:-1:-1;;;1251:73:0;;8683:2:1;1251:73:0::1;::::0;::::1;8665:21:1::0;8722:2;8702:18;;;8695:30;8761:34;8741:18;;;8734:62;-1:-1:-1;;;8812:18:1;;;8805:36;8858:19;;1251:73:0::1;8655:228:1::0;1251:73:0::1;1361:6;::::0;1340:38:::1;::::0;-1:-1:-1;;;;;1340:38:0;;::::1;::::0;1361:6:::1;::::0;::::1;;::::0;1340:38:::1;::::0;;;::::1;1389:6;:17:::0;;-1:-1:-1;;;;;1389:17:0;;::::1;;;-1:-1:-1::0;;;;;;1389:17:0;;::::1;::::0;;;::::1;::::0;;1170:244::o;37679:130::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;37767:21:::1;:35:::0;37679:130::o;21486:179::-;21544:7;;21576:5;21580:1;21576;:5;:::i;:::-;21564:17;;21605:1;21600;:6;;21592:46;;;;-1:-1:-1;;;21592:46:0;;9909:2:1;21592:46:0;;;9891:21:1;9948:2;9928:18;;;9921:30;9987:29;9967:18;;;9960:57;10034:18;;21592:46:0;9881:177:1;21592:46:0;21656:1;21486:179;-1:-1:-1;;;21486:179:0:o;5897:347::-;-1:-1:-1;;;;;5999:19:0;;5991:68;;;;-1:-1:-1;;;5991:68:0;;17026:2:1;5991:68:0;;;17008:21:1;17065:2;17045:18;;;17038:30;17104:34;17084:18;;;17077:62;-1:-1:-1;;;17155:18:1;;;17148:34;17199:19;;5991:68:0;16998:226:1;5991:68:0;-1:-1:-1;;;;;6078:21:0;;6070:68;;;;-1:-1:-1;;;6070:68:0;;9090:2:1;6070:68:0;;;9072:21:1;9129:2;9109:18;;;9102:30;9168:34;9148:18;;;9141:62;-1:-1:-1;;;9219:18:1;;;9212:32;9261:19;;6070:68:0;9062:224:1;6070:68:0;-1:-1:-1;;;;;6152:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;6204:32;;19135:25:1;;;6204:32:0;;19108:18:1;6204:32:0;;;;;;;;5897:347;;;:::o;44545:4245::-;-1:-1:-1;;;;;44677:18:0;;44669:68;;;;-1:-1:-1;;;44669:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44756:16:0;;44748:64;;;;-1:-1:-1;;;44748:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44832:21:0;;;;;;:17;:21;;;;;;;;44831:22;44823:58;;;;-1:-1:-1;;;44823:58:0;;18839:2:1;44823:58:0;;;18821:21:1;18878:2;18858:18;;;18851:30;-1:-1:-1;;;18897:18:1;;;18890:53;18960:18;;44823:58:0;18811:173:1;44823:58:0;44917:9;44899:28;;;;:17;:28;;;;;;;;44898:29;44890:65;;;;-1:-1:-1;;;44890:65:0;;18839:2:1;44890:65:0;;;18821:21:1;18878:2;18858:18;;;18851:30;-1:-1:-1;;;18897:18:1;;;18890:53;18960:18;;44890:65:0;18811:173:1;44890:65:0;44994:16;;-1:-1:-1;;;44994:16:0;;;;;:72;;-1:-1:-1;;;;;;45015:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;45043:22:0;;;;;;:18;:22;;;;;;;;45015:50;44986:124;;;;-1:-1:-1;;;44986:124:0;;12597:2:1;44986:124:0;;;12579:21:1;12636:2;12616:18;;;12609:30;12675:34;12655:18;;;12648:62;-1:-1:-1;;;12726:18:1;;;12719:37;12773:19;;44986:124:0;12569:229:1;44986:124:0;-1:-1:-1;;;;;45148:24:0;;45125:20;45148:24;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;45176:22:0;;;;;;:18;:22;;;;;;;;45148:50;-1:-1:-1;;;;;45216:29:0;;;;;;:25;:29;;;;;;45125:73;;-1:-1:-1;45216:29:0;;45215:30;:50;;;;-1:-1:-1;45249:16:0;;-1:-1:-1;;;45249:16:0;;;;45215:50;:70;;;;;45270:15;45269:16;45215:70;45212:203;;;45338:16;;45309:25;45327:6;45309:13;45319:2;-1:-1:-1;;;;;3133:18:0;3106:7;3133:18;;;;;;;;;;;;3032:127;45309:13;:17;;:25::i;:::-;:45;;45301:102;;;;-1:-1:-1;;;45301:102:0;;13765:2:1;45301:102:0;;;13747:21:1;13804:2;13784:18;;;13777:30;13843:34;13823:18;;;13816:62;-1:-1:-1;;;13894:18:1;;;13887:42;13946:19;;45301:102:0;13737:234:1;45301:102:0;45446:16;;-1:-1:-1;;;45446:16:0;;;;:64;;;;-1:-1:-1;;;;;;45479:31:0;;;;;;:25;:31;;;;;;;;45446:64;:97;;;;;45528:15;45527:16;45446:97;45428:819;;;45588:23;;45578:6;:33;;45570:86;;;;-1:-1:-1;;;45570:86:0;;12188:2:1;45570:86:0;;;12170:21:1;12227:2;12207:18;;;12200:30;12266:34;12246:18;;;12239:62;-1:-1:-1;;;12317:18:1;;;12310:38;12365:19;;45570:86:0;12160:230:1;45570:86:0;45698:26;;45673:22;:51;45754:16;;45739:12;:31;45800:9;;45785:12;:24;45428:819;;;45850:16;;-1:-1:-1;;;45850:16:0;;;;:62;;;;-1:-1:-1;;;;;;45883:29:0;;;;;;:25;:29;;;;;;;;45850:62;:95;;;;;45930:15;45929:16;45850:95;45835:412;;;45990:24;;45980:6;:34;;45972:105;;;;-1:-1:-1;;;45972:105:0;;16122:2:1;45972:105:0;;;16104:21:1;16161:2;16141:18;;;16134:30;16200:34;16180:18;;;16173:62;16271:28;16251:18;;;16244:56;16317:19;;45972:105:0;16094:248:1;45972:105:0;46119:27;;46094:22;:52;46176:17;;46161:12;:32;46223:10;;46208:12;:25;45835:412;46312:4;46263:28;3133:18;;;;;;;;;;;46368;;46405:8;;46344:42;;;;;-1:-1:-1;;;46405:8:0;;;;46404:9;:20;;;;;46417:7;46404:20;:45;;;;;46436:13;-1:-1:-1;;;;;46428:21:0;:4;-1:-1:-1;;;;;46428:21:0;;;46404:45;46400:573;;;46466:8;:15;;-1:-1:-1;;;;46466:15:0;-1:-1:-1;;;46466:15:0;;;;;-1:-1:-1;;;46502:21:0;;46466:15;46502:21;46499:190;;;46564:21;;46604:25;46564:21;46604:14;:25::i;:::-;-1:-1:-1;46672:1:0;46648:21;:25;46499:190;46710:19;;-1:-1:-1;;;46710:19:0;;;;46706:215;;;46771:28;;46818:36;46771:28;46818:24;:36::i;:::-;-1:-1:-1;46904:1:0;46873:28;:32;46706:215;46945:8;:16;;-1:-1:-1;;;;46945:16:0;;;46400:573;47001:16;;46986:12;;-1:-1:-1;;;47001:16:0;;;;:29;;;;-1:-1:-1;47022:8:0;;-1:-1:-1;;;47022:8:0;;;;47021:9;47001:29;:49;;;;;47035:15;47034:16;47001:49;46986:64;;47067:7;47064:1139;;;47088:12;47117:33;47165:39;47219:29;47293:33;47322:3;47293:24;47304:12;;47293:6;:10;;:24;;;;:::i;:::-;:28;;:33::i;:::-;47265:61;;47375:43;47414:3;47375:34;47386:22;;47375:6;:10;;:34;;;;:::i;:43::-;47341:77;;47457:33;47486:3;47457:24;47468:12;;47457:6;:10;;:24;;;;:::i;:33::-;47433:57;-1:-1:-1;47514:119:0;47433:57;47514:62;:25;47544:31;47514:29;:62::i;:119::-;47681:28;;47507:126;;-1:-1:-1;47681:65:0;;47714:31;47681:32;:65::i;:::-;47650:28;:96;47787:21;;:48;;47813:21;47787:25;:48::i;:::-;47763:21;:72;-1:-1:-1;;;;;47896:29:0;;;;;;:25;:29;;;;;;;;47893:116;;;47971:21;;47953:40;;:13;:4;47962:3;47953:8;:13::i;:::-;:17;;:40::i;:::-;47946:47;;47893:116;48031:16;:6;48042:4;48031:10;:16::i;:::-;48022:25;;48062:42;48078:4;48092;48099;48062:15;:42::i;:::-;48149:15;;48119:72;;48143:4;;-1:-1:-1;;;;;48149:15:0;48165:25;48119:15;:72::i;:::-;47064:1139;;;;;48216:33;48232:4;48238:2;48242:6;48216:15;:33::i;:::-;48267:19;;-1:-1:-1;;;;;48267:19:0;:30;48306:4;48313:15;48306:4;-1:-1:-1;;;;;3133:18:0;3106:7;3133:18;;;;;;;;;;;;3032:127;48313:15;48267:62;;-1:-1:-1;;;;;;48267:62:0;;;;;;;-1:-1:-1;;;;;5122:32:1;;;48267:62:0;;;5104:51:1;5171:18;;;5164:34;5077:18;;48267:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48263:78;48365:19;;-1:-1:-1;;;;;48365:19:0;:30;48404:2;48409:13;48404:2;-1:-1:-1;;;;;3133:18:0;3106:7;3133:18;;;;;;;;;;;;3032:127;48409:13;48365:58;;-1:-1:-1;;;;;;48365:58:0;;;;;;;-1:-1:-1;;;;;5122:32:1;;;48365:58:0;;;5104:51:1;5171:18;;;5164:34;5077:18;;48365:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48361:74;48459:8;;-1:-1:-1;;;48459:8:0;;;;48455:328;;48492:16;;48524:19;;:32;;-1:-1:-1;;;;;;48524:32:0;;;;;19135:25:1;;;-1:-1:-1;;;;;48524:19:0;;;;:27;;19108:18:1;;48524:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48524:32:0;;;;;;;;-1:-1:-1;;48524:32:0;;;;;;;;;;;;:::i;:::-;;;48520:252;;;;;48645:90;;;20714:25:1;;;20770:2;20755:18;;20748:34;;;20798:18;;;20791:34;;;20856:2;20841:18;;20834:34;;;48725:9:0;;48714:4;;48645:90;;20701:3:1;20686:19;48645:90:0;;;;;;;48557:188;;;48520:252;48455:328;;44545:4245;;;;;;;:::o;22392:166::-;22478:7;22514:12;22506:6;;;;22498:29;;;;-1:-1:-1;;;22498:29:0;;;;;;;;:::i;:::-;-1:-1:-1;22545:5:0;22549:1;22545;:5;:::i;:::-;22538:12;22392:166;-1:-1:-1;;;;22392:166:0:o;41277:439::-;861:6;;-1:-1:-1;;;;;861:6:0;;;;;190:10;924:23;916:68;;;;-1:-1:-1;;;916:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41378:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;;::::1;;:40;;::::0;::::1;;;;41370:121;;;::::0;-1:-1:-1;;;41370:121:0;;16549:2:1;41370:121:0::1;::::0;::::1;16531:21:1::0;16588:2;16568:18;;;16561:30;;;16627:34;16607:18;;;16600:62;16698:34;16678:18;;;16671:62;-1:-1:-1;;;16749:19:1;;;16742:35;16794:19;;41370:121:0::1;16521:298:1::0;41370:121:0::1;-1:-1:-1::0;;;;;41502:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;:39;;-1:-1:-1;;41502:39:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;41555:95:::1;;41580:19;::::0;:46:::1;::::0;-1:-1:-1;;;41580:46:0;;-1:-1:-1;;;;;4565:32:1;;;41580:46:0::1;::::0;::::1;4547:51:1::0;41580:19:0;;::::1;::::0;:40:::1;::::0;4520:18:1;;41580:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41555:95;41668:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;41668:40:0;::::1;::::0;::::1;::::0;;;::::1;41277:439:::0;;:::o;48802:518::-;48926:12;48941:27;:20;48966:1;48941:24;:27::i;:::-;48926:42;-1:-1:-1;48979:17:0;48999:30;:20;48926:42;48999:24;:30::i;:::-;48979:50;-1:-1:-1;49068:21:0;49103:22;49120:4;49103:16;:22::i;:::-;49139:18;49160:41;:21;49186:14;49160:25;:41::i;:::-;49139:62;;49215:35;49228:9;49239:10;49215:12;:35::i;:::-;49269:43;;;20361:25:1;;;20417:2;20402:18;;20395:34;;;20445:18;;;20438:34;;;49269:43:0;;20349:2:1;20334:18;49269:43:0;;;;;;;;48802:518;;;;;:::o;51116:343::-;51235:17;;51185:68;;51212:6;;51228:4;;-1:-1:-1;;;;;51235:17:0;51185:26;:68::i;:::-;51295:17;;51288:50;;-1:-1:-1;;;51288:50:0;;51332:4;51288:50;;;4547:51:1;51264:21:0;;-1:-1:-1;;;;;51295:17:0;;51288:35;;4520:18:1;;51288:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51367:17;;51394:19;;51264:74;;-1:-1:-1;51349:102:0;;-1:-1:-1;;;;;51367:17:0;;;;51394:19;;51264:74;51349:17;:102::i;21841:220::-;21899:7;21923:6;21919:20;;-1:-1:-1;21938:1:0;21931:8;;21919:20;21950:9;21962:5;21966:1;21962;:5;:::i;:::-;21950:17;-1:-1:-1;21995:1:0;21986:5;21990:1;21950:17;21986:5;:::i;:::-;:10;21978:56;;;;-1:-1:-1;;;21978:56:0;;13363:2:1;21978:56:0;;;13345:21:1;13402:2;13382:18;;;13375:30;13441:34;13421:18;;;13414:62;-1:-1:-1;;;13492:18:1;;;13485:31;13533:19;;21978:56:0;13335:223:1;22070:153:0;22128:7;22160:1;22156;:5;22148:44;;;;-1:-1:-1;;;22148:44:0;;11408:2:1;22148:44:0;;;11390:21:1;11447:2;11427:18;;;11420:30;11486:28;11466:18;;;11459:56;11532:18;;22148:44:0;11380:176:1;22148:44:0;22210:5;22214:1;22210;:5;:::i;21674:158::-;21732:7;21765:1;21760;:6;;21752:49;;;;-1:-1:-1;;;21752:49:0;;10690:2:1;21752:49:0;;;10672:21:1;10729:2;10709:18;;;10702:30;10768:32;10748:18;;;10741:60;10818:18;;21752:49:0;10662:180:1;21752:49:0;21819:5;21823:1;21819;:5;:::i;4529:541::-;-1:-1:-1;;;;;4635:20:0;;4627:70;;;;-1:-1:-1;;;4627:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4716:23:0;;4708:71;;;;-1:-1:-1;;;4708:71:0;;;;;;;:::i;:::-;4874;4896:6;4874:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4874:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;4854:17:0;;;:9;:17;;;;;;;;;;;:91;;;;4979:20;;;;;;;:32;;5004:6;4979:24;:32::i;:::-;-1:-1:-1;;;;;4956:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;5027:35;19135:25:1;;;4956:20:0;;5027:35;;;;;;19108:18:1;5027:35:0;19090:76:1;49866:594:0;50016:16;;;50030:1;50016:16;;;;;;;;49992:21;;50016:16;;;;;;;;;;-1:-1:-1;50016:16:0;49992:40;;50061:4;50043;50048:1;50043:7;;;;;;-1:-1:-1;;;50043:7:0;;;;;;;;;-1:-1:-1;;;;;50043:23:0;;;:7;;;;;;;;;;:23;;;;50087:15;;:22;;;-1:-1:-1;;;50087:22:0;;;;:15;;;;;:20;;:22;;;;;50043:7;;50087:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50077:4;50082:1;50077:7;;;;;;-1:-1:-1;;;50077:7:0;;;;;;;;;-1:-1:-1;;;;;50077:32:0;;;:7;;;;;;;;;:32;50155:15;;50123:62;;50140:4;;50155:15;50173:11;50123:8;:62::i;:::-;50225:15;;:224;;-1:-1:-1;;;50225:224:0;;-1:-1:-1;;;;;50225:15:0;;;;:66;;:224;;50306:11;;50225:15;;50376:4;;50403;;50423:15;;50225:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49866:594;;:::o;49329:525::-;49512:15;;49480:62;;49497:4;;-1:-1:-1;;;;;49512:15:0;49530:11;49480:8;:62::i;:::-;49586:15;;49790;;49586:260;;-1:-1:-1;;;49586:260:0;;49658:4;49586:260;;;6535:34:1;6585:18;;;6578:34;;;49586:15:0;6628:18:1;;;6621:34;;;6671:18;;;6664:34;-1:-1:-1;;;;;49790:15:0;;;6714:19:1;;;6707:44;49820:15:0;6767:19:1;;;6760:35;49586:15:0;;;:31;;49625:9;;6469:19:1;;49586:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;50469:638::-;50616:16;;;50630:1;50616:16;;;;;;;;;50592:21;;50616:16;;;;;;;;;;-1:-1:-1;50616:16:0;50592:40;;50661:4;50643;50648:1;50643:7;;;;;;-1:-1:-1;;;50643:7:0;;;;;;;;;-1:-1:-1;;;;;50643:23:0;;;:7;;;;;;;;;;:23;;;;50687:15;;:22;;;-1:-1:-1;;;50687:22:0;;;;:15;;;;;:20;;:22;;;;;50643:7;;50687:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50677:4;50682:1;50677:7;;;;;;-1:-1:-1;;;50677:7:0;;;;;;;;;;;;;;:32;-1:-1:-1;;;;;50677:32:0;;;-1:-1:-1;;;;;50677:32:0;;;;;50730:16;50720:4;50725:1;50720:7;;;;;;-1:-1:-1;;;50720:7:0;;;;;;;;;-1:-1:-1;;;;;50720:26:0;;;:7;;;;;;;;;:26;50792:15;;50760:63;;50777:4;;50792:15;50810:12;50760:8;:63::i;:::-;50863:15;;:236;;-1:-1:-1;;;50863:236:0;;-1:-1:-1;;;;;50863:15:0;;;;:69;;:236;;50947:12;;50863:15;;51029:4;;51048:10;;51073:15;;50863:236;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51602:374;51770:55;;-1:-1:-1;;;51770:55:0;;-1:-1:-1;;;;;5122:32:1;;;51770:55:0;;;5104:51:1;5171:18;;;5164:34;;;51755:12:0;;51770:30;;;;;;5077:18:1;;51770:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51755:70;;51843:7;51839:130;;;51867:49;;-1:-1:-1;;;51867:49:0;;;;;19135:25:1;;;-1:-1:-1;;;;;51867:41:0;;;;;19108:18:1;;51867:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51936:21;51950:6;51936:21;;;;19135:25:1;;19123:2;19108:18;;19090:76;14:257;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:398::-;610:6;618;671:2;659:9;650:7;646:23;642:32;639:2;;;692:6;684;677:22;639:2;736:9;723:23;755:31;780:5;755:31;:::i;:::-;805:5;-1:-1:-1;862:2:1;847:18;;834:32;875:33;834:32;875:33;:::i;:::-;927:7;917:17;;;629:311;;;;;:::o;945:466::-;1022:6;1030;1038;1091:2;1079:9;1070:7;1066:23;1062:32;1059:2;;;1112:6;1104;1097:22;1059:2;1156:9;1143:23;1175:31;1200:5;1175:31;:::i;:::-;1225:5;-1:-1:-1;1282:2:1;1267:18;;1254:32;1295:33;1254:32;1295:33;:::i;:::-;1049:362;;1347:7;;-1:-1:-1;;;1401:2:1;1386:18;;;;1373:32;;1049:362::o;1416:392::-;1481:6;1489;1542:2;1530:9;1521:7;1517:23;1513:32;1510:2;;;1563:6;1555;1548:22;1510:2;1607:9;1594:23;1626:31;1651:5;1626:31;:::i;:::-;1676:5;-1:-1:-1;1733:2:1;1718:18;;1705:32;1746:30;1705:32;1746:30;:::i;1813:691::-;1944:6;1952;1960;1968;1976;1984;1992;2000;2053:3;2041:9;2032:7;2028:23;2024:33;2021:2;;;2075:6;2067;2060:22;2021:2;2112:9;2106:16;2131:31;2156:5;2131:31;:::i;:::-;2181:5;2171:15;;;2226:2;2215:9;2211:18;2205:25;2195:35;;2270:2;2259:9;2255:18;2249:25;2239:35;;2314:2;2303:9;2299:18;2293:25;2283:35;;2358:3;2347:9;2343:19;2337:26;2327:36;;2403:3;2392:9;2388:19;2382:26;2372:36;;2448:3;2437:9;2433:19;2427:26;2417:36;;2493:3;2482:9;2478:19;2472:26;2462:36;;2011:493;;;;;;;;;;;:::o;2509:325::-;2577:6;2585;2638:2;2626:9;2617:7;2613:23;2609:32;2606:2;;;2659:6;2651;2644:22;2606:2;2703:9;2690:23;2722:31;2747:5;2722:31;:::i;:::-;2772:5;2824:2;2809:18;;;;2796:32;;-1:-1:-1;;;2596:238:1:o;2839:251::-;2895:6;2948:2;2936:9;2927:7;2923:23;2919:32;2916:2;;;2969:6;2961;2954:22;2916:2;3013:9;3000:23;3032:28;3054:5;3032:28;:::i;3095:255::-;3162:6;3215:2;3203:9;3194:7;3190:23;3186:32;3183:2;;;3236:6;3228;3221:22;3183:2;3273:9;3267:16;3292:28;3314:5;3292:28;:::i;3355:190::-;3414:6;3467:2;3455:9;3446:7;3442:23;3438:32;3435:2;;;3488:6;3480;3473:22;3435:2;-1:-1:-1;3516:23:1;;3425:120;-1:-1:-1;3425:120:1:o;3550:194::-;3620:6;3673:2;3661:9;3652:7;3648:23;3644:32;3641:2;;;3694:6;3686;3679:22;3641:2;-1:-1:-1;3722:16:1;;3631:113;-1:-1:-1;3631:113:1:o;3749:326::-;3826:6;3834;3842;3895:2;3883:9;3874:7;3870:23;3866:32;3863:2;;;3916:6;3908;3901:22;3863:2;-1:-1:-1;;3944:23:1;;;4014:2;3999:18;;3986:32;;-1:-1:-1;4065:2:1;4050:18;;;4037:32;;3853:222;-1:-1:-1;3853:222:1:o;4080:316::-;4168:6;4176;4184;4237:2;4225:9;4216:7;4212:23;4208:32;4205:2;;;4258:6;4250;4243:22;4205:2;4292:9;4286:16;4276:26;;4342:2;4331:9;4327:18;4321:25;4311:35;;4386:2;4375:9;4371:18;4365:25;4355:35;;4195:201;;;;;:::o;7469:603::-;7581:4;7610:2;7639;7628:9;7621:21;7671:6;7665:13;7714:6;7709:2;7698:9;7694:18;7687:34;7739:4;7752:140;7766:6;7763:1;7760:13;7752:140;;;7861:14;;;7857:23;;7851:30;7827:17;;;7846:2;7823:26;7816:66;7781:10;;7752:140;;;7910:6;7907:1;7904:13;7901:2;;;7980:4;7975:2;7966:6;7955:9;7951:22;7947:31;7940:45;7901:2;-1:-1:-1;8056:2:1;8035:15;-1:-1:-1;;8031:29:1;8016:45;;;;8063:2;8012:54;;7590:482;-1:-1:-1;;;7590:482:1:o;8077:399::-;8279:2;8261:21;;;8318:2;8298:18;;;8291:30;8357:34;8352:2;8337:18;;8330:62;-1:-1:-1;;;8423:2:1;8408:18;;8401:33;8466:3;8451:19;;8251:225::o;12803:353::-;13005:2;12987:21;;;13044:2;13024:18;;;13017:30;13083:31;13078:2;13063:18;;13056:59;13147:2;13132:18;;12977:179::o;13976:356::-;14178:2;14160:21;;;14197:18;;;14190:30;14256:34;14251:2;14236:18;;14229:62;14323:2;14308:18;;14150:182::o;15514:401::-;15716:2;15698:21;;;15755:2;15735:18;;;15728:30;15794:34;15789:2;15774:18;;15767:62;-1:-1:-1;;;15860:2:1;15845:18;;15838:35;15905:3;15890:19;;15688:227::o;19171:983::-;19433:4;19481:3;19470:9;19466:19;19512:6;19501:9;19494:25;19538:2;19576:6;19571:2;19560:9;19556:18;19549:34;19619:3;19614:2;19603:9;19599:18;19592:31;19643:6;19678;19672:13;19709:6;19701;19694:22;19747:3;19736:9;19732:19;19725:26;;19786:2;19778:6;19774:15;19760:29;;19807:4;19820:195;19834:6;19831:1;19828:13;19820:195;;;19899:13;;-1:-1:-1;;;;;19895:39:1;19883:52;;19990:15;;;;19955:12;;;;19931:1;19849:9;19820:195;;;-1:-1:-1;;;;;;;20071:32:1;;;;20066:2;20051:18;;20044:60;-1:-1:-1;;;20135:3:1;20120:19;20113:35;20032:3;19442:712;-1:-1:-1;;;19442:712:1:o;21068:128::-;21108:3;21139:1;21135:6;21132:1;21129:13;21126:2;;;21145:18;;:::i;:::-;-1:-1:-1;21181:9:1;;21116:80::o;21201:217::-;21241:1;21267;21257:2;;-1:-1:-1;;;21292:31:1;;21346:4;21343:1;21336:15;21374:4;21299:1;21364:15;21257:2;-1:-1:-1;21403:9:1;;21247:171::o;21423:168::-;21463:7;21529:1;21525;21521:6;21517:14;21514:1;21511:21;21506:1;21499:9;21492:17;21488:45;21485:2;;;21536:18;;:::i;:::-;-1:-1:-1;21576:9:1;;21475:116::o;21596:125::-;21636:4;21664:1;21661;21658:8;21655:2;;;21669:18;;:::i;:::-;-1:-1:-1;21706:9:1;;21645:76::o;21726:380::-;21805:1;21801:12;;;;21848;;;21869:2;;21923:4;21915:6;21911:17;21901:27;;21869:2;21976;21968:6;21965:14;21945:18;21942:38;21939:2;;;22022:10;22017:3;22013:20;22010:1;22003:31;22057:4;22054:1;22047:15;22085:4;22082:1;22075:15;21939:2;;21781:325;;;:::o;22111:135::-;22150:3;-1:-1:-1;;22171:17:1;;22168:2;;;22191:18;;:::i;:::-;-1:-1:-1;22238:1:1;22227:13;;22158:88::o;22251:127::-;22312:10;22307:3;22303:20;22300:1;22293:31;22343:4;22340:1;22333:15;22367:4;22364:1;22357:15;22383:131;-1:-1:-1;;;;;22458:31:1;;22448:42;;22438:2;;22504:1;22501;22494:12;22519:118;22605:5;22598:13;22591:21;22584:5;22581:32;22571:2;;22627:1;22624;22617:12

Swarm Source

ipfs://e3f6cf25ef1c485958c1a5f253ae25bfabecf2bf7d84f9d769f864472eb08193
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.