ETH Price: $3,477.63 (+4.82%)

Contract

0xD05D90A656FC375ac1478689D7bCD31098f2DD1f
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve212505042024-11-23 12:40:592 hrs ago1732365659IN
ChainFactory: FACTORY Token
0 ETH0.0007425316.04959847
Transfer212504322024-11-23 12:26:233 hrs ago1732364783IN
ChainFactory: FACTORY Token
0 ETH0.0013176810.9442961
Approve212499222024-11-23 10:44:114 hrs ago1732358651IN
ChainFactory: FACTORY Token
0 ETH0.0005562712.03615703
Approve212492112024-11-23 8:21:477 hrs ago1732350107IN
ChainFactory: FACTORY Token
0 ETH0.0006332413.69809464
Approve212461752024-11-22 22:12:2317 hrs ago1732313543IN
ChainFactory: FACTORY Token
0 ETH0.0004846720.02025714
Approve212461742024-11-22 22:12:1117 hrs ago1732313531IN
ChainFactory: FACTORY Token
0 ETH0.0004921420.27861649
Approve212461742024-11-22 22:12:1117 hrs ago1732313531IN
ChainFactory: FACTORY Token
0 ETH0.0004921420.27861649
Approve212418502024-11-22 7:42:3531 hrs ago1732261355IN
ChainFactory: FACTORY Token
0 ETH0.0005693312.24554136
Approve212395302024-11-21 23:56:2339 hrs ago1732233383IN
ChainFactory: FACTORY Token
0 ETH0.0003534813.43174952
Approve212395022024-11-21 23:50:3539 hrs ago1732233035IN
ChainFactory: FACTORY Token
0 ETH0.0003526612.11191028
Approve212388732024-11-21 21:43:5941 hrs ago1732225439IN
ChainFactory: FACTORY Token
0 ETH0.0007151815.38254076
Approve212383022024-11-21 19:49:4743 hrs ago1732218587IN
ChainFactory: FACTORY Token
0 ETH0.0012194526.22878326
Approve212383012024-11-21 19:49:3543 hrs ago1732218575IN
ChainFactory: FACTORY Token
0 ETH0.0011498524.89231819
Approve212356762024-11-21 11:02:112 days ago1732186931IN
ChainFactory: FACTORY Token
0 ETH0.0005568511.96170052
Approve212349482024-11-21 8:35:472 days ago1732178147IN
ChainFactory: FACTORY Token
0 ETH0.0005222411.29684253
Approve212347832024-11-21 8:02:112 days ago1732176131IN
ChainFactory: FACTORY Token
0 ETH0.000446959.61595448
Approve212347512024-11-21 7:55:472 days ago1732175747IN
ChainFactory: FACTORY Token
0 ETH0.0004658810.00772838
Approve212336902024-11-21 4:21:592 days ago1732162919IN
ChainFactory: FACTORY Token
0 ETH0.0002976110.20043658
Approve212328412024-11-21 1:31:232 days ago1732152683IN
ChainFactory: FACTORY Token
0 ETH0.00043899.44031529
Approve212325112024-11-21 0:25:112 days ago1732148711IN
ChainFactory: FACTORY Token
0 ETH0.0004747710.21182596
Approve212324452024-11-21 0:11:592 days ago1732147919IN
ChainFactory: FACTORY Token
0 ETH0.0005092410.95321377
Approve212321922024-11-20 23:20:592 days ago1732144859IN
ChainFactory: FACTORY Token
0 ETH0.0005493911.89036283
Approve212312062024-11-20 20:02:592 days ago1732132979IN
ChainFactory: FACTORY Token
0 ETH0.0008938419.33505121
Approve212305882024-11-20 17:58:472 days ago1732125527IN
ChainFactory: FACTORY Token
0 ETH0.0009338820.20122306
Approve212292792024-11-20 13:34:233 days ago1732109663IN
ChainFactory: FACTORY Token
0 ETH0.0007436815.97498054
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
212456302024-11-22 20:23:1119 hrs ago1732306991
ChainFactory: FACTORY Token
0.27980422 ETH
212456302024-11-22 20:23:1119 hrs ago1732306991
ChainFactory: FACTORY Token
0.27980422 ETH
212406942024-11-22 3:50:1135 hrs ago1732247411
ChainFactory: FACTORY Token
0.24246018 ETH
212406942024-11-22 3:50:1135 hrs ago1732247411
ChainFactory: FACTORY Token
0.24246018 ETH
212374102024-11-21 16:50:5946 hrs ago1732207859
ChainFactory: FACTORY Token
0.2813959 ETH
212374102024-11-21 16:50:5946 hrs ago1732207859
ChainFactory: FACTORY Token
0.2813959 ETH
212322002024-11-20 23:22:352 days ago1732144955
ChainFactory: FACTORY Token
0.31580499 ETH
212322002024-11-20 23:22:352 days ago1732144955
ChainFactory: FACTORY Token
0.31580499 ETH
212237912024-11-19 19:12:113 days ago1732043531
ChainFactory: FACTORY Token
0.33187819 ETH
212237912024-11-19 19:12:113 days ago1732043531
ChainFactory: FACTORY Token
0.33187819 ETH
212163872024-11-18 18:26:354 days ago1731954395
ChainFactory: FACTORY Token
0.35858646 ETH
212163872024-11-18 18:26:354 days ago1731954395
ChainFactory: FACTORY Token
0.35858646 ETH
212141082024-11-18 10:49:115 days ago1731926951
ChainFactory: FACTORY Token
0.38323095 ETH
212141082024-11-18 10:49:115 days ago1731926951
ChainFactory: FACTORY Token
0.38323095 ETH
212070162024-11-17 11:05:476 days ago1731841547
ChainFactory: FACTORY Token
0.35628013 ETH
212070162024-11-17 11:05:476 days ago1731841547
ChainFactory: FACTORY Token
0.35628013 ETH
212006892024-11-16 13:54:597 days ago1731765299
ChainFactory: FACTORY Token
0.30790982 ETH
212006892024-11-16 13:54:597 days ago1731765299
ChainFactory: FACTORY Token
0.30790982 ETH
211927702024-11-15 11:22:118 days ago1731669731
ChainFactory: FACTORY Token
0.37719575 ETH
211927702024-11-15 11:22:118 days ago1731669731
ChainFactory: FACTORY Token
0.37719575 ETH
211873352024-11-14 17:10:118 days ago1731604211
ChainFactory: FACTORY Token
0.35316742 ETH
211873352024-11-14 17:10:118 days ago1731604211
ChainFactory: FACTORY Token
0.35316742 ETH
211871492024-11-14 16:32:478 days ago1731601967
ChainFactory: FACTORY Token
0.36249828 ETH
211871492024-11-14 16:32:478 days ago1731601967
ChainFactory: FACTORY Token
0.36249828 ETH
211814672024-11-13 21:30:119 days ago1731533411
ChainFactory: FACTORY Token
0.48519008 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ChainFactory

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 1000 runs

