ETH Price: $2,505.17 (+0.14%)

Token

SVB Inu (SVB)
 

Overview

Max Total Supply

100,000,000,000 SVB

Holders

53

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
19,545,829.78115134828125 SVB

Value
$0.00
0x644819c60a0232953c003e603daa0d5f235f8e14
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:
SVBInu

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-11
*/

// SPDX-License-Identifier: MIT                                                                               
                                                    
pragma solidity 0.8.15;

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

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

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);
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);

    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 {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    function transfer(address 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);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

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

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, 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);
    }
}

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 returns (address) {
        return _owner;
    }

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

    function renounceOwnership() external 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 IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(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 swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
    function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
    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 getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}

interface DividendPayingTokenOptionalInterface {
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) external view returns(uint256);

  /// @notice View the amount of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) external view returns(uint256);

  /// @notice View the amount of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) external view returns(uint256);
}

interface DividendPayingTokenInterface {
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) external view returns(uint256);

  /// @notice Distributes ether to token holders as dividends.
  /// @dev SHOULD distribute the paid ether to token holders as dividends.
  ///  SHOULD NOT directly transfer ether to token holders in this function.
  ///  MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0.
  function distributeDividends() external payable;

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
  ///  MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
  function withdrawDividend() external;

  /// @dev This event MUST emit when ether is distributed to token holders.
  /// @param from The address which sends ether to this contract.
  /// @param weiAmount The amount of distributed ether in wei.
  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );

  /// @dev This event MUST emit when an address withdraws their dividend.
  /// @param to The address which withdraws ether from this contract.
  /// @param weiAmount The amount of withdrawn ether in wei.
  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (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 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    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;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


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

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

contract DividendPayingToken is DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, Ownable {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

  // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
  // For more discussion about choosing the value of `magnitude`,
  //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
  uint256 constant internal magnitude = 2**128;

  uint256 internal magnifiedDividendPerShare;
 
  address public token;
  
  // About dividendCorrection:
  // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
  // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
  //   `dividendOf(_user)` should not be changed,
  //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
  // To keep the `dividendOf(_user)` unchanged, we add a correction term:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
  //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
  //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
  // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;
  
  mapping (address => uint256) public holderBalance;
  uint256 public totalBalance;

  uint256 public totalDividendsDistributed;

  /// @dev Distributes dividends whenever ether is paid to this contract.
  receive() external payable {
    distributeDividends();
  }

  /// @notice Distributes ether to token holders as dividends.
  /// @dev It reverts if the total supply of tokens is 0.
  /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0.
  /// About undistributed ether:
  ///   In each distribution, there is a small amount of ether not distributed,
  ///     the magnified amount of which is
  ///     `(msg.value * magnitude) % totalSupply()`.
  ///   With a well-chosen `magnitude`, the amount of undistributed ether
  ///     (de-magnified) in a distribution can be less than 1 wei.
  ///   We can actually keep track of the undistributed ether in a distribution
  ///     and try to distribute it in the next distribution,
  ///     but keeping track of such data on-chain costs much more than
  ///     the saved ether, so we don't do that.
    
  function distributeDividends() public override payable {
    require(false, "Cannot send BNB directly to tracker as it is unrecoverable"); // 
  }
  
  function distributeTokenDividends(uint256 amount) public onlyOwner {
    require(totalBalance > 0);

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

        totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
  }

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
  function withdrawDividend() public virtual override {
    _withdrawDividendOfUser(payable(msg.sender));
  }

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
  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(token).transfer(user, _withdrawableDividend);

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

      return _withdrawableDividend;
    }

    return 0;
  }


  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) public view override returns(uint256) {
    return withdrawableDividendOf(_owner);
  }

  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) public view override returns(uint256) {
    return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
  }

  /// @notice View the amount of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) public view override returns(uint256) {
    return withdrawnDividends[_owner];
  }


  /// @notice View the amount of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) public view override returns(uint256) {
    return magnifiedDividendPerShare.mul(holderBalance[_owner]).toInt256Safe()
      .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
  }

  /// @dev Internal function that increases tokens to an account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account that will receive the created tokens.
  /// @param value The amount that will be created.
  function _increase(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  /// @dev Internal function that reduces an amount of the token of a given account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account whose tokens will be burnt.
  /// @param value The amount that will be burnt.
  function _reduce(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  function _setBalance(address account, uint256 newBalance) internal {
    uint256 currentBalance = holderBalance[account];
    holderBalance[account] = newBalance;
    if(newBalance > currentBalance) {
      uint256 increaseAmount = newBalance.sub(currentBalance);
      _increase(account, increaseAmount);
      totalBalance += increaseAmount;
    } else if(newBalance < currentBalance) {
      uint256 reduceAmount = currentBalance.sub(newBalance);
      _reduce(account, reduceAmount);
      totalBalance -= reduceAmount;
    }
  }
}

contract DividendTracker is DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;

    Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping (address => bool) public excludedFromDividends;

    mapping (address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public immutable minimumTokenBalanceForDividends;

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

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

    constructor(address _token) {
    	claimWait = 1200;
        minimumTokenBalanceForDividends = 1;
        token = _token;
    }

    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    function get(address key) private view returns (uint) {
        return tokenHoldersMap.values[key];
    }

    function getIndexOfKey(address key) private view returns (int) {
        if(!tokenHoldersMap.inserted[key]) {
            return -1;
        }
        return int(tokenHoldersMap.indexOf[key]);
    }

    function getKeyAtIndex(uint index) private view returns (address) {
        return tokenHoldersMap.keys[index];
    }



    function size() private view returns (uint) {
        return tokenHoldersMap.keys.length;
    }

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

    function remove(address key) private {
        if (!tokenHoldersMap.inserted[key]) {
            return;
        }

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

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

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

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

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

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

    	emit ExcludeFromDividends(account);
    }
    
    function includeInDividends(address account) external onlyOwner {
    	require(excludedFromDividends[account]);
    	excludedFromDividends[account] = false;

    	emit IncludeInDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 1200 && newClaimWait <= 86400, "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "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;
    }

    // Check to see if I really made this contract or if it is a clone!
    // @Sir_Tris on TG, @SirTrisCrypto on Twitter

    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 = 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 >= size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
        }

        address account = 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);
    		set(account, newBalance);
    	}
    	else {
            _setBalance(account, 0);
    		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;
    }
}

interface IDexFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

contract TokenHandler is Ownable {
    function sendTokenToOwner(address token) external onlyOwner {
        if(IERC20(token).balanceOf(address(this)) > 0){
            IERC20(token).transfer(owner(), IERC20(token).balanceOf(address(this)));
        }
    }
}

contract SVBInu is ERC20, Ownable {

    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWalletAmount;

    DividendTracker public immutable dividendTracker;
    address public immutable token;

    IDexRouter public immutable dexRouter;
    address public immutable lpPair;

    IERC20 public immutable STABLECOIN; 

    bool private swapping;
    uint256 public swapTokensAtAmount;

    TokenHandler public tokenHandler;

    address public operationsAddress;
    address public devAddress;
    address public liquidityAddress;
    address public futureOwnerAddress;

    uint256 public tradingActiveBlock = 0; // 0 means trading is not active
    uint256 public blockForPenaltyEnd;
    mapping (address => bool) public restrictedWallets;
    address[] public earlyBuyers;
    uint256 public botsCaught;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;
    
     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferBlock; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyLiquidityFee;
    uint256 public buyOperationsFee;
    uint256 public buyDevFee;
    uint256 public buyRewardFee;

    uint256 public sellTotalFees;
    uint256 public sellOperationsFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;
    uint256 public sellRewardFee;

    uint256 public tokensForOperations;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;
    uint256 public tokensForReward;
    
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    mapping (address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event EnabledTrading();
    event RemovedLimits();
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event UpdatedMaxBuyAmount(uint256 newAmount);
    event UpdatedMaxSellAmount(uint256 newAmount);
    event UpdatedMaxWalletAmount(uint256 newAmount);
    event UpdatedBuyFee(uint256 newAmount);
    event UpdatedSellFee(uint256 newAmount);
    event UpdatedOperationsAddress(address indexed newWallet);
    event UpdatedRewardsAddress(address indexed newWallet);
    event UpdatedDevAddress(address indexed newWallet);
    event UpdatedLiquidityAddress(address indexed newWallet);
    event MaxTransactionExclusion(address _address, bool excluded);
    event OwnerForcedSwapBack(uint256 timestamp);
    event CaughtEarlyBuyer(address sniper);
    event TransferForeignToken(address token, uint256 amount);

    constructor() ERC20("SVB Inu", "SVB") {

        address stablecoinAddress;
        address _dexRouter;

        if(block.chainid == 1){
            stablecoinAddress  = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; // USDC
            _dexRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // Ethereum: Uniswap V2
        } else if(block.chainid == 56){
            stablecoinAddress  = 0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56; // BUSD
            _dexRouter = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // BNB Chain: PCS V2
        } else if(block.chainid == 97){
            stablecoinAddress  = 0x78867BbEeF44f2326bF8DDd1941a4439382EF2A7; // BSC Testnet BUSD
            _dexRouter = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1; // BNB Chain: PCS V2
        } else {
            revert("Chain not configured");
        }

        token = stablecoinAddress;
        dividendTracker = new DividendTracker(token);

        STABLECOIN = IERC20(stablecoinAddress);
        require(STABLECOIN.decimals()  > 0 , "Incorrect liquidity token");

        address newOwner = msg.sender; // can leave alone if owner is deployer.

        dexRouter = IDexRouter(_dexRouter);

        // create pair
        lpPair = IDexFactory(dexRouter.factory()).createPair(address(this), address(STABLECOIN));
        setAutomatedMarketMakerPair(address(lpPair), true);

        address ethPair = IDexFactory(dexRouter.factory()).createPair(address(this), dexRouter.WETH());
        setAutomatedMarketMakerPair(address(ethPair), true);

        uint256 totalSupply = 1 * 1e9 * 1e18;
        
        maxBuyAmount = totalSupply * 3 / 100;
        maxSellAmount = totalSupply * 2 / 100;
        maxWalletAmount = totalSupply * 3 / 100;
        swapTokensAtAmount = totalSupply * 5 / 10000;

        tokenHandler = new TokenHandler();

        buyOperationsFee = 25;
        buyLiquidityFee = 0;
        buyDevFee = 0;
        buyRewardFee = 3;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyDevFee + buyRewardFee;


        sellOperationsFee = 25;
        sellLiquidityFee = 0;
        sellDevFee = 0;
        sellRewardFee = 3;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellDevFee + sellRewardFee;

        // update these!
        operationsAddress = address(msg.sender);
        devAddress = address(msg.sender);
        liquidityAddress = address(0xdead);
        futureOwnerAddress = address(msg.sender);

        _excludeFromMaxTransaction(newOwner, true);
        _excludeFromMaxTransaction(futureOwnerAddress, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(0xdead), true);
        _excludeFromMaxTransaction(address(operationsAddress), true);
        _excludeFromMaxTransaction(address(devAddress), true);
        _excludeFromMaxTransaction(address(liquidityAddress), true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(newOwner);
        dividendTracker.excludeFromDividends(address(dexRouter));
        dividendTracker.excludeFromDividends(address(0xdead));

        excludeFromFees(newOwner, true);
        excludeFromFees(futureOwnerAddress, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromFees(address(operationsAddress), true);
        excludeFromFees(address(devAddress), true);
        excludeFromFees(address(liquidityAddress), true);

        _createInitialSupply(address(newOwner), totalSupply * 100);
        transferOwnership(newOwner);
    }

    function enableTrading(uint256 blocksForPenalty) external onlyOwner {
        require(!tradingActive, "Trading is already active, cannot relaunch.");
        require(blocksForPenalty < 10, "Cannot make penalty blocks more than 10");
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
        blockForPenaltyEnd = tradingActiveBlock + blocksForPenalty;
        emit EnabledTrading();
    }

    function pauseTrading() external onlyOwner {
        require(blockForPenaltyEnd > 0, "Cannot pause until token has launched");
        require(tradingActive, "Trading is already paused");
        tradingActive = false;
    }

    function unpauseTrading() external  {
        require(blockForPenaltyEnd > 0, "Cannot unpause until token has launched");
        require(!tradingActive, "Trading is already unpaused");
        tradingActive = true;
    }

    // excludes wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // removes exclusion on wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function includeInDividends(address account) external onlyOwner {
        dividendTracker.includeInDividends(account);
    }

    function manageRestrictedWallets(address[] calldata wallets,  bool restricted) external onlyOwner {
        for(uint256 i = 0; i < wallets.length; i++){
            restrictedWallets[wallets[i]] = restricted;
        }
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        transferDelayEnabled = false;
        emit RemovedLimits();
    }

    function getEarlyBuyers() external view returns (address[] memory){
        return earlyBuyers;
    }

    function removeBoughtEarly(address wallet) external onlyOwner {
        restrictedWallets[wallet] = false;
    }

    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner {
        transferDelayEnabled = false;
    }
    
    function updateMaxBuyAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 2 / 1000)/1e18, "Cannot set max buy amount lower than 0.2%");
        maxBuyAmount = newNum * (10**18);
        emit UpdatedMaxBuyAmount(maxBuyAmount);
    }
    
    function updateMaxSellAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 2 / 1000)/1e18, "Cannot set max sell amount lower than 0.2%");
        maxSellAmount = newNum * (10**18);
        emit UpdatedMaxSellAmount(maxSellAmount);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 3 / 1000)/1e18, "Cannot set max wallet amount lower than 0.3%");
        maxWalletAmount = newNum * (10**18);
        emit UpdatedMaxWalletAmount(maxWalletAmount);
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
  	    require(newAmount >= totalSupply() * 1 / 1000000, "Swap amount cannot be lower than 0.0001% total supply.");
  	    require(newAmount <= totalSupply() * 1 / 1000, "Swap amount cannot be higher than 0.1% total supply.");
  	    swapTokensAtAmount = newAmount;
  	}
    
    function _excludeFromMaxTransaction(address updAds, bool isExcluded) private {
        _isExcludedMaxTransactionAmount[updAds] = isExcluded;
        emit MaxTransactionExclusion(updAds, isExcluded);
    }

    function airdropToWallets(address[] memory wallets, uint256[] memory amountsInTokens) external onlyOwner {
        require(wallets.length == amountsInTokens.length, "arrays must be the same length");
        require(wallets.length < 600, "Can only airdrop 600 wallets per txn due to gas limits");
        for(uint256 i = 0; i < wallets.length; i++){
            address wallet = wallets[i];
            uint256 amount = amountsInTokens[i];
            super._transfer(msg.sender, wallet, amount);
        }
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) external onlyOwner {
        if(!isEx){
            require(updAds != lpPair, "Cannot remove uniswap pair from max txn");
        }
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != lpPair || value, "The pair cannot be removed from automatedMarketMakerPairs");
        automatedMarketMakerPairs[pair] = value;
        _excludeFromMaxTransaction(pair, value);
        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateBuyFees(uint256 _operationsFee, uint256 _liquidityFee, uint256 _devFee, uint256 _rewardFee) external onlyOwner {
        buyOperationsFee = _operationsFee;
        buyLiquidityFee = _liquidityFee;
        buyDevFee = _devFee;
        buyRewardFee = _rewardFee;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyDevFee;
        require(buyTotalFees <= 25, "Must keep fees at 25% or less");
        emit UpdatedBuyFee(buyTotalFees);
    }

    function updateSellFees(uint256 _operationsFee, uint256 _liquidityFee, uint256 _devFee, uint256 _rewardFee) external onlyOwner {
        sellOperationsFee = _operationsFee;
        sellLiquidityFee = _liquidityFee;
        sellDevFee = _devFee;
        sellRewardFee = _rewardFee;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellDevFee + sellRewardFee;
        require(sellTotalFees <= 25, "Must keep fees at 25% or less");
        emit UpdatedSellFee(sellTotalFees);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

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

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

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

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

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

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

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

    function claim() external {
		dividendTracker.processAccount(payable(msg.sender), false);
    }

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

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }
    
    function getNumberOfDividends() external view returns(uint256) {
        return dividendTracker.totalBalance();
    }
    
    function _transfer(address from, address to, uint256 amount) internal override {

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        if(amount == 0){
            super._transfer(from, to, 0);
            return;
        }
        
        if(!tradingActive){
            require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
        }

        if(!earlyBuyPenaltyInEffect() && tradingActive){
            require(!restrictedWallets[from] || to == owner() || to == address(0xdead), "Bots cannot transfer tokens in or out except to owner or dead address.");
        }
        
        if(limitsInEffect){
            if (from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]){
                
                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != address(dexRouter) && to != address(lpPair)){
                        require(_holderLastTransferBlock[tx.origin] + 1 < block.number && _holderLastTransferBlock[to] + 1 < block.number, "_transfer:: Transfer Delay enabled.  Try again later.");
                        _holderLastTransferBlock[tx.origin] = block.number;
                        _holderLastTransferBlock[to] = block.number;
                    }
                }
                 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxBuyAmount, "Buy transfer amount exceeds the max buy.");
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                } 
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxSellAmount, "Sell transfer amount exceeds the max sell.");
                } 
                else if (!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if(canSwap && swapEnabled && !swapping && automatedMarketMakerPairs[to]) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeFee = true;
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // bot/sniper penalty.
             if(earlyBuyPenaltyInEffect() && automatedMarketMakerPairs[from] && !automatedMarketMakerPairs[to] && buyTotalFees > 0){

                if(!restrictedWallets[to]){
                    restrictedWallets[to] = true;
                    botsCaught += 1;
                    earlyBuyers.push(to);
                    emit CaughtEarlyBuyer(to);
                }

                fees = amount * buyTotalFees / 100;
                tokensForOperations += fees * buyOperationsFee / buyTotalFees;
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForDev += fees * buyDevFee / buyTotalFees;
                tokensForReward += fees * buyRewardFee / buyTotalFees;
            }

            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount * sellTotalFees / 100;
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForOperations += fees * sellOperationsFee / sellTotalFees;
                tokensForDev += fees * sellDevFee / sellTotalFees;
                tokensForReward += fees * sellRewardFee / sellTotalFees;
            }

            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount * buyTotalFees / 100;
        	    tokensForOperations += fees * buyOperationsFee / buyTotalFees;
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForDev += fees * buyDevFee / buyTotalFees;
                tokensForReward += fees * buyRewardFee / buyTotalFees;
            }
            
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);

        dividendTracker.setBalance(payable(from), balanceOf(from));
        dividendTracker.setBalance(payable(to), balanceOf(to));
    }

    function earlyBuyPenaltyInEffect() public view returns (bool){
        return block.number < blockForPenaltyEnd;
    }

    function swapTokensForSTABLECOIN(uint256 tokenAmount) private {

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

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

        // make the swap
        dexRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(tokenHandler),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 stablecoinAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(dexRouter), tokenAmount);
        STABLECOIN.approve(address(dexRouter), stablecoinAmount);

        // add the liquidity
        dexRouter.addLiquidity(address(this), address(STABLECOIN), tokenAmount, stablecoinAmount, 0,  0,  address(liquidityAddress), block.timestamp);
    }

    function swapBack() private {

        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForOperations + tokensForDev + tokensForReward;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmount * 10){
            contractBalance = swapTokensAtAmount * 10;
        }
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        
        swapTokensForSTABLECOIN(contractBalance - liquidityTokens);

        tokenHandler.sendTokenToOwner(address(STABLECOIN));
        
        uint256 stablecoinBalance = STABLECOIN.balanceOf(address(this));
        uint256 stablecoinForLiquidity = stablecoinBalance;

        uint256 stablecoinForOperations = stablecoinBalance * tokensForOperations / (totalTokensToSwap - (tokensForLiquidity/2));
        uint256 stablecoinForDev = stablecoinBalance * tokensForDev / (totalTokensToSwap - (tokensForLiquidity/2));
        uint256 stablecoinForReward = stablecoinBalance * tokensForReward / (totalTokensToSwap - (tokensForLiquidity/2));

        stablecoinForLiquidity -= stablecoinForOperations + stablecoinForDev + stablecoinForReward;
            
        tokensForLiquidity = 0;
        tokensForOperations = 0;
        tokensForDev = 0;
        tokensForReward = 0;
        
        if(liquidityTokens > 0 && stablecoinForLiquidity > 0){
            addLiquidity(liquidityTokens, stablecoinForLiquidity);
        }

        if(stablecoinForDev > 0){
            STABLECOIN.transfer(devAddress, stablecoinForDev);
        }

        if(stablecoinForReward> 0){
            bool success = STABLECOIN.transfer(address(dividendTracker), stablecoinForReward);
            if (success) {
                dividendTracker.distributeTokenDividends(stablecoinForReward);
            }
        }

        if(STABLECOIN.balanceOf(address(this)) > 0){
            STABLECOIN.transfer(operationsAddress, STABLECOIN.balanceOf(address(this)));
        }
    }

    function transferForeignToken(address _token, address _to) external onlyOwner returns (bool _sent) {
        require(_token != address(0), "_token address cannot be 0");
        require(_token != address(this) || !tradingActive, "Can't withdraw native tokens while trading is active");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
        emit TransferForeignToken(_token, _contractBalance);
    }

    function setOperationsAddress(address _operationsAddress) external onlyOwner {
        require(_operationsAddress != address(0), "address cannot be 0");
        operationsAddress = payable(_operationsAddress);
        emit UpdatedOperationsAddress(_operationsAddress);
    }

    function setDevAddress(address _devAddress) external onlyOwner {
        require(_devAddress != address(0), "address cannot be 0");
        devAddress = payable(_devAddress);
        emit UpdatedDevAddress(_devAddress);
    }

    function setLiquidityAddress(address _liquidityAddress) external onlyOwner {
        require(_liquidityAddress != address(0), "address cannot be 0");
        liquidityAddress = payable(_liquidityAddress);
        emit UpdatedLiquidityAddress(_liquidityAddress);
    }

    // force Swap back if slippage issues.
    function forceSwapBack() external onlyOwner {
        require(balanceOf(address(this)) >= swapTokensAtAmount, "Can only swap when token amount is at or higher than restriction");
        swapping = true;
        swapBack();
        swapping = false;
        emit OwnerForcedSwapBack(block.timestamp);
    }
}

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":false,"internalType":"address","name":"sniper","type":"address"}],"name":"CaughtEarlyBuyer","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledTrading","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":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"MaxTransactionExclusion","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnerForcedSwapBack","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":[],"name":"RemovedLimits","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":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":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferForeignToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedBuyFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedDevAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedLiquidityAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxBuyAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxSellAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxWalletAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedOperationsAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedRewardsAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedSellFee","type":"event"},{"inputs":[],"name":"STABLECOIN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amountsInTokens","type":"uint256[]"}],"name":"airdropToWallets","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":"blockForPenaltyEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botsCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyOperationsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBuyPenaltyInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"earlyBuyers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocksForPenalty","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"futureOwnerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEarlyBuyers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bool","name":"restricted","type":"bool"}],"name":"manageRestrictedWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","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":"operationsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeBoughtEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"restrictedWallets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellOperationsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddress","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityAddress","type":"address"}],"name":"setLiquidityAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operationsAddress","type":"address"}],"name":"setOperationsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","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":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenHandler","outputs":[{"internalType":"contract TokenHandler","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForReward","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":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","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":"unpauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_rewardFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_rewardFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

