ETH Price: $3,416.97 (-1.14%)
Gas: 6 Gwei

Contract

0xD93f7434843Ba73960a5b71C6B12b8D4c8260278
 

Overview

ETH Balance

0.0202 ETH

Eth Value

$69.02 (@ $3,416.97/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Approve200423722024-06-07 20:35:2325 days ago1717792523IN
0xD93f7434...4c8260278
0 ETH0.0006703114.51022579
Approve199511532024-05-26 2:45:2337 days ago1716691523IN
0xD93f7434...4c8260278
0 ETH0.000087083.31010115
Approve199511472024-05-26 2:44:1137 days ago1716691451IN
0xD93f7434...4c8260278
0 ETH0.000154373.3409401
Approve199495312024-05-25 21:19:3537 days ago1716671975IN
0xD93f7434...4c8260278
0 ETH0.00016923.64201183
Approve199174732024-05-21 9:45:1142 days ago1716284711IN
0xD93f7434...4c8260278
0 ETH0.000339117.28975222
Approve198634192024-05-13 20:15:3550 days ago1715631335IN
0xD93f7434...4c8260278
0 ETH0.000422529.14390248
Approve198086312024-05-06 4:22:1157 days ago1714969331IN
0xD93f7434...4c8260278
0 ETH0.000323897.00231522
Approve197337232024-04-25 16:58:2368 days ago1714064303IN
0xD93f7434...4c8260278
0 ETH0.0011115523.92501573
Transfer196921292024-04-19 21:22:2373 days ago1713561743IN
0xD93f7434...4c8260278
0 ETH0.002420949.87898229
Approve196824242024-04-18 12:44:4775 days ago1713444287IN
0xD93f7434...4c8260278
0 ETH0.0006781114.59561219
Approve196638462024-04-15 22:20:5977 days ago1713219659IN
0xD93f7434...4c8260278
0 ETH0.0005274511.420701
Approve196636202024-04-15 21:34:5977 days ago1713216899IN
0xD93f7434...4c8260278
0 ETH0.0006252913.54270231
Transfer196592632024-04-15 6:55:1178 days ago1713164111IN
0xD93f7434...4c8260278
0 ETH0.0011390212.16202995
Transfer196568882024-04-14 22:56:2378 days ago1713135383IN
0xD93f7434...4c8260278
0 ETH0.000913059.74923036
Transfer196548142024-04-14 15:58:1179 days ago1713110291IN
0xD93f7434...4c8260278
0 ETH0.0011151311.90694629
Transfer196546952024-04-14 15:33:4779 days ago1713108827IN
0xD93f7434...4c8260278
0 ETH0.00108111.54251216
Transfer196534202024-04-14 11:17:2379 days ago1713093443IN
0xD93f7434...4c8260278
0 ETH0.0009531610.17747145
Transfer196533082024-04-14 10:54:5979 days ago1713092099IN
0xD93f7434...4c8260278
0 ETH0.0009800710.46486995
Transfer196531622024-04-14 10:25:3579 days ago1713090335IN
0xD93f7434...4c8260278
0 ETH0.0009909210.58068137
Transfer196520942024-04-14 6:50:2379 days ago1713077423IN
0xD93f7434...4c8260278
0 ETH0.001114811.90342109
Transfer196505552024-04-14 1:38:3579 days ago1713058715IN
0xD93f7434...4c8260278
0 ETH0.0012945713.82290403
Transfer196499072024-04-13 23:27:4779 days ago1713050867IN
0xD93f7434...4c8260278
0 ETH0.0032981948.99131418
Transfer196498812024-04-13 23:22:3579 days ago1713050555IN
0xD93f7434...4c8260278
0 ETH0.0032774248.68285527
Approve196498792024-04-13 23:22:1179 days ago1713050531IN
0xD93f7434...4c8260278
0 ETH0.0025120854
Transfer196485832024-04-13 18:58:2380 days ago1713034703IN
0xD93f7434...4c8260278
0 ETH0.0014701721.83802127
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
200423862024-06-07 20:38:1125 days ago1717792691
0xD93f7434...4c8260278
0.00532338 ETH
200423862024-06-07 20:38:1125 days ago1717792691
0xD93f7434...4c8260278
0.00532338 ETH
199511862024-05-26 2:51:5937 days ago1716691919
0xD93f7434...4c8260278
0.0035522 ETH
199511862024-05-26 2:51:5937 days ago1716691919
0xD93f7434...4c8260278
0.0035522 ETH
199495992024-05-25 21:33:2337 days ago1716672803
0xD93f7434...4c8260278
0.00464405 ETH
199495992024-05-25 21:33:2337 days ago1716672803
0xD93f7434...4c8260278
0.00464405 ETH
199174812024-05-21 9:46:4742 days ago1716284807
0xD93f7434...4c8260278
0.00643131 ETH
199174812024-05-21 9:46:4742 days ago1716284807
0xD93f7434...4c8260278
0.00643131 ETH
196921292024-04-19 21:22:2373 days ago1713561743
0xD93f7434...4c8260278
0.00329004 ETH
196921292024-04-19 21:22:2373 days ago1713561743
0xD93f7434...4c8260278
0.00329004 ETH
196640282024-04-15 22:57:2377 days ago1713221843
0xD93f7434...4c8260278
0.01013795 ETH
196640282024-04-15 22:57:2377 days ago1713221843
0xD93f7434...4c8260278
0.01013795 ETH
196507912024-04-14 2:26:2379 days ago1713061583
0xD93f7434...4c8260278
0.00675909 ETH
196507912024-04-14 2:26:2379 days ago1713061583
0xD93f7434...4c8260278
0.00675909 ETH
196478662024-04-13 16:33:1180 days ago1713025991
0xD93f7434...4c8260278
0.00694942 ETH
196478662024-04-13 16:33:1180 days ago1713025991
0xD93f7434...4c8260278
0.00694942 ETH
196430162024-04-13 0:12:4780 days ago1712967167
0xD93f7434...4c8260278
0.00652754 ETH
196430162024-04-13 0:12:4780 days ago1712967167
0xD93f7434...4c8260278
0.00652754 ETH
196356132024-04-11 23:20:3581 days ago1712877635
0xD93f7434...4c8260278
0.00876909 ETH
196356132024-04-11 23:20:3581 days ago1712877635
0xD93f7434...4c8260278
0.00876909 ETH
196304012024-04-11 5:48:5982 days ago1712814539
0xD93f7434...4c8260278
0.00772684 ETH
196304012024-04-11 5:48:5982 days ago1712814539
0xD93f7434...4c8260278
0.00772684 ETH
196284372024-04-10 23:13:1182 days ago1712790791
0xD93f7434...4c8260278
0.01819203 ETH
196284372024-04-10 23:13:1182 days ago1712790791
0xD93f7434...4c8260278
0.01819203 ETH
196083962024-04-08 3:52:5985 days ago1712548379
0xD93f7434...4c8260278
0.02245553 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ChainFactory_ERC20

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

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

pragma solidity 0.8.24;

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

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

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

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

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

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

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

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

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

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

            if (percent == 0) { continue; }

            uint256 taxAmount = _percentage(amount, percent);

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

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

            appliedTax += taxAmount;
          }

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

            amount -= appliedTax;
          }
        }
      }
    }

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

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

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

    _balance[account] = amount;

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

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

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

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

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

  Smart-Contract generated by ChainFactory.app

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

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

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

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

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

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

*/

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

pragma solidity 0.8.24;

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

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

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

  address[] internal _holders;

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

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

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

  struct holderAccount {
    bool exists;
    bool penalty;
  }

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

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

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

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

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

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

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

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

import "./CF_Common.sol";

pragma solidity 0.8.24;

abstract contract CF_Ownable is CF_Common {
  address internal _owner;

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

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

    _;
  }

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

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

    _transferOwnership(address(0));
  }

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

    _transferOwnership(newOwner);
  }

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

    emit OwnershipTransferred(oldOwner, newOwner);
  }
}

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

pragma solidity 0.8.24;

import "./CF_Common.sol";

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

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

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

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

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

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

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

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

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

    return true;
  }

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

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

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

    _approve(owner, spender, value);
  }

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

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

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

    return true;
  }

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

    return true;
  }

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

    return true;
  }

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

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

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

    return true;
  }

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

    emit Approval(owner, spender, amount);
  }

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

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

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

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

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

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

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

pragma solidity 0.8.24;

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

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

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

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

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

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

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

    require(success);
  }
}

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

pragma solidity 0.8.24;

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

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

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

    emit RenouncedWhitelist();
  }

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

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

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


    _whitelisted[account] = status;

    emit Whitelisted(account, status);
  }

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

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

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

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

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

pragma solidity 0.8.24;

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

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

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

    emit RenouncedMaxTx();
  }

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

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

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

    _setMaxTxPercent(percent);

    emit SetMaxTxPercent(percent);
  }

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

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

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

pragma solidity 0.8.24;

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

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

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

    emit RenouncedMaxBalance();
  }

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

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

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

    _setMaxBalancePercent(percent);

    emit SetMaxBalancePercent(percent);
  }

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

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

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

pragma solidity 0.8.24;

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

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

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

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

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

    emit RenouncedTaxable();
  }

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

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

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

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

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

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

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

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

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

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

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

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

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

    taxBeneficiary storage _taxBeneficiary = _taxBeneficiary[slot];

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

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

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

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

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

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

    _autoTaxDistribute();
  }

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

    unchecked {
      uint256 distributedTaxes;

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

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

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

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

      _lastTaxDistribution = _timestamp();

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

      emit TaxDistributed(distributedTaxes);
    }
  }

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

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

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

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

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

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

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

          if (!success) { return 0; }

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

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

        _amountSwappedForTaxDistribution -= unclaimed;
      }
    }

    return unclaimed;
  }

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

    _suspendTaxes = status;
  }

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

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

    _holder[account].penalty = false;
  }

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

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

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

    _setEarlyPenaltyTime(time);
  }

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

    emit SetEarlyPenaltyTime(time);
  }
}

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