Other Settings:
shanghai EvmVersion, MIT license
File 1 of 14 : ChainFactory.sol
/*
   ________          _       ______           __                  
  / ____/ /_  ____ _(_)___  / ____/___ ______/ /_____  _______  __
 / /   / __ \/ __ `/ / __ \/ /_  / __ `/ ___/ __/ __ \/ ___/ / / /
/ /___/ / / / /_/ / / / / / __/ / /_/ / /__/ /_/ /_/ / /  / /_/ / 
\____/_/ /_/\__,_/_/_/ /_/_/    \__,_/\___/\__/\____/_/   \__, /  
                                                         /____/   
  Smart-Contract generated and deployed by ChainFactory

  Web:      https://chainfactory.app/
  X:        https://x.com/ChainFactoryApp
  Telegram: https://t.me/ChainFactory
  Discord:  https://discord.gg/fpjxD39v3k
  YouTube:  https://youtube.com/@UpfrontDeFi

  By using this Smart-Contract generated and deployed by ChainFactory,
  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 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 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.

*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Ownable.sol";
import "./CF_Common.sol";
import "./CF_ERC20.sol";
import "./CF_Recoverable.sol";
import "./CF_Burnable.sol";
import "./CF_Blacklist.sol";
import "./CF_Whitelist.sol";
import "./CF_Cooldown.sol";
import "./CF_MaxBalance.sol";
import "./CF_Taxable.sol";
import "./CF_DEXRouterV2.sol";

contract ChainFactory is CF_Ownable, CF_Common, CF_ERC20, CF_Recoverable, CF_Burnable, CF_Blacklist, CF_Whitelist, CF_Cooldown, CF_MaxBalance, CF_Taxable, CF_DEXRouterV2 {
  constructor() {
    _name = unicode"ChainFactory";
    _symbol = unicode"FACTORY";
    _decimals = 18;
    _totalSupply = 75000000000000000000000000; // 75,000,000 FACTORY
    _transferOwnership(0xb8F8a463a725502B5E0642bB0dc55CA8d1675434);
    _transferInitialSupply(0xb8F8a463a725502B5E0642bB0dc55CA8d1675434, 100000); // 100%
    _setEarlyPenaltyTime(120); // 2min
    _setDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 0xb8F8a463a725502B5E0642bB0dc55CA8d1675434);
    _setReflection(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
    _setMinSwapPercent(500); // 0.5% of totalSupply
    _setMinTaxDistributionPercent(500); // 0.5% of totalSupply
    _setTaxBeneficiary(0, 0x6Aa1f46Fd34dDAa9f5EFcaB3Ebd43c54a87Cbf8E, [ uint24(0), uint24(5000), uint24(5000) ], [ uint24(40000), uint24(40000), uint24(40000) ]);
    _initialWhitelist([ 0xb8F8a463a725502B5E0642bB0dc55CA8d1675434 ]);
    _setCooldown(5, 3600, 3600); // 5 tx in 1h will result in a 1h freeze
    _setMaxBalancePercent(2000); // 2% of totalSupply
    _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 {
    require(!_blacklisted[from] && !_blacklisted[to], "Blacklisted");
    require(to != address(0xdEaD));

    if (!_distributing && !_swapping && (from != _dex.pair && from != _dex.router)) {
      _autoSwap(false);
      _autoTaxDistribute(false);
    }

    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 {
        if (_cooldownPeriod > 0 && from != _dex.pair) {
          require(remainingCooldownTime(from) == 0, "Cooldown");

          if (_holder[from].start + _cooldownTriggerTime < _timestamp()) {
            _holder[from].count = 1;
            _holder[from].start = _timestamp();
          } else {
            if (++_holder[from].count >= _cooldownTriggerCount) { _cooldown(from); }
          }
        }

        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 if (_taxBeneficiary[i].account == address(0xdEaD)) {
              _burn(address(this), taxAmount);
            } else {
              _taxBeneficiary[i].unclaimed += taxAmount;
              _amountForTaxDistribution += taxAmount;
            }

            appliedTax += taxAmount;
          }

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

            amount -= appliedTax;
          }
        }
      }
    }

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

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

    _setMaxBalancePercent(_maxBalancePercent);
    _setMinTaxDistributionPercent(_minTaxDistributionPercent);
    _setMinSwapPercent(_minSwapPercent);
  }

  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 Blacklist, bool Whitelist, bool Cooldown, bool MaxBalance, bool Taxable, bool DEXRouterV2) {
    return (_renounced.Blacklist, _renounced.Whitelist, _renounced.Cooldown, _renounced.MaxBalance, _renounced.Taxable, _renounced.DEXRouterV2);
  }

  /// @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 { }
}

File 2 of 14 : CF_Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

abstract contract CF_Ownable {
  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 {
    _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 3 of 14 : CF_Common.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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

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

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

  address[] internal _holders;

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

  uint8 internal immutable _decimals;
  uint8 internal _cooldownTriggerCount;
  uint24 internal constant _denominator = 1000;
  uint24 internal _maxBalancePercent;
  uint24 internal _totalTxTax;
  uint24 internal _totalBuyTax;
  uint24 internal _totalSellTax;
  uint24 internal _totalPenaltyTxTax;
  uint24 internal _totalPenaltyBuyTax;
  uint24 internal _totalPenaltySellTax;
  uint24 internal _minTaxDistributionPercent;
  uint24 internal _minSwapPercent;
  uint32 internal _lastTaxDistribution;
  uint32 internal _tradingEnabled;
  uint32 internal _lastSwap;
  uint32 internal _earlyPenaltyTime;
  uint32 internal _cooldownTriggerTime;
  uint32 internal _cooldownPeriod;
  uint256 internal _totalSupply;
  uint256 internal _totalBurned;
  uint256 internal _maxBalanceAmount;
  uint256 internal _totalTaxCollected;
  uint256 internal _minTaxDistributionAmount;
  uint256 internal _amountForTaxDistribution;
  uint256 internal _amountSwappedForTaxDistribution;
  uint256 internal _minSwapAmount;
  uint256 internal _amountForLiquidity;
  uint256 internal _ethForTaxDistribution;
  uint256 internal _reflectionTokensForTaxDistribution;

  struct Renounced {
    bool Blacklist;
    bool Whitelist;
    bool Cooldown;
    bool MaxBalance;
    bool Taxable;
    bool DEXRouterV2;
  }

  struct holderAccount {
    bool exists;
    bool penalty;
    uint32 count;
    uint32 start;
    uint32 cooldown;
  }

  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;
  DEXRouterV2 internal _dex;
  IERC20 internal _reflectionToken;

  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 version() external pure returns (string memory) {
    return _version;
  }

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

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

pragma solidity 0.8.23;

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 14 : CF_Recoverable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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

abstract contract CF_Recoverable is CF_Ownable, CF_Common {
  /// @notice Recovers a misplaced amount of an ERC-20 token sitting in the contract balance
  /// @dev Beware of scam tokens!
  /// @dev Amounts allocated for tax distribution and liquidity cannot be recovered unless forced
  /// @param token Address of the ERC-20 token
  /// @param to Recipient
  /// @param amount Amount to be transferred
  /// @param force Retrieve amounts allocated for tax distribution and liquidity if needed
  function recoverERC20(address token, address to, uint256 amount, bool force) external onlyOwner {
    unchecked {
      uint256 balance = IERC20(token).balanceOf(address(this));
      uint256 allocated = token == address(this) ? _amountForTaxDistribution + _amountForLiquidity : (address(_reflectionToken) == token ? _reflectionTokensForTaxDistribution : 0);

      require((!force && balance - (allocated >= balance ? balance : allocated) >= amount) || (force && balance >= amount), "Exceeds balance");

      if (force && (token == address(this) || address(_reflectionToken) == token) && balance - (allocated >= balance ? balance : allocated) < amount) {
        require(!_distributing && !_swapping);

        if (token == address(this)) {
          uint256 pickFromAmountForTaxDistribution = amount >= _amountForTaxDistribution ? _amountForTaxDistribution : _amountForTaxDistribution - amount;

          _amountForTaxDistribution -= pickFromAmountForTaxDistribution;
          allocated -= pickFromAmountForTaxDistribution;

          if (balance - (allocated >= balance ? balance : allocated) < amount) { _amountForLiquidity -= amount >= _amountForLiquidity ? _amountForLiquidity : _amountForLiquidity - amount; }
        } else if (address(_reflectionToken) == token) {
          _reflectionTokensForTaxDistribution -= amount >= _reflectionTokensForTaxDistribution ? _reflectionTokensForTaxDistribution : _reflectionTokensForTaxDistribution - amount;
        }
      }
    }

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

  /// @notice Recovers a misplaced amount of native ETH sitting in the contract balance
  /// @dev Amounts allocated for tax distribution and/or liquidity cannot be recovered unless forced
  /// @param to Recipient
  /// @param amount Amount of ETH to be transferred
  /// @param force Retrieve amounts allocated for tax distribution and liquidity if needed
  function recoverETH(address payable to, uint256 amount, bool force) external onlyOwner {
    unchecked {
      uint256 balance = address(this).balance;
      uint256 allocated = address(_reflectionToken) == _dex.WETH ? _ethForTaxDistribution : 0;

      require((!force && balance - (allocated >= balance ? balance : allocated) >= amount) || (force && balance >= amount), "Exceeds balance");

      if (force && address(_reflectionToken) == _dex.WETH && balance - (allocated >= balance ? balance : allocated) < amount) {
        require(!_distributing && !_swapping);

        _ethForTaxDistribution -= amount >= _ethForTaxDistribution ? _ethForTaxDistribution : _ethForTaxDistribution - amount;
      }
    }

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

    require(success);
  }
}

File 6 of 14 : CF_Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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

abstract contract CF_Burnable is CF_Common, CF_ERC20 {
  /// @notice Total amount of tokens burned so far
  function totalBurned() external view returns (uint256) {
    return _totalBurned;
  }

  function burn(uint256 amount) external {
    _burn(msg.sender, amount);
  }

  function burnFrom(address account, uint256 amount) external {
    _spendAllowance(account, msg.sender, amount);
    _burn(account, amount);
  }

  function _burn(address account, uint256 amount) internal virtual {
    require(_balance[account] >= amount, "Exceeds balance");

    unchecked {
      _balance[account] -= amount;
      _totalSupply -= amount;
      _totalBurned += amount;
    }

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

File 7 of 14 : CF_Blacklist.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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

abstract contract CF_Blacklist is CF_Ownable, CF_Common {
  event Blacklisted(address indexed account, bool status);
  event RenouncedBlacklist();

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

    emit RenouncedBlacklist();
  }

  /// @notice Check if an address is blacklisted.
  /// @param account Address to check
  function isBlacklisted(address account) external view returns (bool) {
    return _blacklisted[account];
  }

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

  function _blacklist(address account, bool status) internal {
    require(!_renounced.Blacklist);
    require(account != _owner && account != address(0) && account != address(0xdEaD));
    require(account != _dex.router && account != _dex.pair, "DEX router or pair");

    if (status) { require(!_whitelisted[account], "Whitelisted"); }

    _blacklisted[account] = status;

    emit Blacklisted(account, status);
  }

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

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

File 8 of 14 : CF_Whitelist.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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

abstract contract CF_Whitelist is CF_Ownable, CF_Common {
  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) && account != address(0xdEaD));
    require(account != _dex.router && account != _dex.pair, "DEX router and pair are privileged");

    if (status) { require(!_blacklisted[account], "Blacklisted"); }

    _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[1] memory accounts) internal {
    require(!_initialized);

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

File 9 of 14 : CF_Cooldown.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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

abstract contract CF_Cooldown is CF_Ownable, CF_Common {
  event SetCooldown(uint8 count, uint32 time, uint32 period);
  event RenouncedCooldown();

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

    emit RenouncedCooldown();
  }

  /// @notice Set cooldown settings
  /// @param count Number of transfers
  /// @param time Seconds during which the number of transfers will be taken into account
  /// @param period Seconds during which the wallet will be in cooldown
  function setCooldown(uint8 count, uint32 time, uint32 period) external onlyOwner {
    require(!_renounced.Cooldown);

    _setCooldown(count, time, period);
  }

  function _setCooldown(uint8 count, uint32 time, uint32 period) internal {
    require(count > 1 && time > 5);

    _cooldownTriggerCount = count;
    _cooldownTriggerTime = time;
    _cooldownPeriod = period;

    emit SetCooldown(count, time, period);
  }

  function _cooldown(address account) internal {
    unchecked {
      _holder[account].cooldown = _timestamp() + _cooldownPeriod;
    }
  }

  /// @notice Removes the cooldown status of a wallet
  /// @param account Address to unfreeze
  function removeCooldown(address account) external onlyOwner {
    require(!_renounced.Cooldown);

    _holder[account].count = 0;
    _holder[account].start = 0;
    _holder[account].cooldown = 0;
  }

  /// @notice Check if a wallet is currently in cooldown
  /// @param account Address to check
  /// @return Remaining seconds in cooldown
  function remainingCooldownTime(address account) public view returns (uint32) {
    if (_cooldownPeriod == 0 || !_holder[account].exists || _holder[account].cooldown < _timestamp()) { return 0; }

    unchecked {
      return _holder[account].cooldown - _timestamp();
    }
  }
}

File 10 of 14 : CF_MaxBalance.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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

abstract contract CF_MaxBalance is CF_Ownable, CF_Common {
  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
  function setMaxBalancePercent(uint24 percent) external onlyOwner {
    require(!_renounced.MaxBalance);

    unchecked {
      require(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 11 of 14 : CF_Taxable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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

abstract contract CF_Taxable is CF_Ownable, CF_Common, 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) {
    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) {
    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(0));

    taxBeneficiary storage _taxBeneficiary = _taxBeneficiary[slot];

    if (account == address(0xdEaD) && _taxBeneficiary.exists && _taxBeneficiary.unclaimed > 0) { revert("Unclaimed taxes"); }

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

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

      require(_totalTxTax <= 25 * _denominator && _totalBuyTax <= 25 * _denominator && _totalSellTax <= 25 * _denominator, "High Tax");
      require(_totalPenaltyTxTax <= 50 * _denominator && _totalPenaltyBuyTax <= 50 * _denominator && _totalPenaltySellTax <= 50 * _denominator, "High 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 and the min. threshold has been reached unless forced
  /// @param force Ignore the min. threshold amount
  function autoTaxDistribute(bool force) external onlyOwner {
    require(!_swapping && !_distributing);

    _autoTaxDistribute(force);
  }

  function _autoTaxDistribute(bool force) internal lockDistributing {
    if (!force) {
      if (address(_reflectionToken) == address(this) && (_amountForTaxDistribution == 0 || _balance[address(this)] < _amountForTaxDistribution || _amountForTaxDistribution < _minTaxDistributionAmount)) { return; }
      if (address(_reflectionToken) == _dex.WETH && (_ethForTaxDistribution == 0 || _ethForTaxDistribution < address(this).balance)) { return; }
      if (address(_reflectionToken) != address(this) && address(_reflectionToken) != _dex.WETH && (_reflectionTokensForTaxDistribution == 0 || _reflectionTokensForTaxDistribution < _reflectionToken.balanceOf(address(this)))) { return; }
    }

    unchecked {
      uint256 distributed;

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

        if (unclaimed == 0 || account == address(0xdEaD) || account == _dex.pair) { continue; }

        uint256 _distributed = _distribute(account, unclaimed);

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

        distributed += _distributed;
      }

      _lastTaxDistribution = _timestamp();

      emit TaxDistributed(distributed);
    }
  }

  function _distribute(address account, uint256 unclaimed) private returns (uint256) {
    if (address(_reflectionToken) == address(this)) {
      super._transfer(address(this), account, unclaimed);

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

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

        if (_ethForTaxDistribution < amount) { return 0; }

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

        if (!success) { return 0; }

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

        if (_reflectionTokensForTaxDistribution < unclaimed) { return 0; }

        _reflectionToken.transfer(account, amount);
        _reflectionTokensForTaxDistribution -= amount;
      }

      _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 Returns the minimum percentage of the total supply accumulated in the Smart-Contract balance to trigger tax distribution
  function getMinTaxDistributionPercent() external view returns (uint24) {
    return _minTaxDistributionPercent;
  }

  /// @notice Sets the minimum percentage of the total supply accumulated in the Smart-Contract balance to trigger tax distribution
  /// @param percent Desired percentage, multiplied by denominator
  function setMinTaxDistributionPercent(uint24 percent) external onlyOwner {
    require(!_renounced.Taxable);
    require(percent >= 1 && percent <= 1000, "0.001% to 1%");

    _setMinTaxDistributionPercent(percent);
  }

  function _setMinTaxDistributionPercent(uint24 percent) internal {
    _minTaxDistributionPercent = percent;
    _minTaxDistributionAmount = _percentage(_totalSupply, uint256(percent));
  }

  /// @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 Defines the period of time from contract creation during which early buyers will be penalized
  /// @param time Time, in seconds
  function setEarlyPenaltyTime(uint32 time) external onlyOwner {
    require(!_renounced.Taxable);
    require(time <= 7 days);

    _setEarlyPenaltyTime(time);
  }

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

    emit SetEarlyPenaltyTime(time);
  }
}

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

pragma solidity 0.8.23;

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

abstract contract CF_DEXRouterV2 is CF_Ownable, CF_Common, CF_ERC20 {
  event SwapAndLiquify(uint256 tokenAmount, uint256 ethAmount, uint256 liquidity);
  event SwappedTokensForETH(uint256 tokenAmount, uint256 ethAmount);
  event SwappedTokensForERC20(address token, uint256 token0Amount, uint256 token1Amount);
  event SetDEXRouter(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 setDEXRouter(address router, address receiver) external onlyOwner returns (address) {
    require(!_renounced.DEXRouterV2);

    return _setDEXRouter(router, receiver);
  }

  function _setDEXRouter(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 SetDEXRouter(router, _dex.pair, receiver);

    return _dex.pair;
  }

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

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

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

  /// @notice Returns address of the reflection token
  function getReflectionToken() external view returns (address) {
    return address(_reflectionToken);
  }

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

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

  /// @notice Assign the excess token balance of the Smart-Contract to liquidity
  function liquifyExcess() external onlyOwner {
    require(_swapEnabled && !_swapping);

    unchecked {
      uint256 assigned = _amountForTaxDistribution + _amountForLiquidity;

      require(_balance[address(this)] > assigned);

      uint256 excess = _balance[address(this)] - assigned;

      _amountForLiquidity += excess;
    }

    _autoSwap(false);
  }

  /// @notice Swaps the assigned amount for liquidity and taxes to the corresponding token
  /// @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. threshold amount
  function autoSwap(bool force) external onlyOwner {
    require(_swapEnabled && !_swapping && !_distributing);

    _autoSwap(force);
  }

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

    unchecked {
      if (force || ((address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + _amountForLiquidity / 2 >= _minSwapAmount && _balance[address(this)] >= (address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + _amountForLiquidity)) {
        uint256 tokenAmountForLiquidity = _amountForLiquidity / 2;
        uint256 ethBalance = address(this).balance;
        address[] memory pathToSwapExactTokensForETH = new address[](2);
        pathToSwapExactTokensForETH[0] = address(this);
        pathToSwapExactTokensForETH[1] = _dex.WETH;

        _approve(address(this), _dex.router, (address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + tokenAmountForLiquidity);

        try IDEXRouterV2(_dex.router).swapExactTokensForETHSupportingFeeOnTransferTokens((address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + tokenAmountForLiquidity, 0, pathToSwapExactTokensForETH, address(this), block.timestamp + 1) {
          _lastSwap = _timestamp();

          if (_amountForLiquidity > 0) { _amountForLiquidity /= 2; }

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

          emit SwappedTokensForETH((address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + tokenAmountForLiquidity, ethAmount);

          if (ethAmount > 0) {
            uint256 ethForLiquidity = ethAmount;

            if (address(_reflectionToken) == _dex.WETH) {
              ethForLiquidity = _percentage(ethAmount, tokenAmountForLiquidity >= _amountForTaxDistribution ? (100 * uint256(_denominator)) - ((uint256(_denominator) * _amountForTaxDistribution * 100) / (tokenAmountForLiquidity + _amountForTaxDistribution)) : (uint256(_denominator) * tokenAmountForLiquidity * 100) / (tokenAmountForLiquidity + _amountForTaxDistribution));

              _amountSwappedForTaxDistribution += _amountForTaxDistribution;
              _amountForTaxDistribution = 0;
              _ethForTaxDistribution += ethAmount - ethForLiquidity;
            }

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

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

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

      if (force || (address(_reflectionToken) != address(this) && address(_reflectionToken) != _dex.WETH && _amountForTaxDistribution >= _minSwapAmount && _balance[address(this)] >= _amountForTaxDistribution)) {
        uint256 reflectionTokenBalance = _reflectionToken.balanceOf(address(this));
        address[] memory pathToSwapExactTokensForERC20 = new address[](3);
        pathToSwapExactTokensForERC20[0] = address(this);
        pathToSwapExactTokensForERC20[1] = _dex.WETH;
        pathToSwapExactTokensForERC20[2] = address(_reflectionToken);

        _reflectionToken.approve(_dex.router, _amountForTaxDistribution);

        try IDEXRouterV2(_dex.router).swapExactTokensForTokensSupportingFeeOnTransferTokens(_amountForTaxDistribution, 0, (pathToSwapExactTokensForERC20), address(this), block.timestamp + 1) {
          emit SwappedTokensForERC20(address(_reflectionToken), _amountForTaxDistribution, reflectionTokenBalance - _reflectionToken.balanceOf(address(this)));

          _amountSwappedForTaxDistribution += _amountForTaxDistribution;
          _amountForTaxDistribution = 0;
          _reflectionTokensForTaxDistribution += reflectionTokenBalance - _reflectionToken.balanceOf(address(this));
        } catch {
          _reflectionToken.approve(_dex.router, 0);
        }
      }
    }
  }

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

    _setReflection(token);
  }

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

    if (token == address(0)) { token == address(this); }

    _reflectionToken = IERC20(token);
  }

  /// @notice Returns the minimum percentage of the total supply in the Smart-Contract balance to trigger auto swap
  function getMinSwapPercent() external view returns (uint24) {
    return _minSwapPercent;
  }

  /// @notice Sets the minimum percentage of the total supply in the Smart-Contract balance to trigger auto swap
  /// @param percent Desired percentage, multiplied by denominator
  function setMinSwapPercent(uint24 percent) external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(percent >= 1 && percent <= 1000, "0.001% to 1%");

    _setMinSwapPercent(percent);
  }

  function _setMinSwapPercent(uint24 percent) internal {
    _minSwapPercent = percent;
    _minSwapAmount = _percentage(_totalSupply, uint256(percent));
  }

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

    _swapEnabled = status;
  }

  /// @notice Enables or disables the trading capability via the DEX set up
  /// @param status True to enable, False to disable
  function setTradingStatus(bool status) external onlyOwner {
    require(!_renounced.DEXRouterV2);

    _tradingEnabled = status ? _timestamp() : 0;
  }
}

File 13 of 14 : IDEXV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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 14 of 14 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "optimizer": {
    "enabled": true,
    "runs": 1000
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Blacklisted","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":"RenouncedBlacklist","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedCooldown","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedDEXRouterV2","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedMaxBalance","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedTaxable","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"count","type":"uint8"},{"indexed":false,"internalType":"uint32","name":"time","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"period","type":"uint32"}],"name":"SetCooldown","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":"SetDEXRouter","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":"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":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"token0Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"token1Amount","type":"uint256"}],"name":"SwappedTokensForERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"SwappedTokensForETH","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":[{"internalType":"bool","name":"force","type":"bool"}],"name":"autoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"force","type":"bool"}],"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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","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":"view","type":"function"},{"inputs":[],"name":"getDEXPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXRouter","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":"getMinSwapPercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinTaxDistributionPercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReflectionToken","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPenalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwapEnabled","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":"liquifyExcess","outputs":[],"stateMutability":"nonpayable","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"},{"internalType":"bool","name":"force","type":"bool"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"force","type":"bool"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"remainingCooldownTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removePenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceDEXRouterV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMaxBalance","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":"Blacklist","type":"bool"},{"internalType":"bool","name":"Whitelist","type":"bool"},{"internalType":"bool","name":"Cooldown","type":"bool"},{"internalType":"bool","name":"MaxBalance","type":"bool"},{"internalType":"bool","name":"Taxable","type":"bool"},{"internalType":"bool","name":"DEXRouterV2","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":"uint8","name":"count","type":"uint8"},{"internalType":"uint32","name":"time","type":"uint32"},{"internalType":"uint32","name":"period","type":"uint32"}],"name":"setCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"receiver","type":"address"}],"name":"setDEXRouter","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":"setMinSwapPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMinTaxDistributionPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setReflection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setSwapStatus","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":"bool","name":"status","type":"bool"}],"name":"setTradingStatus","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":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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"}]

60c060405234801562000010575f80fd5b5060408051808201909152600c81526b436861696e466163746f727960a01b6020820152601b9062000043908262001171565b50604080518082019091526007815266464143544f525960c81b6020820152601c9062000071908262001171565b50601260a0526a3e09de2596099e2b000000600a55620000a573b8f8a463a725502b5e0642bb0dc55ca8d1675434620002ba565b620000c873b8f8a463a725502b5e0642bb0dc55ca8d1675434620186a062000309565b620000d460786200038e565b62000108737a250d5630b4cf539739df2c5dacb4c659f2488d73b8f8a463a725502b5e0642bb0dc55ca8d1675434620003f2565b506200012873c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2620006e3565b60088054600a54620186a06101f49091020460118190556001600160d01b03909116637d00007d60d21b17909155600e5560408051606080820183525f80835261138860208085018290528486019190915284519283018552619c4080845290830181905293820193909352620001b69291736aa1f46fd34ddaa9f5efcab3ebd43c54a87cbf8e9162000871565b604080516020810190915273b8f8a463a725502b5e0642bb0dc55ca8d16754348152620001e39062000cf8565b620001f36005610e108062000d44565b620002006107d062000e09565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f601b6040516200023291906200123d565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f198184030181529190528051602090910120601d5560016080526200136a565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6080511562000316575f80fd5b5f62000330600a548362ffffff1662000e8f60201b60201c565b6001600160a01b0384165f818152600160205260408082208490555192935090917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620003819085815260200190565b60405180910390a3505050565b6009805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020015b60405180910390a150565b5f6001600160a01b03831662000406575f80fd5b6016546001600160a01b0384811691161462000657575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200045e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004849190620012b7565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004c4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004ea9190620012b7565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156200053b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005619190620012b7565b90506001600160a01b038116620005e7576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015620005be573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005e49190620012b7565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b038381169116146200068957601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a3506017546001600160a01b031692915050565b6001600160a01b03811615806200070257506001600160a01b03811630145b806200071b57506018546001600160a01b038281169116145b806200081357506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa1580156200076a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620007909190620012b7565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015620007e1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620008079190620012b7565b6001600160a01b031614155b6200084f5760405162461bcd60e51b81526020600482015260076024820152662737902830b4b960c91b60448201526064015b60405180910390fd5b601a80546001600160a01b0319166001600160a01b0392909216919091179055565b60058460ff161062000881575f80fd5b6001600160a01b0383163014801590620008a357506001600160a01b03831615155b620008ac575f80fd5b60ff84165f9081526006602052604090206001600160a01b03841661dead148015620008d95750805460ff165b8015620008e957505f8160030154115b156200092a5760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b604482015260640162000846565b8054610100600160a81b0319166101006001600160a01b0386160217815562000959600182018460036200101e565b506200096b600282018360036200101e565b50805460ff166200097d575f62000988565b600181015462ffffff165b83516008805462ffffff60401b19811693909203680100000000000000009283900462ffffff9081169190910116909102919091179055805460ff16620009d0575f620009e2565b60018101546301000000900462ffffff165b60208401516008805462ffffff60581b198116939092036b0100000000000000000000009283900462ffffff9081169190910116909102919091179055805460ff1662000a30575f62000a45565b60018101546601000000000000900462ffffff165b60408401516008805462ffffff60701b19811693909203600160701b9283900462ffffff9081169190910116909102919091179055805460ff1662000a8b575f62000a96565b600281015462ffffff165b82516008805462ffffff60881b19811693909203600160881b9283900462ffffff9081169190910116909102919091179055805460ff1662000ad9575f62000aeb565b60028101546301000000900462ffffff165b60208301516008805462ffffff60a01b19811693909203600160a01b9283900462ffffff9081169190910116909102919091179055805460ff1662000b31575f62000b46565b60028101546601000000000000900462ffffff165b60408301516008805462ffffff60b81b19811693909203600160b81b9283900462ffffff90811691909101811690920292909217918290556161a868010000000000000000909204161180159062000bb757506008546161a86b01000000000000000000000090910462ffffff1611155b801562000bd557506008546161a8600160701b90910462ffffff1611155b62000c0e5760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b604482015260640162000846565b60085461c350600160881b90910462ffffff161180159062000c41575060085461c350600160a01b90910462ffffff1611155b801562000c5f575060085461c350600160b81b90910462ffffff1611155b62000c9c5760405162461bcd60e51b815260206004820152600c60248201526b486967682050656e616c747960a01b604482015260640162000846565b805460ff1662000cb257805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405162000ce9949392919062001329565b60405180910390a15050505050565b6080511562000d05575f80fd5b5f5b600181101562000d405762000d3782826001811062000d2a5762000d2a620012e6565b6020020151600162000e99565b60010162000d07565b5050565b60018360ff1611801562000d5e575060058263ffffffff16115b62000d67575f80fd5b6008805460ff60201b191664010000000060ff86169081029190911790915560098054600160801b600160c01b031916600160801b63ffffffff86811691820263ffffffff60a01b191692909217600160a01b92861692830217909255604080519384526020840192909252908201527f24b1343f86058af6b8e48d5f9ca6b4e206b72690500086e848cc587b2f4097149060600160405180910390a1505050565b6008805462ffffff60281b19166501000000000062ffffff84169081029190911790915562000e39575f62000e4b565b600a54620186a062ffffff8316909102045b600c5560805162000e8c5760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c990602001620003e7565b50565b620186a091020490565b601554610100900460ff161562000eae575f80fd5b6001600160a01b0382161580159062000ed257506001600160a01b03821661dead14155b62000edb575f80fd5b6016546001600160a01b0383811691161480159062000f0857506017546001600160a01b03838116911614155b62000f615760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b606482015260840162000846565b801562000fc0576001600160a01b0382165f9081526003602052604090205460ff161562000fc05760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b604482015260640162000846565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b600183019183908215620010ab579160200282015f5b838211156200107857835183826101000a81548162ffffff021916908362ffffff160217905550926020019260030160208160020104928301926001030262001034565b8015620010a95782816101000a81549062ffffff021916905560030160208160020104928301926001030262001078565b505b50620010b9929150620010bd565b5090565b5b80821115620010b9575f8155600101620010be565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620010fc57607f821691505b6020821081036200111b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200116c57805f5260205f20601f840160051c81016020851015620011485750805b601f840160051c820191505b8181101562001169575f815560010162001154565b50505b505050565b81516001600160401b038111156200118d576200118d620010d3565b620011a5816200119e8454620010e7565b8462001121565b602080601f831160018114620011db575f8415620011c35750858301515b5f19600386901b1c1916600185901b17855562001235565b5f85815260208120601f198616915b828110156200120b57888601518255948401946001909101908401620011ea565b50858210156200122957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8083546200124c81620010e7565b600182811680156200126757600181146200127d57620012ab565b60ff1984168752821515830287019450620012ab565b875f526020805f205f5b85811015620012a25781548a82015290840190820162001287565b50505082870194505b50929695505050505050565b5f60208284031215620012c8575f80fd5b81516001600160a01b0381168114620012df575f80fd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b805f5b60038110156200132357815162ffffff16845260209384019390910190600101620012fd565b50505050565b60ff851681526001600160a01b03841660208201526101008101620013526040830185620012fa565b6200136160a0830184620012fa565b95945050505050565b60805160a051615d7d620013935f395f818161066b015261155201525f613cbd0152615d7d5ff3fe608060405260043610610486575f3560e01c8063715018a611610251578063a6cbe5c111610148578063d505accf116100c9578063f2fde38b11610083578063f4db96981161006b578063f4db969814610dca578063f59c370814610de7578063fe575a8714610e0657005b8063f2fde38b14610d6f578063f3dc4f4814610d8e57005b8063d89135cd116100b1578063d89135cd14610d03578063dd62ed3e14610d17578063e2745ef214610d5b57005b8063d505accf14610cd0578063d8454a8214610cef57005b8063c78fe0d41161011a578063cc1776d311610102578063cc1776d314610c27578063d1ace71014610c3b578063d232c22014610c5a57005b8063c78fe0d414610bf4578063c997eb8d14610c0857005b8063a6cbe5c114610b6e578063a9059cbb14610ba2578063be5e49b214610bc1578063c77e006d14610be057005b80638d8350ca116101d257806396ce0795116101a4578063a457c2d71161018c578063a457c2d714610b11578063a4d8971a14610b30578063a5596b4f14610b4f57005b806396ce079514610ade5780639caf0c2514610af257005b80638d8350ca14610a705780638da5cb5b14610a8f57806395101f9014610aab57806395d89b4114610aca57005b80637b1ab0d2116102235780637ecebe001161020b5780637ecebe0014610a145780638324c3b914610a485780638bf1acff14610a5c57005b80637b1ab0d2146109d65780637b1ad1d7146109f557005b8063715018a61461096d57806375de14961461098157806379b3d411146109a357806379cc6790146109b757005b80633644e5151161037d5780634f7041a5116102fe5780635f641758116102b85780636d5c1490116102a05780636d5c1490146108f95780636f05be971461091857806370a082311461093957005b80635f641758146108bb5780636bdb5ad1146108da57005b806354fd4d50116102e657806354fd4d501461085b5780635bbb7a51146108885780635f189361146108a757005b80634f7041a51461082a5780635117cdee1461083e57005b8063395093511161034f5780633ed8a169116103375780633ed8a169146107cd578063404e5129146107ec57806342966c681461080b57005b806339509351146107775780633af32abf1461079657005b80633644e5151461070a578063370158ea1461071e578063379ba1d91461074457806339137f8b1461076357005b8063186488a811610407578063313ce567116103d957806333d48a7d116103c157806333d48a7d146106b4578063351a964d146106d457806335ed71a8146106eb57005b8063313ce56714610658578063326339671461069557005b8063186488a8146105dc57806323b872dd146105fb5780632984207a1461061a5780632add44041461063957005b806307e9652c11610458578063095ea7b311610440578063095ea7b3146105825780630ac769dc146105a157806318160ddd146105be57005b806307e9652c14610534578063095233081461055157005b806301b38af51461048f5780630588b1a5146104ae578063064a59d0146104e357806306fdde031461051357005b3661048d57005b005b34801561049a575f80fd5b5061048d6104a93660046155f4565b610e3d565b3480156104b9575f80fd5b50600854600160d01b900462ffffff165b60405162ffffff90911681526020015b60405180910390f35b3480156104ee575f80fd5b50600954640100000000900463ffffffff1615155b60405190151581526020016104da565b34801561051e575f80fd5b50610527610ed4565b6040516104da91906156b6565b34801561053f575f80fd5b5060085462010000900460ff16610503565b34801561055c575f80fd5b506016546001600160a01b03165b6040516001600160a01b0390911681526020016104da565b34801561058d575f80fd5b5061050361059c3660046156dc565b610f64565b3480156105ac575f80fd5b50601a546001600160a01b031661056a565b3480156105c9575f80fd5b50600a545b6040519081526020016104da565b3480156105e7575f80fd5b5061048d6105f63660046157ab565b610f7a565b348015610606575f80fd5b50610503610615366004615801565b610feb565b348015610625575f80fd5b5061048d610634366004615852565b61100c565b348015610644575f80fd5b5061048d61065336600461586b565b61108c565b348015610663575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016104da565b3480156106a0575f80fd5b5061048d6106af3660046158bb565b611388565b3480156106bf575f80fd5b50600854600160e81b900462ffffff166104ca565b3480156106df575f80fd5b5060085460ff16610503565b3480156106f6575f80fd5b5061048d6107053660046158d4565b61146e565b348015610715575f80fd5b50601d546105ce565b348015610729575f80fd5b50610732611544565b6040516104da969594939291906158ef565b34801561074f575f80fd5b5061048d61075e3660046158d4565b6116cd565b34801561076e575f80fd5b5061048d611763565b348015610782575f80fd5b506105036107913660046156dc565b6117e4565b3480156107a1575f80fd5b506105036107b0366004615952565b6001600160a01b03165f9081526004602052604090205460ff1690565b3480156107d8575f80fd5b5061048d6107e73660046158bb565b611818565b3480156107f7575f80fd5b5061048d61080636600461596d565b6118cf565b348015610816575f80fd5b5061048d6108253660046159a4565b611925565b348015610835575f80fd5b506104ca61192f565b348015610849575f80fd5b506017546001600160a01b031661056a565b348015610866575f80fd5b506040805180820190915260058152640312e302e360dc1b6020820152610527565b348015610893575f80fd5b5061048d6108a2366004615952565b61193e565b3480156108b2575f80fd5b5061048d6119c8565b3480156108c6575f80fd5b506104ca6108d5366004615952565b611a47565b3480156108e5575f80fd5b5061048d6108f43660046158bb565b611b2a565b348015610904575f80fd5b5061048d6109133660046159bb565b611c27565b348015610923575f80fd5b5061092c611c94565b6040516104da9190615a22565b348015610944575f80fd5b506105ce610953366004615952565b6001600160a01b03165f9081526001602052604090205490565b348015610978575f80fd5b5061048d611e25565b34801561098c575f80fd5b5060085465010000000000900462ffffff166104ca565b3480156109ae575f80fd5b5061048d611e78565b3480156109c2575f80fd5b5061048d6109d13660046156dc565b611efb565b3480156109e1575f80fd5b5061056a6109f0366004615aa1565b611f10565b348015610a00575f80fd5b5061048d610a0f366004615952565b611f82565b348015610a1f575f80fd5b506105ce610a2e366004615952565b6001600160a01b03165f908152601e602052604090205490565b348015610a53575f80fd5b5061048d611feb565b348015610a67575f80fd5b506104ca612072565b348015610a7b575f80fd5b506104ca610a8a366004615952565b612078565b348015610a9a575f80fd5b505f546001600160a01b031661056a565b348015610ab6575f80fd5b506104ca610ac5366004615952565b612141565b348015610ad5575f80fd5b5061052761220d565b348015610ae9575f80fd5b506103e86104ca565b348015610afd575f80fd5b5061048d610b0c366004615acd565b61221c565b348015610b1c575f80fd5b50610503610b2b3660046156dc565b6123e4565b348015610b3b575f80fd5b5061048d610b4a3660046158d4565b612464565b348015610b5a575f80fd5b5061048d610b693660046158d4565b6124ed565b348015610b79575f80fd5b50610b8d610b88366004615952565b612568565b60405163ffffffff90911681526020016104da565b348015610bad575f80fd5b50610503610bbc3660046156dc565b612616565b348015610bcc575f80fd5b5061048d610bdb366004615952565b612622565b348015610beb575f80fd5b5061048d6126a2565b348015610bff575f80fd5b5061048d612727565b348015610c13575f80fd5b5061048d610c223660046155f4565b6127b0565b348015610c32575f80fd5b506104ca61283b565b348015610c46575f80fd5b5061048d610c553660046158d4565b612845565b348015610c65575f80fd5b506015546040805160ff80841615158252610100840481161515602083015262010000840481161515928201929092526301000000830482161515606082015264010000000083048216151560808201526501000000000090920416151560a082015260c0016104da565b348015610cdb575f80fd5b5061048d610cea366004615b01565b6128c0565b348015610cfa575f80fd5b50600d546105ce565b348015610d0e575f80fd5b50600b546105ce565b348015610d22575f80fd5b506105ce610d31366004615aa1565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610d66575f80fd5b5061048d612adb565b348015610d7a575f80fd5b5061048d610d89366004615952565b612b8d565b348015610d99575f80fd5b50610503610da8366004615952565b6001600160a01b03165f90815260056020526040902054610100900460ff1690565b348015610dd5575f80fd5b506019546001600160a01b031661056a565b348015610df2575f80fd5b5061048d610e0136600461596d565b612bf0565b348015610e11575f80fd5b50610503610e20366004615952565b6001600160a01b03165f9081526003602052604090205460ff1690565b5f546001600160a01b03163314610e8a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b815f5b81811015610ecd57610ec5858583818110610eaa57610eaa615b6a565b9050602002016020810190610ebf9190615952565b84612c3e565b600101610e8d565b5050505050565b6060601b8054610ee390615b7e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0f90615b7e565b8015610f5a5780601f10610f3157610100808354040283529160200191610f5a565b820191905f5260205f20905b815481529060010190602001808311610f3d57829003601f168201915b5050505050905090565b5f610f70338484612dd6565b5060015b92915050565b5f546001600160a01b03163314610fc25760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff1615610fd9575f80fd5b610fe584848484612e37565b50505050565b5f610ff7843384613358565b6110028484846133da565b5060019392505050565b5f546001600160a01b031633146110545760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff161561106b575f80fd5b62093a808163ffffffff161115611080575f80fd5b61108981613c06565b50565b5f546001600160a01b031633146110d45760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015611118573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113c9190615bb0565b90505f6001600160a01b038616301461117257601a546001600160a01b0387811691161461116a575f61117a565b60145461117a565b601254600f54015b90508215801561119b575083828210156111945781611196565b825b830310155b806111ae57508280156111ae5750838210155b6111ec5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b82801561121857506001600160a01b0386163014806112185750601a546001600160a01b038781169116145b80156112345750838282101561122e5781611230565b825b8303105b15611316576008546301000000900460ff1615801561125b5750600854610100900460ff16155b611263575f80fd5b306001600160a01b038716036112de575f600f548510156112885784600f540361128c565b600f545b600f805482900390559182900391905084838310156112ab57826112ad565b835b840310156112d8576012548510156112c95784601254036112cd565b6012545b601280549190910390555b50611316565b601a546001600160a01b038088169116036113165760145484101561130757836014540361130b565b6014545b601480549190910390555b505060405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285169063a9059cbb906044016020604051808303815f875af1158015611364573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ecd9190615bc7565b5f546001600160a01b031633146113d05760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff16156113e7575f80fd5b60018162ffffff161015801561140457506103e88162ffffff1611155b61143f5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610e81565b6008805462ffffff60d01b1916600160d01b62ffffff93909316928302179055600a54620186a0910204600e55565b5f546001600160a01b031633146114b65760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff16156114ce575f80fd5b8015806114e557506016546001600160a01b031615155b6115315760405162461bcd60e51b815260206004820152600660248201527f4e6f2044455800000000000000000000000000000000000000000000000000006044820152606401610e81565b6008805460ff1916911515919091179055565b6060805f805f6060601b601c7f00000000000000000000000000000000000000000000000000000000000000005f8054906101000a90046001600160a01b0316600a54604051806040016040528060058152602001640312e302e360dc1b8152508580546115b190615b7e565b80601f01602080910402602001604051908101604052809291908181526020018280546115dd90615b7e565b80156116285780601f106115ff57610100808354040283529160200191611628565b820191905f5260205f20905b81548152906001019060200180831161160b57829003601f168201915b5050505050955084805461163b90615b7e565b80601f016020809104026020016040519081016040528092919081815260200182805461166790615b7e565b80156116b25780601f10611689576101008083540402835291602001916116b2565b820191905f5260205f20905b81548152906001019060200180831161169557829003601f168201915b50505050509450955095509550955095509550909192939495565b5f546001600160a01b031633146117155760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff161561172d575f80fd5b80611738575f611740565b4263ffffffff165b600960046101000a81548163ffffffff021916908363ffffffff16021790555050565b5f546001600160a01b031633146117ab5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805461ff0019166101001790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b335f8181526002602090815260408083206001600160a01b03871684529091528120549091610f7091859085905b01612dd6565b5f546001600160a01b031633146118605760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015546301000000900460ff1615611876575f80fd5b620186a062ffffff8216111561188a575f80fd5b61189381613c72565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b5f546001600160a01b031633146119175760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6119218282613d15565b5050565b6110893382613ea5565b5f61193933612141565b905090565b5f546001600160a01b031633146119865760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155462010000900460ff161561199b575f80fd5b6001600160a01b03165f90815260056020526040902080546dffffffffffffffffffffffff000019169055565b5f546001600160a01b03163314611a105760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805460ff191660011790556040517f3d35f028b9917dcf52b6fdf73b387c4fde5ce548ad8d75bce334c2db07427bfe905f90a1565b5f6001600160a01b038216301480611a7657506001600160a01b0382165f9081526004602052604090205460ff165b80611a8e57506017546001600160a01b038381169116145b80611aa657506016546001600160a01b038381169116145b611b23576001600160a01b0382165f90815260056020526040902054610100900460ff1680611af7575060095463ffffffff428116600160601b830482166401000000009093048216929092011610155b611b0f57600854600160701b900462ffffff16610f74565b600854600160b81b900462ffffff16610f74565b5f92915050565b5f546001600160a01b03163314611b725760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff1615611b8a575f80fd5b60018162ffffff1610158015611ba757506103e88162ffffff1611155b611be25760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610e81565b600880547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e81b62ffffff93909316928302179055600a54620186a0910204601155565b5f546001600160a01b03163314611c6f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155462010000900460ff1615611c84575f80fd5b611c8f838383613f44565b505050565b60408051600580825260c08201909252606091816020015b611cb46154e6565b815260200190600190039081611cac5790505090505f5b60058160ff161015611e21576040805160808101825260ff83165f81815260066020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611d28579050505050918352505060ff83165f9081526006602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611d9c5750505092845250505060ff83165f8181526006602090815260409091206003015492019190915283518491908110611e0e57611e0e615b6a565b6020908102919091010152600101611ccb565b5090565b5f546001600160a01b03163314611e6d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b611e765f614042565b565b5f546001600160a01b03163314611ec05760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805462ff00001916620100001790556040517ffd61f9d9e981b264f65f693615b347d7c5addcab978b82e81ae866b25155e426905f90a1565b611f06823383613358565b6119218282613ea5565b5f80546001600160a01b03163314611f595760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff1615611f71575f80fd5b611f7b838361409e565b9392505050565b5f546001600160a01b03163314611fca5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff1615611fe2575f80fd5b611089816143b2565b5f546001600160a01b031633146120335760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805464ff0000000019166401000000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b5f611939335b5f6001600160a01b0382163014806120a757506001600160a01b0382165f9081526004602052604090205460ff165b806120bf57506017546001600160a01b038381169116145b611b23576001600160a01b0382165f90815260056020526040902054610100900460ff1680612110575060095463ffffffff428116600160601b830482166401000000009093048216929092011610155b61212d5760085468010000000000000000900462ffffff16610f74565b600854600160881b900462ffffff16610f74565b5f6001600160a01b03821630148061217057506001600160a01b0382165f9081526004602052604090205460ff165b8061218857506017546001600160a01b038381169116145b611b23576001600160a01b0382165f90815260056020526040902054610100900460ff16806121d9575060095463ffffffff428116600160601b830482166401000000009093048216929092011610155b6121f9576008546b010000000000000000000000900462ffffff16610f74565b600854600160a01b900462ffffff16610f74565b6060601c8054610ee390615b7e565b5f546001600160a01b031633146122645760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601854601a5447915f916001600160a01b03908116911614612286575f61228a565b6013545b9050821580156122ab575083828210156122a457816122a6565b825b830310155b806122be57508280156122be5750838210155b6122fc5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b8280156123195750601854601a546001600160a01b039081169116145b80156123355750838282101561232f5781612331565b825b8303105b15612387576008546301000000900460ff1615801561235c5750600854610100900460ff16155b612364575f80fd5b60135484101561237857836013540361237c565b6013545b601380549190910390555b50505f836001600160a01b0316836040515f6040518083038185875af1925050503d805f81146123d2576040519150601f19603f3d011682016040523d82523d5f602084013e6123d7565b606091505b5050905080610fe5575f80fd5b335f9081526002602090815260408083206001600160a01b0386168452909152812054828110156124575760405162461bcd60e51b815260206004820152601260248201527f4e6567617469766520616c6c6f77616e636500000000000000000000000000006044820152606401610e81565b6110023385858403612dd6565b5f546001600160a01b031633146124ac5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60085460ff1680156124c65750600854610100900460ff16155b80156124dc57506008546301000000900460ff16155b6124e4575f80fd5b6110898161456d565b5f546001600160a01b031633146125355760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff161561254c575f80fd5b60088054911515620100000262ff000019909216919091179055565b6009545f90600160a01b900463ffffffff16158061259e57506001600160a01b0382165f9081526005602052604090205460ff16155b806125d657506001600160a01b0382165f9081526005602052604090205463ffffffff4281166a010000000000000000000090920416105b156125e257505f919050565b506001600160a01b03165f9081526005602052604090205463ffffffff4281166a0100000000000000000000909204160390565b5f610f703384846133da565b5f546001600160a01b0316331461266a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff1615612681575f80fd5b6001600160a01b03165f908152600560205260409020805461ff0019169055565b5f546001600160a01b031633146126ea5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805463ff000000191663010000001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b5f546001600160a01b0316331461276f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805465ff00000000001916650100000000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f546001600160a01b031633146127f85760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b815f5b81811015610ecd5761283385858381811061281857612818615b6a565b905060200201602081019061282d9190615952565b84613d15565b6001016127fb565b5f61193933611a47565b5f546001600160a01b0316331461288d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b600854610100900460ff161580156128af57506008546301000000900460ff16155b6128b7575f80fd5b61108981614e3e565b428410156129105760405162461bcd60e51b815260206004820152601160248201527f45787069726564207369676e61747572650000000000000000000000000000006044820152606401610e81565b601d546001600160a01b038881165f818152601e602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa158015612a43573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590612a795750886001600160a01b0316816001600160a01b0316145b612ac55760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610e81565b5050612ad2878787612dd6565b50505050505050565b5f546001600160a01b03163314612b235760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60085460ff168015612b3d5750600854610100900460ff16155b612b45575f80fd5b601254600f54305f908152600160205260409020549101908110612b67575f80fd5b305f908152600160205260408120546012805493909103909201909155611e769061456d565b5f546001600160a01b03163314612bd55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6001600160a01b038116612be7575f80fd5b61108981614042565b5f546001600160a01b03163314612c385760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b61192182825b601554610100900460ff1615612c52575f80fd5b6001600160a01b03821615801590612c7557506001600160a01b03821661dead14155b612c7d575f80fd5b6016546001600160a01b03838116911614801590612ca957506017546001600160a01b03838116911614155b612d1b5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c656760448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610e81565b8015612d77576001600160a01b0382165f9081526003602052604090205460ff1615612d775760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610e81565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f2644091015b60405180910390a25050565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff1610612e46575f80fd5b6001600160a01b0383163014801590612e6757506001600160a01b03831615155b612e6f575f80fd5b60ff84165f9081526006602052604090206001600160a01b03841661dead148015612e9b5750805460ff165b8015612eaa57505f8160030154115b15612ef75760405162461bcd60e51b815260206004820152600f60248201527f556e636c61696d656420746178657300000000000000000000000000000000006044820152606401610e81565b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b03861602178155612f3b60018201846003615521565b50612f4b60028201836003615521565b50805460ff16612f5b575f612f66565b600181015462ffffff165b8351600880546affffff000000000000000019811693909203680100000000000000009283900462ffffff9081169190910116909102919091179055805460ff16612fb1575f612fc3565b60018101546301000000900462ffffff165b6020840151600880546dffffff0000000000000000000000198116939092036b0100000000000000000000009283900462ffffff9081169190910116909102919091179055805460ff16613017575f61302c565b60018101546601000000000000900462ffffff165b6040840151600880547fffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff811693909203600160701b9283900462ffffff9081169190910116909102919091179055805460ff16613089575f613094565b600281015462ffffff165b8251600880547fffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff811693909203600160881b9283900462ffffff9081169190910116909102919091179055805460ff166130ee575f613100565b60028101546301000000900462ffffff165b6020830151600880547fffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff811693909203600160a01b9283900462ffffff9081169190910116909102919091179055805460ff1661315d575f613172565b60028101546601000000000000900462ffffff165b6040830151600880547fffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff811693909203600160b81b9283900462ffffff90811691909101811690920292909217918290556161a86801000000000000000090920416118015906131fb57506008546161a86b01000000000000000000000090910462ffffff1611155b801561321857506008546161a8600160701b90910462ffffff1611155b6132645760405162461bcd60e51b815260206004820152600860248201527f48696768205461780000000000000000000000000000000000000000000000006044820152606401610e81565b60085461c350600160881b90910462ffffff1611801590613296575060085461c350600160a01b90910462ffffff1611155b80156132b3575060085461c350600160b81b90910462ffffff1611155b6132ff5760405162461bcd60e51b815260206004820152600c60248201527f486967682050656e616c747900000000000000000000000000000000000000006044820152606401610e81565b805460ff1661331457805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a858585856040516133499493929190615be2565b60405180910390a15050505050565b6001600160a01b038381165f90815260026020908152604080832093861683529290522054818110156133cd5760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e6365000000000000000000006044820152606401610e81565b610fe58484848403612dd6565b6001600160a01b0383165f9081526003602052604090205460ff1615801561341a57506001600160a01b0382165f9081526003602052604090205460ff16155b6134545760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610e81565b61deac196001600160a01b0383160161346b575f80fd5b6008546301000000900460ff1615801561348d5750600854610100900460ff16155b80156134c057506017546001600160a01b038481169116148015906134c057506016546001600160a01b03848116911614155b156134d7576134ce5f61456d565b6134d75f614e3e565b5f811180156134fe57506001600160a01b0383165f9081526004602052604090205460ff16155b801561352257506001600160a01b0382165f9081526004602052604090205460ff16155b801561353757506001600160a01b0383163014155b801561354c57506001600160a01b0382163014155b801561356657506016546001600160a01b03838116911614155b15613bfb576017546001600160a01b0384811691161480159061359757506017546001600160a01b03838116911614155b806135e157506017546001600160a01b03848116911614806135c657506017546001600160a01b038381169116145b80156135e15750600954640100000000900463ffffffff1615155b61362d5760405162461bcd60e51b815260206004820152601060248201527f54726164696e672064697361626c6564000000000000000000000000000000006044820152606401610e81565b600954600160a01b900463ffffffff161580159061365957506017546001600160a01b03848116911614155b156137e85761366783612568565b63ffffffff16156136ba5760405162461bcd60e51b815260206004820152600860248201527f436f6f6c646f776e0000000000000000000000000000000000000000000000006044820152606401610e81565b4263ffffffff166009546001600160a01b0385165f9081526005602052604090205463ffffffff92831670010000000000000000000000000000000090920483166601000000000000909104831601909116101561378d576001600160a01b0383165f908152600560205260409020805465ffffffff000019166201000017905561374863ffffffff421690565b6001600160a01b0384165f908152600560205260409020805463ffffffff9290921666010000000000000269ffffffff000000000000199092169190911790556137e8565b6008546001600160a01b0384165f908152600560205260409020805465ffffffff0000198116620100009182900463ffffffff908116600101169182021790915564010000000090910460ff16116137e8576137e883615088565b600c5415806137ff57506001600160a01b03821630145b8061382e57506017546001600160a01b038381169116148061382e57506016546001600160a01b038381169116145b806138545750600c546001600160a01b0383165f90815260016020526040902054820111155b6138a05760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617842616c616e636500000000000000000000000000006044820152606401610e81565b60085462010000900460ff161580156138c357506008546301000000900460ff16155b80156138d75750600854610100900460ff16155b15613bfb576017545f9081906001600160a01b038681169116148061390957506017546001600160a01b038581169116145b15613930576017546001600160a01b0386811691161461392a57600261392d565b60015b90505b5f8160ff166001146139425785613944565b845b60095490915063ffffffff428116600160601b83048216640100000000909304821692909201161080159061399657506001600160a01b0381165f90815260056020526040902054610100900460ff16155b156139c0576001600160a01b0381165f908152600560205260409020805461ff0019166101001790555b5f5b60058160ff161015613be2575f808460ff1611613a4d576001600160a01b0383165f90815260056020526040902054610100900460ff16613a335760ff82165f908152600660205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16613b15565b60ff82165f90815260066020526040812060020190613a13565b8360ff16600114613ab3576001600160a01b0383165f90815260056020526040902054610100900460ff16613a975760ff82165f9081526006602052604090206001016002613a13565b60ff82165f908152600660205260409020600290810190613a13565b6001600160a01b0383165f90815260056020526040902054610100900460ff16613af35760ff82165f908152600660205260409020600190810190613a13565b60ff82165f908152600660205260409020600201546301000000900462ffffff165b62ffffff169050805f03613b295750613bda565b620186a086820204613b3c8930836150f3565b60175460ff84165f908152600660205260409020546001600160a01b0391821661010090910490911603613b77576012805482019055613bd3565b60ff83165f9081526006602052604090205461deac196101009091046001600160a01b031601613bb057613bab3082613ea5565b613bd3565b60ff83165f908152600660205260409020600301805482019055600f8054820190555b9490940193505b6001016139c2565b508215613bf757600d80548401905592829003925b5050505b611c8f8383836150f3565b600980547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16600160601b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020016118c4565b6008805467ffffff000000000019166501000000000062ffffff841690810291909117909155613ca2575f613cb8565b613cb8600a548262ffffff16620186a091020490565b600c557f00000000000000000000000000000000000000000000000000000000000000006110895760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020016118c4565b60155460ff1615613d24575f80fd5b5f546001600160a01b03838116911614801590613d4957506001600160a01b03821615155b8015613d6057506001600160a01b03821661dead14155b613d68575f80fd5b6016546001600160a01b03838116911614801590613d9457506017546001600160a01b03838116911614155b613de05760405162461bcd60e51b815260206004820152601260248201527f44455820726f75746572206f72207061697200000000000000000000000000006044820152606401610e81565b8015613e4e576001600160a01b0382165f9081526004602052604090205460ff1615613e4e5760405162461bcd60e51b815260206004820152600b60248201527f57686974656c69737465640000000000000000000000000000000000000000006044820152606401610e81565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527fcf3473b85df1594d47b6958f29a32bea0abff9dd68296f7bf33443646793cfd89101612dca565b613eaf8282615230565b600854613ec99065010000000000900462ffffff16613c72565b6008805462ffffff60d01b198116600160d01b9182900462ffffff1691820217909155600a54620186a0910204600e55600880547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600160e81b9182900462ffffff1691820217909155600a54620186a0910204601155611921565b60018360ff16118015613f5d575060058263ffffffff16115b613f65575f80fd5b6008805464ff00000000191664010000000060ff861690810291909117909155600980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000063ffffffff8681169182027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b92861692830217909255604080519384526020840192909252908201527f24b1343f86058af6b8e48d5f9ca6b4e206b72690500086e848cc587b2f4097149060600160405180910390a1505050565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6001600160a01b0383166140b1575f80fd5b6016546001600160a01b0384811691161461431a575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614107573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061412b9190615c33565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561416a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061418e9190615c33565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156141de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142029190615c33565b90506001600160a01b03811661429d576040517fc9c653960000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015614276573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061429a9190615c33565b90505b604080516080810182526001600160a01b03808a1680835293811660208301819052948116928201839052881660609091018190526016805473ffffffffffffffffffffffffffffffffffffffff199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b03838116911614614358576019805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a3506017546001600160a01b031692915050565b6001600160a01b03811615806143d057506001600160a01b03811630145b806143e857506018546001600160a01b038281169116145b806144f25750601654604080517fc45a015500000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa15801561444e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144729190615c33565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af11580156144c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144e69190615c33565b6001600160a01b031614155b61453e5760405162461bcd60e51b815260206004820152600760248201527f4e6f2050616972000000000000000000000000000000000000000000000000006044820152606401610e81565b601a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6008805461ff001981166101001790915560ff1615614e3057808061460c57506011546002601254816145a2576145a2615c1f565b601854601a5492909104916001600160a01b039081169116146145c5575f6145c9565b600f545b011015801561460c5750601254601854601a546001600160a01b039081169116146145f4575f6145f8565b600f545b305f90815260016020526040902054910111155b15614a01575f60026012548161462457614624615c1f565b60408051600280825260608201835293909204935047925f929160208301908036833701905050905030815f8151811061466057614660615b6a565b6001600160a01b03928316602091820292909201015260185482519116908290600190811061469157614691615b6a565b6001600160a01b039283166020918202929092010152601654601854601a546146d3933093811692889282169116146146ca575f611812565b600f5401612dd6565b601654601854601a546001600160a01b039283169263791ac94792879282169116146146ff575f614703565b600f545b015f8430426001016040518663ffffffff1660e01b815260040161472b959493929190615c4e565b5f604051808303815f87803b158015614742575f80fd5b505af1925050508015614753575060015b6147745760165461476f9030906001600160a01b03165f612dd6565b6149fd565b600980546bffffffff000000000000000019166801000000000000000063ffffffff421602179055601254156147c057600260125f828254816147b9576147b9615c1f565b0490915550505b601854601a5447849003917f054301190fdd9cbc2629a04d617cd2c664ec09eb96f277e80bfde32405ea3e149186916001600160a01b03918216911614614807575f61480b565b600f545b60408051929091018252602082018490520160405180910390a180156149fb57601854601a5482916001600160a01b039081169116036148bc5761489f82600f5487101561487657600f548701620186a088028161486b5761486b615c1f565b04620186a091020490565b600f5487810190620186a0028161488f5761488f615c1f565b04620186a003620186a091020490565b600f80546010805490910190555f90556013805482850301905590505b5f851180156148ca57505f81115b156149f9576016546148e79030906001600160a01b031687612dd6565b6016546019546040517ff305d719000000000000000000000000000000000000000000000000000000008152306004820152602481018890525f6044820181905260648201526001600160a01b0391821660848201526001420160a482015291169063f305d71990839060c40160606040518083038185885af19350505050801561498f575060408051601f3d908101601f1916820190925261498c91810190615cbf565b60015b6149b0576016546149ab9030906001600160a01b03165f612dd6565b6149f9565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505f601255505b505b505b5050505b8080614a605750601a546001600160a01b03163014801590614a345750601854601a546001600160a01b03908116911614155b8015614a445750601154600f5410155b8015614a605750600f54305f9081526001602052604090205410155b15614e3057601a546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015614aab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614acf9190615bb0565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f81518110614b0857614b08615b6a565b6001600160a01b039283166020918202929092010152601854825191169082906001908110614b3957614b39615b6a565b6001600160a01b039283166020918202929092010152601a54825191169082906002908110614b6a57614b6a615b6a565b6001600160a01b039283166020918202929092010152601a54601654600f5460405163095ea7b360e01b81529184166004830152602482015291169063095ea7b3906044016020604051808303815f875af1158015614bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614bef9190615bc7565b50601654600f546040517f5c11d7950000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691635c11d79591614c45915f90869030904260010190600401615c4e565b5f604051808303815f87803b158015614c5c575f80fd5b505af1925050508015614c6d575060015b614cec57601a5460165460405163095ea7b360e01b81526001600160a01b0391821660048201525f602482015291169063095ea7b3906044016020604051808303815f875af1158015614cc2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ce69190615bc7565b50614e2d565b601a54600f546040516370a0823160e01b81523060048201527f95725684d8aa29bbc5031270724c91e6e8bee7732f11ee91ed9b3d93929e99e5926001600160a01b0316919082906370a0823190602401602060405180830381865afa158015614d58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d7c9190615bb0565b604080516001600160a01b039094168452602084019290925285039082015260600160405180910390a1600f80546010805490910190555f9055601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614dfc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e209190615bb0565b6014805491840390910190555b50505b506008805461ff0019169055565b6008805463ff0000001916630100000017905580614f7b57601a546001600160a01b031630148015614e975750600f541580614e895750600f54305f90815260016020526040902054105b80614e975750600e54600f54105b61507857601854601a546001600160a01b039081169116148015614ec657506013541580614ec6575047601354105b61507857601a546001600160a01b03163014801590614ef65750601854601a546001600160a01b03908116911614155b8015614f7657506014541580614f765750601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614f4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f719190615bb0565b601454105b615078575b5f805b60058160ff16101561502d5760ff81165f90815260066020526040902080546003909101546101009091046001600160a01b031690801580614fca57506001600160a01b03821661dead145b80614fe257506017546001600160a01b038381169116145b15614fee575050615025565b5f614ff983836152fb565b9050801561501d5760ff84165f908152600660205260409020600301805482900390555b939093019250505b600101614f7e565b506009805463ffffffff191663ffffffff42161790556040805182815290517fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979181900360200190a1505b506008805463ff00000019169055565b600954600160a01b900463ffffffff166150a563ffffffff421690565b6001600160a01b03929092165f90815260056020526040902080546dffffffff0000000000000000000019166a01000000000000000000009290930163ffffffff1691909102919091179055565b6001600160a01b0383161580159061511357506001600160a01b03821615155b61515f5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610e81565b6001600160a01b0383165f908152600160205260409020548111156151b85760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b80156151eb576001600160a01b038084165f90815260016020526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e2a91815260200190565b6001600160a01b0382165f908152600160205260409020548111156152895760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b6001600160a01b0382165f818152600160205260409081902080548490039055600a80548490039055600b8054840190555161dead91907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906152ef9085815260200190565b60405180910390a35050565b601a545f90306001600160a01b03909116036153385761531c3084846150f3565b81600f5f82825461532d9190615cfe565b909155506154e09050565b6010545f90615349846103e8615d11565b615354906064615d11565b61535e9190615d28565b601854601a549192505f916001600160a01b0391821691160361541d5750601354620186a08282020490811115615399575f92505050610f74565b5f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f81146153e7576040519150601f19603f3d011682016040523d82523d5f602084013e6153ec565b606091505b5050905080615400575f9350505050610f74565b8160135f8282546154119190615cfe565b909155506154c7915050565b50601454620186a0828202049084111561543b575f92505050610f74565b601a5460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af115801561548b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906154af9190615bc7565b508060145f8282546154c19190615cfe565b90915550505b8360105f8282546154d89190615cfe565b909155505050505b50919050565b60405180608001604052805f6001600160a01b031681526020016155086155b5565b81526020016155156155b5565b81526020015f81525090565b6001830191839082156155a9579160200282015f5b8382111561557857835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302615536565b80156155a75782816101000a81549062ffffff0219169055600301602081600201049283019260010302615578565b505b50611e219291506155d3565b60405180606001604052806003906020820280368337509192915050565b5b80821115611e21575f81556001016155d4565b8015158114611089575f80fd5b5f805f60408486031215615606575f80fd5b833567ffffffffffffffff8082111561561d575f80fd5b818601915086601f830112615630575f80fd5b81358181111561563e575f80fd5b8760208260051b8501011115615652575f80fd5b60209283019550935050840135615668816155e7565b809150509250925092565b5f81518084525f5b818110156156975760208185018101518683018201520161567b565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f611f7b6020830184615673565b6001600160a01b0381168114611089575f80fd5b5f80604083850312156156ed575f80fd5b82356156f8816156c8565b946020939093013593505050565b803560ff81168114615716575f80fd5b919050565b803562ffffff81168114615716575f80fd5b5f82601f83011261573c575f80fd5b6040516060810181811067ffffffffffffffff8211171561576b57634e487b7160e01b5f52604160045260245ffd5b60405280606084018581111561577f575f80fd5b845b818110156157a0576157928161571b565b835260209283019201615781565b509195945050505050565b5f805f8061010085870312156157bf575f80fd5b6157c885615706565b935060208501356157d8816156c8565b92506157e7866040870161572d565b91506157f68660a0870161572d565b905092959194509250565b5f805f60608486031215615813575f80fd5b833561581e816156c8565b9250602084013561582e816156c8565b929592945050506040919091013590565b803563ffffffff81168114615716575f80fd5b5f60208284031215615862575f80fd5b611f7b8261583f565b5f805f806080858703121561587e575f80fd5b8435615889816156c8565b93506020850135615899816156c8565b92506040850135915060608501356158b0816155e7565b939692955090935050565b5f602082840312156158cb575f80fd5b611f7b8261571b565b5f602082840312156158e4575f80fd5b8135611f7b816155e7565b60c081525f61590160c0830189615673565b82810360208401526159138189615673565b905060ff871660408401526001600160a01b038616606084015284608084015282810360a08401526159458185615673565b9998505050505050505050565b5f60208284031215615962575f80fd5b8135611f7b816156c8565b5f806040838503121561597e575f80fd5b8235615989816156c8565b91506020830135615999816155e7565b809150509250929050565b5f602082840312156159b4575f80fd5b5035919050565b5f805f606084860312156159cd575f80fd5b6159d684615706565b92506159e46020850161583f565b91506159f26040850161583f565b90509250925092565b805f5b6003811015610fe557815162ffffff168452602093840193909101906001016159fe565b602080825282518282018190525f919060409081850190868401855b82811015615a945781516001600160a01b03815116855286810151615a65888701826159fb565b5085810151615a7760808701826159fb565b506060015160e08501526101009093019290850190600101615a3e565b5091979650505050505050565b5f8060408385031215615ab2575f80fd5b8235615abd816156c8565b91506020830135615999816156c8565b5f805f60608486031215615adf575f80fd5b8335615aea816156c8565b9250602084013591506040840135615668816155e7565b5f805f805f805f60e0888a031215615b17575f80fd5b8735615b22816156c8565b96506020880135615b32816156c8565b95506040880135945060608801359350615b4e60808901615706565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680615b9257607f821691505b6020821081036154e057634e487b7160e01b5f52602260045260245ffd5b5f60208284031215615bc0575f80fd5b5051919050565b5f60208284031215615bd7575f80fd5b8151611f7b816155e7565b60ff851681526001600160a01b03841660208201526101008101615c0960408301856159fb565b615c1660a08301846159fb565b95945050505050565b634e487b7160e01b5f52601260045260245ffd5b5f60208284031215615c43575f80fd5b8151611f7b816156c8565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015615c9e5784516001600160a01b031683529383019391830191600101615c79565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215615cd1575f80fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610f7457610f74615cea565b8082028115828204841417610f7457610f74615cea565b5f82615d4257634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220c8c510338c1de931de9cbc766dd1d513e8dd67cbb8551f9f3e2dced660d1cc4164736f6c63430008170033

Deployed Bytecode

0x608060405260043610610486575f3560e01c8063715018a611610251578063a6cbe5c111610148578063d505accf116100c9578063f2fde38b11610083578063f4db96981161006b578063f4db969814610dca578063f59c370814610de7578063fe575a8714610e0657005b8063f2fde38b14610d6f578063f3dc4f4814610d8e57005b8063d89135cd116100b1578063d89135cd14610d03578063dd62ed3e14610d17578063e2745ef214610d5b57005b8063d505accf14610cd0578063d8454a8214610cef57005b8063c78fe0d41161011a578063cc1776d311610102578063cc1776d314610c27578063d1ace71014610c3b578063d232c22014610c5a57005b8063c78fe0d414610bf4578063c997eb8d14610c0857005b8063a6cbe5c114610b6e578063a9059cbb14610ba2578063be5e49b214610bc1578063c77e006d14610be057005b80638d8350ca116101d257806396ce0795116101a4578063a457c2d71161018c578063a457c2d714610b11578063a4d8971a14610b30578063a5596b4f14610b4f57005b806396ce079514610ade5780639caf0c2514610af257005b80638d8350ca14610a705780638da5cb5b14610a8f57806395101f9014610aab57806395d89b4114610aca57005b80637b1ab0d2116102235780637ecebe001161020b5780637ecebe0014610a145780638324c3b914610a485780638bf1acff14610a5c57005b80637b1ab0d2146109d65780637b1ad1d7146109f557005b8063715018a61461096d57806375de14961461098157806379b3d411146109a357806379cc6790146109b757005b80633644e5151161037d5780634f7041a5116102fe5780635f641758116102b85780636d5c1490116102a05780636d5c1490146108f95780636f05be971461091857806370a082311461093957005b80635f641758146108bb5780636bdb5ad1146108da57005b806354fd4d50116102e657806354fd4d501461085b5780635bbb7a51146108885780635f189361146108a757005b80634f7041a51461082a5780635117cdee1461083e57005b8063395093511161034f5780633ed8a169116103375780633ed8a169146107cd578063404e5129146107ec57806342966c681461080b57005b806339509351146107775780633af32abf1461079657005b80633644e5151461070a578063370158ea1461071e578063379ba1d91461074457806339137f8b1461076357005b8063186488a811610407578063313ce567116103d957806333d48a7d116103c157806333d48a7d146106b4578063351a964d146106d457806335ed71a8146106eb57005b8063313ce56714610658578063326339671461069557005b8063186488a8146105dc57806323b872dd146105fb5780632984207a1461061a5780632add44041461063957005b806307e9652c11610458578063095ea7b311610440578063095ea7b3146105825780630ac769dc146105a157806318160ddd146105be57005b806307e9652c14610534578063095233081461055157005b806301b38af51461048f5780630588b1a5146104ae578063064a59d0146104e357806306fdde031461051357005b3661048d57005b005b34801561049a575f80fd5b5061048d6104a93660046155f4565b610e3d565b3480156104b9575f80fd5b50600854600160d01b900462ffffff165b60405162ffffff90911681526020015b60405180910390f35b3480156104ee575f80fd5b50600954640100000000900463ffffffff1615155b60405190151581526020016104da565b34801561051e575f80fd5b50610527610ed4565b6040516104da91906156b6565b34801561053f575f80fd5b5060085462010000900460ff16610503565b34801561055c575f80fd5b506016546001600160a01b03165b6040516001600160a01b0390911681526020016104da565b34801561058d575f80fd5b5061050361059c3660046156dc565b610f64565b3480156105ac575f80fd5b50601a546001600160a01b031661056a565b3480156105c9575f80fd5b50600a545b6040519081526020016104da565b3480156105e7575f80fd5b5061048d6105f63660046157ab565b610f7a565b348015610606575f80fd5b50610503610615366004615801565b610feb565b348015610625575f80fd5b5061048d610634366004615852565b61100c565b348015610644575f80fd5b5061048d61065336600461586b565b61108c565b348015610663575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000121681526020016104da565b3480156106a0575f80fd5b5061048d6106af3660046158bb565b611388565b3480156106bf575f80fd5b50600854600160e81b900462ffffff166104ca565b3480156106df575f80fd5b5060085460ff16610503565b3480156106f6575f80fd5b5061048d6107053660046158d4565b61146e565b348015610715575f80fd5b50601d546105ce565b348015610729575f80fd5b50610732611544565b6040516104da969594939291906158ef565b34801561074f575f80fd5b5061048d61075e3660046158d4565b6116cd565b34801561076e575f80fd5b5061048d611763565b348015610782575f80fd5b506105036107913660046156dc565b6117e4565b3480156107a1575f80fd5b506105036107b0366004615952565b6001600160a01b03165f9081526004602052604090205460ff1690565b3480156107d8575f80fd5b5061048d6107e73660046158bb565b611818565b3480156107f7575f80fd5b5061048d61080636600461596d565b6118cf565b348015610816575f80fd5b5061048d6108253660046159a4565b611925565b348015610835575f80fd5b506104ca61192f565b348015610849575f80fd5b506017546001600160a01b031661056a565b348015610866575f80fd5b506040805180820190915260058152640312e302e360dc1b6020820152610527565b348015610893575f80fd5b5061048d6108a2366004615952565b61193e565b3480156108b2575f80fd5b5061048d6119c8565b3480156108c6575f80fd5b506104ca6108d5366004615952565b611a47565b3480156108e5575f80fd5b5061048d6108f43660046158bb565b611b2a565b348015610904575f80fd5b5061048d6109133660046159bb565b611c27565b348015610923575f80fd5b5061092c611c94565b6040516104da9190615a22565b348015610944575f80fd5b506105ce610953366004615952565b6001600160a01b03165f9081526001602052604090205490565b348015610978575f80fd5b5061048d611e25565b34801561098c575f80fd5b5060085465010000000000900462ffffff166104ca565b3480156109ae575f80fd5b5061048d611e78565b3480156109c2575f80fd5b5061048d6109d13660046156dc565b611efb565b3480156109e1575f80fd5b5061056a6109f0366004615aa1565b611f10565b348015610a00575f80fd5b5061048d610a0f366004615952565b611f82565b348015610a1f575f80fd5b506105ce610a2e366004615952565b6001600160a01b03165f908152601e602052604090205490565b348015610a53575f80fd5b5061048d611feb565b348015610a67575f80fd5b506104ca612072565b348015610a7b575f80fd5b506104ca610a8a366004615952565b612078565b348015610a9a575f80fd5b505f546001600160a01b031661056a565b348015610ab6575f80fd5b506104ca610ac5366004615952565b612141565b348015610ad5575f80fd5b5061052761220d565b348015610ae9575f80fd5b506103e86104ca565b348015610afd575f80fd5b5061048d610b0c366004615acd565b61221c565b348015610b1c575f80fd5b50610503610b2b3660046156dc565b6123e4565b348015610b3b575f80fd5b5061048d610b4a3660046158d4565b612464565b348015610b5a575f80fd5b5061048d610b693660046158d4565b6124ed565b348015610b79575f80fd5b50610b8d610b88366004615952565b612568565b60405163ffffffff90911681526020016104da565b348015610bad575f80fd5b50610503610bbc3660046156dc565b612616565b348015610bcc575f80fd5b5061048d610bdb366004615952565b612622565b348015610beb575f80fd5b5061048d6126a2565b348015610bff575f80fd5b5061048d612727565b348015610c13575f80fd5b5061048d610c223660046155f4565b6127b0565b348015610c32575f80fd5b506104ca61283b565b348015610c46575f80fd5b5061048d610c553660046158d4565b612845565b348015610c65575f80fd5b506015546040805160ff80841615158252610100840481161515602083015262010000840481161515928201929092526301000000830482161515606082015264010000000083048216151560808201526501000000000090920416151560a082015260c0016104da565b348015610cdb575f80fd5b5061048d610cea366004615b01565b6128c0565b348015610cfa575f80fd5b50600d546105ce565b348015610d0e575f80fd5b50600b546105ce565b348015610d22575f80fd5b506105ce610d31366004615aa1565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610d66575f80fd5b5061048d612adb565b348015610d7a575f80fd5b5061048d610d89366004615952565b612b8d565b348015610d99575f80fd5b50610503610da8366004615952565b6001600160a01b03165f90815260056020526040902054610100900460ff1690565b348015610dd5575f80fd5b506019546001600160a01b031661056a565b348015610df2575f80fd5b5061048d610e0136600461596d565b612bf0565b348015610e11575f80fd5b50610503610e20366004615952565b6001600160a01b03165f9081526003602052604090205460ff1690565b5f546001600160a01b03163314610e8a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b815f5b81811015610ecd57610ec5858583818110610eaa57610eaa615b6a565b9050602002016020810190610ebf9190615952565b84612c3e565b600101610e8d565b5050505050565b6060601b8054610ee390615b7e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0f90615b7e565b8015610f5a5780601f10610f3157610100808354040283529160200191610f5a565b820191905f5260205f20905b815481529060010190602001808311610f3d57829003601f168201915b5050505050905090565b5f610f70338484612dd6565b5060015b92915050565b5f546001600160a01b03163314610fc25760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff1615610fd9575f80fd5b610fe584848484612e37565b50505050565b5f610ff7843384613358565b6110028484846133da565b5060019392505050565b5f546001600160a01b031633146110545760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff161561106b575f80fd5b62093a808163ffffffff161115611080575f80fd5b61108981613c06565b50565b5f546001600160a01b031633146110d45760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015611118573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113c9190615bb0565b90505f6001600160a01b038616301461117257601a546001600160a01b0387811691161461116a575f61117a565b60145461117a565b601254600f54015b90508215801561119b575083828210156111945781611196565b825b830310155b806111ae57508280156111ae5750838210155b6111ec5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b82801561121857506001600160a01b0386163014806112185750601a546001600160a01b038781169116145b80156112345750838282101561122e5781611230565b825b8303105b15611316576008546301000000900460ff1615801561125b5750600854610100900460ff16155b611263575f80fd5b306001600160a01b038716036112de575f600f548510156112885784600f540361128c565b600f545b600f805482900390559182900391905084838310156112ab57826112ad565b835b840310156112d8576012548510156112c95784601254036112cd565b6012545b601280549190910390555b50611316565b601a546001600160a01b038088169116036113165760145484101561130757836014540361130b565b6014545b601480549190910390555b505060405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285169063a9059cbb906044016020604051808303815f875af1158015611364573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ecd9190615bc7565b5f546001600160a01b031633146113d05760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff16156113e7575f80fd5b60018162ffffff161015801561140457506103e88162ffffff1611155b61143f5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610e81565b6008805462ffffff60d01b1916600160d01b62ffffff93909316928302179055600a54620186a0910204600e55565b5f546001600160a01b031633146114b65760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff16156114ce575f80fd5b8015806114e557506016546001600160a01b031615155b6115315760405162461bcd60e51b815260206004820152600660248201527f4e6f2044455800000000000000000000000000000000000000000000000000006044820152606401610e81565b6008805460ff1916911515919091179055565b6060805f805f6060601b601c7f00000000000000000000000000000000000000000000000000000000000000125f8054906101000a90046001600160a01b0316600a54604051806040016040528060058152602001640312e302e360dc1b8152508580546115b190615b7e565b80601f01602080910402602001604051908101604052809291908181526020018280546115dd90615b7e565b80156116285780601f106115ff57610100808354040283529160200191611628565b820191905f5260205f20905b81548152906001019060200180831161160b57829003601f168201915b5050505050955084805461163b90615b7e565b80601f016020809104026020016040519081016040528092919081815260200182805461166790615b7e565b80156116b25780601f10611689576101008083540402835291602001916116b2565b820191905f5260205f20905b81548152906001019060200180831161169557829003601f168201915b50505050509450955095509550955095509550909192939495565b5f546001600160a01b031633146117155760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff161561172d575f80fd5b80611738575f611740565b4263ffffffff165b600960046101000a81548163ffffffff021916908363ffffffff16021790555050565b5f546001600160a01b031633146117ab5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805461ff0019166101001790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b335f8181526002602090815260408083206001600160a01b03871684529091528120549091610f7091859085905b01612dd6565b5f546001600160a01b031633146118605760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015546301000000900460ff1615611876575f80fd5b620186a062ffffff8216111561188a575f80fd5b61189381613c72565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b5f546001600160a01b031633146119175760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6119218282613d15565b5050565b6110893382613ea5565b5f61193933612141565b905090565b5f546001600160a01b031633146119865760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155462010000900460ff161561199b575f80fd5b6001600160a01b03165f90815260056020526040902080546dffffffffffffffffffffffff000019169055565b5f546001600160a01b03163314611a105760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805460ff191660011790556040517f3d35f028b9917dcf52b6fdf73b387c4fde5ce548ad8d75bce334c2db07427bfe905f90a1565b5f6001600160a01b038216301480611a7657506001600160a01b0382165f9081526004602052604090205460ff165b80611a8e57506017546001600160a01b038381169116145b80611aa657506016546001600160a01b038381169116145b611b23576001600160a01b0382165f90815260056020526040902054610100900460ff1680611af7575060095463ffffffff428116600160601b830482166401000000009093048216929092011610155b611b0f57600854600160701b900462ffffff16610f74565b600854600160b81b900462ffffff16610f74565b5f92915050565b5f546001600160a01b03163314611b725760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff1615611b8a575f80fd5b60018162ffffff1610158015611ba757506103e88162ffffff1611155b611be25760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610e81565b600880547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e81b62ffffff93909316928302179055600a54620186a0910204601155565b5f546001600160a01b03163314611c6f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155462010000900460ff1615611c84575f80fd5b611c8f838383613f44565b505050565b60408051600580825260c08201909252606091816020015b611cb46154e6565b815260200190600190039081611cac5790505090505f5b60058160ff161015611e21576040805160808101825260ff83165f81815260066020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611d28579050505050918352505060ff83165f9081526006602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611d9c5750505092845250505060ff83165f8181526006602090815260409091206003015492019190915283518491908110611e0e57611e0e615b6a565b6020908102919091010152600101611ccb565b5090565b5f546001600160a01b03163314611e6d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b611e765f614042565b565b5f546001600160a01b03163314611ec05760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805462ff00001916620100001790556040517ffd61f9d9e981b264f65f693615b347d7c5addcab978b82e81ae866b25155e426905f90a1565b611f06823383613358565b6119218282613ea5565b5f80546001600160a01b03163314611f595760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff1615611f71575f80fd5b611f7b838361409e565b9392505050565b5f546001600160a01b03163314611fca5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff1615611fe2575f80fd5b611089816143b2565b5f546001600160a01b031633146120335760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805464ff0000000019166401000000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b5f611939335b5f6001600160a01b0382163014806120a757506001600160a01b0382165f9081526004602052604090205460ff165b806120bf57506017546001600160a01b038381169116145b611b23576001600160a01b0382165f90815260056020526040902054610100900460ff1680612110575060095463ffffffff428116600160601b830482166401000000009093048216929092011610155b61212d5760085468010000000000000000900462ffffff16610f74565b600854600160881b900462ffffff16610f74565b5f6001600160a01b03821630148061217057506001600160a01b0382165f9081526004602052604090205460ff165b8061218857506017546001600160a01b038381169116145b611b23576001600160a01b0382165f90815260056020526040902054610100900460ff16806121d9575060095463ffffffff428116600160601b830482166401000000009093048216929092011610155b6121f9576008546b010000000000000000000000900462ffffff16610f74565b600854600160a01b900462ffffff16610f74565b6060601c8054610ee390615b7e565b5f546001600160a01b031633146122645760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601854601a5447915f916001600160a01b03908116911614612286575f61228a565b6013545b9050821580156122ab575083828210156122a457816122a6565b825b830310155b806122be57508280156122be5750838210155b6122fc5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b8280156123195750601854601a546001600160a01b039081169116145b80156123355750838282101561232f5781612331565b825b8303105b15612387576008546301000000900460ff1615801561235c5750600854610100900460ff16155b612364575f80fd5b60135484101561237857836013540361237c565b6013545b601380549190910390555b50505f836001600160a01b0316836040515f6040518083038185875af1925050503d805f81146123d2576040519150601f19603f3d011682016040523d82523d5f602084013e6123d7565b606091505b5050905080610fe5575f80fd5b335f9081526002602090815260408083206001600160a01b0386168452909152812054828110156124575760405162461bcd60e51b815260206004820152601260248201527f4e6567617469766520616c6c6f77616e636500000000000000000000000000006044820152606401610e81565b6110023385858403612dd6565b5f546001600160a01b031633146124ac5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60085460ff1680156124c65750600854610100900460ff16155b80156124dc57506008546301000000900460ff16155b6124e4575f80fd5b6110898161456d565b5f546001600160a01b031633146125355760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff161561254c575f80fd5b60088054911515620100000262ff000019909216919091179055565b6009545f90600160a01b900463ffffffff16158061259e57506001600160a01b0382165f9081526005602052604090205460ff16155b806125d657506001600160a01b0382165f9081526005602052604090205463ffffffff4281166a010000000000000000000090920416105b156125e257505f919050565b506001600160a01b03165f9081526005602052604090205463ffffffff4281166a0100000000000000000000909204160390565b5f610f703384846133da565b5f546001600160a01b0316331461266a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff1615612681575f80fd5b6001600160a01b03165f908152600560205260409020805461ff0019169055565b5f546001600160a01b031633146126ea5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805463ff000000191663010000001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b5f546001600160a01b0316331461276f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805465ff00000000001916650100000000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f546001600160a01b031633146127f85760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b815f5b81811015610ecd5761283385858381811061281857612818615b6a565b905060200201602081019061282d9190615952565b84613d15565b6001016127fb565b5f61193933611a47565b5f546001600160a01b0316331461288d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b600854610100900460ff161580156128af57506008546301000000900460ff16155b6128b7575f80fd5b61108981614e3e565b428410156129105760405162461bcd60e51b815260206004820152601160248201527f45787069726564207369676e61747572650000000000000000000000000000006044820152606401610e81565b601d546001600160a01b038881165f818152601e602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa158015612a43573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590612a795750886001600160a01b0316816001600160a01b0316145b612ac55760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610e81565b5050612ad2878787612dd6565b50505050505050565b5f546001600160a01b03163314612b235760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60085460ff168015612b3d5750600854610100900460ff16155b612b45575f80fd5b601254600f54305f908152600160205260409020549101908110612b67575f80fd5b305f908152600160205260408120546012805493909103909201909155611e769061456d565b5f546001600160a01b03163314612bd55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6001600160a01b038116612be7575f80fd5b61108981614042565b5f546001600160a01b03163314612c385760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b61192182825b601554610100900460ff1615612c52575f80fd5b6001600160a01b03821615801590612c7557506001600160a01b03821661dead14155b612c7d575f80fd5b6016546001600160a01b03838116911614801590612ca957506017546001600160a01b03838116911614155b612d1b5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c656760448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610e81565b8015612d77576001600160a01b0382165f9081526003602052604090205460ff1615612d775760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610e81565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f2644091015b60405180910390a25050565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff1610612e46575f80fd5b6001600160a01b0383163014801590612e6757506001600160a01b03831615155b612e6f575f80fd5b60ff84165f9081526006602052604090206001600160a01b03841661dead148015612e9b5750805460ff165b8015612eaa57505f8160030154115b15612ef75760405162461bcd60e51b815260206004820152600f60248201527f556e636c61696d656420746178657300000000000000000000000000000000006044820152606401610e81565b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b03861602178155612f3b60018201846003615521565b50612f4b60028201836003615521565b50805460ff16612f5b575f612f66565b600181015462ffffff165b8351600880546affffff000000000000000019811693909203680100000000000000009283900462ffffff9081169190910116909102919091179055805460ff16612fb1575f612fc3565b60018101546301000000900462ffffff165b6020840151600880546dffffff0000000000000000000000198116939092036b0100000000000000000000009283900462ffffff9081169190910116909102919091179055805460ff16613017575f61302c565b60018101546601000000000000900462ffffff165b6040840151600880547fffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff811693909203600160701b9283900462ffffff9081169190910116909102919091179055805460ff16613089575f613094565b600281015462ffffff165b8251600880547fffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff811693909203600160881b9283900462ffffff9081169190910116909102919091179055805460ff166130ee575f613100565b60028101546301000000900462ffffff165b6020830151600880547fffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff811693909203600160a01b9283900462ffffff9081169190910116909102919091179055805460ff1661315d575f613172565b60028101546601000000000000900462ffffff165b6040830151600880547fffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff811693909203600160b81b9283900462ffffff90811691909101811690920292909217918290556161a86801000000000000000090920416118015906131fb57506008546161a86b01000000000000000000000090910462ffffff1611155b801561321857506008546161a8600160701b90910462ffffff1611155b6132645760405162461bcd60e51b815260206004820152600860248201527f48696768205461780000000000000000000000000000000000000000000000006044820152606401610e81565b60085461c350600160881b90910462ffffff1611801590613296575060085461c350600160a01b90910462ffffff1611155b80156132b3575060085461c350600160b81b90910462ffffff1611155b6132ff5760405162461bcd60e51b815260206004820152600c60248201527f486967682050656e616c747900000000000000000000000000000000000000006044820152606401610e81565b805460ff1661331457805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a858585856040516133499493929190615be2565b60405180910390a15050505050565b6001600160a01b038381165f90815260026020908152604080832093861683529290522054818110156133cd5760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e6365000000000000000000006044820152606401610e81565b610fe58484848403612dd6565b6001600160a01b0383165f9081526003602052604090205460ff1615801561341a57506001600160a01b0382165f9081526003602052604090205460ff16155b6134545760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610e81565b61deac196001600160a01b0383160161346b575f80fd5b6008546301000000900460ff1615801561348d5750600854610100900460ff16155b80156134c057506017546001600160a01b038481169116148015906134c057506016546001600160a01b03848116911614155b156134d7576134ce5f61456d565b6134d75f614e3e565b5f811180156134fe57506001600160a01b0383165f9081526004602052604090205460ff16155b801561352257506001600160a01b0382165f9081526004602052604090205460ff16155b801561353757506001600160a01b0383163014155b801561354c57506001600160a01b0382163014155b801561356657506016546001600160a01b03838116911614155b15613bfb576017546001600160a01b0384811691161480159061359757506017546001600160a01b03838116911614155b806135e157506017546001600160a01b03848116911614806135c657506017546001600160a01b038381169116145b80156135e15750600954640100000000900463ffffffff1615155b61362d5760405162461bcd60e51b815260206004820152601060248201527f54726164696e672064697361626c6564000000000000000000000000000000006044820152606401610e81565b600954600160a01b900463ffffffff161580159061365957506017546001600160a01b03848116911614155b156137e85761366783612568565b63ffffffff16156136ba5760405162461bcd60e51b815260206004820152600860248201527f436f6f6c646f776e0000000000000000000000000000000000000000000000006044820152606401610e81565b4263ffffffff166009546001600160a01b0385165f9081526005602052604090205463ffffffff92831670010000000000000000000000000000000090920483166601000000000000909104831601909116101561378d576001600160a01b0383165f908152600560205260409020805465ffffffff000019166201000017905561374863ffffffff421690565b6001600160a01b0384165f908152600560205260409020805463ffffffff9290921666010000000000000269ffffffff000000000000199092169190911790556137e8565b6008546001600160a01b0384165f908152600560205260409020805465ffffffff0000198116620100009182900463ffffffff908116600101169182021790915564010000000090910460ff16116137e8576137e883615088565b600c5415806137ff57506001600160a01b03821630145b8061382e57506017546001600160a01b038381169116148061382e57506016546001600160a01b038381169116145b806138545750600c546001600160a01b0383165f90815260016020526040902054820111155b6138a05760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617842616c616e636500000000000000000000000000006044820152606401610e81565b60085462010000900460ff161580156138c357506008546301000000900460ff16155b80156138d75750600854610100900460ff16155b15613bfb576017545f9081906001600160a01b038681169116148061390957506017546001600160a01b038581169116145b15613930576017546001600160a01b0386811691161461392a57600261392d565b60015b90505b5f8160ff166001146139425785613944565b845b60095490915063ffffffff428116600160601b83048216640100000000909304821692909201161080159061399657506001600160a01b0381165f90815260056020526040902054610100900460ff16155b156139c0576001600160a01b0381165f908152600560205260409020805461ff0019166101001790555b5f5b60058160ff161015613be2575f808460ff1611613a4d576001600160a01b0383165f90815260056020526040902054610100900460ff16613a335760ff82165f908152600660205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16613b15565b60ff82165f90815260066020526040812060020190613a13565b8360ff16600114613ab3576001600160a01b0383165f90815260056020526040902054610100900460ff16613a975760ff82165f9081526006602052604090206001016002613a13565b60ff82165f908152600660205260409020600290810190613a13565b6001600160a01b0383165f90815260056020526040902054610100900460ff16613af35760ff82165f908152600660205260409020600190810190613a13565b60ff82165f908152600660205260409020600201546301000000900462ffffff165b62ffffff169050805f03613b295750613bda565b620186a086820204613b3c8930836150f3565b60175460ff84165f908152600660205260409020546001600160a01b0391821661010090910490911603613b77576012805482019055613bd3565b60ff83165f9081526006602052604090205461deac196101009091046001600160a01b031601613bb057613bab3082613ea5565b613bd3565b60ff83165f908152600660205260409020600301805482019055600f8054820190555b9490940193505b6001016139c2565b508215613bf757600d80548401905592829003925b5050505b611c8f8383836150f3565b600980547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16600160601b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020016118c4565b6008805467ffffff000000000019166501000000000062ffffff841690810291909117909155613ca2575f613cb8565b613cb8600a548262ffffff16620186a091020490565b600c557f00000000000000000000000000000000000000000000000000000000000000016110895760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020016118c4565b60155460ff1615613d24575f80fd5b5f546001600160a01b03838116911614801590613d4957506001600160a01b03821615155b8015613d6057506001600160a01b03821661dead14155b613d68575f80fd5b6016546001600160a01b03838116911614801590613d9457506017546001600160a01b03838116911614155b613de05760405162461bcd60e51b815260206004820152601260248201527f44455820726f75746572206f72207061697200000000000000000000000000006044820152606401610e81565b8015613e4e576001600160a01b0382165f9081526004602052604090205460ff1615613e4e5760405162461bcd60e51b815260206004820152600b60248201527f57686974656c69737465640000000000000000000000000000000000000000006044820152606401610e81565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527fcf3473b85df1594d47b6958f29a32bea0abff9dd68296f7bf33443646793cfd89101612dca565b613eaf8282615230565b600854613ec99065010000000000900462ffffff16613c72565b6008805462ffffff60d01b198116600160d01b9182900462ffffff1691820217909155600a54620186a0910204600e55600880547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600160e81b9182900462ffffff1691820217909155600a54620186a0910204601155611921565b60018360ff16118015613f5d575060058263ffffffff16115b613f65575f80fd5b6008805464ff00000000191664010000000060ff861690810291909117909155600980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000063ffffffff8681169182027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b92861692830217909255604080519384526020840192909252908201527f24b1343f86058af6b8e48d5f9ca6b4e206b72690500086e848cc587b2f4097149060600160405180910390a1505050565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6001600160a01b0383166140b1575f80fd5b6016546001600160a01b0384811691161461431a575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614107573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061412b9190615c33565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561416a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061418e9190615c33565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156141de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142029190615c33565b90506001600160a01b03811661429d576040517fc9c653960000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015614276573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061429a9190615c33565b90505b604080516080810182526001600160a01b03808a1680835293811660208301819052948116928201839052881660609091018190526016805473ffffffffffffffffffffffffffffffffffffffff199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b03838116911614614358576019805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a3506017546001600160a01b031692915050565b6001600160a01b03811615806143d057506001600160a01b03811630145b806143e857506018546001600160a01b038281169116145b806144f25750601654604080517fc45a015500000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa15801561444e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144729190615c33565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af11580156144c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144e69190615c33565b6001600160a01b031614155b61453e5760405162461bcd60e51b815260206004820152600760248201527f4e6f2050616972000000000000000000000000000000000000000000000000006044820152606401610e81565b601a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6008805461ff001981166101001790915560ff1615614e3057808061460c57506011546002601254816145a2576145a2615c1f565b601854601a5492909104916001600160a01b039081169116146145c5575f6145c9565b600f545b011015801561460c5750601254601854601a546001600160a01b039081169116146145f4575f6145f8565b600f545b305f90815260016020526040902054910111155b15614a01575f60026012548161462457614624615c1f565b60408051600280825260608201835293909204935047925f929160208301908036833701905050905030815f8151811061466057614660615b6a565b6001600160a01b03928316602091820292909201015260185482519116908290600190811061469157614691615b6a565b6001600160a01b039283166020918202929092010152601654601854601a546146d3933093811692889282169116146146ca575f611812565b600f5401612dd6565b601654601854601a546001600160a01b039283169263791ac94792879282169116146146ff575f614703565b600f545b015f8430426001016040518663ffffffff1660e01b815260040161472b959493929190615c4e565b5f604051808303815f87803b158015614742575f80fd5b505af1925050508015614753575060015b6147745760165461476f9030906001600160a01b03165f612dd6565b6149fd565b600980546bffffffff000000000000000019166801000000000000000063ffffffff421602179055601254156147c057600260125f828254816147b9576147b9615c1f565b0490915550505b601854601a5447849003917f054301190fdd9cbc2629a04d617cd2c664ec09eb96f277e80bfde32405ea3e149186916001600160a01b03918216911614614807575f61480b565b600f545b60408051929091018252602082018490520160405180910390a180156149fb57601854601a5482916001600160a01b039081169116036148bc5761489f82600f5487101561487657600f548701620186a088028161486b5761486b615c1f565b04620186a091020490565b600f5487810190620186a0028161488f5761488f615c1f565b04620186a003620186a091020490565b600f80546010805490910190555f90556013805482850301905590505b5f851180156148ca57505f81115b156149f9576016546148e79030906001600160a01b031687612dd6565b6016546019546040517ff305d719000000000000000000000000000000000000000000000000000000008152306004820152602481018890525f6044820181905260648201526001600160a01b0391821660848201526001420160a482015291169063f305d71990839060c40160606040518083038185885af19350505050801561498f575060408051601f3d908101601f1916820190925261498c91810190615cbf565b60015b6149b0576016546149ab9030906001600160a01b03165f612dd6565b6149f9565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505f601255505b505b505b5050505b8080614a605750601a546001600160a01b03163014801590614a345750601854601a546001600160a01b03908116911614155b8015614a445750601154600f5410155b8015614a605750600f54305f9081526001602052604090205410155b15614e3057601a546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015614aab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614acf9190615bb0565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f81518110614b0857614b08615b6a565b6001600160a01b039283166020918202929092010152601854825191169082906001908110614b3957614b39615b6a565b6001600160a01b039283166020918202929092010152601a54825191169082906002908110614b6a57614b6a615b6a565b6001600160a01b039283166020918202929092010152601a54601654600f5460405163095ea7b360e01b81529184166004830152602482015291169063095ea7b3906044016020604051808303815f875af1158015614bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614bef9190615bc7565b50601654600f546040517f5c11d7950000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691635c11d79591614c45915f90869030904260010190600401615c4e565b5f604051808303815f87803b158015614c5c575f80fd5b505af1925050508015614c6d575060015b614cec57601a5460165460405163095ea7b360e01b81526001600160a01b0391821660048201525f602482015291169063095ea7b3906044016020604051808303815f875af1158015614cc2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ce69190615bc7565b50614e2d565b601a54600f546040516370a0823160e01b81523060048201527f95725684d8aa29bbc5031270724c91e6e8bee7732f11ee91ed9b3d93929e99e5926001600160a01b0316919082906370a0823190602401602060405180830381865afa158015614d58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d7c9190615bb0565b604080516001600160a01b039094168452602084019290925285039082015260600160405180910390a1600f80546010805490910190555f9055601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614dfc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e209190615bb0565b6014805491840390910190555b50505b506008805461ff0019169055565b6008805463ff0000001916630100000017905580614f7b57601a546001600160a01b031630148015614e975750600f541580614e895750600f54305f90815260016020526040902054105b80614e975750600e54600f54105b61507857601854601a546001600160a01b039081169116148015614ec657506013541580614ec6575047601354105b61507857601a546001600160a01b03163014801590614ef65750601854601a546001600160a01b03908116911614155b8015614f7657506014541580614f765750601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614f4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f719190615bb0565b601454105b615078575b5f805b60058160ff16101561502d5760ff81165f90815260066020526040902080546003909101546101009091046001600160a01b031690801580614fca57506001600160a01b03821661dead145b80614fe257506017546001600160a01b038381169116145b15614fee575050615025565b5f614ff983836152fb565b9050801561501d5760ff84165f908152600660205260409020600301805482900390555b939093019250505b600101614f7e565b506009805463ffffffff191663ffffffff42161790556040805182815290517fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979181900360200190a1505b506008805463ff00000019169055565b600954600160a01b900463ffffffff166150a563ffffffff421690565b6001600160a01b03929092165f90815260056020526040902080546dffffffff0000000000000000000019166a01000000000000000000009290930163ffffffff1691909102919091179055565b6001600160a01b0383161580159061511357506001600160a01b03821615155b61515f5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610e81565b6001600160a01b0383165f908152600160205260409020548111156151b85760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b80156151eb576001600160a01b038084165f90815260016020526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e2a91815260200190565b6001600160a01b0382165f908152600160205260409020548111156152895760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b6001600160a01b0382165f818152600160205260409081902080548490039055600a80548490039055600b8054840190555161dead91907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906152ef9085815260200190565b60405180910390a35050565b601a545f90306001600160a01b03909116036153385761531c3084846150f3565b81600f5f82825461532d9190615cfe565b909155506154e09050565b6010545f90615349846103e8615d11565b615354906064615d11565b61535e9190615d28565b601854601a549192505f916001600160a01b0391821691160361541d5750601354620186a08282020490811115615399575f92505050610f74565b5f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f81146153e7576040519150601f19603f3d011682016040523d82523d5f602084013e6153ec565b606091505b5050905080615400575f9350505050610f74565b8160135f8282546154119190615cfe565b909155506154c7915050565b50601454620186a0828202049084111561543b575f92505050610f74565b601a5460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af115801561548b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906154af9190615bc7565b508060145f8282546154c19190615cfe565b90915550505b8360105f8282546154d89190615cfe565b909155505050505b50919050565b60405180608001604052805f6001600160a01b031681526020016155086155b5565b81526020016155156155b5565b81526020015f81525090565b6001830191839082156155a9579160200282015f5b8382111561557857835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302615536565b80156155a75782816101000a81549062ffffff0219169055600301602081600201049283019260010302615578565b505b50611e219291506155d3565b60405180606001604052806003906020820280368337509192915050565b5b80821115611e21575f81556001016155d4565b8015158114611089575f80fd5b5f805f60408486031215615606575f80fd5b833567ffffffffffffffff8082111561561d575f80fd5b818601915086601f830112615630575f80fd5b81358181111561563e575f80fd5b8760208260051b8501011115615652575f80fd5b60209283019550935050840135615668816155e7565b809150509250925092565b5f81518084525f5b818110156156975760208185018101518683018201520161567b565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f611f7b6020830184615673565b6001600160a01b0381168114611089575f80fd5b5f80604083850312156156ed575f80fd5b82356156f8816156c8565b946020939093013593505050565b803560ff81168114615716575f80fd5b919050565b803562ffffff81168114615716575f80fd5b5f82601f83011261573c575f80fd5b6040516060810181811067ffffffffffffffff8211171561576b57634e487b7160e01b5f52604160045260245ffd5b60405280606084018581111561577f575f80fd5b845b818110156157a0576157928161571b565b835260209283019201615781565b509195945050505050565b5f805f8061010085870312156157bf575f80fd5b6157c885615706565b935060208501356157d8816156c8565b92506157e7866040870161572d565b91506157f68660a0870161572d565b905092959194509250565b5f805f60608486031215615813575f80fd5b833561581e816156c8565b9250602084013561582e816156c8565b929592945050506040919091013590565b803563ffffffff81168114615716575f80fd5b5f60208284031215615862575f80fd5b611f7b8261583f565b5f805f806080858703121561587e575f80fd5b8435615889816156c8565b93506020850135615899816156c8565b92506040850135915060608501356158b0816155e7565b939692955090935050565b5f602082840312156158cb575f80fd5b611f7b8261571b565b5f602082840312156158e4575f80fd5b8135611f7b816155e7565b60c081525f61590160c0830189615673565b82810360208401526159138189615673565b905060ff871660408401526001600160a01b038616606084015284608084015282810360a08401526159458185615673565b9998505050505050505050565b5f60208284031215615962575f80fd5b8135611f7b816156c8565b5f806040838503121561597e575f80fd5b8235615989816156c8565b91506020830135615999816155e7565b809150509250929050565b5f602082840312156159b4575f80fd5b5035919050565b5f805f606084860312156159cd575f80fd5b6159d684615706565b92506159e46020850161583f565b91506159f26040850161583f565b90509250925092565b805f5b6003811015610fe557815162ffffff168452602093840193909101906001016159fe565b602080825282518282018190525f919060409081850190868401855b82811015615a945781516001600160a01b03815116855286810151615a65888701826159fb565b5085810151615a7760808701826159fb565b506060015160e08501526101009093019290850190600101615a3e565b5091979650505050505050565b5f8060408385031215615ab2575f80fd5b8235615abd816156c8565b91506020830135615999816156c8565b5f805f60608486031215615adf575f80fd5b8335615aea816156c8565b9250602084013591506040840135615668816155e7565b5f805f805f805f60e0888a031215615b17575f80fd5b8735615b22816156c8565b96506020880135615b32816156c8565b95506040880135945060608801359350615b4e60808901615706565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680615b9257607f821691505b6020821081036154e057634e487b7160e01b5f52602260045260245ffd5b5f60208284031215615bc0575f80fd5b5051919050565b5f60208284031215615bd7575f80fd5b8151611f7b816155e7565b60ff851681526001600160a01b03841660208201526101008101615c0960408301856159fb565b615c1660a08301846159fb565b95945050505050565b634e487b7160e01b5f52601260045260245ffd5b5f60208284031215615c43575f80fd5b8151611f7b816156c8565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015615c9e5784516001600160a01b031683529383019391830191600101615c79565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215615cd1575f80fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610f7457610f74615cea565b8082028115828204841417610f7457610f74615cea565b5f82615d4257634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220c8c510338c1de931de9cbc766dd1d513e8dd67cbb8551f9f3e2dced660d1cc4164736f6c63430008170033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

ChainFactory is a revolutionary software that offers a seamless, user-friendly experience for smart contract creation and provides additional support and strategic partnerships, providing you and your project the best chance to succeed.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.