ETH Price: $2,988.79 (-2.18%)
Gas: 2 Gwei

Token

WIZARDS (TRADE)
 

Overview

Max Total Supply

100,000,000 TRADE

Holders

101

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
20,910.78399109187022089 TRADE

Value
$0.00
0xd93f7434843ba73960a5b71c6b12b8d4c8260278
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:
ChainFactory_ERC20

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion, MIT license
File 1 of 12 : ChainFactory_ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";
import "./CF_ERC20.sol";
import "./CF_Recoverable.sol";
import "./CF_Whitelist.sol";
import "./CF_MaxTx.sol";
import "./CF_MaxBalance.sol";
import "./CF_Taxable.sol";
import "./CF_DEXRouterV2.sol";

contract ChainFactory_ERC20 is CF_Common, CF_Ownable, CF_ERC20, CF_Recoverable, CF_Whitelist, CF_MaxTx, CF_MaxBalance, CF_Taxable, CF_DEXRouterV2 {
  constructor() {
    _name = unicode"WIZARDS";
    _symbol = unicode"TRADE";
    _decimals = 18;
    _totalSupply = 100000000000000000000000000; // 100,000,000 TRADE
    _transferOwnership(0xD74C50C5FfE75aff4F21e384E4073d8B89a89e43);
    _transferInitialSupply(0xD74C50C5FfE75aff4F21e384E4073d8B89a89e43, 90000); // 90%
    _transferInitialSupply(0x2982d24902aAE3C547BF6200c07d4600083145B2, 5000); // 5%
    _transferInitialSupply(0xb22774aB544b5DDA8B31DA759dAFEEB1D2aBa38A, 2000); // 2%
    _transferInitialSupply(0x599B83a43204b9fC01D7A8fDf6C83336066CeaF9, 1500); // 1.5%
    _transferInitialSupply(0x2A4a860898eB16EA3b0c3cfD9DBe532BecA0b0D9, 1500); // 1.5%
    _setDEXRouterV2(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 0xD74C50C5FfE75aff4F21e384E4073d8B89a89e43);
    _setEarlyPenaltyTime(600); // 10min
    _setTaxToken(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
    _setAutoSwapPercent(50, 300); // 0.05% -> 0.3% of total supply
    _autoSwapEnabled = true;
    _setTaxBeneficiary(0, 0xD74C50C5FfE75aff4F21e384E4073d8B89a89e43, [ uint24(1000), uint24(4950), uint24(4950) ], [ uint24(50000), uint24(50000), uint24(50000) ]);
    _initialWhitelist([ 0xD74C50C5FfE75aff4F21e384E4073d8B89a89e43, 0x2982d24902aAE3C547BF6200c07d4600083145B2, 0xb22774aB544b5DDA8B31DA759dAFEEB1D2aBa38A, 0x599B83a43204b9fC01D7A8fDf6C83336066CeaF9, 0x2A4a860898eB16EA3b0c3cfD9DBe532BecA0b0D9, 0x1158ef1d256835993F5A14c44EA1eCFDA9861E79 ]);
    _setMaxTxPercent(2000); // 2% of total supply
    _domainSeparator = keccak256(abi.encode(keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(_name)), keccak256(bytes("1")), block.chainid, address(this)));
    _initialized = true;
  }

  function _transfer(address from, address to, uint256 amount) internal virtual override {
    if (!_distributing && !_swapping && (from != _dex.pair && from != _dex.router)) {
      _autoSwap(false);
      _autoTaxDistribute();
    }

    if (amount > 0 && !_whitelisted[from] && !_whitelisted[to] && from != address(this) && to != address(this) && to != _dex.router) {
      require((from != _dex.pair && to != _dex.pair) || ((from == _dex.pair || to == _dex.pair) && _tradingEnabled > 0), "Trading disabled");

      unchecked {
        require(_maxTxAmount == 0 || amount <= _maxTxAmount, "Exceeds maxTx");
        require(_maxBalanceAmount == 0 || to == address(this) || (to == _dex.pair || to == _dex.router) || _balance[to] + amount <= _maxBalanceAmount, "Exceeds maxBalance");

        if (!_suspendTaxes && !_distributing && !_swapping) {
          uint256 appliedTax;
          uint8 taxType;

          if (from == _dex.pair || to == _dex.pair) { taxType = from == _dex.pair ? 1 : 2; }

          address _account = taxType == 1 ? to : from;

          if (_tradingEnabled + _earlyPenaltyTime >= _timestamp() && !_holder[_account].penalty) { _holder[_account].penalty = true; }

          for (uint8 i; i < 5; i++) {
            uint256 percent = uint256(taxType > 0 ? (taxType == 1 ? (_holder[_account].penalty ? _taxBeneficiary[i].penalty[1] : _taxBeneficiary[i].percent[1]) : (_holder[_account].penalty ? _taxBeneficiary[i].penalty[2] : _taxBeneficiary[i].percent[2])) : (_holder[_account].penalty ? _taxBeneficiary[i].penalty[0] : _taxBeneficiary[i].percent[0]));

            if (percent == 0) { continue; }

            uint256 taxAmount = _percentage(amount, percent);

            super._transfer(from, address(this), taxAmount);

            if (_taxBeneficiary[i].account == _dex.pair) {
              _amountForLiquidity += taxAmount;
            } else {
              _taxBeneficiary[i].unclaimed += taxAmount;
              _amountForTaxDistribution += taxAmount;
              _totalTaxUnclaimed += taxAmount;
            }

            appliedTax += taxAmount;
          }

          if (appliedTax > 0) {
            _totalTaxCollected += appliedTax;

            amount -= appliedTax;
          }
        }
      }
    }

    super._transfer(from, to, amount);
  }

  function _transferInitialSupply(address account, uint24 percent) private {
    require(!_initialized);

    uint256 amount = _percentage(_totalSupply, uint256(percent));

    _balance[account] = amount;

    emit Transfer(address(0), account, amount);
  }

  /// @notice Returns a list specifying the renounce status of each feature
  function renounced() external view returns (bool Whitelist, bool MaxTx, bool MaxBalance, bool DEXRouterV2, bool Taxable) {
    return (_renounced.Whitelist, _renounced.MaxTx, _renounced.MaxBalance, _renounced.DEXRouterV2, _renounced.Taxable);
  }

  /// @notice Returns basic information about this Smart-Contract
  function info() external view returns (string memory name, string memory symbol, uint8 decimals, address owner, uint256 totalSupply, string memory version) {
    return (_name, _symbol, _decimals, _owner, _totalSupply, _version);
  }

  receive() external payable { }
  fallback() external payable { }
}

/*
   ________          _       ______           __                  
  / ____/ /_  ____ _(_)___  / ____/___ ______/ /_____  _______  __
 / /   / __ / __ `/ / __ / /_  / __ `/ ___/ __/ __ / ___/ / / /
/ /___/ / / / /_/ / / / / / __/ / /_/ / /__/ /_/ /_/ / /  / /_/ / 
\____/_/ /_/\__,_/_/_/ /_/_/    \__,_/\___/\__/\____/_/   \__, /  
                                                         /____/   

  Smart-Contract generated by ChainFactory.app

  By using this Smart-Contract generated by ChainFactory.app, you
  acknowledge and agree that ChainFactory shall not be liable for
  any damages arising from the use of this Smart-Contract,
  including but not limited to any damages resulting from any
  malicious or illegal use of the Smart-Contract by any third
  party or by the owner.

  The owner of the Smart-Contract generated by ChainFactory.app
  agrees not to misuse the Smart-Contract, including but not
  limited to:

  - Using the Smart-Contract to engage in any illegal or
    fraudulent activity, including but not limited to scams,
    theft, or money laundering.

  - Using the Smart-Contract in any manner that could cause harm
    to others, including but not limited to disrupting financial
    markets or causing financial loss to others.

  - Using the Smart-Contract to infringe upon the intellectual
    property rights of others, including but not limited to
    copyright, trademark, or patent infringement.

  The owner of the Smart-Contract generated by ChainFactory.app
  acknowledges that any misuse of the Smart-Contract may result in
  legal action, and agrees to indemnify and hold harmless
  ChainFactory from any and all claims, damages, or expenses
  arising from any such misuse.

*/

File 2 of 12 : CF_Common.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./IDEXV2.sol";
import "./IERC20.sol";

abstract contract CF_Common {
  string internal constant _version = "1.0.1";

  mapping(address => uint256) internal _balance;
  mapping(address => mapping(address => uint256)) internal _allowance;
  mapping(address => bool) internal _whitelisted;
  mapping(address => holderAccount) internal _holder;
  mapping(uint8 => taxBeneficiary) internal _taxBeneficiary;

  address[] internal _holders;

  bool internal _autoSwapEnabled;
  bool internal _swapping;
  bool internal _suspendTaxes;
  bool internal _distributing;
  bool internal immutable _initialized;

  uint8 internal immutable _decimals;
  uint24 internal constant _denominator = 1000;
  uint24 internal _maxTxPercent;
  uint24 internal _maxBalancePercent;
  uint24 internal _totalTxTax;
  uint24 internal _totalBuyTax;
  uint24 internal _totalSellTax;
  uint24 internal _totalPenaltyTxTax;
  uint24 internal _totalPenaltyBuyTax;
  uint24 internal _totalPenaltySellTax;
  uint24 internal _minAutoSwapPercent;
  uint24 internal _maxAutoSwapPercent;
  uint32 internal _lastTaxDistribution;
  uint32 internal _tradingEnabled;
  uint32 internal _lastSwap;
  uint32 internal _earlyPenaltyTime;
  uint256 internal _totalSupply;
  uint256 internal _maxTxAmount;
  uint256 internal _maxBalanceAmount;
  uint256 internal _minAutoSwapAmount;
  uint256 internal _maxAutoSwapAmount;
  uint256 internal _amountForLiquidity;
  uint256 internal _totalTaxCollected;
  uint256 internal _totalTaxUnclaimed;
  uint256 internal _amountForTaxDistribution;
  uint256 internal _amountSwappedForTaxDistribution;
  uint256 internal _ethForTaxDistribution;
  uint256 internal _tokensForTaxDistribution;

  struct Renounced {
    bool Whitelist;
    bool MaxTx;
    bool MaxBalance;
    bool Taxable;
    bool DEXRouterV2;
  }

  struct holderAccount {
    bool exists;
    bool penalty;
  }

  struct taxBeneficiary {
    bool exists;
    address account;
    uint24[3] percent; // 0: tx, 1: buy, 2: sell
    uint24[3] penalty;
    uint256 unclaimed;
  }

  struct DEXRouterV2 {
    address router;
    address pair;
    address WETH;
    address receiver;
  }

  Renounced internal _renounced;
  IERC20 internal _taxToken;
  DEXRouterV2 internal _dex;

  function _percentage(uint256 amount, uint256 bps) internal pure returns (uint256) {
    unchecked {
      return (amount * bps) / (100 * uint256(_denominator));
    }
  }

  function _timestamp() internal view returns (uint32) {
    unchecked {
      return uint32(block.timestamp % 2**32);
    }
  }

  function denominator() external pure returns (uint24) {
    return _denominator;
  }

  function version() external pure returns (string memory) {
    return _version;
  }
}

File 3 of 12 : CF_Ownable.sol
// SPDX-License-Identifier: MIT

import "./CF_Common.sol";

pragma solidity 0.8.24;

abstract contract CF_Ownable is CF_Common {
  address internal _owner;

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

  modifier onlyOwner() {
    require(_owner == msg.sender, "Unauthorized");

    _;
  }

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

  function renounceOwnership() external onlyOwner {
    _renounced.Whitelist = true;
    _renounced.MaxTx = true;
    _renounced.MaxBalance = true;
    _renounced.Taxable = true;
    _renounced.DEXRouterV2 = true;

    _transferOwnership(address(0));
  }

  function transferOwnership(address newOwner) external onlyOwner {
    require(newOwner != address(0));

    _transferOwnership(newOwner);
  }

  function _transferOwnership(address newOwner) internal {
    address oldOwner = _owner;
    _owner = newOwner;

    emit OwnershipTransferred(oldOwner, newOwner);
  }
}

File 4 of 12 : CF_ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";

abstract contract CF_ERC20 is CF_Common {
  string internal _name;
  string internal _symbol;
  bytes32 internal _domainSeparator;
  bytes32 private constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
  mapping(address => uint256) private _nonces;

  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);

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

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

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

  function totalSupply() external view returns (uint256) {
    return _totalSupply;
  }

  function balanceOf(address account) external view returns (uint256) {
    return _balance[account];
  }

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

  function approve(address spender, uint256 amount) external returns (bool) {
    _approve(msg.sender, spender, amount);

    return true;
  }

  function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {
    require(deadline >= block.timestamp, "Expired signature");

    unchecked {
      bytes32 digest = keccak256(abi.encodePacked(hex"1901", _domainSeparator, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, _nonces[owner]++, deadline))));
      address recoveredAddress = ecrecover(digest, v, r, s);

      require(recoveredAddress != address(0) && recoveredAddress == owner, "Invalid signature");
    }

    _approve(owner, spender, value);
  }

  function nonces(address owner) external view returns (uint256) {
    return _nonces[owner];
  }

  function DOMAIN_SEPARATOR() external view returns (bytes32) {
    return _domainSeparator;
  }

  function transfer(address to, uint256 amount) external returns (bool) {
    _transfer(msg.sender, to, amount);

    return true;
  }

  function transferFrom(address from, address to, uint256 amount) external returns (bool) {
    _spendAllowance(from, msg.sender, amount);
    _transfer(from, to, amount);

    return true;
  }

  function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
    unchecked {
      _approve(msg.sender, spender, allowance(msg.sender, spender) + addedValue);
    }

    return true;
  }

  function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
    uint256 currentAllowance = allowance(msg.sender, spender);

    require(currentAllowance >= subtractedValue, "Negative allowance");

    unchecked {
      _approve(msg.sender, spender, currentAllowance - subtractedValue);
    }

    return true;
  }

  function _approve(address owner, address spender, uint256 amount) internal {
    _allowance[owner][spender] = amount;

    emit Approval(owner, spender, amount);
  }

  function _spendAllowance(address owner, address spender, uint256 amount) internal {
    uint256 currentAllowance = allowance(owner, spender);

    require(currentAllowance >= amount, "Insufficient allowance");

    unchecked {
      _approve(owner, spender, currentAllowance - amount);
    }
  }

  function _transfer(address from, address to, uint256 amount) internal virtual {
    require(from != address(0) && to != address(0), "Transfer from/to zero address");
    require(_balance[from] >= amount, "Exceeds balance");

    if (amount > 0) {
      unchecked {
        _balance[from] -= amount;
        _balance[to] += amount;
      }
    }

    emit Transfer(from, to, amount);
  }
}

File 5 of 12 : CF_Recoverable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";

abstract contract CF_Recoverable is CF_Common, CF_Ownable {
  /// @notice Recovers a misplaced amount of an ERC-20 token sitting in the contract balance
  /// @dev Beware of scam tokens!
  /// @dev Note that if the token of this contract is specified, amounts allocated for tax distribution and liquidity are reserved
  /// @param token Address of the ERC-20 token
  /// @param to Recipient
  /// @param amount Amount to be transferred
  function recoverERC20(address token, address to, uint256 amount) external onlyOwner {
    unchecked {
      uint256 balance = IERC20(token).balanceOf(address(this));
      uint256 allocated = token == address(this) ? _amountForTaxDistribution + _amountForLiquidity : (address(_taxToken) == token ? _tokensForTaxDistribution : 0);

      require(balance - (allocated >= balance ? balance : allocated) >= amount, "Exceeds balance");
    }

    IERC20(token).transfer(to, amount);
  }

  /// @notice Recovers a misplaced amount of native tokens sitting in the contract balance
  /// @dev Note that if the reflection token is the wrapped native, amounts allocated for tax distribution and/or liquidity are reserved
  /// @param to Recipient
  /// @param amount Amount of native tokens to be transferred
  function recoverNative(address payable to, uint256 amount) external onlyOwner {
    unchecked {
      uint256 balance = address(this).balance;
      uint256 allocated = address(_taxToken) == _dex.WETH ? _ethForTaxDistribution : 0;

      require(balance - (allocated >= balance ? balance : allocated) >= amount, "Exceeds balance");
    }

    (bool success, ) = to.call{ value: amount }("");

    require(success);
  }
}

File 6 of 12 : CF_Whitelist.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";

abstract contract CF_Whitelist is CF_Common, CF_Ownable {
  event Whitelisted(address indexed account, bool status);
  event RenouncedWhitelist();

  /// @notice Permanently renounce and prevent the owner from being able to update the whitelist
  /// @dev Existing entries will continue to be effective
  function renounceWhitelist() external onlyOwner {
    _renounced.Whitelist = true;

    emit RenouncedWhitelist();
  }

  /// @notice Check if an address is whitelisted
  /// @param account Address to check
  function isWhitelisted(address account) external view returns (bool) {
    return _whitelisted[account];
  }

  /// @notice Add or remove an address from the whitelist
  /// @param status True for adding, False for removing
  function whitelist(address account, bool status) public onlyOwner {
    _whitelist(account, status);
  }

  function _whitelist(address account, bool status) internal {
    require(!_renounced.Whitelist);
    require(account != address(0));
    require(account != _dex.router && account != _dex.pair, "DEX router and pair are privileged");


    _whitelisted[account] = status;

    emit Whitelisted(account, status);
  }

  /// @notice Add or remove multiple addresses from the whitelist
  /// @param status True for adding, False for removing
  function whitelist(address[] calldata accounts, bool status) external onlyOwner {
    unchecked {
      uint256 cnt = accounts.length;

      for (uint256 i; i < cnt; i++) { _whitelist(accounts[i], status); }
    }
  }

  function _initialWhitelist(address[6] memory accounts) internal {
    require(!_initialized);

    unchecked {
      for (uint256 i; i < 6; i++) { _whitelist(accounts[i], true); }
    }
  }
}

File 7 of 12 : CF_MaxTx.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";

abstract contract CF_MaxTx is CF_Common, CF_Ownable {
  event SetMaxTxPercent(uint24 percent);
  event RenouncedMaxTx();

  /// @notice Permanently renounce and prevent the owner from being able to update the max. transferable amount
  /// @dev Existing settings will continue to be effective
  function renounceMaxTx() external onlyOwner {
    _renounced.MaxTx = true;

    emit RenouncedMaxTx();
  }

  /// @notice Percentage of the max. transferable amount, depending on total supply
  function getMaxTxPercent() external view returns (uint24) {
    return _maxTxPercent;
  }

  /// @notice Set the max. percentage of a transferable amount, depending on total supply
  /// @param percent Desired percentage, multiplied by denominator (min. 0.1% of total supply, 0 to disable)
  function setMaxTxPercent(uint24 percent) external onlyOwner {
    require(!_renounced.MaxTx);

    unchecked {
      require(percent == 0 || (percent >= 100 && percent <= 100 * _denominator));
    }

    _setMaxTxPercent(percent);

    emit SetMaxTxPercent(percent);
  }

  function _setMaxTxPercent(uint24 percent) internal {
    _maxTxPercent = percent;
    _maxTxAmount = percent > 0 ? _percentage(_totalSupply, uint256(percent)) : 0;

    if (!_initialized) { emit SetMaxTxPercent(percent); }
  }
}

File 8 of 12 : CF_MaxBalance.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";

abstract contract CF_MaxBalance is CF_Common, CF_Ownable {
  event SetMaxBalancePercent(uint24 percent);
  event RenouncedMaxBalance();

  /// @notice Permanently renounce and prevent the owner from being able to update the max. balance
  /// @dev Existing settings will continue to be effective
  function renounceMaxBalance() external onlyOwner {
    _renounced.MaxBalance = true;

    emit RenouncedMaxBalance();
  }

  /// @notice Percentage of the max. balance per wallet, depending on total supply
  function getMaxBalancePercent() external view returns (uint24) {
    return _maxBalancePercent;
  }

  /// @notice Set the max. percentage of a wallet balance, depending on total supply
  /// @param percent Desired percentage, multiplied by denominator (min. 0.1% of total supply, 0 to disable)
  function setMaxBalancePercent(uint24 percent) external onlyOwner {
    require(!_renounced.MaxBalance);

    unchecked {
      require(percent == 0 || (percent >= 100 && percent <= 100 * _denominator));
    }

    _setMaxBalancePercent(percent);

    emit SetMaxBalancePercent(percent);
  }

  function _setMaxBalancePercent(uint24 percent) internal {
    _maxBalancePercent = percent;
    _maxBalanceAmount = percent > 0 ? _percentage(_totalSupply, uint256(percent)) : 0;

    if (!_initialized) { emit SetMaxBalancePercent(percent); }
  }
}

File 9 of 12 : CF_Taxable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";
import "./CF_ERC20.sol";

