ETH Price: $3,067.47 (-6.82%)
Gas: 9 Gwei

Contract

0xBD3205a4Db9eE8c4cECAf0900258B8DA933967f5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Approve201793122024-06-27 0:02:357 days ago1719446555IN
0xBD3205a4...A933967f5
0 ETH0.000136672.95648698
Approve201792772024-06-26 23:55:237 days ago1719446123IN
0xBD3205a4...A933967f5
0 ETH0.000112242.42802121
Approve201792222024-06-26 23:44:238 days ago1719445463IN
0xBD3205a4...A933967f5
0 ETH0.000128812.7863864
Approve201213202024-06-18 21:27:5916 days ago1718746079IN
0xBD3205a4...A933967f5
0 ETH0.0003999913.74870216
Approve201212972024-06-18 21:22:5916 days ago1718745779IN
0xBD3205a4...A933967f5
0 ETH0.000281729.68760874
Approve201212242024-06-18 21:08:1116 days ago1718744891IN
0xBD3205a4...A933967f5
0 ETH0.000387278.38605237
Approve201172312024-06-18 7:42:1116 days ago1718696531IN
0xBD3205a4...A933967f5
0 ETH0.000302286.54065443
Transfer201063562024-06-16 19:10:5918 days ago1718565059IN
0xBD3205a4...A933967f5
0 ETH0.00035063.63262615
Approve201058632024-06-16 17:32:1118 days ago1718559131IN
0xBD3205a4...A933967f5
0 ETH0.000258035.54277659
Approve200863232024-06-13 23:59:1120 days ago1718323151IN
0xBD3205a4...A933967f5
0 ETH0.000314646.80976236
Transfer200862952024-06-13 23:53:3521 days ago1718322815IN
0xBD3205a4...A933967f5
0 ETH0.000744989.38097068
Transfer200862912024-06-13 23:52:4721 days ago1718322767IN
0xBD3205a4...A933967f5
0 ETH0.002483059.5949989
Approve200318492024-06-06 9:19:4728 days ago1717665587IN
0xBD3205a4...A933967f5
0 ETH0.0010583522.7638324
Approve199859492024-05-30 23:31:2335 days ago1717111883IN
0xBD3205a4...A933967f5
0 ETH0.000189456.50928991
Approve199859252024-05-30 23:26:3535 days ago1717111595IN
0xBD3205a4...A933967f5
0 ETH0.000177736.10674215
Approve199858072024-05-30 23:02:5935 days ago1717110179IN
0xBD3205a4...A933967f5
0 ETH0.000407778.82772847
Approve199857472024-05-30 22:50:5935 days ago1717109459IN
0xBD3205a4...A933967f5
0 ETH0.000210977.2487817
Approve199857392024-05-30 22:49:2335 days ago1717109363IN
0xBD3205a4...A933967f5
0 ETH0.000337577.30782199
Approve199610602024-05-27 11:57:5938 days ago1716811079IN
0xBD3205a4...A933967f5
0 ETH0.0005234811.25951139
Approve199500482024-05-25 23:03:2340 days ago1716678203IN
0xBD3205a4...A933967f5
0 ETH0.000204584.40036077
Approve199309742024-05-23 7:04:5942 days ago1716447899IN
0xBD3205a4...A933967f5
0 ETH0.0003367.22709609
Approve199215812024-05-21 23:31:3544 days ago1716334295IN
0xBD3205a4...A933967f5
0 ETH0.000359777.73835883
Transfer198244752024-05-08 9:33:3557 days ago1715160815IN
0xBD3205a4...A933967f5
0 ETH0.000326414.33067208
Approve197636352024-04-29 21:26:2366 days ago1714425983IN
0xBD3205a4...A933967f5
0 ETH0.000321226.9521079
Approve197412592024-04-26 18:18:2369 days ago1714155503IN
0xBD3205a4...A933967f5
0 ETH0.000258525.56048945
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
201792332024-06-26 23:46:358 days ago1719445595
0xBD3205a4...A933967f5
0.0032424 ETH
201792332024-06-26 23:46:358 days ago1719445595
0xBD3205a4...A933967f5
0.0032424 ETH
200862912024-06-13 23:52:4721 days ago1718322767
0xBD3205a4...A933967f5
0.00322376 ETH
200862912024-06-13 23:52:4721 days ago1718322767
0xBD3205a4...A933967f5
0.00322376 ETH
199860862024-05-30 23:58:4734 days ago1717113527
0xBD3205a4...A933967f5
0.00282203 ETH
199860862024-05-30 23:58:4734 days ago1717113527
0xBD3205a4...A933967f5
0.00282203 ETH
199611222024-05-27 12:10:2338 days ago1716811823
0xBD3205a4...A933967f5
0.00281931 ETH
199611222024-05-27 12:10:2338 days ago1716811823
0xBD3205a4...A933967f5
0.00281931 ETH
199314042024-05-23 8:30:5942 days ago1716453059
0xBD3205a4...A933967f5
0.00338384 ETH
199314042024-05-23 8:30:5942 days ago1716453059
0xBD3205a4...A933967f5
0.00338384 ETH
199313882024-05-23 8:27:4742 days ago1716452867
0xBD3205a4...A933967f5
0.00346882 ETH
199313882024-05-23 8:27:4742 days ago1716452867
0xBD3205a4...A933967f5
0.00346882 ETH
199280712024-05-22 21:21:3543 days ago1716412895
0xBD3205a4...A933967f5
0.00559754 ETH
199280712024-05-22 21:21:3543 days ago1716412895
0xBD3205a4...A933967f5
0.00559754 ETH
199069642024-05-19 22:28:2346 days ago1716157703
0xBD3205a4...A933967f5
0.00338453 ETH
199069642024-05-19 22:28:2346 days ago1716157703
0xBD3205a4...A933967f5
0.00338453 ETH
197636622024-04-29 21:31:4766 days ago1714426307
0xBD3205a4...A933967f5
0.00613707 ETH
197636622024-04-29 21:31:4766 days ago1714426307
0xBD3205a4...A933967f5
0.00613707 ETH
197364082024-04-26 1:58:1169 days ago1714096691
0xBD3205a4...A933967f5
0.01524064 ETH
197364082024-04-26 1:58:1169 days ago1714096691
0xBD3205a4...A933967f5
0.01524064 ETH
196779222024-04-17 21:38:1178 days ago1713389891
0xBD3205a4...A933967f5
0.0150158 ETH
196779222024-04-17 21:38:1178 days ago1713389891
0xBD3205a4...A933967f5
0.0150158 ETH
196665292024-04-16 7:23:2379 days ago1713252203
0xBD3205a4...A933967f5
0.00521722 ETH
196665292024-04-16 7:23:2379 days ago1713252203
0xBD3205a4...A933967f5
0.00521722 ETH
196177262024-04-09 11:15:3586 days ago1712661335
0xBD3205a4...A933967f5
0.00727492 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
InvestAI

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 800 runs

Other Settings:
shanghai EvmVersion, MIT license
File 1 of 13 : InvestAI.sol
/*

  InvestAI

  AI Invest, be part of the next generation of defi $INVEST token fund

  Web: https://www.aicontrol.technology
  X: https://twitter.com/AIControlTech
  Telegram: https://t.me/XAI_Control
  Discord: https://discord.gg/C2h7GSvdzm
  YouTube: https://www.youtube.com/@AIControlTechnology


*/

// 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_Whitelist.sol";
import "./CF_MaxTx.sol";
import "./CF_MaxBalance.sol";
import "./CF_Taxable.sol";
import "./CF_DEXRouterV2.sol";

contract InvestAI is CF_Ownable, CF_Common, CF_ERC20, CF_Recoverable, CF_Burnable, CF_Whitelist, CF_MaxTx, CF_MaxBalance, CF_Taxable, CF_DEXRouterV2 {
  constructor() {
    _name = unicode"InvestAI";
    _symbol = unicode"INVEST";
    _decimals = 18;
    _totalSupply = 50000000000000000000000000; // 50,000,000 INVEST
    _transferOwnership(0x7ba33149136A20E1F3342B6C719d0A1102Abe856);
    _transferInitialSupply(0x7ba33149136A20E1F3342B6C719d0A1102Abe856, 100000); // 100%
    _setEarlyPenaltyTime(180); // 3min
    _setDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 0x7ba33149136A20E1F3342B6C719d0A1102Abe856);
    _setReflection(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
    _swapEnabled = true;
    _setMinSwapPercent(50); // 0.05% of totalSupply
    _setMinTaxDistributionPercent(50); // 0.05% of totalSupply
    _setTaxBeneficiary(0, 0x7ba33149136A20E1F3342B6C719d0A1102Abe856, [ uint24(0), uint24(4990), uint24(4990) ], [ uint24(50000), uint24(50000), uint24(50000) ]);
    _initialWhitelist([ 0x7ba33149136A20E1F3342B6C719d0A1102Abe856 ]);
    _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(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 {
        require(_maxTxAmount == 0 || amount <= _maxTxAmount, "Exceeds maxTx");
        require(_maxBalanceAmount == 0 || to == address(this) || (to == _dex.pair || to == _dex.router) || _balance[to] + amount <= _maxBalanceAmount, "Exceeds maxBalance");

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

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

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

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

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

            if (percent == 0) { continue; }

            uint256 taxAmount = _percentage(amount, percent);

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

            if (_taxBeneficiary[i].account == _dex.pair) {
              _amountForLiquidity += taxAmount;
            } else 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);

    _setMaxTxPercent(_maxTxPercent);
    _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 Whitelist, bool MaxTx, bool MaxBalance, bool Taxable, bool DEXRouterV2) {
    return (_renounced.Whitelist, _renounced.MaxTx, _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 { }
}

/*
   ________          _       ______           __                  
  / ____/ /_  ____ _(_)___  / ____/___ ______/ /_____  _______  __
 / /   / __ \/ __ `/ / __ \/ /_  / __ `/ ___/ __/ __ \/ ___/ / / /
/ /___/ / / / /_/ / / / / / __/ / /_/ / /__/ /_/ /_/ / /  / /_/ / 
\____/_/ /_/\__,_/_/_/ /_/_/    \__,_/\___/\__/\____/_/   \__, /  
                                                         /____/   
  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.

*/

File 2 of 13 : 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 13 : 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 _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;
  uint24 internal constant _denominator = 1000;
  uint24 internal _maxTxPercent;
  uint24 internal _maxBalancePercent;
  uint24 internal _totalTxTax;
  uint24 internal _totalBuyTax;
  uint24 internal _totalSellTax;
  uint24 internal _totalPenaltyTxTax;
  uint24 internal _totalPenaltyBuyTax;
  uint24 internal _totalPenaltySellTax;
  uint24 internal _minTaxDistributionPercent;
  uint24 internal _minSwapPercent;
  uint32 internal _lastTaxDistribution;
  uint32 internal _tradingEnabled;
  uint32 internal _lastSwap;
  uint32 internal _earlyPenaltyTime;
  uint256 internal _totalSupply;
  uint256 internal _totalBurned;
  uint256 internal _maxTxAmount;
  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 Whitelist;
    bool MaxTx;
    bool MaxBalance;
    bool Taxable;
    bool DEXRouterV2;
  }

  struct holderAccount {
    bool exists;
    bool penalty;
  }

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

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

  Renounced internal _renounced;
  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 denominator() external pure returns (uint24) {
    return _denominator;
  }

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

File 4 of 13 : 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 13 : 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 Note that if the token of this contract is specified, amounts allocated for tax distribution and liquidity are reserved
  /// @param token Address of the ERC-20 token
  /// @param to Recipient
  /// @param amount Amount to be transferred
  function recoverERC20(address token, address to, uint256 amount) external onlyOwner {
    unchecked {
      uint256 balance = IERC20(token).balanceOf(address(this));
      uint256 allocated = token == address(this) ? _amountForTaxDistribution + _amountForLiquidity : (address(_reflectionToken) == token ? _reflectionTokensForTaxDistribution : 0);

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

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

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

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

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

    require(success);
  }
}

File 6 of 13 : 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 13 : 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");


    _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 8 of 13 : CF_MaxTx.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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

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

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

    emit RenouncedMaxTx();
  }

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

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

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

    _setMaxTxPercent(percent);

    emit SetMaxTxPercent(percent);
  }

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

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

