Contract 0xEaAE0E8369333c7aA9463ef09290F4C562966157

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x35fd41fed93563a81920efcf0378b893485c80728f79710ae57d7a1d4c95a398Approve131456472021-12-03 1:11:5513 hrs 1 min ago0x95df243ce9f82cb4c71a6779a846ea634be42a5a IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000267462
0xac2875b1277a6307e70cd81aaffc1c6fed9e20d5a4bae35fc63374319cad8c64Approve131350122021-12-02 16:18:5621 hrs 54 mins ago0x33f1b3ef4356e2dfc296327a5166680bb18af4d9 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x116ce9f1dfbb69fae32201699387cb6a84306110ddbbbae7049e1a8110f37054Approve131322032021-12-02 13:53:521 day 19 mins ago0xb58aadda5239c9b17ce54f0ca61bc25673f1201d IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x6bc40025e44e7013d0fa665b6f86dd13ea0c146e04144f49d2d8e081f3bc1391Approve131317462021-12-02 13:30:521 day 42 mins ago0xa7b001121cf78f9349170e8894d9b94ea5a51aed IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0xdbbd135e2658b0b540e376545ba7a43df8aaacf305d81470a024f30d867b4fdeApprove131313402021-12-02 13:10:081 day 1 hr ago0xa7b001121cf78f9349170e8894d9b94ea5a51aed IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x35c6546d91b168544c32022bd34f52ced83f3384f8230ded0178838d7a25f92fApprove131189602021-12-02 2:19:561 day 11 hrs ago0xb74da7351ab0cac8683a8a97827c2f08450abf31 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x33c334b192ca9a97663d1beb98b0be4f4cde09ab1e8befa4f429f7124849c669Approve131144072021-12-01 22:21:451 day 15 hrs ago0x2a3f10c985dc886f11e7819a84e3ed9a6a5caa28 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x83dcf405b634b216ead7ee0144562f3581bd6a4b8fc2178abc729349b322f995Approve131140252021-12-01 22:02:391 day 16 hrs ago0xcb178a418a9172c1c1a9445997a06a68c985a2da IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x1ef3d11ca5ed7e95c5031c442ef02e5361c777fd1eba872a689b86336073d254Approve131137852021-12-01 21:50:301 day 16 hrs ago0x5e6224b89be2b7a547eeed2867228f736f40feb2 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x8f311d8d0cfce4f08397b0f6f7c15ca4bd8350bb1adf8bd6fe29f7fddddabab7Approve131122522021-12-01 20:33:381 day 17 hrs ago0xf7779018edd21434daf1c8ae16edebc1e44e2ac7 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x0c283b363474cca87c6a04c3026d3de19251fc2f1ebe3d576b5da1d341df266eApprove131053722021-12-01 14:31:361 day 23 hrs ago0x016fe2c18b2428f787ea66e72970a875dbc4fa35 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x3a53a89ff4e83e9d5555f2b1545bcd3b28f3d1202d3a0702c3e9e6e2a7b8f1cbApprove130831732021-11-30 18:28:562 days 19 hrs ago0xeab064729b60a7d3adaf3a22eef8250303983dce IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0xf344e434cd25b590b2f1a5d63af9dda8641842bf86797c12e994f40825ab6c98Approve130723662021-11-30 8:50:383 days 5 hrs ago0x56ec1e76c44f6d2c4bb477dec447f0169188816e IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x6836bad9555cb308c5848323d7bef63afbaad41e0faba8f043494113a8e494d7Approve130534072021-11-29 15:45:523 days 22 hrs ago0xaf09c4dbdc7fd68f2fa86f76ab023f97b021ad37 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000072985
0x9b0bd5f7d8f38bee2b7b071b999ffdb4eac2f256b7fd5f9883f01a767f2da714Approve130520612021-11-29 14:32:513 days 23 hrs ago0x343c4ed15bbd868c1e22a90d5591383c5638ba51 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000312039
0x9cad896320675fec52754cd1a74351e45c85e988deb313d895efc2a20982855dApprove130515722021-11-29 14:07:094 days 6 mins ago0x6e793c4c10d4cd09e30c995d28684169f13c7b58 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x498a61cc5791a50ffd58b7ae2fea9c7041133d2c6951cc71aff9fd33ef1603eeApprove130391592021-11-29 2:26:514 days 11 hrs ago0x45ec29f6a3dcf905b79ea6a92ca43d570a948eda IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x81cdc1df195d0fcb0b675488d823144bc07093c03a1c4bdb310f00445038ca59Approve130388912021-11-29 2:12:474 days 12 hrs ago0x93d404c077bae4716cc22b574b910a3c1348f046 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x297a1b563b01f0e57c29a68dcf73afb8b3a93e29aea382073fdf0d80a33621a8Approve130363742021-11-28 23:55:554 days 14 hrs ago0x56772e29f3fe19039b3b7573d1133f67c1069acb IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0x5dd4852a98790f2d8180f66aa0d33fbd8179db930eefc0b783a0c961c9d8536bApprove130305472021-11-28 18:43:514 days 19 hrs ago0x533db8e55d6df44e5a3ac8b2701509d9a731a281 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0xf8550bd2396b619efeb7652001121c57cb7b170399e4e5ff467a9bf7728721bcApprove130229162021-11-28 11:48:435 days 2 hrs ago0x622d6b7121a491161646762c2c589de7e5407257 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222825
0x4d633ec192b418f5f1a97253999e30c29fae7e9995138b8bc6f4920085fe882cApprove130218282021-11-28 10:49:585 days 3 hrs ago0x622d6b7121a491161646762c2c589de7e5407257 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
0xba4f022a7559be7c0623d39f4a6321063800668d144d96a0c20bccc7fd6d372bTransfer130076952021-11-27 22:18:115 days 15 hrs ago0xb80242082f8c543c7d156840e097bfeb0ce23e54 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.004844485
0x7385c203eb32e34edc79f2a0a3a3ee6c659e77982ef12cfa5d1323405576d01fTransfer130064302021-11-27 21:11:535 days 17 hrs ago0x06f250bf854f669b39b0d383c54785ca0d23891c IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.005121015
0x7da22f887b8c3a73ec96ef81cd0eacebcfc8e381a0a83a25b4368cff41b0b2bcApprove129996722021-11-27 15:09:015 days 23 hrs ago0xaf09c4dbdc7fd68f2fa86f76ab023f97b021ad37 IN  0xeaae0e8369333c7aa9463ef09290f4c5629661570 BNB0.000222885
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x4ecb717618801537ac6abf962d1420d74fac2d904c464f877b59fca265acbb44103728312021-08-26 18:29:1798 days 19 hrs ago 0xeaae0e8369333c7aa9463ef09290f4c562966157  Contract Creation0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
InfinityMoney3

Compiler Version
v0.8.5+commit.a4f2e591

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 10 : InfinityMoney.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.5;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

import "./Authorized.sol";
import "./IPancake.sol";
import "./StakeController.sol";