pragma solidity 0.8.24;

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

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

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

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

    emit RenouncedDEXRouterV2();
  }

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

    return _setDEXRouterV2(router, receiver);
  }

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

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

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

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

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

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

    return _dex.pair;
  }

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

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

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

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

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

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

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

    _setAutoSwapPercent(min, max);
  }

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

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

    _autoSwapEnabled = status;
  }

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

    _autoSwap(false);
  }

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

    _autoSwap(force);
  }

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

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

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

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

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

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

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

          emit SwappedTokensForNative(amountToSwap, ethAmount);

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

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

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

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

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

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

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

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

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

    _lastSwap = _timestamp();
  }

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

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

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

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

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

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

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

    _setTaxToken(token);
  }

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

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

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

    _tradingEnabled = _timestamp();
  }
}

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

pragma solidity 0.8.24;

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

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

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

pragma solidity 0.8.24;

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

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

Contract Security Audit

Contract ABI

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

60c060405234801562000010575f80fd5b5060408051808201909152600781526657495a4152445360c81b6020820152601b906200003e9082620010a0565b50604080518082019091526005815264545241444560d81b6020820152601c906200006a9082620010a0565b50601260a0526a52b7d2dcc80cd2e4000000600855620000985f8051602062005b8c8339815191526200037e565b620000b55f8051602062005b8c83398151915262015f90620003cf565b620000d7732982d24902aae3c547bf6200c07d4600083145b2611388620003cf565b620000f973b22774ab544b5dda8b31da759dafeeb1d2aba38a6107d0620003cf565b6200011b73599b83a43204b9fc01d7a8fdf6c83336066ceaf96105dc620003cf565b6200013d732a4a860898eb16ea3b0c3cfd9dbe532beca0b0d96105dc620003cf565b6200016b737a250d5630b4cf539739df2c5dacb4c659f2488d5f8051602062005b8c8339815191526200044c565b50620001796102586200073d565b6200019873c02aaa39b223fe8d0a0e5c4f27ead9083c756cc262000798565b620001a7603261012c6200094d565b6006805460ff1916600117905560408051606080820183526103e882526113566020808401829052838501919091528351918201845261c350808352908201819052928101929092526200020d915f915f8051602062005b8c83398151915291620009af565b6040805160c0810182525f8051602062005b8c8339815191528152732982d24902aae3c547bf6200c07d4600083145b2602082015273b22774ab544b5dda8b31da759dafeeb1d2aba38a9181019190915273599b83a43204b9fc01d7a8fdf6c83336066ceaf96060820152732a4a860898eb16ea3b0c3cfd9dbe532beca0b0d96080820152731158ef1d256835993f5a14c44ea1ecfda9861e7960a0820152620002b79062000d6b565b620002c46107d062000db7565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f601b604051620002f691906200116c565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f198184030181529190528051602090910120601d55600160805262001299565b601a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60805115620003dc575f80fd5b5f620003f66008548362ffffff1662000e3c60201b60201c565b6001600160a01b0384165f8181526020818152604080832085905551848152939450919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b5f6001600160a01b03831662000460575f80fd5b6016546001600160a01b03848116911614620006b1575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004b8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004de9190620011e6565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200051e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005449190620011e6565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af115801562000595573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005bb9190620011e6565b90506001600160a01b03811662000641576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af115801562000618573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200063e9190620011e6565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b03838116911614620006e357601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fd0cdc441c8110da5df2f4a64e1cee8a6794d8016c982757bb5d8971cde6b6bf39060200160405180910390a3506017546001600160a01b031692915050565b6007805463ffffffff60781b1916600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020015b60405180910390a150565b608051158015620007b057506001600160a01b038116155b80620007c457506001600160a01b03811630145b80620007dd57506018546001600160a01b038281169116145b80620008d557506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa1580156200082c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620008529190620011e6565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015620008a3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620008c99190620011e6565b6001600160a01b031614155b620009115760405162461bcd60e51b81526020600482015260076024820152662737902830b4b960c91b60448201526064015b60405180910390fd5b6001600160a01b038116156200092857806200092a565b305b601580546001600160a01b0319166001600160a01b039290921691909117905550565b6006805462ffffff60e01b1916600160e01b62ffffff858116918202929092179092556007805462ffffff19169184169190911790556008546200099591620186a091020490565b600b55600854620186a062ffffff929092160204600c5550565b60058460ff1610620009bf575f80fd5b6001600160a01b0383163014801590620009e457506001600160a01b03831661dead14155b8015620009f957506001600160a01b03831615155b62000a02575f80fd5b60ff84165f908152600460209081526040918290206001810180548651600680546a010000000000000000000080820462ffffff908116958116909403949094018316840262ffffff60501b198216811780845586548c8a0151600160681b928390048716630100000092839004881690910301861690910265ffffffffffff60501b1990931662ffffff60681b19909216919091179190911780835594548a890151600160801b808804861666010000000000009384900487169092039190910185160262ffffff60801b19871681178085556002890180548d51600160981b938490048916918916900301871690910265ffffffffffff60801b1990981662ffffff60981b1990921691909117969096178084558654988b0151600160b01b808304871694909a048616900392909201841690970262ffffff60b01b19821681178084559554988a015165ffffffffffff60b01b1990921662ffffff60c81b1990911617969097048216909603600160c81b938490048216018116909202939093179384905590926161a8929004161180159062000c0057506006546161a8600160681b90910462ffffff161180159062000bd057506006546161a8600160801b90910462ffffff1611155b801562000c0057506006546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b62000c395760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b604482015260640162000908565b600654620186a0600160981b90910462ffffff161180159062000c6e5750600654620186a0600160b01b90910462ffffff1611155b801562000c8d5750600654620186a0600160c81b90910462ffffff1611155b62000ccd5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642050656e616c747960881b604482015260640162000908565b8054610100600160a81b0319166101006001600160a01b0386160217815562000cfc6001820184600362000f4d565b5062000d0e6002820183600362000f4d565b50805460ff1662000d2557805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405162000d5c949392919062001258565b60405180910390a15050505050565b6080511562000d78575f80fd5b5f5b600681101562000db35762000daa82826006811062000d9d5762000d9d62001215565b6020020151600162000e46565b60010162000d7a565b5050565b6006805462ffffff60201b191664010000000062ffffff84169081029190911790915562000de6575f62000df8565b600854620186a062ffffff8316909102045b60095560805162000e395760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda195906020016200078d565b50565b620186a091020490565b60145460ff161562000e56575f80fd5b6001600160a01b03821662000e69575f80fd5b6016546001600160a01b0383811691161480159062000e9657506017546001600160a01b03838116911614155b62000eef5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b606482015260840162000908565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b60018301918390821562000fda579160200282015f5b8382111562000fa757835183826101000a81548162ffffff021916908362ffffff160217905550926020019260030160208160020104928301926001030262000f63565b801562000fd85782816101000a81549062ffffff021916905560030160208160020104928301926001030262000fa7565b505b5062000fe892915062000fec565b5090565b5b8082111562000fe8575f815560010162000fed565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200102b57607f821691505b6020821081036200104a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200109b57805f5260205f20601f840160051c81016020851015620010775750805b601f840160051c820191505b8181101562001098575f815560010162001083565b50505b505050565b81516001600160401b03811115620010bc57620010bc62001002565b620010d481620010cd845462001016565b8462001050565b602080601f8311600181146200110a575f8415620010f25750858301515b5f19600386901b1c1916600185901b17855562001164565b5f85815260208120601f198616915b828110156200113a5788860151825594840194600190910190840162001119565b50858210156200115857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8083546200117b8162001016565b60018281168015620011965760018114620011ac57620011da565b60ff1984168752821515830287019450620011da565b875f526020805f205f5b85811015620011d15781548a820152908401908201620011b6565b50505082870194505b50929695505050505050565b5f60208284031215620011f7575f80fd5b81516001600160a01b03811681146200120e575f80fd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b805f5b60038110156200125257815162ffffff168452602093840193909101906001016200122c565b50505050565b60ff851681526001600160a01b0384166020820152610100810162001281604083018562001229565b6200129060a083018462001229565b95945050505050565b60805160a0516148bc620012d05f395f8181610526015261101d01525f8181612e1f01528181612eda0152613a9801526148bc5ff3fe6080604052600436106103a1575f3560e01c806377004851116101e4578063be5e49b21161010b578063da88d01a116100a4578063f2fde38b11610076578063f2fde38b14610b4e578063f3dc4f4814610b6d578063f59c370814610ba9578063f7c3b38f14610bc8578063f7de0e5714610be857005b8063da88d01a14610add578063dd62ed3e14610afc578063e92871f614610b1b578063f2cda82e14610b2f57005b8063cc1776d3116100dd578063cc1776d314610a33578063d232c22014610a47578063d505accf14610aaa578063d8454a8214610ac957005b8063be5e49b2146109cf578063c2921583146109ee578063c77e006d14610a0b578063c78fe0d414610a1f57005b806395d89b411161017d578063a4d8971a1161014f578063a4d8971a14610955578063a5596b4f14610974578063a9059cbb14610993578063b81a0145146109b257005b806395d89b41146108fa57806396ce07951461090e5780639c5ef8d714610922578063a457c2d71461093657005b80638bf1acff116101b65780638bf1acff1461088b5780638d8350ca1461089f5780638da5cb5b146108be57806395101f90146108db57005b8063770048511461081b5780637ecebe001461082f5780638324c3b9146108635780638a8c523c1461087757005b806339509351116102c85780635a0d4f88116102615780636f05be97116102335780636f05be971461079257806370a08231146107b3578063715018a6146107e757806375de1496146107fb57005b80635a0d4f88146106f25780635b90fe66146107235780635f6417581461075457806368a5d4141461077357005b8063487d1ce51161029a578063487d1ce5146106675780634b7d9db4146106865780634f7041a51461069d57806354fd4d50146106c557005b806339509351146105d35780633af32abf146105f25780633ed8a1691461062957806344b691ff1461064857005b806323b872dd1161033a57806332acf3de1161030c57806332acf3de146105505780633644e51514610585578063370158ea1461059957806339137f8b146105bf57005b806323b872dd146104b65780632623e975146104d55780632984207a146104f4578063313ce5671461051357005b8063095ea7b311610373578063095ea7b31461043b5780631171bda91461045a57806318160ddd14610479578063186488a81461049757005b806301b38af5146103aa578063064a59d0146103c957806306fdde03146103fd57806307e9652c1461041e57005b366103a857005b005b3480156103b5575f80fd5b506103a86103c43660046141d4565b610c05565b3480156103d4575f80fd5b50600754600160381b900463ffffffff1615155b60405190151581526020015b60405180910390f35b348015610408575f80fd5b50610411610c82565b6040516103f49190614296565b348015610429575f80fd5b5060065462010000900460ff166103e8565b348015610446575f80fd5b506103e86104553660046142bc565b610d12565b348015610465575f80fd5b506103a86104743660046142e6565b610d28565b348015610484575f80fd5b506008545b6040519081526020016103f4565b3480156104a2575f80fd5b506103a86104b13660046143c9565b610ea3565b3480156104c1575f80fd5b506103e86104d03660046142e6565b610eef565b3480156104e0575f80fd5b506103a86104ef36600461441f565b610f10565b3480156104ff575f80fd5b506103a861050e36600461443a565b610faf565b34801561051e575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016103f4565b34801561055b575f80fd5b5060065460075460408051600160e01b90930462ffffff90811684529091166020830152016103f4565b348015610590575f80fd5b50601d54610489565b3480156105a4575f80fd5b506105ad61100f565b6040516103f49695949392919061445d565b3480156105ca575f80fd5b506103a861119a565b3480156105de575f80fd5b506103e86105ed3660046142bc565b6111fb565b3480156105fd575f80fd5b506103e861060c3660046144c1565b6001600160a01b03165f9081526002602052604090205460ff1690565b348015610634575f80fd5b506103a86106433660046144dc565b611212565b348015610653575f80fd5b506103a86106623660046144f5565b6112c9565b348015610672575f80fd5b506103a86106813660046144c1565b6113cb565b348015610691575f80fd5b5060065460ff166103e8565b3480156106a8575f80fd5b506106b1611472565b60405162ffffff90911681526020016103f4565b3480156106d0575f80fd5b50604080518082019091526005815264312e302e3160d81b6020820152610411565b3480156106fd575f80fd5b506015546001600160a01b03165b6040516001600160a01b0390911681526020016103f4565b34801561072e575f80fd5b50600754600160781b900463ffffffff1660405163ffffffff90911681526020016103f4565b34801561075f575f80fd5b506106b161076e3660046144c1565b611481565b34801561077e575f80fd5b5061070b61078d366004614526565b61157c565b34801561079d575f80fd5b506107a66115cf565b6040516103f49190614584565b3480156107be575f80fd5b506104896107cd3660046144c1565b6001600160a01b03165f9081526020819052604090205490565b3480156107f2575f80fd5b506103a8611760565b348015610806575f80fd5b50600654600160381b900462ffffff166106b1565b348015610826575f80fd5b506103a86117aa565b34801561083a575f80fd5b506104896108493660046144c1565b6001600160a01b03165f908152601e602052604090205490565b34801561086e575f80fd5b506103a86117eb565b348015610882575f80fd5b506103a8611852565b348015610896575f80fd5b506106b1611905565b3480156108aa575f80fd5b506106b16108b93660046144c1565b61190b565b3480156108c9575f80fd5b50601a546001600160a01b031661070b565b3480156108e6575f80fd5b506106b16108f53660046144c1565b6119ce565b348015610905575f80fd5b50610411611aaa565b348015610919575f80fd5b506103e86106b1565b34801561092d575f80fd5b506103a8611ab9565b348015610941575f80fd5b506103e86109503660046142bc565b611b2e565b348015610960575f80fd5b506103a861096f36600461441f565b611b8e565b34801561097f575f80fd5b506103a861098e36600461441f565b611c1a565b34801561099e575f80fd5b506103e86109ad3660046142bc565b611c76565b3480156109bd575f80fd5b506019546001600160a01b031661070b565b3480156109da575f80fd5b506103a86109e93660046144c1565b611c82565b3480156109f9575f80fd5b506017546001600160a01b031661070b565b348015610a16575f80fd5b506103a8611ce3565b348015610a2a575f80fd5b506103a8611d48565b348015610a3e575f80fd5b506106b1611db0565b348015610a52575f80fd5b506014546040805160ff8084161515825261010084048116151560208301526201000084048116151592820192909252600160201b83048216151560608201526301000000909204161515608082015260a0016103f4565b348015610ab5575f80fd5b506103a8610ac4366004614603565b611dba565b348015610ad4575f80fd5b50600e54610489565b348015610ae8575f80fd5b506103a8610af73660046144dc565b611fa2565b348015610b07575f80fd5b50610489610b16366004614526565b612051565b348015610b26575f80fd5b506103a861207b565b348015610b3a575f80fd5b506103a8610b493660046142bc565b6120de565b348015610b59575f80fd5b506103a8610b683660046144c1565b6121c3565b348015610b78575f80fd5b506103e8610b873660046144c1565b6001600160a01b03165f90815260036020526040902054610100900460ff1690565b348015610bb4575f80fd5b506103a8610bc336600461466c565b612208565b348015610bd3575f80fd5b50600654600160201b900462ffffff166106b1565b348015610bf3575f80fd5b506016546001600160a01b031661070b565b601a546001600160a01b03163314610c385760405162461bcd60e51b8152600401610c2f90614698565b60405180910390fd5b815f5b81811015610c7b57610c73858583818110610c5857610c586146be565b9050602002016020810190610c6d91906144c1565b84612238565b600101610c3b565b5050505050565b6060601b8054610c91906146d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbd906146d2565b8015610d085780601f10610cdf57610100808354040283529160200191610d08565b820191905f5260205f20905b815481529060010190602001808311610ceb57829003601f168201915b5050505050905090565b5f610d1e33848461233a565b5060015b92915050565b601a546001600160a01b03163314610d525760405162461bcd60e51b8152600401610c2f90614698565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610d96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dba9190614704565b90505f6001600160a01b0385163014610df0576015546001600160a01b03868116911614610de8575f610df8565b601354610df8565b600d54601054015b90508282821015610e095781610e0b565b825b83031015610e2b5760405162461bcd60e51b8152600401610c2f9061471b565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610e79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9d9190614744565b50505050565b601a546001600160a01b03163314610ecd5760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615610ee3575f80fd5b610e9d8484848461239b565b5f610efb84338461273c565b610f0684848461279f565b5060019392505050565b601a546001600160a01b03163314610f3a5760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff1615610f50575f80fd5b801580610f6757506016546001600160a01b031615155b610f9c5760405162461bcd60e51b815260206004820152600660248201526509cde40888ab60d31b6044820152606401610c2f565b6006805460ff1916911515919091179055565b601a546001600160a01b03163314610fd95760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615610fef575f80fd5b6102588163ffffffff161115611003575f80fd5b61100c81612d80565b50565b6060805f805f6060601b601c7f0000000000000000000000000000000000000000000000000000000000000000601a5f9054906101000a90046001600160a01b031660085460405180604001604052806005815260200164312e302e3160d81b81525085805461107e906146d2565b80601f01602080910402602001604051908101604052809291908181526020018280546110aa906146d2565b80156110f55780601f106110cc576101008083540402835291602001916110f5565b820191905f5260205f20905b8154815290600101906020018083116110d857829003601f168201915b50505050509550848054611108906146d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611134906146d2565b801561117f5780601f106111565761010080835404028352916020019161117f565b820191905f5260205f20905b81548152906001019060200180831161116257829003601f168201915b50505050509450955095509550955095509550909192939495565b601a546001600160a01b031633146111c45760405162461bcd60e51b8152600401610c2f90614698565b6014805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b5f610d1e33848461120c3388612051565b0161233a565b601a546001600160a01b0316331461123c5760405162461bcd60e51b8152600401610c2f90614698565b60145462010000900460ff1615611251575f80fd5b62ffffff8116158061127c575060648162ffffff161015801561127c5750620186a062ffffff821611155b611284575f80fd5b61128d81612dd4565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b601a546001600160a01b031633146112f35760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff1615611309575f80fd5b60018262ffffff161015801561132657506103e88262ffffff1611155b6113615760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c2f565b8162ffffff168162ffffff161015801561138257506103e88162ffffff1611155b6113bd5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c2f565b6113c78282612e77565b5050565b601a546001600160a01b031633146113f55760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff161561140b575f80fd5b6015546001600160a01b0382811691161480159061142a57505f601154115b156114695760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b6044820152606401610c2f565b61100c81612ed8565b5f61147c336119ce565b905090565b6006545f9062010000900460ff161561149b57505f919050565b6001600160a01b0382163014806114c957506001600160a01b0382165f9081526002602052604090205460ff165b806114e157506017546001600160a01b038381169116145b806114f957506016546001600160a01b038381169116145b611575576001600160a01b0382165f90815260036020526040902054610100900460ff1680611549575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b61156157600654600160801b900462ffffff16610d22565b600654600160c81b900462ffffff16610d22565b5f92915050565b601a545f906001600160a01b031633146115a85760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff16156115be575f80fd5b6115c88383613099565b9392505050565b60408051600580825260c08201909252606091816020015b6115ef6140c6565b8152602001906001900390816115e75790505090505f5b60058160ff16101561175c576040805160808101825260ff83165f81815260046020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611663579050505050918352505060ff83165f9081526004602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff16815260200190600301906020826002010492830192600103820291508084116116d75750505092845250505060ff83165f8181526004602090815260409091206003015492019190915283518491908110611749576117496146be565b6020908102919091010152600101611606565b5090565b601a546001600160a01b0316331461178a5760405162461bcd60e51b8152600401610c2f90614698565b6014805464ffffffffff19166401010101011790556117a85f61337a565b565b60065460ff1680156117c45750600654610100900460ff16155b80156117da57506006546301000000900460ff16155b6117e2575f80fd5b6117a85f6133cb565b601a546001600160a01b031633146118155760405162461bcd60e51b8152600401610c2f90614698565b6014805463ff000000191663010000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b601a546001600160a01b0316331461187c5760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff1615611892575f80fd5b600754600160381b900463ffffffff16156118e15760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610c2f565b600780546affffffff0000000000000019164263ffffffff16600160381b02179055565b5f61147c335b5f6001600160a01b03821630148061193a57506001600160a01b0382165f9081526002602052604090205460ff165b8061195257506017546001600160a01b038381169116145b611575576001600160a01b0382165f90815260036020526040902054610100900460ff16806119a2575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b6119ba57600654600160501b900462ffffff16610d22565b600654600160981b900462ffffff16610d22565b6006545f9062010000900460ff16156119e857505f919050565b6001600160a01b038216301480611a1657506001600160a01b0382165f9081526002602052604090205460ff165b80611a2e57506017546001600160a01b038381169116145b611575576001600160a01b0382165f90815260036020526040902054610100900460ff1680611a7e575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611a9657600654600160681b900462ffffff16610d22565b600654600160b01b900462ffffff16610d22565b6060601c8054610c91906146d2565b601a546001600160a01b0316331480611ae05750335f9081526002602052604090205460ff165b611afc5760405162461bcd60e51b8152600401610c2f90614698565b600654610100900460ff16158015611b1e57506006546301000000900460ff16155b611b26575f80fd5b6117a86138d7565b5f80611b3a3385612051565b905082811015611b815760405162461bcd60e51b81526020600482015260126024820152714e6567617469766520616c6c6f77616e636560701b6044820152606401610c2f565b610f06338585840361233a565b601a546001600160a01b0316331480611bb55750335f9081526002602052604090205460ff165b611bd15760405162461bcd60e51b8152600401610c2f90614698565b8080611bdf575060065460ff165b8015611bf35750600654610100900460ff16155b8015611c0957506006546301000000900460ff16155b611c11575f80fd5b61100c816133cb565b601a546001600160a01b03163314611c445760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615611c5a575f80fd5b60068054911515620100000262ff000019909216919091179055565b5f610d1e33848461279f565b601a546001600160a01b03163314611cac5760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615611cc2575f80fd5b6001600160a01b03165f908152600360205260409020805461ff0019169055565b601a546001600160a01b03163314611d0d5760405162461bcd60e51b8152600401610c2f90614698565b6014805462ff00001916620100001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b601a546001600160a01b03163314611d725760405162461bcd60e51b8152600401610c2f90614698565b6014805464ff000000001916600160201b1790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f61147c33611481565b42841015611dfe5760405162461bcd60e51b815260206004820152601160248201527045787069726564207369676e617475726560781b6044820152606401610c2f565b601d546001600160a01b038881165f818152601e602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa158015611f16573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590611f4c5750886001600160a01b0316816001600160a01b0316145b611f8c5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610c2f565b5050611f9987878761233a565b50505050505050565b601a546001600160a01b03163314611fcc5760405162461bcd60e51b8152600401610c2f90614698565b601454610100900460ff1615611fe0575f80fd5b62ffffff8116158061200b575060648162ffffff161015801561200b5750620186a062ffffff821611155b612013575f80fd5b61201c81613a50565b60405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda195906020016112be565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b601a546001600160a01b031633146120a55760405162461bcd60e51b8152600401610c2f90614698565b6014805461ff0019166101001790556040517fcc2f10fb1214ece03bcb178c4d75943daee74aff93182bfb58ba9b8ef5d8c5aa905f90a1565b601a546001600160a01b031633146121085760405162461bcd60e51b8152600401610c2f90614698565b60185460155447915f916001600160a01b0390811691161461212a575f61212e565b6012545b9050828282101561213f5781612141565b825b830310156121615760405162461bcd60e51b8152600401610c2f9061471b565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146121ac576040519150601f19603f3d011682016040523d82523d5f602084013e6121b1565b606091505b50509050806121be575f80fd5b505050565b601a546001600160a01b031633146121ed5760405162461bcd60e51b8152600401610c2f90614698565b6001600160a01b0381166121ff575f80fd5b61100c8161337a565b601a546001600160a01b031633146122325760405162461bcd60e51b8152600401610c2f90614698565b6113c782825b60145460ff1615612247575f80fd5b6001600160a01b038216612259575f80fd5b6016546001600160a01b0383811691161480159061228557506017546001600160a01b03838116911614155b6122dc5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610c2f565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff16106123aa575f80fd5b6001600160a01b03831630148015906123ce57506001600160a01b03831661dead14155b80156123e257506001600160a01b03831615155b6123ea575f80fd5b60ff84165f90815260046020908152604091829020600181018054865160068054600160501b80820462ffffff908116958116909403949094018316840262ffffff60501b198216811780845586548c8a0151600160681b928390048716630100000092839004881690910301861690910265ffffffffffff60501b1990931662ffffff60681b19909216919091179190911780835594548a890151600160801b808804861666010000000000009384900487169092039190910185160262ffffff60801b19871681178085556002890180548d51600160981b938490048916918916900301871690910265ffffffffffff60801b1990981662ffffff60981b1990921691909117969096178084558654988b0151600160b01b808304871694909a048616900392909201841690970262ffffff60b01b19821681178084559554988a015165ffffffffffff60b01b1990921662ffffff60c81b1990911617969097048216909603600160c81b938490048216018116909202939093179384905590926161a892900416118015906125de57506006546161a8600160681b90910462ffffff16118015906125af57506006546161a8600160801b90910462ffffff1611155b80156125de57506006546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b6126155760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b6044820152606401610c2f565b600654620186a0600160981b90910462ffffff16118015906126495750600654620186a0600160b01b90910462ffffff1611155b80156126675750600654620186a0600160c81b90910462ffffff1611155b6126a55760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642050656e616c747960881b6044820152606401610c2f565b8054610100600160a81b0319166101006001600160a01b038616021781556126d260018201846003614101565b506126e260028201836003614101565b50805460ff166126f857805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405161272d949392919061475f565b60405180910390a15050505050565b5f6127478484612051565b9050818110156127925760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610c2f565b610e9d848484840361233a565b6006546301000000900460ff161580156127c15750600654610100900460ff16155b80156127f457506017546001600160a01b038481169116148015906127f457506016546001600160a01b03848116911614155b1561280a576128025f6133cb565b61280a6138d7565b5f8111801561283157506001600160a01b0383165f9081526002602052604090205460ff16155b801561285557506001600160a01b0382165f9081526002602052604090205460ff16155b801561286a57506001600160a01b0383163014155b801561287f57506001600160a01b0382163014155b801561289957506016546001600160a01b03838116911614155b15612d75576017546001600160a01b038481169116148015906128ca57506017546001600160a01b03838116911614155b8061291357506017546001600160a01b03848116911614806128f957506017546001600160a01b038381169116145b80156129135750600754600160381b900463ffffffff1615155b6129525760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610c2f565b600954158061296357506009548111155b61299f5760405162461bcd60e51b815260206004820152600d60248201526c08af0c6cacac8e640dac2f0a8f609b1b6044820152606401610c2f565b600a5415806129b657506001600160a01b03821630145b806129e557506017546001600160a01b03838116911614806129e557506016546001600160a01b038381169116145b80612a0b5750600a546001600160a01b0383165f90815260208190526040902054820111155b612a4c5760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617842616c616e636560701b6044820152606401610c2f565b60065462010000900460ff16158015612a6f57506006546301000000900460ff16155b8015612a835750600654610100900460ff16155b15612d75576017545f9081906001600160a01b0386811691161480612ab557506017546001600160a01b038581169116145b15612adc576017546001600160a01b03868116911614612ad6576002612ad9565b60015b90505b5f8160ff16600114612aee5785612af0565b845b60075490915063ffffffff428116600160781b83048216600160381b9093048216929092011610801590612b4157506001600160a01b0381165f90815260036020526040902054610100900460ff16155b15612b6b576001600160a01b0381165f908152600360205260409020805461ff0019166101001790555b5f5b60058160ff161015612d5c575f808460ff1611612bf8576001600160a01b0383165f90815260036020526040902054610100900460ff16612bde5760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16612cc0565b60ff82165f90815260046020526040812060020190612bbe565b8360ff16600114612c5e576001600160a01b0383165f90815260036020526040902054610100900460ff16612c425760ff82165f9081526004602052604090206001016002612bbe565b60ff82165f908152600460205260409020600290810190612bbe565b6001600160a01b0383165f90815260036020526040902054610100900460ff16612c9e5760ff82165f908152600460205260409020600190810190612bbe565b60ff82165f908152600460205260409020600201546301000000900462ffffff165b62ffffff169050805f03612cd45750612d54565b620186a086820204612ce7893083613af0565b60175460ff84165f908152600460205260409020546001600160a01b0391821661010090910490911603612d2257600d805482019055612d4d565b60ff83165f9081526004602052604090206003018054820190556010805482019055600f8054820190555b9490940193505b600101612b6d565b508215612d7157600e80548401905592829003925b5050505b6121be838383613af0565b6007805463ffffffff60781b1916600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020016112be565b6006805469ffffff000000000000001916600160381b62ffffff841690810291909117909155612e04575f612e1a565b612e1a6008548262ffffff16620186a091020490565b600a557f000000000000000000000000000000000000000000000000000000000000000061100c5760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020016112be565b6006805462ffffff60e01b1916600160e01b62ffffff858116918202929092179092556007805462ffffff1916918416919091179055600854612ebe91620186a091020490565b600b55600854620186a062ffffff929092160204600c5550565b7f0000000000000000000000000000000000000000000000000000000000000000158015612f0d57506001600160a01b038116155b80612f2057506001600160a01b03811630145b80612f3857506018546001600160a01b038281169116145b8061302957506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015612f85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa9919061479c565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015612ff9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061301d919061479c565b6001600160a01b031614155b61305f5760405162461bcd60e51b81526020600482015260076024820152662737902830b4b960c91b6044820152606401610c2f565b6001600160a01b038116156130745780613076565b305b601580546001600160a01b0319166001600160a01b039290921691909117905550565b5f6001600160a01b0383166130ac575f80fd5b6016546001600160a01b038481169116146132ef575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613102573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613126919061479c565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613165573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613189919061479c565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156131d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131fd919061479c565b90506001600160a01b03811661327f576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015613258573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061327c919061479c565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b0383811691161461332057601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fd0cdc441c8110da5df2f4a64e1cee8a6794d8016c982757bb5d8971cde6b6bf39060200160405180910390a3506017546001600160a01b031692915050565b601a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6006805461ff001916610100179055801580156133eb575060065460ff16155b6138c9575f80600d54116133ff575f613413565b6002600d5481613411576134116147b7565b045b6018546015549192505f916001600160a01b03908116911614613436575f61343a565b6010545b90508181018315801561344e5750600c5481115b156134b7575f8311613460575f613486565b600c546134869082620186a086028161347b5761347b6147b7565b04620186a091020490565b92505f8211613495575f6134b0565b600c546134b09082620186a085028161347b5761347b6147b7565b9150508181015b83806134c55750600b548110155b80156134e15750305f9081526020819052604090205481840111155b156137df5760408051600280825260608201835247925f92919060208301908036833701905050905030815f8151811061351d5761351d6146be565b6001600160a01b03928316602091820292909201015260185482519116908290600190811061354e5761354e6146be565b6001600160a01b039283166020918202929092010152601654613574913091168561233a565b60165460405163791ac94760e01b81526001600160a01b039091169063791ac947906135ac9086905f908690309042906004016147cb565b5f604051808303815f87803b1580156135c3575f80fd5b505af19250505080156135d4575060015b6135f5576016546135f09030906001600160a01b03165f61233a565b6137dc565b600d541561360757600d805486900390555b604080518481524784900360208201819052917f9029ea20319a59447bd88162928acbbbe0955dead46655370929b794e46e8d96910160405180910390a180156137da575f6136648286620186a08a028161347b5761347b6147b7565b6018546015549192506001600160a01b039081169116036136b2576136978286620186a089028161347b5761347b6147b7565b60128054909101905560118054870190556010805487900390555b5f871180156136c057505f81115b156137d8576016546136dd9030906001600160a01b03168961233a565b60165460195460405163f305d71960e01b8152306004820152602481018a90525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613769575060408051601f3d908101601f191682019092526137669181019061483c565b60015b61378a576016546137859030906001600160a01b03165f61233a565b6137d8565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600d80548990039055505b505b505b50505b6015546001600160a01b0316301480159061380b57506018546015546001600160a01b03908116911614155b15613898576010549150831580156138245750600c5482115b1561382f57600c5491505b838061383d5750600b548210155b80156138575750305f908152602081905260409020548211155b15613898576015545f90613874906001600160a01b031684613c0b565b9050801561389657601380548201905560118054840190556010805484900390555b505b5050506138a863ffffffff421690565b6007600b6101000a81548163ffffffff021916908363ffffffff1602179055505b506006805461ff0019169055565b6006805463ff00000019166301000000179055600f5415613a41575f805b60058160ff1610156139dd5760ff81165f90815260046020526040902080546003909101546101009091046001600160a01b031690158061394357506017546001600160a01b038281169116145b1561394e57506139d5565b6015545f9061399c906001600160a01b0316301461396e57601154613972565b6010545b600f5460ff86165f90815260046020526040902060030154620186a0028161347b5761347b6147b7565b90505f6139a98383613e82565b905080156139d15760ff84165f90815260046020526040902060030180548290039055938401935b5050505b6001016138f5565b506007805466ffffffff0000001916630100000063ffffffff4216021790558015613a0c57600f805482900390555b6040518181527fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979060200160405180910390a1505b6006805463ff00000019169055565b6006805466ffffff000000001916600160201b62ffffff841690810291909117909155613a7d575f613a93565b613a936008548262ffffff16620186a091020490565b6009557f000000000000000000000000000000000000000000000000000000000000000061100c5760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda195906020016112be565b6001600160a01b03831615801590613b1057506001600160a01b03821615155b613b5c5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610c2f565b6001600160a01b0383165f90815260208190526040902054811115613b935760405162461bcd60e51b8152600401610c2f9061471b565b8015613bc6576001600160a01b038084165f90815260208190526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161238e91815260200190565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613c51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c759190614704565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f81518110613cae57613cae6146be565b6001600160a01b039283166020918202929092010152601854825191169082906001908110613cdf57613cdf6146be565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600281518110613d1357613d136146be565b6001600160a01b039283166020918202929092010152601654613d39913091168661233a565b601654604051635c11d79560e01b81526001600160a01b0390911690635c11d79590613d719087905f908690309042906004016147cb565b5f604051808303815f87803b158015613d88575f80fd5b505af1925050508015613d99575060015b613dba57601654613db59030906001600160a01b03165f61233a565b613e7a565b6040516370a0823160e01b815230600482015282906001600160a01b038716906370a0823190602401602060405180830381865afa158015613dfe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e229190614704565b613e2c9190614867565b604080516001600160a01b0388168152602081018790529081018290529093507fa82a03c1e8613c6192a82386fbb3690070528b0dd8bcae8a5c82d9ef937d7f769060600160405180910390a15b505092915050565b5f815f03613e9157505f610d22565b601554306001600160a01b0390911603613f65575f600a54118015613ed05750600a546001600160a01b0384165f908152602081905260409020548301115b8015613ef457506001600160a01b0383165f9081526002602052604090205460ff16155b15613f4c576001600160a01b0383165f90815260208190526040902054600a5411613f1f575f613f3c565b6001600160a01b0383165f90815260208190526040902054600a54035b9150815f03613f4c57505f610d22565b613f57308484613af0565b6010805483900390556140c0565b6011545f90620186a0840281613f7d57613f7d6147b7565b6018546015549290910492505f916001600160a01b0391821691160361402057601254620186a09083020490505f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114613ff8576040519150601f19603f3d011682016040523d82523d5f602084013e613ffd565b606091505b5050905080614011575f9350505050610d22565b506012805482900390556140b4565b601354620186a09083020460155460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb906044016020604051808303815f875af192505050801561409b575060408051601f3d908101601f1916820190925261409891810190614744565b60015b6140a9575f92505050610d22565b506013805482900390555b50506011805483900390555b50919050565b60405180608001604052805f6001600160a01b031681526020016140e8614195565b81526020016140f5614195565b81526020015f81525090565b600183019183908215614189579160200282015f5b8382111561415857835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302614116565b80156141875782816101000a81549062ffffff0219169055600301602081600201049283019260010302614158565b505b5061175c9291506141b3565b60405180606001604052806003906020820280368337509192915050565b5b8082111561175c575f81556001016141b4565b801515811461100c575f80fd5b5f805f604084860312156141e6575f80fd5b833567ffffffffffffffff808211156141fd575f80fd5b818601915086601f830112614210575f80fd5b81358181111561421e575f80fd5b8760208260051b8501011115614232575f80fd5b60209283019550935050840135614248816141c7565b809150509250925092565b5f81518084525f5b818110156142775760208185018101518683018201520161425b565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6115c86020830184614253565b6001600160a01b038116811461100c575f80fd5b5f80604083850312156142cd575f80fd5b82356142d8816142a8565b946020939093013593505050565b5f805f606084860312156142f8575f80fd5b8335614303816142a8565b92506020840135614313816142a8565b929592945050506040919091013590565b803560ff81168114614334575f80fd5b919050565b803562ffffff81168114614334575f80fd5b5f82601f83011261435a575f80fd5b6040516060810181811067ffffffffffffffff8211171561438957634e487b7160e01b5f52604160045260245ffd5b60405280606084018581111561439d575f80fd5b845b818110156143be576143b081614339565b83526020928301920161439f565b509195945050505050565b5f805f8061010085870312156143dd575f80fd5b6143e685614324565b935060208501356143f6816142a8565b9250614405866040870161434b565b91506144148660a0870161434b565b905092959194509250565b5f6020828403121561442f575f80fd5b81356115c8816141c7565b5f6020828403121561444a575f80fd5b813563ffffffff811681146115c8575f80fd5b60c081525f61446f60c0830189614253565b82810360208401526144818189614253565b60ff881660408501526001600160a01b03871660608501526080840186905283810360a085015290506144b48185614253565b9998505050505050505050565b5f602082840312156144d1575f80fd5b81356115c8816142a8565b5f602082840312156144ec575f80fd5b6115c882614339565b5f8060408385031215614506575f80fd5b61450f83614339565b915061451d60208401614339565b90509250929050565b5f8060408385031215614537575f80fd5b8235614542816142a8565b91506020830135614552816142a8565b809150509250929050565b805f5b6003811015610e9d57815162ffffff16845260209384019390910190600101614560565b602080825282518282018190525f919060409081850190868401855b828110156145f657815180516001600160a01b03168552868101516145c78887018261455d565b50858101516145d9608087018261455d565b506060015160e085015261010090930192908501906001016145a0565b5091979650505050505050565b5f805f805f805f60e0888a031215614619575f80fd5b8735614624816142a8565b96506020880135614634816142a8565b9550604088013594506060880135935061465060808901614324565b925060a0880135915060c0880135905092959891949750929550565b5f806040838503121561467d575f80fd5b8235614688816142a8565b91506020830135614552816141c7565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806146e657607f821691505b6020821081036140c057634e487b7160e01b5f52602260045260245ffd5b5f60208284031215614714575f80fd5b5051919050565b6020808252600f908201526e457863656564732062616c616e636560881b604082015260600190565b5f60208284031215614754575f80fd5b81516115c8816141c7565b60ff851681526001600160a01b03841660208201526101008101614786604083018561455d565b61479360a083018461455d565b95945050505050565b5f602082840312156147ac575f80fd5b81516115c8816142a8565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b8181101561481b5784516001600160a01b0316835293830193918301916001016147f6565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f6060848603121561484e575f80fd5b8351925060208401519150604084015190509250925092565b81810381811115610d2257634e487b7160e01b5f52601160045260245ffdfea2646970667358221220ebd6d5bde853878129cf1b2e7b81d3337532f9c00c0ef90c767bdaf5d9b3a50964736f6c63430008180033000000000000000000000000d74c50c5ffe75aff4f21e384e4073d8b89a89e43