61012060405260006010556015805462ffffff191660019081179091556017805460ff191690911790553480156200003657600080fd5b506040518060400160405280600781526020016653564220496e7560c81b8152506040518060400160405280600381526020016229ab2160e91b815250816003908162000084919062000f94565b50600462000093828262000f94565b5050506000620000a862000a2b60201b60201c565b600580546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062007c1c833981519152908290a3506000804660010362000124575073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489050737a250d5630b4cf539739df2c5dacb4c659f2488d620001e9565b4660380362000160575073e9e7cea3dedca5984780bafc599bd69add087d5690507310ed43c718714eb63d5aa57b78b54704e256024e620001e9565b466061036200019c57507378867bbeef44f2326bf8ddd1941a4439382ef2a7905073d99d1c33f9fc3444f8101754abc46c52416550d1620001e9565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b03821660a0819052604051620002069062000ed3565b6001600160a01b039091168152602001604051809103906000f08015801562000233573d6000803e3d6000fd5b506001600160a01b0390811660805282166101008190526040805163313ce56760e01b815290516000929163313ce5679160048083019260209291908290030181865afa15801562000289573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002af919062001060565b60ff1611620003015760405162461bcd60e51b815260206004820152601960248201527f496e636f7272656374206c697175696469747920746f6b656e000000000000006044820152606401620001e0565b6001600160a01b03811660c08190526040805163c45a015560e01b8152905133929163c45a01559160048083019260209291908290030181865afa1580156200034e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037491906200108c565b610100516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015620003c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ed91906200108c565b6001600160a01b031660e08190526200040890600162000a2f565b600060c0516001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200044b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047191906200108c565b6001600160a01b031663c9c653963060c0516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004e791906200108c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200055b91906200108c565b90506200056a81600162000a2f565b6b033b2e3c9fd0803ce8000000606462000586826003620010cd565b620005929190620010ef565b6006556064620005a4826002620010cd565b620005b09190620010ef565b6007556064620005c2826003620010cd565b620005ce9190620010ef565b600855612710620005e1826005620010cd565b620005ed9190620010ef565b600a55604051620005fe9062000ee1565b604051809103906000f0801580156200061b573d6000803e3d6000fd5b50600b80546001600160a01b0319166001600160a01b03929092169190911790556019601a8190556000808255601b8190556003601c819055916200066290829062001112565b6200066e919062001112565b6200067a919062001112565b6018556019601e8190556000601f81905560208190556003602181905591620006a590829062001112565b620006b1919062001112565b620006bd919062001112565b601d55600c80546001600160a01b031990811633908117909255600d8054821683179055600e8054821661dead179055600f805490911690911790556200070683600162000be4565b600f546200071f906001600160a01b0316600162000be4565b6200072c30600162000be4565b6200073b61dead600162000be4565b600c5462000754906001600160a01b0316600162000be4565b600d546200076d906001600160a01b0316600162000be4565b600e5462000786906001600160a01b0316600162000be4565b60805160405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620007cd57600080fd5b505af1158015620007e2573d6000803e3d6000fd5b505060805160405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200082c57600080fd5b505af115801562000841573d6000803e3d6000fd5b505060805160405163031e79db60e41b81526001600160a01b03878116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200088d57600080fd5b505af1158015620008a2573d6000803e3d6000fd5b505060805160c05160405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620008f057600080fd5b505af115801562000905573d6000803e3d6000fd5b505060805160405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200095157600080fd5b505af115801562000966573d6000803e3d6000fd5b505050506200097d83600162000c4760201b60201c565b600f5462000996906001600160a01b0316600162000c47565b620009a330600162000c47565b620009b261dead600162000c47565b600c54620009cb906001600160a01b0316600162000c47565b600d54620009e4906001600160a01b0316600162000c47565b600e54620009fd906001600160a01b0316600162000c47565b62000a158362000a0f836064620010cd565b62000cf1565b62000a208362000dd6565b50505050506200112d565b3390565b6005546001600160a01b0316331462000a7a5760405162461bcd60e51b8152602060048201819052602482015260008051602062007bfc8339815191526044820152606401620001e0565b60e0516001600160a01b0316826001600160a01b031614158062000a9b5750805b62000b0f5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401620001e0565b6001600160a01b0382166000908152602860205260409020805460ff191682151517905562000b3f828262000be4565b801562000ba85760805160405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801562000b8e57600080fd5b505af115801562000ba3573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b038216600081815260276020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6005546001600160a01b0316331462000c925760405162461bcd60e51b8152602060048201819052602482015260008051602062007bfc8339815191526044820152606401620001e0565b6001600160a01b038216600081815260266020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b03821662000d495760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620001e0565b806002600082825462000d5d919062001112565b90915550506001600160a01b0382166000908152602081905260408120805483929062000d8c90849062001112565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b0316331462000e215760405162461bcd60e51b8152602060048201819052602482015260008051602062007bfc8339815191526044820152606401620001e0565b6001600160a01b03811662000e885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620001e0565b6005546040516001600160a01b0380841692169060008051602062007c1c83398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b611a798062005cad83390190565b6104d6806200772683390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000f1a57607f821691505b60208210810362000f3b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000f8f57600081815260208120601f850160051c8101602086101562000f6a5750805b601f850160051c820191505b8181101562000f8b5782815560010162000f76565b5050505b505050565b81516001600160401b0381111562000fb05762000fb062000eef565b62000fc88162000fc1845462000f05565b8462000f41565b602080601f83116001811462001000576000841562000fe75750858301515b600019600386901b1c1916600185901b17855562000f8b565b600085815260208120601f198616915b82811015620010315788860151825594840194600190910190840162001010565b5085821015620010505787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200107357600080fd5b815160ff811681146200108557600080fd5b9392505050565b6000602082840312156200109f57600080fd5b81516001600160a01b03811681146200108557600080fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620010ea57620010ea620010b7565b500290565b6000826200110d57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115620011285762001128620010b7565b500190565b60805160a05160c05160e05161010051614a3f6200126e6000396000818161081e01528181613a0101528181613a7d01528181613c1601528181613cd601528181613de201528181613e7b01528181614027015281816141a701526142340152600081816106b6015281816118c201528181611d990152612f9a01526000818161051601528181612f5d0152818161407f015281816140be0152818161413c01528181614178015261428601526000610b3b015260008181610619015281816110f9015281816111c7015281816113e401528181611645015281816116c3015281816117ca01528181611e9a01528181611f370152818161204e0152818161213b015281816122c3015281816126ec015281816128a401528181612913015281816138040152818161389b01528181613ca40152613d630152614a3f6000f3fe608060405234801561001057600080fd5b50600436106104ee5760003560e01c80638da5cb5b1161028e578063c18bc19511610167578063e884f260116100d9578063f11a24d311610092578063f11a24d314610af5578063f27fd25414610afe578063f2fde38b14610b11578063f637434214610b24578063fb002c9714610b2d578063fc0c546a14610b3657600080fd5b8063e884f26014610a88578063e98030c714610a90578063ea4cfe1214610aa3578063eb472fc414610ab6578063ee40166e14610ac9578063f076e53514610ad257600080fd5b8063dc3f0d0f1161012b578063dc3f0d0f14610a0f578063dd62ed3e14610a22578063de0aad5314610a5b578063e2f4560514610a64578063e7841ec014610a6d578063e7ad9fcd14610a7557600080fd5b8063c18bc195146109c0578063c876d0b9146109d3578063d0d41fe1146109e0578063d257b34f146109f3578063d85ba06314610a0657600080fd5b8063a457c2d711610200578063ac8e3328116101c4578063ac8e3328146108fa578063ad56c13c1461090d578063b62496f514610965578063bbc0c74214610988578063c02466681461099a578063c0f306ef146109ad57600080fd5b8063a457c2d7146108af578063a62068ce146108c2578063a8b9d240146108cb578063a9059cbb146108de578063aa4bde28146108f157600080fd5b80639c3b4fdc116102525780639c3b4fdc146108705780639e46fddb146108795780639fccce321461088c578063a002959c14610895578063a0d82dc51461089e578063a26579ad146108a757600080fd5b80638da5cb5b1461080857806393a397761461081957806395d89b41146108405780639a5bd2dd146108485780639a7a23d61461085d57600080fd5b8063499b8394116103cb5780636843cd841161033d57806371778e7d116102f657806371778e7d146107b6578063751039fc146107be5780637571336a146107c657806382aa7c68146107d95780638366e79a146107ec57806388e765ff146107ff57600080fd5b80636843cd84146107635780636a486a8e146107765780636b0a894c1461077f5780636ddd17131461078857806370a082311461079b578063715018a6146107ae57600080fd5b8063525fa81f1161038f578063525fa81f1461071957806358a6d5311461072c5780635a139dd4146107365780635bb988c91461073f57806364b0f6531461075257806366d602ae1461075a57600080fd5b8063499b8394146106e05780634a62bb65146106f35780634e71d92d146107005780634f77f6c01461070857806351f205e41461071157600080fd5b80632be32b611161046457806331e79db01161042857806331e79db0146106655780633221c93f14610678578063395093511461068b5780633ad10ef61461069e578063452ed4f1146106b1578063456068d2146106d857600080fd5b80632be32b61146106015780632c1f5216146106145780632e6ed7ef1461063b57806330bb4cff1461064e578063313ce5671461065657600080fd5b806310d5de53116104b657806310d5de531461059457806318160ddd146105b75780631a8145bb146105bf5780631b3d6e87146105c85780632307b441146105db57806323b872dd146105ee57600080fd5b806306fdde03146104f35780630758d92414610511578063095ea7b3146105505780630cfe2f3f146105735780631031e36e1461058a575b600080fd5b6104fb610b5d565b60405161050891906142f6565b60405180910390f35b6105387f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610508565b61056361055e366004614360565b610bef565b6040519015158152602001610508565b61057c601c5481565b604051908152602001610508565b610592610c05565b005b6105636105a236600461438c565b60276020526000908152604090205460ff1681565b60025461057c565b61057c60235481565b600b54610538906001600160a01b031681565b6105926105e9366004614486565b610cfc565b6105636105fc366004614548565b610e55565b61059261060f366004614589565b610eff565b6105387f000000000000000000000000000000000000000000000000000000000000000081565b6105926106493660046145a2565b61100c565b61057c6110f5565b60405160128152602001610508565b61059261067336600461438c565b61117e565b600e54610538906001600160a01b031681565b610563610699366004614360565b611227565b600d54610538906001600160a01b031681565b6105387f000000000000000000000000000000000000000000000000000000000000000081565b610592611263565b6105926106ee36600461438c565b61132e565b6015546105639060ff1681565b6105926113c8565b61057c601e5481565b61059261145c565b61059261072736600461438c565b61155c565b6011544310610563565b61057c601a5481565b61059261074d36600461438c565b6115f6565b61057c611641565b61057c60075481565b61057c61077136600461438c565b6116a1565b61057c601d5481565b61057c60145481565b6015546105639062010000900460ff1681565b61057c6107a936600461438c565b611737565b610592611752565b61057c6117c6565b610592611826565b6105926107d43660046145e2565b611891565b6105926107e7366004614589565b61197c565b6105636107fa36600461461b565b611ac3565b61057c60065481565b6005546001600160a01b0316610538565b6105387f000000000000000000000000000000000000000000000000000000000000000081565b6104fb611cfd565b610850611d0c565b604051610508919061468d565b61059261086b3660046145e2565b611d6d565b61057c601b5481565b600f54610538906001600160a01b031681565b61057c60245481565b61057c60255481565b61057c60205481565b61057c611f33565b6105636108bd366004614360565b611f93565b61057c60115481565b61057c6108d936600461438c565b61202c565b6105636108ec366004614360565b61207f565b61057c60085481565b6105926109083660046146a0565b61208c565b61092061091b36600461438c565b61212d565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610508565b61056361097336600461438c565b60286020526000908152604090205460ff1681565b60155461056390610100900460ff1681565b6105926109a83660046145e2565b6121f1565b6105926109bb36600461438c565b61227a565b6105926109ce366004614589565b6122f2565b6017546105639060ff1681565b6105926109ee36600461438c565b6123fb565b610592610a01366004614589565b612495565b61057c60185481565b610592610a1d366004614589565b6125e1565b61057c610a3036600461461b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61057c60215481565b61057c600a5481565b61057c6126e8565b610592610a833660046145a2565b612748565b61059261282e565b610592610a9e366004614589565b612864565b600c54610538906001600160a01b031681565b610538610ac4366004614589565b6128db565b61057c60105481565b610563610ae036600461438c565b60126020526000908152604090205460ff1681565b61057c60195481565b610920610b0c366004614589565b612905565b610592610b1f36600461438c565b61295f565b61057c601f5481565b61057c60225481565b6105387f000000000000000000000000000000000000000000000000000000000000000081565b606060038054610b6c90614726565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9890614726565b8015610be55780601f10610bba57610100808354040283529160200191610be5565b820191906000526020600020905b815481529060010190602001808311610bc857829003601f168201915b5050505050905090565b6000610bfc338484612a4a565b50600192915050565b6005546001600160a01b03163314610c385760405162461bcd60e51b8152600401610c2f90614760565b60405180910390fd5b600060115411610c985760405162461bcd60e51b815260206004820152602560248201527f43616e6e6f7420706175736520756e74696c20746f6b656e20686173206c61756044820152641b98da195960da1b6064820152608401610c2f565b601554610100900460ff16610cef5760405162461bcd60e51b815260206004820152601960248201527f54726164696e6720697320616c726561647920706175736564000000000000006044820152606401610c2f565b6015805461ff0019169055565b6005546001600160a01b03163314610d265760405162461bcd60e51b8152600401610c2f90614760565b8051825114610d775760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610c2f565b610258825110610de85760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203630302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610c2f565b60005b8251811015610e50576000838281518110610e0857610e08614795565b602002602001015190506000838381518110610e2657610e26614795565b60200260200101519050610e3b338383612b6e565b50508080610e48906147c1565b915050610deb565b505050565b6000610e62848484612cc3565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610ee75760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610c2f565b610ef48533858403612a4a565b506001949350505050565b6005546001600160a01b03163314610f295760405162461bcd60e51b8152600401610c2f90614760565b670de0b6b3a76400006103e8610f3e60025490565b610f499060026147da565b610f5391906147f9565b610f5d91906147f9565b811015610fbe5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e322560b81b6064820152608401610c2f565b610fd081670de0b6b3a76400006147da565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b6005546001600160a01b031633146110365760405162461bcd60e51b8152600401610c2f90614760565b601a8490556019839055601b829055601c81905581611055848661481b565b61105f919061481b565b6018819055601910156110b45760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323525206f72206c6573730000006044820152606401610c2f565b7f03cd3090e7c409e4a7ffd2d90ff610979f4a94a87a512188b7b615671bfb772f6018546040516110e791815260200190565b60405180910390a150505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166385a6b3ae6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111799190614833565b905090565b6005546001600160a01b031633146111a85760405162461bcd60e51b8152600401610c2f90614760565b60405163031e79db60e41b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906331e79db0906024015b600060405180830381600087803b15801561120c57600080fd5b505af1158015611220573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610bfc91859061125e90869061481b565b612a4a565b6000601154116112c55760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f7420756e706175736520756e74696c20746f6b656e20686173206c604482015266185d5b98da195960ca1b6064820152608401610c2f565b601554610100900460ff161561131d5760405162461bcd60e51b815260206004820152601b60248201527f54726164696e6720697320616c726561647920756e70617573656400000000006044820152606401610c2f565b6015805461ff001916610100179055565b6005546001600160a01b031633146113585760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b03811661137e5760405162461bcd60e51b8152600401610c2f9061484c565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f4efa56652237561d0f1fd31311aeaaa41f3b754a461545ed3cf6ced5876d298290600090a250565b60405163bc4c4b3760e01b8152336004820152600060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063bc4c4b37906044016020604051808303816000875af1158015611435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114599190614879565b50565b6005546001600160a01b031633146114865760405162461bcd60e51b8152600401610c2f90614760565b600a5461149230611737565b1015611508576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610c2f565b6009805460ff1916600117905561151d613939565b6009805460ff191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b6005546001600160a01b031633146115865760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b0381166115ac5760405162461bcd60e51b8152600401610c2f9061484c565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517f217742673c85d2f459a37c99960c860122cdadf529374b41418d2718cae7726f90600090a250565b6005546001600160a01b031633146116205760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b03166000908152601260205260409020805460ff19169055565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166309bbedde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611155573d6000803e3d6000fd5b60405163156dbbf560e31b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063ab6ddfa8906024015b602060405180830381865afa15801561170d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117319190614833565b92915050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461177c5760405162461bcd60e51b8152600401610c2f90614760565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad7a672f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611155573d6000803e3d6000fd5b6005546001600160a01b031633146118505760405162461bcd60e51b8152600401610c2f90614760565b6015805460ff199081169091556017805490911690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146118bb5760405162461bcd60e51b8152600401610c2f90614760565b80611951577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036119515760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610c2f565b6001600160a01b03919091166000908152602760205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146119a65760405162461bcd60e51b8152600401610c2f90614760565b601554610100900460ff1615611a125760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610c2f565b600a8110611a725760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f74206d616b652070656e616c747920626c6f636b73206d6f72652060448201526607468616e2031360cc1b6064820152608401610c2f565b6015805462ffff00191662010100179055436010819055611a9490829061481b565b6011556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a150565b6005546000906001600160a01b03163314611af05760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b038316611b465760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610c2f565b6001600160a01b03831630141580611b665750601554610100900460ff16155b611bcf5760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610c2f565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3a9190614833565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611c8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb19190614879565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b606060048054610b6c90614726565b60606013805480602002602001604051908101604052809291908181526020018280548015610be557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d46575050505050905090565b6005546001600160a01b03163314611d975760405162461bcd60e51b8152600401610c2f90614760565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141580611dd55750805b611e475760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610c2f565b6001600160a01b0382166000908152602860205260409020805460ff1916821515179055611e758282613f6d565b8015611ef75760405163031e79db60e41b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906331e79db090602401600060405180830381600087803b158015611ede57600080fd5b505af1158015611ef2573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636f2789ec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611155573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156120155760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c2f565b6120223385858403612a4a565b5060019392505050565b6040516302a2e74960e61b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a8b9d240906024016116f0565b6000610bfc338484612cc3565b6005546001600160a01b031633146120b65760405162461bcd60e51b8152600401610c2f90614760565b60005b828110156121275781601260008686858181106120d8576120d8614795565b90506020020160208101906120ed919061438c565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061211f816147c1565b9150506120b9565b50505050565b6000806000806000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fbcbc0f18a6040518263ffffffff1660e01b815260040161219491906001600160a01b0391909116815260200190565b61010060405180830381865afa1580156121b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d69190614896565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b0316331461221b5760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b038216600081815260266020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146122a45760405162461bcd60e51b8152600401610c2f90614760565b60405163c0f306ef60e01b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c0f306ef906024016111f2565b6005546001600160a01b0316331461231c5760405162461bcd60e51b8152600401610c2f90614760565b670de0b6b3a76400006103e861233160025490565b61233c9060036147da565b61234691906147f9565b61235091906147f9565b8110156123b45760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610c2f565b6123c681670de0b6b3a76400006147da565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001611001565b6005546001600160a01b031633146124255760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b03811661244b5760405162461bcd60e51b8152600401610c2f9061484c565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f804ec39c1aea0b9f2615a34c3fa437b6ddda2c72e6848abf0f23955589a7ad5490600090a250565b6005546001600160a01b031633146124bf5760405162461bcd60e51b8152600401610c2f90614760565b620f42406124cc60025490565b6124d79060016147da565b6124e191906147f9565b81101561254f5760405162461bcd60e51b815260206004820152603660248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e6044820152751018171818181892903a37ba30b61039bab838363c9760511b6064820152608401610c2f565b6103e861255b60025490565b6125669060016147da565b61257091906147f9565b8111156125dc5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610c2f565b600a55565b6005546001600160a01b0316331461260b5760405162461bcd60e51b8152600401610c2f90614760565b670de0b6b3a76400006103e861262060025490565b61262b9060026147da565b61263591906147f9565b61263f91906147f9565b8110156126a15760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e322560b01b6064820152608401610c2f565b6126b381670de0b6b3a76400006147da565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001611001565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e7841ec06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611155573d6000803e3d6000fd5b6005546001600160a01b031633146127725760405162461bcd60e51b8152600401610c2f90614760565b601e849055601f839055602082905560218190558082612792858761481b565b61279c919061481b565b6127a6919061481b565b601d819055601910156127fb5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323525206f72206c6573730000006044820152606401610c2f565b7f274faecd49018fb411281f27986b6b4acc86e5db4100735531acd18b7b6d5f93601d546040516110e791815260200190565b6005546001600160a01b031633146128585760405162461bcd60e51b8152600401610c2f90614760565b6017805460ff19169055565b6005546001600160a01b0316331461288e5760405162461bcd60e51b8152600401610c2f90614760565b60405163e98030c760e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e98030c7906024016111f2565b601381815481106128eb57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000806000806000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635183d6fd8a6040518263ffffffff1660e01b815260040161219491815260200190565b6005546001600160a01b031633146129895760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b0381166129ee5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c2f565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316612aac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c2f565b6001600160a01b038216612b0d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c2f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316612b945760405162461bcd60e51b8152600401610c2f90614900565b6001600160a01b038216612bba5760405162461bcd60e51b8152600401610c2f90614945565b6001600160a01b03831660009081526020819052604090205481811015612c325760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c2f565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612c6990849061481b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612cb591815260200190565b60405180910390a350505050565b6001600160a01b038316612ce95760405162461bcd60e51b8152600401610c2f90614900565b6001600160a01b038216612d0f5760405162461bcd60e51b8152600401610c2f90614945565b80600003612d2357610e5083836000612b6e565b601554610100900460ff16612db6576001600160a01b03831660009081526026602052604090205460ff1680612d7157506001600160a01b03821660009081526026602052604090205460ff165b612db65760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610c2f565b6011544310158015612dcf5750601554610100900460ff165b15612e9f576001600160a01b03831660009081526012602052604090205460ff161580612e0957506005546001600160a01b038381169116145b80612e1e57506001600160a01b03821661dead145b612e9f5760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610c2f565b60155460ff16156132e7576005546001600160a01b03848116911614801590612ed657506005546001600160a01b03838116911614155b8015612eea57506001600160a01b03821615155b8015612f0157506001600160a01b03821661dead14155b8015612f2657506001600160a01b03831660009081526026602052604090205460ff16155b8015612f4b57506001600160a01b03821660009081526026602052604090205460ff16155b156132e75760175460ff16156130b0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614158015612fcf57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b156130b057326000908152601660205260409020544390612ff190600161481b565b10801561302157506001600160a01b038216600090815260166020526040902054439061301f90600161481b565b105b61308b5760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610c2f565b3260009081526016602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526028602052604090205460ff1680156130f157506001600160a01b03821660009081526027602052604090205460ff16155b156131bd576006548111156131595760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610c2f565b60085461316583611737565b61316f908361481b565b11156131b85760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c2f565b6132e7565b6001600160a01b03821660009081526028602052604090205460ff1680156131fe57506001600160a01b03831660009081526027602052604090205460ff16155b15613268576007548111156131b85760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610c2f565b6001600160a01b03821660009081526027602052604090205460ff166132e75760085461329483611737565b61329e908361481b565b11156132e75760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c2f565b60006132f230611737565b600a5490915081108015908190613311575060155462010000900460ff165b8015613320575060095460ff16155b801561334457506001600160a01b03841660009081526028602052604090205460ff165b15613369576009805460ff1916600117905561335e613939565b6009805460ff191690555b6001600160a01b03851660009081526026602052604090205460019060ff16806133ab57506001600160a01b03851660009081526026602052604090205460ff165b156133b4575060005b600081156137f757601154431080156133e557506001600160a01b03871660009081526028602052604090205460ff165b801561340a57506001600160a01b03861660009081526028602052604090205460ff16155b801561341857506000601854115b156135e0576001600160a01b03861660009081526012602052604090205460ff166134fd576001600160a01b0386166000908152601260205260408120805460ff19166001908117909155601480549192909161347690849061481b565b9091555050601380546001810182556000919091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319166001600160a01b0388169081179091556040519081527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b60646018548661350d91906147da565b61351791906147f9565b9050601854601a548261352a91906147da565b61353491906147f9565b60226000828254613545919061481b565b909155505060185460195461355a90836147da565b61356491906147f9565b60236000828254613575919061481b565b9091555050601854601b5461358a90836147da565b61359491906147f9565b602460008282546135a5919061481b565b9091555050601854601c546135ba90836147da565b6135c491906147f9565b602560008282546135d5919061481b565b909155506137d99050565b6001600160a01b03861660009081526028602052604090205460ff16801561360a57506000601d54115b156136cc576064601d548661361f91906147da565b61362991906147f9565b9050601d54601f548261363c91906147da565b61364691906147f9565b60236000828254613657919061481b565b9091555050601d54601e5461366c90836147da565b61367691906147f9565b60226000828254613687919061481b565b9091555050601d5460205461369c90836147da565b6136a691906147f9565b602460008282546136b7919061481b565b9091555050601d546021546135ba90836147da565b6001600160a01b03871660009081526028602052604090205460ff1680156136f657506000601854115b156137d95760646018548661370b91906147da565b61371591906147f9565b9050601854601a548261372891906147da565b61373291906147f9565b60226000828254613743919061481b565b909155505060185460195461375890836147da565b61376291906147f9565b60236000828254613773919061481b565b9091555050601854601b5461378890836147da565b61379291906147f9565b602460008282546137a3919061481b565b9091555050601854601c546137b890836147da565b6137c291906147f9565b602560008282546137d3919061481b565b90915550505b80156137ea576137ea873083612b6e565b6137f48186614988565b94505b613802878787612b6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e30443bc8861383b8a611737565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561388157600080fd5b505af1158015613895573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e30443bc876138d289611737565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561391857600080fd5b505af115801561392c573d6000803e3d6000fd5b5050505050505050505050565b600061394430611737565b9050600060255460245460225460235461395e919061481b565b613968919061481b565b613972919061481b565b905081158061397f575080155b15613988575050565b600a8054613995916147da565b8211156139ac57600a80546139a9916147da565b91505b6000600282602354856139bf91906147da565b6139c991906147f9565b6139d391906147f9565b90506139e76139e28285614988565b613fd0565b600b546040516304fa881160e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152909116906313ea204490602401600060405180830381600087803b158015613a4e57600080fd5b505af1158015613a62573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a0823190602401602060405180830381865afa158015613acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613af19190614833565b9050600081905060006002602354613b0991906147f9565b613b139086614988565b602254613b2090856147da565b613b2a91906147f9565b905060006002602354613b3d91906147f9565b613b479087614988565b602454613b5490866147da565b613b5e91906147f9565b905060006002602354613b7191906147f9565b613b7b9088614988565b602554613b8890876147da565b613b9291906147f9565b905080613b9f838561481b565b613ba9919061481b565b613bb39085614988565b600060238190556022819055602481905560255593508515801590613bd85750600084115b15613be757613be78685614136565b8115613c8757600d5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015613c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c859190614879565b505b8015613dca5760405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015613d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d459190614879565b90508015613dc85760405163b0c7ce3760e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0c7ce3790602401600060405180830381600087803b158015613daf57600080fd5b505af1158015613dc3573d6000803e3d6000fd5b505050505b505b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015613e31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e559190614833565b1115613f6357600c546040516370a0823160e01b81523060048201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015613ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ef29190614833565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015613f3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f619190614879565b505b5050505050505050565b6001600160a01b038216600081815260276020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061400557614005614795565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061405957614059614795565b60200260200101906001600160a01b031690816001600160a01b0316815250506140a4307f000000000000000000000000000000000000000000000000000000000000000084612a4a565b600b54604051635c11d79560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692635c11d7959261410092879260009288929190911690429060040161499f565b600060405180830381600087803b15801561411a57600080fd5b505af115801561412e573d6000803e3d6000fd5b505050505050565b614161307f000000000000000000000000000000000000000000000000000000000000000084612a4a565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af11580156141f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142149190614879565b50600e5460405162e8e33760e81b81523060048201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018590526064820184905260006084830181905260a483015291821660c48201524260e48201527f00000000000000000000000000000000000000000000000000000000000000009091169063e8e3370090610104016060604051808303816000875af11580156142d2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122091906149db565b600060208083528351808285015260005b8181101561432357858101830151858201604001528201614307565b81811115614335576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461145957600080fd5b6000806040838503121561437357600080fd5b823561437e8161434b565b946020939093013593505050565b60006020828403121561439e57600080fd5b81356143a98161434b565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156143ef576143ef6143b0565b604052919050565b600067ffffffffffffffff821115614411576144116143b0565b5060051b60200190565b600082601f83011261442c57600080fd5b8135602061444161443c836143f7565b6143c6565b82815260059290921b8401810191818101908684111561446057600080fd5b8286015b8481101561447b5780358352918301918301614464565b509695505050505050565b6000806040838503121561449957600080fd5b823567ffffffffffffffff808211156144b157600080fd5b818501915085601f8301126144c557600080fd5b813560206144d561443c836143f7565b82815260059290921b840181019181810190898411156144f457600080fd5b948201945b8386101561451b57853561450c8161434b565b825294820194908201906144f9565b9650508601359250508082111561453157600080fd5b5061453e8582860161441b565b9150509250929050565b60008060006060848603121561455d57600080fd5b83356145688161434b565b925060208401356145788161434b565b929592945050506040919091013590565b60006020828403121561459b57600080fd5b5035919050565b600080600080608085870312156145b857600080fd5b5050823594602084013594506040840135936060013592509050565b801515811461145957600080fd5b600080604083850312156145f557600080fd5b82356146008161434b565b91506020830135614610816145d4565b809150509250929050565b6000806040838503121561462e57600080fd5b82356146398161434b565b915060208301356146108161434b565b600081518084526020808501945080840160005b838110156146825781516001600160a01b03168752958201959082019060010161465d565b509495945050505050565b6020815260006143a96020830184614649565b6000806000604084860312156146b557600080fd5b833567ffffffffffffffff808211156146cd57600080fd5b818601915086601f8301126146e157600080fd5b8135818111156146f057600080fd5b8760208260051b850101111561470557600080fd5b6020928301955093505084013561471b816145d4565b809150509250925092565b600181811c9082168061473a57607f821691505b60208210810361475a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016147d3576147d36147ab565b5060010190565b60008160001904831182151516156147f4576147f46147ab565b500290565b60008261481657634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561482e5761482e6147ab565b500190565b60006020828403121561484557600080fd5b5051919050565b6020808252601390820152720616464726573732063616e6e6f74206265203606c1b604082015260600190565b60006020828403121561488b57600080fd5b81516143a9816145d4565b600080600080600080600080610100898b0312156148b357600080fd5b88516148be8161434b565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60008282101561499a5761499a6147ab565b500390565b85815284602082015260a0604082015260006149be60a0830186614649565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156149f057600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220e459e75fb090c67b0eca7cce1a70b2a1820d4a848c7980ae6a10a974d80ed8cc64736f6c634300080f003360a060405234801561001057600080fd5b50604051611a79380380611a7983398101604081905261002f916100a0565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506104b0600f556001608052600280546001600160a01b0319166001600160a01b03929092169190911790556100d0565b6000602082840312156100b257600080fd5b81516001600160a01b03811681146100c957600080fd5b9392505050565b6080516119876100f2600039600081816104c10152610ac301526119876000f3fe6080604052600436106101c65760003560e01c8063a8b9d240116100f7578063c0f306ef11610095578063f2fde38b11610064578063f2fde38b14610558578063fbcbc0f114610578578063fc0c546a14610598578063ffb2c479146105b857600080fd5b8063c0f306ef146104e3578063e30443bc14610503578063e7841ec014610523578063e98030c71461053857600080fd5b8063ad7a672f116100d1578063ad7a672f14610459578063b0c7ce371461046f578063bc4c4b371461048f578063be10b614146104af57600080fd5b8063a8b9d240146103d6578063aafd847a146103f6578063ab6ddfa81461042c57600080fd5b80635183d6fd11610164578063715018a61161013e578063715018a61461035957806385a6b3ae1461036e5780638da5cb5b1461038457806391b89fba146103b657600080fd5b80635183d6fd146102c95780636a4740021461032e5780636f2789ec1461034357600080fd5b806327ce0147116101a057806327ce0147146102335780633009a6091461025357806331e79db0146102695780634e7b827f1461028957600080fd5b806303c83302146101da57806309bbedde146101e2578063226cfa3d1461020657600080fd5b366101d5576101d36105f3565b005b600080fd5b6101d36105f3565b3480156101ee57600080fd5b506008545b6040519081526020015b60405180910390f35b34801561021257600080fd5b506101f36102213660046116b6565b600e6020526000908152604090205481565b34801561023f57600080fd5b506101f361024e3660046116b6565b610666565b34801561025f57600080fd5b506101f3600c5481565b34801561027557600080fd5b506101d36102843660046116b6565b6106c9565b34801561029557600080fd5b506102b96102a43660046116b6565b600d6020526000908152604090205460ff1681565b60405190151581526020016101fd565b3480156102d557600080fd5b506102e96102e43660046116d3565b610761565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101fd565b34801561033a57600080fd5b506101d36107ce565b34801561034f57600080fd5b506101f3600f5481565b34801561036557600080fd5b506101d36107da565b34801561037a57600080fd5b506101f360075481565b34801561039057600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101fd565b3480156103c257600080fd5b506101f36103d13660046116b6565b61084e565b3480156103e257600080fd5b506101f36103f13660046116b6565b610855565b34801561040257600080fd5b506101f36104113660046116b6565b6001600160a01b031660009081526004602052604090205490565b34801561043857600080fd5b506101f36104473660046116b6565b60056020526000908152604090205481565b34801561046557600080fd5b506101f360065481565b34801561047b57600080fd5b506101d361048a3660046116d3565b610881565b34801561049b57600080fd5b506102b96104aa3660046116fa565b610933565b3480156104bb57600080fd5b506101f37f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ef57600080fd5b506101d36104fe3660046116b6565b6109df565b34801561050f57600080fd5b506101d361051e366004611733565b610a77565b34801561052f57600080fd5b50600c546101f3565b34801561054457600080fd5b506101d36105533660046116d3565b610b26565b34801561056457600080fd5b506101d36105733660046116b6565b610c8f565b34801561058457600080fd5b506102e96105933660046116b6565b610d79565b3480156105a457600080fd5b5060025461039e906001600160a01b031681565b3480156105c457600080fd5b506105d86105d33660046116d3565b610e60565b604080519384526020840192909252908201526060016101fd565b60405162461bcd60e51b815260206004820152603a60248201527f43616e6e6f742073656e6420424e42206469726563746c7920746f207472616360448201527f6b657220617320697420697320756e7265636f76657261626c6500000000000060648201526084015b60405180910390fd5b6001600160a01b0381166000908152600360209081526040808320546005909252822054600154600160801b926106b9926106b4926106ae916106a99190610f7d565b611006565b90611016565b611054565b6106c39190611775565b92915050565b6000546001600160a01b031633146106f35760405162461bcd60e51b815260040161065d90611797565b6001600160a01b0381166000908152600d60205260408120805460ff19166001179055610721908290611067565b61072a81611100565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b60008060008060008060008061077660085490565b891061079b5750600096506000199550859450869350839250829150819050806107c3565b60006107a68a611233565b90506107b181610d79565b98509850985098509850985098509850505b919395975091939597565b6107d733611266565b50565b6000546001600160a01b031633146108045760405162461bcd60e51b815260040161065d90611797565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60006106c3825b6001600160a01b0381166000908152600460205260408120546106c39061087b84610666565b906113cb565b6000546001600160a01b031633146108ab5760405162461bcd60e51b815260040161065d90611797565b6000600654116108ba57600080fd5b80156107d7576006546108e8906108d583600160801b610f7d565b6108df9190611775565b6001549061140d565b60015560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a260075461092d908261140d565b60075550565b600080546001600160a01b0316331461095e5760405162461bcd60e51b815260040161065d90611797565b600061096984611266565b905080156109d5576001600160a01b0384166000818152600e6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906109c39085815260200190565b60405180910390a360019150506106c3565b5060009392505050565b6000546001600160a01b03163314610a095760405162461bcd60e51b815260040161065d90611797565b6001600160a01b0381166000908152600d602052604090205460ff16610a2e57600080fd5b6001600160a01b0381166000818152600d6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b6000546001600160a01b03163314610aa15760405162461bcd60e51b815260040161065d90611797565b6001600160a01b0382166000908152600d602052604090205460ff16610b22577f00000000000000000000000000000000000000000000000000000000000000008110610b0157610af28282611067565b610afc828261146c565b610b15565b610b0c826000611067565b610b1582611100565b610b20826001610933565b505b5050565b6000546001600160a01b03163314610b505760405162461bcd60e51b815260040161065d90611797565b6104b08110158015610b655750620151808111155b610be55760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a40161065d565b600f548103610c5c5760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c7565000000000000000000606482015260840161065d565b600f5460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3600f55565b6000546001600160a01b03163314610cb95760405162461bcd60e51b815260040161065d90611797565b6001600160a01b038116610d1e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161065d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080808080610d8b8861152a565b9650600019955060008712610ded57600c54871115610db957600c54610db290889061156f565b9550610ded565b600c5460085460009110610dce576000610ddd565b600c54600854610ddd916113cb565b9050610de98882611016565b9650505b610df688610855565b9450610e0188610666565b6001600160a01b0389166000908152600e6020526040902054909450925082610e2b576000610e39565b600f54610e3990849061140d565b9150428211610e49576000610e53565b610e5382426113cb565b9050919395975091939597565b60085460009081908190808203610e82575050600c5460009250829150610f76565b600c546000805a90506000805b8984108015610e9d57508582105b15610f655784610eac816117cc565b60085490965086109050610ebf57600094505b600060086000018681548110610ed757610ed76117e5565b60009182526020808320909101546001600160a01b0316808352600e909152604090912054909150610f08906115ac565b15610f2b57610f18816001610933565b15610f2b5781610f27816117cc565b9250505b82610f35816117cc565b93505060005a905080851115610f5c57610f59610f5286836113cb565b879061140d565b95505b9350610e8f9050565b600c85905590975095509193505050505b9193909250565b600082600003610f8f575060006106c3565b6000610f9b83856117fb565b905082610fa88583611775565b14610fff5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161065d565b9392505050565b600081818112156106c357600080fd5b600080611023838561181a565b9050600083121580156110365750838112155b8061104b575060008312801561104b57508381125b610fff57600080fd5b60008082121561106357600080fd5b5090565b6001600160a01b0382166000908152600560205260409020805490829055808211156110c357600061109983836113cb565b90506110a584826115d3565b80600660008282546110b7919061185b565b90915550610b20915050565b80821015610b205760006110d782846113cb565b90506110e3848261162d565b80600660008282546110f59190611873565b909155505050505050565b6001600160a01b0381166000908152600b602052604090205460ff166111235750565b6001600160a01b0381166000908152600b60209081526040808320805460ff1916905560098252808320839055600a90915281205460085490919061116a90600190611873565b9050600060086000018281548110611184576111846117e5565b60009182526020808320909101546001600160a01b03908116808452600a90925260408084208790559087168352822091909155600880549192508291859081106111d1576111d16117e5565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600880548061120b5761120b61188a565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b60006008600001828154811061124b5761124b6117e5565b6000918252602090912001546001600160a01b031692915050565b60008061127283610855565b905080156113c2576001600160a01b03831660009081526004602052604090205461129d908261140d565b6001600160a01b038416600081815260046020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906112ec9084815260200190565b60405180910390a260025460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb906044016020604051808303816000875af1158015611348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136c91906118a0565b9050806113bb576001600160a01b03841660009081526004602052604090205461139690836113cb565b6001600160a01b03909416600090815260046020526040812094909455509192915050565b5092915050565b50600092915050565b6000610fff83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611667565b60008061141a838561185b565b905083811015610fff5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161065d565b6001600160a01b0382166000908152600b602052604090205460ff16156114aa576001600160a01b0391909116600090815260096020526040902055565b6001600160a01b0382166000818152600b60209081526040808320805460ff191660019081179091556009835281842086905560088054600a909452918420839055820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b03191690911790555050565b6001600160a01b0381166000908152600b602052604081205460ff166115535750600019919050565b506001600160a01b03166000908152600a602052604090205490565b60008061157c83856118bd565b90506000831215801561158f5750838113155b8061104b575060008312801561104b5750838113610fff57600080fd5b6000428211156115be57506000919050565b600f546115cb42846113cb565b101592915050565b61160d6115ee6106a983600154610f7d90919063ffffffff16565b6001600160a01b0384166000908152600360205260409020549061156f565b6001600160a01b0390921660009081526003602052604090209190915550565b61160d6116486106a983600154610f7d90919063ffffffff16565b6001600160a01b03841660009081526003602052604090205490611016565b6000818484111561168b5760405162461bcd60e51b815260040161065d91906118fc565b5060006116988486611873565b95945050505050565b6001600160a01b03811681146107d757600080fd5b6000602082840312156116c857600080fd5b8135610fff816116a1565b6000602082840312156116e557600080fd5b5035919050565b80151581146107d757600080fd5b6000806040838503121561170d57600080fd5b8235611718816116a1565b91506020830135611728816116ec565b809150509250929050565b6000806040838503121561174657600080fd5b8235611751816116a1565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b60008261179257634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000600182016117de576117de61175f565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156118155761181561175f565b500290565b600080821280156001600160ff1b038490038513161561183c5761183c61175f565b600160ff1b83900384128116156118555761185561175f565b50500190565b6000821982111561186e5761186e61175f565b500190565b6000828210156118855761188561175f565b500390565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156118b257600080fd5b8151610fff816116ec565b60008083128015600160ff1b8501841216156118db576118db61175f565b6001600160ff1b03840183138116156118f6576118f661175f565b50500390565b600060208083528351808285015260005b818110156119295785810183015185820160400152820161190d565b8181111561193b576000604083870101525b50601f01601f191692909201604001939250505056fea264697066735822122066720109deeb6537bbe5af51cba90c6fc1d360b738e67fada524c5b31ff66c6164736f6c634300080f0033608060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350610475806100616000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806313ea204414610051578063715018a6146100665780638da5cb5b1461006e578063f2fde38b1461008d575b600080fd5b61006461005f36600461039f565b6100a0565b005b610064610241565b600054604080516001600160a01b039092168252519081900360200190f35b61006461009b36600461039f565b6102b5565b6000546001600160a01b031633146100d35760405162461bcd60e51b81526004016100ca906103cf565b60405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561011a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061013e9190610404565b111561023e57806001600160a01b031663a9059cbb6101656000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa1580156101a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101cd9190610404565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061023c919061041d565b505b50565b6000546001600160a01b0316331461026b5760405162461bcd60e51b81526004016100ca906103cf565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146102df5760405162461bcd60e51b81526004016100ca906103cf565b6001600160a01b0381166103445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100ca565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000602082840312156103b157600080fd5b81356001600160a01b03811681146103c857600080fd5b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561041657600080fd5b5051919050565b60006020828403121561042f57600080fd5b815180151581146103c857600080fdfea2646970667358221220b14c23a97e87a18440d47f15f88809d779057ad1c644353b36e08844fa58f70164736f6c634300080f00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106104ee5760003560e01c80638da5cb5b1161028e578063c18bc19511610167578063e884f260116100d9578063f11a24d311610092578063f11a24d314610af5578063f27fd25414610afe578063f2fde38b14610b11578063f637434214610b24578063fb002c9714610b2d578063fc0c546a14610b3657600080fd5b8063e884f26014610a88578063e98030c714610a90578063ea4cfe1214610aa3578063eb472fc414610ab6578063ee40166e14610ac9578063f076e53514610ad257600080fd5b8063dc3f0d0f1161012b578063dc3f0d0f14610a0f578063dd62ed3e14610a22578063de0aad5314610a5b578063e2f4560514610a64578063e7841ec014610a6d578063e7ad9fcd14610a7557600080fd5b8063c18bc195146109c0578063c876d0b9146109d3578063d0d41fe1146109e0578063d257b34f146109f3578063d85ba06314610a0657600080fd5b8063a457c2d711610200578063ac8e3328116101c4578063ac8e3328146108fa578063ad56c13c1461090d578063b62496f514610965578063bbc0c74214610988578063c02466681461099a578063c0f306ef146109ad57600080fd5b8063a457c2d7146108af578063a62068ce146108c2578063a8b9d240146108cb578063a9059cbb146108de578063aa4bde28146108f157600080fd5b80639c3b4fdc116102525780639c3b4fdc146108705780639e46fddb146108795780639fccce321461088c578063a002959c14610895578063a0d82dc51461089e578063a26579ad146108a757600080fd5b80638da5cb5b1461080857806393a397761461081957806395d89b41146108405780639a5bd2dd146108485780639a7a23d61461085d57600080fd5b8063499b8394116103cb5780636843cd841161033d57806371778e7d116102f657806371778e7d146107b6578063751039fc146107be5780637571336a146107c657806382aa7c68146107d95780638366e79a146107ec57806388e765ff146107ff57600080fd5b80636843cd84146107635780636a486a8e146107765780636b0a894c1461077f5780636ddd17131461078857806370a082311461079b578063715018a6146107ae57600080fd5b8063525fa81f1161038f578063525fa81f1461071957806358a6d5311461072c5780635a139dd4146107365780635bb988c91461073f57806364b0f6531461075257806366d602ae1461075a57600080fd5b8063499b8394146106e05780634a62bb65146106f35780634e71d92d146107005780634f77f6c01461070857806351f205e41461071157600080fd5b80632be32b611161046457806331e79db01161042857806331e79db0146106655780633221c93f14610678578063395093511461068b5780633ad10ef61461069e578063452ed4f1146106b1578063456068d2146106d857600080fd5b80632be32b61146106015780632c1f5216146106145780632e6ed7ef1461063b57806330bb4cff1461064e578063313ce5671461065657600080fd5b806310d5de53116104b657806310d5de531461059457806318160ddd146105b75780631a8145bb146105bf5780631b3d6e87146105c85780632307b441146105db57806323b872dd146105ee57600080fd5b806306fdde03146104f35780630758d92414610511578063095ea7b3146105505780630cfe2f3f146105735780631031e36e1461058a575b600080fd5b6104fb610b5d565b60405161050891906142f6565b60405180910390f35b6105387f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610508565b61056361055e366004614360565b610bef565b6040519015158152602001610508565b61057c601c5481565b604051908152602001610508565b610592610c05565b005b6105636105a236600461438c565b60276020526000908152604090205460ff1681565b60025461057c565b61057c60235481565b600b54610538906001600160a01b031681565b6105926105e9366004614486565b610cfc565b6105636105fc366004614548565b610e55565b61059261060f366004614589565b610eff565b6105387f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa81565b6105926106493660046145a2565b61100c565b61057c6110f5565b60405160128152602001610508565b61059261067336600461438c565b61117e565b600e54610538906001600160a01b031681565b610563610699366004614360565b611227565b600d54610538906001600160a01b031681565b6105387f000000000000000000000000e1fdfb916fca2fd79a2fe6af3f708e3f624dfcaa81565b610592611263565b6105926106ee36600461438c565b61132e565b6015546105639060ff1681565b6105926113c8565b61057c601e5481565b61059261145c565b61059261072736600461438c565b61155c565b6011544310610563565b61057c601a5481565b61059261074d36600461438c565b6115f6565b61057c611641565b61057c60075481565b61057c61077136600461438c565b6116a1565b61057c601d5481565b61057c60145481565b6015546105639062010000900460ff1681565b61057c6107a936600461438c565b611737565b610592611752565b61057c6117c6565b610592611826565b6105926107d43660046145e2565b611891565b6105926107e7366004614589565b61197c565b6105636107fa36600461461b565b611ac3565b61057c60065481565b6005546001600160a01b0316610538565b6105387f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b6104fb611cfd565b610850611d0c565b604051610508919061468d565b61059261086b3660046145e2565b611d6d565b61057c601b5481565b600f54610538906001600160a01b031681565b61057c60245481565b61057c60255481565b61057c60205481565b61057c611f33565b6105636108bd366004614360565b611f93565b61057c60115481565b61057c6108d936600461438c565b61202c565b6105636108ec366004614360565b61207f565b61057c60085481565b6105926109083660046146a0565b61208c565b61092061091b36600461438c565b61212d565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610508565b61056361097336600461438c565b60286020526000908152604090205460ff1681565b60155461056390610100900460ff1681565b6105926109a83660046145e2565b6121f1565b6105926109bb36600461438c565b61227a565b6105926109ce366004614589565b6122f2565b6017546105639060ff1681565b6105926109ee36600461438c565b6123fb565b610592610a01366004614589565b612495565b61057c60185481565b610592610a1d366004614589565b6125e1565b61057c610a3036600461461b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61057c60215481565b61057c600a5481565b61057c6126e8565b610592610a833660046145a2565b612748565b61059261282e565b610592610a9e366004614589565b612864565b600c54610538906001600160a01b031681565b610538610ac4366004614589565b6128db565b61057c60105481565b610563610ae036600461438c565b60126020526000908152604090205460ff1681565b61057c60195481565b610920610b0c366004614589565b612905565b610592610b1f36600461438c565b61295f565b61057c601f5481565b61057c60225481565b6105387f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b606060038054610b6c90614726565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9890614726565b8015610be55780601f10610bba57610100808354040283529160200191610be5565b820191906000526020600020905b815481529060010190602001808311610bc857829003601f168201915b5050505050905090565b6000610bfc338484612a4a565b50600192915050565b6005546001600160a01b03163314610c385760405162461bcd60e51b8152600401610c2f90614760565b60405180910390fd5b600060115411610c985760405162461bcd60e51b815260206004820152602560248201527f43616e6e6f7420706175736520756e74696c20746f6b656e20686173206c61756044820152641b98da195960da1b6064820152608401610c2f565b601554610100900460ff16610cef5760405162461bcd60e51b815260206004820152601960248201527f54726164696e6720697320616c726561647920706175736564000000000000006044820152606401610c2f565b6015805461ff0019169055565b6005546001600160a01b03163314610d265760405162461bcd60e51b8152600401610c2f90614760565b8051825114610d775760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610c2f565b610258825110610de85760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203630302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610c2f565b60005b8251811015610e50576000838281518110610e0857610e08614795565b602002602001015190506000838381518110610e2657610e26614795565b60200260200101519050610e3b338383612b6e565b50508080610e48906147c1565b915050610deb565b505050565b6000610e62848484612cc3565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610ee75760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610c2f565b610ef48533858403612a4a565b506001949350505050565b6005546001600160a01b03163314610f295760405162461bcd60e51b8152600401610c2f90614760565b670de0b6b3a76400006103e8610f3e60025490565b610f499060026147da565b610f5391906147f9565b610f5d91906147f9565b811015610fbe5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e322560b81b6064820152608401610c2f565b610fd081670de0b6b3a76400006147da565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b6005546001600160a01b031633146110365760405162461bcd60e51b8152600401610c2f90614760565b601a8490556019839055601b829055601c81905581611055848661481b565b61105f919061481b565b6018819055601910156110b45760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323525206f72206c6573730000006044820152606401610c2f565b7f03cd3090e7c409e4a7ffd2d90ff610979f4a94a87a512188b7b615671bfb772f6018546040516110e791815260200190565b60405180910390a150505050565b60007f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa6001600160a01b03166385a6b3ae6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111799190614833565b905090565b6005546001600160a01b031633146111a85760405162461bcd60e51b8152600401610c2f90614760565b60405163031e79db60e41b81526001600160a01b0382811660048301527f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa16906331e79db0906024015b600060405180830381600087803b15801561120c57600080fd5b505af1158015611220573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610bfc91859061125e90869061481b565b612a4a565b6000601154116112c55760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f7420756e706175736520756e74696c20746f6b656e20686173206c604482015266185d5b98da195960ca1b6064820152608401610c2f565b601554610100900460ff161561131d5760405162461bcd60e51b815260206004820152601b60248201527f54726164696e6720697320616c726561647920756e70617573656400000000006044820152606401610c2f565b6015805461ff001916610100179055565b6005546001600160a01b031633146113585760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b03811661137e5760405162461bcd60e51b8152600401610c2f9061484c565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f4efa56652237561d0f1fd31311aeaaa41f3b754a461545ed3cf6ced5876d298290600090a250565b60405163bc4c4b3760e01b8152336004820152600060248201527f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa6001600160a01b03169063bc4c4b37906044016020604051808303816000875af1158015611435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114599190614879565b50565b6005546001600160a01b031633146114865760405162461bcd60e51b8152600401610c2f90614760565b600a5461149230611737565b1015611508576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610c2f565b6009805460ff1916600117905561151d613939565b6009805460ff191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b6005546001600160a01b031633146115865760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b0381166115ac5760405162461bcd60e51b8152600401610c2f9061484c565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517f217742673c85d2f459a37c99960c860122cdadf529374b41418d2718cae7726f90600090a250565b6005546001600160a01b031633146116205760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b03166000908152601260205260409020805460ff19169055565b60007f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa6001600160a01b03166309bbedde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611155573d6000803e3d6000fd5b60405163156dbbf560e31b81526001600160a01b0382811660048301526000917f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa9091169063ab6ddfa8906024015b602060405180830381865afa15801561170d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117319190614833565b92915050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461177c5760405162461bcd60e51b8152600401610c2f90614760565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60007f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa6001600160a01b031663ad7a672f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611155573d6000803e3d6000fd5b6005546001600160a01b031633146118505760405162461bcd60e51b8152600401610c2f90614760565b6015805460ff199081169091556017805490911690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146118bb5760405162461bcd60e51b8152600401610c2f90614760565b80611951577f000000000000000000000000e1fdfb916fca2fd79a2fe6af3f708e3f624dfcaa6001600160a01b0316826001600160a01b0316036119515760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610c2f565b6001600160a01b03919091166000908152602760205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146119a65760405162461bcd60e51b8152600401610c2f90614760565b601554610100900460ff1615611a125760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610c2f565b600a8110611a725760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f74206d616b652070656e616c747920626c6f636b73206d6f72652060448201526607468616e2031360cc1b6064820152608401610c2f565b6015805462ffff00191662010100179055436010819055611a9490829061481b565b6011556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a150565b6005546000906001600160a01b03163314611af05760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b038316611b465760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610c2f565b6001600160a01b03831630141580611b665750601554610100900460ff16155b611bcf5760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610c2f565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3a9190614833565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611c8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb19190614879565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b606060048054610b6c90614726565b60606013805480602002602001604051908101604052809291908181526020018280548015610be557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d46575050505050905090565b6005546001600160a01b03163314611d975760405162461bcd60e51b8152600401610c2f90614760565b7f000000000000000000000000e1fdfb916fca2fd79a2fe6af3f708e3f624dfcaa6001600160a01b0316826001600160a01b0316141580611dd55750805b611e475760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610c2f565b6001600160a01b0382166000908152602860205260409020805460ff1916821515179055611e758282613f6d565b8015611ef75760405163031e79db60e41b81526001600160a01b0383811660048301527f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa16906331e79db090602401600060405180830381600087803b158015611ede57600080fd5b505af1158015611ef2573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60007f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa6001600160a01b0316636f2789ec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611155573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156120155760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c2f565b6120223385858403612a4a565b5060019392505050565b6040516302a2e74960e61b81526001600160a01b0382811660048301526000917f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa9091169063a8b9d240906024016116f0565b6000610bfc338484612cc3565b6005546001600160a01b031633146120b65760405162461bcd60e51b8152600401610c2f90614760565b60005b828110156121275781601260008686858181106120d8576120d8614795565b90506020020160208101906120ed919061438c565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061211f816147c1565b9150506120b9565b50505050565b6000806000806000806000807f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa6001600160a01b031663fbcbc0f18a6040518263ffffffff1660e01b815260040161219491906001600160a01b0391909116815260200190565b61010060405180830381865afa1580156121b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d69190614896565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b0316331461221b5760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b038216600081815260266020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146122a45760405162461bcd60e51b8152600401610c2f90614760565b60405163c0f306ef60e01b81526001600160a01b0382811660048301527f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa169063c0f306ef906024016111f2565b6005546001600160a01b0316331461231c5760405162461bcd60e51b8152600401610c2f90614760565b670de0b6b3a76400006103e861233160025490565b61233c9060036147da565b61234691906147f9565b61235091906147f9565b8110156123b45760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610c2f565b6123c681670de0b6b3a76400006147da565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001611001565b6005546001600160a01b031633146124255760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b03811661244b5760405162461bcd60e51b8152600401610c2f9061484c565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f804ec39c1aea0b9f2615a34c3fa437b6ddda2c72e6848abf0f23955589a7ad5490600090a250565b6005546001600160a01b031633146124bf5760405162461bcd60e51b8152600401610c2f90614760565b620f42406124cc60025490565b6124d79060016147da565b6124e191906147f9565b81101561254f5760405162461bcd60e51b815260206004820152603660248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e6044820152751018171818181892903a37ba30b61039bab838363c9760511b6064820152608401610c2f565b6103e861255b60025490565b6125669060016147da565b61257091906147f9565b8111156125dc5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610c2f565b600a55565b6005546001600160a01b0316331461260b5760405162461bcd60e51b8152600401610c2f90614760565b670de0b6b3a76400006103e861262060025490565b61262b9060026147da565b61263591906147f9565b61263f91906147f9565b8110156126a15760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e322560b01b6064820152608401610c2f565b6126b381670de0b6b3a76400006147da565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001611001565b60007f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa6001600160a01b031663e7841ec06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611155573d6000803e3d6000fd5b6005546001600160a01b031633146127725760405162461bcd60e51b8152600401610c2f90614760565b601e849055601f839055602082905560218190558082612792858761481b565b61279c919061481b565b6127a6919061481b565b601d819055601910156127fb5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323525206f72206c6573730000006044820152606401610c2f565b7f274faecd49018fb411281f27986b6b4acc86e5db4100735531acd18b7b6d5f93601d546040516110e791815260200190565b6005546001600160a01b031633146128585760405162461bcd60e51b8152600401610c2f90614760565b6017805460ff19169055565b6005546001600160a01b0316331461288e5760405162461bcd60e51b8152600401610c2f90614760565b60405163e98030c760e01b8152600481018290527f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa6001600160a01b03169063e98030c7906024016111f2565b601381815481106128eb57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000806000806000806000807f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa6001600160a01b0316635183d6fd8a6040518263ffffffff1660e01b815260040161219491815260200190565b6005546001600160a01b031633146129895760405162461bcd60e51b8152600401610c2f90614760565b6001600160a01b0381166129ee5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c2f565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316612aac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c2f565b6001600160a01b038216612b0d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c2f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316612b945760405162461bcd60e51b8152600401610c2f90614900565b6001600160a01b038216612bba5760405162461bcd60e51b8152600401610c2f90614945565b6001600160a01b03831660009081526020819052604090205481811015612c325760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c2f565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612c6990849061481b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612cb591815260200190565b60405180910390a350505050565b6001600160a01b038316612ce95760405162461bcd60e51b8152600401610c2f90614900565b6001600160a01b038216612d0f5760405162461bcd60e51b8152600401610c2f90614945565b80600003612d2357610e5083836000612b6e565b601554610100900460ff16612db6576001600160a01b03831660009081526026602052604090205460ff1680612d7157506001600160a01b03821660009081526026602052604090205460ff165b612db65760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610c2f565b6011544310158015612dcf5750601554610100900460ff165b15612e9f576001600160a01b03831660009081526012602052604090205460ff161580612e0957506005546001600160a01b038381169116145b80612e1e57506001600160a01b03821661dead145b612e9f5760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610c2f565b60155460ff16156132e7576005546001600160a01b03848116911614801590612ed657506005546001600160a01b03838116911614155b8015612eea57506001600160a01b03821615155b8015612f0157506001600160a01b03821661dead14155b8015612f2657506001600160a01b03831660009081526026602052604090205460ff16155b8015612f4b57506001600160a01b03821660009081526026602052604090205460ff16155b156132e75760175460ff16156130b0577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614158015612fcf57507f000000000000000000000000e1fdfb916fca2fd79a2fe6af3f708e3f624dfcaa6001600160a01b0316826001600160a01b031614155b156130b057326000908152601660205260409020544390612ff190600161481b565b10801561302157506001600160a01b038216600090815260166020526040902054439061301f90600161481b565b105b61308b5760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610c2f565b3260009081526016602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526028602052604090205460ff1680156130f157506001600160a01b03821660009081526027602052604090205460ff16155b156131bd576006548111156131595760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610c2f565b60085461316583611737565b61316f908361481b565b11156131b85760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c2f565b6132e7565b6001600160a01b03821660009081526028602052604090205460ff1680156131fe57506001600160a01b03831660009081526027602052604090205460ff16155b15613268576007548111156131b85760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610c2f565b6001600160a01b03821660009081526027602052604090205460ff166132e75760085461329483611737565b61329e908361481b565b11156132e75760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c2f565b60006132f230611737565b600a5490915081108015908190613311575060155462010000900460ff165b8015613320575060095460ff16155b801561334457506001600160a01b03841660009081526028602052604090205460ff165b15613369576009805460ff1916600117905561335e613939565b6009805460ff191690555b6001600160a01b03851660009081526026602052604090205460019060ff16806133ab57506001600160a01b03851660009081526026602052604090205460ff165b156133b4575060005b600081156137f757601154431080156133e557506001600160a01b03871660009081526028602052604090205460ff165b801561340a57506001600160a01b03861660009081526028602052604090205460ff16155b801561341857506000601854115b156135e0576001600160a01b03861660009081526012602052604090205460ff166134fd576001600160a01b0386166000908152601260205260408120805460ff19166001908117909155601480549192909161347690849061481b565b9091555050601380546001810182556000919091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319166001600160a01b0388169081179091556040519081527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b60646018548661350d91906147da565b61351791906147f9565b9050601854601a548261352a91906147da565b61353491906147f9565b60226000828254613545919061481b565b909155505060185460195461355a90836147da565b61356491906147f9565b60236000828254613575919061481b565b9091555050601854601b5461358a90836147da565b61359491906147f9565b602460008282546135a5919061481b565b9091555050601854601c546135ba90836147da565b6135c491906147f9565b602560008282546135d5919061481b565b909155506137d99050565b6001600160a01b03861660009081526028602052604090205460ff16801561360a57506000601d54115b156136cc576064601d548661361f91906147da565b61362991906147f9565b9050601d54601f548261363c91906147da565b61364691906147f9565b60236000828254613657919061481b565b9091555050601d54601e5461366c90836147da565b61367691906147f9565b60226000828254613687919061481b565b9091555050601d5460205461369c90836147da565b6136a691906147f9565b602460008282546136b7919061481b565b9091555050601d546021546135ba90836147da565b6001600160a01b03871660009081526028602052604090205460ff1680156136f657506000601854115b156137d95760646018548661370b91906147da565b61371591906147f9565b9050601854601a548261372891906147da565b61373291906147f9565b60226000828254613743919061481b565b909155505060185460195461375890836147da565b61376291906147f9565b60236000828254613773919061481b565b9091555050601854601b5461378890836147da565b61379291906147f9565b602460008282546137a3919061481b565b9091555050601854601c546137b890836147da565b6137c291906147f9565b602560008282546137d3919061481b565b90915550505b80156137ea576137ea873083612b6e565b6137f48186614988565b94505b613802878787612b6e565b7f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa6001600160a01b031663e30443bc8861383b8a611737565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561388157600080fd5b505af1158015613895573d6000803e3d6000fd5b505050507f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa6001600160a01b031663e30443bc876138d289611737565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561391857600080fd5b505af115801561392c573d6000803e3d6000fd5b5050505050505050505050565b600061394430611737565b9050600060255460245460225460235461395e919061481b565b613968919061481b565b613972919061481b565b905081158061397f575080155b15613988575050565b600a8054613995916147da565b8211156139ac57600a80546139a9916147da565b91505b6000600282602354856139bf91906147da565b6139c991906147f9565b6139d391906147f9565b90506139e76139e28285614988565b613fd0565b600b546040516304fa881160e21b81526001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881166004830152909116906313ea204490602401600060405180830381600087803b158015613a4e57600080fd5b505af1158015613a62573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b031691506370a0823190602401602060405180830381865afa158015613acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613af19190614833565b9050600081905060006002602354613b0991906147f9565b613b139086614988565b602254613b2090856147da565b613b2a91906147f9565b905060006002602354613b3d91906147f9565b613b479087614988565b602454613b5490866147da565b613b5e91906147f9565b905060006002602354613b7191906147f9565b613b7b9088614988565b602554613b8890876147da565b613b9291906147f9565b905080613b9f838561481b565b613ba9919061481b565b613bb39085614988565b600060238190556022819055602481905560255593508515801590613bd85750600084115b15613be757613be78685614136565b8115613c8757600d5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489091169063a9059cbb906044016020604051808303816000875af1158015613c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c859190614879565b505b8015613dca5760405163a9059cbb60e01b81526001600160a01b037f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa81166004830152602482018390526000917f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489091169063a9059cbb906044016020604051808303816000875af1158015613d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d459190614879565b90508015613dc85760405163b0c7ce3760e01b8152600481018390527f00000000000000000000000097755c549d3835cb0d65cbbeec32f82f27cb34aa6001600160a01b03169063b0c7ce3790602401600060405180830381600087803b158015613daf57600080fd5b505af1158015613dc3573d6000803e3d6000fd5b505050505b505b6040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a0823190602401602060405180830381865afa158015613e31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e559190614833565b1115613f6357600c546040516370a0823160e01b81523060048201526001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015613ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ef29190614833565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015613f3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f619190614879565b505b5050505050505050565b6001600160a01b038216600081815260276020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061400557614005614795565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160018151811061405957614059614795565b60200260200101906001600160a01b031690816001600160a01b0316815250506140a4307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612a4a565b600b54604051635c11d79560e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d811692635c11d7959261410092879260009288929190911690429060040161499f565b600060405180830381600087803b15801561411a57600080fd5b505af115801561412e573d6000803e3d6000fd5b505050505050565b614161307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612a4a565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81166004830152602482018390527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48169063095ea7b3906044016020604051808303816000875af11580156141f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142149190614879565b50600e5460405162e8e33760e81b81523060048201526001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881166024830152604482018590526064820184905260006084830181905260a483015291821660c48201524260e48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063e8e3370090610104016060604051808303816000875af11580156142d2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122091906149db565b600060208083528351808285015260005b8181101561432357858101830151858201604001528201614307565b81811115614335576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461145957600080fd5b6000806040838503121561437357600080fd5b823561437e8161434b565b946020939093013593505050565b60006020828403121561439e57600080fd5b81356143a98161434b565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156143ef576143ef6143b0565b604052919050565b600067ffffffffffffffff821115614411576144116143b0565b5060051b60200190565b600082601f83011261442c57600080fd5b8135602061444161443c836143f7565b6143c6565b82815260059290921b8401810191818101908684111561446057600080fd5b8286015b8481101561447b5780358352918301918301614464565b509695505050505050565b6000806040838503121561449957600080fd5b823567ffffffffffffffff808211156144b157600080fd5b818501915085601f8301126144c557600080fd5b813560206144d561443c836143f7565b82815260059290921b840181019181810190898411156144f457600080fd5b948201945b8386101561451b57853561450c8161434b565b825294820194908201906144f9565b9650508601359250508082111561453157600080fd5b5061453e8582860161441b565b9150509250929050565b60008060006060848603121561455d57600080fd5b83356145688161434b565b925060208401356145788161434b565b929592945050506040919091013590565b60006020828403121561459b57600080fd5b5035919050565b600080600080608085870312156145b857600080fd5b5050823594602084013594506040840135936060013592509050565b801515811461145957600080fd5b600080604083850312156145f557600080fd5b82356146008161434b565b91506020830135614610816145d4565b809150509250929050565b6000806040838503121561462e57600080fd5b82356146398161434b565b915060208301356146108161434b565b600081518084526020808501945080840160005b838110156146825781516001600160a01b03168752958201959082019060010161465d565b509495945050505050565b6020815260006143a96020830184614649565b6000806000604084860312156146b557600080fd5b833567ffffffffffffffff808211156146cd57600080fd5b818601915086601f8301126146e157600080fd5b8135818111156146f057600080fd5b8760208260051b850101111561470557600080fd5b6020928301955093505084013561471b816145d4565b809150509250925092565b600181811c9082168061473a57607f821691505b60208210810361475a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016147d3576147d36147ab565b5060010190565b60008160001904831182151516156147f4576147f46147ab565b500290565b60008261481657634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561482e5761482e6147ab565b500190565b60006020828403121561484557600080fd5b5051919050565b6020808252601390820152720616464726573732063616e6e6f74206265203606c1b604082015260600190565b60006020828403121561488b57600080fd5b81516143a9816145d4565b600080600080600080600080610100898b0312156148b357600080fd5b88516148be8161434b565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60008282101561499a5761499a6147ab565b500390565b85815284602082015260a0604082015260006149be60a0830186614649565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156149f057600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220e459e75fb090c67b0eca7cce1a70b2a1820d4a848c7980ae6a10a974d80ed8cc64736f6c634300080f0033