contract InfinityMoney3 is Authorized, ERC20 {
  address constant DEAD = 0x000000000000000000000000000000000000dEaD;
  address constant ZERO = 0x0000000000000000000000000000000000000000;
  address constant BUSD = 0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56;
  address constant WBNB = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c;

  string constant _name = "Infinity Money V3";
  string constant _symbol = "IFMv3";

  // Token supply control
  uint8 constant decimal = 18;
  uint8 constant decimalBUSD = 18;  
  uint256 constant maxSupply = 39_000_000 * (10 ** decimal);
  
  uint256 public _maxTxAmount = 100_000 * (10 ** decimal);
  uint256 public _maxAccountAmount = 500_000 * (10 ** decimal);
  uint256 public totalBurned;

  // Fees
  uint256 public feeStake = 800;  // 8%
  uint256 public feeMarketingWallet = 50; // 0.5%
  uint256 public feeAdministrationWallet = 50; // 0.5%
  uint256 public feeInvestingWallet = 50; // 0.5%
  uint256 public feeStakerWallet = 50; // 0.5%

  uint256 public feePool = 200; // 2%

  bool internal pausedToken = false;
  bool internal pausedStake = false;

  mapping (address => bool) public exemptOperatePausedToken;

  // special wallet permissions
  mapping (address => bool) public exemptFee;
  mapping (address => bool) public exemptTxLimit;
  mapping (address => bool) public exemptAmountLimit;
  mapping (address => bool) public exemptStaker;
  mapping (address => bool) public exemptDistributionMaker;

  // trading pairs
  address[] public liquidityPool;

  address public marketingWallet;
  address public administrationWallet;
  address public investingWallet;
  address public stakerWallet;

  StakeController private stakeController;

  address WBNB_BUSD_PAIR = 0x58F876857a02D6762E0101bb5C46A8c1ED44Dc16;
  address WBNB_IFMT_PAIR;

  bool private _noReentrancy = false;

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

  function getFeeTotal() public view returns(uint256) { return feeStake + feePool + feeMarketingWallet + feeAdministrationWallet + feeInvestingWallet + feeStakerWallet; }

  function togglePauseToken(bool pauseState) external isAuthorized(0) { pausedToken = pauseState; }

  function togglePauseStake(bool pauseState) external isAuthorized(0) { pausedStake = pauseState; }

  function getStakeControllerAddress() external view returns(address) { return address(stakeController); }

  function setFees(uint256 stake, uint256 pool) external isAuthorized(1) {
    feeStake = stake;
    feePool = pool;
    stakeController.setFeeStake(stake);
  }

  function setFeesDirectWallet(uint256 marketing, uint256 administration, uint256 investing, uint256 staker) external isAuthorized(1) {
    feeMarketingWallet = marketing;
    feeAdministrationWallet = administration;
    feeInvestingWallet = investing;
    feeStakerWallet = staker;

    stakeController.setFeesDirectWallet(marketing, administration, investing, staker);
  }

  function setMaxTxAmountWithDecimals(uint256 decimalAmount) public isAuthorized(1) {
    require(decimalAmount <= maxSupply, "Amount is bigger then maximum supply token");
    _maxTxAmount = decimalAmount;
  }

  function setMaxTxAmount(uint256 amount) external isAuthorized(1) { setMaxTxAmountWithDecimals(amount * (10 ** decimal)); }

  function setMaxAccountAmountWithDecimals(uint256 decimalAmount) public isAuthorized(1) {
    require(decimalAmount <= maxSupply, "Amount is bigger then maximum supply token");
    _maxAccountAmount = decimalAmount;
  }

  function setMaxAccountAmount(uint256 amount) external isAuthorized(1) { setMaxAccountAmountWithDecimals(amount * (10 ** decimal)); }

  // Excempt Controllers
  function setExemptOperatePausedToken(address account, bool operation) public isAuthorized(0) {exemptOperatePausedToken[account] = operation; }
  function setExemptFee(address account, bool operation) public isAuthorized(2) { exemptFee[account] = operation; }
  function setExemptTxLimit(address account, bool operation) public isAuthorized(2) { exemptTxLimit[account] = operation; }
  function setExemptAmountLimit(address account, bool operation) public isAuthorized(2) { exemptAmountLimit[account] = operation; }
  function setExemptStaker(address account, bool operation) public isAuthorized(2) { exemptStaker[account] = operation; }
  function setExemptDistributionMaker(address account, bool operation) public isAuthorized(2) { exemptDistributionMaker[account] = operation; }

  // Special Wallets
  function setMarketingWallet(address account) public isAuthorized(0) { marketingWallet = account; stakeController.setMarketingWallet(account); }
  function setAdministrationWallet(address account) public isAuthorized(0) { administrationWallet = account; stakeController.setAdministrationWallet(account); }
  function setInvestingWallet(address account) public isAuthorized(0) { investingWallet = account; stakeController.setInvestingWallet(account); }
  function setStakerWallet(address account) public isAuthorized(0) { stakerWallet = account; stakeController.setStakerWallet(account); }
  
  receive() external payable { }
  constructor()ERC20(_name, _symbol) {
    PancakeRouter router = PancakeRouter(0x10ED43C718714eb63d5aA57B78B54704E256024E);
    WBNB_IFMT_PAIR = address(PancakeFactory(router.factory()).createPair(WBNB, address(this)));

    // Liquidity pair
    liquidityPool.push(WBNB_IFMT_PAIR);
    exemptAmountLimit[WBNB_IFMT_PAIR] = true;
    exemptTxLimit[WBNB_IFMT_PAIR] = true;
    exemptStaker[WBNB_IFMT_PAIR] = true;
    
    // Token address
    exemptFee[address(this)] = true;
    exemptTxLimit[address(this)] = true;
    exemptAmountLimit[address(this)] = true;
    exemptStaker[address(this)] = true;

    // DEAD Waller
    exemptTxLimit[DEAD] = true;
    exemptAmountLimit[DEAD] = true;
    exemptStaker[DEAD] = true;

    // Zero Waller
    exemptTxLimit[ZERO] = true;
    exemptAmountLimit[ZERO] = true;
    exemptStaker[ZERO] = true;

    //Owner wallet
    address ownerWallet = _msgSender();
    exemptFee[ownerWallet] = true;
    exemptTxLimit[ownerWallet] = true;
    exemptAmountLimit[ownerWallet] = true;
    exemptStaker[ownerWallet] = true;
    exemptOperatePausedToken[ownerWallet] = true;
    exemptDistributionMaker[ownerWallet] = true;
    
    marketingWallet = 0x0059E35b0AAc0CaDe82BFE3072a31D05456a2Ab7;
    administrationWallet = 0x3167b970970D56df01bE37AD54d44bb93aDab779;
    investingWallet = 0xd4a4BfB20c12E851009a8a971aaED540eE1040c0;
    stakerWallet = 0x1c568A5a23eCCB8F9cF8340eD032aF3928823369;

    exemptFee[marketingWallet] = true;
    exemptTxLimit[marketingWallet] = true;
    exemptAmountLimit[marketingWallet] = true;

    exemptFee[administrationWallet] = true;
    exemptTxLimit[administrationWallet] = true;
    exemptAmountLimit[administrationWallet] = true;

    exemptFee[investingWallet] = true;
    exemptTxLimit[investingWallet] = true;
    exemptAmountLimit[investingWallet] = true;

    exemptFee[stakerWallet] = true;
    exemptTxLimit[stakerWallet] = true;
    exemptAmountLimit[stakerWallet] = true;

    stakeController = new StakeController();
    stakeController.safeApprove(WBNB, address(this), type(uint256).max);

    _mint(ownerWallet, maxSupply);

    pausedToken = true;
  }

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

  function _mint(address account, uint256 amount) internal override {
    require(maxSupply >= ERC20.totalSupply() + amount && maxSupply >= amount, "Maximum supply already minted");
    super._mint(account, amount);
  }

  function _beforeTokenTransfer( address from, address, uint256 amount ) internal view override {
    require(amount <= _maxTxAmount || exemptTxLimit[from], "Excedded the maximum transaction limit");
    require(!pausedToken || exemptOperatePausedToken[from], "Token is paused");
  }

  function _afterTokenTransfer( address, address to, uint256 ) internal view override {
    require(_balances[to] <= _maxAccountAmount || exemptAmountLimit[to], "Excedded the maximum tokens that an wallet can hold");
  }

  function _transfer( address sender, address recipient,uint256 amount ) internal override {
    require(!_noReentrancy, "ReentrancyGuard: reentrant call happens");
    _noReentrancy = true;
    
    require(sender != address(0) && recipient != address(0), "transfer from the zero address");
    
    _beforeTokenTransfer(sender, recipient, amount);

    uint256 senderBalance = _balances[sender];
    require(senderBalance >= amount, "transfer amount exceeds your balance");
    uint256 newSenderBalance = senderBalance - amount;
    _balances[sender] = newSenderBalance;

    uint256 feeAmount = 0;
    if (!exemptFee[sender]) feeAmount = (getFeeTotal() * amount) / 10000;

    bool updateStakeRegistration = exchangeFeeParts(feeAmount);
    uint256 newRecipentAmount = _balances[recipient] + (amount - feeAmount);
    _balances[recipient] = newRecipentAmount;
    bool executeDistribution = !exemptDistributionMaker[sender];
    stakeController.updateHolders( walletHolder(sender), walletHolder(recipient), newSenderBalance, newRecipentAmount, updateStakeRegistration, executeDistribution);

    _afterTokenTransfer(sender, recipient, amount);

    _noReentrancy = false;
    emit Transfer(sender, recipient, amount);
  }

  function exchangeFeeParts(uint256 incomingFeeTokenAmount) private returns (bool){
    if (incomingFeeTokenAmount == 0) return false;
    _balances[address(this)] += incomingFeeTokenAmount;
    
    address pairWbnbIfmt = WBNB_IFMT_PAIR;
    if (_msgSender() == pairWbnbIfmt || pausedStake) return false;
    uint256 feeTokenAmount = _balances[address(this)];
    _balances[address(this)] = 0;

    // Gas optimization
    address wbnbAddress = WBNB;
    (uint112 reserve0, uint112 reserve1) = getTokenReserves(pairWbnbIfmt);
    bool reversed = isReversed(pairWbnbIfmt, wbnbAddress);
    if (reversed) { uint112 temp = reserve0; reserve0 = reserve1; reserve1 = temp; }
    _balances[pairWbnbIfmt] += feeTokenAmount;
    address stakeControllerAddress = address(stakeController);
    uint256 wbnbBalanceBefore = getTokenBalanceOf(wbnbAddress, stakeControllerAddress);
    uint256 wbnbAmount = getAmountOut(feeTokenAmount, reserve1, reserve0);
    swapToken(pairWbnbIfmt, reversed ? 0 : wbnbAmount, reversed ? wbnbAmount : 0, stakeControllerAddress);
    uint256 wbnbBalanceNew = getTokenBalanceOf(wbnbAddress, stakeControllerAddress);  
    require(wbnbBalanceNew == wbnbBalanceBefore + wbnbAmount, "Wrong amount of swapped on WBNB");
    // Deep Stack problem avoid
    {
      // Gas optimization
      address busdAddress = BUSD;
      address pairWbnbBusd = WBNB_BUSD_PAIR;
      (reserve0, reserve1) = getTokenReserves(pairWbnbBusd);
      reversed = isReversed(pairWbnbBusd, wbnbAddress);
      if (reversed) { uint112 temp = reserve0; reserve0 = reserve1; reserve1 = temp; }

      uint256 busdBalanceBefore = getTokenBalanceOf(busdAddress, address(this));
      tokenTransferFrom(wbnbAddress, stakeControllerAddress, pairWbnbBusd, wbnbAmount);
      uint256 busdAmount = getAmountOut(wbnbAmount, reserve0, reserve1);
      swapToken(pairWbnbBusd, reversed ? busdAmount : 0, reversed ? 0 : busdAmount, address(this));
      uint256 busdBalanceNew = getTokenBalanceOf(busdAddress, address(this));
      require(busdBalanceNew == busdBalanceBefore + busdAmount, "Wrong amount swapped on BUSD");

      uint256 amountToStake = feeMarketingWallet + feeAdministrationWallet + feeInvestingWallet +  feeStakerWallet + feeStake;
      if (amountToStake > 0) tokenTransfer(busdAddress, stakeControllerAddress, (busdAmount * amountToStake) / getFeeTotal());
    }
    return true;
  }

  function buyBackAndHold(uint256 amount, address receiver) external isAuthorized(3) { buyBackAndHoldWithDecimals(amount * (10 ** decimalBUSD), receiver); }

  function buyBackAndHoldWithDecimals(uint256 decimalAmount, address receiver) public isAuthorized(3) { buyBackWithDecimals(decimalAmount, receiver); }

  function buyBackAndBurn(uint256 amount) external isAuthorized(3) { buyBackAndBurnWithDecimals(amount * (10 ** decimalBUSD)); }

  function buyBackAndBurnWithDecimals(uint256 decimalAmount) public isAuthorized(3) { buyBackWithDecimals(decimalAmount, address(0)); }

  function buyBackWithDecimals(uint256 decimalAmount, address destAddress) private {
    uint256 maxBalance = getTokenBalanceOf(BUSD, address(this));
    if (maxBalance < decimalAmount) revert(string(abi.encodePacked("insufficient BUSD amount[", Strings.toString(decimalAmount), "] on contract[", Strings.toString(maxBalance), "]")));

    (uint112 reserve0,uint112 reserve1) = getTokenReserves(WBNB_BUSD_PAIR);
    bool reversed = isReversed(WBNB_BUSD_PAIR, BUSD);
    if (reversed) { uint112 temp = reserve0; reserve0 = reserve1; reserve1 = temp; }

    tokenTransfer(BUSD, WBNB_BUSD_PAIR, decimalAmount);
    uint256 wbnbAmount = getAmountOut(decimalAmount, reserve0, reserve1);
    swapToken(WBNB_BUSD_PAIR, reversed ? wbnbAmount : 0, reversed ? 0 : wbnbAmount, address(this));

    bool previousExemptFeeState = exemptFee[WBNB_IFMT_PAIR];
    exemptFee[WBNB_IFMT_PAIR] = true;
    
    address pairWbnbIfmt = WBNB_IFMT_PAIR;
    address stakeControllerAddress = address(stakeController);
    (reserve0, reserve1) = getTokenReserves(pairWbnbIfmt);
    reversed = isReversed(pairWbnbIfmt, WBNB);
    if (reversed) { uint112 temp = reserve0; reserve0 = reserve1; reserve1 = temp; }

    tokenTransfer(WBNB, pairWbnbIfmt, wbnbAmount);
    
    uint256 ifmtAmount = getAmountOut(wbnbAmount, reserve0, reserve1);
    if (destAddress == address(0)) {
      swapToken(pairWbnbIfmt, reversed ? ifmtAmount : 0, reversed ? 0 : ifmtAmount, stakeControllerAddress);
      _burn(stakeControllerAddress, ifmtAmount);
      totalBurned += ifmtAmount;
    } else {
      swapToken(pairWbnbIfmt, reversed ? ifmtAmount : 0, reversed ? 0 : ifmtAmount, destAddress);
      stakeController.updateHolders( walletHolder(destAddress), address(0x00), ifmtAmount, 0, false, false);
    }
    exemptFee[WBNB_IFMT_PAIR] = previousExemptFeeState;
  }
 
  function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) internal pure returns (uint256 amountOut) {
    require(amountIn > 0, 'Insufficient amount in');
    require(reserveIn > 0 && reserveOut > 0, 'Insufficient liquidity');
    uint256 amountInWithFee = amountIn * 9975;
    uint256 numerator = amountInWithFee  * reserveOut;
    uint256 denominator = (reserveIn * 10000) + amountInWithFee;
    amountOut = numerator / denominator;
  }

  // gas optimization on get Token0 from a pair liquidity pool
  function isReversed(address pair, address tokenA) internal view returns (bool) {
    address token0;
    bool failed = false;
    assembly {
      let emptyPointer := mload(0x40)
      mstore(emptyPointer, 0x0dfe168100000000000000000000000000000000000000000000000000000000)
      failed := iszero(staticcall(gas(), pair, emptyPointer, 0x04, emptyPointer, 0x20))
      token0 := mload(emptyPointer)
    }
    if (failed) revert(string(abi.encodePacked("Unable to check direction of token ", Strings.toHexString(uint160(tokenA), 20) ," from pair ", Strings.toHexString(uint160(pair), 20))));
    return token0 != tokenA;
  }

  // gas optimization on transfer token
  function tokenTransfer(address token, address recipient, uint256 amount) internal {
    bool failed = false;
    assembly {
      let emptyPointer := mload(0x40)
      mstore(emptyPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
      mstore(add(emptyPointer, 0x04), recipient)
      mstore(add(emptyPointer, 0x24), amount)
      failed := iszero(call(gas(), token, 0, emptyPointer, 0x44, 0, 0))
    }
    if (failed) revert(string(abi.encodePacked("Unable to transfer ", Strings.toString(amount), " of token [", Strings.toHexString(uint160(token), 20) ,"] to address ", Strings.toHexString(uint160(recipient), 20))));
  }

  // gas optimization on transfer from token method
  function tokenTransferFrom(address token, address from, address recipient, uint256 amount) internal {
    bool failed = false;
    assembly {
      let emptyPointer := mload(0x40)
      mstore(emptyPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
      mstore(add(emptyPointer, 0x04), from)
      mstore(add(emptyPointer, 0x24), recipient)
      mstore(add(emptyPointer, 0x44), amount)
      failed := iszero(call(gas(), token, 0, emptyPointer, 0x64, 0, 0)) 
    }
    if (failed) revert(string(abi.encodePacked("Unable to transfer from [", Strings.toHexString(uint160(from), 20)  ,"] ", Strings.toString(amount), " of token [", Strings.toHexString(uint160(token), 20) ,"] to address ", Strings.toHexString(uint160(recipient), 20))));
  }

  // gas optimization on swap operation using a liquidity pool
  function swapToken(address pair, uint amount0Out, uint amount1Out, address receiver) internal {
    bool failed = false;
    assembly {
      let emptyPointer := mload(0x40)
      mstore(emptyPointer, 0x022c0d9f00000000000000000000000000000000000000000000000000000000)
      mstore(add(emptyPointer, 0x04), amount0Out)
      mstore(add(emptyPointer, 0x24), amount1Out)
      mstore(add(emptyPointer, 0x44), receiver)
      mstore(add(emptyPointer, 0x64), 0x80)
      mstore(add(emptyPointer, 0x84), 0)
      failed := iszero(call(gas(), pair, 0, emptyPointer, 0xa4, 0, 0))
    }
    if (failed) revert(string(abi.encodePacked("Unable to swap ", Strings.toString(amount0Out == 0 ? amount1Out : amount0Out), " on Pain [", Strings.toHexString(uint160(pair), 20)  ,"] to receiver ", Strings.toHexString(uint160(receiver), 20) )));
  }

  // gas optimization on get balanceOf fron BEP20 or ERC20 token
  function getTokenBalanceOf(address token, address holder) internal view returns (uint112 tokenBalance) {
    bool failed = false;
    assembly {
      let emptyPointer := mload(0x40)
      mstore(emptyPointer, 0x70a0823100000000000000000000000000000000000000000000000000000000)
      mstore(add(emptyPointer, 0x04), holder)
      failed := iszero(staticcall(gas(), token, emptyPointer, 0x24, emptyPointer, 0x40))
      tokenBalance := mload(emptyPointer)
    }
    if (failed) revert(string(abi.encodePacked("Unable to get balance from wallet [", Strings.toHexString(uint160(holder), 20) ,"] of token [", Strings.toHexString(uint160(token), 20) ,"] ")));
  }

  // gas optimization on get reserves from liquidity pool
  function getTokenReserves(address pairAddress) internal view returns (uint112 reserve0, uint112 reserve1) {
    bool failed = false;
    assembly {
      let emptyPointer := mload(0x40)
      mstore(emptyPointer, 0x0902f1ac00000000000000000000000000000000000000000000000000000000)
      failed := iszero(staticcall(gas(), pairAddress, emptyPointer, 0x4, emptyPointer, 0x40))
      reserve0 := mload(emptyPointer)
      reserve1 := mload(add(emptyPointer, 0x20))
    }
    if (failed) revert(string(abi.encodePacked("Unable to get reserves from pair [", Strings.toHexString(uint160(pairAddress), 20), "]")));
  }

  function walletHolder(address account) private view returns (address holder) {
    return exemptStaker[account] ? address(0x00) : account;
  }

  function setWBNB_IFMT_PAIR(address newPair) external isAuthorized(0) { WBNB_IFMT_PAIR = newPair; }
  function setWBNB_BUSD_Pair(address newPair) external isAuthorized(0) { WBNB_BUSD_PAIR = newPair; }
  function getWBNB_IFMT_PAIR() external view returns(address) { return WBNB_IFMT_PAIR; }
  function getWBNB_BUSD_Pair() external view returns(address) { return WBNB_BUSD_PAIR; }

  // StakeController Controlled Methods
  function setMinTokenHoldToStake(uint256 amount) external isAuthorized(3) { stakeController.setMinTokenHoldToStake(amount * (10 ** decimal)); }
  function setMinTokenHoldToStakeOnDecimal(uint256 amount) external isAuthorized(3) { stakeController.setMinTokenHoldToStake(amount); }
  function setMinBUSDToDistribute(uint256 amount) external isAuthorized(3) { stakeController.setMinBUSDToDistribute(amount* (10 ** decimalBUSD)); }
  function setMinBUSDToDistributeOnDecimal(uint256 amount) external isAuthorized(3) { stakeController.setMinBUSDToDistribute(amount); }
  function setMinBUSDToReceive(uint256 amount) external isAuthorized(3) { stakeController.setMinBUSDToReceive(amount* (10 ** decimal)); }
  function setMinBUSDToReceiveOnDecimal(uint256 amount) external isAuthorized(3) { stakeController.setMinBUSDToReceive(amount); }
  function setMinDelayOnEachStake(uint256 secondsAmount) external isAuthorized(0) { stakeController.setMinDelayOnEachStake(secondsAmount); }
  function setGasLimiter(uint256 newGasLimit) external isAuthorized(0) { stakeController.setGasLimiter(newGasLimit); }
  function stakeControllerSafeApprove(address token, address spender, uint256 amount) external isAuthorized(0) { stakeController.safeApprove(token, spender, amount); }
  function stakeControllerSafeWithdraw() external isAuthorized(0) { stakeController.safeWithdraw(); }
  function distributeStake() external isAuthorized(3) { stakeController.distributeStake(true); }

  // StakeController Public Methods
  function claimDistribution(address receiver) public { 
    require((!pausedToken && !pausedStake) || exemptOperatePausedToken[receiver], "Token is paused");
    stakeController.claimDistribution(receiver, true);
  }
  function getPedingStakeToReceive(address holder) public view { stakeController.getPedingStakeToReceive(holder); }

}

File 2 of 10 : ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) internal _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

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

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 3 of 10 : Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 4 of 10 : Authorized.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.5;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract Authorized is Ownable {
  mapping(uint8 => mapping(address => bool)) public permissions;
  string[] public permissionIndex;

  constructor() {
    permissionIndex.push("admin");
    permissionIndex.push("financial");
    permissionIndex.push("controller");
    permissionIndex.push("operator");

    permissions[0][_msgSender()] = true;
  }

  modifier isAuthorized(uint8 index) {
    if (!permissions[index][_msgSender()]) {
      revert(string(abi.encodePacked("Account ",Strings.toHexString(uint160(_msgSender()), 20)," does not have ", permissionIndex[index], " permission")));
    }
    _;
  }

  function safeApprove(address token, address spender, uint256 amount) external isAuthorized(0) {
    ERC20(token).approve(spender, amount);
  }

  function safeWithdraw() external isAuthorized(0) {
    uint256 contractBalance = address(this).balance;
    payable(_msgSender()).transfer(contractBalance);
  }

  function grantPermission(address operator, uint8[] memory grantedPermissions) external isAuthorized(0) {
    for (uint8 i = 0; i < grantedPermissions.length; i++) permissions[grantedPermissions[i]][operator] = true;
  }

  function revokePermission(address operator, uint8[] memory revokedPermissions) external isAuthorized(0) {
    for (uint8 i = 0; i < revokedPermissions.length; i++) permissions[revokedPermissions[i]][operator]  = false;
  }

  function grantAllPermissions(address operator) external isAuthorized(0) {
    for (uint8 i = 0; i < permissionIndex.length; i++) permissions[i][operator]  = true;
  }

  function revokeAllPermissions(address operator) external isAuthorized(0) {
    for (uint8 i = 0; i < permissionIndex.length; i++) permissions[i][operator]  = false;
  }

}