Deployed Bytecode

0x6080604052600436106103a1575f3560e01c806377004851116101e4578063be5e49b21161010b578063da88d01a116100a4578063f2fde38b11610076578063f2fde38b14610b4e578063f3dc4f4814610b6d578063f59c370814610ba9578063f7c3b38f14610bc8578063f7de0e5714610be857005b8063da88d01a14610add578063dd62ed3e14610afc578063e92871f614610b1b578063f2cda82e14610b2f57005b8063cc1776d3116100dd578063cc1776d314610a33578063d232c22014610a47578063d505accf14610aaa578063d8454a8214610ac957005b8063be5e49b2146109cf578063c2921583146109ee578063c77e006d14610a0b578063c78fe0d414610a1f57005b806395d89b411161017d578063a4d8971a1161014f578063a4d8971a14610955578063a5596b4f14610974578063a9059cbb14610993578063b81a0145146109b257005b806395d89b41146108fa57806396ce07951461090e5780639c5ef8d714610922578063a457c2d71461093657005b80638bf1acff116101b65780638bf1acff1461088b5780638d8350ca1461089f5780638da5cb5b146108be57806395101f90146108db57005b8063770048511461081b5780637ecebe001461082f5780638324c3b9146108635780638a8c523c1461087757005b806339509351116102c85780635a0d4f88116102615780636f05be97116102335780636f05be971461079257806370a08231146107b3578063715018a6146107e757806375de1496146107fb57005b80635a0d4f88146106f25780635b90fe66146107235780635f6417581461075457806368a5d4141461077357005b8063487d1ce51161029a578063487d1ce5146106675780634b7d9db4146106865780634f7041a51461069d57806354fd4d50146106c557005b806339509351146105d35780633af32abf146105f25780633ed8a1691461062957806344b691ff1461064857005b806323b872dd1161033a57806332acf3de1161030c57806332acf3de146105505780633644e51514610585578063370158ea1461059957806339137f8b146105bf57005b806323b872dd146104b65780632623e975146104d55780632984207a146104f4578063313ce5671461051357005b8063095ea7b311610373578063095ea7b31461043b5780631171bda91461045a57806318160ddd14610479578063186488a81461049757005b806301b38af5146103aa578063064a59d0146103c957806306fdde03146103fd57806307e9652c1461041e57005b366103a857005b005b3480156103b5575f80fd5b506103a86103c43660046141d4565b610c05565b3480156103d4575f80fd5b50600754600160381b900463ffffffff1615155b60405190151581526020015b60405180910390f35b348015610408575f80fd5b50610411610c82565b6040516103f49190614296565b348015610429575f80fd5b5060065462010000900460ff166103e8565b348015610446575f80fd5b506103e86104553660046142bc565b610d12565b348015610465575f80fd5b506103a86104743660046142e6565b610d28565b348015610484575f80fd5b506008545b6040519081526020016103f4565b3480156104a2575f80fd5b506103a86104b13660046143c9565b610ea3565b3480156104c1575f80fd5b506103e86104d03660046142e6565b610eef565b3480156104e0575f80fd5b506103a86104ef36600461441f565b610f10565b3480156104ff575f80fd5b506103a861050e36600461443a565b610faf565b34801561051e575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000121681526020016103f4565b34801561055b575f80fd5b5060065460075460408051600160e01b90930462ffffff90811684529091166020830152016103f4565b348015610590575f80fd5b50601d54610489565b3480156105a4575f80fd5b506105ad61100f565b6040516103f49695949392919061445d565b3480156105ca575f80fd5b506103a861119a565b3480156105de575f80fd5b506103e86105ed3660046142bc565b6111fb565b3480156105fd575f80fd5b506103e861060c3660046144c1565b6001600160a01b03165f9081526002602052604090205460ff1690565b348015610634575f80fd5b506103a86106433660046144dc565b611212565b348015610653575f80fd5b506103a86106623660046144f5565b6112c9565b348015610672575f80fd5b506103a86106813660046144c1565b6113cb565b348015610691575f80fd5b5060065460ff166103e8565b3480156106a8575f80fd5b506106b1611472565b60405162ffffff90911681526020016103f4565b3480156106d0575f80fd5b50604080518082019091526005815264312e302e3160d81b6020820152610411565b3480156106fd575f80fd5b506015546001600160a01b03165b6040516001600160a01b0390911681526020016103f4565b34801561072e575f80fd5b50600754600160781b900463ffffffff1660405163ffffffff90911681526020016103f4565b34801561075f575f80fd5b506106b161076e3660046144c1565b611481565b34801561077e575f80fd5b5061070b61078d366004614526565b61157c565b34801561079d575f80fd5b506107a66115cf565b6040516103f49190614584565b3480156107be575f80fd5b506104896107cd3660046144c1565b6001600160a01b03165f9081526020819052604090205490565b3480156107f2575f80fd5b506103a8611760565b348015610806575f80fd5b50600654600160381b900462ffffff166106b1565b348015610826575f80fd5b506103a86117aa565b34801561083a575f80fd5b506104896108493660046144c1565b6001600160a01b03165f908152601e602052604090205490565b34801561086e575f80fd5b506103a86117eb565b348015610882575f80fd5b506103a8611852565b348015610896575f80fd5b506106b1611905565b3480156108aa575f80fd5b506106b16108b93660046144c1565b61190b565b3480156108c9575f80fd5b50601a546001600160a01b031661070b565b3480156108e6575f80fd5b506106b16108f53660046144c1565b6119ce565b348015610905575f80fd5b50610411611aaa565b348015610919575f80fd5b506103e86106b1565b34801561092d575f80fd5b506103a8611ab9565b348015610941575f80fd5b506103e86109503660046142bc565b611b2e565b348015610960575f80fd5b506103a861096f36600461441f565b611b8e565b34801561097f575f80fd5b506103a861098e36600461441f565b611c1a565b34801561099e575f80fd5b506103e86109ad3660046142bc565b611c76565b3480156109bd575f80fd5b506019546001600160a01b031661070b565b3480156109da575f80fd5b506103a86109e93660046144c1565b611c82565b3480156109f9575f80fd5b506017546001600160a01b031661070b565b348015610a16575f80fd5b506103a8611ce3565b348015610a2a575f80fd5b506103a8611d48565b348015610a3e575f80fd5b506106b1611db0565b348015610a52575f80fd5b506014546040805160ff8084161515825261010084048116151560208301526201000084048116151592820192909252600160201b83048216151560608201526301000000909204161515608082015260a0016103f4565b348015610ab5575f80fd5b506103a8610ac4366004614603565b611dba565b348015610ad4575f80fd5b50600e54610489565b348015610ae8575f80fd5b506103a8610af73660046144dc565b611fa2565b348015610b07575f80fd5b50610489610b16366004614526565b612051565b348015610b26575f80fd5b506103a861207b565b348015610b3a575f80fd5b506103a8610b493660046142bc565b6120de565b348015610b59575f80fd5b506103a8610b683660046144c1565b6121c3565b348015610b78575f80fd5b506103e8610b873660046144c1565b6001600160a01b03165f90815260036020526040902054610100900460ff1690565b348015610bb4575f80fd5b506103a8610bc336600461466c565b612208565b348015610bd3575f80fd5b50600654600160201b900462ffffff166106b1565b348015610bf3575f80fd5b506016546001600160a01b031661070b565b601a546001600160a01b03163314610c385760405162461bcd60e51b8152600401610c2f90614698565b60405180910390fd5b815f5b81811015610c7b57610c73858583818110610c5857610c586146be565b9050602002016020810190610c6d91906144c1565b84612238565b600101610c3b565b5050505050565b6060601b8054610c91906146d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbd906146d2565b8015610d085780601f10610cdf57610100808354040283529160200191610d08565b820191905f5260205f20905b815481529060010190602001808311610ceb57829003601f168201915b5050505050905090565b5f610d1e33848461233a565b5060015b92915050565b601a546001600160a01b03163314610d525760405162461bcd60e51b8152600401610c2f90614698565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610d96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dba9190614704565b90505f6001600160a01b0385163014610df0576015546001600160a01b03868116911614610de8575f610df8565b601354610df8565b600d54601054015b90508282821015610e095781610e0b565b825b83031015610e2b5760405162461bcd60e51b8152600401610c2f9061471b565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610e79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9d9190614744565b50505050565b601a546001600160a01b03163314610ecd5760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615610ee3575f80fd5b610e9d8484848461239b565b5f610efb84338461273c565b610f0684848461279f565b5060019392505050565b601a546001600160a01b03163314610f3a5760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff1615610f50575f80fd5b801580610f6757506016546001600160a01b031615155b610f9c5760405162461bcd60e51b815260206004820152600660248201526509cde40888ab60d31b6044820152606401610c2f565b6006805460ff1916911515919091179055565b601a546001600160a01b03163314610fd95760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615610fef575f80fd5b6102588163ffffffff161115611003575f80fd5b61100c81612d80565b50565b6060805f805f6060601b601c7f0000000000000000000000000000000000000000000000000000000000000012601a5f9054906101000a90046001600160a01b031660085460405180604001604052806005815260200164312e302e3160d81b81525085805461107e906146d2565b80601f01602080910402602001604051908101604052809291908181526020018280546110aa906146d2565b80156110f55780601f106110cc576101008083540402835291602001916110f5565b820191905f5260205f20905b8154815290600101906020018083116110d857829003601f168201915b50505050509550848054611108906146d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611134906146d2565b801561117f5780601f106111565761010080835404028352916020019161117f565b820191905f5260205f20905b81548152906001019060200180831161116257829003601f168201915b50505050509450955095509550955095509550909192939495565b601a546001600160a01b031633146111c45760405162461bcd60e51b8152600401610c2f90614698565b6014805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b5f610d1e33848461120c3388612051565b0161233a565b601a546001600160a01b0316331461123c5760405162461bcd60e51b8152600401610c2f90614698565b60145462010000900460ff1615611251575f80fd5b62ffffff8116158061127c575060648162ffffff161015801561127c5750620186a062ffffff821611155b611284575f80fd5b61128d81612dd4565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b601a546001600160a01b031633146112f35760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff1615611309575f80fd5b60018262ffffff161015801561132657506103e88262ffffff1611155b6113615760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c2f565b8162ffffff168162ffffff161015801561138257506103e88162ffffff1611155b6113bd5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c2f565b6113c78282612e77565b5050565b601a546001600160a01b031633146113f55760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff161561140b575f80fd5b6015546001600160a01b0382811691161480159061142a57505f601154115b156114695760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b6044820152606401610c2f565b61100c81612ed8565b5f61147c336119ce565b905090565b6006545f9062010000900460ff161561149b57505f919050565b6001600160a01b0382163014806114c957506001600160a01b0382165f9081526002602052604090205460ff165b806114e157506017546001600160a01b038381169116145b806114f957506016546001600160a01b038381169116145b611575576001600160a01b0382165f90815260036020526040902054610100900460ff1680611549575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b61156157600654600160801b900462ffffff16610d22565b600654600160c81b900462ffffff16610d22565b5f92915050565b601a545f906001600160a01b031633146115a85760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff16156115be575f80fd5b6115c88383613099565b9392505050565b60408051600580825260c08201909252606091816020015b6115ef6140c6565b8152602001906001900390816115e75790505090505f5b60058160ff16101561175c576040805160808101825260ff83165f81815260046020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611663579050505050918352505060ff83165f9081526004602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff16815260200190600301906020826002010492830192600103820291508084116116d75750505092845250505060ff83165f8181526004602090815260409091206003015492019190915283518491908110611749576117496146be565b6020908102919091010152600101611606565b5090565b601a546001600160a01b0316331461178a5760405162461bcd60e51b8152600401610c2f90614698565b6014805464ffffffffff19166401010101011790556117a85f61337a565b565b60065460ff1680156117c45750600654610100900460ff16155b80156117da57506006546301000000900460ff16155b6117e2575f80fd5b6117a85f6133cb565b601a546001600160a01b031633146118155760405162461bcd60e51b8152600401610c2f90614698565b6014805463ff000000191663010000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b601a546001600160a01b0316331461187c5760405162461bcd60e51b8152600401610c2f90614698565b601454600160201b900460ff1615611892575f80fd5b600754600160381b900463ffffffff16156118e15760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610c2f565b600780546affffffff0000000000000019164263ffffffff16600160381b02179055565b5f61147c335b5f6001600160a01b03821630148061193a57506001600160a01b0382165f9081526002602052604090205460ff165b8061195257506017546001600160a01b038381169116145b611575576001600160a01b0382165f90815260036020526040902054610100900460ff16806119a2575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b6119ba57600654600160501b900462ffffff16610d22565b600654600160981b900462ffffff16610d22565b6006545f9062010000900460ff16156119e857505f919050565b6001600160a01b038216301480611a1657506001600160a01b0382165f9081526002602052604090205460ff165b80611a2e57506017546001600160a01b038381169116145b611575576001600160a01b0382165f90815260036020526040902054610100900460ff1680611a7e575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611a9657600654600160681b900462ffffff16610d22565b600654600160b01b900462ffffff16610d22565b6060601c8054610c91906146d2565b601a546001600160a01b0316331480611ae05750335f9081526002602052604090205460ff165b611afc5760405162461bcd60e51b8152600401610c2f90614698565b600654610100900460ff16158015611b1e57506006546301000000900460ff16155b611b26575f80fd5b6117a86138d7565b5f80611b3a3385612051565b905082811015611b815760405162461bcd60e51b81526020600482015260126024820152714e6567617469766520616c6c6f77616e636560701b6044820152606401610c2f565b610f06338585840361233a565b601a546001600160a01b0316331480611bb55750335f9081526002602052604090205460ff165b611bd15760405162461bcd60e51b8152600401610c2f90614698565b8080611bdf575060065460ff165b8015611bf35750600654610100900460ff16155b8015611c0957506006546301000000900460ff16155b611c11575f80fd5b61100c816133cb565b601a546001600160a01b03163314611c445760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615611c5a575f80fd5b60068054911515620100000262ff000019909216919091179055565b5f610d1e33848461279f565b601a546001600160a01b03163314611cac5760405162461bcd60e51b8152600401610c2f90614698565b6014546301000000900460ff1615611cc2575f80fd5b6001600160a01b03165f908152600360205260409020805461ff0019169055565b601a546001600160a01b03163314611d0d5760405162461bcd60e51b8152600401610c2f90614698565b6014805462ff00001916620100001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b601a546001600160a01b03163314611d725760405162461bcd60e51b8152600401610c2f90614698565b6014805464ff000000001916600160201b1790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f61147c33611481565b42841015611dfe5760405162461bcd60e51b815260206004820152601160248201527045787069726564207369676e617475726560781b6044820152606401610c2f565b601d546001600160a01b038881165f818152601e602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa158015611f16573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590611f4c5750886001600160a01b0316816001600160a01b0316145b611f8c5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610c2f565b5050611f9987878761233a565b50505050505050565b601a546001600160a01b03163314611fcc5760405162461bcd60e51b8152600401610c2f90614698565b601454610100900460ff1615611fe0575f80fd5b62ffffff8116158061200b575060648162ffffff161015801561200b5750620186a062ffffff821611155b612013575f80fd5b61201c81613a50565b60405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda195906020016112be565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b601a546001600160a01b031633146120a55760405162461bcd60e51b8152600401610c2f90614698565b6014805461ff0019166101001790556040517fcc2f10fb1214ece03bcb178c4d75943daee74aff93182bfb58ba9b8ef5d8c5aa905f90a1565b601a546001600160a01b031633146121085760405162461bcd60e51b8152600401610c2f90614698565b60185460155447915f916001600160a01b0390811691161461212a575f61212e565b6012545b9050828282101561213f5781612141565b825b830310156121615760405162461bcd60e51b8152600401610c2f9061471b565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146121ac576040519150601f19603f3d011682016040523d82523d5f602084013e6121b1565b606091505b50509050806121be575f80fd5b505050565b601a546001600160a01b031633146121ed5760405162461bcd60e51b8152600401610c2f90614698565b6001600160a01b0381166121ff575f80fd5b61100c8161337a565b601a546001600160a01b031633146122325760405162461bcd60e51b8152600401610c2f90614698565b6113c782825b60145460ff1615612247575f80fd5b6001600160a01b038216612259575f80fd5b6016546001600160a01b0383811691161480159061228557506017546001600160a01b03838116911614155b6122dc5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610c2f565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff16106123aa575f80fd5b6001600160a01b03831630148015906123ce57506001600160a01b03831661dead14155b80156123e257506001600160a01b03831615155b6123ea575f80fd5b60ff84165f90815260046020908152604091829020600181018054865160068054600160501b80820462ffffff908116958116909403949094018316840262ffffff60501b198216811780845586548c8a0151600160681b928390048716630100000092839004881690910301861690910265ffffffffffff60501b1990931662ffffff60681b19909216919091179190911780835594548a890151600160801b808804861666010000000000009384900487169092039190910185160262ffffff60801b19871681178085556002890180548d51600160981b938490048916918916900301871690910265ffffffffffff60801b1990981662ffffff60981b1990921691909117969096178084558654988b0151600160b01b808304871694909a048616900392909201841690970262ffffff60b01b19821681178084559554988a015165ffffffffffff60b01b1990921662ffffff60c81b1990911617969097048216909603600160c81b938490048216018116909202939093179384905590926161a892900416118015906125de57506006546161a8600160681b90910462ffffff16118015906125af57506006546161a8600160801b90910462ffffff1611155b80156125de57506006546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b6126155760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b6044820152606401610c2f565b600654620186a0600160981b90910462ffffff16118015906126495750600654620186a0600160b01b90910462ffffff1611155b80156126675750600654620186a0600160c81b90910462ffffff1611155b6126a55760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642050656e616c747960881b6044820152606401610c2f565b8054610100600160a81b0319166101006001600160a01b038616021781556126d260018201846003614101565b506126e260028201836003614101565b50805460ff166126f857805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405161272d949392919061475f565b60405180910390a15050505050565b5f6127478484612051565b9050818110156127925760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610c2f565b610e9d848484840361233a565b6006546301000000900460ff161580156127c15750600654610100900460ff16155b80156127f457506017546001600160a01b038481169116148015906127f457506016546001600160a01b03848116911614155b1561280a576128025f6133cb565b61280a6138d7565b5f8111801561283157506001600160a01b0383165f9081526002602052604090205460ff16155b801561285557506001600160a01b0382165f9081526002602052604090205460ff16155b801561286a57506001600160a01b0383163014155b801561287f57506001600160a01b0382163014155b801561289957506016546001600160a01b03838116911614155b15612d75576017546001600160a01b038481169116148015906128ca57506017546001600160a01b03838116911614155b8061291357506017546001600160a01b03848116911614806128f957506017546001600160a01b038381169116145b80156129135750600754600160381b900463ffffffff1615155b6129525760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610c2f565b600954158061296357506009548111155b61299f5760405162461bcd60e51b815260206004820152600d60248201526c08af0c6cacac8e640dac2f0a8f609b1b6044820152606401610c2f565b600a5415806129b657506001600160a01b03821630145b806129e557506017546001600160a01b03838116911614806129e557506016546001600160a01b038381169116145b80612a0b5750600a546001600160a01b0383165f90815260208190526040902054820111155b612a4c5760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617842616c616e636560701b6044820152606401610c2f565b60065462010000900460ff16158015612a6f57506006546301000000900460ff16155b8015612a835750600654610100900460ff16155b15612d75576017545f9081906001600160a01b0386811691161480612ab557506017546001600160a01b038581169116145b15612adc576017546001600160a01b03868116911614612ad6576002612ad9565b60015b90505b5f8160ff16600114612aee5785612af0565b845b60075490915063ffffffff428116600160781b83048216600160381b9093048216929092011610801590612b4157506001600160a01b0381165f90815260036020526040902054610100900460ff16155b15612b6b576001600160a01b0381165f908152600360205260409020805461ff0019166101001790555b5f5b60058160ff161015612d5c575f808460ff1611612bf8576001600160a01b0383165f90815260036020526040902054610100900460ff16612bde5760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16612cc0565b60ff82165f90815260046020526040812060020190612bbe565b8360ff16600114612c5e576001600160a01b0383165f90815260036020526040902054610100900460ff16612c425760ff82165f9081526004602052604090206001016002612bbe565b60ff82165f908152600460205260409020600290810190612bbe565b6001600160a01b0383165f90815260036020526040902054610100900460ff16612c9e5760ff82165f908152600460205260409020600190810190612bbe565b60ff82165f908152600460205260409020600201546301000000900462ffffff165b62ffffff169050805f03612cd45750612d54565b620186a086820204612ce7893083613af0565b60175460ff84165f908152600460205260409020546001600160a01b0391821661010090910490911603612d2257600d805482019055612d4d565b60ff83165f9081526004602052604090206003018054820190556010805482019055600f8054820190555b9490940193505b600101612b6d565b508215612d7157600e80548401905592829003925b5050505b6121be838383613af0565b6007805463ffffffff60781b1916600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020016112be565b6006805469ffffff000000000000001916600160381b62ffffff841690810291909117909155612e04575f612e1a565b612e1a6008548262ffffff16620186a091020490565b600a557f000000000000000000000000000000000000000000000000000000000000000161100c5760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020016112be565b6006805462ffffff60e01b1916600160e01b62ffffff858116918202929092179092556007805462ffffff1916918416919091179055600854612ebe91620186a091020490565b600b55600854620186a062ffffff929092160204600c5550565b7f0000000000000000000000000000000000000000000000000000000000000001158015612f0d57506001600160a01b038116155b80612f2057506001600160a01b03811630145b80612f3857506018546001600160a01b038281169116145b8061302957506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015612f85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa9919061479c565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015612ff9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061301d919061479c565b6001600160a01b031614155b61305f5760405162461bcd60e51b81526020600482015260076024820152662737902830b4b960c91b6044820152606401610c2f565b6001600160a01b038116156130745780613076565b305b601580546001600160a01b0319166001600160a01b039290921691909117905550565b5f6001600160a01b0383166130ac575f80fd5b6016546001600160a01b038481169116146132ef575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613102573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613126919061479c565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613165573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613189919061479c565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156131d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131fd919061479c565b90506001600160a01b03811661327f576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015613258573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061327c919061479c565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b0383811691161461332057601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fd0cdc441c8110da5df2f4a64e1cee8a6794d8016c982757bb5d8971cde6b6bf39060200160405180910390a3506017546001600160a01b031692915050565b601a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6006805461ff001916610100179055801580156133eb575060065460ff16155b6138c9575f80600d54116133ff575f613413565b6002600d5481613411576134116147b7565b045b6018546015549192505f916001600160a01b03908116911614613436575f61343a565b6010545b90508181018315801561344e5750600c5481115b156134b7575f8311613460575f613486565b600c546134869082620186a086028161347b5761347b6147b7565b04620186a091020490565b92505f8211613495575f6134b0565b600c546134b09082620186a085028161347b5761347b6147b7565b9150508181015b83806134c55750600b548110155b80156134e15750305f9081526020819052604090205481840111155b156137df5760408051600280825260608201835247925f92919060208301908036833701905050905030815f8151811061351d5761351d6146be565b6001600160a01b03928316602091820292909201015260185482519116908290600190811061354e5761354e6146be565b6001600160a01b039283166020918202929092010152601654613574913091168561233a565b60165460405163791ac94760e01b81526001600160a01b039091169063791ac947906135ac9086905f908690309042906004016147cb565b5f604051808303815f87803b1580156135c3575f80fd5b505af19250505080156135d4575060015b6135f5576016546135f09030906001600160a01b03165f61233a565b6137dc565b600d541561360757600d805486900390555b604080518481524784900360208201819052917f9029ea20319a59447bd88162928acbbbe0955dead46655370929b794e46e8d96910160405180910390a180156137da575f6136648286620186a08a028161347b5761347b6147b7565b6018546015549192506001600160a01b039081169116036136b2576136978286620186a089028161347b5761347b6147b7565b60128054909101905560118054870190556010805487900390555b5f871180156136c057505f81115b156137d8576016546136dd9030906001600160a01b03168961233a565b60165460195460405163f305d71960e01b8152306004820152602481018a90525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613769575060408051601f3d908101601f191682019092526137669181019061483c565b60015b61378a576016546137859030906001600160a01b03165f61233a565b6137d8565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600d80548990039055505b505b505b50505b6015546001600160a01b0316301480159061380b57506018546015546001600160a01b03908116911614155b15613898576010549150831580156138245750600c5482115b1561382f57600c5491505b838061383d5750600b548210155b80156138575750305f908152602081905260409020548211155b15613898576015545f90613874906001600160a01b031684613c0b565b9050801561389657601380548201905560118054840190556010805484900390555b505b5050506138a863ffffffff421690565b6007600b6101000a81548163ffffffff021916908363ffffffff1602179055505b506006805461ff0019169055565b6006805463ff00000019166301000000179055600f5415613a41575f805b60058160ff1610156139dd5760ff81165f90815260046020526040902080546003909101546101009091046001600160a01b031690158061394357506017546001600160a01b038281169116145b1561394e57506139d5565b6015545f9061399c906001600160a01b0316301461396e57601154613972565b6010545b600f5460ff86165f90815260046020526040902060030154620186a0028161347b5761347b6147b7565b90505f6139a98383613e82565b905080156139d15760ff84165f90815260046020526040902060030180548290039055938401935b5050505b6001016138f5565b506007805466ffffffff0000001916630100000063ffffffff4216021790558015613a0c57600f805482900390555b6040518181527fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979060200160405180910390a1505b6006805463ff00000019169055565b6006805466ffffff000000001916600160201b62ffffff841690810291909117909155613a7d575f613a93565b613a936008548262ffffff16620186a091020490565b6009557f000000000000000000000000000000000000000000000000000000000000000161100c5760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda195906020016112be565b6001600160a01b03831615801590613b1057506001600160a01b03821615155b613b5c5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610c2f565b6001600160a01b0383165f90815260208190526040902054811115613b935760405162461bcd60e51b8152600401610c2f9061471b565b8015613bc6576001600160a01b038084165f90815260208190526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161238e91815260200190565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613c51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c759190614704565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f81518110613cae57613cae6146be565b6001600160a01b039283166020918202929092010152601854825191169082906001908110613cdf57613cdf6146be565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600281518110613d1357613d136146be565b6001600160a01b039283166020918202929092010152601654613d39913091168661233a565b601654604051635c11d79560e01b81526001600160a01b0390911690635c11d79590613d719087905f908690309042906004016147cb565b5f604051808303815f87803b158015613d88575f80fd5b505af1925050508015613d99575060015b613dba57601654613db59030906001600160a01b03165f61233a565b613e7a565b6040516370a0823160e01b815230600482015282906001600160a01b038716906370a0823190602401602060405180830381865afa158015613dfe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e229190614704565b613e2c9190614867565b604080516001600160a01b0388168152602081018790529081018290529093507fa82a03c1e8613c6192a82386fbb3690070528b0dd8bcae8a5c82d9ef937d7f769060600160405180910390a15b505092915050565b5f815f03613e9157505f610d22565b601554306001600160a01b0390911603613f65575f600a54118015613ed05750600a546001600160a01b0384165f908152602081905260409020548301115b8015613ef457506001600160a01b0383165f9081526002602052604090205460ff16155b15613f4c576001600160a01b0383165f90815260208190526040902054600a5411613f1f575f613f3c565b6001600160a01b0383165f90815260208190526040902054600a54035b9150815f03613f4c57505f610d22565b613f57308484613af0565b6010805483900390556140c0565b6011545f90620186a0840281613f7d57613f7d6147b7565b6018546015549290910492505f916001600160a01b0391821691160361402057601254620186a09083020490505f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114613ff8576040519150601f19603f3d011682016040523d82523d5f602084013e613ffd565b606091505b5050905080614011575f9350505050610d22565b506012805482900390556140b4565b601354620186a09083020460155460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb906044016020604051808303815f875af192505050801561409b575060408051601f3d908101601f1916820190925261409891810190614744565b60015b6140a9575f92505050610d22565b506013805482900390555b50506011805483900390555b50919050565b60405180608001604052805f6001600160a01b031681526020016140e8614195565b81526020016140f5614195565b81526020015f81525090565b600183019183908215614189579160200282015f5b8382111561415857835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302614116565b80156141875782816101000a81549062ffffff0219169055600301602081600201049283019260010302614158565b505b5061175c9291506141b3565b60405180606001604052806003906020820280368337509192915050565b5b8082111561175c575f81556001016141b4565b801515811461100c575f80fd5b5f805f604084860312156141e6575f80fd5b833567ffffffffffffffff808211156141fd575f80fd5b818601915086601f830112614210575f80fd5b81358181111561421e575f80fd5b8760208260051b8501011115614232575f80fd5b60209283019550935050840135614248816141c7565b809150509250925092565b5f81518084525f5b818110156142775760208185018101518683018201520161425b565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6115c86020830184614253565b6001600160a01b038116811461100c575f80fd5b5f80604083850312156142cd575f80fd5b82356142d8816142a8565b946020939093013593505050565b5f805f606084860312156142f8575f80fd5b8335614303816142a8565b92506020840135614313816142a8565b929592945050506040919091013590565b803560ff81168114614334575f80fd5b919050565b803562ffffff81168114614334575f80fd5b5f82601f83011261435a575f80fd5b6040516060810181811067ffffffffffffffff8211171561438957634e487b7160e01b5f52604160045260245ffd5b60405280606084018581111561439d575f80fd5b845b818110156143be576143b081614339565b83526020928301920161439f565b509195945050505050565b5f805f8061010085870312156143dd575f80fd5b6143e685614324565b935060208501356143f6816142a8565b9250614405866040870161434b565b91506144148660a0870161434b565b905092959194509250565b5f6020828403121561442f575f80fd5b81356115c8816141c7565b5f6020828403121561444a575f80fd5b813563ffffffff811681146115c8575f80fd5b60c081525f61446f60c0830189614253565b82810360208401526144818189614253565b60ff881660408501526001600160a01b03871660608501526080840186905283810360a085015290506144b48185614253565b9998505050505050505050565b5f602082840312156144d1575f80fd5b81356115c8816142a8565b5f602082840312156144ec575f80fd5b6115c882614339565b5f8060408385031215614506575f80fd5b61450f83614339565b915061451d60208401614339565b90509250929050565b5f8060408385031215614537575f80fd5b8235614542816142a8565b91506020830135614552816142a8565b809150509250929050565b805f5b6003811015610e9d57815162ffffff16845260209384019390910190600101614560565b602080825282518282018190525f919060409081850190868401855b828110156145f657815180516001600160a01b03168552868101516145c78887018261455d565b50858101516145d9608087018261455d565b506060015160e085015261010090930192908501906001016145a0565b5091979650505050505050565b5f805f805f805f60e0888a031215614619575f80fd5b8735614624816142a8565b96506020880135614634816142a8565b9550604088013594506060880135935061465060808901614324565b925060a0880135915060c0880135905092959891949750929550565b5f806040838503121561467d575f80fd5b8235614688816142a8565b91506020830135614552816141c7565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806146e657607f821691505b6020821081036140c057634e487b7160e01b5f52602260045260245ffd5b5f60208284031215614714575f80fd5b5051919050565b6020808252600f908201526e457863656564732062616c616e636560881b604082015260600190565b5f60208284031215614754575f80fd5b81516115c8816141c7565b60ff851681526001600160a01b03841660208201526101008101614786604083018561455d565b61479360a083018461455d565b95945050505050565b5f602082840312156147ac575f80fd5b81516115c8816142a8565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b8181101561481b5784516001600160a01b0316835293830193918301916001016147f6565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f6060848603121561484e575f80fd5b8351925060208401519150604084015190509250925092565b81810381811115610d2257634e487b7160e01b5f52601160045260245ffdfea2646970667358221220ebd6d5bde853878129cf1b2e7b81d3337532f9c00c0ef90c767bdaf5d9b3a50964736f6c63430008180033

Deployed Bytecode Sourcemap

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

Swarm Source

ipfs://ebd6d5bde853878129cf1b2e7b81d3337532f9c00c0ef90c767bdaf5d9b3a509

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.