abstract contract CF_Taxable is CF_Common, CF_Ownable, CF_ERC20 {
  event SetTaxBeneficiary(uint8 slot, address account, uint24[3] percent, uint24[3] penalty);
  event SetEarlyPenaltyTime(uint32 time);
  event TaxDistributed(uint256 amount);
  event RenouncedTaxable();

  struct taxBeneficiaryView {
    address account;
    uint24[3] percent;
    uint24[3] penalty;
    uint256 unclaimed;
  }

  modifier lockDistributing {
    _distributing = true;
    _;
    _distributing = false;
  }

  /// @notice Permanently renounce and prevent the owner from being able to update the tax features
  /// @dev Existing settings will continue to be effective
  function renounceTaxable() external onlyOwner {
    _renounced.Taxable = true;

    emit RenouncedTaxable();
  }

  /// @notice Total amount of taxes collected so far
  function totalTaxCollected() external view returns (uint256) {
    return _totalTaxCollected;
  }

  /// @notice Tax applied per transfer
  /// @dev Taking in consideration your wallet address
  function txTax() external view returns (uint24) {
    return txTax(msg.sender);
  }

  /// @notice Tax applied per transfer
  /// @param from Sender address
  function txTax(address from) public view returns (uint24) {
    unchecked {
      return from == address(this) || _whitelisted[from] || from == _dex.pair ? 0 : (_holder[from].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltyTxTax : _totalTxTax);
    }
  }

  /// @notice Tax applied for buying
  /// @dev Taking in consideration your wallet address
  function buyTax() external view returns (uint24) {
    return buyTax(msg.sender);
  }

  /// @notice Tax applied for buying
  /// @param from Buyer's address
  function buyTax(address from) public view returns (uint24) {
    if (_suspendTaxes) { return 0; }

    unchecked {
      return from == address(this) || _whitelisted[from] || from == _dex.pair ? 0 : (_holder[from].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltyBuyTax : _totalBuyTax);
    }
  }
  /// @notice Tax applied for selling
  /// @dev Taking in consideration your wallet address
  function sellTax() external view returns (uint24) {
    return sellTax(msg.sender);
  }

  /// @notice Tax applied for selling
  /// @param to Seller's address
  function sellTax(address to) public view returns (uint24) {
    if (_suspendTaxes) { return 0; }

    unchecked {
      return to == address(this) || _whitelisted[to] || to == _dex.pair || to == _dex.router ? 0 : (_holder[to].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltySellTax : _totalSellTax);
    }
  }

  /// @notice List of all tax beneficiaries and their assigned percentage, according to type of transfer
  /// @custom:return `list[].account` Beneficiary address
  /// @custom:return `list[].percent[3]` Index 0 is for tx tax, 1 is for buy tax, 2 is for sell tax, multiplied by denominator
  /// @custom:return `list[].penalty[3]` Index 0 is for tx penalty, 1 is for buy penalty, 2 is for sell penalty, multiplied by denominator
  function listTaxBeneficiaries() external view returns (taxBeneficiaryView[] memory list) {
    list = new taxBeneficiaryView[](5);

    unchecked {
      for (uint8 i; i < 5; i++) { list[i] = taxBeneficiaryView(_taxBeneficiary[i].account, _taxBeneficiary[i].percent, _taxBeneficiary[i].penalty, _taxBeneficiary[i].unclaimed); }
    }
  }

  /// @notice Sets a tax beneficiary
  /// @dev Maximum of 5 wallets can be assigned
  /// @param slot Slot number (0 to 4)
  /// @param account Beneficiary address
  /// @param percent[3] Index 0 is for tx tax, 1 is for buy tax, 2 is for sell tax, multiplied by denominator
  /// @param penalty[3] Index 0 is for tx penalty, 1 is for buy penalty, 2 is for sell penalty, multiplied by denominator
  function setTaxBeneficiary(uint8 slot, address account, uint24[3] memory percent, uint24[3] memory penalty) external onlyOwner {
    require(!_renounced.Taxable);

    _setTaxBeneficiary(slot, account, percent, penalty);
  }

  function _setTaxBeneficiary(uint8 slot, address account, uint24[3] memory percent, uint24[3] memory penalty) internal {
    require(slot < 5);
    require(account != address(this) && account != address(0xdEaD) && account != address(0));

    taxBeneficiary storage _taxBeneficiary = _taxBeneficiary[slot];

    unchecked {
      _totalTxTax += percent[0] - _taxBeneficiary.percent[0];
      _totalBuyTax += percent[1] - _taxBeneficiary.percent[1];
      _totalSellTax += percent[2] - _taxBeneficiary.percent[2];
      _totalPenaltyTxTax += penalty[0] - _taxBeneficiary.penalty[0];
      _totalPenaltyBuyTax += penalty[1] - _taxBeneficiary.penalty[1];
      _totalPenaltySellTax += penalty[2] - _taxBeneficiary.penalty[2];

      require(_totalTxTax <= 25 * _denominator && ((_totalBuyTax <= 25 * _denominator && _totalSellTax <= 25 * _denominator) && (_totalBuyTax + _totalSellTax <= 25 * _denominator)), "High Tax");
      require(_totalPenaltyTxTax <= 100 * _denominator && _totalPenaltyBuyTax <= 100 * _denominator && _totalPenaltySellTax <= 100 * _denominator, "Invalid Penalty");
    }

    _taxBeneficiary.account = account;
    _taxBeneficiary.percent = percent;
    _taxBeneficiary.penalty = penalty;

    if (!_taxBeneficiary.exists) { _taxBeneficiary.exists = true; }

    emit SetTaxBeneficiary(slot, account, percent, penalty);
  }

  /// @notice Triggers the tax distribution
  /// @dev Will only be executed if there is no ongoing swap or tax distribution
  function autoTaxDistribute() external {
    require(msg.sender == _owner || _whitelisted[msg.sender], "Unauthorized");
    require(!_swapping && !_distributing);

    _autoTaxDistribute();
  }

  function _autoTaxDistribute() internal lockDistributing {
    if (_totalTaxUnclaimed == 0) { return; }

    unchecked {
      uint256 distributedTaxes;

      for (uint8 i; i < 5; i++) {
        address account = _taxBeneficiary[i].account;

        if (_taxBeneficiary[i].unclaimed == 0 || account == _dex.pair) { continue; }

        uint256 unclaimed = _percentage(address(_taxToken) == address(this) ? _amountForTaxDistribution : _amountSwappedForTaxDistribution, (100 * uint256(_denominator) * _taxBeneficiary[i].unclaimed) / _totalTaxUnclaimed);
        uint256 _distributedTaxes = _distribute(account, unclaimed);

        if (_distributedTaxes > 0) {
          _taxBeneficiary[i].unclaimed -= _distributedTaxes;
          distributedTaxes += _distributedTaxes;
        }
      }

      _lastTaxDistribution = _timestamp();

      if (distributedTaxes > 0) { _totalTaxUnclaimed -= distributedTaxes; }

      emit TaxDistributed(distributedTaxes);
    }
  }

  function _distribute(address account, uint256 unclaimed) private returns (uint256) {
    if (unclaimed == 0) { return 0; }

    unchecked {
      if (address(_taxToken) == address(this)) {
        if (_maxBalanceAmount > 0 && _balance[account] + unclaimed > _maxBalanceAmount && !_whitelisted[account]) {
          unclaimed = _maxBalanceAmount > _balance[account] ? _maxBalanceAmount - _balance[account] : 0;

          if (unclaimed == 0) { return 0; }
        }

        super._transfer(address(this), account, unclaimed);

        _amountForTaxDistribution -= unclaimed;
      } else {
        uint256 percent = (100 * uint256(_denominator) * unclaimed) / _amountSwappedForTaxDistribution;
        uint256 amount;

        if (address(_taxToken) == _dex.WETH) {
          amount = _percentage(_ethForTaxDistribution, percent);

          (bool success, ) = payable(account).call{ value: amount, gas: 30000 }("");

          if (!success) { return 0; }

          _ethForTaxDistribution -= amount;
        } else {
          amount = _percentage(_tokensForTaxDistribution, percent);

          try _taxToken.transfer(account, amount) { _tokensForTaxDistribution -= amount; } catch { return 0; }
        }

        _amountSwappedForTaxDistribution -= unclaimed;
      }
    }

    return unclaimed;
  }

  /// @notice Suspend or reinstate tax collection
  /// @dev Also applies to early penalties
  /// @param status True to suspend, False to reinstate existent taxes
  function suspendTaxes(bool status) external onlyOwner {
    require(!_renounced.Taxable);

    _suspendTaxes = status;
  }

  /// @notice Checks if tax collection is currently suspended
  function taxesSuspended() external view returns (bool) {
    return _suspendTaxes;
  }

  /// @notice Removes the penalty status of a wallet
  /// @param account Address to depenalize
  function removePenalty(address account) external onlyOwner {
    require(!_renounced.Taxable);

    _holder[account].penalty = false;
  }

  /// @notice Check if a wallet is penalized due to an early transaction
  /// @param account Address to check
  function isPenalized(address account) external view returns (bool) {
    return _holder[account].penalty;
  }

  /// @notice Returns the period of time during which early buyers will be penalized from the time trading was enabled
  function getEarlyPenaltyTime() external view returns (uint32) {
    return _earlyPenaltyTime;
  }

  /// @notice Defines the period of time during which early buyers will be penalized from the time trading was enabled
  /// @dev Must be less or equal to 1 hour
  /// @param time Time, in seconds
  function setEarlyPenaltyTime(uint32 time) external onlyOwner {
    require(!_renounced.Taxable);
    require(time <= 600);

    _setEarlyPenaltyTime(time);
  }

  function _setEarlyPenaltyTime(uint32 time) internal {
    _earlyPenaltyTime = time;

    emit SetEarlyPenaltyTime(time);
  }
}

File 10 of 12 : CF_DEXRouterV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";
import "./CF_ERC20.sol";

abstract contract CF_DEXRouterV2 is CF_Common, CF_Ownable, CF_ERC20 {
  event SwapAndLiquify(uint256 tokenAmount, uint256 ethAmount, uint256 liquidity);
  event SwappedTokensForNative(uint256 tokenAmount, uint256 ethAmount);
  event SwappedTokensForTokens(address token, uint256 token0Amount, uint256 token1Amount);
  event SetDEXRouterV2(address indexed router, address indexed pair, address receiver);
  event RenouncedDEXRouterV2();

  modifier lockSwapping {
    _swapping = true;
    _;
    _swapping = false;
  }

  /// @notice Permanently renounce and prevent the owner from being able to update the DEX features
  /// @dev Existing settings will continue to be effective
  function renounceDEXRouterV2() external onlyOwner {
    _renounced.DEXRouterV2 = true;

    emit RenouncedDEXRouterV2();
  }

  /// @notice Sets the DEX router and where to receive the LP tokens
  /// @param router Address of the DEX router
  /// @param receiver Address of the LP tokens receiver
  function setDEXRouterV2(address router, address receiver) external onlyOwner returns (address) {
    require(!_renounced.DEXRouterV2);

    return _setDEXRouterV2(router, receiver);
  }

  function _setDEXRouterV2(address router, address receiver) internal returns (address) {
    require(router != address(0));

    if (_dex.router != router) {
      IDEXRouterV2 _router = IDEXRouterV2(router);
      IDEXFactoryV2 factory = IDEXFactoryV2(_router.factory());
      address WETH = _router.WETH();
      address pair = factory.getPair(address(this), WETH);

      if (pair == address(0)) { pair = factory.createPair(address(this), WETH); }

      _dex = DEXRouterV2(router, pair, WETH, receiver);
    }

    if (receiver != _dex.receiver) { _dex.receiver = receiver; }

    emit SetDEXRouterV2(router, _dex.pair, receiver);

    return _dex.pair;
  }

  /// @notice Returns the DEX router currently in use
  function getDEXRouterV2() external view returns (address) {
    return _dex.router;
  }

  /// @notice Returns the trading pair
  function getDEXPairV2() external view returns (address) {
    return _dex.pair;
  }

  /// @notice Returns address of the LP tokens receiver
  function getLPTokensReceiver() external view returns (address) {
    return _dex.receiver;
  }

  /// @notice Checks whether the token can be traded through the assigned DEX
  function isTradingEnabled() external view returns (bool) {
    return _tradingEnabled > 0;
  }

  /// @notice Checks the status of the auto-swapping feature
  function isAutoSwapEnabled() external view returns (bool) {
    return _autoSwapEnabled;
  }

  /// @notice Returns the percentage range of the total supply over which the auto-swap will operate when accumulating taxes in the contract balance
  function getAutoSwapPercent() external view returns (uint24 min, uint24 max) {
    return (_minAutoSwapPercent, _maxAutoSwapPercent);
  }

  /// @notice Sets the percentage range of the total supply over which the auto-swap will operate when accumulating taxes in the contract balance
  /// @param min Desired min. percentage to trigger the auto-swap, multiplied by denominator (0.001% to 1% of total supply)
  /// @param max Desired max. percentage to limit the auto-swap, multiplied by denominator (0.001% to 1% of total supply)
  function setAutoSwapPercent(uint24 min, uint24 max) external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(min >= 1 && min <= 1000, "0.001% to 1%");
    require(max >= min && max <= 1000, "0.001% to 1%");

    _setAutoSwapPercent(min, max);
  }

  function _setAutoSwapPercent(uint24 min, uint24 max) internal {
    _minAutoSwapPercent = min;
    _maxAutoSwapPercent = max;
    _minAutoSwapAmount = _percentage(_totalSupply, uint256(min));
    _maxAutoSwapAmount = _percentage(_totalSupply, uint256(max));
  }

  /// @notice Enables or disables the auto-swap function
  /// @param status True to enable, False to disable
  function enableAutoSwap(bool status) external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(!status || _dex.router != address(0), "No DEX");

    _autoSwapEnabled = status;
  }

  /// @notice Swaps the assigned amount to inject liquidity and prepare collected taxes for its distribution
  /// @dev Will only be executed if there is no ongoing swap or tax distribution and the min. threshold has been reached
  function autoSwap() external {
    require(_autoSwapEnabled && !_swapping && !_distributing);

    _autoSwap(false);
  }

  /// @notice Swaps the assigned amount to inject liquidity and prepare collected taxes for its distribution
  /// @dev Will only be executed if there is no ongoing swap or tax distribution and the min. threshold has been reached unless forced
  /// @param force Ignore the min. and max. threshold amount
  function autoSwap(bool force) external {
    require(msg.sender == _owner || _whitelisted[msg.sender], "Unauthorized");
    require((force || _autoSwapEnabled) && !_swapping && !_distributing);

    _autoSwap(force);
  }

  function _autoSwap(bool force) internal lockSwapping {
    if (!force && !_autoSwapEnabled) { return; }

    unchecked {
      uint256 amountForLiquidityToSwap = _amountForLiquidity > 0 ? _amountForLiquidity / 2 : 0;
      uint256 amountForTaxDistributionToSwap = (address(_taxToken) == _dex.WETH ? _amountForTaxDistribution : 0);
      uint256 amountToSwap = amountForTaxDistributionToSwap + amountForLiquidityToSwap;

      if (!force && amountToSwap > _maxAutoSwapAmount) {
        amountForLiquidityToSwap = amountForLiquidityToSwap > 0 ? _percentage(_maxAutoSwapAmount, (100 * uint256(_denominator) * amountForLiquidityToSwap) / amountToSwap) : 0;
        amountForTaxDistributionToSwap = amountForTaxDistributionToSwap > 0 ? _percentage(_maxAutoSwapAmount, (100 * uint256(_denominator) * amountForTaxDistributionToSwap) / amountToSwap) : 0;
        amountToSwap = amountForTaxDistributionToSwap + amountForLiquidityToSwap;
      }

      if ((force || amountToSwap >= _minAutoSwapAmount) && _balance[address(this)] >= amountToSwap + amountForLiquidityToSwap) {
        uint256 ethBalance = address(this).balance;
        address[] memory pathToSwapExactTokensForETH = new address[](2);
        pathToSwapExactTokensForETH[0] = address(this);
        pathToSwapExactTokensForETH[1] = _dex.WETH;

        _approve(address(this), _dex.router, amountToSwap);

        try IDEXRouterV2(_dex.router).swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap, 0, pathToSwapExactTokensForETH, address(this), block.timestamp) {
          if (_amountForLiquidity > 0) { _amountForLiquidity -= amountForLiquidityToSwap; }

          uint256 ethAmount = address(this).balance - ethBalance;

          emit SwappedTokensForNative(amountToSwap, ethAmount);

          if (ethAmount > 0) {
            uint256 ethForLiquidity = _percentage(ethAmount, (100 * uint256(_denominator) * amountForLiquidityToSwap) / amountToSwap);

            if (address(_taxToken) == _dex.WETH) {
              _ethForTaxDistribution += _percentage(ethAmount, (100 * uint256(_denominator) * amountForTaxDistributionToSwap) / amountToSwap);
              _amountSwappedForTaxDistribution += amountForTaxDistributionToSwap;
              _amountForTaxDistribution -= amountForTaxDistributionToSwap;
            }

            if (amountForLiquidityToSwap > 0 && ethForLiquidity > 0) {
              _approve(address(this), _dex.router, amountForLiquidityToSwap);

              try IDEXRouterV2(_dex.router).addLiquidityETH{ value: ethForLiquidity }(address(this), amountForLiquidityToSwap, 0, 0, _dex.receiver, block.timestamp) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {
                emit SwapAndLiquify(amountToken, amountETH, liquidity);

                _amountForLiquidity -= amountForLiquidityToSwap;
              } catch {
                _approve(address(this), _dex.router, 0);
              }
            }
          }
        } catch {
          _approve(address(this), _dex.router, 0);
        }
      }

      if (address(_taxToken) != address(this) && address(_taxToken) != _dex.WETH) {
        amountForTaxDistributionToSwap = _amountForTaxDistribution;

        if (!force && amountForTaxDistributionToSwap > _maxAutoSwapAmount) { amountForTaxDistributionToSwap = _maxAutoSwapAmount; }

        if ((force || amountForTaxDistributionToSwap >= _minAutoSwapAmount) && _balance[address(this)] >= amountForTaxDistributionToSwap) {
          uint256 tokenAmount = _swapTokensForTokens(_taxToken, amountForTaxDistributionToSwap);

          if (tokenAmount > 0) {
            _tokensForTaxDistribution += tokenAmount;
            _amountSwappedForTaxDistribution += amountForTaxDistributionToSwap;
            _amountForTaxDistribution -= amountForTaxDistributionToSwap;
          }
        }
      }
    }

    _lastSwap = _timestamp();
  }

  function _swapTokensForTokens(IERC20 token, uint256 amount) private returns (uint256 tokenAmount) {
    uint256 tokenBalance = token.balanceOf(address(this));
    address[] memory pathToSwapExactTokensForTokens = new address[](3);
    pathToSwapExactTokensForTokens[0] = address(this);
    pathToSwapExactTokensForTokens[1] = _dex.WETH;
    pathToSwapExactTokensForTokens[2] = address(token);

    _approve(address(this), _dex.router, amount);

    try IDEXRouterV2(_dex.router).swapExactTokensForTokensSupportingFeeOnTransferTokens(amount, 0, pathToSwapExactTokensForTokens, address(this), block.timestamp) {
      tokenAmount = token.balanceOf(address(this)) - tokenBalance;

      emit SwappedTokensForTokens(address(token), amount, tokenAmount);
    } catch {
      _approve(address(this), _dex.router, 0);
    }
  }

  /// @notice Returns the token for tax distribution
  function getTaxToken() external view returns (address) {
    return address(_taxToken);
  }

  /// @notice Sets the desired ERC-20 token for taxes
  /// @dev If other token than wrapped native is specified, the pair wrapped native-token must already exist
  /// @param token Address of the ERC-20 token
  function setTaxToken(address token) external onlyOwner {
    require(!_renounced.DEXRouterV2);

    if (address(_taxToken) != token && _amountSwappedForTaxDistribution > 0) { revert("Unclaimed taxes"); }

    _setTaxToken(token);
  }

  function _setTaxToken(address token) internal {
    require((!_initialized && token == address(0)) || token == address(this) || token == _dex.WETH || IDEXFactoryV2(IDEXRouterV2(_dex.router).factory()).getPair(_dex.WETH, token) != address(0), "No Pair");

    _taxToken = IERC20(token == address(0) ? address(this) : token);
  }

  /// @notice Enables the trading capability via the DEX set up
  /// @dev Once enabled, it cannot be reverted
  function enableTrading() external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(_tradingEnabled == 0, "Already enabled");

    _tradingEnabled = _timestamp();
  }
}

File 11 of 12 : IDEXV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

interface IDEXRouterV2 {
  function factory() external pure returns (address);
  function WETH() external pure returns (address);
  function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
  function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;
  function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;
}

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

File 12 of 12 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

interface IERC20 {
  function balanceOf(address account) external view returns (uint256);
  function transfer(address to, uint256 amount) external returns (bool);
  function approve(address spender, uint256 amount) external returns (bool);
}