File 5 of 10 : IPancake.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.5;
interface PancakeFactory {
  function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface PancakeRouter {
  function factory() external pure returns (address);
}

File 6 of 10 : StakeController.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.5;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract StakeController is Ownable {

  struct HolderShare {
    uint256 amountToken;
    uint256 totalReceived;
    uint256 pendingReceive;
    uint256 entryPointMarkup;
    uint256 arrayIndex;
    uint256 receivedAt;
  }

  address constant public BUSD = 0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56;

  uint8 constant internal tokenDecimal = 18;
  uint8 constant internal busdDecimal = 18;
  
  uint256 public minTokenHoldToStake = 1_000 * (10 ** tokenDecimal); // min holder must have to be able to receive stakes
  uint256 public minBUSDToDistribute = 1000 * (10 ** busdDecimal); // min acumulated BUSD before execute a distribution
  uint256 public minBUSDToReceive = 1 * (10 ** busdDecimal); // min BUSD each user shoud acumulate of stake before receive it.
  uint256 public minDelayOnEachStake = 1 hours;

  mapping(address => HolderShare) public holderMap;

  address[] private _holders;
  uint256 private _holdersIndex;

  uint256 private stakePrecision = 10 ** 18;
  uint256 private stakePerShare;

  uint256 public totalBUSDStaked;
  uint256 public totalBUSDDistributed;
  uint256 public totalTokens;
  uint256 public gasLimiter = 800_000;

  uint256 public feeStake = 800;  // 8%
  uint256 public feeMarketingWallet = 50; // 0.5%
  uint256 public feeAdministrationWallet = 50; // 0.5%
  uint256 public feeInvestingWallet = 50; // 0.5%
  uint256 public feeStakerWallet = 50; // 0.5%

  address public marketingWallet;
  address public administrationWallet;
  address public investingWallet;
  address public stakerWallet;

  constructor() {
    marketingWallet = 0x0059E35b0AAc0CaDe82BFE3072a31D05456a2Ab7;
    administrationWallet = 0x3167b970970D56df01bE37AD54d44bb93aDab779;
    investingWallet = 0xd4a4BfB20c12E851009a8a971aaED540eE1040c0;
    stakerWallet = 0x1c568A5a23eCCB8F9cF8340eD032aF3928823369;
  }

  function setMinTokenHoldToStake(uint256 amount) external onlyOwner { minTokenHoldToStake = amount; }

  function setMinBUSDToDistribute(uint256 amount) external onlyOwner { minBUSDToDistribute = amount; }

  function setMinBUSDToReceive(uint256 amount) external onlyOwner { minBUSDToReceive = amount; }

  function setMinDelayOnEachStake(uint256 secondsAmount) external onlyOwner { minDelayOnEachStake = secondsAmount; }

  function setGasLimiter(uint256 newLimit) external onlyOwner { gasLimiter = newLimit; }

  function safeApprove(address token, address spender, uint256 amount) external onlyOwner { ERC20(token).approve(spender, amount); }

  function safeWithdraw() external onlyOwner { payable(_msgSender()).transfer(address(this).balance); }

  function setFeesDirectWallet(uint256 marketing, uint256 administration, uint256 investing, uint256 staker) external onlyOwner {
    feeMarketingWallet = marketing;
    feeAdministrationWallet = administration;
    feeInvestingWallet = investing;
    feeStakerWallet = staker;
  }
  function setFeeStake(uint256 fee) external onlyOwner { feeStake = fee; }
  function setMarketingWallet(address value) external onlyOwner { marketingWallet = value; }
  function setAdministrationWallet(address value) external onlyOwner { administrationWallet = value; }
  function setInvestingWallet(address value) external onlyOwner { investingWallet = value; }
  function setStakerWallet(address value) external onlyOwner { stakerWallet = value; }

  function updateHolders(address sender, address receiver, uint256 senderAmount, uint256 receiverAmount, bool updateStakeRegistration, bool makeDistribution) external onlyOwner {
    _updateHolder(sender, senderAmount);
    if (updateStakeRegistration) registerStake();
    _updateHolder(receiver, receiverAmount);
    if (makeDistribution) distributeStake(false);
  }

  function _updateHolder(address holder, uint256 amount) private {
    if ( holder == address(0x00) ) return;

    // If holder has less than minTokenHoldToStake, then he does not participate on staking
    uint256 consideratedAmount = minTokenHoldToStake > amount ? 0 : amount;
    calculateDistribution(holder);

    uint256 holderAmount = holderMap[holder].amountToken;
    if (consideratedAmount > 0 && holderAmount == 0 ) {
      addToHoldersList(holder);
    } else if (consideratedAmount == 0 && holderAmount > 0) {
      removeFromHoldersList(holder);
    }

    totalTokens = (totalTokens - holderAmount) + consideratedAmount;
    holderMap[holder].amountToken = consideratedAmount;
    holderMap[holder].entryPointMarkup = (consideratedAmount * stakePerShare) / stakePrecision;
  }

  function calculateDistribution(address holder) private {
    if (holderMap[holder].amountToken == 0) return;

    uint256 entryPointMarkup = holderMap[holder].entryPointMarkup;
    uint256 totalToBePaid = (holderMap[holder].amountToken * stakePerShare) / stakePrecision;

    if(totalToBePaid <= entryPointMarkup) return;
    holderMap[holder].pendingReceive += totalToBePaid - entryPointMarkup;
    holderMap[holder].entryPointMarkup = totalToBePaid;
  }

  function getPedingStakeToReceive(address holder) external view onlyOwner returns (uint256 pending) {
    if (holderMap[holder].amountToken == 0) return 0;

    uint256 entryPointMarkup = holderMap[holder].entryPointMarkup;
    uint256 totalToBePaid = (holderMap[holder].amountToken * stakePerShare) / stakePrecision;

    if(totalToBePaid <= entryPointMarkup) return holderMap[holder].pendingReceive;  
    return holderMap[holder].pendingReceive + totalToBePaid - entryPointMarkup;
  }

  function addToHoldersList(address holder) private {
    holderMap[holder].arrayIndex = _holders.length;
    _holders.push(holder);
  }

  function removeFromHoldersList(address holder) private {
    address lastHolder = _holders[_holders.length - 1];
    uint256 holderIndexRemoved = holderMap[holder].arrayIndex;
    _holders[holderIndexRemoved] = lastHolder;
    _holders.pop();
    holderMap[lastHolder].arrayIndex = holderIndexRemoved;
    holderMap[holder].arrayIndex = 0;
  }

  function registerStake() public onlyOwner {
    uint256 balance = ERC20(BUSD).balanceOf(address(this));
    uint256 incomingAmount = (balance + totalBUSDDistributed) - totalBUSDStaked;
    if (incomingAmount > 0) {
      totalBUSDStaked += incomingAmount;

      // gas optimisation
      uint256 feeMarketingWalletMem = feeMarketingWallet;
      uint256 feeAdministrationWalletMem = feeAdministrationWallet;
      uint256 feeInvestingWalletMem = feeInvestingWallet;
      uint256 feeStakerWalletMem = feeStakerWallet;
      address marketingWalletMem = marketingWallet;
      address administrationWalletMem = administrationWallet;
      address investingWalletMem = investingWallet;
      address stakerWalletMem = stakerWallet;
      
      uint256 totalFeeParts = feeStake;
      if (feeMarketingWalletMem > 0 && marketingWalletMem != address(0)) totalFeeParts += feeMarketingWalletMem;
      if (feeAdministrationWalletMem > 0 && administrationWalletMem != address(0)) totalFeeParts += feeAdministrationWalletMem;
      if (feeInvestingWalletMem > 0 && investingWalletMem != address(0)) totalFeeParts += feeInvestingWalletMem;
      if (feeStakerWalletMem > 0 && stakerWalletMem != address(0)) totalFeeParts += feeStakerWalletMem;

      if (feeMarketingWalletMem > 0 && marketingWalletMem != address(0)) holderMap[marketingWalletMem].pendingReceive += (incomingAmount * feeMarketingWalletMem) / totalFeeParts;
      if (feeAdministrationWalletMem > 0 && administrationWalletMem != address(0)) holderMap[administrationWalletMem].pendingReceive += (incomingAmount * feeAdministrationWalletMem) / totalFeeParts;
      if (feeInvestingWalletMem > 0 && investingWalletMem != address(0)) holderMap[investingWalletMem].pendingReceive += (incomingAmount * feeInvestingWalletMem) / totalFeeParts;
      if (feeStakerWalletMem > 0 && stakerWalletMem != address(0)) holderMap[stakerWalletMem].pendingReceive += (incomingAmount * feeStakerWalletMem) / totalFeeParts;

      uint256 stakeAmount = (incomingAmount * feeStake) / totalFeeParts;
      stakePerShare += (stakeAmount * stakePrecision) / totalTokens;
    }
  }

  function claimDistribution(address receiver, bool forced) public onlyOwner {
    calculateDistribution(receiver);

    uint256 pendingToReceive = holderMap[receiver].pendingReceive;
    if (pendingToReceive < minBUSDToReceive || (holderMap[receiver].receivedAt + minDelayOnEachStake) > block.timestamp) {
      if (forced) revert("Not enogth BUSD to receive or it was called faster than minimum interval to receive stakes.");
      return;
    }

    totalBUSDDistributed += pendingToReceive;
    ERC20(BUSD).transfer(receiver, holderMap[receiver].pendingReceive);

    holderMap[receiver].totalReceived += holderMap[receiver].pendingReceive;
    holderMap[receiver].pendingReceive = 0;
    holderMap[receiver].receivedAt = block.timestamp;
  }

  function distributeStake(bool forced) public onlyOwner {
    if(_holders.length == 0) return;
    uint256 currentBalance = ERC20(BUSD).balanceOf(address(this));
    if (minBUSDToDistribute > currentBalance) {
      if (forced) revert(string(abi.encodePacked("To distribute, the stake controller should have at least ", Strings.toString(minBUSDToDistribute), " BUSD. it Has ", Strings.toString(currentBalance) )));
      return;
    }
    if (forced) registerStake();
    
    uint256 gasLeft = gasleft();
    uint256 gasUsed;

    uint256 iterations = 0;
    uint256 index = _holdersIndex;
    uint256 holdersLength = _holders.length;
    uint256 maxGasBeUsed = gasLimiter;

    while(gasUsed < maxGasBeUsed && iterations < holdersLength) {
      if(index >= holdersLength) {
        _holdersIndex = 0;
        index = 0;
      }

      claimDistribution(_holders[index], false);
      gasUsed += gasLeft - gasleft();
      gasLeft = gasleft();
          
      index ++;
      _holdersIndex = index;
      iterations++;
    }
  }
}

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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 8 of 10 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 9 of 10 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 9999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

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":[{"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"},{"inputs":[],"name":"_maxAccountAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"administrationWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyBackAndBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"decimalAmount","type":"uint256"}],"name":"buyBackAndBurnWithDecimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"buyBackAndHold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"decimalAmount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"buyBackAndHoldWithDecimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"claimDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptAmountLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptDistributionMaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptOperatePausedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptStaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptTxLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAdministrationWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeInvestingWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeMarketingWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeStakerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getPedingStakeToReceive","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakeControllerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWBNB_BUSD_Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWBNB_IFMT_PAIR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"grantAllPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint8[]","name":"grantedPermissions","type":"uint8[]"}],"name":"grantPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"investingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidityPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"permissionIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"permissions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"revokeAllPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint8[]","name":"revokedPermissions","type":"uint8[]"}],"name":"revokePermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"safeApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safeWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setAdministrationWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"operation","type":"bool"}],"name":"setExemptAmountLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"operation","type":"bool"}],"name":"setExemptDistributionMaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"operation","type":"bool"}],"name":"setExemptFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"operation","type":"bool"}],"name":"setExemptOperatePausedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"operation","type":"bool"}],"name":"setExemptStaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"operation","type":"bool"}],"name":"setExemptTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"pool","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"administration","type":"uint256"},{"internalType":"uint256","name":"investing","type":"uint256"},{"internalType":"uint256","name":"staker","type":"uint256"}],"name":"setFeesDirectWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newGasLimit","type":"uint256"}],"name":"setGasLimiter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setInvestingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxAccountAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"decimalAmount","type":"uint256"}],"name":"setMaxAccountAmountWithDecimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"decimalAmount","type":"uint256"}],"name":"setMaxTxAmountWithDecimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinBUSDToDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinBUSDToDistributeOnDecimal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinBUSDToReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinBUSDToReceiveOnDecimal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsAmount","type":"uint256"}],"name":"setMinDelayOnEachStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinTokenHoldToStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinTokenHoldToStakeOnDecimal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setStakerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"}],"name":"setWBNB_BUSD_Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"}],"name":"setWBNB_IFMT_PAIR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeControllerSafeApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeControllerSafeWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakerWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"pauseState","type":"bool"}],"name":"togglePauseStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pauseState","type":"bool"}],"name":"togglePauseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126012600a62000eac565b6200002190620186a062000f6d565b600855620000326012600a62000eac565b62000041906207a12062000f6d565b600955610320600b556032600c819055600d819055600e819055600f5560c86010556011805461ffff19169055601e80546001600160a01b0319167358f876857a02d6762e0101bb5c46a8c1ed44dc16179055601f805460ff60a01b19169055348015620000ae57600080fd5b5060405180604001604052806011815260200170496e66696e697479204d6f6e657920563360781b8152506040518060400160405280600581526020016449464d763360d81b815250620001116200010b6200098560201b60201c565b62000989565b600280546001810182556000919091526040805180820190915260058082526430b236b4b760d91b60209092019182526200015f92600080516020620088ad83398151915201919062000d62565b506002805460018101825560009190915260408051808201909152600980825268199a5b985b98da585b60ba1b6020909201918252620001b292600080516020620088ad83398151915201919062000d62565b506002805460018101825560009190915260408051808201909152600a8082526931b7b73a3937b63632b960b11b60209092019182526200020692600080516020620088ad83398151915201919062000d62565b50600280546001810182556000919091526040805180820190915260088082526737b832b930ba37b960c11b60209092019182526200025892600080516020620088ad83398151915201919062000d62565b503360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4960209081526040909120805460ff191660011790558251620002a9916006919085019062000d62565b508051620002bf90600790602084019062000d62565b50505060007310ed43c718714eb63d5aa57b78b54704e256024e9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031557600080fd5b505afa1580156200032a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000350919062000e16565b6040516364e329cb60e11b815273bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c60048201523060248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b158015620003ae57600080fd5b505af1158015620003c3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003e9919062000e16565b601f80546001600160a01b039283166001600160a01b0319918216811783556018805460018181019092557fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0180548416909217909155825484166000908152601560208181526040808420805460ff1990811687179091558754891685526014808452828620805483168817905597549098168452601680835281852080548a1687179055308552601380845282862080548b168817905588845282862080548b168817905584845282862080548b168817905581845282862080548b16881790557f8b9e18c5e04efe171d1e4f682ad90d753958a5ffe56db5290b0236c8e0b6db0080548b16881790557f7ed1dca03d96f947ab02d66053f47073699eb6287021936c92f54972932767e580548b16881790557f290d80ce586bfe95e1ebf348e3ba109df813891ad867417e64d38c5a50473b5780548b16881790557f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c80548b16881790557fa31547ce6245cdb9ecea19cf8c7eb9f5974025bb4075011409251ae855b30aed80548b16881790557f0263c2b778d062355049effc2dece97bc6547ff8a88a3258daa512061c2153dd80548b16881790553380875290845282862080548b168817905597835281852080548a168717905583835281852080548a168717905582528084208054891686179055601282528084208054891686179055601782528084208054891686179055601980547259e35b0aac0cade82bfe3072a31d05456a2ab7908816179055601a8054733167b970970d56df01be37ad54d44bb93adab779908816179055601b805473d4a4bfb20c12e851009a8a971aaed540ee1040c0908816179055601c8054731c568a5a23eccb8f9cf8340ed032af39288233699716871790557f84cc42feee3ee9184e7ae8e2cc6c23e976c826cd9e79d08ebd76866e7c227f8780548916861790557f699958faa5b23341fbf7f81e857961c2f39d22cf5d27babe0508975dd072805180548916861790557ff1f14b0a33af88fd5db1aba189844f02fce3d8dbb0abac0d7df84f2c3d4a080b80548916861790557f3a4f492f67cec9fe10b5a1c225424b83bda5c5898a88a4418f40e065f6df3c2a80548916861790557f570dcf69ee6eca2476c1e022c9f938ed83c49b696f5ee1517ad15d8facd279b080548916861790557f79d274c20fbd9e97c80984aa1f99fc3db8808a6d81e713d71c5d560568bdeef980548916861790557fc73d8288b76e9f196f45d1b00f79e28680e4476be23768aa15aeb850b9d9bc4480548916861790557f993a457e0e8bc72830cf8a74edc9f6663f12aeaeb2a8069c3c52f70a1132dd1180548916861790557f0f6b3c7572b8a38d3fc6f856cd194d35ad13421c1d69e60d9c39cb07f071b5b28054891686179055949092527fa34e6a760bcfc7be766fe8dfd3c0ff0e84db7b811fcebdb6a5906fabb2512d6f80548716841790557f5ab96a388c958f2db7e857d3be72dcb97a284782713a4573ba405a348b8b1c06805487168417905590527f51da7bbcfc3a6cec386b1a8c43c52d355526f923b3c1cb1b76d20dc7ec4bfa488054909416179092559051620008969062000df1565b604051809103906000f080158015620008b3573d6000803e3d6000fd5b50601d80546001600160a01b0319166001600160a01b0392909216918217905560405163eb5625d960e01b815273bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c6004820152306024820152600019604482015263eb5625d990606401600060405180830381600087803b1580156200092c57600080fd5b505af115801562000941573d6000803e3d6000fd5b5050505062000970816012600a6200095a919062000eac565b6200096a9063025317c062000f6d565b620009d9565b50506011805460ff1916600117905562000fe2565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80620009ef62000ab260201b6200139b1760201c565b620009fb919062000e48565b62000a096012600a62000eac565b62000a199063025317c062000f6d565b1015801562000a4557508062000a326012600a62000eac565b62000a429063025317c062000f6d565b10155b62000a975760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20737570706c7920616c7265616479206d696e74656400000060448201526064015b60405180910390fd5b62000aae828262000ab860201b62002dfe1760201c565b5050565b60055490565b6001600160a01b03821662000b105760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000a8e565b62000b1e6000838362000bb5565b806005600082825462000b32919062000e48565b90915550506001600160a01b0382166000908152600360205260408120805483929062000b6190849062000e48565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a362000aae6000838362000cac565b6008548111158062000bdf57506001600160a01b03831660009081526014602052604090205460ff165b62000c3c5760405162461bcd60e51b815260206004820152602660248201527f457863656464656420746865206d6178696d756d207472616e73616374696f6e604482015265081b1a5b5a5d60d21b606482015260840162000a8e565b60115460ff16158062000c6757506001600160a01b03831660009081526012602052604090205460ff165b62000ca75760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881a5cc81c185d5cd959608a1b604482015260640162000a8e565b505050565b6009546001600160a01b03831660009081526003602052604090205411158062000cee57506001600160a01b03821660009081526015602052604090205460ff165b62000ca75760405162461bcd60e51b815260206004820152603360248201527f457863656464656420746865206d6178696d756d20746f6b656e73207468617460448201527f20616e2077616c6c65742063616e20686f6c6400000000000000000000000000606482015260840162000a8e565b82805462000d709062000f8f565b90600052602060002090601f01602090048101928262000d94576000855562000ddf565b82601f1062000daf57805160ff191683800117855562000ddf565b8280016001018555821562000ddf579182015b8281111562000ddf57825182559160200191906001019062000dc2565b5062000ded92915062000dff565b5090565b6124c080620063ed83390190565b5b8082111562000ded576000815560010162000e00565b60006020828403121562000e2957600080fd5b81516001600160a01b038116811462000e4157600080fd5b9392505050565b6000821982111562000e5e5762000e5e62000fcc565b500190565b600181815b8085111562000ea457816000190482111562000e885762000e8862000fcc565b8085161562000e9657918102915b93841c939080029062000e68565b509250929050565b600062000e4160ff84168360008262000ec85750600162000f67565b8162000ed75750600062000f67565b816001811462000ef0576002811462000efb5762000f1b565b600191505062000f67565b60ff84111562000f0f5762000f0f62000fcc565b50506001821b62000f67565b5060208310610133831016604e8410600b841016171562000f40575081810a62000f67565b62000f4c838362000e63565b806000190482111562000f635762000f6362000fcc565b0290505b92915050565b600081600019048311821515161562000f8a5762000f8a62000fcc565b500290565b600181811c9082168062000fa457607f821691505b6020821081141562000fc657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6153fb8062000ff26000396000f3fe6080604052600436106105a35760003560e01c80637fd42617116102e0578063c1e822b611610184578063d72d9ff6116100e1578063e2981a5811610095578063f2fde38b1161006f578063f2fde38b14610fde578063fe48459314610ffe578063ffc42c611461101e57600080fd5b8063e2981a5814610f7e578063eb5625d914610f9e578063ec28438a14610fbe57600080fd5b8063dbee7efc116100c6578063dbee7efc14610ef8578063dd62ed3e14610f18578063e28b27e814610f5e57600080fd5b8063d72d9ff614610ec2578063d89135cd14610ee257600080fd5b8063c9b4ac3211610138578063cd52a1921161011d578063cd52a19214610e6c578063d5e0128c14610e82578063d6fde55814610ea257600080fd5b8063c9b4ac3214610e2c578063cc33a77214610e4c57600080fd5b8063c3f052df11610169578063c3f052df14610dbc578063c5d32bb214610ddc578063c96b5ebd14610e0c57600080fd5b8063c1e822b614610d7e578063c23596b414610d9c57600080fd5b8063a053f9131161023d578063a9256207116101f1578063af393311116101cb578063af39331114610d18578063aff23c1714610d48578063b84ea13014610d5e57600080fd5b8063a925620714610ccc578063ac3bb88414610ce2578063ae2e933b14610d0257600080fd5b8063a4c761a411610222578063a4c761a414610c6c578063a638b53014610c8c578063a9059cbb14610cac57600080fd5b8063a053f91314610c1c578063a457c2d714610c4c57600080fd5b80638da5cb5b116102945780639048d850116102795780639048d85014610bc75780639480f56c14610be757806395d89b4114610c0757600080fd5b80638da5cb5b14610b895780638f94e99314610ba757600080fd5b806386bde0f8116102c557806386bde0f814610b4957806388ab836a14610b69578063893d20e814610b8957600080fd5b80637fd4261714610b1f57806383bc6ba414610b3457600080fd5b8063346e2e2f116104475780635c7d59d0116103a457806368218f991161035857806375f0a8741161033257806375f0a87414610ac9578063770f319514610ae95780637d1db4a514610b0957600080fd5b806368218f9914610a6857806370a0823114610a7e578063715018a614610ab457600080fd5b80635fee9956116103895780635fee9956146109f857806360043b4414610a1857806362015bdc14610a4857600080fd5b80635c7d59d0146109b85780635d098b38146109d857600080fd5b8063489bc553116103fb5780634b0c0058116103e05780634b0c0058146109625780634ba1ab30146109825780635770146f1461099857600080fd5b8063489bc553146109225780634a14c4c61461094257600080fd5b80633dcdf25a1161042c5780633dcdf25a146108cd578063426ab031146108e257806344e698741461090257600080fd5b8063346e2e2f1461088d57806339509351146108ad57600080fd5b8063188a9a2b1161050057806328893332116104b457806330e59ae41161048e57806330e59ae414610816578063313ce56714610836578063330dd3451461085257600080fd5b806328893332146107c15780632b5e09a8146107e15780632c8d10991461080157600080fd5b806320c84328116104e557806320c8432814610761578063229764b41461078157806323b872dd146107a157600080fd5b8063188a9a2b14610721578063188fd4c11461074157600080fd5b80630b78f9c01161055757806312dfe61f1161053c57806312dfe61f146106ce57806314dc781f146106ee57806318160ddd1461070c57600080fd5b80630b78f9c01461068c5780630d2cfb39146106ae57600080fd5b806307e544e61161058857806307e544e6146105fa57806308b38d7d1461062c578063095ea7b31461066c57600080fd5b8063014231a8146105af57806306fdde03146105d857600080fd5b366105aa57005b600080fd5b3480156105bb57600080fd5b506105c5600b5481565b6040519081526020015b60405180910390f35b3480156105e457600080fd5b506105ed61104e565b6040516105cf9190615074565b34801561060657600080fd5b50601e546001600160a01b03165b6040516001600160a01b0390911681526020016105cf565b34801561063857600080fd5b5061065c61064736600461470a565b60126020526000908152604090205460ff1681565b60405190151581526020016105cf565b34801561067857600080fd5b5061065c6106873660046148c8565b6110e0565b34801561069857600080fd5b506106ac6106a7366004614981565b6110f7565b005b3480156106ba57600080fd5b506106ac6106c936600461492c565b611249565b3480156106da57600080fd5b506106ac6106e936600461470a565b611307565b3480156106fa57600080fd5b50601f546001600160a01b0316610614565b34801561071857600080fd5b506005546105c5565b34801561072d57600080fd5b506106ac61073c36600461492c565b6113a1565b34801561074d57600080fd5b506106ac61075c36600461492c565b61142d565b34801561076d57600080fd5b506106ac61077c366004614758565b6114b4565b34801561078d57600080fd5b506106ac61079c3660046148f2565b611580565b3480156107ad57600080fd5b5061065c6107bc366004614758565b6115f7565b3480156107cd57600080fd5b506106ac6107dc366004614891565b6116b6565b3480156107ed57600080fd5b506106ac6107fc366004614891565b611721565b34801561080d57600080fd5b506105c561178f565b34801561082257600080fd5b506106ac610831366004614891565b6117da565b34801561084257600080fd5b50604051601281526020016105cf565b34801561085e57600080fd5b5061065c61086d3660046149d5565b600160209081526000928352604080842090915290825290205460ff1681565b34801561089957600080fd5b506106ac6108a8366004614794565b611848565b3480156108b957600080fd5b5061065c6108c83660046148c8565b61190a565b3480156108d957600080fd5b506106ac611946565b3480156108ee57600080fd5b506106ac6108fd36600461492c565b6119f0565b34801561090e57600080fd5b506106ac61091d36600461492c565b611a7c565b34801561092e57600080fd5b50601b54610614906001600160a01b031681565b34801561094e57600080fd5b506106ac61095d366004614891565b611acd565b34801561096e57600080fd5b506106ac61097d36600461470a565b611b3b565b34801561098e57600080fd5b506105c560095481565b3480156109a457600080fd5b50601c54610614906001600160a01b031681565b3480156109c457600080fd5b506106ac6109d33660046149a3565b611bce565b3480156109e457600080fd5b506106ac6109f336600461470a565b611cb7565b348015610a0457600080fd5b506106ac610a1336600461492c565b611d70565b348015610a2457600080fd5b5061065c610a3336600461470a565b60146020526000908152604090205460ff1681565b348015610a5457600080fd5b506106ac610a6336600461470a565b611dcf565b348015610a7457600080fd5b506105c5600d5481565b348015610a8a57600080fd5b506105c5610a9936600461470a565b6001600160a01b031660009081526003602052604090205490565b348015610ac057600080fd5b506106ac611ec1565b348015610ad557600080fd5b50601954610614906001600160a01b031681565b348015610af557600080fd5b506106ac610b0436600461492c565b611f27565b348015610b1557600080fd5b506105c560085481565b348015610b2b57600080fd5b506106ac611ffe565b348015610b4057600080fd5b506106ac61206c565b348015610b5557600080fd5b506106ac610b6436600461470a565b6120f8565b348015610b7557600080fd5b506105ed610b8436600461492c565b6121b1565b348015610b9557600080fd5b506000546001600160a01b0316610614565b348015610bb357600080fd5b506106ac610bc236600461492c565b61225d565b348015610bd357600080fd5b506106ac610be2366004614891565b6122bc565b348015610bf357600080fd5b506106ac610c0236600461470a565b61232a565b348015610c1357600080fd5b506105ed6123a4565b348015610c2857600080fd5b5061065c610c3736600461470a565b60176020526000908152604090205460ff1681565b348015610c5857600080fd5b5061065c610c673660046148c8565b6123b3565b348015610c7857600080fd5b506106ac610c8736600461470a565b612464565b348015610c9857600080fd5b506106ac610ca736600461492c565b61251d565b348015610cb857600080fd5b5061065c610cc73660046148c8565b6125a6565b348015610cd857600080fd5b506105c5600c5481565b348015610cee57600080fd5b506106ac610cfd366004614794565b6125b3565b348015610d0e57600080fd5b506105c560105481565b348015610d2457600080fd5b5061065c610d3336600461470a565b60166020526000908152604090205460ff1681565b348015610d5457600080fd5b506105c5600e5481565b348015610d6a57600080fd5b506106ac610d7936600461495e565b612670565b348015610d8a57600080fd5b50601d546001600160a01b0316610614565b348015610da857600080fd5b506106ac610db736600461470a565b6126bc565b348015610dc857600080fd5b506106ac610dd736600461470a565b612775565b348015610de857600080fd5b5061065c610df736600461470a565b60136020526000908152604090205460ff1681565b348015610e1857600080fd5b506106ac610e2736600461495e565b6127ef565b348015610e3857600080fd5b50610614610e4736600461492c565b612850565b348015610e5857600080fd5b50601a54610614906001600160a01b031681565b348015610e7857600080fd5b506105c5600f5481565b348015610e8e57600080fd5b506106ac610e9d36600461492c565b61287a565b348015610eae57600080fd5b506106ac610ebd36600461492c565b612951565b348015610ece57600080fd5b506106ac610edd36600461470a565b6129da565b348015610eee57600080fd5b506105c5600a5481565b348015610f0457600080fd5b506106ac610f133660046148f2565b612a70565b348015610f2457600080fd5b506105c5610f33366004614725565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b348015610f6a57600080fd5b506106ac610f7936600461492c565b612ac3565b348015610f8a57600080fd5b506106ac610f9936600461492c565b612b1e565b348015610faa57600080fd5b506106ac610fb9366004614758565b612b79565b348015610fca57600080fd5b506106ac610fd936600461492c565b612c53565b348015610fea57600080fd5b506106ac610ff936600461470a565b612cae565b34801561100a57600080fd5b506106ac611019366004614891565b612d90565b34801561102a57600080fd5b5061065c61103936600461470a565b60156020526000908152604090205460ff1681565b60606006805461105d90615258565b80601f016020809104026020016040519081016040528092919081815260200182805461108990615258565b80156110d65780601f106110ab576101008083540402835291602001916110d6565b820191906000526020600020905b8154815290600101906020018083116110b957829003601f168201915b5050505050905090565b60006110ed338484612ef1565b5060015b92915050565b3360009081527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f602052604090205460019060ff166111c357611145335b6001600160a01b03166014613049565b60028260ff168154811061115b5761115b615359565b90600052602060002001604051602001611176929190614ce9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262461bcd60e51b82526111ba91600401615074565b60405180910390fd5b600b8390556010829055601d546040517fc45618f5000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b039091169063c45618f590602401600060405180830381600087803b15801561122c57600080fd5b505af1158015611240573d6000803e3d6000fd5b50505050505050565b3360009081527f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b602052604090205460039060ff1661128b5761114533611135565b601d546040517f8f94e993000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0390911690638f94e993906024015b600060405180830381600087803b1580156112eb57600080fd5b505af11580156112ff573d6000803e3d6000fd5b505050505050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166113465761114533611135565b60005b60025460ff821610156113965760ff811660009081526001602090815260408083206001600160a01b03871684529091529020805460ff191690558061138e816152c7565b915050611349565b505050565b60055490565b3360009081527f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b602052604090205460039060ff166113e35761114533611135565b601d546040517f5fee9956000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0390911690635fee9956906024016112d1565b3360009081527f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b602052604090205460039060ff1661146f5761114533611135565b601d546001600160a01b031663188fd4c161148c6012600a615134565b61149690856151df565b6040518263ffffffff1660e01b81526004016112d191815260200190565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166114f35761114533611135565b601d546040517feb5625d90000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528581166024830152604482018590529091169063eb5625d990606401600060405180830381600087803b15801561156257600080fd5b505af1158015611576573d6000803e3d6000fd5b5050505050505050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166115bf5761114533611135565b5060118054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b6000611604848484613279565b6001600160a01b03841660009081526004602090815260408083203384529091529020548281101561169e5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084016111ba565b6116ab8533858403612ef1565b506001949350505050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166116f55761114533611135565b506001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b3360009081527fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f602052604090205460029060ff166117635761114533611135565b506001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b6000600f54600e54600d54600c54601054600b546117ad91906150c5565b6117b791906150c5565b6117c191906150c5565b6117cb91906150c5565b6117d591906150c5565b905090565b3360009081527fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f602052604090205460029060ff1661181c5761114533611135565b506001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166118875761114533611135565b60005b82518160ff161015611904576001806000858460ff16815181106118b0576118b0615359565b60209081029190910181015160ff16825281810192909252604090810160009081206001600160a01b03891682529092529020805460ff1916911515919091179055806118fc816152c7565b91505061188a565b50505050565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916110ed9185906119419086906150c5565b612ef1565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166119855761114533611135565b601d60009054906101000a90046001600160a01b03166001600160a01b0316637fd426176040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156119d557600080fd5b505af11580156119e9573d6000803e3d6000fd5b5050505050565b3360009081527f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b602052604090205460039060ff16611a325761114533611135565b601d546040517f188fd4c1000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039091169063188fd4c1906024016112d1565b3360009081527f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b602052604090205460039060ff16611abe5761114533611135565b611ac9826000613650565b5050565b3360009081527fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f602052604090205460029060ff16611b0f5761114533611135565b506001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff16611b7a5761114533611135565b60005b60025460ff821610156113965760ff811660009081526001602081815260408084206001600160a01b0388168552909152909120805460ff1916909117905580611bc6816152c7565b915050611b7d565b3360009081527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f602052604090205460019060ff16611c105761114533611135565b600c859055600d849055600e839055600f829055601d546040517f5c7d59d0000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606481018490526001600160a01b0390911690635c7d59d090608401600060405180830381600087803b158015611c9857600080fd5b505af1158015611cac573d6000803e3d6000fd5b505050505050505050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff16611cf65761114533611135565b601980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03848116918217909255601d546040517f5d098b38000000000000000000000000000000000000000000000000000000008152600481019290925290911690635d098b38906024016112d1565b3360009081527f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b602052604090205460039060ff16611db25761114533611135565b601d546001600160a01b0316635fee995661148c6012600a615134565b60115460ff16158015611dea5750601154610100900460ff16155b80611e0d57506001600160a01b03811660009081526012602052604090205460ff165b611e595760405162461bcd60e51b815260206004820152600f60248201527f546f6b656e20697320706175736564000000000000000000000000000000000060448201526064016111ba565b601d546040517f0f5cd9940000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526001602483015290911690630f5cd994906044015b600060405180830381600087803b1580156119d557600080fd5b6000546001600160a01b03163314611f1b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111ba565b611f2560006139b9565b565b3360009081527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f602052604090205460019060ff16611f695761114533611135565b611f756012600a615134565b611f839063025317c06151df565b821115611ff85760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e7420697320626967676572207468656e206d6178696d756d20737560448201527f70706c7920746f6b656e0000000000000000000000000000000000000000000060648201526084016111ba565b50600955565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff1661203d5761114533611135565b6040514790339082156108fc029083906000818181858888f19350505050158015611396573d6000803e3d6000fd5b3360009081527f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b602052604090205460039060ff166120ae5761114533611135565b601d546040517f30b6a2bf000000000000000000000000000000000000000000000000000000008152600160048201526001600160a01b03909116906330b6a2bf90602401611ea7565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166121375761114533611135565b601b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03848116918217909255601d546040517f86bde0f80000000000000000000000000000000000000000000000000000000081526004810192909252909116906386bde0f8906024016112d1565b600281815481106121c157600080fd5b9060005260206000200160009150905080546121dc90615258565b80601f016020809104026020016040519081016040528092919081815260200182805461220890615258565b80156122555780601f1061222a57610100808354040283529160200191612255565b820191906000526020600020905b81548152906001019060200180831161223857829003601f168201915b505050505081565b3360009081527f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b602052604090205460039060ff1661229f5761114533611135565b601d546001600160a01b0316638f94e99361148c6012600a615134565b3360009081527fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f602052604090205460029060ff166122fe5761114533611135565b506001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166123695761114533611135565b50601f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60606007805461105d90615258565b3360009081526004602090815260408083206001600160a01b03861684529091528120548281101561244d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016111ba565b61245a3385858403612ef1565b5060019392505050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166124a35761114533611135565b601c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03848116918217909255601d546040517fa4c761a400000000000000000000000000000000000000000000000000000000815260048101929092529091169063a4c761a4906024016112d1565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff1661255c5761114533611135565b601d546040517fa638b530000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039091169063a638b530906024016112d1565b60006110ed338484613279565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166125f25761114533611135565b60005b82518160ff16101561190457600060016000858460ff168151811061261c5761261c615359565b60209081029190910181015160ff16825281810192909252604090810160009081206001600160a01b03891682529092529020805460ff191691151591909117905580612668816152c7565b9150506125f5565b3360009081527f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b602052604090205460039060ff166126b25761114533611135565b6113968383613650565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166126fb5761114533611135565b601a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03848116918217909255601d546040517fc23596b400000000000000000000000000000000000000000000000000000000815260048101929092529091169063c23596b4906024016112d1565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166127b45761114533611135565b50601e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b3360009081527f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b602052604090205460039060ff166128315761114533611135565b6113966128406012600a615134565b61284a90856151df565b83612670565b6018818154811061286057600080fd5b6000918252602090912001546001600160a01b0316905081565b3360009081527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f602052604090205460019060ff166128bc5761114533611135565b6128c86012600a615134565b6128d69063025317c06151df565b82111561294b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e7420697320626967676572207468656e206d6178696d756d20737560448201527f70706c7920746f6b656e0000000000000000000000000000000000000000000060648201526084016111ba565b50600855565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166129905761114533611135565b601d546040517fd6fde558000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039091169063d6fde558906024016112d1565b601d546040517fd72d9ff60000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301529091169063d72d9ff69060240160206040518083038186803b158015612a3857600080fd5b505afa158015612a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac99190614945565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff16612aaf5761114533611135565b506011805460ff1916911515919091179055565b3360009081527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f602052604090205460019060ff16612b055761114533611135565b611ac9612b146012600a615134565b610b0490846151df565b3360009081527f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b602052604090205460039060ff16612b605761114533611135565b611ac9612b6f6012600a615134565b61091d90846151df565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff16612bb85761114533611135565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285169063095ea7b390604401602060405180830381600087803b158015612c1b57600080fd5b505af1158015612c2f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e9919061490f565b3360009081527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f602052604090205460019060ff16612c955761114533611135565b611ac9612ca46012600a615134565b610e9d90846151df565b6000546001600160a01b03163314612d085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111ba565b6001600160a01b038116612d845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016111ba565b612d8d816139b9565b50565b3360009081527fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f602052604090205460029060ff16612dd25761114533611135565b506001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b6001600160a01b038216612e545760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016111ba565b612e6060008383613a21565b8060056000828254612e7291906150c5565b90915550506001600160a01b03821660009081526003602052604081208054839290612e9f9084906150c5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611ac960008383613b32565b6001600160a01b038316612f6c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016111ba565b6001600160a01b038216612fe85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016111ba565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b606060006130588360026151df565b6130639060026150c5565b67ffffffffffffffff81111561307b5761307b615388565b6040519080825280601f01601f1916602001820160405280156130a5576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106130dc576130dc615359565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061313f5761313f615359565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061317b8460026151df565b6131869060016150c5565b90505b6001811115613223577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106131c7576131c7615359565b1a60f81b8282815181106131dd576131dd615359565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361321c81615241565b9050613189565b5083156132725760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016111ba565b9392505050565b601f5474010000000000000000000000000000000000000000900460ff161561330a5760405162461bcd60e51b815260206004820152602760248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c2060448201527f68617070656e730000000000000000000000000000000000000000000000000060648201526084016111ba565b601f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556001600160a01b0383161580159061336957506001600160a01b03821615155b6133b55760405162461bcd60e51b815260206004820152601e60248201527f7472616e736665722066726f6d20746865207a65726f2061646472657373000060448201526064016111ba565b6133c0838383613a21565b6001600160a01b0383166000908152600360205260409020548181101561344e5760405162461bcd60e51b8152602060048201526024808201527f7472616e7366657220616d6f756e74206578636565647320796f75722062616c60448201527f616e63650000000000000000000000000000000000000000000000000000000060648201526084016111ba565b600061345a83836151fe565b6001600160a01b038616600090815260036020908152604080832084905560139091528120549192509060ff166134ae576127108461349761178f565b6134a191906151df565b6134ab91906150dd565b90505b60006134b982613be5565b905060006134c783876151fe565b6001600160a01b0388166000908152600360205260409020546134ea91906150c5565b6001600160a01b0380891660009081526003602090815260408083208590558c841683526017909152902054601d5492935060ff1615911663e0ee2af36135308b613f6d565b6135398b613f6d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044810188905260648101859052851515608482015283151560a482015260c401600060405180830381600087803b1580156135b757600080fd5b505af11580156135cb573d6000803e3d6000fd5b505050506135da898989613b32565b601f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040518781526001600160a01b0389811691908b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050505050565b600061367073e9e7cea3dedca5984780bafc599bd69add087d5630613f9b565b6dffffffffffffffffffffffffffff169050828110156136ad5761369383614024565b61369c82614024565b604051602001611176929190614ef8565b601e5460009081906136c7906001600160a01b031661415e565b601e5491935091506000906136f9906001600160a01b031673e9e7cea3dedca5984780bafc599bd69add087d566141d1565b90508015613705579091905b601e546137319073e9e7cea3dedca5984780bafc599bd69add087d56906001600160a01b03168861426b565b600061375e87856dffffffffffffffffffffffffffff16856dffffffffffffffffffffffffffff166142f7565b601e54909150613793906001600160a01b03168361377d57600061377f565b825b8461378a578361378d565b60005b306143f2565b601f80546001600160a01b039081166000908152601360205260409020805460ff1981166001179091559154601d5460ff9093169290821691166137d68261415e565b90975095506137f98273bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c6141d1565b94508415613805579495945b61382473bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c838661426b565b600061385185896dffffffffffffffffffffffffffff16896dffffffffffffffffffffffffffff166142f7565b90506001600160a01b038a166138ae576138878387613871576000613873565b825b8861387e5783613881565b60005b856143f2565b613891828261449e565b80600a60008282546138a391906150c5565b909155506139839050565b6138d483876138be5760006138c0565b825b886138cb57836138ce565b60005b8d6143f2565b601d546001600160a01b031663e0ee2af36138ee8c613f6d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260006024820181905260448201859052606482018190526084820181905260a482015260c401600060405180830381600087803b15801561396a57600080fd5b505af115801561397e573d6000803e3d6000fd5b505050505b5050601f546001600160a01b03166000908152601360205260409020805460ff1916921515929092179091555050505050505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60085481111580613a4a57506001600160a01b03831660009081526014602052604090205460ff165b613abc5760405162461bcd60e51b815260206004820152602660248201527f457863656464656420746865206d6178696d756d207472616e73616374696f6e60448201527f206c696d6974000000000000000000000000000000000000000000000000000060648201526084016111ba565b60115460ff161580613ae657506001600160a01b03831660009081526012602052604090205460ff165b6113965760405162461bcd60e51b815260206004820152600f60248201527f546f6b656e20697320706175736564000000000000000000000000000000000060448201526064016111ba565b6009546001600160a01b038316600090815260036020526040902054111580613b7357506001600160a01b03821660009081526015602052604090205460ff165b6113965760405162461bcd60e51b815260206004820152603360248201527f457863656464656420746865206d6178696d756d20746f6b656e73207468617460448201527f20616e2077616c6c65742063616e20686f6c640000000000000000000000000060648201526084016111ba565b600081613bf457506000919050565b3060009081526003602052604081208054849290613c139084906150c5565b9091555050601f546001600160a01b031633811480613c395750601154610100900460ff165b15613c475750600092915050565b3060009081526003602052604081208054908290559073bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c9080613c7d8561415e565b915091506000613c8d86856141d1565b90508015613c99579091905b6001600160a01b03861660009081526003602052604081208054879290613cc19084906150c5565b9091555050601d546001600160a01b03166000613cde8683613f9b565b6dffffffffffffffffffffffffffff1690506000613d1d88866dffffffffffffffffffffffffffff16886dffffffffffffffffffffffffffff166142f7565b9050613d458985613d2e5782613d31565b60005b86613d3d576000613d3f565b835b866143f2565b6000613d518885613f9b565b6dffffffffffffffffffffffffffff169050613d6d82846150c5565b8114613dbb5760405162461bcd60e51b815260206004820152601f60248201527f57726f6e6720616d6f756e74206f662073776170706564206f6e2057424e420060448201526064016111ba565b601e5473e9e7cea3dedca5984780bafc599bd69add087d56906001600160a01b0316613de68161415e565b9099509750613df5818b6141d1565b96508615613e01579697965b6000613e0d8330613f9b565b6dffffffffffffffffffffffffffff169050613e2b8b888488614636565b6000613e58868c6dffffffffffffffffffffffffffff168c6dffffffffffffffffffffffffffff166142f7565b9050613e77838a613e6a576000613e6c565b825b8b61378a578361378d565b6000613e838530613f9b565b6dffffffffffffffffffffffffffff169050613e9f82846150c5565b8114613eed5760405162461bcd60e51b815260206004820152601c60248201527f57726f6e6720616d6f756e742073776170706564206f6e20425553440000000060448201526064016111ba565b6000600b54600f54600e54600d54600c54613f0891906150c5565b613f1291906150c5565b613f1c91906150c5565b613f2691906150c5565b90508015613f5457613f54868b613f3b61178f565b613f4585886151df565b613f4f91906150dd565b61426b565b50505050505060019a5050505050505050505050919050565b6001600160a01b03811660009081526016602052604081205460ff16613f9357816110f1565b600092915050565b600080600090506040517f70a08231000000000000000000000000000000000000000000000000000000008152836004820152604081602483885afa90519250159050801561401d57613ff8836001600160a01b03166014613049565b61400c856001600160a01b03166014613049565b604051602001611176929190614fa3565b5092915050565b60608161406457505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561408e5780614078816152ac565b91506140879050600a836150dd565b9150614068565b60008167ffffffffffffffff8111156140a9576140a9615388565b6040519080825280601f01601f1916602001820160405280156140d3576020820181803683370190505b5090505b8415614156576140e86001836151fe565b91506140f5600a866152e7565b6141009060306150c5565b60f81b81838151811061411557614115615359565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061414f600a866150dd565b94506140d7565b949350505050565b60008060006040517f0902f1ac000000000000000000000000000000000000000000000000000000008152604081600483885afa15915080519350602081015192505080156141cb576141bb846001600160a01b03166014613049565b6040516020016111769190614ab1565b50915091565b60008060006040517f0dfe1681000000000000000000000000000000000000000000000000000000008152602081600483895afa90519250159050801561424b57614226846001600160a01b03166014613049565b61423a866001600160a01b03166014613049565b604051602001611176929190614c42565b836001600160a01b0316826001600160a01b031614159250505092915050565b60006040517fa9059cbb0000000000000000000000000000000000000000000000000000000081528360048201528260248201526000806044836000895af1159150508015611904576142bd82614024565b6142d1856001600160a01b03166014613049565b6142e5856001600160a01b03166014613049565b60405160200161117693929190614e38565b60008084116143485760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420616d6f756e7420696e0000000000000000000060448201526064016111ba565b6000831180156143585750600082115b6143a45760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e74206c69717569646974790000000000000000000060448201526064016111ba565b60006143b2856126f76151df565b905060006143c084836151df565b90506000826143d1876127106151df565b6143db91906150c5565b90506143e781836150dd565b979650505050505050565b60006040517f022c0d9f000000000000000000000000000000000000000000000000000000008152846004820152836024820152826044820152608060648201526000608482015260008060a48360008a5af11591505080156119e957614464841561445e5784614024565b83614024565b614478866001600160a01b03166014613049565b61448c846001600160a01b03166014613049565b604051602001611176939291906149f1565b6001600160a01b03821661451a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016111ba565b61452682600083613a21565b6001600160a01b038216600090815260036020526040902054818110156145b55760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016111ba565b6001600160a01b03831660009081526003602052604081208383039055600580548492906145e49084906151fe565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361139683600084613b32565b60006040517f23b872dd00000000000000000000000000000000000000000000000000000000815284600482015283602482015282604482015260008060648360008a5af11591505080156119e957614699846001600160a01b03166014613049565b6146a283614024565b6146b6876001600160a01b03166014613049565b6146ca866001600160a01b03166014613049565b6040516020016111769493929190614b43565b80356001600160a01b03811681146146f457600080fd5b919050565b803560ff811681146146f457600080fd5b60006020828403121561471c57600080fd5b613272826146dd565b6000806040838503121561473857600080fd5b614741836146dd565b915061474f602084016146dd565b90509250929050565b60008060006060848603121561476d57600080fd5b614776846146dd565b9250614784602085016146dd565b9150604084013590509250925092565b600080604083850312156147a757600080fd5b6147b0836146dd565b915060208084013567ffffffffffffffff808211156147ce57600080fd5b818601915086601f8301126147e257600080fd5b8135818111156147f4576147f4615388565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110858211171561483757614837615388565b604052828152858101935084860182860187018b101561485657600080fd5b600095505b838610156148805761486c816146f9565b85526001959095019493860193860161485b565b508096505050505050509250929050565b600080604083850312156148a457600080fd5b6148ad836146dd565b915060208301356148bd816153b7565b809150509250929050565b600080604083850312156148db57600080fd5b6148e4836146dd565b946020939093013593505050565b60006020828403121561490457600080fd5b8135613272816153b7565b60006020828403121561492157600080fd5b8151613272816153b7565b60006020828403121561493e57600080fd5b5035919050565b60006020828403121561495757600080fd5b5051919050565b6000806040838503121561497157600080fd5b8235915061474f602084016146dd565b6000806040838503121561499457600080fd5b50508035926020909101359150565b600080600080608085870312156149b957600080fd5b5050823594602084013594506040840135936060013592509050565b600080604083850312156149e857600080fd5b614741836146f9565b7f556e61626c6520746f2073776170200000000000000000000000000000000000815260008451614a2981600f850160208901615215565b7f206f6e205061696e205b00000000000000000000000000000000000000000000600f918401918201528451614a66816019840160208901615215565b7f5d20746f20726563656976657220000000000000000000000000000000000000601992909101918201528351614aa4816027840160208801615215565b0160270195945050505050565b7f556e61626c6520746f206765742072657365727665732066726f6d207061697281527f205b000000000000000000000000000000000000000000000000000000000000602082015260008251614b0f816022850160208701615215565b7f5d000000000000000000000000000000000000000000000000000000000000006022939091019283015250602301919050565b7f556e61626c6520746f207472616e736665722066726f6d205b00000000000000815260008551614b7b816019850160208a01615215565b7f5d200000000000000000000000000000000000000000000000000000000000006019918401918201528551614bb881601b840160208a01615215565b7f206f6620746f6b656e205b000000000000000000000000000000000000000000601b92909101918201528451614bf6816026840160208901615215565b7f5d20746f20616464726573732000000000000000000000000000000000000000602692909101918201528351614c34816033840160208801615215565b016033019695505050505050565b7f556e61626c6520746f20636865636b20646972656374696f6e206f6620746f6b81527f656e200000000000000000000000000000000000000000000000000000000000602082015260008351614ca0816023850160208801615215565b7f2066726f6d2070616972200000000000000000000000000000000000000000006023918401918201528351614cdd81602e840160208801615215565b01602e01949350505050565b7f4163636f756e74200000000000000000000000000000000000000000000000008152600083516020614d228260088601838901615215565b7f20646f6573206e6f7420686176652000000000000000000000000000000000006008928501928301528454601790600090600181811c9080831680614d6957607f831692505b868310811415614da0577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b808015614db45760018114614dc957614dfa565b60ff198516878a015286848a01019550614dfa565b60008c81526020902060005b85811015614df05781548b82018a0152908401908901614dd5565b505086848a010195505b5050505050614e2c817f207065726d697373696f6e0000000000000000000000000000000000000000008152600b0190565b98975050505050505050565b7f556e61626c6520746f207472616e736665722000000000000000000000000000815260008451614e70816013850160208901615215565b7f206f6620746f6b656e205b0000000000000000000000000000000000000000006013918401918201528451614ead81601e840160208901615215565b7f5d20746f20616464726573732000000000000000000000000000000000000000601e92909101918201528351614eeb81602b840160208801615215565b01602b0195945050505050565b7f696e73756666696369656e74204255534420616d6f756e745b00000000000000815260008351614f30816019850160208801615215565b7f5d206f6e20636f6e74726163745b0000000000000000000000000000000000006019918401918201528351614f6d816027840160208801615215565b7f5d0000000000000000000000000000000000000000000000000000000000000060279290910191820152602801949350505050565b7f556e61626c6520746f206765742062616c616e63652066726f6d2077616c6c6581527f74205b0000000000000000000000000000000000000000000000000000000000602082015260008351615001816023850160208801615215565b7f5d206f6620746f6b656e205b0000000000000000000000000000000000000000602391840191820152835161503e81602f840160208801615215565b7f5d20000000000000000000000000000000000000000000000000000000000000602f9290910191820152603101949350505050565b6020815260008251806020840152615093816040850160208701615215565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600082198211156150d8576150d86152fb565b500190565b6000826150ec576150ec61532a565b500490565b600181815b8085111561512c578160001904821115615112576151126152fb565b8085161561511f57918102915b93841c93908002906150f6565b509250929050565b600061327260ff84168360008261514d575060016110f1565b8161515a575060006110f1565b8160018114615170576002811461517a57615196565b60019150506110f1565b60ff84111561518b5761518b6152fb565b50506001821b6110f1565b5060208310610133831016604e8410600b84101617156151b9575081810a6110f1565b6151c383836150f1565b80600019048211156151d7576151d76152fb565b029392505050565b60008160001904831182151516156151f9576151f96152fb565b500290565b600082821015615210576152106152fb565b500390565b60005b83811015615230578181015183820152602001615218565b838111156119045750506000910152565b600081615250576152506152fb565b506000190190565b600181811c9082168061526c57607f821691505b602082108114156152a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006000198214156152c0576152c06152fb565b5060010190565b600060ff821660ff8114156152de576152de6152fb565b60010192915050565b6000826152f6576152f661532a565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114612d8d57600080fdfea264697066735822122022c8212462f8bd5ecdf794c8f59914caa8fcef726b4b1df99c4111d8cb73903364736f6c634300080500336080604052620000126012600a620001ce565b62000020906103e86200029c565b600155620000316012600a620001ce565b6200003f906103e86200029c565b600255620000506012600a620001ce565b6200005d9060016200029c565b600355610e10600455670de0b6b3a7640000600855620c3500600d55610320600e556032600f55603260105560326011556032601255348015620000a057600080fd5b50620000ac3362000135565b601380546001600160a01b03199081167259e35b0aac0cade82bfe3072a31d05456a2ab717909155601480548216733167b970970d56df01be37ad54d44bb93adab77917905560158054821673d4a4bfb20c12e851009a8a971aaed540ee1040c017905560168054909116731c568a5a23eccb8f9cf8340ed032af3928823369179055620002d4565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600181815b80851115620001c6578160001904821115620001aa57620001aa620002be565b80851615620001b857918102915b93841c93908002906200018a565b509250929050565b6000620001df60ff841683620001e6565b9392505050565b600082620001f75750600162000296565b81620002065750600062000296565b81600181146200021f57600281146200022a576200024a565b600191505062000296565b60ff8411156200023e576200023e620002be565b50506001821b62000296565b5060208310610133831016604e8410600b84101617156200026f575081810a62000296565b6200027b838362000185565b8060001904821115620002925762000292620002be565b0290505b92915050565b6000816000190483118215151615620002b957620002b9620002be565b500290565b634e487b7160e01b600052601160045260246000fd5b6121dc80620002e46000396000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c80638873bf851161017b578063c23596b4116100d8578063d72d9ff61161008c578063eb5625d911610071578063eb5625d914610583578063f2fde38b14610596578063f5003467146105a957600080fd5b8063d72d9ff61461055d578063e0ee2af31461057057600080fd5b8063cc33a772116100bd578063cc33a7721461052e578063cd52a19214610541578063d6fde5581461054a57600080fd5b8063c23596b414610508578063c45618f51461051b57600080fd5b8063a638b5301161012f578063aff23c1711610114578063aff23c17146104ee578063bee9a181146104f7578063bfa33bad146104ff57600080fd5b8063a638b530146104d2578063a9256207146104e557600080fd5b80638f94e993116101605780638f94e9931461043c5780639adaebff1461044f578063a4c761a4146104bf57600080fd5b80638873bf85146104225780638da5cb5b1461042b57600080fd5b80635d098b381161022957806375f0a874116101dd5780637e1c0c09116101c25780637e1c0c09146103fe5780637fd426171461040757806386bde0f81461040f57600080fd5b806375f0a874146103e25780637d9bc922146103f557600080fd5b806362f2cfa21161020e57806362f2cfa2146103c857806368218f99146103d1578063715018a6146103da57600080fd5b80635d098b38146103a25780635fee9956146103b557600080fd5b806330b6a2bf11610280578063489bc55311610265578063489bc553146103695780635770146f1461037c5780635c7d59d01461038f57600080fd5b806330b6a2bf14610323578063484f4ea91461033657600080fd5b80630f2cb69b116102b15780630f2cb69b146102f25780630f5cd994146102fb578063188fd4c11461031057600080fd5b8063014231a8146102cd57806304f06a5b146102e9575b600080fd5b6102d6600e5481565b6040519081526020015b60405180910390f35b6102d660045481565b6102d660025481565b61030e610309366004611de7565b6105b2565b005b61030e61031e366004611e58565b61084f565b61030e610331366004611e1e565b6108ae565b61035173e9e7cea3dedca5984780bafc599bd69add087d5681565b6040516001600160a01b0390911681526020016102e0565b601554610351906001600160a01b031681565b601654610351906001600160a01b031681565b61030e61039d366004611e8a565b610aee565b61030e6103b0366004611d1d565b610b5c565b61030e6103c3366004611e58565b610bf0565b6102d6600b5481565b6102d660105481565b61030e610c4f565b601354610351906001600160a01b031681565b6102d6600a5481565b6102d6600c5481565b61030e610cb5565b61030e61041d366004611d1d565b610d3b565b6102d6600d5481565b6000546001600160a01b0316610351565b61030e61044a366004611e58565b610dcf565b61049261045d366004611d1d565b600560208190526000918252604090912080546001820154600283015460038401546004850154949095015492949193909286565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0016102e0565b61030e6104cd366004611d1d565b610e2e565b61030e6104e0366004611e58565b610ec2565b6102d6600f5481565b6102d660115481565b61030e610f21565b6102d660035481565b61030e610516366004611d1d565b611319565b61030e610529366004611e58565b6113ad565b601454610351906001600160a01b031681565b6102d660125481565b61030e610558366004611e58565b61140c565b6102d661056b366004611d1d565b61146b565b61030e61057e366004611d7b565b611590565b61030e610591366004611d3f565b611624565b61030e6105a4366004611d1d565b61171f565b6102d660015481565b6000546001600160a01b031633146106115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b61061a826117fe565b6001600160a01b03821660009081526005602052604090206002015460035481108061066e57506004546001600160a01b03841660009081526005602081905260409091200154429161066c91611fb4565b115b1561071257811561070d5760405162461bcd60e51b815260206004820152605b60248201527f4e6f7420656e6f677468204255534420746f2072656365697665206f7220697460448201527f207761732063616c6c656420666173746572207468616e206d696e696d756d2060648201527f696e74657276616c20746f2072656365697665207374616b65732e0000000000608482015260a401610608565b505050565b80600b60008282546107249190611fb4565b90915550506001600160a01b038316600081815260056020526040908190206002015490517fa9059cbb0000000000000000000000000000000000000000000000000000000081526004810192909252602482015273e9e7cea3dedca5984780bafc599bd69add087d569063a9059cbb90604401602060405180830381600087803b1580156107b257600080fd5b505af11580156107c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ea9190611e3b565b506001600160a01b03831660009081526005602052604081206002810154600190910180549192909161081e908490611fb4565b9091555050506001600160a01b038216600090815260056020819052604082206002810192909255429101555b5050565b6000546001600160a01b031633146108a95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b600255565b6000546001600160a01b031633146109085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b6006546109125750565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073e9e7cea3dedca5984780bafc599bd69add087d56906370a082319060240160206040518083038186803b15801561097857600080fd5b505afa15801561098c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b09190611e71565b9050806002541115610a2b57811561084b576109cd6002546118c7565b6109d6826118c7565b6040516020016109e7929190611ebc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262461bcd60e51b825261060891600401611f63565b8115610a3957610a39610f21565b60005a600754600654600d54929350600092839291905b8085108015610a5e57508184105b15610ae357818310610a74576000600781905592505b610aa460068481548110610a8a57610a8a61213a565b60009182526020822001546001600160a01b0316906105b2565b5a610aaf908761201d565b610ab99086611fb4565b94505a955082610ac881612060565b60078190559350849050610adb81612060565b945050610a50565b505050505050505b50565b6000546001600160a01b03163314610b485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b600f93909355601091909155601155601255565b6000546001600160a01b03163314610bb65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b601380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610c4a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b600355565b6000546001600160a01b03163314610ca95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b610cb36000611a01565b565b6000546001600160a01b03163314610d0f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b60405133904780156108fc02916000818181858888f19350505050158015610aeb573d6000803e3d6000fd5b6000546001600160a01b03163314610d955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b601580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610e295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b600155565b6000546001600160a01b03163314610e885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b601680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610f1c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b600d55565b6000546001600160a01b03163314610f7b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073e9e7cea3dedca5984780bafc599bd69add087d56906370a082319060240160206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110199190611e71565b90506000600a54600b548361102e9190611fb4565b611038919061201d565b9050801561084b5780600a60008282546110529190611fb4565b9091555050600f54601054601154601254601354601454601554601654600e546001600160a01b039485169493841693928316929091169088158015906110a157506001600160a01b03851615155b156110b3576110b08982611fb4565b90505b6000881180156110cb57506001600160a01b03841615155b156110dd576110da8882611fb4565b90505b6000871180156110f557506001600160a01b03831615155b15611107576111048782611fb4565b90505b60008611801561111f57506001600160a01b03821615155b156111315761112e8682611fb4565b90505b60008911801561114957506001600160a01b03851615155b1561119457806111598a8c611fe0565b6111639190611fcc565b6001600160a01b0386166000908152600560205260408120600201805490919061118e908490611fb4565b90915550505b6000881180156111ac57506001600160a01b03841615155b156111f757806111bc898c611fe0565b6111c69190611fcc565b6001600160a01b038516600090815260056020526040812060020180549091906111f1908490611fb4565b90915550505b60008711801561120f57506001600160a01b03831615155b1561125a578061121f888c611fe0565b6112299190611fcc565b6001600160a01b03841660009081526005602052604081206002018054909190611254908490611fb4565b90915550505b60008611801561127257506001600160a01b03821615155b156112bd5780611282878c611fe0565b61128c9190611fcc565b6001600160a01b038316600090815260056020526040812060020180549091906112b7908490611fb4565b90915550505b600081600e548c6112ce9190611fe0565b6112d89190611fcc565b9050600c54600854826112eb9190611fe0565b6112f59190611fcc565b600960008282546113069190611fb4565b9091555050505050505050505050505050565b6000546001600160a01b031633146113735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b601480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b600e55565b6000546001600160a01b031633146114665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b600455565b600080546001600160a01b031633146114c65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b6001600160a01b0382166000908152600560205260409020546114eb57506000919050565b6001600160a01b038216600090815260056020526040812060038101546008546009549254919392909161151f9190611fe0565b6115299190611fcc565b9050818111611553575050506001600160a01b031660009081526005602052604090206002015490565b6001600160a01b038416600090815260056020526040902060020154829061157c908390611fb4565b611586919061201d565b925050505b919050565b6000546001600160a01b031633146115ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b6115f48685611a69565b811561160257611602610f21565b61160c8584611a69565b801561161c5761161c60006108ae565b505050505050565b6000546001600160a01b0316331461167e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063095ea7b390604401602060405180830381600087803b1580156116e157600080fd5b505af11580156116f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117199190611e3b565b50505050565b6000546001600160a01b031633146117795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610608565b6001600160a01b0381166117f55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610608565b610aeb81611a01565b6001600160a01b03811660009081526005602052604090205461181e5750565b6001600160a01b03811660009081526005602052604081206003810154600854600954925491939290916118529190611fe0565b61185c9190611fcc565b905081811161186a57505050565b611874828261201d565b6001600160a01b0384166000908152600560205260408120600201805490919061189f908490611fb4565b90915550506001600160a01b0390921660009081526005602052604090206003019190915550565b60608161190757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611931578061191b81612060565b915061192a9050600a83611fcc565b915061190b565b60008167ffffffffffffffff81111561194c5761194c612169565b6040519080825280601f01601f191660200182016040528015611976576020820181803683370190505b5090505b84156119f95761198b60018361201d565b9150611998600a86612099565b6119a3906030611fb4565b60f81b8183815181106119b8576119b861213a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506119f2600a86611fcc565b945061197a565b949350505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216611a7b575050565b60008160015411611a8c5781611a8f565b60005b9050611a9a836117fe565b6001600160a01b0383166000908152600560205260409020548115801590611ac0575080155b15611b4157600680546001600160a01b0386166000818152600560205260408120600401839055600183018455929092527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055611b5d565b81158015611b4f5750600081115b15611b5d57611b5d84611bd3565b8181600c54611b6c919061201d565b611b769190611fb4565b600c556001600160a01b0384166000908152600560205260409020829055600854600954611ba49084611fe0565b611bae9190611fcc565b6001600160a01b03909416600090815260056020526040902060030193909355505050565b6006805460009190611be79060019061201d565b81548110611bf757611bf761213a565b60009182526020808320909101546001600160a01b03858116845260059092526040909220600401546006805492909316935091839183908110611c3d57611c3d61213a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506006805480611c7c57611c7c61210b565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559092019092556001600160a01b03938416825260059052604080822060049081019390935593909216825291812090910155565b80356001600160a01b038116811461158b57600080fd5b600060208284031215611d2f57600080fd5b611d3882611d06565b9392505050565b600080600060608486031215611d5457600080fd5b611d5d84611d06565b9250611d6b60208501611d06565b9150604084013590509250925092565b60008060008060008060c08789031215611d9457600080fd5b611d9d87611d06565b9550611dab60208801611d06565b945060408701359350606087013592506080870135611dc981612198565b915060a0870135611dd981612198565b809150509295509295509295565b60008060408385031215611dfa57600080fd5b611e0383611d06565b91506020830135611e1381612198565b809150509250929050565b600060208284031215611e3057600080fd5b8135611d3881612198565b600060208284031215611e4d57600080fd5b8151611d3881612198565b600060208284031215611e6a57600080fd5b5035919050565b600060208284031215611e8357600080fd5b5051919050565b60008060008060808587031215611ea057600080fd5b5050823594602084013594506040840135936060013592509050565b7f546f20646973747269627574652c20746865207374616b6520636f6e74726f6c81527f6c65722073686f756c642068617665206174206c656173742000000000000000602082015260008351611f1a816039850160208801612034565b7f20425553442e20697420486173200000000000000000000000000000000000006039918401918201528351611f57816047840160208801612034565b01604701949350505050565b6020815260008251806020840152611f82816040850160208701612034565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008219821115611fc757611fc76120ad565b500190565b600082611fdb57611fdb6120dc565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612018576120186120ad565b500290565b60008282101561202f5761202f6120ad565b500390565b60005b8381101561204f578181015183820152602001612037565b838111156117195750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612092576120926120ad565b5060010190565b6000826120a8576120a86120dc565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114610aeb57600080fdfea26469706673582212203cbb1ae63cb6eedfd753e5f1a99767da621dbda0e62c13984b44bf969faa3ba564736f6c63430008050033405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.