Deployed Bytecode Sourcemap

32944:24873:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1821:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33189:37;;;;;;;;-1:-1:-1;;;;;798:32:1;;;780:51;;768:2;753:18;33189:37:0;616:221:1;2735:169:0;;;;;;:::i;:::-;;:::i;:::-;;;1463:14:1;;1456:22;1438:41;;1426:2;1411:18;2735:169:0;1298:187:1;34309:27:0;;;;;;;;;1636:25:1;;;1624:2;1609:18;34309:27:0;1490:177:1;40055:228:0;;;:::i;:::-;;34744:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2142:108;2230:12;;2142:108;;34567:33;;;;;;33387:32;;;;;-1:-1:-1;;;;;33387:32:0;;;43312:520;;;;;;:::i;:::-;;:::i;2912:458::-;;;;;;:::i;:::-;;:::i;41820:269::-;;;;;;:::i;:::-;;:::i;33095:48::-;;;;;44557:472;;;;;;:::i;:::-;;:::i;45983:141::-;;;:::i;2041:93::-;;;2124:2;6058:36:1;;6046:2;6031:18;2041:93:0;5916:184:1;40609:130:0;;;;;;:::i;:::-;;:::i;33499:31::-;;;;;-1:-1:-1;;;;;33499:31:0;;;3378:215;;;;;;:::i;:::-;;:::i;33467:25::-;;;;;-1:-1:-1;;;;;33467:25:0;;;33233:31;;;;;40291:225;;;:::i;56656:278::-;;;;;;:::i;:::-;;:::i;33822:33::-;;;;;;;;;47082:97;;;:::i;34380:32::-;;;;;;57502:312;;;:::i;57179:271::-;;;;;;:::i;:::-;;:::i;52770:120::-;52864:18;;52849:12;:33;52770:120;;34240:31;;;;;;41535:114;;;;;;:::i;:::-;;:::i;47321:141::-;;;:::i;33021:28::-;;;;;;46284:134;;;;;;:::i;:::-;;:::i;34345:28::-;;;;;;33788:25;;;;;;33902:31;;;;;;;;;;;;2258:127;;;;;;:::i;:::-;;:::i;5800:150::-;;;:::i;47474:119::-;;;:::i;41262:154::-;;;:::i;43844:260::-;;;;;;:::i;:::-;;:::i;39601:446::-;;;;;;:::i;:::-;;:::i;56150:498::-;;;;;;:::i;:::-;;:::i;32987:27::-;;;;;;5586:79;5651:6;;-1:-1:-1;;;;;5651:6:0;5586:79;;33273:34;;;;;1929:104;;;:::i;41424:103::-;;;:::i;:::-;;;;;;;:::i;44112:437::-;;;;;;:::i;:::-;;:::i;34278:24::-;;;;;;33537:33;;;;;-1:-1:-1;;;;;33537:33:0;;;34607:27;;;;;;34641:30;;;;;;34457:25;;;;;;45867:108;;;:::i;3601:413::-;;;;;;:::i;:::-;;:::i;33656:33::-;;;;;;46132:147;;;;;;:::i;:::-;;:::i;2393:175::-;;;;;;:::i;:::-;;:::i;33056:30::-;;;;;;40978:228;;;;;;:::i;:::-;;:::i;46426:318::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9282:32:1;;;9264:51;;9346:2;9331:18;;9324:34;;;;9374:18;;;9367:34;;;;9432:2;9417:18;;9410:34;;;;9475:3;9460:19;;9453:35;9302:3;9504:19;;9497:35;9563:3;9548:19;;9541:35;9607:3;9592:19;;9585:35;9251:3;9236:19;46426:318:0;8925:701:1;34817:58:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33862:33;;;;;;;;;;;;45545:182;;;;;;:::i;:::-;;:::i;40844:126::-;;;;;;:::i;:::-;;:::i;42383:284::-;;;;;;:::i;:::-;;:::i;34121:39::-;;;;;;;;;56942:229;;;;;;:::i;:::-;;:::i;42737:348::-;;;;;;:::i;:::-;;:::i;34169:27::-;;;;;;42101:274;;;;;;:::i;:::-;;:::i;2576:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;2692:18:0;;;2665:7;2692:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2576:151;34489:28;;;;;;33345:33;;;;;;47187:126;;;:::i;45037:500::-;;;;;;:::i;:::-;;:::i;41710:98::-;;;:::i;45735:124::-;;;;;;:::i;:::-;;:::i;33428:32::-;;;;;-1:-1:-1;;;;;33428:32:0;;;33753:28;;;;;;:::i;:::-;;:::i;33579:37::-;;;;;;33696:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;;34203:30;;;;;;46749:325;;;;;;:::i;:::-;;:::i;5958:244::-;;;;;;:::i;:::-;;:::i;34419:31::-;;;;;;34526:34;;;;;;33150:30;;;;;1821:100;1875:13;1908:5;1901:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1821:100;:::o;2735:169::-;2818:4;2835:39;306:10;2858:7;2867:6;2835:8;:39::i;:::-;-1:-1:-1;2892:4:0;2735:169;;;;:::o;40055:228::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;;;;;;;;;40138:1:::1;40117:18;;:22;40109:72;;;::::0;-1:-1:-1;;;40109:72:0;;10579:2:1;40109:72:0::1;::::0;::::1;10561:21:1::0;10618:2;10598:18;;;10591:30;10657:34;10637:18;;;10630:62;-1:-1:-1;;;10708:18:1;;;10701:35;10753:19;;40109:72:0::1;10377:401:1::0;40109:72:0::1;40200:13;::::0;::::1;::::0;::::1;;;40192:51;;;::::0;-1:-1:-1;;;40192:51:0;;10985:2:1;40192:51:0::1;::::0;::::1;10967:21:1::0;11024:2;11004:18;;;10997:30;11063:27;11043:18;;;11036:55;11108:18;;40192:51:0::1;10783:349:1::0;40192:51:0::1;40254:13;:21:::0;;-1:-1:-1;;40254:21:0::1;::::0;;40055:228::o;43312:520::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;43454:15:::1;:22;43436:7;:14;:40;43428:83;;;::::0;-1:-1:-1;;;43428:83:0;;11339:2:1;43428:83:0::1;::::0;::::1;11321:21:1::0;11378:2;11358:18;;;11351:30;11417:32;11397:18;;;11390:60;11467:18;;43428:83:0::1;11137:354:1::0;43428:83:0::1;43547:3;43530:7;:14;:20;43522:87;;;::::0;-1:-1:-1;;;43522:87:0;;11698:2:1;43522:87:0::1;::::0;::::1;11680:21:1::0;11737:2;11717:18;;;11710:30;11776:34;11756:18;;;11749:62;-1:-1:-1;;;11827:18:1;;;11820:52;11889:19;;43522:87:0::1;11496:418:1::0;43522:87:0::1;43624:9;43620:205;43643:7;:14;43639:1;:18;43620:205;;;43678:14;43695:7;43703:1;43695:10;;;;;;;;:::i;:::-;;;;;;;43678:27;;43720:14;43737:15;43753:1;43737:18;;;;;;;;:::i;:::-;;;;;;;43720:35;;43770:43;43786:10;43798:6;43806;43770:15;:43::i;:::-;43663:162;;43659:3;;;;;:::i;:::-;;;;43620:205;;;;43312:520:::0;;:::o;2912:458::-;3018:4;3035:36;3045:6;3053:9;3064:6;3035:9;:36::i;:::-;-1:-1:-1;;;;;3111:19:0;;3084:24;3111:19;;;:11;:19;;;;;;;;306:10;3111:33;;;;;;;;3163:26;;;;3155:79;;;;-1:-1:-1;;;3155:79:0;;12525:2:1;3155:79:0;;;12507:21:1;12564:2;12544:18;;;12537:30;12603:34;12583:18;;;12576:62;-1:-1:-1;;;12654:18:1;;;12647:38;12702:19;;3155:79:0;12323:404:1;3155:79:0;3270:57;3279:6;306:10;3320:6;3301:16;:25;3270:8;:57::i;:::-;-1:-1:-1;3358:4:0;;2912:458;-1:-1:-1;;;;2912:458:0:o;41820:269::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;41939:4:::1;41933;41913:13;2230:12:::0;;;2142:108;41913:13:::1;:17;::::0;41929:1:::1;41913:17;:::i;:::-;:24;;;;:::i;:::-;41912:31;;;;:::i;:::-;41902:6;:41;;41894:95;;;::::0;-1:-1:-1;;;41894:95:0;;13329:2:1;41894:95:0::1;::::0;::::1;13311:21:1::0;13368:2;13348:18;;;13341:30;13407:34;13387:18;;;13380:62;-1:-1:-1;;;13458:18:1;;;13451:39;13507:19;;41894:95:0::1;13127:405:1::0;41894:95:0::1;42015:17;:6:::0;42025::::1;42015:17;:::i;:::-;42000:12;:32:::0;;;42048:33:::1;::::0;1636:25:1;;;42048:33:0::1;::::0;1624:2:1;1609:18;42048:33:0::1;;;;;;;;41820:269:::0;:::o;44557:472::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;44694:16:::1;:33:::0;;;44738:15:::1;:31:::0;;;44780:9:::1;:19:::0;;;44810:12:::1;:25:::0;;;44792:7;44861:34:::1;44756:13:::0;44713:14;44861:34:::1;:::i;:::-;:46;;;;:::i;:::-;44846:12;:61:::0;;;44942:2:::1;-1:-1:-1::0;44926:18:0::1;44918:60;;;::::0;-1:-1:-1;;;44918:60:0;;13872:2:1;44918:60:0::1;::::0;::::1;13854:21:1::0;13911:2;13891:18;;;13884:30;13950:31;13930:18;;;13923:59;13999:18;;44918:60:0::1;13670:353:1::0;44918:60:0::1;44994:27;45008:12;;44994:27;;;;1636:25:1::0;;1624:2;1609:18;;1490:177;44994:27:0::1;;;;;;;;44557:472:::0;;;;:::o;45983:141::-;46046:7;46073:15;-1:-1:-1;;;;;46073:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46066:50;;45983:141;:::o;40609:130::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;40686:45:::1;::::0;-1:-1:-1;;;40686:45:0;;-1:-1:-1;;;;;798:32:1;;;40686:45:0::1;::::0;::::1;780:51:1::0;40686:15:0::1;:36;::::0;::::1;::::0;753:18:1;;40686:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40609:130:::0;:::o;3378:215::-;306:10;3466:4;3515:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;3515:34:0;;;;;;;;;;3466:4;;3483:80;;3506:7;;3515:47;;3552:10;;3515:47;:::i;:::-;3483:8;:80::i;40291:225::-;40367:1;40346:18;;:22;40338:74;;;;-1:-1:-1;;;40338:74:0;;14419:2:1;40338:74:0;;;14401:21:1;14458:2;14438:18;;;14431:30;14497:34;14477:18;;;14470:62;-1:-1:-1;;;14548:18:1;;;14541:37;14595:19;;40338:74:0;14217:403:1;40338:74:0;40432:13;;;;;;;40431:14;40423:54;;;;-1:-1:-1;;;40423:54:0;;14827:2:1;40423:54:0;;;14809:21:1;14866:2;14846:18;;;14839:30;14905:29;14885:18;;;14878:57;14952:18;;40423:54:0;14625:351:1;40423:54:0;40488:13;:20;;-1:-1:-1;;40488:20:0;;;;;40291:225::o;56656:278::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56752:32:0;::::1;56744:64;;;;-1:-1:-1::0;;;56744:64:0::1;;;;;;;:::i;:::-;56819:17;:47:::0;;-1:-1:-1;;;;;;56819:47:0::1;-1:-1:-1::0;;;;;56819:47:0;::::1;::::0;;::::1;::::0;;;56882:44:::1;::::0;::::1;::::0;-1:-1:-1;;56882:44:0::1;56656:278:::0;:::o;47082:97::-;47113:58;;-1:-1:-1;;;47113:58:0;;47152:10;47113:58;;;15513:51:1;47165:5:0;15580:18:1;;;15573:50;47113:15:0;-1:-1:-1;;;;;47113:30:0;;;;15486:18:1;;47113:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47082:97::o;57502:312::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;57593:18:::1;;57565:24;57583:4;57565:9;:24::i;:::-;:46;;57557:123;;;::::0;;-1:-1:-1;;;57557:123:0;;16086:2:1;57557:123:0::1;::::0;::::1;16068:21:1::0;16105:18;;;16098:30;;;;16164:34;16144:18;;;16137:62;16235:34;16215:18;;;16208:62;16287:19;;57557:123:0::1;15884:428:1::0;57557:123:0::1;57691:8;:15:::0;;-1:-1:-1;;57691:15:0::1;57702:4;57691:15;::::0;;57717:10:::1;:8;:10::i;:::-;57738:8;:16:::0;;-1:-1:-1;;57738:16:0::1;::::0;;57770:36:::1;::::0;57790:15:::1;1636:25:1::0;;57770:36:0::1;::::0;1624:2:1;1609:18;57770:36:0::1;;;;;;;57502:312::o:0;57179:271::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57273:31:0;::::1;57265:63;;;;-1:-1:-1::0;;;57265:63:0::1;;;;;;;:::i;:::-;57339:16;:45:::0;;-1:-1:-1;;;;;;57339:45:0::1;-1:-1:-1::0;;;;;57339:45:0;::::1;::::0;;::::1;::::0;;;57400:42:::1;::::0;::::1;::::0;-1:-1:-1;;57400:42:0::1;57179:271:::0;:::o;41535:114::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41608:25:0::1;41636:5;41608:25:::0;;;:17:::1;:25;::::0;;;;:33;;-1:-1:-1;;41608:33:0::1;::::0;;41535:114::o;47321:141::-;47386:7;47413:15;-1:-1:-1;;;;;47413:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46284:134;46375:38;;-1:-1:-1;;;46375:38:0;;-1:-1:-1;;;;;798:32:1;;;46375:38:0;;;780:51:1;46354:7:0;;46375:15;:29;;;;;;753:18:1;;46375:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46368:45;46284:134;-1:-1:-1;;46284:134:0:o;2258:127::-;-1:-1:-1;;;;;2359:18:0;2332:7;2359:18;;;;;;;;;;;;2258:127::o;5800:150::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;5893:6:::1;::::0;5872:40:::1;::::0;5909:1:::1;::::0;-1:-1:-1;;;;;5893:6:0::1;::::0;5872:40:::1;::::0;5909:1;;5872:40:::1;5923:6;:19:::0;;-1:-1:-1;;;;;;5923:19:0::1;::::0;;5800:150::o;47474:119::-;47528:7;47555:15;-1:-1:-1;;;;;47555:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41262:154;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;41316:14:::1;:22:::0;;-1:-1:-1;;41316:22:0;;::::1;::::0;;;41349:20:::1;:28:::0;;;;::::1;::::0;;41393:15:::1;::::0;::::1;::::0;41333:5:::1;::::0;41393:15:::1;41262:154::o:0;43844:260::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;43940:4:::1;43936:104;;43978:6;-1:-1:-1::0;;;;;43968:16:0::1;:6;-1:-1:-1::0;;;;;43968:16:0::1;::::0;43960:68:::1;;;::::0;-1:-1:-1;;;43960:68:0;;16519:2:1;43960:68:0::1;::::0;::::1;16501:21:1::0;16558:2;16538:18;;;16531:30;16597:34;16577:18;;;16570:62;-1:-1:-1;;;16648:18:1;;;16641:37;16695:19;;43960:68:0::1;16317:403:1::0;43960:68:0::1;-1:-1:-1::0;;;;;44050:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;44050:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;43844:260::o;39601:446::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;39689:13:::1;::::0;::::1;::::0;::::1;;;39688:14;39680:70;;;::::0;-1:-1:-1;;;39680:70:0;;16927:2:1;39680:70:0::1;::::0;::::1;16909:21:1::0;16966:2;16946:18;;;16939:30;17005:34;16985:18;;;16978:62;-1:-1:-1;;;17056:18:1;;;17049:41;17107:19;;39680:70:0::1;16725:407:1::0;39680:70:0::1;39788:2;39769:16;:21;39761:73;;;::::0;-1:-1:-1;;;39761:73:0;;17339:2:1;39761:73:0::1;::::0;::::1;17321:21:1::0;17378:2;17358:18;;;17351:30;17417:34;17397:18;;;17390:62;-1:-1:-1;;;17468:18:1;;;17461:37;17515:19;;39761:73:0::1;17137:403:1::0;39761:73:0::1;39845:13;:20:::0;;-1:-1:-1;;39876:18:0;;;;;39926:12:::1;39905:18;:33:::0;;;39970:37:::1;::::0;39991:16;;39970:37:::1;:::i;:::-;39949:18;:58:::0;40023:16:::1;::::0;::::1;::::0;;;::::1;39601:446:::0;:::o;56150:498::-;5713:6;;56237:10;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56268:20:0;::::1;56260:59;;;::::0;-1:-1:-1;;;56260:59:0;;17747:2:1;56260:59:0::1;::::0;::::1;17729:21:1::0;17786:2;17766:18;;;17759:30;17825:28;17805:18;;;17798:56;17871:18;;56260:59:0::1;17545:350:1::0;56260:59:0::1;-1:-1:-1::0;;;;;56338:23:0;::::1;56356:4;56338:23;;::::0;:41:::1;;-1:-1:-1::0;56366:13:0::1;::::0;::::1;::::0;::::1;;;56365:14;56338:41;56330:106;;;::::0;-1:-1:-1;;;56330:106:0;;18102:2:1;56330:106:0::1;::::0;::::1;18084:21:1::0;18141:2;18121:18;;;18114:30;18180:34;18160:18;;;18153:62;-1:-1:-1;;;18231:18:1;;;18224:50;18291:19;;56330:106:0::1;17900:416:1::0;56330:106:0::1;56474:39;::::0;-1:-1:-1;;;56474:39:0;;56507:4:::1;56474:39;::::0;::::1;780:51:1::0;56447:24:0::1;::::0;-1:-1:-1;;;;;56474:24:0;::::1;::::0;::::1;::::0;753:18:1;;56474:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56532:46;::::0;-1:-1:-1;;;56532:46:0;;-1:-1:-1;;;;;18513:32:1;;;56532:46:0::1;::::0;::::1;18495:51:1::0;18562:18;;;18555:34;;;56447:66:0;;-1:-1:-1;56532:23:0;;::::1;::::0;::::1;::::0;18468:18:1;;56532:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56594;::::0;;-1:-1:-1;;;;;18513:32:1;;18495:51;;18577:2;18562:18;;18555:34;;;56524:54:0;;-1:-1:-1;56594:46:0::1;::::0;18468:18:1;56594:46:0::1;;;;;;;56249:399;56150:498:::0;;;;:::o;1929:104::-;1985:13;2018:7;2011:14;;;;;:::i;41424:103::-;41473:16;41508:11;41501:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41501:18:0;;;;;;;;;;;;;;;;;;;;;;41424:103;:::o;44112:437::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;44219:6:::1;-1:-1:-1::0;;;;;44211:14:0::1;:4;-1:-1:-1::0;;;;;44211:14:0::1;;;:23;;;;44229:5;44211:23;44203:93;;;::::0;-1:-1:-1;;;44203:93:0;;18802:2:1;44203:93:0::1;::::0;::::1;18784:21:1::0;18841:2;18821:18;;;18814:30;18880:34;18860:18;;;18853:62;18951:27;18931:18;;;18924:55;18996:19;;44203:93:0::1;18600:421:1::0;44203:93:0::1;-1:-1:-1::0;;;;;44307:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;:39;;-1:-1:-1;;44307:39:0::1;::::0;::::1;;;::::0;;44357::::1;44307:31:::0;:39;44357:26:::1;:39::i;:::-;44410:5;44407:79;;;44432:42;::::0;-1:-1:-1;;;44432:42:0;;-1:-1:-1;;;;;798:32:1;;;44432:42:0::1;::::0;::::1;780:51:1::0;44432:15:0::1;:36;::::0;::::1;::::0;753:18:1;;44432:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44407:79;44501:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;44501:40:0;::::1;::::0;::::1;::::0;;;::::1;44112:437:::0;;:::o;45867:108::-;45913:7;45940:15;-1:-1:-1;;;;;45940:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3601:413;306:10;3694:4;3738:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;3738:34:0;;;;;;;;;;3791:35;;;;3783:85;;;;-1:-1:-1;;;3783:85:0;;19228:2:1;3783:85:0;;;19210:21:1;19267:2;19247:18;;;19240:30;19306:34;19286:18;;;19279:62;-1:-1:-1;;;19357:18:1;;;19350:35;19402:19;;3783:85:0;19026:401:1;3783:85:0;3904:67;306:10;3927:7;3955:15;3936:16;:34;3904:8;:67::i;:::-;-1:-1:-1;4002:4:0;;3601:413;-1:-1:-1;;;3601:413:0:o;46132:147::-;46225:47;;-1:-1:-1;;;46225:47:0;;-1:-1:-1;;;;;798:32:1;;;46225:47:0;;;780:51:1;46201:7:0;;46225:15;:38;;;;;;753:18:1;;46225:47:0;616:221:1;2393:175:0;2479:4;2496:42;306:10;2520:9;2531:6;2496:9;:42::i;40978:228::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;41091:9:::1;41087:112;41106:18:::0;;::::1;41087:112;;;41177:10;41145:17;:29;41163:7;;41171:1;41163:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41145:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41145:29:0;:42;;-1:-1:-1;;41145:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41126:3;::::1;::::0;::::1;:::i;:::-;;;;41087:112;;;;40978:228:::0;;;:::o;46426:318::-;46522:7;46544:6;46565;46586:7;46608;46630;46652;46674;46701:15;-1:-1:-1;;;;;46701:26:0;;46728:7;46701:35;;;;;;;;;;;;;;-1:-1:-1;;;;;798:32:1;;;;780:51;;768:2;753:18;;616:221;46701:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46694:42;;;;;;;;;;;;;;;;46426:318;;;;;;;;;:::o;45545:182::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45630:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;45630:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;45685:34;;1438:41:1;;;45685:34:0::1;::::0;1411:18:1;45685:34:0::1;;;;;;;45545:182:::0;;:::o;40844:126::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;40919:43:::1;::::0;-1:-1:-1;;;40919:43:0;;-1:-1:-1;;;;;798:32:1;;;40919:43:0::1;::::0;::::1;780:51:1::0;40919:15:0::1;:34;::::0;::::1;::::0;753:18:1;;40919:43:0::1;616:221:1::0;42383:284:0;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;42505:4:::1;42499;42479:13;2230:12:::0;;;2142:108;42479:13:::1;:17;::::0;42495:1:::1;42479:17;:::i;:::-;:24;;;;:::i;:::-;42478:31;;;;:::i;:::-;42468:6;:41;;42460:98;;;::::0;-1:-1:-1;;;42460:98:0;;20320:2:1;42460:98:0::1;::::0;::::1;20302:21:1::0;20359:2;20339:18;;;20332:30;20398:34;20378:18;;;20371:62;-1:-1:-1;;;20449:18:1;;;20442:42;20501:19;;42460:98:0::1;20118:408:1::0;42460:98:0::1;42587:17;:6:::0;42597::::1;42587:17;:::i;:::-;42569:15;:35:::0;;;42620:39:::1;::::0;1636:25:1;;;42620:39:0::1;::::0;1624:2:1;1609:18;42620:39:0::1;1490:177:1::0;56942:229:0;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57024:25:0;::::1;57016:57;;;;-1:-1:-1::0;;;57016:57:0::1;;;;;;;:::i;:::-;57084:10;:33:::0;;-1:-1:-1;;;;;;57084:33:0::1;-1:-1:-1::0;;;;;57084:33:0;::::1;::::0;;::::1;::::0;;;57133:30:::1;::::0;::::1;::::0;-1:-1:-1;;57133:30:0::1;56942:229:::0;:::o;42737:348::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;42860:7:::1;42840:13;2230:12:::0;;;2142:108;42840:13:::1;:17;::::0;42856:1:::1;42840:17;:::i;:::-;:27;;;;:::i;:::-;42827:9;:40;;42819:107;;;::::0;-1:-1:-1;;;42819:107:0;;20733:2:1;42819:107:0::1;::::0;::::1;20715:21:1::0;20772:2;20752:18;;;20745:30;20811:34;20791:18;;;20784:62;-1:-1:-1;;;20862:18:1;;;20855:52;20924:19;;42819:107:0::1;20531:418:1::0;42819:107:0::1;42977:4;42957:13;2230:12:::0;;;2142:108;42957:13:::1;:17;::::0;42973:1:::1;42957:17;:::i;:::-;:24;;;;:::i;:::-;42944:9;:37;;42936:102;;;::::0;-1:-1:-1;;;42936:102:0;;21156:2:1;42936:102:0::1;::::0;::::1;21138:21:1::0;21195:2;21175:18;;;21168:30;21234:34;21214:18;;;21207:62;-1:-1:-1;;;21285:18:1;;;21278:50;21345:19;;42936:102:0::1;20954:416:1::0;42936:102:0::1;43048:18;:30:::0;42737:348::o;42101:274::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;42221:4:::1;42215;42195:13;2230:12:::0;;;2142:108;42195:13:::1;:17;::::0;42211:1:::1;42195:17;:::i;:::-;:24;;;;:::i;:::-;42194:31;;;;:::i;:::-;42184:6;:41;;42176:96;;;::::0;-1:-1:-1;;;42176:96:0;;21577:2:1;42176:96:0::1;::::0;::::1;21559:21:1::0;21616:2;21596:18;;;21589:30;21655:34;21635:18;;;21628:62;-1:-1:-1;;;21706:18:1;;;21699:40;21756:19;;42176:96:0::1;21375:406:1::0;42176:96:0::1;42299:17;:6:::0;42309::::1;42299:17;:::i;:::-;42283:13;:33:::0;;;42332:35:::1;::::0;1636:25:1;;;42332:35:0::1;::::0;1624:2:1;1609:18;42332:35:0::1;1490:177:1::0;47187:126:0;47242:7;47266:15;-1:-1:-1;;;;;47266:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45037:500;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;45175:17:::1;:34:::0;;;45220:16:::1;:32:::0;;;45263:10:::1;:20:::0;;;45294:13:::1;:26:::0;;;45310:10;45276:7;45347:36:::1;45239:13:::0;45195:14;45347:36:::1;:::i;:::-;:49;;;;:::i;:::-;:65;;;;:::i;:::-;45331:13;:81:::0;;;45448:2:::1;-1:-1:-1::0;45431:19:0::1;45423:61;;;::::0;-1:-1:-1;;;45423:61:0;;13872:2:1;45423:61:0::1;::::0;::::1;13854:21:1::0;13911:2;13891:18;;;13884:30;13950:31;13930:18;;;13923:59;13999:18;;45423:61:0::1;13670:353:1::0;45423:61:0::1;45500:29;45515:13;;45500:29;;;;1636:25:1::0;;1624:2;1609:18;;1490:177;41710:98:0;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;41772:20:::1;:28:::0;;-1:-1:-1;;41772:28:0::1;::::0;;41710:98::o;45735:124::-;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;45809:42:::1;::::0;-1:-1:-1;;;45809:42:0;;::::1;::::0;::::1;1636:25:1::0;;;45809:15:0::1;-1:-1:-1::0;;;;;45809:31:0::1;::::0;::::1;::::0;1609:18:1;;45809:42:0::1;1490:177:1::0;33753:28:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33753:28:0;;-1:-1:-1;33753:28:0;:::o;46749:325::-;46850:7;46872:6;46893;46914:7;46936;46958;46980;47002;47026:15;-1:-1:-1;;;;;47026:33:0;;47060:5;47026:40;;;;;;;;;;;;;1636:25:1;;1624:2;1609:18;;1490:177;5958:244:0;5713:6;;-1:-1:-1;;;;;5713:6:0;306:10;5713:22;5705:67;;;;-1:-1:-1;;;5705:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6047:22:0;::::1;6039:73;;;::::0;-1:-1:-1;;;6039:73:0;;21988:2:1;6039:73:0::1;::::0;::::1;21970:21:1::0;22027:2;22007:18;;;22000:30;22066:34;22046:18;;;22039:62;-1:-1:-1;;;22117:18:1;;;22110:36;22163:19;;6039:73:0::1;21786:402:1::0;6039:73:0::1;6149:6;::::0;6128:38:::1;::::0;-1:-1:-1;;;;;6128:38:0;;::::1;::::0;6149:6:::1;::::0;6128:38:::1;::::0;6149:6:::1;::::0;6128:38:::1;6177:6;:17:::0;;-1:-1:-1;;;;;;6177:17:0::1;-1:-1:-1::0;;;;;6177:17:0;;;::::1;::::0;;;::::1;::::0;;5958:244::o;4909:346::-;-1:-1:-1;;;;;5011:19:0;;5003:68;;;;-1:-1:-1;;;5003:68:0;;22395:2:1;5003:68:0;;;22377:21:1;22434:2;22414:18;;;22407:30;22473:34;22453:18;;;22446:62;-1:-1:-1;;;22524:18:1;;;22517:34;22568:19;;5003:68:0;22193:400:1;5003:68:0;-1:-1:-1;;;;;5090:21:0;;5082:68;;;;-1:-1:-1;;;5082:68:0;;22800:2:1;5082:68:0;;;22782:21:1;22839:2;22819:18;;;22812:30;22878:34;22858:18;;;22851:62;-1:-1:-1;;;22929:18:1;;;22922:32;22971:19;;5082:68:0;22598:398:1;5082:68:0;-1:-1:-1;;;;;5163:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;5215:32;;1636:25:1;;;5215:32:0;;1609:18:1;5215:32:0;;;;;;;4909:346;;;:::o;4022:580::-;-1:-1:-1;;;;;4128:20:0;;4120:70;;;;-1:-1:-1;;;4120:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4209:23:0;;4201:71;;;;-1:-1:-1;;;4201:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4309:17:0;;4285:21;4309:17;;;;;;;;;;;4345:23;;;;4337:74;;;;-1:-1:-1;;;4337:74:0;;24013:2:1;4337:74:0;;;23995:21:1;24052:2;24032:18;;;24025:30;24091:34;24071:18;;;24064:62;-1:-1:-1;;;24142:18:1;;;24135:36;24188:19;;4337:74:0;23811:402:1;4337:74:0;-1:-1:-1;;;;;4447:17:0;;;:9;:17;;;;;;;;;;;4467:22;;;4447:42;;4511:20;;;;;;;;:30;;4483:6;;4447:9;4511:30;;4483:6;;4511:30;:::i;:::-;;;;;;;;4576:9;-1:-1:-1;;;;;4559:35:0;4568:6;-1:-1:-1;;;;;4559:35:0;;4587:6;4559:35;;;;1636:25:1;;1624:2;1609:18;;1490:177;4559:35:0;;;;;;;;4109:493;4022:580;;;:::o;47605:5157::-;-1:-1:-1;;;;;47705:18:0;;47697:68;;;;-1:-1:-1;;;47697:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47784:16:0;;47776:64;;;;-1:-1:-1;;;47776:64:0;;;;;;;:::i;:::-;47854:6;47864:1;47854:11;47851:91;;47881:28;47897:4;47903:2;47907:1;47881:15;:28::i;47851:91::-;47966:13;;;;;;;47962:132;;-1:-1:-1;;;;;48003:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;48032:23:0;;;;;;:19;:23;;;;;;;;48003:52;47995:87;;;;-1:-1:-1;;;47995:87:0;;24420:2:1;47995:87:0;;;24402:21:1;24459:2;24439:18;;;24432:30;-1:-1:-1;;;24478:18:1;;;24471:52;24540:18;;47995:87:0;24218:346:1;47995:87:0;52864:18;;52849:12;:33;48109:26;:43;;;;-1:-1:-1;48139:13:0;;;;;;;48109:43;48106:223;;;-1:-1:-1;;;;;48177:23:0;;;;;;:17;:23;;;;;;;;48176:24;;:41;;-1:-1:-1;5651:6:0;;-1:-1:-1;;;;;48204:13:0;;;5651:6;;48204:13;48176:41;:66;;;-1:-1:-1;;;;;;48221:21:0;;48235:6;48221:21;48176:66;48168:149;;;;-1:-1:-1;;;48168:149:0;;24771:2:1;48168:149:0;;;24753:21:1;24810:2;24790:18;;;24783:30;24849:34;24829:18;;;24822:62;24920:34;24900:18;;;24893:62;-1:-1:-1;;;24971:19:1;;;24964:37;25018:19;;48168:149:0;24569:474:1;48168:149:0;48352:14;;;;48349:1658;;;5651:6;;-1:-1:-1;;;;;48386:15:0;;;5651:6;;48386:15;;;;:32;;-1:-1:-1;5651:6:0;;-1:-1:-1;;;;;48405:13:0;;;5651:6;;48405:13;;48386:32;:52;;;;-1:-1:-1;;;;;;48422:16:0;;;;48386:52;:77;;;;-1:-1:-1;;;;;;48442:21:0;;48456:6;48442:21;;48386:77;:107;;;;-1:-1:-1;;;;;;48468:25:0;;;;;;:19;:25;;;;;;;;48467:26;48386:107;:135;;;;-1:-1:-1;;;;;;48498:23:0;;;;;;:19;:23;;;;;;;;48497:24;48386:135;48382:1614;;;48697:20;;;;48693:490;;;48759:9;-1:-1:-1;;;;;48745:24:0;:2;-1:-1:-1;;;;;48745:24:0;;;:49;;;;;48787:6;-1:-1:-1;;;;;48773:21:0;:2;-1:-1:-1;;;;;48773:21:0;;;48745:49;48741:423;;;48855:9;48830:35;;;;:24;:35;;;;;;48872:12;;48830:39;;48868:1;48830:39;:::i;:::-;:54;:105;;;;-1:-1:-1;;;;;;48888:28:0;;;;;;:24;:28;;;;;;48923:12;;48888:32;;48919:1;48888:32;:::i;:::-;:47;48830:105;48822:171;;;;-1:-1:-1;;;48822:171:0;;25250:2:1;48822:171:0;;;25232:21:1;25289:2;25269:18;;;25262:30;25328:34;25308:18;;;25301:62;-1:-1:-1;;;25379:18:1;;;25372:51;25440:19;;48822:171:0;25048:417:1;48822:171:0;49045:9;49020:35;;;;:24;:35;;;;;;49058:12;49020:50;;;;-1:-1:-1;;;;;49097:28:0;;;;;;:43;48741:423;-1:-1:-1;;;;;49252:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;49288:35:0;;;;;;:31;:35;;;;;;;;49287:36;49252:71;49248:733;;;49366:12;;49356:6;:22;;49348:75;;;;-1:-1:-1;;;49348:75:0;;25672:2:1;49348:75:0;;;25654:21:1;25711:2;25691:18;;;25684:30;25750:34;25730:18;;;25723:62;-1:-1:-1;;;25801:18:1;;;25794:38;25849:19;;49348:75:0;25470:404:1;49348:75:0;49480:15;;49463:13;49473:2;49463:9;:13::i;:::-;49454:22;;:6;:22;:::i;:::-;:41;;49446:78;;;;-1:-1:-1;;;49446:78:0;;26081:2:1;49446:78:0;;;26063:21:1;26120:2;26100:18;;;26093:30;-1:-1:-1;;;26139:18:1;;;26132:54;26203:18;;49446:78:0;25879:348:1;49446:78:0;49248:733;;;-1:-1:-1;;;;;49601:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;49635:37:0;;;;;;:31;:37;;;;;;;;49634:38;49601:71;49597:384;;;49715:13;;49705:6;:23;;49697:78;;;;-1:-1:-1;;;49697:78:0;;26434:2:1;49697:78:0;;;26416:21:1;26473:2;26453:18;;;26446:30;26512:34;26492:18;;;26485:62;-1:-1:-1;;;26563:18:1;;;26556:40;26613:19;;49697:78:0;26232:406:1;49597:384:0;-1:-1:-1;;;;;49824:35:0;;;;;;:31;:35;;;;;;;;49819:162;;49917:15;;49900:13;49910:2;49900:9;:13::i;:::-;49891:22;;:6;:22;:::i;:::-;:41;;49883:78;;;;-1:-1:-1;;;49883:78:0;;26081:2:1;49883:78:0;;;26063:21:1;26120:2;26100:18;;;26093:30;-1:-1:-1;;;26139:18:1;;;26132:54;26203:18;;49883:78:0;25879:348:1;49883:78:0;50019:28;50050:24;50068:4;50050:9;:24::i;:::-;50134:18;;50019:55;;-1:-1:-1;50110:42:0;;;;;;;50168:22;;-1:-1:-1;50179:11:0;;;;;;;50168:22;:35;;;;-1:-1:-1;50195:8:0;;;;50194:9;50168:35;:68;;;;-1:-1:-1;;;;;;50207:29:0;;;;;;:25;:29;;;;;;;;50168:68;50165:171;;;50253:8;:15;;-1:-1:-1;;50253:15:0;50264:4;50253:15;;;50283:10;:8;:10::i;:::-;50308:8;:16;;-1:-1:-1;;50308:16:0;;;50165:171;-1:-1:-1;;;;;50466:25:0;;50348:12;50466:25;;;:19;:25;;;;;;50363:4;;50466:25;;;:52;;-1:-1:-1;;;;;;50495:23:0;;;;;;:19;:23;;;;;;;;50466:52;50463:99;;;-1:-1:-1;50545:5:0;50463:99;50582:12;50686:7;50683:1890;;;52864:18;;52849:12;:33;50749:60;;;;-1:-1:-1;;;;;;50778:31:0;;;;;;:25;:31;;;;;;;;50749:60;:94;;;;-1:-1:-1;;;;;;50814:29:0;;;;;;:25;:29;;;;;;;;50813:30;50749:94;:114;;;;;50862:1;50847:12;;:16;50749:114;50746:1658;;;-1:-1:-1;;;;;50889:21:0;;;;;;:17;:21;;;;;;;;50885:226;;-1:-1:-1;;;;;50934:21:0;;;;;;:17;:21;;;;;:28;;-1:-1:-1;;50934:28:0;50958:4;50934:28;;;;;;50985:10;:15;;50958:4;;50985:10;;:15;;50958:4;;50985:15;:::i;:::-;;;;-1:-1:-1;;51023:11:0;:20;;;;;;;-1:-1:-1;51023:20:0;;;;;;;;-1:-1:-1;;;;;;51023:20:0;-1:-1:-1;;;;;51023:20:0;;;;;;;;51071;;780:51:1;;;51071:20:0;;768:2:1;753:18;51071:20:0;;;;;;;50885:226;51162:3;51147:12;;51138:6;:21;;;;:::i;:::-;:27;;;;:::i;:::-;51131:34;;51233:12;;51214:16;;51207:4;:23;;;;:::i;:::-;:38;;;;:::i;:::-;51184:19;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;51308:12:0;;51290:15;;51283:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;51261:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;51374:12:0;;51362:9;;51355:16;;:4;:16;:::i;:::-;:31;;;;:::i;:::-;51339:12;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;51446:12:0;;51431;;51424:19;;:4;:19;:::i;:::-;:34;;;;:::i;:::-;51405:15;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;50746:1658:0;;-1:-1:-1;50746:1658:0;;-1:-1:-1;;;;;51523:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;51572:1;51556:13;;:17;51523:50;51519:885;;;51625:3;51609:13;;51600:6;:22;;;;:::i;:::-;:28;;;;:::i;:::-;51593:35;;51695:13;;51676:16;;51669:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;51647:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;51777:13:0;;51757:17;;51750:24;;:4;:24;:::i;:::-;:40;;;;:::i;:::-;51727:19;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;51845:13:0;;51832:10;;51825:17;;:4;:17;:::i;:::-;:33;;;;:::i;:::-;51809:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;51919:13:0;;51903;;51896:20;;:4;:20;:::i;51519:885::-;-1:-1:-1;;;;;51995:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;52045:1;52030:12;;:16;51995:51;51992:412;;;52095:3;52080:12;;52071:6;:21;;;;:::i;:::-;:27;;;;:::i;:::-;52064:34;;52163:12;;52144:16;;52137:4;:23;;;;:::i;:::-;:38;;;;:::i;:::-;52114:19;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;52238:12:0;;52220:15;;52213:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;52191:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;52304:12:0;;52292:9;;52285:16;;:4;:16;:::i;:::-;:31;;;;:::i;:::-;52269:12;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;52376:12:0;;52361;;52354:19;;:4;:19;:::i;:::-;:34;;;;:::i;:::-;52335:15;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;;51992:412:0;52435:8;;52432:93;;52467:42;52483:4;52497;52504;52467:15;:42::i;:::-;52547:14;52557:4;52547:14;;:::i;:::-;;;50683:1890;52585:33;52601:4;52607:2;52611:6;52585:15;:33::i;:::-;52631:15;-1:-1:-1;;;;;52631:26:0;;52666:4;52673:15;52683:4;52673:9;:15::i;:::-;52631:58;;-1:-1:-1;;;;;;52631:58:0;;;;;;;-1:-1:-1;;;;;18513:32:1;;;52631:58:0;;;18495:51:1;18562:18;;;18555:34;18468:18;;52631:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52700:15;-1:-1:-1;;;;;52700:26:0;;52735:2;52740:13;52750:2;52740:9;:13::i;:::-;52700:54;;-1:-1:-1;;;;;;52700:54:0;;;;;;;-1:-1:-1;;;;;18513:32:1;;;52700:54:0;;;18495:51:1;18562:18;;;18555:34;18468:18;;52700:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47684:5078;;;;47605:5157;;;:::o;53978:2164::-;54019:23;54045:24;54063:4;54045:9;:24::i;:::-;54019:50;;54080:25;54166:15;;54151:12;;54129:19;;54108:18;;:40;;;;:::i;:::-;:55;;;;:::i;:::-;:73;;;;:::i;:::-;54080:101;-1:-1:-1;54205:20:0;;;:46;;-1:-1:-1;54229:22:0;;54205:46;54202:60;;;54254:7;;53978:2164::o;54202:60::-;54295:18;;;:23;;;:::i;:::-;54277:15;:41;54274:113;;;54352:18;;;:23;;;:::i;:::-;54334:41;;54274:113;54456:23;54541:1;54521:17;54500:18;;54482:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;54456:86;-1:-1:-1;54563:58:0;54587:33;54456:86;54587:15;:33;:::i;:::-;54563:23;:58::i;:::-;54634:12;;:50;;-1:-1:-1;;;54634:50:0;;-1:-1:-1;;;;;54672:10:0;798:32:1;;54634:50:0;;;780:51:1;54634:12:0;;;;:29;;753:18:1;;54634:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54733:35:0;;-1:-1:-1;;;54733:35:0;;54762:4;54733:35;;;780:51:1;54705:25:0;;-1:-1:-1;54733:10:0;-1:-1:-1;;;;;54733:20:0;;-1:-1:-1;54733:20:0;;753:18:1;;54733:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54705:63;;54779:30;54812:17;54779:50;;54842:31;54959:1;54940:18;;:20;;;;:::i;:::-;54919:42;;:17;:42;:::i;:::-;54896:19;;54876:39;;:17;:39;:::i;:::-;:86;;;;:::i;:::-;54842:120;;54973:24;55076:1;55057:18;;:20;;;;:::i;:::-;55036:42;;:17;:42;:::i;:::-;55020:12;;55000:32;;:17;:32;:::i;:::-;:79;;;;:::i;:::-;54973:106;;55090:27;55199:1;55180:18;;:20;;;;:::i;:::-;55159:42;;:17;:42;:::i;:::-;55140:15;;55120:35;;:17;:35;:::i;:::-;:82;;;;:::i;:::-;55090:112;-1:-1:-1;55090:112:0;55241:42;55267:16;55241:23;:42;:::i;:::-;:64;;;;:::i;:::-;55215:90;;;;:::i;:::-;55351:1;55330:18;:22;;;55363:19;:23;;;55397:12;:16;;;55424:15;:19;55215:90;-1:-1:-1;55467:19:0;;;;;:49;;;55515:1;55490:22;:26;55467:49;55464:133;;;55532:53;55545:15;55562:22;55532:12;:53::i;:::-;55612:20;;55609:100;;55668:10;;55648:49;;-1:-1:-1;;;55648:49:0;;-1:-1:-1;;;;;55668:10:0;;;55648:49;;;18495:51:1;18562:18;;;18555:34;;;55648:10:0;:19;;;;;;18468:18:1;;55648:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55609:100;55724:22;;55721:257;;55777:66;;-1:-1:-1;;;55777:66:0;;-1:-1:-1;;;;;55805:15:0;18513:32:1;;55777:66:0;;;18495:51:1;18562:18;;;18555:34;;;-1:-1:-1;;55777:10:0;:19;;;;;;18468:18:1;;55777:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55762:81;;55862:7;55858:109;;;55890:61;;-1:-1:-1;;;55890:61:0;;;;;1636:25:1;;;55890:15:0;-1:-1:-1;;;;;55890:40:0;;;;1609:18:1;;55890:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55858:109;55747:231;55721:257;55993:35;;-1:-1:-1;;;55993:35:0;;56022:4;55993:35;;;780:51:1;56031:1:0;;55993:10;-1:-1:-1;;;;;55993:20:0;;;;753:18:1;;55993:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;55990:145;;;56068:17;;56087:35;;-1:-1:-1;;;56087:35:0;;56116:4;56087:35;;;780:51:1;-1:-1:-1;;;;;56048:10:0;:19;;;;;56068:17;;;56048:19;;56087:20;;753:18:1;;56087:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56048:75;;-1:-1:-1;;;;;;56048:75:0;;;;;;;-1:-1:-1;;;;;18513:32:1;;;56048:75:0;;;18495:51:1;18562:18;;;18555:34;18468:18;;56048:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55990:145;54006:2136;;;;;;;;53978:2164::o;43097:207::-;-1:-1:-1;;;;;43185:39:0;;;;;;:31;:39;;;;;;;;;:52;;-1:-1:-1;;43185:52:0;;;;;;;;;;43253:43;;15513:51:1;;;15580:18;;;15573:50;43253:43:0;;15486:18:1;43253:43:0;;;;;;;43097:207;;:::o;52898:594::-;53057:16;;;53071:1;53057:16;;;;;;;;53033:21;;53057:16;;;;;;;;;;-1:-1:-1;53057:16:0;53033:40;;53102:4;53084;53089:1;53084:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;53084:23:0;;;-1:-1:-1;;;;;53084:23:0;;;;;53136:10;53118:4;53123:1;53118:7;;;;;;;;:::i;:::-;;;;;;:29;-1:-1:-1;;;;;53118:29:0;;;-1:-1:-1;;;;;53118:29:0;;;;;53160:56;53177:4;53192:9;53204:11;53160:8;:56::i;:::-;53430:12;;53255:229;;-1:-1:-1;;;53255:229:0;;-1:-1:-1;;;;;53255:9:0;:63;;;;;:229;;53333:11;;53359:1;;53403:4;;53430:12;;;;;53458:15;;53255:229;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52960:532;52898:594;:::o;53500:470::-;53655:56;53672:4;53687:9;53699:11;53655:8;:56::i;:::-;53722;;-1:-1:-1;;;53722:56:0;;-1:-1:-1;;;;;53749:9:0;18513:32:1;;53722:56:0;;;18495:51:1;18562:18;;;18555:34;;;53722:10:0;:18;;;;18468::1;;53722:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;53927:16:0;;53821:141;;-1:-1:-1;;;53821:141:0;;53852:4;53821:141;;;28341:34:1;-1:-1:-1;;;;;53867:10:0;28411:15:1;;28391:18;;;28384:43;28443:18;;;28436:34;;;28486:18;;;28479:34;;;-1:-1:-1;28529:19:1;;;28522:35;;;28573:19;;;28566:35;53927:16:0;;;28617:19:1;;;28610:44;53946:15:0;28670:19:1;;;28663:35;53821:9:0;:22;;;;;;28275:19:1;;53821:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;842:131::-;-1:-1:-1;;;;;917:31:1;;907:42;;897:70;;963:1;960;953:12;978:315;1046:6;1054;1107:2;1095:9;1086:7;1082:23;1078:32;1075:52;;;1123:1;1120;1113:12;1075:52;1162:9;1149:23;1181:31;1206:5;1181:31;:::i;:::-;1231:5;1283:2;1268:18;;;;1255:32;;-1:-1:-1;;;978:315:1:o;1672:247::-;1731:6;1784:2;1772:9;1763:7;1759:23;1755:32;1752:52;;;1800:1;1797;1790:12;1752:52;1839:9;1826:23;1858:31;1883:5;1858:31;:::i;:::-;1908:5;1672:247;-1:-1:-1;;;1672:247:1:o;2153:127::-;2214:10;2209:3;2205:20;2202:1;2195:31;2245:4;2242:1;2235:15;2269:4;2266:1;2259:15;2285:275;2356:2;2350:9;2421:2;2402:13;;-1:-1:-1;;2398:27:1;2386:40;;2456:18;2441:34;;2477:22;;;2438:62;2435:88;;;2503:18;;:::i;:::-;2539:2;2532:22;2285:275;;-1:-1:-1;2285:275:1:o;2565:183::-;2625:4;2658:18;2650:6;2647:30;2644:56;;;2680:18;;:::i;:::-;-1:-1:-1;2725:1:1;2721:14;2737:4;2717:25;;2565:183::o;2753:662::-;2807:5;2860:3;2853:4;2845:6;2841:17;2837:27;2827:55;;2878:1;2875;2868:12;2827:55;2914:6;2901:20;2940:4;2964:60;2980:43;3020:2;2980:43;:::i;:::-;2964:60;:::i;:::-;3058:15;;;3144:1;3140:10;;;;3128:23;;3124:32;;;3089:12;;;;3168:15;;;3165:35;;;3196:1;3193;3186:12;3165:35;3232:2;3224:6;3220:15;3244:142;3260:6;3255:3;3252:15;3244:142;;;3326:17;;3314:30;;3364:12;;;;3277;;3244:142;;;-1:-1:-1;3404:5:1;2753:662;-1:-1:-1;;;;;;2753:662:1:o;3420:1215::-;3538:6;3546;3599:2;3587:9;3578:7;3574:23;3570:32;3567:52;;;3615:1;3612;3605:12;3567:52;3655:9;3642:23;3684:18;3725:2;3717:6;3714:14;3711:34;;;3741:1;3738;3731:12;3711:34;3779:6;3768:9;3764:22;3754:32;;3824:7;3817:4;3813:2;3809:13;3805:27;3795:55;;3846:1;3843;3836:12;3795:55;3882:2;3869:16;3904:4;3928:60;3944:43;3984:2;3944:43;:::i;3928:60::-;4022:15;;;4104:1;4100:10;;;;4092:19;;4088:28;;;4053:12;;;;4128:19;;;4125:39;;;4160:1;4157;4150:12;4125:39;4184:11;;;;4204:217;4220:6;4215:3;4212:15;4204:217;;;4300:3;4287:17;4317:31;4342:5;4317:31;:::i;:::-;4361:18;;4237:12;;;;4399;;;;4204:217;;;4440:5;-1:-1:-1;;4483:18:1;;4470:32;;-1:-1:-1;;4514:16:1;;;4511:36;;;4543:1;4540;4533:12;4511:36;;4566:63;4621:7;4610:8;4599:9;4595:24;4566:63;:::i;:::-;4556:73;;;3420:1215;;;;;:::o;4640:456::-;4717:6;4725;4733;4786:2;4774:9;4765:7;4761:23;4757:32;4754:52;;;4802:1;4799;4792:12;4754:52;4841:9;4828:23;4860:31;4885:5;4860:31;:::i;:::-;4910:5;-1:-1:-1;4967:2:1;4952:18;;4939:32;4980:33;4939:32;4980:33;:::i;:::-;4640:456;;5032:7;;-1:-1:-1;;;5086:2:1;5071:18;;;;5058:32;;4640:456::o;5101:180::-;5160:6;5213:2;5201:9;5192:7;5188:23;5184:32;5181:52;;;5229:1;5226;5219:12;5181:52;-1:-1:-1;5252:23:1;;5101:180;-1:-1:-1;5101:180:1:o;5526:385::-;5612:6;5620;5628;5636;5689:3;5677:9;5668:7;5664:23;5660:33;5657:53;;;5706:1;5703;5696:12;5657:53;-1:-1:-1;;5729:23:1;;;5799:2;5784:18;;5771:32;;-1:-1:-1;5850:2:1;5835:18;;5822:32;;5901:2;5886:18;5873:32;;-1:-1:-1;5526:385:1;-1:-1:-1;5526:385:1:o;6313:118::-;6399:5;6392:13;6385:21;6378:5;6375:32;6365:60;;6421:1;6418;6411:12;6436:382;6501:6;6509;6562:2;6550:9;6541:7;6537:23;6533:32;6530:52;;;6578:1;6575;6568:12;6530:52;6617:9;6604:23;6636:31;6661:5;6636:31;:::i;:::-;6686:5;-1:-1:-1;6743:2:1;6728:18;;6715:32;6756:30;6715:32;6756:30;:::i;:::-;6805:7;6795:17;;;6436:382;;;;;:::o;6823:388::-;6891:6;6899;6952:2;6940:9;6931:7;6927:23;6923:32;6920:52;;;6968:1;6965;6958:12;6920:52;7007:9;6994:23;7026:31;7051:5;7026:31;:::i;:::-;7076:5;-1:-1:-1;7133:2:1;7118:18;;7105:32;7146:33;7105:32;7146:33;:::i;7438:461::-;7491:3;7529:5;7523:12;7556:6;7551:3;7544:19;7582:4;7611:2;7606:3;7602:12;7595:19;;7648:2;7641:5;7637:14;7669:1;7679:195;7693:6;7690:1;7687:13;7679:195;;;7758:13;;-1:-1:-1;;;;;7754:39:1;7742:52;;7814:12;;;;7849:15;;;;7790:1;7708:9;7679:195;;;-1:-1:-1;7890:3:1;;7438:461;-1:-1:-1;;;;;7438:461:1:o;7904:261::-;8083:2;8072:9;8065:21;8046:4;8103:56;8155:2;8144:9;8140:18;8132:6;8103:56;:::i;8170:750::-;8262:6;8270;8278;8331:2;8319:9;8310:7;8306:23;8302:32;8299:52;;;8347:1;8344;8337:12;8299:52;8387:9;8374:23;8416:18;8457:2;8449:6;8446:14;8443:34;;;8473:1;8470;8463:12;8443:34;8511:6;8500:9;8496:22;8486:32;;8556:7;8549:4;8545:2;8541:13;8537:27;8527:55;;8578:1;8575;8568:12;8527:55;8618:2;8605:16;8644:2;8636:6;8633:14;8630:34;;;8660:1;8657;8650:12;8630:34;8715:7;8708:4;8698:6;8695:1;8691:14;8687:2;8683:23;8679:34;8676:47;8673:67;;;8736:1;8733;8726:12;8673:67;8767:4;8759:13;;;;-1:-1:-1;8791:6:1;-1:-1:-1;;8832:20:1;;8819:34;8862:28;8819:34;8862:28;:::i;:::-;8909:5;8899:15;;;8170:750;;;;;:::o;9631:380::-;9710:1;9706:12;;;;9753;;;9774:61;;9828:4;9820:6;9816:17;9806:27;;9774:61;9881:2;9873:6;9870:14;9850:18;9847:38;9844:161;;9927:10;9922:3;9918:20;9915:1;9908:31;9962:4;9959:1;9952:15;9990:4;9987:1;9980:15;9844:161;;9631:380;;;:::o;10016:356::-;10218:2;10200:21;;;10237:18;;;10230:30;10296:34;10291:2;10276:18;;10269:62;10363:2;10348:18;;10016:356::o;11919:127::-;11980:10;11975:3;11971:20;11968:1;11961:31;12011:4;12008:1;12001:15;12035:4;12032:1;12025:15;12051:127;12112:10;12107:3;12103:20;12100:1;12093:31;12143:4;12140:1;12133:15;12167:4;12164:1;12157:15;12183:135;12222:3;12243:17;;;12240:43;;12263:18;;:::i;:::-;-1:-1:-1;12310:1:1;12299:13;;12183:135::o;12732:168::-;12772:7;12838:1;12834;12830:6;12826:14;12823:1;12820:21;12815:1;12808:9;12801:17;12797:45;12794:71;;;12845:18;;:::i;:::-;-1:-1:-1;12885:9:1;;12732:168::o;12905:217::-;12945:1;12971;12961:132;;13015:10;13010:3;13006:20;13003:1;12996:31;13050:4;13047:1;13040:15;13078:4;13075:1;13068:15;12961:132;-1:-1:-1;13107:9:1;;12905:217::o;13537:128::-;13577:3;13608:1;13604:6;13601:1;13598:13;13595:39;;;13614:18;;:::i;:::-;-1:-1:-1;13650:9:1;;13537:128::o;14028:184::-;14098:6;14151:2;14139:9;14130:7;14126:23;14122:32;14119:52;;;14167:1;14164;14157:12;14119:52;-1:-1:-1;14190:16:1;;14028:184;-1:-1:-1;14028:184:1:o;14981:343::-;15183:2;15165:21;;;15222:2;15202:18;;;15195:30;-1:-1:-1;;;15256:2:1;15241:18;;15234:49;15315:2;15300:18;;14981:343::o;15634:245::-;15701:6;15754:2;15742:9;15733:7;15729:23;15725:32;15722:52;;;15770:1;15767;15760:12;15722:52;15802:9;15796:16;15821:28;15843:5;15821:28;:::i;19432:681::-;19563:6;19571;19579;19587;19595;19603;19611;19619;19672:3;19660:9;19651:7;19647:23;19643:33;19640:53;;;19689:1;19686;19679:12;19640:53;19721:9;19715:16;19740:31;19765:5;19740:31;:::i;:::-;19790:5;19780:15;;;19835:2;19824:9;19820:18;19814:25;19804:35;;19879:2;19868:9;19864:18;19858:25;19848:35;;19923:2;19912:9;19908:18;19902:25;19892:35;;19967:3;19956:9;19952:19;19946:26;19936:36;;20012:3;20001:9;19997:19;19991:26;19981:36;;20057:3;20046:9;20042:19;20036:26;20026:36;;20102:3;20091:9;20087:19;20081:26;20071:36;;19432:681;;;;;;;;;;;:::o;23001:401::-;23203:2;23185:21;;;23242:2;23222:18;;;23215:30;23281:34;23276:2;23261:18;;23254:62;-1:-1:-1;;;23347:2:1;23332:18;;23325:35;23392:3;23377:19;;23001:401::o;23407:399::-;23609:2;23591:21;;;23648:2;23628:18;;;23621:30;23687:34;23682:2;23667:18;;23660:62;-1:-1:-1;;;23753:2:1;23738:18;;23731:33;23796:3;23781:19;;23407:399::o;26643:125::-;26683:4;26711:1;26708;26705:8;26702:34;;;26716:18;;:::i;:::-;-1:-1:-1;26753:9:1;;26643:125::o;27357:582::-;27656:6;27645:9;27638:25;27699:6;27694:2;27683:9;27679:18;27672:34;27742:3;27737:2;27726:9;27722:18;27715:31;27619:4;27763:57;27815:3;27804:9;27800:19;27792:6;27763:57;:::i;:::-;-1:-1:-1;;;;;27856:32:1;;;;27851:2;27836:18;;27829:60;-1:-1:-1;27920:3:1;27905:19;27898:35;27755:65;27357:582;-1:-1:-1;;;27357:582:1:o;28709:306::-;28797:6;28805;28813;28866:2;28854:9;28845:7;28841:23;28837:32;28834:52;;;28882:1;28879;28872:12;28834:52;28911:9;28905:16;28895:26;;28961:2;28950:9;28946:18;28940:25;28930:35;;29005:2;28994:9;28990:18;28984:25;28974:35;;28709:306;;;;;:::o

Swarm Source

ipfs://b14c23a97e87a18440d47f15f88809d779057ad1c644353b36e08844fa58f701
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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