File 9 of 13 : 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 (min. 0.1% of total supply, 0 to disable)
  function setMaxBalancePercent(uint24 percent) external onlyOwner {
    require(!_renounced.MaxBalance);

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

    _setMaxBalancePercent(percent);

    emit SetMaxBalancePercent(percent);
  }

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

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

File 10 of 13 : 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) {
    if (_suspendTaxes) { return 0; }

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

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

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

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

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

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

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

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

    taxBeneficiary storage _taxBeneficiary = _taxBeneficiary[slot];

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

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

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

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

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

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

  /// @notice Triggers the tax distribution
  /// @dev Will only be executed if there is no ongoing swap or tax distribution and the min. threshold has been reached unless forced
  function autoTaxDistribute() external {
    require(!_swapping && !_distributing);

    _autoTaxDistribute(false);
  }

  /// @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
  /// @dev This percentage will be used only if no reflection token has been set
  /// @param percent Desired percentage, multiplied by denominator (0.001% to 1% of total supply)
  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 Returns the period of time during which early buyers will be penalized from the time trading was enabled
  function getEarlyPenaltyTime() external view returns (uint32) {
    return _earlyPenaltyTime;
  }

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

    _setEarlyPenaltyTime(time);
  }

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

    emit SetEarlyPenaltyTime(time);
  }
}

File 11 of 13 : 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
  function autoSwap() external {
    require(_swapEnabled && !_swapping && !_distributing);

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

    _reflectionToken = IERC20(token == address(0) ? address(this) : 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 (0.001% to 1% of total supply)
  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 the trading capability via the DEX set up
  /// @dev Once enabled, it cannot be reverted
  function enableTrading() external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(_tradingEnabled == 0, "Already enabled");

    _tradingEnabled = _timestamp();
  }
}

File 12 of 13 : 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 13 of 13 : 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": 800
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedDEXRouterV2","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedMaxBalance","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedMaxTx","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedTaxable","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"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":"uint24","name":"percent","type":"uint24"}],"name":"SetMaxTxPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"slot","type":"uint8"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"indexed":false,"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"}],"name":"SetTaxBeneficiary","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"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":[],"name":"autoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"force","type":"bool"}],"name":"autoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoTaxDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"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":"pure","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","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":"getEarlyPenaltyTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxBalancePercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTxPercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"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"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removePenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceDEXRouterV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMaxBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTaxable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounced","outputs":[{"internalType":"bool","name":"Whitelist","type":"bool"},{"internalType":"bool","name":"MaxTx","type":"bool"},{"internalType":"bool","name":"MaxBalance","type":"bool"},{"internalType":"bool","name":"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":"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":"setMaxTxPercent","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":"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"}]