Settings
{
  "evmVersion": "shanghai",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedDEXRouterV2","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedMaxBalance","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedMaxTx","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedTaxable","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"SetDEXRouterV2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"time","type":"uint32"}],"name":"SetEarlyPenaltyTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"percent","type":"uint24"}],"name":"SetMaxBalancePercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"percent","type":"uint24"}],"name":"SetMaxTxPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"slot","type":"uint8"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"indexed":false,"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"}],"name":"SetTaxBeneficiary","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"SwappedTokensForNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"token0Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"token1Amount","type":"uint256"}],"name":"SwappedTokensForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Whitelisted","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":[],"name":"autoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"force","type":"bool"}],"name":"autoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoTaxDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"buyTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"denominator","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"enableAutoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAutoSwapPercent","outputs":[{"internalType":"uint24","name":"min","type":"uint24"},{"internalType":"uint24","name":"max","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXPairV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXRouterV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEarlyPenaltyTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPTokensReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxBalancePercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTxPercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"info","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"string","name":"version","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAutoSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPenalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listTaxBeneficiaries","outputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"internalType":"struct CF_Taxable.taxBeneficiaryView[]","name":"list","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removePenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceDEXRouterV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMaxBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTaxable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounced","outputs":[{"internalType":"bool","name":"Whitelist","type":"bool"},{"internalType":"bool","name":"MaxTx","type":"bool"},{"internalType":"bool","name":"MaxBalance","type":"bool"},{"internalType":"bool","name":"DEXRouterV2","type":"bool"},{"internalType":"bool","name":"Taxable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint24","name":"min","type":"uint24"},{"internalType":"uint24","name":"max","type":"uint24"}],"name":"setAutoSwapPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"receiver","type":"address"}],"name":"setDEXRouterV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"time","type":"uint32"}],"name":"setEarlyPenaltyTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMaxBalancePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"slot","type":"uint8"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"}],"name":"setTaxBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setTaxToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"suspendTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxesSuspended","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTaxCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":"txTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"txTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801562000010575f80fd5b5060408051808201909152600781526657495a4152445360c81b6020820152601b906200003e9082620010a0565b50604080518082019091526005815264545241444560d81b6020820152601c906200006a9082620010a0565b50601260a0526a52b7d2dcc80cd2e4000000600855620000985f8051602062005b8c8339815191526200037e565b620000b55f8051602062005b8c83398151915262015f90620003cf565b620000d7732982d24902aae3c547bf6200c07d4600083145b2611388620003cf565b620000f973b22774ab544b5dda8b31da759dafeeb1d2aba38a6107d0620003cf565b6200011b73599b83a43204b9fc01d7a8fdf6c83336066ceaf96105dc620003cf565b6200013d732a4a860898eb16ea3b0c3cfd9dbe532beca0b0d96105dc620003cf565b6200016b737a250d5630b4cf539739df2c5dacb4c659f2488d5f8051602062005b8c8339815191526200044c565b50620001796102586200073d565b6200019873c02aaa39b223fe8d0a0e5c4f27ead9083c756cc262000798565b620001a7603261012c6200094d565b6006805460ff1916600117905560408051606080820183526103e882526113566020808401829052838501919091528351918201845261c350808352908201819052928101929092526200020d915f915f8051602062005b8c83398151915291620009af565b6040805160c0810182525f8051602062005b8c8339815191528152732982d24902aae3c547bf6200c07d4600083145b2602082015273b22774ab544b5dda8b31da759dafeeb1d2aba38a9181019190915273599b83a43204b9fc01d7a8fdf6c83336066ceaf96060820152732a4a860898eb16ea3b0c3cfd9dbe532beca0b0d96080820152731158ef1d256835993f5a14c44ea1ecfda9861e7960a0820152620002b79062000d6b565b620002c46107d062000db7565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f601b604051620002f691906200116c565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f198184030181529190528051602090910120601d55600160805262001299565b601a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60805115620003dc575f80fd5b5f620003f66008548362ffffff1662000e3c60201b60201c565b6001600160a01b0384165f8181526020818152604080832085905551848152939450919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b5f6001600160a01b03831662000460575f80fd5b6016546001600160a01b03848116911614620006b1575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004b8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004de9190620011e6565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200051e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005449190620011e6565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af115801562000595573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005bb9190620011e6565b90506001600160a01b03811662000641576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af115801562000618573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200063e9190620011e6565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b03838116911614620006e357601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fd0cdc441c8110da5df2f4a64e1cee8a6794d8016c982757bb5d8971cde6b6bf39060200160405180910390a3506017546001600160a01b031692915050565b6007805463ffffffff60781b1916600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020015b60405180910390a150565b608051158015620007b057506001600160a01b038116155b80620007c457506001600160a01b03811630145b80620007dd57506018546001600160a01b038281169116145b80620008d557506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa1580156200082c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620008529190620011e6565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015620008a3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620008c99190620011e6565b6001600160a01b031614155b620009115760405162461bcd60e51b81526020600482015260076024820152662737902830b4b960c91b60448201526064015b60405180910390fd5b6001600160a01b038116156200092857806200092a565b305b601580546001600160a01b0319166001600160a01b039290921691909117905550565b6006805462ffffff60e01b1916600160e01b62ffffff858116918202929092179092556007805462ffffff19169184169190911790556008546200099591620186a091020490565b600b55600854620186a062ffffff929092160204600c5550565b60058460ff1610620009bf575f80fd5b6001600160a01b0383163014801590620009e457506001600160a01b03831661dead14155b8015620009f957506001600160a01b03831615155b62000a02575f80fd5b60ff84165f908152600460209081526040918290206001810180548651600680546a010000000000000000000080820462ffffff908116958116909403949094018316840262ffffff60501b198216811780845586548c8a0151600160681b928390048716630100000092839004881690910301861690910265ffffffffffff60501b1990931662ffffff60681b19909216919091179190911780835594548a890151600160801b808804861666010000000000009384900487169092039190910185160262ffffff60801b19871681178085556002890180548d51600160981b938490048916918916900301871690910265ffffffffffff60801b1990981662ffffff60981b1990921691909117969096178084558654988b0151600160b01b808304871694909a048616900392909201841690970262ffffff60b01b19821681178084559554988a015165ffffffffffff60b01b1990921662ffffff60c81b1990911617969097048216909603600160c81b938490048216018116909202939093179384905590926161a8929004161180159062000c0057506006546161a8600160681b90910462ffffff161180159062000bd057506006546161a8600160801b90910462ffffff1611155b801562000c0057506006546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b62000c395760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b604482015260640162000908565b600654620186a0600160981b90910462ffffff161180159062000c6e5750600654620186a0600160b01b90910462ffffff1611155b801562000c8d5750600654620186a0600160c81b90910462ffffff1611155b62000ccd5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642050656e616c747960881b604482015260640162000908565b8054610100600160a81b0319166101006001600160a01b0386160217815562000cfc6001820184600362000f4d565b5062000d0e6002820183600362000f4d565b50805460ff1662000d2557805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405162000d5c949392919062001258565b60405180910390a15050505050565b6080511562000d78575f80fd5b5f5b600681101562000db35762000daa82826006811062000d9d5762000d9d62001215565b6020020151600162000e46565b60010162000d7a565b5050565b6006805462ffffff60201b191664010000000062ffffff84169081029190911790915562000de6575f62000df8565b600854620186a062ffffff8316909102045b60095560805162000e395760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda195906020016200078d565b50565b620186a091020490565b60145460ff161562000e56575f80fd5b6001600160a01b03821662000e69575f80fd5b6016546001600160a01b0383811691161480159062000e9657506017546001600160a01b03838116911614155b62000eef5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b606482015260840162000908565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b60018301918390821562000fda579160200282015f5b8382111562000fa757835183826101000a81548162ffffff021916908362ffffff160217905550926020019260030160208160020104928301926001030262000f63565b801562000fd85782816101000a81549062ffffff021916905560030160208160020104928301926001030262000fa7565b505b5062000fe892915062000fec565b5090565b5b8082111562000fe8575f815560010162000fed565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200102b57607f821691505b6020821081036200104a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200109b57805f5260205f20601f840160051c81016020851015620010775750805b601f840160051c820191505b8181101562001098575f815560010162001083565b50505b505050565b81516001600160401b03811115620010bc57620010bc62001002565b620010d481620010cd845462001016565b8462001050565b602080601f8311600181146200110a575f8415620010f25750858301515b5f19600386901b1c1916600185901b17855562001164565b5f85815260208120601f198616915b828110156200113a5788860151825594840194600190910190840162001119565b50858210156200115857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8083546200117b8162001016565b60018281168015620011965760018114620011ac57620011da565b60ff1984168752821515830287019450620011da565b875f526020805f205f5b85811015620011d15781548a820152908401908201620011b6565b50505082870194505b50929695505050505050565b5f60208284031215620011f7575f80fd5b81516001600160a01b03811681146200120e575f80fd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b805f5b60038110156200125257815162ffffff168452602093840193909101906001016200122c565b50505050565b60ff851681526001600160a01b0384166020820152610100810162001281604083018562001229565b6200129060a083018462001229565b95945050505050565b60805160a0516148bc620012d05f395f8181610526015261101d01525f8181612e1f01528181612eda0152613a9801526148bc5ff3fe6080604052600436106103a1575f3560e01c806377004851116101e4578063be5e49b21161010b578063da88d01a116100a4578063f2fde38b11610076578063f2fde38b14610b4e578063f3dc4f4814610b6d578063f59c370814610ba9578063f7c3b38f14610bc8578063f7de0e5714610be857005b8063da88d01a14610add578063dd62ed3e14610afc578063e92871f614610b1b578063f2cda82e14610b2f57005b8063cc1776d3116100dd578063cc1776d314610a33578063d232c22014610a47578063d505accf14610aaa578063d8454a8214610ac957005b8063be5e49b2146109cf578063c2921583146109ee578063c77e006d14610a0b578063c78fe0d414610a1f57005b806395d89b411161017d578063a4d8971a1161014f578063a4d8971a14610955578063a5596b4f14610974578063a9059cbb14610993578063b81a0145146109b257005b806395d89b41146108fa57806396ce07951461090e5780639c5ef8d714610922578063a457c2d71461093657005b80638bf1acff116101b65780638bf1acff1461088b5780638d8350ca1461089f5780638da5cb5b146108be57806395101f90146108db57005b8063770048511461081b5780637ecebe001461082f5780638324c3b9146108635780638a8c523c1461087757005b806339509351116102c85780635a0d4f88116102615780636f05be97116102335780636f05be971461079257806370a08231146107b3578063715018a6146107e757806375de1496146107fb57005b80635a0d4f88146106f25780635b90fe66146107235780635f6417581461075457806368a5d4141461077357005b8063487d1ce51161029a578063487d1ce5146106675780634b7d9db4146106865780634f7041a51461069d57806354fd4d50146106c557005b806339509351146105d35780633af32abf146105f25780633ed8a1691461062957806344b691ff1461064857005b806323b872dd1161033a57806332acf3de1161030c57806332acf3de146105505780633644e51514610585578063370158ea1461059957806339137f8b146105bf57005b806323b872dd146104b65780632623e975146104d55780632984207a146104f4578063313ce5671461051357005b8063095ea7b311610373578063095ea7b31461043b5780631171bda91461045a57806318160ddd14610479578063186488a81461049757005b806301b38af5146103aa578063064a59d0146103c957806306fdde03146103fd57806307e9652c1461041e57005b366103a857005b005b3480156103b5575f80fd5b506103a86103c43660046141d4565b610c05565b3480156103d4575f80fd5b50600754600160381b900463ffffffff1615155b60405190151581526020015b60405180910390f35b348015610408575f80fd5b50610411610c82565b6040516103f49190614296565b348015610429575f80fd5b5060065462010000900460ff166103e8565b348015610446575f80fd5b506103e86104553660046142bc565b610d12565b348015610465575f80fd5b506103a86104743660046142e6565b610d28565b348015610484575f80fd5b506008545b6040519081526020016103f4565b3480156104a2575f80fd5b506103a86104b13660046143c9565b610ea3565b3480156104c1575f80fd5b506103e86104d03660046142e6565b610eef565b3480156104e0575f80fd5b506103a86104ef36600461441f565b610f10565b3480156104ff575f80fd5b506103a861050e36600461443a565b610faf565b34801561051e575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016103f4565b34801561055b575f80fd5b5060065460075460408051600160e01b90930462ffffff90811684529091166020830152016103f4565b348015610590575f80fd5b50601d54610489565b3480156105a4575f80fd5b506105ad61100f565b6040516103f49695949392919061445d565b3480156105ca575f80fd5b506103a861119a565b3480156105de575f80fd5b506103e86105ed3660046142bc565b6111fb565b3480156105fd575f80fd5b506103e861060c3660046144c1565b6001600160a01b03165f9081526002602052604090205460ff1690565b348015610634575f80fd5b506103a86106433660046144dc565b611212565b348015610653575f80fd5b506103a86106623660046144f5565b6112c9565b348015610672575f80fd5b506103a86106813660046144c1565b6113cb565b348015610691575f80fd5b5060065460ff166103e8565b3480156106a8575f80fd5b506106b1611472565b60405162ffffff90911681526020016103f4565b3480156106d0575f80fd5b50604080518082019091526005815264312e302e3160d81b6020820152610411565b3480156106fd575f80fd5b506015546001600160a01b03165b6040516001600160a01b0390911681526020016103f4565b34801561072e575f80fd5b50600754600160781b900463ffffffff1660405163ffffffff90911681526020016103f4565b34801561075f575f80fd5b506106b161076e3660046144c1565b611481565b34801561077e575f80fd5b5061070b61078d366004614526565b61157c565b34801561079d575f80fd5b506107a66115cf565b6040516103f49190614584565b3480156107be575f80fd5b506104896107cd3660046144c1565b6001600160a01b03165f9081526020819052604090205490565b3480156107f2575f80fd5b506103a8611760565b348015610806575f80fd5b50600654600160381b900462ffffff166106b1565b348015610826575f80fd5b506103a86117aa565b34801561083a575f80fd5b506104896108493660046144c1565b6001600160a01b03165f908152601e602052604090205490565b34801561086e575f80fd5b506103a86117eb565b348015610882575f80fd5b506103a8611852565b348015610896575f80fd5b506106b1611905565b3480156108aa575f80fd5b506106b16108b93660046144c1565b61190b565b3480156108c9575f80fd5b50601a546001600160a01b031661070b565b3480156108e6575f80fd5b506106b16108f53660046144c1565b6119ce565b348015610905575f80fd5b50610411611aaa565b348015610919575f80fd5b506103e86106b1565b34801561092d575f80fd5b506103a8611ab9565b348015610941575f80fd5b506103e86109503660046142bc565b611b2e565b348015610960575f80fd5b506103a861096f36600461441f565b611b8e565b34801561097f575f80fd5b506103a861098e36600461441f565b611c1a565b34801561099e575f80fd5b506103e86109ad3660046142bc565b611c76565b3480156109bd575f80fd5b506019546001600160a01b031661070b565b3480156109da575f80fd5b506103a86109e93660046144c1565b611c82565b3480156109f9575f80fd5b506017546001600160a01b031661070b565b348015610a16575f80fd5b506103a8611ce3565b348015610a2a575f80fd5b506103a8611d48565b348015610a3e575f80fd5b506106b1611db0565b348015610a52575f80fd5b506014546040805160ff8084161515825261010084048116151560208301526201000084048116151592820192909252600160201b83048216151560608201526301000000909204161515608082015260a0016103f4565b348015610ab5575f80fd5b506103a8610ac4366004614603565b611dba565b348015610ad4575f80fd5b50600e54610489565b348015610ae8575f80fd5b506103a8610af73660046144dc565b611fa2565b348015610b07575f80fd5b50610489610b16366004614526565b612051565b348015610b26575f80fd5b506103a861207b565b348015610b3a575f80fd5b506103a8610b493660046142bc565b6120de565b348015610b59575f80fd5b506103a8610b683660046144c1565b6121c3565b348015610b78575f80fd5b506103e8610b873660046144c1565b6001600160a01b03165f90815260036020526040902054610100900460ff1690565b348015610bb4575f80fd5b506103a8610bc336600461466c565b612208565b348015610bd3575f80fd5b50600654600160201b900462ffffff166106b1565b348015610bf3575f80fd5b506016546001600160a01b031661070b565b601a546001600160a01b03163314610c385760405162461bcd60e51b8152600401610c2f90614698565b60405180910390fd5b815f5b81811015610c7b57610c73858583818110610c5857610c586146be565b9050602002016020810190610c6d91906144c1565b84612238565b600101610c3b565b5050505050565b6060601b8054610c91906146d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbd906146d2565b8015610d085780601f10610cdf57610100808354040283529160200191610d08565b820191905f5260205f20905b815481529060010190602001808311610ceb57829003601f168201915b5050505050905090565b5f610d1e33848461233a565b5060015b92915050565b601a546001600160a01b03163314610d525760405162461bcd60e51b8152600401610c2f90614698565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610d96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dba9190614704565b90505f6001600160a01b0385163014610df0576015546001600160a01b03868116911614610de8575f610df8565b601354610df8565b600d54601054015b90508282821015610e095781610e0b565b825b83031015610e2b5760405162461bcd60e51b8152600401610c2f9061471b565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610e79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9d9190614744565b50505050565b601a546001600160a01b03163314610ecd5760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615610ee3575f80fd5b610e9d8484848461239b565b5f610efb84338461273c565b610f0684848461279f565b5060019392505050565b601a546001600160a01b03163314610f3a5760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff1615610f50575f80fd5b801580610f6757506016546001600160a01b031615155b610f9c5760405162461bcd60e51b815260206004820152600660248201526509cde40888ab60d31b6044820152606401610c2f565b6006805460ff1916911515919091179055565b601a546001600160a01b03163314610fd95760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615610fef575f80fd5b6102588163ffffffff161115611003575f80fd5b61100c81612d80565b50565b6060805f805f6060601b601c7f0000000000000000000000000000000000000000000000000000000000000000601a5f9054906101000a90046001600160a01b031660085460405180604001604052806005815260200164312e302e3160d81b81525085805461107e906146d2565b80601f01602080910402602001604051908101604052809291908181526020018280546110aa906146d2565b80156110f55780601f106110cc576101008083540402835291602001916110f5565b820191905f5260205f20905b8154815290600101906020018083116110d857829003601f168201915b50505050509550848054611108906146d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611134906146d2565b801561117f5780601f106111565761010080835404028352916020019161117f565b820191905f5260205f20905b81548152906001019060200180831161116257829003601f168201915b50505050509450955095509550955095509550909192939495565b601a546001600160a01b031633146111c45760405162461bcd60e51b8152600401610c2f90614698565b6014805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b5f610d1e33848461120c3388612051565b0161233a565b601a546001600160a01b0316331461123c5760405162461bcd60e51b8152600401610c2f90614698565b60145462010000900460ff1615611251575f80fd5b62ffffff8116158061127c575060648162ffffff161015801561127c5750620186a062ffffff821611155b611284575f80fd5b61128d81612dd4565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b601a546001600160a01b031633146112f35760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff1615611309575f80fd5b60018262ffffff161015801561132657506103e88262ffffff1611155b6113615760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c2f565b8162ffffff168162ffffff161015801561138257506103e88162ffffff1611155b6113bd5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c2f565b6113c78282612e77565b5050565b601a546001600160a01b031633146113f55760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff161561140b575f80fd5b6015546001600160a01b0382811691161480159061142a57505f601154115b156114695760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b6044820152606401610c2f565b61100c81612ed8565b5f61147c336119ce565b905090565b6006545f9062010000900460ff161561149b57505f919050565b6001600160a01b0382163014806114c957506001600160a01b0382165f9081526002602052604090205460ff165b806114e157506017546001600160a01b038381169116145b806114f957506016546001600160a01b038381169116145b611575576001600160a01b0382165f90815260036020526040902054610100900460ff1680611549575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b61156157600654600160801b900462ffffff16610d22565b600654600160c81b900462ffffff16610d22565b5f92915050565b601a545f906001600160a01b031633146115a85760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff16156115be575f80fd5b6115c88383613099565b9392505050565b60408051600580825260c08201909252606091816020015b6115ef6140c6565b8152602001906001900390816115e75790505090505f5b60058160ff16101561175c576040805160808101825260ff83165f81815260046020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611663579050505050918352505060ff83165f9081526004602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff16815260200190600301906020826002010492830192600103820291508084116116d75750505092845250505060ff83165f8181526004602090815260409091206003015492019190915283518491908110611749576117496146be565b6020908102919091010152600101611606565b5090565b601a546001600160a01b0316331461178a5760405162461bcd60e51b8152600401610c2f90614698565b6014805464ffffffffff19166401010101011790556117a85f61337a565b565b60065460ff1680156117c45750600654610100900460ff16155b80156117da57506006546301000000900460ff16155b6117e2575f80fd5b6117a85f6133cb565b601a546001600160a01b031633146118155760405162461bcd60e51b8152600401610c2f90614698565b6014805463ff000000191663010000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b601a546001600160a01b0316331461187c5760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff1615611892575f80fd5b600754600160381b900463ffffffff16156118e15760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610c2f565b600780546affffffff0000000000000019164263ffffffff16600160381b02179055565b5f61147c335b5f6001600160a01b03821630148061193a57506001600160a01b0382165f9081526002602052604090205460ff165b8061195257506017546001600160a01b038381169116145b611575576001600160a01b0382165f90815260036020526040902054610100900460ff16806119a2575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b6119ba57600654600160501b900462ffffff16610d22565b600654600160981b900462ffffff16610d22565b6006545f9062010000900460ff16156119e857505f919050565b6001600160a01b038216301480611a1657506001600160a01b0382165f9081526002602052604090205460ff165b80611a2e57506017546001600160a01b038381169116145b611575576001600160a01b0382165f90815260036020526040902054610100900460ff1680611a7e575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611a9657600654600160681b900462ffffff16610d22565b600654600160b01b900462ffffff16610d22565b6060601c8054610c91906146d2565b601a546001600160a01b0316331480611ae05750335f9081526002602052604090205460ff165b611afc5760405162461bcd60e51b8152600401610c2f90614698565b600654610100900460ff16158015611b1e57506006546301000000900460ff16155b611b26575f80fd5b6117a86138d7565b5f80611b3a3385612051565b905082811015611b815760405162461bcd60e51b81526020600482015260126024820152714e6567617469766520616c6c6f77616e636560701b6044820152606401610c2f565b610f06338585840361233a565b601a546001600160a01b0316331480611bb55750335f9081526002602052604090205460ff165b611bd15760405162461bcd60e51b8152600401610c2f90614698565b8080611bdf575060065460ff165b8015611bf35750600654610100900460ff16155b8015611c0957506006546301000000900460ff16155b611c11575f80fd5b61100c816133cb565b601a546001600160a01b03163314611c445760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615611c5a575f80fd5b60068054911515620100000262ff000019909216919091179055565b5f610d1e33848461279f565b601a546001600160a01b03163314611cac5760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615611cc2575f80fd5b6001600160a01b03165f908152600360205260409020805461ff0019169055565b601a546001600160a01b03163314611d0d5760405162461bcd60e51b8152600401610c2f90614698565b6014805462ff00001916620100001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b601a546001600160a01b03163314611d725760405162461bcd60e51b8152600401610c2f90614698565b6014805464ff000000001916600160201b1790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f61147c33611481565b42841015611dfe5760405162461bcd60e51b815260206004820152601160248201527045787069726564207369676e617475726560781b6044820152606401610c2f565b601d546001600160a01b038881165f818152601e602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa158015611f16573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590611f4c5750886001600160a01b0316816001600160a01b0316145b611f8c5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610c2f565b5050611f9987878761233a565b50505050505050565b601a546001600160a01b03163314611fcc5760405162461bcd60e51b8152600401610c2f90614698565b601454610100900460ff1615611fe0575f80fd5b62ffffff8116158061200b575060648162ffffff161015801561200b5750620186a062ffffff821611155b612013575f80fd5b61201c81613a50565b60405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda195906020016112be565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b601a546001600160a01b031633146120a55760405162461bcd60e51b8152600401610c2f90614698565b6014805461ff0019166101001790556040517fcc2f10fb1214ece03bcb178c4d75943daee74aff93182bfb58ba9b8ef5d8c5aa905f90a1565b601a546001600160a01b031633146121085760405162461bcd60e51b8152600401610c2f90614698565b60185460155447915f916001600160a01b0390811691161461212a575f61212e565b6012545b9050828282101561213f5781612141565b825b830310156121615760405162461bcd60e51b8152600401610c2f9061471b565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146121ac576040519150601f19603f3d011682016040523d82523d5f602084013e6121b1565b606091505b50509050806121be575f80fd5b505050565b601a546001600160a01b031633146121ed5760405162461bcd60e51b8152600401610c2f90614698565b6001600160a01b0381166121ff575f80fd5b61100c8161337a565b601a546001600160a01b031633146122325760405162461bcd60e51b8152600401610c2f90614698565b6113c782825b60145460ff1615612247575f80fd5b6001600160a01b038216612259575f80fd5b6016546001600160a01b0383811691161480159061228557506017546001600160a01b03838116911614155b6122dc5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610c2f565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff16106123aa575f80fd5b6001600160a01b03831630148015906123ce57506001600160a01b03831661dead14155b80156123e257506001600160a01b03831615155b6123ea575f80fd5b60ff84165f90815260046020908152604091829020600181018054865160068054600160501b80820462ffffff908116958116909403949094018316840262ffffff60501b198216811780845586548c8a0151600160681b928390048716630100000092839004881690910301861690910265ffffffffffff60501b1990931662ffffff60681b19909216919091179190911780835594548a890151600160801b808804861666010000000000009384900487169092039190910185160262ffffff60801b19871681178085556002890180548d51600160981b938490048916918916900301871690910265ffffffffffff60801b1990981662ffffff60981b1990921691909117969096178084558654988b0151600160b01b808304871694909a048616900392909201841690970262ffffff60b01b19821681178084559554988a015165ffffffffffff60b01b1990921662ffffff60c81b1990911617969097048216909603600160c81b938490048216018116909202939093179384905590926161a892900416118015906125de57506006546161a8600160681b90910462ffffff16118015906125af57506006546161a8600160801b90910462ffffff1611155b80156125de57506006546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b6126155760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b6044820152606401610c2f565b600654620186a0600160981b90910462ffffff16118015906126495750600654620186a0600160b01b90910462ffffff1611155b80156126675750600654620186a0600160c81b90910462ffffff1611155b6126a55760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642050656e616c747960881b6044820152606401610c2f565b8054610100600160a81b0319166101006001600160a01b038616021781556126d260018201846003614101565b506126e260028201836003614101565b50805460ff166126f857805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405161272d949392919061475f565b60405180910390a15050505050565b5f6127478484612051565b9050818110156127925760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610c2f565b610e9d848484840361233a565b6006546301000000900460ff161580156127c15750600654610100900460ff16155b80156127f457506017546001600160a01b038481169116148015906127f457506016546001600160a01b03848116911614155b1561280a576128025f6133cb565b61280a6138d7565b5f8111801561283157506001600160a01b0383165f9081526002602052604090205460ff16155b801561285557506001600160a01b0382165f9081526002602052604090205460ff16155b801561286a57506001600160a01b0383163014155b801561287f57506001600160a01b0382163014155b801561289957506016546001600160a01b03838116911614155b15612d75576017546001600160a01b038481169116148015906128ca57506017546001600160a01b03838116911614155b8061291357506017546001600160a01b03848116911614806128f957506017546001600160a01b038381169116145b80156129135750600754600160381b900463ffffffff1615155b6129525760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610c2f565b600954158061296357506009548111155b61299f5760405162461bcd60e51b815260206004820152600d60248201526c08af0c6cacac8e640dac2f0a8f609b1b6044820152606401610c2f565b600a5415806129b657506001600160a01b03821630145b806129e557506017546001600160a01b03838116911614806129e557506016546001600160a01b038381169116145b80612a0b5750600a546001600160a01b0383165f90815260208190526040902054820111155b612a4c5760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617842616c616e636560701b6044820152606401610c2f565b60065462010000900460ff16158015612a6f57506006546301000000900460ff16155b8015612a835750600654610100900460ff16155b15612d75576017545f9081906001600160a01b0386811691161480612ab557506017546001600160a01b038581169116145b15612adc576017546001600160a01b03868116911614612ad6576002612ad9565b60015b90505b5f8160ff16600114612aee5785612af0565b845b60075490915063ffffffff428116600160781b83048216600160381b9093048216929092011610801590612b4157506001600160a01b0381165f90815260036020526040902054610100900460ff16155b15612b6b576001600160a01b0381165f908152600360205260409020805461ff0019166101001790555b5f5b60058160ff161015612d5c575f808460ff1611612bf8576001600160a01b0383165f90815260036020526040902054610100900460ff16612bde5760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16612cc0565b60ff82165f90815260046020526040812060020190612bbe565b8360ff16600114612c5e576001600160a01b0383165f90815260036020526040902054610100900460ff16612c425760ff82165f9081526004602052604090206001016002612bbe565b60ff82165f908152600460205260409020600290810190612bbe565b6001600160a01b0383165f90815260036020526040902054610100900460ff16612c9e5760ff82165f908152600460205260409020600190810190612bbe565b60ff82165f908152600460205260409020600201546301000000900462ffffff165b62ffffff169050805f03612cd45750612d54565b620186a086820204612ce7893083613af0565b60175460ff84165f908152600460205260409020546001600160a01b0391821661010090910490911603612d2257600d805482019055612d4d565b60ff83165f9081526004602052604090206003018054820190556010805482019055600f8054820190555b9490940193505b600101612b6d565b508215612d7157600e80548401905592829003925b5050505b6121be838383613af0565b6007805463ffffffff60781b1916600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020016112be565b6006805469ffffff000000000000001916600160381b62ffffff841690810291909117909155612e04575f612e1a565b612e1a6008548262ffffff16620186a091020490565b600a557f000000000000000000000000000000000000000000000000000000000000000061100c5760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020016112be565b6006805462ffffff60e01b1916600160e01b62ffffff858116918202929092179092556007805462ffffff1916918416919091179055600854612ebe91620186a091020490565b600b55600854620186a062ffffff929092160204600c5550565b7f0000000000000000000000000000000000000000000000000000000000000000158015612f0d57506001600160a01b038116155b80612f2057506001600160a01b03811630145b80612f3857506018546001600160a01b038281169116145b8061302957506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015612f85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa9919061479c565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015612ff9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061301d919061479c565b6001600160a01b031614155b61305f5760405162461bcd60e51b81526020600482015260076024820152662737902830b4b960c91b6044820152606401610c2f565b6001600160a01b038116156130745780613076565b305b601580546001600160a01b0319166001600160a01b039290921691909117905550565b5f6001600160a01b0383166130ac575f80fd5b6016546001600160a01b038481169116146132ef575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613102573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613126919061479c565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613165573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613189919061479c565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156131d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131fd919061479c565b90506001600160a01b03811661327f576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015613258573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061327c919061479c565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b0383811691161461332057601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fd0cdc441c8110da5df2f4a64e1cee8a6794d8016c982757bb5d8971cde6b6bf39060200160405180910390a3506017546001600160a01b031692915050565b601a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6006805461ff001916610100179055801580156133eb575060065460ff16155b6138c9575f80600d54116133ff575f613413565b6002600d5481613411576134116147b7565b045b6018546015549192505f916001600160a01b03908116911614613436575f61343a565b6010545b90508181018315801561344e5750600c5481115b156134b7575f8311613460575f613486565b600c546134869082620186a086028161347b5761347b6147b7565b04620186a091020490565b92505f8211613495575f6134b0565b600c546134b09082620186a085028161347b5761347b6147b7565b9150508181015b83806134c55750600b548110155b80156134e15750305f9081526020819052604090205481840111155b156137df5760408051600280825260608201835247925f92919060208301908036833701905050905030815f8151811061351d5761351d6146be565b6001600160a01b03928316602091820292909201015260185482519116908290600190811061354e5761354e6146be565b6001600160a01b039283166020918202929092010152601654613574913091168561233a565b60165460405163791ac94760e01b81526001600160a01b039091169063791ac947906135ac9086905f908690309042906004016147cb565b5f604051808303815f87803b1580156135c3575f80fd5b505af19250505080156135d4575060015b6135f5576016546135f09030906001600160a01b03165f61233a565b6137dc565b600d541561360757600d805486900390555b604080518481524784900360208201819052917f9029ea20319a59447bd88162928acbbbe0955dead46655370929b794e46e8d96910160405180910390a180156137da575f6136648286620186a08a028161347b5761347b6147b7565b6018546015549192506001600160a01b039081169116036136b2576136978286620186a089028161347b5761347b6147b7565b60128054909101905560118054870190556010805487900390555b5f871180156136c057505f81115b156137d8576016546136dd9030906001600160a01b03168961233a565b60165460195460405163f305d71960e01b8152306004820152602481018a90525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613769575060408051601f3d908101601f191682019092526137669181019061483c565b60015b61378a576016546137859030906001600160a01b03165f61233a565b6137d8565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600d80548990039055505b505b505b50505b6015546001600160a01b0316301480159061380b57506018546015546001600160a01b03908116911614155b15613898576010549150831580156138245750600c5482115b1561382f57600c5491505b838061383d5750600b548210155b80156138575750305f908152602081905260409020548211155b15613898576015545f90613874906001600160a01b031684613c0b565b9050801561389657601380548201905560118054840190556010805484900390555b505b5050506138a863ffffffff421690565b6007600b6101000a81548163ffffffff021916908363ffffffff1602179055505b506006805461ff0019169055565b6006805463ff00000019166301000000179055600f5415613a41575f805b60058160ff1610156139dd5760ff81165f90815260046020526040902080546003909101546101009091046001600160a01b031690158061394357506017546001600160a01b038281169116145b1561394e57506139d5565b6015545f9061399c906001600160a01b0316301461396e57601154613972565b6010545b600f5460ff86165f90815260046020526040902060030154620186a0028161347b5761347b6147b7565b90505f6139a98383613e82565b905080156139d15760ff84165f90815260046020526040902060030180548290039055938401935b5050505b6001016138f5565b506007805466ffffffff0000001916630100000063ffffffff4216021790558015613a0c57600f805482900390555b6040518181527fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979060200160405180910390a1505b6006805463ff00000019169055565b6006805466ffffff000000001916600160201b62ffffff841690810291909117909155613a7d575f613a93565b613a936008548262ffffff16620186a091020490565b6009557f000000000000000000000000000000000000000000000000000000000000000061100c5760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda195906020016112be565b6001600160a01b03831615801590613b1057506001600160a01b03821615155b613b5c5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610c2f565b6001600160a01b0383165f90815260208190526040902054811115613b935760405162461bcd60e51b8152600401610c2f9061471b565b8015613bc6576001600160a01b038084165f90815260208190526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161238e91815260200190565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613c51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c759190614704565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f81518110613cae57613cae6146be565b6001600160a01b039283166020918202929092010152601854825191169082906001908110613cdf57613cdf6146be565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600281518110613d1357613d136146be565b6001600160a01b039283166020918202929092010152601654613d39913091168661233a565b601654604051635c11d79560e01b81526001600160a01b0390911690635c11d79590613d719087905f908690309042906004016147cb565b5f604051808303815f87803b158015613d88575f80fd5b505af1925050508015613d99575060015b613dba57601654613db59030906001600160a01b03165f61233a565b613e7a565b6040516370a0823160e01b815230600482015282906001600160a01b038716906370a0823190602401602060405180830381865afa158015613dfe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e229190614704565b613e2c9190614867565b604080516001600160a01b0388168152602081018790529081018290529093507fa82a03c1e8613c6192a82386fbb3690070528b0dd8bcae8a5c82d9ef937d7f769060600160405180910390a15b505092915050565b5f815f03613e9157505f610d22565b601554306001600160a01b0390911603613f65575f600a54118015613ed05750600a546001600160a01b0384165f908152602081905260409020548301115b8015613ef457506001600160a01b0383165f9081526002602052604090205460ff16155b15613f4c576001600160a01b0383165f90815260208190526040902054600a5411613f1f575f613f3c565b6001600160a01b0383165f90815260208190526040902054600a54035b9150815f03613f4c57505f610d22565b613f57308484613af0565b6010805483900390556140c0565b6011545f90620186a0840281613f7d57613f7d6147b7565b6018546015549290910492505f916001600160a01b0391821691160361402057601254620186a09083020490505f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114613ff8576040519150601f19603f3d011682016040523d82523d5f602084013e613ffd565b606091505b5050905080614011575f9350505050610d22565b506012805482900390556140b4565b601354620186a09083020460155460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb906044016020604051808303815f875af192505050801561409b575060408051601f3d908101601f1916820190925261409891810190614744565b60015b6140a9575f92505050610d22565b506013805482900390555b50506011805483900390555b50919050565b60405180608001604052805f6001600160a01b031681526020016140e8614195565b81526020016140f5614195565b81526020015f81525090565b600183019183908215614189579160200282015f5b8382111561415857835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302614116565b80156141875782816101000a81549062ffffff0219169055600301602081600201049283019260010302614158565b505b5061175c9291506141b3565b60405180606001604052806003906020820280368337509192915050565b5b8082111561175c575f81556001016141b4565b801515811461100c575f80fd5b5f805f604084860312156141e6575f80fd5b833567ffffffffffffffff808211156141fd575f80fd5b818601915086601f830112614210575f80fd5b81358181111561421e575f80fd5b8760208260051b8501011115614232575f80fd5b60209283019550935050840135614248816141c7565b809150509250925092565b5f81518084525f5b818110156142775760208185018101518683018201520161425b565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6115c86020830184614253565b6001600160a01b038116811461100c575f80fd5b5f80604083850312156142cd575f80fd5b82356142d8816142a8565b946020939093013593505050565b5f805f606084860312156142f8575f80fd5b8335614303816142a8565b92506020840135614313816142a8565b929592945050506040919091013590565b803560ff81168114614334575f80fd5b919050565b803562ffffff81168114614334575f80fd5b5f82601f83011261435a575f80fd5b6040516060810181811067ffffffffffffffff8211171561438957634e487b7160e01b5f52604160045260245ffd5b60405280606084018581111561439d575f80fd5b845b818110156143be576143b081614339565b83526020928301920161439f565b509195945050505050565b5f805f8061010085870312156143dd575f80fd5b6143e685614324565b935060208501356143f6816142a8565b9250614405866040870161434b565b91506144148660a0870161434b565b905092959194509250565b5f6020828403121561442f575f80fd5b81356115c8816141c7565b5f6020828403121561444a575f80fd5b813563ffffffff811681146115c8575f80fd5b60c081525f61446f60c0830189614253565b82810360208401526144818189614253565b60ff881660408501526001600160a01b03871660608501526080840186905283810360a085015290506144b48185614253565b9998505050505050505050565b5f602082840312156144d1575f80fd5b81356115c8816142a8565b5f602082840312156144ec575f80fd5b6115c882614339565b5f8060408385031215614506575f80fd5b61450f83614339565b915061451d60208401614339565b90509250929050565b5f8060408385031215614537575f80fd5b8235614542816142a8565b91506020830135614552816142a8565b809150509250929050565b805f5b6003811015610e9d57815162ffffff16845260209384019390910190600101614560565b602080825282518282018190525f919060409081850190868401855b828110156145f657815180516001600160a01b03168552868101516145c78887018261455d565b50858101516145d9608087018261455d565b506060015160e085015261010090930192908501906001016145a0565b5091979650505050505050565b5f805f805f805f60e0888a031215614619575f80fd5b8735614624816142a8565b96506020880135614634816142a8565b9550604088013594506060880135935061465060808901614324565b925060a0880135915060c0880135905092959891949750929550565b5f806040838503121561467d575f80fd5b8235614688816142a8565b91506020830135614552816141c7565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806146e657607f821691505b6020821081036140c057634e487b7160e01b5f52602260045260245ffd5b5f60208284031215614714575f80fd5b5051919050565b6020808252600f908201526e457863656564732062616c616e636560881b604082015260600190565b5f60208284031215614754575f80fd5b81516115c8816141c7565b60ff851681526001600160a01b03841660208201526101008101614786604083018561455d565b61479360a083018461455d565b95945050505050565b5f602082840312156147ac575f80fd5b81516115c8816142a8565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b8181101561481b5784516001600160a01b0316835293830193918301916001016147f6565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f6060848603121561484e575f80fd5b8351925060208401519150604084015190509250925092565b81810381811115610d2257634e487b7160e01b5f52601160045260245ffdfea2646970667358221220ebd6d5bde853878129cf1b2e7b81d3337532f9c00c0ef90c767bdaf5d9b3a50964736f6c63430008180033000000000000000000000000d74c50c5ffe75aff4f21e384e4073d8b89a89e43