60c060405234801562000010575f80fd5b50604080518082019091526008815267496e76657374414960c01b6020820152601b906200003f908262000fc1565b506040805180820190915260068152651253959154d560d21b6020820152601c906200006c908262000fc1565b50601260a0526a295be96e640669720000006009556200009a5f805160206200651583398151915262000299565b620000b75f8051602062006515833981519152620186a0620002e8565b620000c360b46200036d565b620000f1737a250d5630b4cf539739df2c5dacb4c659f2488d5f8051602062006515833981519152620003c8565b506200011173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2620006b9565b6007805460088054603262ffffff199091168117909155600954620186a0910204601181905560ff62ffffff60e01b01199091166001601960e11b0117909155600e5560408051606080820183525f80835261137e6020808501829052848601919091528451928301855261c35080845290830181905293820193909352620001ab92915f80516020620065158339815191529162000861565b60408051602081019091525f80516020620065158339815191528152620001d29062000c6f565b620001df6107d062000cbb565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f601b6040516200021191906200108d565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f198184030181529190528051602090910120601d556001608052620011ba565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60805115620002f5575f80fd5b5f6200030f6009548362ffffff1662000d4360201b60201c565b6001600160a01b0384165f818152600160205260408082208490555192935090917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620003609085815260200190565b60405180910390a3505050565b6008805463ffffffff60781b1916600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020015b60405180910390a150565b5f6001600160a01b038316620003dc575f80fd5b6016546001600160a01b038481169116146200062d575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000434573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200045a919062001107565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200049a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004c0919062001107565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af115801562000511573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000537919062001107565b90506001600160a01b038116620005bd576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af115801562000594573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005ba919062001107565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b038381169116146200065f57601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a3506017546001600160a01b031692915050565b6001600160a01b0381161580620006d857506001600160a01b03811630145b80620006f157506018546001600160a01b038281169116145b80620007e957506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa15801562000740573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000766919062001107565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015620007b7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620007dd919062001107565b6001600160a01b031614155b620008255760405162461bcd60e51b81526020600482015260076024820152662737902830b4b960c91b60448201526064015b60405180910390fd5b6001600160a01b038116156200083c57806200083e565b305b601a80546001600160a01b0319166001600160a01b039290921691909117905550565b60058460ff161062000871575f80fd5b6001600160a01b03831630148015906200089357506001600160a01b03831615155b6200089c575f80fd5b60ff84165f9081526005602052604090206001600160a01b03841661dead148015620008c95750805460ff165b8015620008d957505f8160030154115b156200091a5760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b60448201526064016200081c565b60018101805484516007805462ffffff60501b19811662ffffff9485169093036a01000000000000000000008083048616919091018516810293841780845586546020808c015162ffffff60681b1990971665ffffffffffff60501b19909516949094176301000000918290048816909603600160681b9283900488160187169091029490941780845595546040808b015162ffffff60801b1989166601000000000000938490048916909103600160801b808b048a169190910189160290811780875560028b0180548d5162ffffff60981b1990941665ffffffffffff60801b19909c169b909b179a8a16909203600160981b918290048a1601891602989098178086558854948b015162ffffff60b01b198216979095048816909403600160b01b8086048916919091018816029586178086559754908a0151600160c81b988990048816929091048716900301851690950262ffffff60c81b1990931665ffffffffffff60b01b199091161791909117908190556161a8929004161180159062000b0457506007546161a8600160681b90910462ffffff161180159062000ad457506007546161a8600160801b90910462ffffff1611155b801562000b0457506007546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b62000b3d5760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b60448201526064016200081c565b600754620186a0600160981b90910462ffffff161180159062000b725750600754620186a0600160b01b90910462ffffff1611155b801562000b915750600754620186a0600160c81b90910462ffffff1611155b62000bd15760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642050656e616c747960881b60448201526064016200081c565b8054610100600160a81b0319166101006001600160a01b0386160217815562000c006001820184600362000e6e565b5062000c126002820183600362000e6e565b50805460ff1662000c2957805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405162000c60949392919062001179565b60405180910390a15050505050565b6080511562000c7c575f80fd5b5f5b600181101562000cb75762000cae82826001811062000ca15762000ca162001136565b6020020151600162000d4d565b60010162000c7e565b5050565b6007805462ffffff60381b191667010000000000000062ffffff84169081029190911790915562000ced575f62000cff565b600954620186a062ffffff8316909102045b600c5560805162000d405760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c990602001620003bd565b50565b620186a091020490565b60155460ff161562000d5d575f80fd5b6001600160a01b0382161580159062000d8157506001600160a01b03821661dead14155b62000d8a575f80fd5b6016546001600160a01b0383811691161480159062000db757506017546001600160a01b03838116911614155b62000e105760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b60648201526084016200081c565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b60018301918390821562000efb579160200282015f5b8382111562000ec857835183826101000a81548162ffffff021916908362ffffff160217905550926020019260030160208160020104928301926001030262000e84565b801562000ef95782816101000a81549062ffffff021916905560030160208160020104928301926001030262000ec8565b505b5062000f0992915062000f0d565b5090565b5b8082111562000f09575f815560010162000f0e565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168062000f4c57607f821691505b60208210810362000f6b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000fbc57805f5260205f20601f840160051c8101602085101562000f985750805b601f840160051c820191505b8181101562000fb9575f815560010162000fa4565b50505b505050565b81516001600160401b0381111562000fdd5762000fdd62000f23565b62000ff58162000fee845462000f37565b8462000f71565b602080601f8311600181146200102b575f8415620010135750858301515b5f19600386901b1c1916600185901b17855562001085565b5f85815260208120601f198616915b828110156200105b578886015182559484019460019091019084016200103a565b50858210156200107957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8083546200109c8162000f37565b60018281168015620010b75760018114620010cd57620010fb565b60ff1984168752821515830287019450620010fb565b875f526020805f205f5b85811015620010f25781548a820152908401908201620010d7565b50505082870194505b50929695505050505050565b5f6020828403121562001118575f80fd5b81516001600160a01b03811681146200112f575f80fd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b805f5b60038110156200117357815162ffffff168452602093840193909101906001016200114d565b50505050565b60ff851681526001600160a01b03841660208201526101008101620011a260408301856200114a565b620011b160a08301846200114a565b95945050505050565b60805160a05161532b620011ea5f395f818161063a015261134d01525f818161360c0152614716015261532b5ff3fe608060405260043610610456575f3560e01c80637700485111610239578063be5e49b211610130578063da88d01a116100b1578063f2fde38b11610083578063f4db96981161006b578063f4db969814610d27578063f59c370814610d44578063f7c3b38f14610d6357005b8063f2fde38b14610ccc578063f3dc4f4814610ceb57005b8063da88d01a14610c41578063dd62ed3e14610c60578063e2745ef214610ca4578063e92871f614610cb857005b8063d1ace71011610102578063d505accf116100ea578063d505accf14610bfa578063d8454a8214610c19578063d89135cd14610c2d57005b8063d1ace71014610b77578063d232c22014610b9657005b8063be5e49b214610b1c578063c77e006d14610b3b578063c78fe0d414610b4f578063cc1776d314610b6357005b80638da5cb5b116101ba5780639c5ef8d71161018c578063a4d8971a11610174578063a4d8971a14610abf578063a5596b4f14610ade578063a9059cbb14610afd57005b80639c5ef8d714610a8c578063a457c2d714610aa057005b80638da5cb5b14610a2957806395101f9014610a4557806395d89b4114610a6457806396ce079514610a7857005b80637ecebe001161020b5780638a8c523c116101f35780638a8c523c146109e25780638bf1acff146109f65780638d8350ca14610a0a57005b80637ecebe001461099a5780638324c3b9146109ce57005b8063770048511461092957806379cc67901461093d5780637b1ab0d21461095c5780637b1ad1d71461097b57005b80633644e5151161034d5780635117cdee116102ce5780636bdb5ad1116102a057806370a082311161028857806370a08231146108c1578063715018a6146108f557806375de14961461090957005b80636bdb5ad1146108815780636f05be97146108a057005b80635117cdee146107e757806354fd4d50146108045780635b90fe66146108315780635f6417581461086257005b80633af32abf1161031f5780633ed8a169116103075780633ed8a1691461079557806342966c68146107b45780634f7041a5146107d357005b80633af32abf1461073f5780633e0c06291461077657005b80633644e515146106d2578063370158ea146106e657806339137f8b1461070c578063395093511461072057005b806318160ddd116103d7578063313ce567116103a957806333d48a7d1161039157806333d48a7d14610683578063351a964d1461069c57806335ed71a8146106b357005b8063313ce56714610627578063326339671461066457005b806318160ddd146105ac578063186488a8146105ca57806323b872dd146105e95780632984207a1461060857005b806307e9652c11610428578063095ea7b311610410578063095ea7b3146105515780630ac769dc146105705780631171bda91461058d57005b806307e9652c14610503578063095233081461052057005b806301b38af51461045f5780630588b1a51461047e578063064a59d0146104b357806306fdde03146104e257005b3661045d57005b005b34801561046a575f80fd5b5061045d610479366004614c6f565b610d84565b348015610489575f80fd5b50600754600160e01b900462ffffff165b60405162ffffff90911681526020015b60405180910390f35b3480156104be575f80fd5b50600854600160381b900463ffffffff1615155b60405190151581526020016104aa565b3480156104ed575f80fd5b506104f6610e1b565b6040516104aa9190614d31565b34801561050e575f80fd5b5060075462010000900460ff166104d2565b34801561052b575f80fd5b506016546001600160a01b03165b6040516001600160a01b0390911681526020016104aa565b34801561055c575f80fd5b506104d261056b366004614d57565b610eab565b34801561057b575f80fd5b50601a546001600160a01b0316610539565b348015610598575f80fd5b5061045d6105a7366004614d81565b610ec1565b3480156105b7575f80fd5b506009545b6040519081526020016104aa565b3480156105d5575f80fd5b5061045d6105e4366004614e64565b61107c565b3480156105f4575f80fd5b506104d2610603366004614d81565b6110e6565b348015610613575f80fd5b5061045d610622366004614eba565b611107565b348015610632575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016104aa565b34801561066f575f80fd5b5061045d61067e366004614edd565b611185565b34801561068e575f80fd5b5060085462ffffff1661049a565b3480156106a7575f80fd5b5060075460ff166104d2565b3480156106be575f80fd5b5061045d6106cd366004614ef6565b61126a565b3480156106dd575f80fd5b50601d546105bc565b3480156106f1575f80fd5b506106fa61133f565b6040516104aa96959493929190614f11565b348015610717575f80fd5b5061045d6114c8565b34801561072b575f80fd5b506104d261073a366004614d57565b611547565b34801561074a575f80fd5b506104d2610759366004614f74565b6001600160a01b03165f9081526003602052604090205460ff1690565b348015610781575f80fd5b5061045d610790366004614d57565b61157b565b3480156107a0575f80fd5b5061045d6107af366004614edd565b6116a0565b3480156107bf575f80fd5b5061045d6107ce366004614f8f565b611775565b3480156107de575f80fd5b5061049a61177f565b3480156107f2575f80fd5b506017546001600160a01b0316610539565b34801561080f575f80fd5b506040805180820190915260058152640312e302e360dc1b60208201526104f6565b34801561083c575f80fd5b50600854600160781b900463ffffffff1660405163ffffffff90911681526020016104aa565b34801561086d575f80fd5b5061049a61087c366004614f74565b61178e565b34801561088c575f80fd5b5061045d61089b366004614edd565b611889565b3480156108ab575f80fd5b506108b4611966565b6040516104aa9190614fcd565b3480156108cc575f80fd5b506105bc6108db366004614f74565b6001600160a01b03165f9081526001602052604090205490565b348015610900575f80fd5b5061045d611af7565b348015610914575f80fd5b50600754600160381b900462ffffff1661049a565b348015610934575f80fd5b5061045d611b4a565b348015610948575f80fd5b5061045d610957366004614d57565b611b8b565b348015610967575f80fd5b5061053961097636600461504c565b611ba4565b348015610986575f80fd5b5061045d610995366004614f74565b611c15565b3480156109a5575f80fd5b506105bc6109b4366004614f74565b6001600160a01b03165f908152601e602052604090205490565b3480156109d9575f80fd5b5061045d611c7d565b3480156109ed575f80fd5b5061045d611d02565b348015610a01575f80fd5b5061049a611de2565b348015610a15575f80fd5b5061049a610a24366004614f74565b611de8565b348015610a34575f80fd5b505f546001600160a01b0316610539565b348015610a50575f80fd5b5061049a610a5f366004614f74565b611eb2565b348015610a6f575f80fd5b506104f6611f8e565b348015610a83575f80fd5b506103e861049a565b348015610a97575f80fd5b5061045d611f9d565b348015610aab575f80fd5b506104d2610aba366004614d57565b611fd0565b348015610aca575f80fd5b5061045d610ad9366004614ef6565b612050565b348015610ae9575f80fd5b5061045d610af8366004614ef6565b6120d9565b348015610b08575f80fd5b506104d2610b17366004614d57565b612153565b348015610b27575f80fd5b5061045d610b36366004614f74565b61215f565b348015610b46575f80fd5b5061045d6121de565b348015610b5a575f80fd5b5061045d612261565b348015610b6e575f80fd5b5061049a6122e8565b348015610b82575f80fd5b5061045d610b91366004614ef6565b6122f2565b348015610ba1575f80fd5b506015546040805160ff808416151582526101008404811615156020830152620100008404811615159282019290925263010000008304821615156060820152640100000000909204161515608082015260a0016104aa565b348015610c05575f80fd5b5061045d610c14366004615083565b61236d565b348015610c24575f80fd5b50600d546105bc565b348015610c38575f80fd5b50600a546105bc565b348015610c4c575f80fd5b5061045d610c5b366004614edd565b61256d565b348015610c6b575f80fd5b506105bc610c7a36600461504c565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610caf575f80fd5b5061045d61263a565b348015610cc3575f80fd5b5061045d6126ec565b348015610cd7575f80fd5b5061045d610ce6366004614f74565b61276d565b348015610cf6575f80fd5b506104d2610d05366004614f74565b6001600160a01b03165f90815260046020526040902054610100900460ff1690565b348015610d32575f80fd5b506019546001600160a01b0316610539565b348015610d4f575f80fd5b5061045d610d5e3660046150ec565b6127d0565b348015610d6e575f80fd5b50600754640100000000900462ffffff1661049a565b5f546001600160a01b03163314610dd15760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b815f5b81811015610e1457610e0c858583818110610df157610df1615118565b9050602002016020810190610e069190614f74565b8461281e565b600101610dd4565b5050505050565b6060601b8054610e2a9061512c565b80601f0160208091040260200160405190810160405280929190818152602001828054610e569061512c565b8015610ea15780601f10610e7857610100808354040283529160200191610ea1565b820191905f5260205f20905b815481529060010190602001808311610e8457829003601f168201915b5050505050905090565b5f610eb7338484612939565b5060015b92915050565b5f546001600160a01b03163314610f095760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610f4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f71919061515e565b90505f6001600160a01b0385163014610fa757601a546001600160a01b03868116911614610f9f575f610faf565b601454610faf565b601254600f54015b90508282821015610fc05781610fc2565b825b830310156110045760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015611052573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110769190615175565b50505050565b5f546001600160a01b031633146110c45760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff16156110da575f80fd5b6110768484848461299a565b5f6110f2843384612e81565b6110fd848484612f03565b5060019392505050565b5f546001600160a01b0316331461114f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff1615611165575f80fd5b6102588163ffffffff161115611179575f80fd5b61118281613555565b50565b5f546001600160a01b031633146111cd5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff16156111e3575f80fd5b60018162ffffff161015801561120057506103e88162ffffff1611155b61123b5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610dc8565b6007805462ffffff60e01b1916600160e01b62ffffff93909316928302179055600954620186a0910204600e55565b5f546001600160a01b031633146112b25760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff16156112c9575f80fd5b8015806112e057506016546001600160a01b031615155b61132c5760405162461bcd60e51b815260206004820152600660248201527f4e6f2044455800000000000000000000000000000000000000000000000000006044820152606401610dc8565b6007805460ff1916911515919091179055565b6060805f805f6060601b601c7f00000000000000000000000000000000000000000000000000000000000000005f8054906101000a90046001600160a01b0316600954604051806040016040528060058152602001640312e302e360dc1b8152508580546113ac9061512c565b80601f01602080910402602001604051908101604052809291908181526020018280546113d89061512c565b80156114235780601f106113fa57610100808354040283529160200191611423565b820191905f5260205f20905b81548152906001019060200180831161140657829003601f168201915b505050505095508480546114369061512c565b80601f01602080910402602001604051908101604052809291908181526020018280546114629061512c565b80156114ad5780601f10611484576101008083540402835291602001916114ad565b820191905f5260205f20905b81548152906001019060200180831161149057829003601f168201915b50505050509450955095509550955095509550909192939495565b5f546001600160a01b031633146115105760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b335f8181526002602090815260408083206001600160a01b03871684529091528120549091610eb791859085905b01612939565b5f546001600160a01b031633146115c35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601854601a5447915f916001600160a01b039081169116146115e5575f6115e9565b6013545b905082828210156115fa57816115fc565b825b8303101561163e5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611689576040519150601f19603f3d011682016040523d82523d5f602084013e61168e565b606091505b505090508061169b575f80fd5b505050565b5f546001600160a01b031633146116e85760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b60155462010000900460ff16156116fd575f80fd5b62ffffff81161580611728575060648162ffffff16101580156117285750620186a062ffffff821611155b611730575f80fd5b611739816135c1565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b6111823382613664565b5f61178933611eb2565b905090565b6007545f9062010000900460ff16156117a857505f919050565b6001600160a01b0382163014806117d657506001600160a01b0382165f9081526003602052604090205460ff165b806117ee57506017546001600160a01b038381169116145b8061180657506016546001600160a01b038381169116145b611882576001600160a01b0382165f90815260046020526040902054610100900460ff1680611856575060085463ffffffff428116600160781b83048216600160381b9093048216929092011610155b61186e57600754600160801b900462ffffff16610ebb565b600754600160c81b900462ffffff16610ebb565b5f92915050565b5f546001600160a01b031633146118d15760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff16156118e8575f80fd5b60018162ffffff161015801561190557506103e88162ffffff1611155b6119405760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610dc8565b6008805462ffffff191662ffffff929092169182179055600954620186a0910204601155565b60408051600580825260c08201909252606091816020015b611986614b61565b81526020019060019003908161197e5790505090505f5b60058160ff161015611af3576040805160808101825260ff83165f81815260056020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff16815260200190600301906020826002010492830192600103820291508084116119fa579050505050918352505060ff83165f9081526005602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611a6e5750505092845250505060ff83165f8181526005602090815260409091206003015492019190915283518491908110611ae057611ae0615118565b602090810291909101015260010161199d565b5090565b5f546001600160a01b03163314611b3f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b611b485f6136f8565b565b60075460ff168015611b645750600754610100900460ff16155b8015611b7a57506007546301000000900460ff16155b611b82575f80fd5b611b485f613747565b611b96823383612e81565b611ba08282613664565b5050565b5f80546001600160a01b03163314611bed5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff1615611c04575f80fd5b611c0e8383613fec565b9392505050565b5f546001600160a01b03163314611c5d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff1615611c74575f80fd5b611182816142cd565b5f546001600160a01b03163314611cc55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805463ff000000191663010000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b5f546001600160a01b03163314611d4a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff1615611d61575f80fd5b600854600160381b900463ffffffff1615611dbe5760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920656e61626c656400000000000000000000000000000000006044820152606401610dc8565b600880546affffffff0000000000000019164263ffffffff16600160381b02179055565b5f611789335b5f6001600160a01b038216301480611e1757506001600160a01b0382165f9081526003602052604090205460ff165b80611e2f57506017546001600160a01b038381169116145b611882576001600160a01b0382165f90815260046020526040902054610100900460ff1680611e7f575060085463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611e9e576007546a0100000000000000000000900462ffffff16610ebb565b600754600160981b900462ffffff16610ebb565b6007545f9062010000900460ff1615611ecc57505f919050565b6001600160a01b038216301480611efa57506001600160a01b0382165f9081526003602052604090205460ff165b80611f1257506017546001600160a01b038381169116145b611882576001600160a01b0382165f90815260046020526040902054610100900460ff1680611f62575060085463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611f7a57600754600160681b900462ffffff16610ebb565b600754600160b01b900462ffffff16610ebb565b6060601c8054610e2a9061512c565b600754610100900460ff16158015611fbf57506007546301000000900460ff16155b611fc7575f80fd5b611b485f61447a565b335f9081526002602090815260408083206001600160a01b0386168452909152812054828110156120435760405162461bcd60e51b815260206004820152601260248201527f4e6567617469766520616c6c6f77616e636500000000000000000000000000006044820152606401610dc8565b6110fd3385858403612939565b5f546001600160a01b031633146120985760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b60075460ff1680156120b25750600754610100900460ff16155b80156120c857506007546301000000900460ff16155b6120d0575f80fd5b61118281613747565b5f546001600160a01b031633146121215760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff1615612137575f80fd5b60078054911515620100000262ff000019909216919091179055565b5f610eb7338484612f03565b5f546001600160a01b031633146121a75760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff16156121bd575f80fd5b6001600160a01b03165f908152600460205260409020805461ff0019169055565b5f546001600160a01b031633146122265760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805462ff00001916620100001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b5f546001600160a01b031633146122a95760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805464ff0000000019166401000000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f6117893361178e565b5f546001600160a01b0316331461233a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b600754610100900460ff1615801561235c57506007546301000000900460ff16155b612364575f80fd5b6111828161447a565b428410156123bd5760405162461bcd60e51b815260206004820152601160248201527f45787069726564207369676e61747572650000000000000000000000000000006044820152606401610dc8565b601d546001600160a01b038881165f818152601e602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa1580156124d5573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061250b5750886001600160a01b0316816001600160a01b0316145b6125575760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610dc8565b5050612564878787612939565b50505050505050565b5f546001600160a01b031633146125b55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554610100900460ff16156125c9575f80fd5b62ffffff811615806125f4575060648162ffffff16101580156125f45750620186a062ffffff821611155b6125fc575f80fd5b612605816146cd565b60405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda1959060200161176a565b5f546001600160a01b031633146126825760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b60075460ff16801561269c5750600754610100900460ff16155b6126a4575f80fd5b601254600f54305f9081526001602052604090205491019081106126c6575f80fd5b305f908152600160205260408120546012805493909103909201909155611b4890613747565b5f546001600160a01b031633146127345760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805461ff0019166101001790556040517fcc2f10fb1214ece03bcb178c4d75943daee74aff93182bfb58ba9b8ef5d8c5aa905f90a1565b5f546001600160a01b031633146127b55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6001600160a01b0381166127c7575f80fd5b611182816136f8565b5f546001600160a01b031633146128185760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b611ba082825b60155460ff161561282d575f80fd5b6001600160a01b0382161580159061285057506001600160a01b03821661dead14155b612858575f80fd5b6016546001600160a01b0383811691161480159061288457506017546001600160a01b03838116911614155b6128db5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610dc8565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff16106129a9575f80fd5b6001600160a01b03831630148015906129ca57506001600160a01b03831615155b6129d2575f80fd5b60ff84165f9081526005602052604090206001600160a01b03841661dead1480156129fe5750805460ff165b8015612a0d57505f8160030154115b15612a5a5760405162461bcd60e51b815260206004820152600f60248201527f556e636c61696d656420746178657300000000000000000000000000000000006044820152606401610dc8565b6001810180548451600780546cffffff0000000000000000000019811662ffffff9485169093036a01000000000000000000008083048616919091018516810293841780845586546020808c01516fffffff00000000000000000000000000199097166fffffffffffff0000000000000000000019909516949094176301000000918290048816909603600160681b9283900488160187169091029490941780845595546040808b01517fffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff89166601000000000000938490048916909103600160801b808b048a169190910189160290811780875560028b0180548d517fffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff909c169b909b179a8a16909203600160981b918290048a1601891602989098178086558854948b01517fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff8216979095048816909403600160b01b8086048916919091018816029586178086559754908a0151600160c81b98899004881692909104871690030185169095027fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff9093167fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff9091161791909117908190556161a89290041611801590612ce957506007546161a8600160681b90910462ffffff1611801590612cba57506007546161a8600160801b90910462ffffff1611155b8015612ce957506007546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b612d355760405162461bcd60e51b815260206004820152600860248201527f48696768205461780000000000000000000000000000000000000000000000006044820152606401610dc8565b600754620186a0600160981b90910462ffffff1611801590612d695750600754620186a0600160b01b90910462ffffff1611155b8015612d875750600754620186a0600160c81b90910462ffffff1611155b612dd35760405162461bcd60e51b815260206004820152600f60248201527f496e76616c69642050656e616c747900000000000000000000000000000000006044820152606401610dc8565b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b03861602178155612e1760018201846003614b9c565b50612e2760028201836003614b9c565b50805460ff16612e3d57805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a85858585604051612e729493929190615190565b60405180910390a15050505050565b6001600160a01b038381165f9081526002602090815260408083209386168352929052205481811015612ef65760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e6365000000000000000000006044820152606401610dc8565b6110768484848403612939565b61deac196001600160a01b03831601612f1a575f80fd5b6007546301000000900460ff16158015612f3c5750600754610100900460ff16155b8015612f6f57506017546001600160a01b03848116911614801590612f6f57506016546001600160a01b03848116911614155b15612f8657612f7d5f613747565b612f865f61447a565b5f81118015612fad57506001600160a01b0383165f9081526003602052604090205460ff16155b8015612fd157506001600160a01b0382165f9081526003602052604090205460ff16155b8015612fe657506001600160a01b0383163014155b8015612ffb57506001600160a01b0382163014155b801561301557506016546001600160a01b03838116911614155b1561354a576017546001600160a01b0384811691161480159061304657506017546001600160a01b03838116911614155b8061308f57506017546001600160a01b038481169116148061307557506017546001600160a01b038381169116145b801561308f5750600854600160381b900463ffffffff1615155b6130db5760405162461bcd60e51b815260206004820152601060248201527f54726164696e672064697361626c6564000000000000000000000000000000006044820152606401610dc8565b600b5415806130ec5750600b548111155b6131385760405162461bcd60e51b815260206004820152600d60248201527f45786365656473206d61785478000000000000000000000000000000000000006044820152606401610dc8565b600c54158061314f57506001600160a01b03821630145b8061317e57506017546001600160a01b038381169116148061317e57506016546001600160a01b038381169116145b806131a45750600c546001600160a01b0383165f90815260016020526040902054820111155b6131f05760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617842616c616e636500000000000000000000000000006044820152606401610dc8565b60075462010000900460ff1615801561321357506007546301000000900460ff16155b80156132275750600754610100900460ff16155b1561354a576017545f9081906001600160a01b038681169116148061325957506017546001600160a01b038581169116145b15613280576017546001600160a01b0386811691161461327a57600261327d565b60015b90505b5f8160ff166001146132925785613294565b845b60085490915063ffffffff428116600160781b83048216600160381b90930482169290920116108015906132e557506001600160a01b0381165f90815260046020526040902054610100900460ff16155b1561330f576001600160a01b0381165f908152600460205260409020805461ff0019166101001790555b5f5b60058160ff161015613531575f808460ff161161339c576001600160a01b0383165f90815260046020526040902054610100900460ff166133825760ff82165f908152600560205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16613464565b60ff82165f90815260056020526040812060020190613362565b8360ff16600114613402576001600160a01b0383165f90815260046020526040902054610100900460ff166133e65760ff82165f9081526005602052604090206001016002613362565b60ff82165f908152600560205260409020600290810190613362565b6001600160a01b0383165f90815260046020526040902054610100900460ff166134425760ff82165f908152600560205260409020600190810190613362565b60ff82165f908152600560205260409020600201546301000000900462ffffff165b62ffffff169050805f036134785750613529565b620186a08682020461348b89308361476e565b60175460ff84165f908152600560205260409020546001600160a01b03918216610100909104909116036134c6576012805482019055613522565b60ff83165f9081526005602052604090205461deac196101009091046001600160a01b0316016134ff576134fa3082613664565b613522565b60ff83165f908152600560205260409020600301805482019055600f8054820190555b9490940193505b600101613311565b50821561354657600d80548401905592829003925b5050505b61169b83838361476e565b600880547fffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffff16600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba919060200161176a565b6007805469ffffff000000000000001916600160381b62ffffff8416908102919091179091556135f1575f613607565b6136076009548262ffffff16620186a091020490565b600c557f00000000000000000000000000000000000000000000000000000000000000006111825760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c99060200161176a565b61366e82826148ab565b60075461368790640100000000900462ffffff166146cd565b60075461369f90600160381b900462ffffff166135c1565b6007805462ffffff60e01b198116600160e01b9182900462ffffff1691820217909155600954620186a0910204600e556008805462ffffff811662ffffff199091168117909155600954620186a0910204601155611ba0565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6007805461ff001981166101001790915560ff1615613fde5780806137e6575060115460026012548161377c5761377c6151cd565b601854601a5492909104916001600160a01b0390811691161461379f575f6137a3565b600f545b01101580156137e65750601254601854601a546001600160a01b039081169116146137ce575f6137d2565b600f545b305f90815260016020526040902054910111155b15613bc8575f6002601254816137fe576137fe6151cd565b60408051600280825260608201835293909204935047925f929160208301908036833701905050905030815f8151811061383a5761383a615118565b6001600160a01b03928316602091820292909201015260185482519116908290600190811061386b5761386b615118565b6001600160a01b039283166020918202929092010152601654601854601a546138ad933093811692889282169116146138a4575f611575565b600f5401612939565b601654601854601a546001600160a01b039283169263791ac94792879282169116146138d9575f6138dd565b600f545b015f8430426001016040518663ffffffff1660e01b81526004016139059594939291906151e1565b5f604051808303815f87803b15801561391c575f80fd5b505af192505050801561392d575060015b61394e576016546139499030906001600160a01b03165f612939565b613bc4565b600880546effffffff000000000000000000000019166b01000000000000000000000063ffffffff421602179055601254156139a057600260125f82825481613999576139996151cd565b0490915550505b601854601a5447849003917f054301190fdd9cbc2629a04d617cd2c664ec09eb96f277e80bfde32405ea3e149186916001600160a01b039182169116146139e7575f6139eb565b600f545b60408051929091018252602082018490520160405180910390a18015613bc257601854601a5482916001600160a01b03908116911603613a9c57613a7f82600f54871015613a5657600f548701620186a0880281613a4b57613a4b6151cd565b04620186a091020490565b600f5487810190620186a00281613a6f57613a6f6151cd565b04620186a003620186a091020490565b600f80546010805490910190555f90556013805482850301905590505b5f85118015613aaa57505f81115b15613bc057601654613ac79030906001600160a01b031687612939565b60165460195460405163f305d71960e01b8152306004820152602481018890525f6044820181905260648201526001600160a01b0391821660848201526001420160a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613b56575060408051601f3d908101601f19168201909252613b5391810190615252565b60015b613b7757601654613b729030906001600160a01b03165f612939565b613bc0565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505f601255505b505b505b5050505b8080613c275750601a546001600160a01b03163014801590613bfb5750601854601a546001600160a01b03908116911614155b8015613c0b5750601154600f5410155b8015613c275750600f54305f9081526001602052604090205410155b15613fde57601a546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613c72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c96919061515e565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f81518110613ccf57613ccf615118565b6001600160a01b039283166020918202929092010152601854825191169082906001908110613d0057613d00615118565b6001600160a01b039283166020918202929092010152601a54825191169082906002908110613d3157613d31615118565b6001600160a01b039283166020918202929092010152601a54601654600f5460405163095ea7b360e01b81529184166004830152602482015291169063095ea7b3906044016020604051808303815f875af1158015613d92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613db69190615175565b50601654600f54604051635c11d79560e01b81526001600160a01b0390921691635c11d79591613df3915f908690309042600101906004016151e1565b5f604051808303815f87803b158015613e0a575f80fd5b505af1925050508015613e1b575060015b613e9a57601a5460165460405163095ea7b360e01b81526001600160a01b0391821660048201525f602482015291169063095ea7b3906044016020604051808303815f875af1158015613e70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e949190615175565b50613fdb565b601a54600f546040516370a0823160e01b81523060048201527f95725684d8aa29bbc5031270724c91e6e8bee7732f11ee91ed9b3d93929e99e5926001600160a01b0316919082906370a0823190602401602060405180830381865afa158015613f06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f2a919061515e565b604080516001600160a01b039094168452602084019290925285039082015260600160405180910390a1600f80546010805490910190555f9055601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fce919061515e565b6014805491840390910190555b50505b506007805461ff0019169055565b5f6001600160a01b038316613fff575f80fd5b6016546001600160a01b03848116911614614242575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614055573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614079919061527d565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140dc919061527d565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af115801561412c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614150919061527d565b90506001600160a01b0381166141d2576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af11580156141ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141cf919061527d565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b0383811691161461427357601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a3506017546001600160a01b031692915050565b6001600160a01b03811615806142eb57506001600160a01b03811630145b8061430357506018546001600160a01b038281169116145b806143f457506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015614350573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614374919061527d565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af11580156143c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143e8919061527d565b6001600160a01b031614155b6144405760405162461bcd60e51b815260206004820152600760248201527f4e6f2050616972000000000000000000000000000000000000000000000000006044820152606401610dc8565b6001600160a01b038116156144555780614457565b305b601a80546001600160a01b0319166001600160a01b039290921691909117905550565b6007805463ff00000019166301000000179055806145b757601a546001600160a01b0316301480156144d35750600f5415806144c55750600f54305f90815260016020526040902054105b806144d35750600e54600f54105b6146bd57601854601a546001600160a01b03908116911614801561450257506013541580614502575047601354105b6146bd57601a546001600160a01b031630148015906145325750601854601a546001600160a01b03908116911614155b80156145b2575060145415806145b25750601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614589573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145ad919061515e565b601454105b6146bd575b5f805b60058160ff1610156146695760ff81165f90815260056020526040902080546003909101546101009091046001600160a01b03169080158061460657506001600160a01b03821661dead145b8061461e57506017546001600160a01b038381169116145b1561462a575050614661565b5f6146358383614976565b905080156146595760ff84165f908152600560205260409020600301805482900390555b939093019250505b6001016145ba565b506008805466ffffffff0000001916630100000063ffffffff4216021790556040805182815290517fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979181900360200190a1505b506007805463ff00000019169055565b6007805466ffffff00000000191664010000000062ffffff8416908102919091179091556146fb575f614711565b6147116009548262ffffff16620186a091020490565b600b557f00000000000000000000000000000000000000000000000000000000000000006111825760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda1959060200161176a565b6001600160a01b0383161580159061478e57506001600160a01b03821615155b6147da5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610dc8565b6001600160a01b0383165f908152600160205260409020548111156148335760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b8015614866576001600160a01b038084165f90815260016020526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161298d91815260200190565b6001600160a01b0382165f908152600160205260409020548111156149045760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b6001600160a01b0382165f818152600160205260409081902080548490039055600980548490039055600a8054840190555161dead91907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061496a9085815260200190565b60405180910390a35050565b601a545f90306001600160a01b03909116036149b35761499730848461476e565b81600f5f8282546149a891906152ac565b90915550614b5b9050565b6010545f906149c4846103e86152bf565b6149cf9060646152bf565b6149d991906152d6565b601854601a549192505f916001600160a01b03918216911603614a985750601354620186a08282020490811115614a14575f92505050610ebb565b5f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114614a62576040519150601f19603f3d011682016040523d82523d5f602084013e614a67565b606091505b5050905080614a7b575f9350505050610ebb565b8160135f828254614a8c91906152ac565b90915550614b42915050565b50601454620186a08282020490841115614ab6575f92505050610ebb565b601a5460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af1158015614b06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b2a9190615175565b508060145f828254614b3c91906152ac565b90915550505b8360105f828254614b5391906152ac565b909155505050505b50919050565b60405180608001604052805f6001600160a01b03168152602001614b83614c30565b8152602001614b90614c30565b81526020015f81525090565b600183019183908215614c24579160200282015f5b83821115614bf357835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302614bb1565b8015614c225782816101000a81549062ffffff0219169055600301602081600201049283019260010302614bf3565b505b50611af3929150614c4e565b60405180606001604052806003906020820280368337509192915050565b5b80821115611af3575f8155600101614c4f565b8015158114611182575f80fd5b5f805f60408486031215614c81575f80fd5b833567ffffffffffffffff80821115614c98575f80fd5b818601915086601f830112614cab575f80fd5b813581811115614cb9575f80fd5b8760208260051b8501011115614ccd575f80fd5b60209283019550935050840135614ce381614c62565b809150509250925092565b5f81518084525f5b81811015614d1257602081850181015186830182015201614cf6565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f611c0e6020830184614cee565b6001600160a01b0381168114611182575f80fd5b5f8060408385031215614d68575f80fd5b8235614d7381614d43565b946020939093013593505050565b5f805f60608486031215614d93575f80fd5b8335614d9e81614d43565b92506020840135614dae81614d43565b929592945050506040919091013590565b803560ff81168114614dcf575f80fd5b919050565b803562ffffff81168114614dcf575f80fd5b5f82601f830112614df5575f80fd5b6040516060810181811067ffffffffffffffff82111715614e2457634e487b7160e01b5f52604160045260245ffd5b604052806060840185811115614e38575f80fd5b845b81811015614e5957614e4b81614dd4565b835260209283019201614e3a565b509195945050505050565b5f805f806101008587031215614e78575f80fd5b614e8185614dbf565b93506020850135614e9181614d43565b9250614ea08660408701614de6565b9150614eaf8660a08701614de6565b905092959194509250565b5f60208284031215614eca575f80fd5b813563ffffffff81168114611c0e575f80fd5b5f60208284031215614eed575f80fd5b611c0e82614dd4565b5f60208284031215614f06575f80fd5b8135611c0e81614c62565b60c081525f614f2360c0830189614cee565b8281036020840152614f358189614cee565b905060ff871660408401526001600160a01b038616606084015284608084015282810360a0840152614f678185614cee565b9998505050505050505050565b5f60208284031215614f84575f80fd5b8135611c0e81614d43565b5f60208284031215614f9f575f80fd5b5035919050565b805f5b600381101561107657815162ffffff16845260209384019390910190600101614fa9565b602080825282518282018190525f919060409081850190868401855b8281101561503f5781516001600160a01b0381511685528681015161501088870182614fa6565b50858101516150226080870182614fa6565b506060015160e08501526101009093019290850190600101614fe9565b5091979650505050505050565b5f806040838503121561505d575f80fd5b823561506881614d43565b9150602083013561507881614d43565b809150509250929050565b5f805f805f805f60e0888a031215615099575f80fd5b87356150a481614d43565b965060208801356150b481614d43565b955060408801359450606088013593506150d060808901614dbf565b925060a0880135915060c0880135905092959891949750929550565b5f80604083850312156150fd575f80fd5b823561510881614d43565b9150602083013561507881614c62565b634e487b7160e01b5f52603260045260245ffd5b600181811c9082168061514057607f821691505b602082108103614b5b57634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561516e575f80fd5b5051919050565b5f60208284031215615185575f80fd5b8151611c0e81614c62565b60ff851681526001600160a01b038416602082015261010081016151b76040830185614fa6565b6151c460a0830184614fa6565b95945050505050565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156152315784516001600160a01b03168352938301939183019160010161520c565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215615264575f80fd5b8351925060208401519150604084015190509250925092565b5f6020828403121561528d575f80fd5b8151611c0e81614d43565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610ebb57610ebb615298565b8082028115828204841417610ebb57610ebb615298565b5f826152f057634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220434678f03537ff0032b8deb3ae7d526cb363b3f599538213ca6f2a5c0fde092364736f6c634300081700330000000000000000000000007ba33149136a20e1f3342b6c719d0a1102abe856