Deployed Bytecode

0x6080604052600436106103a1575f3560e01c806377004851116101e4578063be5e49b21161010b578063da88d01a116100a4578063f2fde38b11610076578063f2fde38b14610b4e578063f3dc4f4814610b6d578063f59c370814610ba9578063f7c3b38f14610bc8578063f7de0e5714610be857005b8063da88d01a14610add578063dd62ed3e14610afc578063e92871f614610b1b578063f2cda82e14610b2f57005b8063cc1776d3116100dd578063cc1776d314610a33578063d232c22014610a47578063d505accf14610aaa578063d8454a8214610ac957005b8063be5e49b2146109cf578063c2921583146109ee578063c77e006d14610a0b578063c78fe0d414610a1f57005b806395d89b411161017d578063a4d8971a1161014f578063a4d8971a14610955578063a5596b4f14610974578063a9059cbb14610993578063b81a0145146109b257005b806395d89b41146108fa57806396ce07951461090e5780639c5ef8d714610922578063a457c2d71461093657005b80638bf1acff116101b65780638bf1acff1461088b5780638d8350ca1461089f5780638da5cb5b146108be57806395101f90146108db57005b8063770048511461081b5780637ecebe001461082f5780638324c3b9146108635780638a8c523c1461087757005b806339509351116102c85780635a0d4f88116102615780636f05be97116102335780636f05be971461079257806370a08231146107b3578063715018a6146107e757806375de1496146107fb57005b80635a0d4f88146106f25780635b90fe66146107235780635f6417581461075457806368a5d4141461077357005b8063487d1ce51161029a578063487d1ce5146106675780634b7d9db4146106865780634f7041a51461069d57806354fd4d50146106c557005b806339509351146105d35780633af32abf146105f25780633ed8a1691461062957806344b691ff1461064857005b806323b872dd1161033a57806332acf3de1161030c57806332acf3de146105505780633644e51514610585578063370158ea1461059957806339137f8b146105bf57005b806323b872dd146104b65780632623e975146104d55780632984207a146104f4578063313ce5671461051357005b8063095ea7b311610373578063095ea7b31461043b5780631171bda91461045a57806318160ddd14610479578063186488a81461049757005b806301b38af5146103aa578063064a59d0146103c957806306fdde03146103fd57806307e9652c1461041e57005b366103a857005b005b3480156103b5575f80fd5b506103a86103c43660046141d4565b610c05565b3480156103d4575f80fd5b50600754600160381b900463ffffffff1615155b60405190151581526020015b60405180910390f35b348015610408575f80fd5b50610411610c82565b6040516103f49190614296565b348015610429575f80fd5b5060065462010000900460ff166103e8565b348015610446575f80fd5b506103e86104553660046142bc565b610d12565b348015610465575f80fd5b506103a86104743660046142e6565b610d28565b348015610484575f80fd5b506008545b6040519081526020016103f4565b3480156104a2575f80fd5b506103a86104b13660046143c9565b610ea3565b3480156104c1575f80fd5b506103e86104d03660046142e6565b610eef565b3480156104e0575f80fd5b506103a86104ef36600461441f565b610f10565b3480156104ff575f80fd5b506103a861050e36600461443a565b610faf565b34801561051e575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000121681526020016103f4565b34801561055b575f80fd5b5060065460075460408051600160e01b90930462ffffff90811684529091166020830152016103f4565b348015610590575f80fd5b50601d54610489565b3480156105a4575f80fd5b506105ad61100f565b6040516103f49695949392919061445d565b3480156105ca575f80fd5b506103a861119a565b3480156105de575f80fd5b506103e86105ed3660046142bc565b6111fb565b3480156105fd575f80fd5b506103e861060c3660046144c1565b6001600160a01b03165f9081526002602052604090205460ff1690565b348015610634575f80fd5b506103a86106433660046144dc565b611212565b348015610653575f80fd5b506103a86106623660046144f5565b6112c9565b348015610672575f80fd5b506103a86106813660046144c1565b6113cb565b348015610691575f80fd5b5060065460ff166103e8565b3480156106a8575f80fd5b506106b1611472565b60405162ffffff90911681526020016103f4565b3480156106d0575f80fd5b50604080518082019091526005815264312e302e3160d81b6020820152610411565b3480156106fd575f80fd5b506015546001600160a01b03165b6040516001600160a01b0390911681526020016103f4565b34801561072e575f80fd5b50600754600160781b900463ffffffff1660405163ffffffff90911681526020016103f4565b34801561075f575f80fd5b506106b161076e3660046144c1565b611481565b34801561077e575f80fd5b5061070b61078d366004614526565b61157c565b34801561079d575f80fd5b506107a66115cf565b6040516103f49190614584565b3480156107be575f80fd5b506104896107cd3660046144c1565b6001600160a01b03165f9081526020819052604090205490565b3480156107f2575f80fd5b506103a8611760565b348015610806575f80fd5b50600654600160381b900462ffffff166106b1565b348015610826575f80fd5b506103a86117aa565b34801561083a575f80fd5b506104896108493660046144c1565b6001600160a01b03165f908152601e602052604090205490565b34801561086e575f80fd5b506103a86117eb565b348015610882575f80fd5b506103a8611852565b348015610896575f80fd5b506106b1611905565b3480156108aa575f80fd5b506106b16108b93660046144c1565b61190b565b3480156108c9575f80fd5b50601a546001600160a01b031661070b565b3480156108e6575f80fd5b506106b16108f53660046144c1565b6119ce565b348015610905575f80fd5b50610411611aaa565b348015610919575f80fd5b506103e86106b1565b34801561092d575f80fd5b506103a8611ab9565b348015610941575f80fd5b506103e86109503660046142bc565b611b2e565b348015610960575f80fd5b506103a861096f36600461441f565b611b8e565b34801561097f575f80fd5b506103a861098e36600461441f565b611c1a565b34801561099e575f80fd5b506103e86109ad3660046142bc565b611c76565b3480156109bd575f80fd5b506019546001600160a01b031661070b565b3480156109da575f80fd5b506103a86109e93660046144c1565b611c82565b3480156109f9575f80fd5b506017546001600160a01b031661070b565b348015610a16575f80fd5b506103a8611ce3565b348015610a2a575f80fd5b506103a8611d48565b348015610a3e575f80fd5b506106b1611db0565b348015610a52575f80fd5b506014546040805160ff8084161515825261010084048116151560208301526201000084048116151592820192909252600160201b83048216151560608201526301000000909204161515608082015260a0016103f4565b348015610ab5575f80fd5b506103a8610ac4366004614603565b611dba565b348015610ad4575f80fd5b50600e54610489565b348015610ae8575f80fd5b506103a8610af73660046144dc565b611fa2565b348015610b07575f80fd5b50610489610b16366004614526565b612051565b348015610b26575f80fd5b506103a861207b565b348015610b3a575f80fd5b506103a8610b493660046142bc565b6120de565b348015610b59575f80fd5b506103a8610b683660046144c1565b6121c3565b348015610b78575f80fd5b506103e8610b873660046144c1565b6001600160a01b03165f90815260036020526040902054610100900460ff1690565b348015610bb4575f80fd5b506103a8610bc336600461466c565b612208565b348015610bd3575f80fd5b50600654600160201b900462ffffff166106b1565b348015610bf3575f80fd5b506016546001600160a01b031661070b565b601a546001600160a01b03163314610c385760405162461bcd60e51b8152600401610c2f90614698565b60405180910390fd5b815f5b81811015610c7b57610c73858583818110610c5857610c586146be565b9050602002016020810190610c6d91906144c1565b84612238565b600101610c3b565b5050505050565b6060601b8054610c91906146d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbd906146d2565b8015610d085780601f10610cdf57610100808354040283529160200191610d08565b820191905f5260205f20905b815481529060010190602001808311610ceb57829003601f168201915b5050505050905090565b5f610d1e33848461233a565b5060015b92915050565b601a546001600160a01b03163314610d525760405162461bcd60e51b8152600401610c2f90614698565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610d96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dba9190614704565b90505f6001600160a01b0385163014610df0576015546001600160a01b03868116911614610de8575f610df8565b601354610df8565b600d54601054015b90508282821015610e095781610e0b565b825b83031015610e2b5760405162461bcd60e51b8152600401610c2f9061471b565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610e79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9d9190614744565b50505050565b601a546001600160a01b03163314610ecd5760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615610ee3575f80fd5b610e9d8484848461239b565b5f610efb84338461273c565b610f0684848461279f565b5060019392505050565b601a546001600160a01b03163314610f3a5760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff1615610f50575f80fd5b801580610f6757506016546001600160a01b031615155b610f9c5760405162461bcd60e51b815260206004820152600660248201526509cde40888ab60d31b6044820152606401610c2f565b6006805460ff1916911515919091179055565b601a546001600160a01b03163314610fd95760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615610fef575f80fd5b6102588163ffffffff161115611003575f80fd5b61100c81612d80565b50565b6060805f805f6060601b601c7f0000000000000000000000000000000000000000000000000000000000000012601a5f9054906101000a90046001600160a01b031660085460405180604001604052806005815260200164312e302e3160d81b81525085805461107e906146d2565b80601f01602080910402602001604051908101604052809291908181526020018280546110aa906146d2565b80156110f55780601f106110cc576101008083540402835291602001916110f5565b820191905f5260205f20905b8154815290600101906020018083116110d857829003601f168201915b50505050509550848054611108906146d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611134906146d2565b801561117f5780601f106111565761010080835404028352916020019161117f565b820191905f5260205f20905b81548152906001019060200180831161116257829003601f168201915b50505050509450955095509550955095509550909192939495565b601a546001600160a01b031633146111c45760405162461bcd60e51b8152600401610c2f90614698565b6014805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b5f610d1e33848461120c3388612051565b0161233a565b601a546001600160a01b0316331461123c5760405162461bcd60e51b8152600401610c2f90614698565b60145462010000900460ff1615611251575f80fd5b62ffffff8116158061127c575060648162ffffff161015801561127c5750620186a062ffffff821611155b611284575f80fd5b61128d81612dd4565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b601a546001600160a01b031633146112f35760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff1615611309575f80fd5b60018262ffffff161015801561132657506103e88262ffffff1611155b6113615760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c2f565b8162ffffff168162ffffff161015801561138257506103e88162ffffff1611155b6113bd5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c2f565b6113c78282612e77565b5050565b601a546001600160a01b031633146113f55760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff161561140b575f80fd5b6015546001600160a01b0382811691161480159061142a57505f601154115b156114695760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b6044820152606401610c2f565b61100c81612ed8565b5f61147c336119ce565b905090565b6006545f9062010000900460ff161561149b57505f919050565b6001600160a01b0382163014806114c957506001600160a01b0382165f9081526002602052604090205460ff165b806114e157506017546001600160a01b038381169116145b806114f957506016546001600160a01b038381169116145b611575576001600160a01b0382165f90815260036020526040902054610100900460ff1680611549575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b61156157600654600160801b900462ffffff16610d22565b600654600160c81b900462ffffff16610d22565b5f92915050565b601a545f906001600160a01b031633146115a85760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff16156115be575f80fd5b6115c88383613099565b9392505050565b60408051600580825260c08201909252606091816020015b6115ef6140c6565b8152602001906001900390816115e75790505090505f5b60058160ff16101561175c576040805160808101825260ff83165f81815260046020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611663579050505050918352505060ff83165f9081526004602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff16815260200190600301906020826002010492830192600103820291508084116116d75750505092845250505060ff83165f8181526004602090815260409091206003015492019190915283518491908110611749576117496146be565b6020908102919091010152600101611606565b5090565b601a546001600160a01b0316331461178a5760405162461bcd60e51b8152600401610c2f90614698565b6014805464ffffffffff19166401010101011790556117a85f61337a565b565b60065460ff1680156117c45750600654610100900460ff16155b80156117da57506006546301000000900460ff16155b6117e2575f80fd5b6117a85f6133cb565b601a546001600160a01b031633146118155760405162461bcd60e51b8152600401610c2f90614698565b6014805463ff000000191663010000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b601a546001600160a01b0316331461187c5760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff1615611892575f80fd5b600754600160381b900463ffffffff16156118e15760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610c2f565b600780546affffffff0000000000000019164263ffffffff16600160381b02179055565b5f61147c335b5f6001600160a01b03821630148061193a57506001600160a01b0382165f9081526002602052604090205460ff165b8061195257506017546001600160a01b038381169116145b611575576001600160a01b0382165f90815260036020526040902054610100900460ff16806119a2575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b6119ba57600654600160501b900462ffffff16610d22565b600654600160981b900462ffffff16610d22565b6006545f9062010000900460ff16156119e857505f919050565b6001600160a01b038216301480611a1657506001600160a01b0382165f9081526002602052604090205460ff165b80611a2e57506017546001600160a01b038381169116145b611575576001600160a01b0382165f90815260036020526040902054610100900460ff1680611a7e575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611a9657600654600160681b900462ffffff16610d22565b600654600160b01b900462ffffff16610d22565b6060601c8054610c91906146d2565b601a546001600160a01b0316331480611ae05750335f9081526002602052604090205460ff165b611afc5760405162461bcd60e51b8152600401610c2f90614698565b600654610100900460ff16158015611b1e57506006546301000000900460ff16155b611b26575f80fd5b6117a86138d7565b5f80611b3a3385612051565b905082811015611b815760405162461bcd60e51b81526020600482015260126024820152714e6567617469766520616c6c6f77616e636560701b6044820152606401610c2f565b610f06338585840361233a565b601a546001600160a01b0316331480611bb55750335f9081526002602052604090205460ff165b611bd15760405162461bcd60e51b8152600401610c2f90614698565b8080611bdf575060065460ff165b8015611bf35750600654610100900460ff16155b8015611c0957506006546301000000900460ff16155b611c11575f80fd5b61100c816133cb565b601a546001600160a01b03163314611c445760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615611c5a575f80fd5b60068054911515620100000262ff000019909216919091179055565b5f610d1e33848461279f565b601a546001600160a01b03163314611cac5760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615611cc2575f80fd5b6001600160a01b03165f908152600360205260409020805461ff0019169055565b601a546001600160a01b03163314611d0d5760405162461bcd60e51b8152600401610c2f90614698565b6014805462ff00001916620100001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b601a546001600160a01b03163314611d725760405162461bcd60e51b8152600401610c2f90614698565b6014805464ff000000001916600160201b1790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f61147c33611481565b42841015611dfe5760405162461bcd60e51b815260206004820152601160248201527045787069726564207369676e617475726560781b6044820152606401610c2f565b601d546001600160a01b038881165f818152601e602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa158015611f16573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590611f4c5750886001600160a01b0316816001600160a01b0316145b611f8c5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610c2f565b5050611f9987878761233a565b50505050505050565b601a546001600160a01b03163314611fcc5760405162461bcd60e51b8152600401610c2f90614698565b601454610100900460ff1615611fe0575f80fd5b62ffffff8116158061200b575060648162ffffff161015801561200b5750620186a062ffffff821611155b612013575f80fd5b61201c81613a50565b60405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda195906020016112be565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b601a546001600160a01b031633146120a55760405162461bcd60e51b8152600401610c2f90614698565b6014805461ff0019166101001790556040517fcc2f10fb1214ece03bcb178c4d75943daee74aff93182bfb58ba9b8ef5d8c5aa905f90a1565b601a546001600160a01b031633146121085760405162461bcd60e51b8152600401610c2f90614698565b60185460155447915f916001600160a01b0390811691161461212a575f61212e565b6012545b9050828282101561213f5781612141565b825b830310156121615760405162461bcd60e51b8152600401610c2f9061471b565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146121ac576040519150601f19603f3d011682016040523d82523d5f602084013e6121b1565b606091505b50509050806121be575f80fd5b505050565b601a546001600160a01b031633146121ed5760405162461bcd60e51b8152600401610c2f90614698565b6001600160a01b0381166121ff575f80fd5b61100c8161337a565b601a546001600160a01b031633146122325760405162461bcd60e51b8152600401610c2f90614698565b6113c782825b60145460ff1615612247575f80fd5b6001600160a01b038216612259575f80fd5b6016546001600160a01b0383811691161480159061228557506017546001600160a01b03838116911614155b6122dc5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610c2f565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff16106123aa575f80fd5b6001600160a01b03831630148015906123ce57506001600160a01b03831661dead14155b80156123e257506001600160a01b03831615155b6123ea575f80fd5b60ff84165f90815260046020908152604091829020600181018054865160068054600160501b80820462ffffff908116958116909403949094018316840262ffffff60501b198216811780845586548c8a0151600160681b928390048716630100000092839004881690910301861690910265ffffffffffff60501b1990931662ffffff60681b19909216919091179190911780835594548a890151600160801b808804861666010000000000009384900487169092039190910185160262ffffff60801b19871681178085556002890180548d51600160981b938490048916918916900301871690910265ffffffffffff60801b1990981662ffffff60981b1990921691909117969096178084558654988b0151600160b01b808304871694909a048616900392909201841690970262ffffff60b01b19821681178084559554988a015165ffffffffffff60b01b1990921662ffffff60c81b1990911617969097048216909603600160c81b938490048216018116909202939093179384905590926161a892900416118015906125de57506006546161a8600160681b90910462ffffff16118015906125af57506006546161a8600160801b90910462ffffff1611155b80156125de57506006546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b6126155760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b6044820152606401610c2f565b600654620186a0600160981b90910462ffffff16118015906126495750600654620186a0600160b01b90910462ffffff1611155b80156126675750600654620186a0600160c81b90910462ffffff1611155b6126a55760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642050656e616c747960881b6044820152606401610c2f565b8054610100600160a81b0319166101006001600160a01b038616021781556126d260018201846003614101565b506126e260028201836003614101565b50805460ff166126f857805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405161272d949392919061475f565b60405180910390a15050505050565b5f6127478484612051565b9050818110156127925760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610c2f565b610e9d848484840361233a565b6006546301000000900460ff161580156127c15750600654610100900460ff16155b80156127f457506017546001600160a01b038481169116148015906127f457506016546001600160a01b03848116911614155b1561280a576128025f6133cb565b61280a6138d7565b5f8111801561283157506001600160a01b0383165f9081526002602052604090205460ff16155b801561285557506001600160a01b0382165f9081526002602052604090205460ff16155b801561286a57506001600160a01b0383163014155b801561287f57506001600160a01b0382163014155b801561289957506016546001600160a01b03838116911614155b15612d75576017546001600160a01b038481169116148015906128ca57506017546001600160a01b03838116911614155b8061291357506017546001600160a01b03848116911614806128f957506017546001600160a01b038381169116145b80156129135750600754600160381b900463ffffffff1615155b6129525760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610c2f565b600954158061296357506009548111155b61299f5760405162461bcd60e51b815260206004820152600d60248201526c08af0c6cacac8e640dac2f0a8f609b1b6044820152606401610c2f565b600a5415806129b657506001600160a01b03821630145b806129e557506017546001600160a01b03838116911614806129e557506016546001600160a01b038381169116145b80612a0b5750600a546001600160a01b0383165f90815260208190526040902054820111155b612a4c5760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617842616c616e636560701b6044820152606401610c2f565b60065462010000900460ff16158015612a6f57506006546301000000900460ff16155b8015612a835750600654610100900460ff16155b15612d75576017545f9081906001600160a01b0386811691161480612ab557506017546001600160a01b038581169116145b15612adc576017546001600160a01b03868116911614612ad6576002612ad9565b60015b90505b5f8160ff16600114612aee5785612af0565b845b60075490915063ffffffff428116600160781b83048216600160381b9093048216929092011610801590612b4157506001600160a01b0381165f90815260036020526040902054610100900460ff16155b15612b6b576001600160a01b0381165f908152600360205260409020805461ff0019166101001790555b5f5b60058160ff161015612d5c575f808460ff1611612bf8576001600160a01b0383165f90815260036020526040902054610100900460ff16612bde5760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16612cc0565b60ff82165f90815260046020526040812060020190612bbe565b8360ff16600114612c5e576001600160a01b0383165f90815260036020526040902054610100900460ff16612c425760ff82165f9081526004602052604090206001016002612bbe565b60ff82165f908152600460205260409020600290810190612bbe565b6001600160a01b0383165f90815260036020526040902054610100900460ff16612c9e5760ff82165f908152600460205260409020600190810190612bbe565b60ff82165f908152600460205260409020600201546301000000900462ffffff165b62ffffff169050805f03612cd45750612d54565b620186a086820204612ce7893083613af0565b60175460ff84165f908152600460205260409020546001600160a01b0391821661010090910490911603612d2257600d805482019055612d4d565b60ff83165f9081526004602052604090206003018054820190556010805482019055600f8054820190555b9490940193505b600101612b6d565b508215612d7157600e80548401905592829003925b5050505b6121be838383613af0565b6007805463ffffffff60781b1916600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020016112be565b6006805469ffffff000000000000001916600160381b62ffffff841690810291909117909155612e04575f612e1a565b612e1a6008548262ffffff16620186a091020490565b600a557f000000000000000000000000000000000000000000000000000000000000000161100c5760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020016112be565b6006805462ffffff60e01b1916600160e01b62ffffff858116918202929092179092556007805462ffffff1916918416919091179055600854612ebe91620186a091020490565b600b55600854620186a062ffffff929092160204600c5550565b7f0000000000000000000000000000000000000000000000000000000000000001158015612f0d57506001600160a01b038116155b80612f2057506001600160a01b03811630145b80612f3857506018546001600160a01b038281169116145b8061302957506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015612f85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa9919061479c565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015612ff9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061301d919061479c565b6001600160a01b031614155b61305f5760405162461bcd60e51b81526020600482015260076024820152662737902830b4b960c91b6044820152606401610c2f565b6001600160a01b038116156130745780613076565b305b601580546001600160a01b0319166001600160a01b039290921691909117905550565b5f6001600160a01b0383166130ac575f80fd5b6016546001600160a01b038481169116146132ef575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613102573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613126919061479c565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613165573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613189919061479c565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156131d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131fd919061479c565b90506001600160a01b03811661327f576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015613258573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061327c919061479c565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b0383811691161461332057601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fd0cdc441c8110da5df2f4a64e1cee8a6794d8016c982757bb5d8971cde6b6bf39060200160405180910390a3506017546001600160a01b031692915050565b601a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6006805461ff001916610100179055801580156133eb575060065460ff16155b6138c9575f80600d54116133ff575f613413565b6002600d5481613411576134116147b7565b045b6018546015549192505f916001600160a01b03908116911614613436575f61343a565b6010545b90508181018315801561344e5750600c5481115b156134b7575f8311613460575f613486565b600c546134869082620186a086028161347b5761347b6147b7565b04620186a091020490565b92505f8211613495575f6134b0565b600c546134b09082620186a085028161347b5761347b6147b7565b9150508181015b83806134c55750600b548110155b80156134e15750305f9081526020819052604090205481840111155b156137df5760408051600280825260608201835247925f92919060208301908036833701905050905030815f8151811061351d5761351d6146be565b6001600160a01b03928316602091820292909201015260185482519116908290600190811061354e5761354e6146be565b6001600160a01b039283166020918202929092010152601654613574913091168561233a565b60165460405163791ac94760e01b81526001600160a01b039091169063791ac947906135ac9086905f908690309042906004016147cb565b5f604051808303815f87803b1580156135c3575f80fd5b505af19250505080156135d4575060015b6135f5576016546135f09030906001600160a01b03165f61233a565b6137dc565b600d541561360757600d805486900390555b604080518481524784900360208201819052917f9029ea20319a59447bd88162928acbbbe0955dead46655370929b794e46e8d96910160405180910390a180156137da575f6136648286620186a08a028161347b5761347b6147b7565b6018546015549192506001600160a01b039081169116036136b2576136978286620186a089028161347b5761347b6147b7565b60128054909101905560118054870190556010805487900390555b5f871180156136c057505f81115b156137d8576016546136dd9030906001600160a01b03168961233a565b60165460195460405163f305d71960e01b8152306004820152602481018a90525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613769575060408051601f3d908101601f191682019092526137669181019061483c565b60015b61378a576016546137859030906001600160a01b03165f61233a565b6137d8565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600d80548990039055505b505b505b50505b6015546001600160a01b0316301480159061380b57506018546015546001600160a01b03908116911614155b15613898576010549150831580156138245750600c5482115b1561382f57600c5491505b838061383d5750600b548210155b80156138575750305f908152602081905260409020548211155b15613898576015545f90613874906001600160a01b031684613c0b565b9050801561389657601380548201905560118054840190556010805484900390555b505b5050506138a863ffffffff421690565b6007600b6101000a81548163ffffffff021916908363ffffffff1602179055505b506006805461ff0019169055565b6006805463ff00000019166301000000179055600f5415613a41575f805b60058160ff1610156139dd5760ff81165f90815260046020526040902080546003909101546101009091046001600160a01b031690158061394357506017546001600160a01b038281169116145b1561394e57506139d5565b6015545f9061399c906001600160a01b0316301461396e57601154613972565b6010545b600f5460ff86165f90815260046020526040902060030154620186a0028161347b5761347b6147b7565b90505f6139a98383613e82565b905080156139d15760ff84165f90815260046020526040902060030180548290039055938401935b5050505b6001016138f5565b506007805466ffffffff0000001916630100000063ffffffff4216021790558015613a0c57600f805482900390555b6040518181527fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979060200160405180910390a1505b6006805463ff00000019169055565b6006805466ffffff000000001916600160201b62ffffff841690810291909117909155613a7d575f613a93565b613a936008548262ffffff16620186a091020490565b6009557f000000000000000000000000000000000000000000000000000000000000000161100c5760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda195906020016112be565b6001600160a01b03831615801590613b1057506001600160a01b03821615155b613b5c5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610c2f565b6001600160a01b0383165f90815260208190526040902054811115613b935760405162461bcd60e51b8152600401610c2f9061471b565b8015613bc6576001600160a01b038084165f90815260208190526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161238e91815260200190565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613c51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c759190614704565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f81518110613cae57613cae6146be565b6001600160a01b039283166020918202929092010152601854825191169082906001908110613cdf57613cdf6146be565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600281518110613d1357613d136146be565b6001600160a01b039283166020918202929092010152601654613d39913091168661233a565b601654604051635c11d79560e01b81526001600160a01b0390911690635c11d79590613d719087905f908690309042906004016147cb565b5f604051808303815f87803b158015613d88575f80fd5b505af1925050508015613d99575060015b613dba57601654613db59030906001600160a01b03165f61233a565b613e7a565b6040516370a0823160e01b815230600482015282906001600160a01b038716906370a0823190602401602060405180830381865afa158015613dfe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e229190614704565b613e2c9190614867565b604080516001600160a01b0388168152602081018790529081018290529093507fa82a03c1e8613c6192a82386fbb3690070528b0dd8bcae8a5c82d9ef937d7f769060600160405180910390a15b505092915050565b5f815f03613e9157505f610d22565b601554306001600160a01b0390911603613f65575f600a54118015613ed05750600a546001600160a01b0384165f908152602081905260409020548301115b8015613ef457506001600160a01b0383165f9081526002602052604090205460ff16155b15613f4c576001600160a01b0383165f90815260208190526040902054600a5411613f1f575f613f3c565b6001600160a01b0383165f90815260208190526040902054600a54035b9150815f03613f4c57505f610d22565b613f57308484613af0565b6010805483900390556140c0565b6011545f90620186a0840281613f7d57613f7d6147b7565b6018546015549290910492505f916001600160a01b0391821691160361402057601254620186a09083020490505f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114613ff8576040519150601f19603f3d011682016040523d82523d5f602084013e613ffd565b606091505b5050905080614011575f9350505050610d22565b506012805482900390556140b4565b601354620186a09083020460155460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb906044016020604051808303815f875af192505050801561409b575060408051601f3d908101601f1916820190925261409891810190614744565b60015b6140a9575f92505050610d22565b506013805482900390555b50506011805483900390555b50919050565b60405180608001604052805f6001600160a01b031681526020016140e8614195565b81526020016140f5614195565b81526020015f81525090565b600183019183908215614189579160200282015f5b8382111561415857835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302614116565b80156141875782816101000a81549062ffffff0219169055600301602081600201049283019260010302614158565b505b5061175c9291506141b3565b60405180606001604052806003906020820280368337509192915050565b5b8082111561175c575f81556001016141b4565b801515811461100c575f80fd5b5f805f604084860312156141e6575f80fd5b833567ffffffffffffffff808211156141fd575f80fd5b818601915086601f830112614210575f80fd5b81358181111561421e575f80fd5b8760208260051b8501011115614232575f80fd5b60209283019550935050840135614248816141c7565b809150509250925092565b5f81518084525f5b818110156142775760208185018101518683018201520161425b565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6115c86020830184614253565b6001600160a01b038116811461100c575f80fd5b5f80604083850312156142cd575f80fd5b82356142d8816142a8565b946020939093013593505050565b5f805f606084860312156142f8575f80fd5b8335614303816142a8565b92506020840135614313816142a8565b929592945050506040919091013590565b803560ff81168114614334575f80fd5b919050565b803562ffffff81168114614334575f80fd5b5f82601f83011261435a575f80fd5b6040516060810181811067ffffffffffffffff8211171561438957634e487b7160e01b5f52604160045260245ffd5b60405280606084018581111561439d575f80fd5b845b818110156143be576143b081614339565b83526020928301920161439f565b509195945050505050565b5f805f8061010085870312156143dd575f80fd5b6143e685614324565b935060208501356143f6816142a8565b9250614405866040870161434b565b91506144148660a0870161434b565b905092959194509250565b5f6020828403121561442f575f80fd5b81356115c8816141c7565b5f6020828403121561444a575f80fd5b813563ffffffff811681146115c8575f80fd5b60c081525f61446f60c0830189614253565b82810360208401526144818189614253565b60ff881660408501526001600160a01b03871660608501526080840186905283810360a085015290506144b48185614253565b9998505050505050505050565b5f602082840312156144d1575f80fd5b81356115c8816142a8565b5f602082840312156144ec575f80fd5b6115c882614339565b5f8060408385031215614506575f80fd5b61450f83614339565b915061451d60208401614339565b90509250929050565b5f8060408385031215614537575f80fd5b8235614542816142a8565b91506020830135614552816142a8565b809150509250929050565b805f5b6003811015610e9d57815162ffffff16845260209384019390910190600101614560565b602080825282518282018190525f919060409081850190868401855b828110156145f657815180516001600160a01b03168552868101516145c78887018261455d565b50858101516145d9608087018261455d565b506060015160e085015261010090930192908501906001016145a0565b5091979650505050505050565b5f805f805f805f60e0888a031215614619575f80fd5b8735614624816142a8565b96506020880135614634816142a8565b9550604088013594506060880135935061465060808901614324565b925060a0880135915060c0880135905092959891949750929550565b5f806040838503121561467d575f80fd5b8235614688816142a8565b91506020830135614552816141c7565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806146e657607f821691505b6020821081036140c057634e487b7160e01b5f52602260045260245ffd5b5f60208284031215614714575f80fd5b5051919050565b6020808252600f908201526e457863656564732062616c616e636560881b604082015260600190565b5f60208284031215614754575f80fd5b81516115c8816141c7565b60ff851681526001600160a01b03841660208201526101008101614786604083018561455d565b61479360a083018461455d565b95945050505050565b5f602082840312156147ac575f80fd5b81516115c8816142a8565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b8181101561481b5784516001600160a01b0316835293830193918301916001016147f6565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f6060848603121561484e575f80fd5b8351925060208401519150604084015190509250925092565b81810381811115610d2257634e487b7160e01b5f52601160045260245ffdfea2646970667358221220ebd6d5bde853878129cf1b2e7b81d3337532f9c00c0ef90c767bdaf5d9b3a50964736f6c63430008180033