Deployed Bytecode

0x608060405260043610610456575f3560e01c80637700485111610239578063be5e49b211610130578063da88d01a116100b1578063f2fde38b11610083578063f4db96981161006b578063f4db969814610d27578063f59c370814610d44578063f7c3b38f14610d6357005b8063f2fde38b14610ccc578063f3dc4f4814610ceb57005b8063da88d01a14610c41578063dd62ed3e14610c60578063e2745ef214610ca4578063e92871f614610cb857005b8063d1ace71011610102578063d505accf116100ea578063d505accf14610bfa578063d8454a8214610c19578063d89135cd14610c2d57005b8063d1ace71014610b77578063d232c22014610b9657005b8063be5e49b214610b1c578063c77e006d14610b3b578063c78fe0d414610b4f578063cc1776d314610b6357005b80638da5cb5b116101ba5780639c5ef8d71161018c578063a4d8971a11610174578063a4d8971a14610abf578063a5596b4f14610ade578063a9059cbb14610afd57005b80639c5ef8d714610a8c578063a457c2d714610aa057005b80638da5cb5b14610a2957806395101f9014610a4557806395d89b4114610a6457806396ce079514610a7857005b80637ecebe001161020b5780638a8c523c116101f35780638a8c523c146109e25780638bf1acff146109f65780638d8350ca14610a0a57005b80637ecebe001461099a5780638324c3b9146109ce57005b8063770048511461092957806379cc67901461093d5780637b1ab0d21461095c5780637b1ad1d71461097b57005b80633644e5151161034d5780635117cdee116102ce5780636bdb5ad1116102a057806370a082311161028857806370a08231146108c1578063715018a6146108f557806375de14961461090957005b80636bdb5ad1146108815780636f05be97146108a057005b80635117cdee146107e757806354fd4d50146108045780635b90fe66146108315780635f6417581461086257005b80633af32abf1161031f5780633ed8a169116103075780633ed8a1691461079557806342966c68146107b45780634f7041a5146107d357005b80633af32abf1461073f5780633e0c06291461077657005b80633644e515146106d2578063370158ea146106e657806339137f8b1461070c578063395093511461072057005b806318160ddd116103d7578063313ce567116103a957806333d48a7d1161039157806333d48a7d14610683578063351a964d1461069c57806335ed71a8146106b357005b8063313ce56714610627578063326339671461066457005b806318160ddd146105ac578063186488a8146105ca57806323b872dd146105e95780632984207a1461060857005b806307e9652c11610428578063095ea7b311610410578063095ea7b3146105515780630ac769dc146105705780631171bda91461058d57005b806307e9652c14610503578063095233081461052057005b806301b38af51461045f5780630588b1a51461047e578063064a59d0146104b357806306fdde03146104e257005b3661045d57005b005b34801561046a575f80fd5b5061045d610479366004614c6f565b610d84565b348015610489575f80fd5b50600754600160e01b900462ffffff165b60405162ffffff90911681526020015b60405180910390f35b3480156104be575f80fd5b50600854600160381b900463ffffffff1615155b60405190151581526020016104aa565b3480156104ed575f80fd5b506104f6610e1b565b6040516104aa9190614d31565b34801561050e575f80fd5b5060075462010000900460ff166104d2565b34801561052b575f80fd5b506016546001600160a01b03165b6040516001600160a01b0390911681526020016104aa565b34801561055c575f80fd5b506104d261056b366004614d57565b610eab565b34801561057b575f80fd5b50601a546001600160a01b0316610539565b348015610598575f80fd5b5061045d6105a7366004614d81565b610ec1565b3480156105b7575f80fd5b506009545b6040519081526020016104aa565b3480156105d5575f80fd5b5061045d6105e4366004614e64565b61107c565b3480156105f4575f80fd5b506104d2610603366004614d81565b6110e6565b348015610613575f80fd5b5061045d610622366004614eba565b611107565b348015610632575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000121681526020016104aa565b34801561066f575f80fd5b5061045d61067e366004614edd565b611185565b34801561068e575f80fd5b5060085462ffffff1661049a565b3480156106a7575f80fd5b5060075460ff166104d2565b3480156106be575f80fd5b5061045d6106cd366004614ef6565b61126a565b3480156106dd575f80fd5b50601d546105bc565b3480156106f1575f80fd5b506106fa61133f565b6040516104aa96959493929190614f11565b348015610717575f80fd5b5061045d6114c8565b34801561072b575f80fd5b506104d261073a366004614d57565b611547565b34801561074a575f80fd5b506104d2610759366004614f74565b6001600160a01b03165f9081526003602052604090205460ff1690565b348015610781575f80fd5b5061045d610790366004614d57565b61157b565b3480156107a0575f80fd5b5061045d6107af366004614edd565b6116a0565b3480156107bf575f80fd5b5061045d6107ce366004614f8f565b611775565b3480156107de575f80fd5b5061049a61177f565b3480156107f2575f80fd5b506017546001600160a01b0316610539565b34801561080f575f80fd5b506040805180820190915260058152640312e302e360dc1b60208201526104f6565b34801561083c575f80fd5b50600854600160781b900463ffffffff1660405163ffffffff90911681526020016104aa565b34801561086d575f80fd5b5061049a61087c366004614f74565b61178e565b34801561088c575f80fd5b5061045d61089b366004614edd565b611889565b3480156108ab575f80fd5b506108b4611966565b6040516104aa9190614fcd565b3480156108cc575f80fd5b506105bc6108db366004614f74565b6001600160a01b03165f9081526001602052604090205490565b348015610900575f80fd5b5061045d611af7565b348015610914575f80fd5b50600754600160381b900462ffffff1661049a565b348015610934575f80fd5b5061045d611b4a565b348015610948575f80fd5b5061045d610957366004614d57565b611b8b565b348015610967575f80fd5b5061053961097636600461504c565b611ba4565b348015610986575f80fd5b5061045d610995366004614f74565b611c15565b3480156109a5575f80fd5b506105bc6109b4366004614f74565b6001600160a01b03165f908152601e602052604090205490565b3480156109d9575f80fd5b5061045d611c7d565b3480156109ed575f80fd5b5061045d611d02565b348015610a01575f80fd5b5061049a611de2565b348015610a15575f80fd5b5061049a610a24366004614f74565b611de8565b348015610a34575f80fd5b505f546001600160a01b0316610539565b348015610a50575f80fd5b5061049a610a5f366004614f74565b611eb2565b348015610a6f575f80fd5b506104f6611f8e565b348015610a83575f80fd5b506103e861049a565b348015610a97575f80fd5b5061045d611f9d565b348015610aab575f80fd5b506104d2610aba366004614d57565b611fd0565b348015610aca575f80fd5b5061045d610ad9366004614ef6565b612050565b348015610ae9575f80fd5b5061045d610af8366004614ef6565b6120d9565b348015610b08575f80fd5b506104d2610b17366004614d57565b612153565b348015610b27575f80fd5b5061045d610b36366004614f74565b61215f565b348015610b46575f80fd5b5061045d6121de565b348015610b5a575f80fd5b5061045d612261565b348015610b6e575f80fd5b5061049a6122e8565b348015610b82575f80fd5b5061045d610b91366004614ef6565b6122f2565b348015610ba1575f80fd5b506015546040805160ff808416151582526101008404811615156020830152620100008404811615159282019290925263010000008304821615156060820152640100000000909204161515608082015260a0016104aa565b348015610c05575f80fd5b5061045d610c14366004615083565b61236d565b348015610c24575f80fd5b50600d546105bc565b348015610c38575f80fd5b50600a546105bc565b348015610c4c575f80fd5b5061045d610c5b366004614edd565b61256d565b348015610c6b575f80fd5b506105bc610c7a36600461504c565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610caf575f80fd5b5061045d61263a565b348015610cc3575f80fd5b5061045d6126ec565b348015610cd7575f80fd5b5061045d610ce6366004614f74565b61276d565b348015610cf6575f80fd5b506104d2610d05366004614f74565b6001600160a01b03165f90815260046020526040902054610100900460ff1690565b348015610d32575f80fd5b506019546001600160a01b0316610539565b348015610d4f575f80fd5b5061045d610d5e3660046150ec565b6127d0565b348015610d6e575f80fd5b50600754640100000000900462ffffff1661049a565b5f546001600160a01b03163314610dd15760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b815f5b81811015610e1457610e0c858583818110610df157610df1615118565b9050602002016020810190610e069190614f74565b8461281e565b600101610dd4565b5050505050565b6060601b8054610e2a9061512c565b80601f0160208091040260200160405190810160405280929190818152602001828054610e569061512c565b8015610ea15780601f10610e7857610100808354040283529160200191610ea1565b820191905f5260205f20905b815481529060010190602001808311610e8457829003601f168201915b5050505050905090565b5f610eb7338484612939565b5060015b92915050565b5f546001600160a01b03163314610f095760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610f4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f71919061515e565b90505f6001600160a01b0385163014610fa757601a546001600160a01b03868116911614610f9f575f610faf565b601454610faf565b601254600f54015b90508282821015610fc05781610fc2565b825b830310156110045760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015611052573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110769190615175565b50505050565b5f546001600160a01b031633146110c45760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff16156110da575f80fd5b6110768484848461299a565b5f6110f2843384612e81565b6110fd848484612f03565b5060019392505050565b5f546001600160a01b0316331461114f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff1615611165575f80fd5b6102588163ffffffff161115611179575f80fd5b61118281613555565b50565b5f546001600160a01b031633146111cd5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff16156111e3575f80fd5b60018162ffffff161015801561120057506103e88162ffffff1611155b61123b5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610dc8565b6007805462ffffff60e01b1916600160e01b62ffffff93909316928302179055600954620186a0910204600e55565b5f546001600160a01b031633146112b25760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff16156112c9575f80fd5b8015806112e057506016546001600160a01b031615155b61132c5760405162461bcd60e51b815260206004820152600660248201527f4e6f2044455800000000000000000000000000000000000000000000000000006044820152606401610dc8565b6007805460ff1916911515919091179055565b6060805f805f6060601b601c7f00000000000000000000000000000000000000000000000000000000000000125f8054906101000a90046001600160a01b0316600954604051806040016040528060058152602001640312e302e360dc1b8152508580546113ac9061512c565b80601f01602080910402602001604051908101604052809291908181526020018280546113d89061512c565b80156114235780601f106113fa57610100808354040283529160200191611423565b820191905f5260205f20905b81548152906001019060200180831161140657829003601f168201915b505050505095508480546114369061512c565b80601f01602080910402602001604051908101604052809291908181526020018280546114629061512c565b80156114ad5780601f10611484576101008083540402835291602001916114ad565b820191905f5260205f20905b81548152906001019060200180831161149057829003601f168201915b50505050509450955095509550955095509550909192939495565b5f546001600160a01b031633146115105760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b335f8181526002602090815260408083206001600160a01b03871684529091528120549091610eb791859085905b01612939565b5f546001600160a01b031633146115c35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601854601a5447915f916001600160a01b039081169116146115e5575f6115e9565b6013545b905082828210156115fa57816115fc565b825b8303101561163e5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611689576040519150601f19603f3d011682016040523d82523d5f602084013e61168e565b606091505b505090508061169b575f80fd5b505050565b5f546001600160a01b031633146116e85760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b60155462010000900460ff16156116fd575f80fd5b62ffffff81161580611728575060648162ffffff16101580156117285750620186a062ffffff821611155b611730575f80fd5b611739816135c1565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b6111823382613664565b5f61178933611eb2565b905090565b6007545f9062010000900460ff16156117a857505f919050565b6001600160a01b0382163014806117d657506001600160a01b0382165f9081526003602052604090205460ff165b806117ee57506017546001600160a01b038381169116145b8061180657506016546001600160a01b038381169116145b611882576001600160a01b0382165f90815260046020526040902054610100900460ff1680611856575060085463ffffffff428116600160781b83048216600160381b9093048216929092011610155b61186e57600754600160801b900462ffffff16610ebb565b600754600160c81b900462ffffff16610ebb565b5f92915050565b5f546001600160a01b031633146118d15760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff16156118e8575f80fd5b60018162ffffff161015801561190557506103e88162ffffff1611155b6119405760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610dc8565b6008805462ffffff191662ffffff929092169182179055600954620186a0910204601155565b60408051600580825260c08201909252606091816020015b611986614b61565b81526020019060019003908161197e5790505090505f5b60058160ff161015611af3576040805160808101825260ff83165f81815260056020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff16815260200190600301906020826002010492830192600103820291508084116119fa579050505050918352505060ff83165f9081526005602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611a6e5750505092845250505060ff83165f8181526005602090815260409091206003015492019190915283518491908110611ae057611ae0615118565b602090810291909101015260010161199d565b5090565b5f546001600160a01b03163314611b3f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b611b485f6136f8565b565b60075460ff168015611b645750600754610100900460ff16155b8015611b7a57506007546301000000900460ff16155b611b82575f80fd5b611b485f613747565b611b96823383612e81565b611ba08282613664565b5050565b5f80546001600160a01b03163314611bed5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff1615611c04575f80fd5b611c0e8383613fec565b9392505050565b5f546001600160a01b03163314611c5d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff1615611c74575f80fd5b611182816142cd565b5f546001600160a01b03163314611cc55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805463ff000000191663010000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b5f546001600160a01b03163314611d4a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff1615611d61575f80fd5b600854600160381b900463ffffffff1615611dbe5760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920656e61626c656400000000000000000000000000000000006044820152606401610dc8565b600880546affffffff0000000000000019164263ffffffff16600160381b02179055565b5f611789335b5f6001600160a01b038216301480611e1757506001600160a01b0382165f9081526003602052604090205460ff165b80611e2f57506017546001600160a01b038381169116145b611882576001600160a01b0382165f90815260046020526040902054610100900460ff1680611e7f575060085463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611e9e576007546a0100000000000000000000900462ffffff16610ebb565b600754600160981b900462ffffff16610ebb565b6007545f9062010000900460ff1615611ecc57505f919050565b6001600160a01b038216301480611efa57506001600160a01b0382165f9081526003602052604090205460ff165b80611f1257506017546001600160a01b038381169116145b611882576001600160a01b0382165f90815260046020526040902054610100900460ff1680611f62575060085463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611f7a57600754600160681b900462ffffff16610ebb565b600754600160b01b900462ffffff16610ebb565b6060601c8054610e2a9061512c565b600754610100900460ff16158015611fbf57506007546301000000900460ff16155b611fc7575f80fd5b611b485f61447a565b335f9081526002602090815260408083206001600160a01b0386168452909152812054828110156120435760405162461bcd60e51b815260206004820152601260248201527f4e6567617469766520616c6c6f77616e636500000000000000000000000000006044820152606401610dc8565b6110fd3385858403612939565b5f546001600160a01b031633146120985760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b60075460ff1680156120b25750600754610100900460ff16155b80156120c857506007546301000000900460ff16155b6120d0575f80fd5b61118281613747565b5f546001600160a01b031633146121215760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff1615612137575f80fd5b60078054911515620100000262ff000019909216919091179055565b5f610eb7338484612f03565b5f546001600160a01b031633146121a75760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff16156121bd575f80fd5b6001600160a01b03165f908152600460205260409020805461ff0019169055565b5f546001600160a01b031633146122265760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805462ff00001916620100001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b5f546001600160a01b031633146122a95760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805464ff0000000019166401000000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f6117893361178e565b5f546001600160a01b0316331461233a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b600754610100900460ff1615801561235c57506007546301000000900460ff16155b612364575f80fd5b6111828161447a565b428410156123bd5760405162461bcd60e51b815260206004820152601160248201527f45787069726564207369676e61747572650000000000000000000000000000006044820152606401610dc8565b601d546001600160a01b038881165f818152601e602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa1580156124d5573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061250b5750886001600160a01b0316816001600160a01b0316145b6125575760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610dc8565b5050612564878787612939565b50505050505050565b5f546001600160a01b031633146125b55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554610100900460ff16156125c9575f80fd5b62ffffff811615806125f4575060648162ffffff16101580156125f45750620186a062ffffff821611155b6125fc575f80fd5b612605816146cd565b60405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda1959060200161176a565b5f546001600160a01b031633146126825760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b60075460ff16801561269c5750600754610100900460ff16155b6126a4575f80fd5b601254600f54305f9081526001602052604090205491019081106126c6575f80fd5b305f908152600160205260408120546012805493909103909201909155611b4890613747565b5f546001600160a01b031633146127345760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805461ff0019166101001790556040517fcc2f10fb1214ece03bcb178c4d75943daee74aff93182bfb58ba9b8ef5d8c5aa905f90a1565b5f546001600160a01b031633146127b55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6001600160a01b0381166127c7575f80fd5b611182816136f8565b5f546001600160a01b031633146128185760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b611ba082825b60155460ff161561282d575f80fd5b6001600160a01b0382161580159061285057506001600160a01b03821661dead14155b612858575f80fd5b6016546001600160a01b0383811691161480159061288457506017546001600160a01b03838116911614155b6128db5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610dc8565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff16106129a9575f80fd5b6001600160a01b03831630148015906129ca57506001600160a01b03831615155b6129d2575f80fd5b60ff84165f9081526005602052604090206001600160a01b03841661dead1480156129fe5750805460ff165b8015612a0d57505f8160030154115b15612a5a5760405162461bcd60e51b815260206004820152600f60248201527f556e636c61696d656420746178657300000000000000000000000000000000006044820152606401610dc8565b6001810180548451600780546cffffff0000000000000000000019811662ffffff9485169093036a01000000000000000000008083048616919091018516810293841780845586546020808c01516fffffff00000000000000000000000000199097166fffffffffffff0000000000000000000019909516949094176301000000918290048816909603600160681b9283900488160187169091029490941780845595546040808b01517fffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff89166601000000000000938490048916909103600160801b808b048a169190910189160290811780875560028b0180548d517fffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff909c169b909b179a8a16909203600160981b918290048a1601891602989098178086558854948b01517fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff8216979095048816909403600160b01b8086048916919091018816029586178086559754908a0151600160c81b98899004881692909104871690030185169095027fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff9093167fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff9091161791909117908190556161a89290041611801590612ce957506007546161a8600160681b90910462ffffff1611801590612cba57506007546161a8600160801b90910462ffffff1611155b8015612ce957506007546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b612d355760405162461bcd60e51b815260206004820152600860248201527f48696768205461780000000000000000000000000000000000000000000000006044820152606401610dc8565b600754620186a0600160981b90910462ffffff1611801590612d695750600754620186a0600160b01b90910462ffffff1611155b8015612d875750600754620186a0600160c81b90910462ffffff1611155b612dd35760405162461bcd60e51b815260206004820152600f60248201527f496e76616c69642050656e616c747900000000000000000000000000000000006044820152606401610dc8565b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b03861602178155612e1760018201846003614b9c565b50612e2760028201836003614b9c565b50805460ff16612e3d57805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a85858585604051612e729493929190615190565b60405180910390a15050505050565b6001600160a01b038381165f9081526002602090815260408083209386168352929052205481811015612ef65760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e6365000000000000000000006044820152606401610dc8565b6110768484848403612939565b61deac196001600160a01b03831601612f1a575f80fd5b6007546301000000900460ff16158015612f3c5750600754610100900460ff16155b8015612f6f57506017546001600160a01b03848116911614801590612f6f57506016546001600160a01b03848116911614155b15612f8657612f7d5f613747565b612f865f61447a565b5f81118015612fad57506001600160a01b0383165f9081526003602052604090205460ff16155b8015612fd157506001600160a01b0382165f9081526003602052604090205460ff16155b8015612fe657506001600160a01b0383163014155b8015612ffb57506001600160a01b0382163014155b801561301557506016546001600160a01b03838116911614155b1561354a576017546001600160a01b0384811691161480159061304657506017546001600160a01b03838116911614155b8061308f57506017546001600160a01b038481169116148061307557506017546001600160a01b038381169116145b801561308f5750600854600160381b900463ffffffff1615155b6130db5760405162461bcd60e51b815260206004820152601060248201527f54726164696e672064697361626c6564000000000000000000000000000000006044820152606401610dc8565b600b5415806130ec5750600b548111155b6131385760405162461bcd60e51b815260206004820152600d60248201527f45786365656473206d61785478000000000000000000000000000000000000006044820152606401610dc8565b600c54158061314f57506001600160a01b03821630145b8061317e57506017546001600160a01b038381169116148061317e57506016546001600160a01b038381169116145b806131a45750600c546001600160a01b0383165f90815260016020526040902054820111155b6131f05760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617842616c616e636500000000000000000000000000006044820152606401610dc8565b60075462010000900460ff1615801561321357506007546301000000900460ff16155b80156132275750600754610100900460ff16155b1561354a576017545f9081906001600160a01b038681169116148061325957506017546001600160a01b038581169116145b15613280576017546001600160a01b0386811691161461327a57600261327d565b60015b90505b5f8160ff166001146132925785613294565b845b60085490915063ffffffff428116600160781b83048216600160381b90930482169290920116108015906132e557506001600160a01b0381165f90815260046020526040902054610100900460ff16155b1561330f576001600160a01b0381165f908152600460205260409020805461ff0019166101001790555b5f5b60058160ff161015613531575f808460ff161161339c576001600160a01b0383165f90815260046020526040902054610100900460ff166133825760ff82165f908152600560205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16613464565b60ff82165f90815260056020526040812060020190613362565b8360ff16600114613402576001600160a01b0383165f90815260046020526040902054610100900460ff166133e65760ff82165f9081526005602052604090206001016002613362565b60ff82165f908152600560205260409020600290810190613362565b6001600160a01b0383165f90815260046020526040902054610100900460ff166134425760ff82165f908152600560205260409020600190810190613362565b60ff82165f908152600560205260409020600201546301000000900462ffffff165b62ffffff169050805f036134785750613529565b620186a08682020461348b89308361476e565b60175460ff84165f908152600560205260409020546001600160a01b03918216610100909104909116036134c6576012805482019055613522565b60ff83165f9081526005602052604090205461deac196101009091046001600160a01b0316016134ff576134fa3082613664565b613522565b60ff83165f908152600560205260409020600301805482019055600f8054820190555b9490940193505b600101613311565b50821561354657600d80548401905592829003925b5050505b61169b83838361476e565b600880547fffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffff16600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba919060200161176a565b6007805469ffffff000000000000001916600160381b62ffffff8416908102919091179091556135f1575f613607565b6136076009548262ffffff16620186a091020490565b600c557f00000000000000000000000000000000000000000000000000000000000000016111825760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c99060200161176a565b61366e82826148ab565b60075461368790640100000000900462ffffff166146cd565b60075461369f90600160381b900462ffffff166135c1565b6007805462ffffff60e01b198116600160e01b9182900462ffffff1691820217909155600954620186a0910204600e556008805462ffffff811662ffffff199091168117909155600954620186a0910204601155611ba0565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6007805461ff001981166101001790915560ff1615613fde5780806137e6575060115460026012548161377c5761377c6151cd565b601854601a5492909104916001600160a01b0390811691161461379f575f6137a3565b600f545b01101580156137e65750601254601854601a546001600160a01b039081169116146137ce575f6137d2565b600f545b305f90815260016020526040902054910111155b15613bc8575f6002601254816137fe576137fe6151cd565b60408051600280825260608201835293909204935047925f929160208301908036833701905050905030815f8151811061383a5761383a615118565b6001600160a01b03928316602091820292909201015260185482519116908290600190811061386b5761386b615118565b6001600160a01b039283166020918202929092010152601654601854601a546138ad933093811692889282169116146138a4575f611575565b600f5401612939565b601654601854601a546001600160a01b039283169263791ac94792879282169116146138d9575f6138dd565b600f545b015f8430426001016040518663ffffffff1660e01b81526004016139059594939291906151e1565b5f604051808303815f87803b15801561391c575f80fd5b505af192505050801561392d575060015b61394e576016546139499030906001600160a01b03165f612939565b613bc4565b600880546effffffff000000000000000000000019166b01000000000000000000000063ffffffff421602179055601254156139a057600260125f82825481613999576139996151cd565b0490915550505b601854601a5447849003917f054301190fdd9cbc2629a04d617cd2c664ec09eb96f277e80bfde32405ea3e149186916001600160a01b039182169116146139e7575f6139eb565b600f545b60408051929091018252602082018490520160405180910390a18015613bc257601854601a5482916001600160a01b03908116911603613a9c57613a7f82600f54871015613a5657600f548701620186a0880281613a4b57613a4b6151cd565b04620186a091020490565b600f5487810190620186a00281613a6f57613a6f6151cd565b04620186a003620186a091020490565b600f80546010805490910190555f90556013805482850301905590505b5f85118015613aaa57505f81115b15613bc057601654613ac79030906001600160a01b031687612939565b60165460195460405163f305d71960e01b8152306004820152602481018890525f6044820181905260648201526001600160a01b0391821660848201526001420160a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613b56575060408051601f3d908101601f19168201909252613b5391810190615252565b60015b613b7757601654613b729030906001600160a01b03165f612939565b613bc0565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505f601255505b505b505b5050505b8080613c275750601a546001600160a01b03163014801590613bfb5750601854601a546001600160a01b03908116911614155b8015613c0b5750601154600f5410155b8015613c275750600f54305f9081526001602052604090205410155b15613fde57601a546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613c72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c96919061515e565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f81518110613ccf57613ccf615118565b6001600160a01b039283166020918202929092010152601854825191169082906001908110613d0057613d00615118565b6001600160a01b039283166020918202929092010152601a54825191169082906002908110613d3157613d31615118565b6001600160a01b039283166020918202929092010152601a54601654600f5460405163095ea7b360e01b81529184166004830152602482015291169063095ea7b3906044016020604051808303815f875af1158015613d92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613db69190615175565b50601654600f54604051635c11d79560e01b81526001600160a01b0390921691635c11d79591613df3915f908690309042600101906004016151e1565b5f604051808303815f87803b158015613e0a575f80fd5b505af1925050508015613e1b575060015b613e9a57601a5460165460405163095ea7b360e01b81526001600160a01b0391821660048201525f602482015291169063095ea7b3906044016020604051808303815f875af1158015613e70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e949190615175565b50613fdb565b601a54600f546040516370a0823160e01b81523060048201527f95725684d8aa29bbc5031270724c91e6e8bee7732f11ee91ed9b3d93929e99e5926001600160a01b0316919082906370a0823190602401602060405180830381865afa158015613f06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f2a919061515e565b604080516001600160a01b039094168452602084019290925285039082015260600160405180910390a1600f80546010805490910190555f9055601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fce919061515e565b6014805491840390910190555b50505b506007805461ff0019169055565b5f6001600160a01b038316613fff575f80fd5b6016546001600160a01b03848116911614614242575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614055573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614079919061527d565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140dc919061527d565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af115801561412c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614150919061527d565b90506001600160a01b0381166141d2576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af11580156141ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141cf919061527d565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b0383811691161461427357601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a3506017546001600160a01b031692915050565b6001600160a01b03811615806142eb57506001600160a01b03811630145b8061430357506018546001600160a01b038281169116145b806143f457506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015614350573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614374919061527d565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af11580156143c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143e8919061527d565b6001600160a01b031614155b6144405760405162461bcd60e51b815260206004820152600760248201527f4e6f2050616972000000000000000000000000000000000000000000000000006044820152606401610dc8565b6001600160a01b038116156144555780614457565b305b601a80546001600160a01b0319166001600160a01b039290921691909117905550565b6007805463ff00000019166301000000179055806145b757601a546001600160a01b0316301480156144d35750600f5415806144c55750600f54305f90815260016020526040902054105b806144d35750600e54600f54105b6146bd57601854601a546001600160a01b03908116911614801561450257506013541580614502575047601354105b6146bd57601a546001600160a01b031630148015906145325750601854601a546001600160a01b03908116911614155b80156145b2575060145415806145b25750601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614589573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145ad919061515e565b601454105b6146bd575b5f805b60058160ff1610156146695760ff81165f90815260056020526040902080546003909101546101009091046001600160a01b03169080158061460657506001600160a01b03821661dead145b8061461e57506017546001600160a01b038381169116145b1561462a575050614661565b5f6146358383614976565b905080156146595760ff84165f908152600560205260409020600301805482900390555b939093019250505b6001016145ba565b506008805466ffffffff0000001916630100000063ffffffff4216021790556040805182815290517fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979181900360200190a1505b506007805463ff00000019169055565b6007805466ffffff00000000191664010000000062ffffff8416908102919091179091556146fb575f614711565b6147116009548262ffffff16620186a091020490565b600b557f00000000000000000000000000000000000000000000000000000000000000016111825760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda1959060200161176a565b6001600160a01b0383161580159061478e57506001600160a01b03821615155b6147da5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610dc8565b6001600160a01b0383165f908152600160205260409020548111156148335760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b8015614866576001600160a01b038084165f90815260016020526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161298d91815260200190565b6001600160a01b0382165f908152600160205260409020548111156149045760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b6001600160a01b0382165f818152600160205260409081902080548490039055600980548490039055600a8054840190555161dead91907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061496a9085815260200190565b60405180910390a35050565b601a545f90306001600160a01b03909116036149b35761499730848461476e565b81600f5f8282546149a891906152ac565b90915550614b5b9050565b6010545f906149c4846103e86152bf565b6149cf9060646152bf565b6149d991906152d6565b601854601a549192505f916001600160a01b03918216911603614a985750601354620186a08282020490811115614a14575f92505050610ebb565b5f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114614a62576040519150601f19603f3d011682016040523d82523d5f602084013e614a67565b606091505b5050905080614a7b575f9350505050610ebb565b8160135f828254614a8c91906152ac565b90915550614b42915050565b50601454620186a08282020490841115614ab6575f92505050610ebb565b601a5460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af1158015614b06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b2a9190615175565b508060145f828254614b3c91906152ac565b90915550505b8360105f828254614b5391906152ac565b909155505050505b50919050565b60405180608001604052805f6001600160a01b03168152602001614b83614c30565b8152602001614b90614c30565b81526020015f81525090565b600183019183908215614c24579160200282015f5b83821115614bf357835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302614bb1565b8015614c225782816101000a81549062ffffff0219169055600301602081600201049283019260010302614bf3565b505b50611af3929150614c4e565b60405180606001604052806003906020820280368337509192915050565b5b80821115611af3575f8155600101614c4f565b8015158114611182575f80fd5b5f805f60408486031215614c81575f80fd5b833567ffffffffffffffff80821115614c98575f80fd5b818601915086601f830112614cab575f80fd5b813581811115614cb9575f80fd5b8760208260051b8501011115614ccd575f80fd5b60209283019550935050840135614ce381614c62565b809150509250925092565b5f81518084525f5b81811015614d1257602081850181015186830182015201614cf6565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f611c0e6020830184614cee565b6001600160a01b0381168114611182575f80fd5b5f8060408385031215614d68575f80fd5b8235614d7381614d43565b946020939093013593505050565b5f805f60608486031215614d93575f80fd5b8335614d9e81614d43565b92506020840135614dae81614d43565b929592945050506040919091013590565b803560ff81168114614dcf575f80fd5b919050565b803562ffffff81168114614dcf575f80fd5b5f82601f830112614df5575f80fd5b6040516060810181811067ffffffffffffffff82111715614e2457634e487b7160e01b5f52604160045260245ffd5b604052806060840185811115614e38575f80fd5b845b81811015614e5957614e4b81614dd4565b835260209283019201614e3a565b509195945050505050565b5f805f806101008587031215614e78575f80fd5b614e8185614dbf565b93506020850135614e9181614d43565b9250614ea08660408701614de6565b9150614eaf8660a08701614de6565b905092959194509250565b5f60208284031215614eca575f80fd5b813563ffffffff81168114611c0e575f80fd5b5f60208284031215614eed575f80fd5b611c0e82614dd4565b5f60208284031215614f06575f80fd5b8135611c0e81614c62565b60c081525f614f2360c0830189614cee565b8281036020840152614f358189614cee565b905060ff871660408401526001600160a01b038616606084015284608084015282810360a0840152614f678185614cee565b9998505050505050505050565b5f60208284031215614f84575f80fd5b8135611c0e81614d43565b5f60208284031215614f9f575f80fd5b5035919050565b805f5b600381101561107657815162ffffff16845260209384019390910190600101614fa9565b602080825282518282018190525f919060409081850190868401855b8281101561503f5781516001600160a01b0381511685528681015161501088870182614fa6565b50858101516150226080870182614fa6565b506060015160e08501526101009093019290850190600101614fe9565b5091979650505050505050565b5f806040838503121561505d575f80fd5b823561506881614d43565b9150602083013561507881614d43565b809150509250929050565b5f805f805f805f60e0888a031215615099575f80fd5b87356150a481614d43565b965060208801356150b481614d43565b955060408801359450606088013593506150d060808901614dbf565b925060a0880135915060c0880135905092959891949750929550565b5f80604083850312156150fd575f80fd5b823561510881614d43565b9150602083013561507881614c62565b634e487b7160e01b5f52603260045260245ffd5b600181811c9082168061514057607f821691505b602082108103614b5b57634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561516e575f80fd5b5051919050565b5f60208284031215615185575f80fd5b8151611c0e81614c62565b60ff851681526001600160a01b038416602082015261010081016151b76040830185614fa6565b6151c460a0830184614fa6565b95945050505050565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156152315784516001600160a01b03168352938301939183019160010161520c565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215615264575f80fd5b8351925060208401519150604084015190509250925092565b5f6020828403121561528d575f80fd5b8151611c0e81614d43565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610ebb57610ebb615298565b8082028115828204841417610ebb57610ebb615298565b5f826152f057634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220434678f03537ff0032b8deb3ae7d526cb363b3f599538213ca6f2a5c0fde092364736f6c63430008170033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

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.