Deployed Bytecode Sourcemap

310:5125:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1443:224:8;;;;;;;;;;-1:-1:-1;1443:224:8;;;;;:::i;:::-;;:::i;2549:96:1:-;;;;;;;;;;-1:-1:-1;2620:15:1;;-1:-1:-1;;;2620:15:1;;;;:19;;2549:96;;;1057:14:12;;1050:22;1032:41;;1020:2;1005:18;2549:96:1;;;;;;;;581:79:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;8690:88:7:-;;;;;;;;;;-1:-1:-1;8759:13:7;;;;;;;8690:88;;1177:144:2;;;;;;;;;;-1:-1:-1;1177:144:2;;;;;:::i;:::-;;:::i;550:481:6:-;;;;;;;;;;-1:-1:-1;550:481:6;;;;;:::i;:::-;;:::i;840:87:2:-;;;;;;;;;;-1:-1:-1;909:12:2;;840:87;;;2800:25:12;;;2788:2;2773:18;840:87:2;2654:177:12;4048:228:7;;;;;;;;;;-1:-1:-1;4048:228:7;;;;;:::i;:::-;;:::i;2272:196:2:-;;;;;;;;;;-1:-1:-1;2272:196:2;;;;;:::i;:::-;;:::i;4159:197:1:-;;;;;;;;;;-1:-1:-1;4159:197:1;;;;;:::i;:::-;;:::i;9684:164:7:-;;;;;;;;;;-1:-1:-1;9684:164:7;;;;;:::i;:::-;;:::i;755:79:2:-;;;;;;;;;;-1:-1:-1;755:79:2;;5290:4:12;819:9:2;5278:17:12;5260:36;;5248:2;5233:18;755:79:2;5118:184:12;2963:139:1;;;;;;;;;;-1:-1:-1;3055:19:1;;3076;;2963:139;;;-1:-1:-1;;;3055:19:1;;;;;;;5504:34:12;;3076:19:1;;;5569:2:12;5554:18;;5547:43;5450:18;2963:139:1;5307:289:12;2028:96:2;;;;;;;;;;-1:-1:-1;2102:16:2;;2028:96;;5132:233:9;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;430:122:8:-;;;;;;;;;;;;;:::i;2474:221:2:-;;;;;;;;;;-1:-1:-1;2474:221:2;;;;;:::i;:::-;;:::i;647:110:8:-;;;;;;;;;;-1:-1:-1;647:110:8;;;;;:::i;:::-;-1:-1:-1;;;;;730:21:8;710:4;730:21;;;:12;:21;;;;;;;;;647:110;941:300:3;;;;;;;;;;-1:-1:-1;941:300:3;;;;;:::i;:::-;;:::i;3503:266:1:-;;;;;;;;;;-1:-1:-1;3503:266:1;;;;;:::i;:::-;;:::i;10407:239::-;;;;;;;;;;-1:-1:-1;10407:239:1;;;;;:::i;:::-;;:::i;2713:94::-;;;;;;;;;;-1:-1:-1;2785:16:1;;;;2713:94;;1748:87:7;;;;;;;;;;;;;:::i;:::-;;;7460:8:12;7448:21;;;7430:40;;7418:2;7403:18;1748:87:7;7286:190:12;2788:85:0;;;;;;;;;;-1:-1:-1;2859:8:0;;;;;;;;;;;;-1:-1:-1;;;2859:8:0;;;;2788:85;;10095:93:1;;;;;;;;;;-1:-1:-1;10172:9:1;;-1:-1:-1;;;;;10172:9:1;10095:93;;;-1:-1:-1;;;;;7645:32:12;;;7627:51;;7615:2;7600:18;10095:93:1;7481:203:12;9379:99:7;;;;;;;;;;-1:-1:-1;9455:17:7;;-1:-1:-1;;;9455:17:7;;;;9379:99;;7863:10:12;7851:23;;;7833:42;;7821:2;7806:18;9379:99:7;7689:192:12;2512:345:7;;;;;;;;;;-1:-1:-1;2512:345:7;;;;;:::i;:::-;;:::i;1149:189:1:-;;;;;;;;;;-1:-1:-1;1149:189:1;;;;;:::i;:::-;;:::i;3296:343:7:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;933:105:2:-;;;;;;;;;;-1:-1:-1;933:105:2;;;;;:::i;:::-;-1:-1:-1;;;;;1015:17:2;992:7;1015:17;;;;;;;;;;;;933:105;434:260:5;;;;;;;;;;;;;:::i;638:101:3:-;;;;;;;;;;-1:-1:-1;715:18:3;;-1:-1:-1;;;715:18:3;;;;638:101;;4594:124:1;;;;;;;;;;;;;:::i;1925:97:2:-;;;;;;;;;;-1:-1:-1;1925:97:2;;;;;:::i;:::-;-1:-1:-1;;;;;2002:14:2;1979:7;2002:14;;;:7;:14;;;;;;;1925:97;818:116:7;;;;;;;;;;;;;:::i;11102:183:1:-;;;;;;;;;;;;;:::i;1195:85:7:-;;;;;;;;;;;;;:::i;1360:288::-;;;;;;;;;;-1:-1:-1;1360:288:7;;;;;:::i;:::-;;:::i;353:75:5:-;;;;;;;;;;-1:-1:-1;416:6:5;;-1:-1:-1;;;;;416:6:5;353:75;;1914:331:7;;;;;;;;;;-1:-1:-1;1914:331:7;;;;;:::i;:::-;;:::i;666:83:2:-;;;;;;;;;;;;;:::i;2696:86:0:-;;;;;;;;;;-1:-1:-1;770:4:0;2696:86;;5783:197:7;;;;;;;;;;;;;:::i;2701:358:2:-;;;;;;;;;;-1:-1:-1;2701:358:2;;;;;:::i;:::-;;:::i;5032:225:1:-;;;;;;;;;;-1:-1:-1;5032:225:1;;;;;:::i;:::-;;:::i;8495:126:7:-;;;;;;;;;;-1:-1:-1;8495:126:7;;;;;:::i;:::-;;:::i;2130:136:2:-;;;;;;;;;;-1:-1:-1;2130:136:2;;;;;:::i;:::-;;:::i;2368:96:1:-;;;;;;;;;;-1:-1:-1;2445:13:1;;-1:-1:-1;;;;;2445:13:1;2368:96;;8882:141:7;;;;;;;;;;-1:-1:-1;8882:141:7;;;;;:::i;:::-;;:::i;2220:85:1:-;;;;;;;;;;-1:-1:-1;2290:9:1;;-1:-1:-1;;;;;2290:9:1;2220:85;;423:125:3;;;;;;;;;;;;;:::i;841:128:1:-;;;;;;;;;;;;;:::i;2344:89:7:-;;;;;;;;;;;;;:::i;4816:246:9:-;;;;;;;;;;-1:-1:-1;4951:10:9;:20;4816:246;;;4951:20;;;;9963:14:12;9956:22;9938:41;;4951:20:9;4973:16;;;;10022:14:12;10015:22;10010:2;9995:18;;9988:50;4991:21:9;;;;;10081:14:12;10074:22;10054:18;;;10047:50;;;;-1:-1:-1;;;5014:22:9;;;;10140:14:12;10133:22;10128:2;10113:18;;10106:50;5038:18:9;;;;;10200:14:12;10193:22;10187:3;10172:19;;10165:51;9925:3;9910:19;4816:246:9;9709:513:12;1327:592:2;;;;;;;;;;-1:-1:-1;1327:592:2;;;;;:::i;:::-;;:::i;994:99:7:-;;;;;;;;;;-1:-1:-1;1069:18:7;;994:99;;919:280:4;;;;;;;;;;-1:-1:-1;919:280:4;;;;;:::i;:::-;;:::i;1044:127:2:-;;;;;;;;;;-1:-1:-1;1044:127:2;;;;;:::i;:::-;;:::i;420:110:4:-;;;;;;;;;;;;;:::i;1351:418:6:-;;;;;;;;;;-1:-1:-1;1351:418:6;;;;;:::i;:::-;;:::i;700:145:5:-;;;;;;;;;;-1:-1:-1;700:145:5;;;;;:::i;:::-;;:::i;9142:111:7:-;;;;;;;;;;-1:-1:-1;9142:111:7;;;;;:::i;:::-;-1:-1:-1;;;;;9223:16:7;9203:4;9223:16;;;:7;:16;;;;;:24;;;;;;;9142:111;879:106:8;;;;;;;;;;-1:-1:-1;879:106:8;;;;;:::i;:::-;;:::i;621:91:4:-;;;;;;;;;;-1:-1:-1;693:13:4;;-1:-1:-1;;;693:13:4;;;;621:91;;2085:89:1;;;;;;;;;;-1:-1:-1;2157:4:1;:11;-1:-1:-1;;;;;2157:11:1;2085:89;;1443:224:8;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;;;;;;;;;1563:8:8;1549:11:::1;1589:66;1609:3;1605:1;:7;1589:66;;;1621:31;1632:8;;1641:1;1632:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;1645:6;1621:10;:31::i;:::-;1614:3;;1589:66;;;;1530:132;1443:224:::0;;;:::o;581:79:2:-;620:13;649:5;642:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;581:79;:::o;1177:144::-;1245:4;1258:37;1267:10;1279:7;1288:6;1258:8;:37::i;:::-;-1:-1:-1;1311:4:2;1177:144;;;;;:::o;550:481:6:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;676:38:6::1;::::0;-1:-1:-1;;;676:38:6;;708:4:::1;676:38;::::0;::::1;7627:51:12::0;658:15:6::1;::::0;-1:-1:-1;;;;;676:23:6;::::1;::::0;::::1;::::0;7600:18:12;;676:38:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;658:56:::0;-1:-1:-1;722:17:6::1;-1:-1:-1::0;;;;;742:22:6;::::1;759:4;742:22;:136;;826:9;::::0;-1:-1:-1;;;;;818:27:6;;::::1;826:9:::0;::::1;818:27;:59;;876:1;742:136;;818:59;848:25;;742:136;;;795:19;;767:25;;:47;742:136;722:156;;953:6;919:7;906:9;:20;;:42;;939:9;906:42;;;929:7;906:42;895:7;:54;:64;;887:92;;;;-1:-1:-1::0;;;887:92:6::1;;;;;;;:::i;:::-;-1:-1:-1::0;;992:34:6::1;::::0;-1:-1:-1;;;992:34:6;;-1:-1:-1;;;;;13264:32:12;;;992:34:6::1;::::0;::::1;13246:51:12::0;13313:18;;;13306:34;;;992:22:6;::::1;::::0;::::1;::::0;13219:18:12;;992:34:6::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;550:481:::0;;;:::o;4048:228:7:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;4191:10:7::1;:18:::0;;;::::1;;;4190:19;4182:28;;;::::0;::::1;;4219:51;4238:4;4244:7;4253;4262;4219:18;:51::i;2272:196:2:-:0;2354:4;2367:41;2383:4;2389:10;2401:6;2367:15;:41::i;:::-;2415:27;2425:4;2431:2;2435:6;2415:9;:27::i;:::-;-1:-1:-1;2458:4:2;2272:196;;;;;:::o;4159:197:1:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;4231:10:1::1;:22:::0;-1:-1:-1;;;4231:22:1;::::1;;;4230:23;4222:32;;;::::0;::::1;;4270:6;4269:7;:36;;;-1:-1:-1::0;4280:4:1::1;:11:::0;-1:-1:-1;;;;;4280:11:1::1;:25:::0;::::1;4269:36;4261:55;;;::::0;-1:-1:-1;;;4261:55:1;;13803:2:12;4261:55:1::1;::::0;::::1;13785:21:12::0;13842:1;13822:18;;;13815:29;-1:-1:-1;;;13860:18:12;;;13853:36;13906:18;;4261:55:1::1;13601:329:12::0;4261:55:1::1;4325:16;:25:::0;;-1:-1:-1;;4325:25:1::1;::::0;::::1;;::::0;;;::::1;::::0;;4159:197::o;9684:164:7:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;9761:10:7::1;:18:::0;;;::::1;;;9760:19;9752:28;;;::::0;::::1;;9803:3;9795:4;:11;;;;9787:20;;;::::0;::::1;;9816:26;9837:4;9816:20;:26::i;:::-;9684:164:::0;:::o;5132:233:9:-;5171:18;5191:20;5213:14;5229:13;5244:19;5265:21;5302:5;5309:7;5318:9;5329:6;;;;;;;;;-1:-1:-1;;;;;5329:6:9;5337:12;;5351:8;;;;;;;;;;;;;-1:-1:-1;;;5351:8:9;;;5294:66;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5132:233;;;;;;:::o;430:122:8:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;485:10:8::1;:27:::0;;-1:-1:-1;;485:27:8::1;508:4;485:27;::::0;;526:20:::1;::::0;::::1;::::0;485::::1;::::0;526::::1;430:122::o:0;2474:221:2:-;2556:4;2588:74;2597:10;2609:7;2651:10;2618:30;2628:10;2640:7;2618:9;:30::i;:::-;:43;2588:8;:74::i;941:300:3:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;1022:10:3::1;:21:::0;;;::::1;;;1021:22;1013:31;;;::::0;::::1;;1080:12;::::0;::::1;::::0;;:65:::1;;;1108:3;1097:7;:14;;;;:47;;;;-1:-1:-1::0;1126:18:3;1115:29:::1;::::0;::::1;;;1097:47;1072:74;;;::::0;::::1;;1162:30;1184:7;1162:21;:30::i;:::-;1206:29;::::0;7460:8:12;7448:21;;7430:40;;1206:29:3::1;::::0;7418:2:12;7403:18;1206:29:3::1;;;;;;;;941:300:::0;:::o;3503:266:1:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;3590:10:1::1;:22:::0;-1:-1:-1;;;3590:22:1;::::1;;;3589:23;3581:32;;;::::0;::::1;;3635:1;3628:3;:8;;;;:23;;;;;3647:4;3640:3;:11;;;;3628:23;3620:48;;;::::0;-1:-1:-1;;;3620:48:1;;14137:2:12;3620:48:1::1;::::0;::::1;14119:21:12::0;14176:2;14156:18;;;14149:30;-1:-1:-1;;;14195:18:12;;;14188:42;14247:18;;3620:48:1::1;13935:336:12::0;3620:48:1::1;3690:3;3683:10;;:3;:10;;;;:25;;;;;3704:4;3697:3;:11;;;;3683:25;3675:50;;;::::0;-1:-1:-1;;;3675:50:1;;14137:2:12;3675:50:1::1;::::0;::::1;14119:21:12::0;14176:2;14156:18;;;14149:30;-1:-1:-1;;;14195:18:12;;;14188:42;14247:18;;3675:50:1::1;13935:336:12::0;3675:50:1::1;3734:29;3754:3;3759;3734:19;:29::i;:::-;3503:266:::0;;:::o;10407:239::-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;10478:10:1::1;:22:::0;-1:-1:-1;;;10478:22:1;::::1;;;10477:23;10469:32;;;::::0;::::1;;10522:9;::::0;-1:-1:-1;;;;;10514:27:1;;::::1;10522:9:::0;::::1;10514:27;::::0;::::1;::::0;:67:::1;;;10580:1;10545:32;;:36;10514:67;10510:103;;;10585:25;::::0;-1:-1:-1;;;10585:25:1;;14478:2:12;10585:25:1::1;::::0;::::1;14460:21:12::0;14517:2;14497:18;;;14490:30;-1:-1:-1;;;14536:18:12;;;14529:45;14591:18;;10585:25:1::1;14276:339:12::0;10510:103:1::1;10621:19;10634:5;10621:12;:19::i;1748:87:7:-:0;1789:6;1811:18;1818:10;1811:6;:18::i;:::-;1804:25;;1748:87;:::o;2512:345::-;2581:13;;2562:6;;2581:13;;;;;2577:32;;;-1:-1:-1;2605:1:7;;2512:345;-1:-1:-1;2512:345:7:o;2577:32::-;-1:-1:-1;;;;;2643:19:7;;2657:4;2643:19;;:39;;-1:-1:-1;;;;;;2666:16:7;;;;;;:12;:16;;;;;;;;2643:39;:58;;;-1:-1:-1;2692:9:7;;-1:-1:-1;;;;;2686:15:7;;;2692:9;;2686:15;2643:58;:79;;;-1:-1:-1;2711:4:7;:11;-1:-1:-1;;;;;2705:17:7;;;2711:11;;2705:17;2643:79;:201;;-1:-1:-1;;;;;2730:11:7;;;;;;:7;:11;;;;;:19;;;;;;;:74;;-1:-1:-1;2771:17:7;;2653:23:0;:15;:23;;-1:-1:-1;;;2771:17:7;;;;-1:-1:-1;;;2753:15:7;;;;;:35;;;;:51;;;2730:74;:113;;2830:13;;-1:-1:-1;;;2830:13:7;;;;2643:201;;2730:113;2807:20;;-1:-1:-1;;;2807:20:7;;;;2643:201;;;2725:1;2636:208;2512:345;-1:-1:-1;;2512:345:7:o;1149:189:1:-;294:6:5;;1235:7:1;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;1260:10:1::1;:22:::0;-1:-1:-1;;;1260:22:1;::::1;;;1259:23;1251:32;;;::::0;::::1;;1299:33;1315:6;1323:8;1299:15;:33::i;:::-;1292:40:::0;1149:189;-1:-1:-1;;;1149:189:1:o;3296:343:7:-;3399:27;;;3424:1;3399:27;;;;;;;;;3351:32;;3399:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3392:34;;3459:7;3454:173;3472:1;3468;:5;;;3454:173;;;3492:132;;;;;;;;3511:18;;;-1:-1:-1;3511:18:7;;;:15;:18;;;;;;;:26;;;;;-1:-1:-1;;;;;3511:26:7;3492:132;;3539:18;;;;;;3492:132;;;;;;;;;;;;;;;;3511:26;3539;;3492:132;;;3539:26;;3492:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3492:132:7;;;-1:-1:-1;;3567:18:7;;;;;;;:15;3492:132;3567:18;;;;;;;;3492:132;;;;;;;;;;;3567:26;;3492:132;;3567:26;3492:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3492:132:7;;;-1:-1:-1;;;3595:18:7;;;;;;;:15;3492:132;3595:18;;;;;;;:28;;;3492:132;;;;;;3482:7;;;;3595:18;3482:7;;;;;;:::i;:::-;;;;;;;;;;:142;3475:3;;3454:173;;;;3296:343;:::o;434:260:5:-;294:6;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;489:10:::1;:27:::0;;-1:-1:-1;;620:29:5;;;;;658:30:::1;-1:-1:-1::0;658:18:5::1;:30::i;:::-;434:260::o:0;4594:124:1:-;4638:16;;;;:30;;;;-1:-1:-1;4659:9:1;;;;;;;4658:10;4638:30;:48;;;;-1:-1:-1;4673:13:1;;;;;;;4672:14;4638:48;4630:57;;;;;;4696:16;4706:5;4696:9;:16::i;818:116:7:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;871:10:7::1;:25:::0;;-1:-1:-1;;871:25:7::1;::::0;::::1;::::0;;910:18:::1;::::0;::::1;::::0;871::::1;::::0;910::::1;818:116::o:0;11102:183:1:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;11162:10:1::1;:22:::0;-1:-1:-1;;;11162:22:1;::::1;;;11161:23;11153:32;;;::::0;::::1;;11200:15;::::0;-1:-1:-1;;;11200:15:1;::::1;;;:20:::0;11192:48:::1;;;::::0;-1:-1:-1;;;11192:48:1;;14822:2:12;11192:48:1::1;::::0;::::1;14804:21:12::0;14861:2;14841:18;;;14834:30;-1:-1:-1;;;14880:18:12;;;14873:45;14935:18;;11192:48:1::1;14620:339:12::0;11192:48:1::1;11249:15;:30:::0;;-1:-1:-1;;11249:30:1::1;2653:15:0::0;:23;;-1:-1:-1;;;11249:30:1::1;;::::0;;11102:183::o;1195:85:7:-;1235:6;1257:17;1263:10;1360:288;1410:6;-1:-1:-1;;;;;1451:21:7;;1467:4;1451:21;;:43;;-1:-1:-1;;;;;;1476:18:7;;;;;;:12;:18;;;;;;;;1451:43;:64;;;-1:-1:-1;1506:9:7;;-1:-1:-1;;;;;1498:17:7;;;1506:9;;1498:17;1451:64;:184;;-1:-1:-1;;;;;1523:13:7;;;;;;:7;:13;;;;;:21;;;;;;;:76;;-1:-1:-1;1566:17:7;;2653:23:0;:15;:23;;-1:-1:-1;;;1566:17:7;;;;-1:-1:-1;;;1548:15:7;;;;;:35;;;;:51;;;1523:76;:111;;1623:11;;-1:-1:-1;;;1623:11:7;;;;1451:184;;1523:111;1602:18;;-1:-1:-1;;;1602:18:7;;;;1451:184;;1914:331;1984:13;;1965:6;;1984:13;;;;;1980:32;;;-1:-1:-1;2008:1:7;;1914:331;-1:-1:-1;1914:331:7:o;1980:32::-;-1:-1:-1;;;;;2046:21:7;;2062:4;2046:21;;:43;;-1:-1:-1;;;;;;2071:18:7;;;;;;:12;:18;;;;;;;;2046:43;:64;;;-1:-1:-1;2101:9:7;;-1:-1:-1;;;;;2093:17:7;;;2101:9;;2093:17;2046:64;:186;;-1:-1:-1;;;;;2118:13:7;;;;;;:7;:13;;;;;:21;;;;;;;:76;;-1:-1:-1;2161:17:7;;2653:23:0;:15;:23;;-1:-1:-1;;;2161:17:7;;;;-1:-1:-1;;;2143:15:7;;;;;:35;;;;:51;;;2118:76;:113;;2219:12;;-1:-1:-1;;;2219:12:7;;;;2046:186;;2118:113;2197:19;;-1:-1:-1;;;2197:19:7;;;;2046:186;;666:83:2;707:13;736:7;729:14;;;;;:::i;5783:197:7:-;5850:6;;-1:-1:-1;;;;;5850:6:7;5836:10;:20;;:48;;-1:-1:-1;5873:10:7;5860:24;;;;:12;:24;;;;;;;;5836:48;5828:73;;;;-1:-1:-1;;;5828:73:7;;;;;;;:::i;:::-;5917:9;;;;;;;5916:10;:28;;;;-1:-1:-1;5931:13:7;;;;;;;5930:14;5916:28;5908:37;;;;;;5954:20;:18;:20::i;2701:358:2:-;2788:4;2801:24;2828:30;2838:10;2850:7;2828:9;:30::i;:::-;2801:57;;2895:15;2875:16;:35;;2867:66;;;;-1:-1:-1;;;2867:66:2;;15166:2:12;2867:66:2;;;15148:21:12;15205:2;15185:18;;;15178:30;-1:-1:-1;;;15224:18:12;;;15217:48;15282:18;;2867:66:2;14964:342:12;2867:66:2;2961:65;2970:10;2982:7;3010:15;2991:16;:34;2961:8;:65::i;5032:225:1:-;5100:6;;-1:-1:-1;;;;;5100:6:1;5086:10;:20;;:48;;-1:-1:-1;5123:10:1;5110:24;;;;:12;:24;;;;;;;;5086:48;5078:73;;;;-1:-1:-1;;;5078:73:1;;;;;;;:::i;:::-;5167:5;:25;;;-1:-1:-1;5176:16:1;;;;5167:25;5166:41;;;;-1:-1:-1;5198:9:1;;;;;;;5197:10;5166:41;:59;;;;-1:-1:-1;5212:13:1;;;;;;;5211:14;5166:59;5158:68;;;;;;5235:16;5245:5;5235:9;:16::i;8495:126:7:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;8565:10:7::1;:18:::0;;;::::1;;;8564:19;8556:28;;;::::0;::::1;;8593:13;:22:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;8593:22:7;;::::1;::::0;;;::::1;::::0;;8495:126::o;2130:136:2:-;2194:4;2207:33;2217:10;2229:2;2233:6;2207:9;:33::i;8882:141:7:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;8957:10:7::1;:18:::0;;;::::1;;;8956:19;8948:28;;;::::0;::::1;;-1:-1:-1::0;;;;;8985:16:7::1;9012:5;8985:16:::0;;;:7:::1;:16;::::0;;;;:32;;-1:-1:-1;;8985:32:7::1;::::0;;8882:141::o;423:125:3:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;479:10:3::1;:28:::0;;-1:-1:-1;;479:28:3::1;::::0;::::1;::::0;;521:21:::1;::::0;::::1;::::0;479::::1;::::0;521::::1;423:125::o:0;841:128:1:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;898:10:1::1;:29:::0;;-1:-1:-1;;898:29:1::1;-1:-1:-1::0;;;898:29:1::1;::::0;;941:22:::1;::::0;::::1;::::0;898::::1;::::0;941::::1;841:128::o:0;2344:89:7:-;2386:6;2408:19;2416:10;2408:7;:19::i;1327:592:2:-;1475:15;1463:8;:27;;1455:57;;;;-1:-1:-1;;;1455:57:2;;15513:2:12;1455:57:2;;;15495:21:12;15552:2;15532:18;;;15525:30;-1:-1:-1;;;15571:18:12;;;15564:47;15628:18;;1455:57:2;15311:341:12;1455:57:2;1595:16;;-1:-1:-1;;;;;1674:14:2;;;1540;1674;;;:7;:14;;;;;;;;:16;;;;;;;;;1623:78;;271:95;1623:78;;;15944:25:12;16023:18;;;16016:43;;;;16095:15;;;16075:18;;;16068:43;16127:18;;;16120:34;;;16170:19;;;16163:35;;;;16214:19;;;;16207:35;;;1623:78:2;;;;;;;;;;15916:19:12;;;1623:78:2;;1613:89;;;;;;-1:-1:-1;;;1567:136:2;;;16511:27:12;16554:11;;;16547:27;;;;16590:12;;;;16583:28;;;;1567:136:2;;;;;;;;;;16627:12:12;;;1567:136:2;;;1557:147;;;;;;;;;1740:26;;;;;;;;;;16877:25:12;;;16950:4;16938:17;;16918:18;;;16911:45;16972:18;;;16965:34;;;17015:18;;;17008:34;;;1740:26:2;1540:14;;1674:16;16849:19:12;;;;;-1:-1:-1;;1740:26:2;;;;;;;;;;1674:16;1740:26;;;;;;;;;;;;;;;-1:-1:-1;;1740:26:2;;-1:-1:-1;;1740:26:2;;;-1:-1:-1;;;;;;;1785:30:2;;;;;;:59;;;1839:5;-1:-1:-1;;;;;1819:25:2;:16;-1:-1:-1;;;;;1819:25:2;;1785:59;1777:89;;;;-1:-1:-1;;;1777:89:2;;17255:2:12;1777:89:2;;;17237:21:12;17294:2;17274:18;;;17267:30;-1:-1:-1;;;17313:18:12;;;17306:47;17370:18;;1777:89:2;17053:341:12;1777:89:2;1521:353;;1882:31;1891:5;1898:7;1907:5;1882:8;:31::i;:::-;1327:592;;;;;;;:::o;919:280:4:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;995:10:4::1;:16:::0;::::1;::::0;::::1;;;994:17;986:26;;;::::0;::::1;;1048:12;::::0;::::1;::::0;;:65:::1;;;1076:3;1065:7;:14;;;;:47;;;;-1:-1:-1::0;1094:18:4;1083:29:::1;::::0;::::1;;;1065:47;1040:74;;;::::0;::::1;;1130:25;1147:7;1130:16;:25::i;:::-;1169:24;::::0;7460:8:12;7448:21;;7430:40;;1169:24:4::1;::::0;7418:2:12;7403:18;1169:24:4::1;7286:190:12::0;1044:127:2;-1:-1:-1;;;;;1139:17:2;;;1116:7;1139:17;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;1044:127::o;420:110:4:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;471:10:4::1;:23:::0;;-1:-1:-1;;471:23:4::1;;;::::0;;508:16:::1;::::0;::::1;::::0;471::::1;::::0;508::::1;420:110::o:0;1351:418:6:-;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;1542:9:6;;1528::::1;::::0;1471:21:::1;::::0;1453:15:::1;::::0;-1:-1:-1;;;;;1528:9:6;;::::1;1542::::0;::::1;1520:31;:60;;1579:1;1520:60;;;1554:22;;1520:60;1500:80;;1655:6;1621:7;1608:9;:20;;:42;;1641:9;1608:42;;;1631:7;1608:42;1597:7;:54;:64;;1589:92;;;;-1:-1:-1::0;;;1589:92:6::1;;;;;;;:::i;:::-;1435:253;;1695:12;1713:2;-1:-1:-1::0;;;;;1713:7:6::1;1729:6;1713:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1694:47;;;1756:7;1748:16;;;::::0;::::1;;1429:340;1351:418:::0;;:::o;700:145:5:-;294:6;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;779:22:5;::::1;771:31;;;::::0;::::1;;811:28;830:8;811:18;:28::i;879:106:8:-:0;294:6:5;;-1:-1:-1;;;;;294:6:5;304:10;294:20;286:45;;;;-1:-1:-1;;;286:45:5;;;;;;;:::i;:::-;952:27:8::1;963:7;972:6;991:322:::0;1066:10;:20;;;1065:21;1057:30;;;;;;-1:-1:-1;;;;;1102:21:8;;1094:30;;;;;;1150:4;:11;-1:-1:-1;;;;;1139:22:8;;;1150:11;;1139:22;;;;:46;;-1:-1:-1;1176:9:8;;-1:-1:-1;;;;;1165:20:8;;;1176:9;;1165:20;;1139:46;1131:93;;;;-1:-1:-1;;;1131:93:8;;17811:2:12;1131:93:8;;;17793:21:12;17850:2;17830:18;;;17823:30;17889:34;17869:18;;;17862:62;-1:-1:-1;;;17940:18:12;;;17933:32;17982:19;;1131:93:8;17609:398:12;1131:93:8;-1:-1:-1;;;;;1235:21:8;;;;;;:12;:21;;;;;;;;;:30;;-1:-1:-1;;1235:30:8;;;;;;;;;;1279:28;;1032:41:12;;;1279:28:8;;1005:18:12;1279:28:8;;;;;;;991:322;;:::o;3065:169:2:-;-1:-1:-1;;;;;3147:17:2;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;:35;;;3196:32;;2800:25:12;;;3196:32:2;;2773:18:12;3196:32:2;;;;;;;;3065:169;;;:::o;4282:1368:7:-;4422:1;4415:4;:8;;;4407:17;;;;;;-1:-1:-1;;;;;4439:24:7;;4458:4;4439:24;;;;:54;;-1:-1:-1;;;;;;4467:26:7;;4486:6;4467:26;;4439:54;:79;;;;-1:-1:-1;;;;;;4497:21:7;;;;4439:79;4431:88;;;;;;4569:21;;;4528:38;4569:21;;;:15;:21;;;;;;;;;4646:23;;;:26;;4633:10;;4618:11;:54;;-1:-1:-1;;;4618:54:7;;;4646:26;4618:54;;;4646:26;;;4633:39;;;4618:54;;;;;;;;-1:-1:-1;;;;4618:54:7;;;;;;;4710:26;;4697:10;;;;-1:-1:-1;;;4681:55:7;;;;;;4710:26;;;;;;;4697:39;;;4681:55;;;;;;-1:-1:-1;;;;4681:55:7;;;-1:-1:-1;;;;4681:55:7;;;;;;;;;;;;;;4775:26;;4762:10;;;;-1:-1:-1;;;4745:56:7;;;;;4775:26;;;;;;;4762:39;;;4745:56;;;;;;;-1:-1:-1;;;;4745:56:7;;;;;;;4799:1;4845:23;;:26;;4832:10;;-1:-1:-1;;;4810:61:7;;;;;;4845:26;;;4832:39;;4810:61;;;;;;-1:-1:-1;;;;4810:61:7;;;-1:-1:-1;;;;4810:61:7;;;;;;;;;;;;;;4916:26;;4903:10;;;;-1:-1:-1;;;4880:62:7;;;;;4916:26;;;;;;4903:39;;4880:62;;;;;;;;;-1:-1:-1;;;;4880:62:7;;;;;;;4988:26;;4975:10;;;;-1:-1:-1;;;;4951:63:7;;;-1:-1:-1;;;;4951:63:7;;;;4988:26;;;;;;4975:39;;;-1:-1:-1;;;4951:63:7;;;;;;;;;;;;;;;;;;;;4569:21;;5048:17;5033:11;;;;:32;;;;:166;;-1:-1:-1;5071:12:7;;5087:17;-1:-1:-1;;;5071:12:7;;;:33;:12;:33;;;;:71;;-1:-1:-1;5108:13:7;;5125:17;-1:-1:-1;;;5108:13:7;;;:34;:13;:34;;5071:71;5070:128;;;;-1:-1:-1;5163:13:7;;5180:17;-1:-1:-1;;;5148:12:7;;:49;:12;;;-1:-1:-1;;;5163:13:7;;;;;5148:28;;;;:49;;;;;5070:128;5025:187;;;;-1:-1:-1;;;5025:187:7;;18214:2:12;5025:187:7;;;18196:21:12;18253:1;18233:18;;;18226:29;-1:-1:-1;;;18271:18:12;;;18264:38;18319:18;;5025:187:7;18012:331:12;5025:187:7;5229:18;;5251;-1:-1:-1;;;5229:18:7;;;:40;:18;:40;;;;:85;;-1:-1:-1;5273:19:7;;5296:18;-1:-1:-1;;;5273:19:7;;;:41;:19;:41;;5229:85;:131;;;;-1:-1:-1;5318:20:7;;5342:18;-1:-1:-1;;;5318:20:7;;;:42;:20;:42;;5229:131;5221:159;;;;-1:-1:-1;;;5221:159:7;;18550:2:12;5221:159:7;;;18532:21:12;18589:2;18569:18;;;18562:30;-1:-1:-1;;;18608:18:12;;;18601:45;18663:18;;5221:159:7;18348:339:12;5221:159:7;5396:33;;-1:-1:-1;;;;;;5396:33:7;;-1:-1:-1;;;;;5396:33:7;;;;;;5436;-1:-1:-1;5436:23:7;;5462:7;5436:33;;:::i;:::-;-1:-1:-1;5476:33:7;:23;;;5502:7;5476:33;;:::i;:::-;-1:-1:-1;5523:22:7;;;;5518:63;;5549:29;;-1:-1:-1;;5549:29:7;5574:4;5549:29;;;5518:63;5594:50;5612:4;5618:7;5627;5636;5594:50;;;;;;;;;:::i;:::-;;;;;;;;4400:1250;4282:1368;;;;:::o;3240:303:2:-;3329:24;3356:25;3366:5;3373:7;3356:9;:25::i;:::-;3329:52;;3418:6;3398:16;:26;;3390:61;;;;-1:-1:-1;;;3390:61:2;;19446:2:12;3390:61:2;;;19428:21:12;19485:2;19465:18;;;19458:30;-1:-1:-1;;;19504:18:12;;;19497:52;19566:18;;3390:61:2;19244:346:12;3390:61:2;3479:51;3488:5;3495:7;3523:6;3504:16;:25;3479:8;:51::i;2186:2291:9:-;2284:13;;;;;;;2283:14;:28;;;;-1:-1:-1;2302:9:9;;;;;;;2301:10;2283:28;:74;;;;-1:-1:-1;2324:9:9;;-1:-1:-1;;;;;2316:17:9;;;2324:9;;2316:17;;;;:40;;-1:-1:-1;2345:4:9;:11;-1:-1:-1;;;;;2337:19:9;;;2345:11;;2337:19;;2316:40;2279:139;;;2367:16;2377:5;2367:9;:16::i;:::-;2391:20;:18;:20::i;:::-;2437:1;2428:6;:10;:33;;;;-1:-1:-1;;;;;;2443:18:9;;;;;;:12;:18;;;;;;;;2442:19;2428:33;:54;;;;-1:-1:-1;;;;;;2466:16:9;;;;;;:12;:16;;;;;;;;2465:17;2428:54;:79;;;;-1:-1:-1;;;;;;2486:21:9;;2502:4;2486:21;;2428:79;:102;;;;-1:-1:-1;;;;;;2511:19:9;;2525:4;2511:19;;2428:102;:123;;;;-1:-1:-1;2540:4:9;:11;-1:-1:-1;;;;;2534:17:9;;;2540:11;;2534:17;;2428:123;2424:2009;;;2578:9;;-1:-1:-1;;;;;2570:17:9;;;2578:9;;2570:17;;;;:36;;-1:-1:-1;2597:9:9;;-1:-1:-1;;;;;2591:15:9;;;2597:9;;2591:15;;2570:36;2569:105;;;-1:-1:-1;2621:9:9;;-1:-1:-1;;;;;2613:17:9;;;2621:9;;2613:17;;:36;;-1:-1:-1;2640:9:9;;-1:-1:-1;;;;;2634:15:9;;;2640:9;;2634:15;2613:36;2612:61;;;;-1:-1:-1;2654:15:9;;-1:-1:-1;;;2654:15:9;;;;:19;;2612:61;2561:134;;;;-1:-1:-1;;;2561:134:9;;19797:2:12;2561:134:9;;;19779:21:12;19836:2;19816:18;;;19809:30;-1:-1:-1;;;19855:18:12;;;19848:46;19911:18;;2561:134:9;19595:340:12;2561:134:9;2732:12;;:17;;:43;;;2763:12;;2753:6;:22;;2732:43;2724:69;;;;-1:-1:-1;;;2724:69:9;;20142:2:12;2724:69:9;;;20124:21:12;20181:2;20161:18;;;20154:30;-1:-1:-1;;;20200:18:12;;;20193:43;20253:18;;2724:69:9;19940:337:12;2724:69:9;2811:17;;:22;;:45;;-1:-1:-1;;;;;;2837:19:9;;2851:4;2837:19;2811:45;:87;;;-1:-1:-1;2867:9:9;;-1:-1:-1;;;;;2861:15:9;;;2867:9;;2861:15;;:36;;-1:-1:-1;2886:4:9;:11;-1:-1:-1;;;;;2880:17:9;;;2886:11;;2880:17;2861:36;2811:133;;;-1:-1:-1;2927:17:9;;-1:-1:-1;;;;;2902:12:9;;:8;:12;;;;;;;;;;;:21;;:42;;2811:133;2803:164;;;;-1:-1:-1;;;2803:164:9;;20484:2:12;2803:164:9;;;20466:21:12;20523:2;20503:18;;;20496:30;-1:-1:-1;;;20542:18:12;;;20535:48;20600:18;;2803:164:9;20282:342:12;2803:164:9;2983:13;;;;;;;2982:14;:32;;;;-1:-1:-1;3001:13:9;;;;;;;3000:14;2982:32;:46;;;;-1:-1:-1;3019:9:9;;;;;;;3018:10;2982:46;2978:1441;;;3110:9;;3042:18;;;;-1:-1:-1;;;;;3102:17:9;;;3110:9;;3102:17;;:36;;-1:-1:-1;3129:9:9;;-1:-1:-1;;;;;3123:15:9;;;3129:9;;3123:15;3102:36;3098:82;;;3160:9;;-1:-1:-1;;;;;3152:17:9;;;3160:9;;3152:17;:25;;3176:1;3152:25;;;3172:1;3152:25;3142:35;;3098:82;3192:16;3211:7;:12;;3222:1;3211:12;:24;;3231:4;3211:24;;;3226:2;3211:24;3270:17;;3192:43;;-1:-1:-1;2653:23:0;:15;:23;;-1:-1:-1;;;3270:17:9;;;;-1:-1:-1;;;3252:15:9;;;;;:35;;;;:51;;;;;:81;;-1:-1:-1;;;;;;3308:17:9;;;;;;:7;:17;;;;;:25;;;;;;3307:26;3252:81;3248:124;;;-1:-1:-1;;;;;3337:17:9;;;;;;:7;:17;;;;;:32;;-1:-1:-1;;3337:32:9;;;;;3248:124;3389:7;3384:899;3402:1;3398;:5;;;3384:899;;;3424:15;3460:1;3450:7;:11;;;:310;;-1:-1:-1;;;;;3670:17:9;;;;;;:7;:17;;;;;:25;;;;;;:89;;3730:18;;;;;;;:15;:18;;;;;:26;;;:29;;;;;;;;;;;;;;;;;;;;;3450:310;;3670:89;3698:18;;;;;;;:15;:18;;;;;:26;;;:29;;3450:310;3465:7;:12;;3476:1;3465:12;:200;;-1:-1:-1;;;;;3575:17:9;;;;;;:7;:17;;;;;:25;;;;;;:89;;3635:18;;;;;;;:15;:18;;;;;:26;;3662:1;3635:29;;3575:89;3603:18;;;;;;;:15;:18;;;;;:26;;;;;:29;;3465:200;-1:-1:-1;;;;;3481:17:9;;;;;;:7;:17;;;;;:25;;;;;;:89;;3541:18;;;;;;;:15;:18;;;;;:26;;;;;:29;;3481:89;3509:18;;;;;;;:15;:18;;;;;:26;;:29;;;;;;3481:89;3442:319;;3424:337;;3780:7;3791:1;3780:12;3776:31;;3796:8;;;3776:31;2513:27:0;2496:12;;;2495:46;3884:47:9;3900:4;3914;2495:46:0;3884:15:9;:47::i;:::-;3980:9;;3950:18;;;3980:9;3950:18;;;:15;:18;;;;;:26;-1:-1:-1;;;;;3980:9:9;;;;3950:26;;;;;;:39;3946:287;;4007:19;:32;;;;;;3946:287;;;4076:18;;;;;;;:15;:18;;;;;:28;;:41;;;;;;4133:25;:38;;;;;;4187:18;:31;;;;;;3946:287;4247:23;;;;;-1:-1:-1;3384:899:9;3405:3;;3384:899;;;-1:-1:-1;4299:14:9;;4295:114;;4329:18;:32;;;;;;4376:20;;;;;4295:114;3030:1389;;;2978:1441;4439:33;4455:4;4461:2;4465:6;4439:15;:33::i;9854:128:7:-;9913:17;:24;;-1:-1:-1;;;;9913:24:7;-1:-1:-1;;;9913:24:7;;;;;;;;;;;;;9951:25;;7833:42:12;;;9951:25:7;;7821:2:12;7806:18;9951:25:7;7689:192:12;1247:251:3;1310:18;:28;;-1:-1:-1;;1310:28:3;-1:-1:-1;;;1310:28:3;;;;;;;;;;;;;1365:61;;1425:1;1365:61;;;1379:43;1391:12;;1413:7;1405:16;;2513:27:0;2496:12;;2495:46;;2380:174;1379:43:3;1345:17;:81;1440:12;1435:58;;1461:29;;7460:8:12;7448:21;;7430:40;;1461:29:3;;7418:2:12;7403:18;1461:29:3;7286:190:12;3775:266:1;3844:19;:25;;-1:-1:-1;;;;3844:25:1;-1:-1:-1;;;3844:25:1;;;;;;;;;;;;;;3876:19;:25;;-1:-1:-1;;3876:25:1;;;;;;;;;;3941:12;;3929:39;;2513:27:0;2496:12;;2495:46;;2380:174;3929:39:1;3908:18;:60;4008:12;;2513:27:0;4022:12:1;;;;;2496::0;2495:46;3975:18:1;:60;-1:-1:-1;3775:266:1:o;10652:331::-;10715:12;10714:13;:36;;;;-1:-1:-1;;;;;;10731:19:1;;;10714:36;10713:64;;;-1:-1:-1;;;;;;10755:22:1;;10772:4;10755:22;10713:64;:86;;;-1:-1:-1;10790:9:1;;-1:-1:-1;;;;;10781:18:1;;;10790:9;;10781:18;10713:86;:180;;;-1:-1:-1;10830:4:1;:11;10817:35;;;-1:-1:-1;;;10817:35:1;;;;10891:1;;-1:-1:-1;;;;;10830:11:1;;10817:33;;:35;;;;;;;;;;;;;;10830:11;10817:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10862:9;;10803:76;;-1:-1:-1;;;10803:76:1;;-1:-1:-1;;;;;10862:9:1;;;10803:76;;;21097:34:12;21167:15;;;21147:18;;;21140:43;10803:58:1;;;;;21032:18:12;;10803:76:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10803:90:1;;;10713:180;10705:200;;;;-1:-1:-1;;;10705:200:1;;21396:2:12;10705:200:1;;;21378:21:12;21435:1;21415:18;;;21408:29;-1:-1:-1;;;21453:18:12;;;21446:37;21500:18;;10705:200:1;21194:330:12;10705:200:1;-1:-1:-1;;;;;10933:19:1;;;:43;;10971:5;10933:43;;;10963:4;10933:43;10914:9;:63;;-1:-1:-1;;;;;;10914:63:1;-1:-1:-1;;;;;10914:63:1;;;;;;;;;;-1:-1:-1;10652:331:1:o;1344:680::-;1421:7;-1:-1:-1;;;;;1445:20:1;;1437:29;;;;;;1479:4;:11;-1:-1:-1;;;;;1479:21:1;;;:11;;:21;1475:394;;1511:20;1547:6;1511:43;;1563:21;1601:7;-1:-1:-1;;;;;1601:15:1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1563:56;;1628:12;1643:7;-1:-1:-1;;;;;1643:12:1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1681:36;;-1:-1:-1;;;1681:36:1;;1705:4;1681:36;;;21097:34:12;-1:-1:-1;;;;;21167:15:12;;;21147:18;;;21140:43;1628:29:1;;-1:-1:-1;1666:12:1;;1681:15;;;;;21032:18:12;;1681:36:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1666:51;-1:-1:-1;;;;;;1732:18:1;;1728:75;;1761:39;;-1:-1:-1;;;1761:39:1;;1788:4;1761:39;;;21097:34:12;-1:-1:-1;;;;;21167:15:12;;;21147:18;;;21140:43;1761:18:1;;;;;21032::12;;1761:39:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1754:46;;1728:75;1820:41;;;;;;;;-1:-1:-1;;;;;1820:41:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1813:4;:48;;-1:-1:-1;;;;;;1813:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1475:394:1;1893:13;;-1:-1:-1;;;;;1881:25:1;;;1893:13;;1881:25;1877:60;;1910:13;:24;;-1:-1:-1;;;;;;1910:24:1;-1:-1:-1;;;;;1910:24:1;;;;;1877:60;1973:9;;1950:43;;-1:-1:-1;;;;;7645:32:12;;;7627:51;;1973:9:1;;;;1950:43;;;;;7615:2:12;7600:18;1950:43:1;;;;;;;-1:-1:-1;2009:9:1;;-1:-1:-1;;;;;2009:9:1;1344:680;;;;:::o;851:171:5:-;932:6;;;-1:-1:-1;;;;;945:17:5;;;-1:-1:-1;;;;;;945:17:5;;;;;;;976:40;;932:6;;;945:17;932:6;;976:40;;913:16;;976:40;906:116;851:171;:::o;5263:3930:1:-;620:9;:16;;-1:-1:-1;;620:16:1;;;;;5327:6;::::1;:27:::0;::::1;;;-1:-1:-1::0;5338:16:1::1;::::0;::::1;;5337:17;5327:27;5358:7;5323:44;5394:32;5451:1:::0;5429:19:::1;;:23;:53;;5481:1;5429:53;;;5477:1;5455:19;;:23;;;;;:::i;:::-;;5429:53;5555:9:::0;;5541::::1;::::0;5394:88;;-1:-1:-1;5491:38:1::1;::::0;-1:-1:-1;;;;;5541:9:1;;::::1;5555::::0;::::1;5533:31;:63;;5595:1;5533:63;;;5567:25;;5533:63;5491:106:::0;-1:-1:-1;5629:57:1;;::::1;5701:6:::0;::::1;:43:::0;::::1;;;;5726:18;;5711:12;:33;5701:43;5697:514;;;5811:1;5784:24;:28;:139;;5922:1;5784:139;;;5827:18;::::0;5815:104:::1;::::0;5906:12;5848:27;:54;::::1;5906:12:::0;5847:71:::1;;;;:::i;:::-;;2513:27:0::0;2496:12;;2495:46;;2380:174;5815:104:1::1;5757:166;;6000:1;5967:30;:34;:151;;6117:1;5967:151;;;6016:18;::::0;6004:110:::1;::::0;6101:12;6037:27;:60;::::1;6101:12:::0;6036:77:::1;;;;:::i;6004:110::-;5934:184:::0;-1:-1:-1;;6144:57:1;;::::1;5697:514;6226:5;:43;;;;6251:18;;6235:12;:34;;6226:43;6225:115;;;;-1:-1:-1::0;6291:4:1::1;6274:8;:23:::0;;;::::1;::::0;;;;;;;6301:39;;::::1;-1:-1:-1::0;6274:66:1::1;6225:115;6221:2116;;;6453:16;::::0;;6467:1:::1;6453:16:::0;;;;;::::1;::::0;;6374:21:::1;::::0;6353:18:::1;::::0;6453:16;6467:1;6453:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;6453:16:1::1;6406:63;;6521:4;6480:27;6508:1;6480:30;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6480:46:1;;::::1;:30;::::0;;::::1;::::0;;;;;:46;6570:9;;6537:30;;6570:9;::::1;::::0;6537:27;;6570:9;;6537:30;::::1;;;;;:::i;:::-;-1:-1:-1::0;;;;;6537:42:1;;::::1;:30;::::0;;::::1;::::0;;;;;:42;6616:4:::1;:11:::0;6592:50:::1;::::0;6609:4:::1;::::0;6616:11:::1;6629:12:::0;6592:8:::1;:50::i;:::-;6672:4;:11:::0;6659:154:::1;::::0;-1:-1:-1;;;6659:154:1;;-1:-1:-1;;;;;6672:11:1;;::::1;::::0;6659:76:::1;::::0;:154:::1;::::0;6736:12;;6672:11:::1;::::0;6753:27;;6790:4:::1;::::0;6797:15:::1;::::0;6659:154:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;6655:1673;;8301:4;:11:::0;8277:39:::1;::::0;8294:4:::1;::::0;-1:-1:-1;;;;;8301:11:1::1;;8277:8;:39::i;:::-;6655:1673;;;6831:19;::::0;:23;6827:81:::1;;6858:19;:47:::0;;;;::::1;::::0;;6827:81:::1;6996:47;::::0;;22820:25:12;;;6942:21:1::1;:34:::0;;::::1;22876:2:12::0;22861:18;;22854:34;;;6942::1;6996:47:::1;::::0;22793:18:12;6996:47:1::1;;;;;;;7062:13:::0;;7058:1188:::1;;7092:23;7118:95;7130:9:::0;7200:12;7142:27;:54;::::1;7200:12:::0;7141:71:::1;;;;:::i;7118:95::-;7256:9:::0;;7242::::1;::::0;7092:121;;-1:-1:-1;;;;;;7256:9:1;;::::1;7242::::0;::::1;7234:31:::0;7230:356:::1;;7310:101;7322:9:::0;7398:12;7334:27;:60;::::1;7398:12:::0;7333:77:::1;;;;:::i;7310:101::-;7284:22;:127:::0;;;;::::1;::::0;;7428:32:::1;:66:::0;;;::::1;::::0;;7511:25:::1;:59:::0;;;;::::1;::::0;;7230:356:::1;7633:1;7606:24;:28;:51;;;;;7656:1;7638:15;:19;7606:51;7602:631;;;7700:4;:11:::0;7676:62:::1;::::0;7693:4:::1;::::0;-1:-1:-1;;;;;7700:11:1::1;7713:24:::0;7676:8:::1;:62::i;:::-;7774:4;:11:::0;7876:13;;7761:146:::1;::::0;-1:-1:-1;;;7761:146:1;;7837:4:::1;7761:146;::::0;::::1;23240:34:12::0;23290:18;;;23283:34;;;7774:11:1::1;23333:18:12::0;;;23326:34;;;23376:18;;;23369:34;-1:-1:-1;;;;;7876:13:1;;::::1;23419:19:12::0;;;23412:44;7891:15:1::1;23472:19:12::0;;;23465:35;7774:11:1;::::1;::::0;7761:41:::1;::::0;7811:15;;23174:19:12;;7761:146:1::1;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;7761:146:1::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;7761:146:1::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;7757:461;;8185:4;:11:::0;8161:39:::1;::::0;8178:4:::1;::::0;-1:-1:-1;;;;;8185:11:1::1;;8161:8;:39::i;:::-;7757:461;;;8000:49;::::0;;24024:25:12;;;24080:2;24065:18;;24058:34;;;24108:18;;;24101:34;;;8000:49:1::1;::::0;24012:2:12;23997:18;8000:49:1::1;;;;;;;-1:-1:-1::0;;8070:19:1::1;:47:::0;;;;::::1;::::0;;-1:-1:-1;7757:461:1::1;7077:1169;7058:1188;6814:1443;6655:1673;6342:1995;;6221:2116;8359:9;::::0;-1:-1:-1;;;;;8359:9:1::1;8381:4;8351:35;::::0;::::1;::::0;:70:::1;;-1:-1:-1::0;8412:9:1;;8398::::1;::::0;-1:-1:-1;;;;;8398:9:1;;::::1;8412::::0;::::1;8390:31;;8351:70;8347:801;;;8467:25;;8434:58;;8510:5;8509:6;:61;;;;;8552:18;;8519:30;:51;8509:61;8505:123;;;8607:18;;8574:51;;8505:123;8645:5;:61;;;;8688:18;;8654:30;:52;;8645:61;8644:124;;;;-1:-1:-1::0;8728:4:1::1;8711:8;:23:::0;;;::::1;::::0;;;;;;;:57;-1:-1:-1;8711:57:1::1;8644:124;8640:499;;;8826:9;::::0;8783:19:::1;::::0;8805:63:::1;::::0;-1:-1:-1;;;;;8826:9:1::1;8837:30:::0;8805:20:::1;:63::i;:::-;8783:85:::0;-1:-1:-1;8887:15:1;;8883:245:::1;;8919:25;:40:::0;;;::::1;::::0;;8974:32:::1;:66:::0;;;::::1;::::0;;9055:25:::1;:59:::0;;;;::::1;::::0;;8883:245:::1;8770:369;8640:499;5375:3780;;;9175:12;2653:23:0::0;:15;:23;;2560:130;9175:12:1::1;9163:9;;:24;;;;;;;;;;;;;;;;;;643:1;-1:-1:-1::0;651:9:1;:17;;-1:-1:-1;;651:17:1;;;5263:3930::o;5986:989:7:-;589:13;:20;;-1:-1:-1;;589:20:7;;;;;6053:18:::1;::::0;6049:40;6080:7:::1;6049:40;6116:24;6156:7:::0;6151:639:::1;6169:1;6165;:5;;;6151:639;;;6206:18;::::0;::::1;6188:15;6206:18:::0;;;:15:::1;:18;::::0;;;;:26;;6249:28:::1;::::0;;::::1;::::0;6206:26:::1;::::0;;::::1;-1:-1:-1::0;;;;;6206:26:7::1;::::0;6249:33;;:57:::1;;-1:-1:-1::0;6297:9:7;;-1:-1:-1;;;;;6286:20:7;;::::1;6297:9:::0;::::1;6286:20;6249:57;6245:76;;;6310:8;;;6245:76;6373:9;::::0;6333:17:::1;::::0;6353:194:::1;::::0;-1:-1:-1;;;;;6373:9:7::1;6395:4;6365:35;:98;;6431:32;;6365:98;;;6403:25;;6365:98;6528:18;::::0;6496::::1;::::0;::::1;;::::0;;;:15:::1;:18;::::0;;;;:28:::1;;::::0;6466:27;:58:::1;6528:18:::0;6465:81:::1;;;;:::i;6353:194::-;6333:214;;6558:25;6586:31;6598:7;6607:9;6586:11;:31::i;:::-;6558:59:::0;-1:-1:-1;6634:21:7;;6630:151:::1;;6670:18;::::0;::::1;;::::0;;;:15:::1;:18;::::0;;;;:28:::1;;:49:::0;;;;::::1;::::0;;6732:37;;::::1;::::0;6630:151:::1;6177:613;;;6151:639;6172:3;;6151:639;;;-1:-1:-1::0;6800:20:7::1;:35:::0;;-1:-1:-1;;6800:35:7::1;::::0;2653:23:0;:15;:23;6800:35:7::1;;::::0;;6850:20;;6846:69:::1;;6874:18;:38:::0;;;;::::1;::::0;;6846:69:::1;6930:32;::::0;2800:25:12;;;6930:32:7::1;::::0;2788:2:12;2773:18;6930:32:7::1;;;;;;;6097:873;616:1;624:13:::0;:21;;-1:-1:-1;;624:21:7;;;5986:989::o;1205:231:4:-;1263:13;:23;;-1:-1:-1;;1263:23:4;-1:-1:-1;;;1263:23:4;;;;;;;;;;;;;1308:61;;1368:1;1308:61;;;1322:43;1334:12;;1356:7;1348:16;;2513:27:0;2496:12;;2495:46;;2380:174;1322:43:4;1293:12;:76;1383:12;1378:53;;1404:24;;7460:8:12;7448:21;;7430:40;;1404:24:4;;7418:2:12;7403:18;1404:24:4;7286:190:12;3549:398:2;-1:-1:-1;;;;;3642:18:2;;;;;;:38;;-1:-1:-1;;;;;;3664:16:2;;;;3642:38;3634:80;;;;-1:-1:-1;;;3634:80:2;;24348:2:12;3634:80:2;;;24330:21:12;24387:2;24367:18;;;24360:30;24426:31;24406:18;;;24399:59;24475:18;;3634:80:2;24146:353:12;3634:80:2;-1:-1:-1;;;;;3729:14:2;;:8;:14;;;;;;;;;;;:24;-1:-1:-1;3729:24:2;3721:52;;;;-1:-1:-1;;;3721:52:2;;;;;;;:::i;:::-;3786:10;;3782:120;;-1:-1:-1;;;;;3828:14:2;;;:8;:14;;;;;;;;;;;:24;;;;;;;3863:12;;;;;;:22;;;;;;3782:120;3930:2;-1:-1:-1;;;;;3915:26:2;3924:4;-1:-1:-1;;;;;3915:26:2;;3934:6;3915:26;;;;2800:25:12;;2788:2;2773:18;;2654:177;9199:836:1;9327:30;;-1:-1:-1;;;9327:30:1;;9351:4;9327:30;;;7627:51:12;9276:19:1;;;;-1:-1:-1;;;;;9327:15:1;;;;;7600:18:12;;9327:30:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9414:16;;;9428:1;9414:16;;;;;;;;;9304:53;;-1:-1:-1;9364:47:1;;9414:16;;;;;;;;;;;-1:-1:-1;9414:16:1;9364:66;;9481:4;9437:30;9468:1;9437:33;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9437:49:1;;;:33;;;;;;;;;:49;9529:9;;9493:33;;9529:9;;;9493:30;;9529:9;;9493:33;;;;;;:::i;:::-;;;;;;:45;-1:-1:-1;;;;;9493:45:1;;;-1:-1:-1;;;;;9493:45:1;;;;;9589:5;9545:30;9576:1;9545:33;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9545:50:1;;;:33;;;;;;;;;:50;9628:4;:11;9604:44;;9621:4;;9628:11;9641:6;9604:8;:44::i;:::-;9674:4;:11;9661:154;;-1:-1:-1;;;9661:154:1;;-1:-1:-1;;;;;9674:11:1;;;;9661:79;;:154;;9741:6;;9674:11;;9752:30;;9792:4;;9799:15;;9661:154;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9657:373;;10007:4;:11;9983:39;;10000:4;;-1:-1:-1;;;;;10007:11:1;;9983:8;:39::i;:::-;9657:373;;;9839:30;;-1:-1:-1;;;9839:30:1;;9863:4;9839:30;;;7627:51:12;9872:12:1;;-1:-1:-1;;;;;9839:15:1;;;;;7600:18:12;;9839:30:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;;;:::i;:::-;9900:59;;;-1:-1:-1;;;;;24954:32:12;;24936:51;;25018:2;25003:18;;24996:34;;;25046:18;;;25039:34;;;9825:59:1;;-1:-1:-1;9900:59:1;;24924:2:12;24909:18;9900:59:1;;;;;;;9657:373;9297:738;;9199:836;;;;:::o;6981:1341:7:-;7055:7;7075:9;7088:1;7075:14;7071:33;;-1:-1:-1;7100:1:7;7093:8;;7071:33;7143:9;;7165:4;-1:-1:-1;;;;;7143:9:7;;;7135:35;7131:1154;;7207:1;7187:17;;:21;:74;;;;-1:-1:-1;7244:17:7;;-1:-1:-1;;;;;7212:17:7;;:8;:17;;;;;;;;;;;:29;;:49;7187:74;:100;;;;-1:-1:-1;;;;;;7266:21:7;;;;;;:12;:21;;;;;;;;7265:22;7187:100;7183:271;;;-1:-1:-1;;;;;7334:17:7;;:8;:17;;;;;;;;;;;7314;;:37;:81;;7394:1;7314:81;;;-1:-1:-1;;;;;7374:17:7;;:8;:17;;;;;;;;;;;7354;;:37;7314:81;7302:93;;7414:9;7427:1;7414:14;7410:33;;-1:-1:-1;7439:1:7;7432:8;;7410:33;7466:50;7490:4;7497:7;7506:9;7466:15;:50::i;:::-;7529:25;:38;;;;;;;7131:1154;;;7656:32;;7594:15;;7613:27;:39;;7656:32;7612:76;;;;:::i;:::-;7752:9;;7738;;7612:76;;;;;-1:-1:-1;7699:14:7;;-1:-1:-1;;;;;7752:9:7;;;7738;;7730:31;7726:492;;7797:22;;2513:27:0;2496:12;;;2495:46;7776:53:7;;7845:12;7871:7;-1:-1:-1;;;;;7863:21:7;7893:6;7906:5;7863:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7844:73;;;7937:7;7932:27;;7955:1;7948:8;;;;;;;7932:27;-1:-1:-1;7973:22:7;:32;;;;;;;7726:492;;;8057:25;;2513:27:0;2496:12;;;2495:46;8111:9:7;;:35;;-1:-1:-1;;;8111:35:7;;-1:-1:-1;;;;;13264:32:12;;;8111:35:7;;;13246:51:12;13313:18;;;13306:34;;;8036:56:7;;-1:-1:-1;8111:9:7;;;:18;;13219::12;;8111:35:7;;;;;;;;;;;;;;;;;;;-1:-1:-1;8111:35:7;;;;;;;;-1:-1:-1;;8111:35:7;;;;;;;;;;;;:::i;:::-;;;8107:100;;8203:1;8196:8;;;;;;8107:100;-1:-1:-1;8149:25:7;:35;;;;;;;8107:100;-1:-1:-1;;8230:32:7;:45;;;;;;;7131:1154;-1:-1:-1;8307:9:7;6981:1341;-1:-1:-1;6981:1341:7:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:118:12;100:5;93:13;86:21;79:5;76:32;66:60;;122:1;119;112:12;137:750;229:6;237;245;298:2;286:9;277:7;273:23;269:32;266:52;;;314:1;311;304:12;266:52;354:9;341:23;383:18;424:2;416:6;413:14;410:34;;;440:1;437;430:12;410:34;478:6;467:9;463:22;453:32;;523:7;516:4;512:2;508:13;504:27;494:55;;545:1;542;535:12;494:55;585:2;572:16;611:2;603:6;600:14;597:34;;;627:1;624;617:12;597:34;682:7;675:4;665:6;662:1;658:14;654:2;650:23;646:34;643:47;640:67;;;703:1;700;693:12;640:67;734:4;726:13;;;;-1:-1:-1;758:6:12;-1:-1:-1;;799:20:12;;786:34;829:28;786:34;829:28;:::i;:::-;876:5;866:15;;;137:750;;;;;:::o;1084:423::-;1126:3;1164:5;1158:12;1191:6;1186:3;1179:19;1216:1;1226:162;1240:6;1237:1;1234:13;1226:162;;;1302:4;1358:13;;;1354:22;;1348:29;1330:11;;;1326:20;;1319:59;1255:12;1226:162;;;1230:3;1433:1;1426:4;1417:6;1412:3;1408:16;1404:27;1397:38;1496:4;1489:2;1485:7;1480:2;1472:6;1468:15;1464:29;1459:3;1455:39;1451:50;1444:57;;;1084:423;;;;:::o;1512:220::-;1661:2;1650:9;1643:21;1624:4;1681:45;1722:2;1711:9;1707:18;1699:6;1681:45;:::i;1737:131::-;-1:-1:-1;;;;;1812:31:12;;1802:42;;1792:70;;1858:1;1855;1848:12;1873:315;1941:6;1949;2002:2;1990:9;1981:7;1977:23;1973:32;1970:52;;;2018:1;2015;2008:12;1970:52;2057:9;2044:23;2076:31;2101:5;2076:31;:::i;:::-;2126:5;2178:2;2163:18;;;;2150:32;;-1:-1:-1;;;1873:315:12:o;2193:456::-;2270:6;2278;2286;2339:2;2327:9;2318:7;2314:23;2310:32;2307:52;;;2355:1;2352;2345:12;2307:52;2394:9;2381:23;2413:31;2438:5;2413:31;:::i;:::-;2463:5;-1:-1:-1;2520:2:12;2505:18;;2492:32;2533:33;2492:32;2533:33;:::i;:::-;2193:456;;2585:7;;-1:-1:-1;;;2639:2:12;2624:18;;;;2611:32;;2193:456::o;2836:156::-;2902:20;;2962:4;2951:16;;2941:27;;2931:55;;2982:1;2979;2972:12;2931:55;2836:156;;;:::o;3129:161::-;3196:20;;3256:8;3245:20;;3235:31;;3225:59;;3280:1;3277;3270:12;3295:747;3344:5;3397:3;3390:4;3382:6;3378:17;3374:27;3364:55;;3415:1;3412;3405:12;3364:55;3448:2;3442:9;3490:2;3482:6;3478:15;3559:6;3547:10;3544:22;3523:18;3511:10;3508:34;3505:62;3502:185;;;3609:10;3604:3;3600:20;3597:1;3590:31;3644:4;3641:1;3634:15;3672:4;3669:1;3662:15;3502:185;3703:2;3696:22;3738:6;3779:2;3767:15;;3794;;;3791:35;;;3822:1;3819;3812:12;3791:35;3846:6;3861:151;3877:6;3872:3;3869:15;3861:151;;;3945:22;3963:3;3945:22;:::i;:::-;3933:35;;3997:4;3988:14;;;;3894;3861:151;;;-1:-1:-1;4030:6:12;;3295:747;-1:-1:-1;;;;;3295:747:12:o;4047:539::-;4175:6;4183;4191;4199;4252:3;4240:9;4231:7;4227:23;4223:33;4220:53;;;4269:1;4266;4259:12;4220:53;4292:27;4309:9;4292:27;:::i;:::-;4282:37;;4369:2;4358:9;4354:18;4341:32;4382:31;4407:5;4382:31;:::i;:::-;4432:5;-1:-1:-1;4456:52:12;4500:7;4495:2;4480:18;;4456:52;:::i;:::-;4446:62;;4527:53;4572:7;4566:3;4555:9;4551:19;4527:53;:::i;:::-;4517:63;;4047:539;;;;;;;:::o;4591:241::-;4647:6;4700:2;4688:9;4679:7;4675:23;4671:32;4668:52;;;4716:1;4713;4706:12;4668:52;4755:9;4742:23;4774:28;4796:5;4774:28;:::i;4837:276::-;4895:6;4948:2;4936:9;4927:7;4923:23;4919:32;4916:52;;;4964:1;4961;4954:12;4916:52;5003:9;4990:23;5053:10;5046:5;5042:22;5035:5;5032:33;5022:61;;5079:1;5076;5069:12;5783:796;6108:3;6097:9;6090:22;6071:4;6135:46;6176:3;6165:9;6161:19;6153:6;6135:46;:::i;:::-;6229:9;6221:6;6217:22;6212:2;6201:9;6197:18;6190:50;6263:33;6289:6;6281;6263:33;:::i;:::-;6344:4;6332:17;;6327:2;6312:18;;6305:45;-1:-1:-1;;;;;6386:32:12;;6381:2;6366:18;;6359:60;6450:3;6435:19;;6428:35;;;6500:22;;;6406:3;6479:19;;6472:51;6249:47;-1:-1:-1;6540:33:12;6249:47;6558:6;6540:33;:::i;:::-;6532:41;5783:796;-1:-1:-1;;;;;;;;;5783:796:12:o;6584:247::-;6643:6;6696:2;6684:9;6675:7;6671:23;6667:32;6664:52;;;6712:1;6709;6702:12;6664:52;6751:9;6738:23;6770:31;6795:5;6770:31;:::i;6836:184::-;6894:6;6947:2;6935:9;6926:7;6922:23;6918:32;6915:52;;;6963:1;6960;6953:12;6915:52;6986:28;7004:9;6986:28;:::i;7025:256::-;7091:6;7099;7152:2;7140:9;7131:7;7127:23;7123:32;7120:52;;;7168:1;7165;7158:12;7120:52;7191:28;7209:9;7191:28;:::i;:::-;7181:38;;7238:37;7271:2;7260:9;7256:18;7238:37;:::i;:::-;7228:47;;7025:256;;;;;:::o;7886:388::-;7954:6;7962;8015:2;8003:9;7994:7;7990:23;7986:32;7983:52;;;8031:1;8028;8021:12;7983:52;8070:9;8057:23;8089:31;8114:5;8089:31;:::i;:::-;8139:5;-1:-1:-1;8196:2:12;8181:18;;8168:32;8209:33;8168:32;8209:33;:::i;:::-;8261:7;8251:17;;;7886:388;;;;;:::o;8279:340::-;8371:5;8394:1;8404:209;8418:4;8415:1;8412:11;8404:209;;;8481:13;;8496:8;8477:28;8465:41;;8529:4;8553:12;;;;8588:15;;;;8438:1;8431:9;8404:209;;8624:1080;8867:2;8919:21;;;8989:13;;8892:18;;;9011:22;;;8838:4;;8867:2;9052;;9070:18;;;;9111:15;;;8838:4;9154:524;9168:6;9165:1;9162:13;9154:524;;;9227:13;;9269:9;;-1:-1:-1;;;;;9265:35:12;9253:48;;9340:11;;;9334:18;9365:51;9403:12;;;9334:18;9365:51;:::i;:::-;;9465:2;9461;9457:11;9451:18;9482:55;9531:4;9526:3;9522:14;9506;9482:55;:::i;:::-;-1:-1:-1;9587:4:12;9579:13;9573:20;9566:4;9557:14;;9550:44;9623:6;9614:16;;;;9653:15;;;;9190:1;9183:9;9154:524;;;-1:-1:-1;9695:3:12;;8624:1080;-1:-1:-1;;;;;;;8624:1080:12:o;10227:734::-;10338:6;10346;10354;10362;10370;10378;10386;10439:3;10427:9;10418:7;10414:23;10410:33;10407:53;;;10456:1;10453;10446:12;10407:53;10495:9;10482:23;10514:31;10539:5;10514:31;:::i;:::-;10564:5;-1:-1:-1;10621:2:12;10606:18;;10593:32;10634:33;10593:32;10634:33;:::i;:::-;10686:7;-1:-1:-1;10740:2:12;10725:18;;10712:32;;-1:-1:-1;10791:2:12;10776:18;;10763:32;;-1:-1:-1;10814:37:12;10846:3;10831:19;;10814:37;:::i;:::-;10804:47;;10898:3;10887:9;10883:19;10870:33;10860:43;;10950:3;10939:9;10935:19;10922:33;10912:43;;10227:734;;;;;;;;;;:::o;11294:382::-;11359:6;11367;11420:2;11408:9;11399:7;11395:23;11391:32;11388:52;;;11436:1;11433;11426:12;11388:52;11475:9;11462:23;11494:31;11519:5;11494:31;:::i;:::-;11544:5;-1:-1:-1;11601:2:12;11586:18;;11573:32;11614:30;11573:32;11614:30;:::i;11681:336::-;11883:2;11865:21;;;11922:2;11902:18;;;11895:30;-1:-1:-1;;;11956:2:12;11941:18;;11934:42;12008:2;11993:18;;11681:336::o;12022:127::-;12083:10;12078:3;12074:20;12071:1;12064:31;12114:4;12111:1;12104:15;12138:4;12135:1;12128:15;12154:380;12233:1;12229:12;;;;12276;;;12297:61;;12351:4;12343:6;12339:17;12329:27;;12297:61;12404:2;12396:6;12393:14;12373:18;12370:38;12367:161;;12450:10;12445:3;12441:20;12438:1;12431:31;12485:4;12482:1;12475:15;12513:4;12510:1;12503:15;12539:184;12609:6;12662:2;12650:9;12641:7;12637:23;12633:32;12630:52;;;12678:1;12675;12668:12;12630:52;-1:-1:-1;12701:16:12;;12539:184;-1:-1:-1;12539:184:12:o;12728:339::-;12930:2;12912:21;;;12969:2;12949:18;;;12942:30;-1:-1:-1;;;13003:2:12;12988:18;;12981:45;13058:2;13043:18;;12728:339::o;13351:245::-;13418:6;13471:2;13459:9;13450:7;13446:23;13442:32;13439:52;;;13487:1;13484;13477:12;13439:52;13519:9;13513:16;13538:28;13560:5;13538:28;:::i;18692:547::-;19037:4;19025:17;;19007:36;;-1:-1:-1;;;;;19079:32:12;;19074:2;19059:18;;19052:60;18994:3;18979:19;;19121:51;19168:2;19153:18;;19145:6;19121:51;:::i;:::-;19181:52;19228:3;19217:9;19213:19;19205:6;19181:52;:::i;:::-;18692:547;;;;;;;:::o;20629:251::-;20699:6;20752:2;20740:9;20731:7;20727:23;20723:32;20720:52;;;20768:1;20765;20758:12;20720:52;20800:9;20794:16;20819:31;20844:5;20819:31;:::i;21529:127::-;21590:10;21585:3;21581:20;21578:1;21571:31;21621:4;21618:1;21611:15;21645:4;21642:1;21635:15;21661:980;21923:4;21971:3;21960:9;21956:19;22002:6;21991:9;21984:25;22028:2;22066:6;22061:2;22050:9;22046:18;22039:34;22109:3;22104:2;22093:9;22089:18;22082:31;22133:6;22168;22162:13;22199:6;22191;22184:22;22237:3;22226:9;22222:19;22215:26;;22276:2;22268:6;22264:15;22250:29;;22297:1;22307:195;22321:6;22318:1;22315:13;22307:195;;;22386:13;;-1:-1:-1;;;;;22382:39:12;22370:52;;22477:15;;;;22442:12;;;;22418:1;22336:9;22307:195;;;-1:-1:-1;;;;;;;22558:32:12;;;;22553:2;22538:18;;22531:60;-1:-1:-1;;;22622:3:12;22607:19;22600:35;22519:3;21661:980;-1:-1:-1;;;21661:980:12:o;23511:306::-;23599:6;23607;23615;23668:2;23656:9;23647:7;23643:23;23639:32;23636:52;;;23684:1;23681;23674:12;23636:52;23713:9;23707:16;23697:26;;23763:2;23752:9;23748:18;23742:25;23732:35;;23807:2;23796:9;23792:18;23786:25;23776:35;;23511:306;;;;;:::o;24504:225::-;24571:9;;;24592:11;;;24589:134;;;24645:10;24640:3;24636:20;24633:1;24626:31;24680:4;24677:1;24670:15;24708:4;24705:1;24698:15

Swarm Source

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