Contract 0x08bd7F9849f8EEC12fd78c9fED6ba4e47269e3d5 5

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x167c8bfde6db63fb8b8177302c0b4cdc0db54dab10fcbac358d1dee220605d2fCompound132889602021-12-08 4:24:347 hrs 54 mins ago0x5db02247c4c29f36dd65e519caa2e959761a82e2 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000959725
0xd599af4c1064959b810cdbb1ce1b3392e7dbe3cb04dba7f0da3361a8d9d9860dApprove132783422021-12-07 18:50:3917 hrs 27 mins ago0xcdaa7494c029833781c5957229243b3e4ea5072d IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000072915
0x759505ea14aa53f54836469a43ddd10ac35de35da4e88879a2fb30e6cc6d667fClaim DOT132782982021-12-07 18:48:2717 hrs 30 mins ago0xc1f514401b32cbd32110501434e0a1742b2df0cd IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000897045
0x7eba1432e1cc593e57085e301e29ad4924971708e7be866b77e9bd833829adc7Claim DOT132735442021-12-07 14:15:4822 hrs 2 mins ago0x954ed4440c6c4a493cbcee40eba6856543941573 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000822045
0x3d6141ad149f8ada4c63c7e37b4833133e42bed7e99c431feabd902323c38275Approve132716122021-12-07 12:22:5623 hrs 55 mins ago0xd8974fb4c69cfbd2cf9eebfbbed10236fa3aadea IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000072915
0x7129a6363e1e61c1b1cf27fc53c21f1096d8c9dc9b2f8b4a6a0ee69f8a382e62Approve132620942021-12-07 4:11:001 day 8 hrs ago0xb97f333652395f7f4eea205330bc96ee21ace9c0 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000222745
0x9806fdf3e4f7ac0c7d7109923d16f9edd63d38529b343f6a9e65e8afc45c7cebClaim DOT132589542021-12-07 1:30:031 day 10 hrs ago0xb97f333652395f7f4eea205330bc96ee21ace9c0 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000822045
0x697ed1d5c8a0359ef67e54ad793999935aec1693150356445862ce2f583dcf37Transfer132509732021-12-06 18:49:241 day 17 hrs ago0xc6d2ed505961d57cc60ea51d364583ecf00feb57 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.001239815
0xab95b99984dcf0b3958cd868bb78ab3a99809dd8efb8e272e05bf167dac22af1Approve132400602021-12-06 9:13:512 days 3 hrs ago0x3996f29fe776360102a210a484beeccf910f47f7 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000222745
0x47a2420430585f719b68757e2b2a108b01096020fe0b09014eb6bebaead5af9fCompound132398922021-12-06 9:05:132 days 3 hrs ago0x3996f29fe776360102a210a484beeccf910f47f7 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000959725
0x7d53c1f99161347b4e1b07bbc38799804fb9fd031fb3ced2ddd714755eb0c283Compound132338912021-12-06 3:59:222 days 8 hrs ago0xce38e59ed1c4add056c3b43bb806707d4e479c18 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000905725
0xe74545fad37460cd0292ba2a66c6b2a87d7ec214d2e171c8a2752ced6569b85eCompound132311052021-12-06 1:34:572 days 10 hrs ago0x9db96ad130ed5a2e05bc9de773c38e1ddeddacf9 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000905725
0x5dd661e79615f18f36745793f2981f3c727cda3a64c6e127dc5de489ac85be50Compound132239402021-12-05 19:35:392 days 16 hrs ago0xf4d0106deb7590f77140dd8e6d7d7d262f563d2a IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.00018639
0xfb69879718fedd10b869653de19a0cd8d5de40e81f3bb48b1d4fd08b4c155203Compound132238952021-12-05 19:33:242 days 16 hrs ago0xf4d0106deb7590f77140dd8e6d7d7d262f563d2a IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.00028239
0xd10b112de1d9458826cb670f6d7855a9575791970d02a8bf79e14d7974b6b8e2Compound132237212021-12-05 19:24:292 days 16 hrs ago0xf4d0106deb7590f77140dd8e6d7d7d262f563d2a IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000959725
0x2b6675f376e9dcf3aa6515ee9ca615894de26338b66ea7ebb64f9aa9b4303bc2Approve132200352021-12-05 16:13:042 days 20 hrs ago0x98288d9247713126b687bec457a88f8b2e21ba3b IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000222745
0x254c888b76b21fe612b6cc4252a9f399d53c13a6de973d9695154022cd1f78ecClaim DOT132200092021-12-05 16:11:322 days 20 hrs ago0x98288d9247713126b687bec457a88f8b2e21ba3b IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000897045
0xd9cea009ed0b2f9df5024f911b825a652ee20851ba562cb67553c15911e57eeeClaim DOT132149642021-12-05 11:40:043 days 38 mins ago0x57e831b2d58a0f11bebceb467e182506e506c840 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000836625
0x2eff83d14126b7c7d6a2472021ecfcefbd494ae6a369325fdaaf227cae215849Claim DOT132121812021-12-05 9:19:433 days 2 hrs ago0xb405de3219f27b1dddbc2c4731c79aa033c61808 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000822045
0xb9ddd88f2770a92123007f090761c771c6db50e45fd276cac58fceebf253f491Approve132046382021-12-05 3:00:293 days 9 hrs ago0x06a75f56ef6d3978692dbb900caba23977afc337 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000072915
0xd749112c2bf9ac8ae4cfb8dce172e6b8221a5fa536843f330e33d99ec6078d19Compound132031402021-12-05 1:45:163 days 10 hrs ago0x763473fd7e3462962543f5aebfeaf72a844b550b IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000959725
0x686e4b5db1e62f4bb0ff7a8e2b639582896ee3a2e8ff35a3e0534e6375ce61e2Approve131922732021-12-04 16:41:073 days 19 hrs ago0x0c24d72597367cb17fcb1b79b380cffe06a8e671 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000072915
0xe2c79f30e8b82b39246570a4fd1c19168c2bed28b087db056189b72751c43916Claim DOT131778552021-12-04 4:23:454 days 7 hrs ago0x8391993123ae23696d081d6fe30c3bfdf931a1b2 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000822045
0xf55ade5564b35e138411b75b46c1e3702164a1b20dcfd6dc9034d9a31386d1aaClaim DOT131706562021-12-03 22:21:314 days 13 hrs ago0x81223cb075c4df7e1cb38ddf59b688c265233af5 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000822045
0xd31bc04b609dadafa0783a00b961abcd5b0f59922c06c0b14cf3dd538aa61c5eCompound131513132021-12-03 5:58:225 days 6 hrs ago0xce38e59ed1c4add056c3b43bb806707d4e479c18 IN  0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50 BNB0.000959725
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc5b5a1b996c1ad1f6928805b07090e3e006e0f4b721de053e8fbfe8be637beb1132898862021-12-08 5:19:156 hrs 59 mins ago PancakeSwap: Router v2 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50.000003741465153174 BNB
0xc5b5a1b996c1ad1f6928805b07090e3e006e0f4b721de053e8fbfe8be637beb1132898862021-12-08 5:19:156 hrs 59 mins ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.027339222818805273 BNB
0xc5b5a1b996c1ad1f6928805b07090e3e006e0f4b721de053e8fbfe8be637beb1132898862021-12-08 5:19:156 hrs 59 mins ago PancakeSwap: Router v2 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50.246053005369247458 BNB
0x167c8bfde6db63fb8b8177302c0b4cdc0db54dab10fcbac358d1dee220605d2f132889602021-12-08 4:24:347 hrs 54 mins ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.006771429864608158 BNB
0x759505ea14aa53f54836469a43ddd10ac35de35da4e88879a2fb30e6cc6d667f132782982021-12-07 18:48:2717 hrs 30 mins ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.007932731542238047 BNB
0x7eba1432e1cc593e57085e301e29ad4924971708e7be866b77e9bd833829adc7132735442021-12-07 14:15:4822 hrs 2 mins ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.001686209000667504 BNB
0x9806fdf3e4f7ac0c7d7109923d16f9edd63d38529b343f6a9e65e8afc45c7ceb132589542021-12-07 1:30:031 day 10 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.00065849040374141 BNB
0x697ed1d5c8a0359ef67e54ad793999935aec1693150356445862ce2f583dcf37132509732021-12-06 18:49:241 day 17 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.139994324153312996 BNB
0x713bdbdc79af032e86f7a63b10eb9664ffde2358efbe2ed196474545be42f9f8132509652021-12-06 18:49:001 day 17 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 0xbfaa2949b803ef7e0905336a37f10823901050d71.907302862549393379 BNB
0x4e8a4d2ea8cccd75d6f138da1812245d3d98e5c6414dfd01ee891b11ad3580a1132400792021-12-06 9:14:482 days 3 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.027484697475740784 BNB
0x4e8a4d2ea8cccd75d6f138da1812245d3d98e5c6414dfd01ee891b11ad3580a1132400792021-12-06 9:14:482 days 3 hrs ago PancakeSwap: Router v2 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50.247362277281667058 BNB
0x47a2420430585f719b68757e2b2a108b01096020fe0b09014eb6bebaead5af9f132398922021-12-06 9:05:132 days 3 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.001102094288047043 BNB
0x7d53c1f99161347b4e1b07bbc38799804fb9fd031fb3ced2ddd714755eb0c283132338912021-12-06 3:59:222 days 8 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.004552993285509386 BNB
0xe74545fad37460cd0292ba2a66c6b2a87d7ec214d2e171c8a2752ced6569b85e132311052021-12-06 1:34:572 days 10 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.000243995208357217 BNB
0xd10b112de1d9458826cb670f6d7855a9575791970d02a8bf79e14d7974b6b8e2132237212021-12-05 19:24:292 days 16 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.004456936427726956 BNB
0x2e490b1e661f9942a96fa752875ff36e1eca5ad52da846378cb35e7ab3db92bf132201122021-12-05 16:17:202 days 20 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.027781336317793258 BNB
0x2e490b1e661f9942a96fa752875ff36e1eca5ad52da846378cb35e7ab3db92bf132201122021-12-05 16:17:202 days 20 hrs ago PancakeSwap: Router v2 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50.250032026860139327 BNB
0x254c888b76b21fe612b6cc4252a9f399d53c13a6de973d9695154022cd1f78ec132200092021-12-05 16:11:322 days 20 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.002102932827039722 BNB
0xd9cea009ed0b2f9df5024f911b825a652ee20851ba562cb67553c15911e57eee132149642021-12-05 11:40:043 days 38 mins ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.010689308782494722 BNB
0x2eff83d14126b7c7d6a2472021ecfcefbd494ae6a369325fdaaf227cae215849132121812021-12-05 9:19:433 days 2 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.014867515806609349 BNB
0xdfa6eace1e0aafa2d76e321aa0e573f82aec9d52b0b5d93fcbdcc141703a2bf2132055342021-12-05 3:45:173 days 8 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.027990728274721279 BNB
0xdfa6eace1e0aafa2d76e321aa0e573f82aec9d52b0b5d93fcbdcc141703a2bf2132055342021-12-05 3:45:173 days 8 hrs ago PancakeSwap: Router v2 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50.251916554472491519 BNB
0xd749112c2bf9ac8ae4cfb8dce172e6b8221a5fa536843f330e33d99ec6078d19132031402021-12-05 1:45:163 days 10 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.003336227203974738 BNB
0xb3db0a7afc87207db70d34b76a0635c71755965ee1db1d01a07d41de4002d509131969772021-12-04 20:37:053 days 15 hrs ago 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d5 PancakeSwap: Router v20.02811491377219731 BNB
0xb3db0a7afc87207db70d34b76a0635c71755965ee1db1d01a07d41de4002d509131969772021-12-04 20:37:053 days 15 hrs ago PancakeSwap: Router v2 0x08bd7f9849f8eec12fd78c9fed6ba4e47269e3d50.253034223949775793 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BabyDot

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-07-20
*/

/* 
  
  
  
     ``                       `:`                                                               
        /MN                       hMh                              `dm-               ``            
        mMy                      .MM:                              oMN`              `mM+           
       :MM:://:.      `.:/:-.    yMm:+oo/.     `             ``..``NMs     ``........+MM:..`        
       hMMNmdmNNs   .smNmddmm.  `NMMNdhdNMo  `sd/    `++   -sdmmmmmMM.   :ymmmNMMMNNNMMNmmmy        
      -MMd:`  :MM/ :NMy-   `-`  oMMs.   +MM. sMN.    oMN``yMm+-..:MMy  `yMm+-.-yMM-.+MM:...`        
      yMN`    .MM/.mMy     yNh `NMy     oMM./MM/    .NMy sMm.    /MM-  yMm`    /MM. hMd    `-.      
     .MMh    `hMm-dMM+   `oMMy +MMo    :NMy+NMM-   -dMM/ NMy    -mMm  `MMo    `dMd `MMo   `yMy      
     sMMN+::omMMhNNmMm/:+dMNMd:mMMNo/+hNMNdMdmMd++yNMMMh/NMm-.-oNMMm..:MMh-`./dMd. `MMs../dMh.`.    
     ymshdmmddmmds-`ohmmdy:.ydmmdsyddhyhdhy/-+shdhyoMMhhdhhNNmNms:dNNmNdhNNmNNh+`   +mMmNNh/` os/   
      `  ````````     ```    ````  ``   `   hMs `  +MN` `  ..-.`  `.--.` ..-..       `.-..    `.`   
                                            sMm`  `mMy                                              
                                            `dMd//dMm.                                              
                                             `+hmNms. 


Earn DOT just by holding BabyDOT!
- www.babydot.community/
- https://t.me/BabyDotBSC
- https://t.me/BabyDotBSC_Ann

*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

interface IBEP20 {
  function totalSupply() external view returns (uint256);
  function decimals() external view returns (uint8);
  function symbol() external view returns (string memory);
  function name() external view returns (string memory);
  function getOwner() external view returns (address);
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
  function allowance(address _owner, address spender) external view returns (uint256);
  function approve(address spender, uint256 amount) external returns (bool);
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


interface IPancakeERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

interface IPancakeFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IPancakeRouter01 {
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getamountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getamountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getamountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getamountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IPancakeRouter02 is IPancakeRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}



/**
 * @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 {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == msg.sender, "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 onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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 onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}




////////////////////////////////////////////////////////////////////////////////////////////////////////
//BabyDot Contract ////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
contract BabyDot is IBEP20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;
    
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => uint256) private _sellLock;
    mapping (address => bool) private _NoDiamondPaws;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _whiteList;
    EnumerableSet.AddressSet private _excludedFromSellLock;
    EnumerableSet.AddressSet private _excludedFromStaking;
    //Token Info
    string private constant _name = 'BabyDot';
    string private constant _symbol = 'bDOT';
    uint8 private constant _decimals = 18;
    uint256 public constant _totalSupply= 101 * 10**_decimals;//equals 101

    //BotProtection values
    bool private _botProtection;
    uint8 constant BotMaxTax=99;
    uint256 constant BotTaxTime=10 minutes;
    uint256 public launchTimestamp;
    uint8 private constant _whiteListBonus=20;

    //Divider for the Minimal MaxBalance based on circulating Supply (1%)
    uint8 public constant BalanceLimitDivider=100;
    //Divider for Minimal sellLimit based on circulating Supply (0.05%)
    uint16 public constant SellLimitDivider=2000;
    //Sellers get locked for MaxSellLockTime so they can't dump repeatedly
    uint16 public constant MaxSellLockTime= 2 hours;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime=7 days;
    //Limits max tax, only gets applied for tax changes, doesn't affect inital Tax
    uint8 public constant MaxTax=20;
    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _liquidityTax;
    uint8 private _stakingTax;  
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;


    
    
    
    //The Team Wallet is a Multisig wallet that reqires 3 signatures for each action
    address public constant TeamWallet=0xbFAA2949B803Ef7E0905336A37f10823901050D7;
    //TODO: Change to Mainnet
    //TestNet
    //address private constant PancakeRouter=0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
    //MainNet
    address private constant PancakeRouter=0x10ED43C718714eb63d5aA57B78B54704E256024E;
    //TODO: Change to Mainnet
    address tokenToClaim=0x7083609fCE4d1d8Dc0C979AAb8c869Ea2C873402;//DOT
    //Testnet BUSD
    //address tokenToClaim=0x78867BbEeF44f2326bF8DDd1941a4439382EF2A7;


    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint256 public  balanceLimit;
    uint256 public  sellLimit;


    


       
    address private _pancakePairAddress; 
    IPancakeRouter02 private  _pancakeRouter;
    
    //modifier for functions only the team can call
    modifier onlyTeam() {
        require(_isTeam(msg.sender), "Caller not in Team");
        _;
    }
    //Checks if address is in Team, is needed to give Team access even if contract is renounced
    //Team doesn't have access to critical Functions that could turn this into a Rugpull(Exept liquidity unlocks)
    function _isTeam(address addr) private view returns (bool){
        return addr==owner()||addr==TeamWallet;
    }


    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Constructor///////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    constructor () {
        // Pancake Router
        _pancakeRouter = IPancakeRouter02(PancakeRouter);
        //Creates a Pancake Pair
        _pancakePairAddress = IPancakeFactory(_pancakeRouter.factory()).createPair(address(this), _pancakeRouter.WETH());
        
        //excludes Pancake Router, pair, contract and burn address from staking
        _excludedFromStaking.add(address(this));
        _excludedFromStaking.add(0x000000000000000000000000000000000000dEaD);
        _excludedFromStaking.add(address(_pancakeRouter));
        _excludedFromStaking.add(_pancakePairAddress);

        _addToken(address(this),_totalSupply);
        emit Transfer(address(0), address(this), _totalSupply);


        
        //Sets Buy/Sell limits
        sellLimit=_totalSupply/SellLimitDivider;
        balanceLimit=_totalSupply/BalanceLimitDivider;

        //Limits start disabled
        sellLockDisabled=true;
        
       //Sets sellLockTime to be max by default
        sellLockTime=MaxSellLockTime;
        _transferTax=50;
        _buyTax=10;
        _sellTax=20;

        //100% of the tax goes to Liquidity at start to generate a lot of liquidity during
        //bot Protection
        _stakingTax=0;
        _liquidityTax=100;

        //Team wallet and deployer are excluded from Taxes
        _excluded.add(msg.sender);
        _excluded.add(TeamWallet);


    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Transfer functionality////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Address that is excluded for one transaction
    address private oneTimeExcluced;

    //transfer function, every transfer runs through this function
    function _transfer(address sender, address recipient, uint256 amount) private{
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");
        
        //Manually Excluded adresses are transfering tax and lock free
        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));
        if(oneTimeExcluced==recipient){
            oneTimeExcluced=address(0);
            isExcluded=true;
        }
        //Transactions from and to the contract are always tax and lock free
        bool isContractTransfer=(sender==address(this) || recipient==address(this));
        
        //transfers between PancakeRouter and PancakePair are tax and lock free
        address pancakeRouter=address(_pancakeRouter);
        bool isLiquidityTransfer = ((sender == _pancakePairAddress && recipient == pancakeRouter) 
        || (recipient == _pancakePairAddress && sender == pancakeRouter));

        //differentiate between buy/sell/transfer to apply different taxes/restrictions
        bool isSell=recipient==_pancakePairAddress|| recipient == pancakeRouter;
        bool isBuy=sender==_pancakePairAddress|| sender == pancakeRouter;


        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
        else{ 
            //once trading is enabled, it can't be turned off again
            require(tradingEnabled,"trading not yet enabled");
            _taxedTransfer(sender,recipient,amount,isBuy,isSell);                  
        }
    }

    //applies taxes, checks for limits, locks generates autoLP and stakingBNB, and autostakes
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        uint8 tax;
        if(isSell){
            if(!sellLockDisabled&&!_excludedFromSellLock.contains(sender)){
                require(_sellLock[sender]<=block.timestamp,"Seller in sellLock");
                //Sets the time sellers get locked(2 hours by default)
                _sellLock[sender]=block.timestamp+sellLockTime;
                //Sells can't exceed the sell limit(50.000 Tokens at start, can be updated to circulating supply)
                require(amount<=sellLimit,"Dump protection");
            }
            //As soon someone sells, diamondPaws are gone
            _NoDiamondPaws[sender]=true;
            tax=_sellTax;

        } else if(isBuy){
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            tax=_getBuyTax(recipient);

        } else {//Transfer
            //withdraws BNB when sending less or equal to 1 Token
            //that way you can withdraw without connecting to any dApp.
            //might needs higher gas limit
            if(amount<=10**(_decimals)) claimToken(sender,tokenToClaim,0);
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            //Transfers are disabled in sell lock, this doesn't stop someone from transfering before
            //selling, but there is no satisfying solution for that, and you would need to pax additional tax
            if(!_excludedFromSellLock.contains(sender))
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Sender in Lock");
            tax=_transferTax;

        }     
        //Swapping AutoLP and MarketingBNB is only possible if sender is not pancake pair, 
        //if its not manually disabled, if its not already swapping and if its a Sell to avoid
        // people from causing a large price impact from repeatedly transfering when theres a large backlog of Tokens
        if((sender!=_pancakePairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier)&&isSell)
            _swapContractToken(AutoLPTreshold,false);
        
        //Calculates the exact token amount for each tax
        //staking and liquidity Tax get treated the same, only during conversion they get split
        uint256 contractToken=_calculateFee(amount, tax, _stakingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-contractToken;

        //Removes token and handles staking
        _removeToken(sender,amount);
        
        //Adds the taxed tokens to the contract wallet
       _addToken(address(this), contractToken);

        //Adds token and handles staking
        _addToken(recipient, taxedAmount);
        
        emit Transfer(sender,recipient,taxedAmount);
    }

    function _getBuyTax(address recipient) private returns (uint8)
    {
        if(!_botProtection) return _buyTax;
        if(block.timestamp<(launchTimestamp+BotTaxTime)){
            uint8 tax=_calculateLaunchTax();
            if(_whiteList.contains(recipient)){
                if(tax<(_buyTax+_whiteListBonus)) tax=_buyTax;
                else tax-=_whiteListBonus;
            }
            return tax;
        }
        _botProtection=false;
        _liquidityTax=50;
        _stakingTax=50;
        return _buyTax;
    }
    //Calculates the buy tax right after Launch
    function _calculateLaunchTax() private view returns (uint8){
        if(block.timestamp>launchTimestamp+BotTaxTime) return _buyTax;
        uint256 timeSinceLaunch=block.timestamp-launchTimestamp;
        uint8 Tax=uint8(BotMaxTax-((BotMaxTax-_buyTax)*timeSinceLaunch/BotTaxTime));
        return Tax;
    }



    //Feeless transfer only transfers and autostakes
    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        //Removes token and handles staking
        _removeToken(sender,amount);
        //Adds token and handles staking
        _addToken(recipient, amount);
        
        emit Transfer(sender,recipient,amount);

    }
    //Calculates the token that should be taxed
    function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) {
        return (amount*tax*taxPercent) / 10000;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //BNB Autostake/////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////// 
    //Autostake uses the balances of each holder to redistribute auto generated BNB.
    //Each transaction _addToken and _removeToken gets called for the transaction amount
    //WithdrawBNB can be used for any holder to withdraw BNB at any time, like true Staking,
    //so unlike MRAT clones you can leave and forget your Token and claim after a while

    //lock for the withdraw
    bool private _isWithdrawing;
    //Multiplier to add some accuracy to profitPerShare
    uint256 private constant DistributionMultiplier = 2**64;
    //profit for each share a holder holds, a share equals a token.
    uint256 public profitPerShare;
    //The total shares + _totalSupply to avoid an underflow when substracting
    //need to use getTotalShares to get the actual shares
    uint256 private _totalShares=_totalSupply;
    //the total reward distributed through staking, for tracking purposes
    uint256 public totalStakingReward;
    //the total payout through staking, for tracking purposes
    uint256 public totalPayouts;
    
    //marketing share starts at 50% to push initial marketing, after start
    //its capped to 50% max, the percentage of the staking that gets used for
    //marketing/paying the team
    uint8 public marketingShare=50;
    //balance that is claimable by the team
    uint256 public marketingBalance;

    //Mapping of the already paid out(or missed) shares of each staker
    mapping(address => uint256) private alreadyPaidShares;
    //Mapping of shares that are reserved for payout
    mapping(address => uint256) private toBePaid;

    function getTotalShares() public view returns (uint256){
        return _totalShares-_totalSupply;
    }
    //Contract, pancake and burnAddress are excluded, other addresses like CEX
    //can be manually excluded, excluded list is limited to 30 entries to avoid a
    //out of gas exeption during sells
    function isExcludedFromStaking(address addr) public view returns (bool){
        return _excludedFromStaking.contains(addr);
    }

    //adds Token to balances, adds new BNB to the toBePaid mapping and resets staking
    function _addToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]+amount;
        
        if(isExcludedFromStaking(addr)){
           _balances[addr]=newAmount;
           return;
        }
        _totalShares+=amount;
        //gets the payout before the change
        uint256 payment=_newDividentsOf(addr);
        //resets dividents to 0 for newAmount
        alreadyPaidShares[addr] = profitPerShare * newAmount;
        //adds dividents to the toBePaid mapping
        toBePaid[addr]+=payment; 
        //sets newBalance
        _balances[addr]=newAmount;
    }
    
    
    //removes Token, adds BNB to the toBePaid mapping and resets staking
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
        
        if(isExcludedFromStaking(addr)){
           _balances[addr]=newAmount;
           return;
        }
        _totalShares-=amount;
        //gets the payout before the change
        uint256 payment=_newDividentsOf(addr);
        //sets newBalance
        _balances[addr]=newAmount;
        //resets dividents to 0 for newAmount
        alreadyPaidShares[addr] = profitPerShare * newAmount;
        //adds dividents to the toBePaid mapping
        toBePaid[addr]+=payment; 
    }
    
    
    //gets the not dividents of a staker that aren't in the toBePaid mapping 
    //returns wrong value for excluded accounts
    function _newDividentsOf(address staker) private view returns (uint256) {
        uint256 fullPayout = profitPerShare * _balances[staker];
        // if theres an overflow for some unexpected reason, return 0, instead of 
        // an exeption to still make trades possible
        if(fullPayout<alreadyPaidShares[staker]) return 0;
        return (fullPayout - alreadyPaidShares[staker]) / DistributionMultiplier;
    }

    //distributes bnb between marketing share and dividents 
    function _distributeStake(uint256 BNBamount,bool newStakingReward) private {
        // Deduct marketing Tax
        uint256 marketingSplit = (BNBamount * marketingShare) / 100;
        uint256 amount = BNBamount - marketingSplit;

       marketingBalance+=marketingSplit;
       
        if (amount > 0) {
            if(newStakingReward){
                totalStakingReward += amount;
            }
            uint256 totalShares=getTotalShares();
            //when there are 0 shares, add everything to marketing budget
            if (totalShares == 0) {
                marketingBalance += amount;
            }else{
                //Increases profit per share based on current total shares
                profitPerShare += ((amount * DistributionMultiplier) / totalShares);
            }
        }
    }
    event OnWithdrawToken(uint256 amount, address token, address recipient);

    function TeamSetDiamondPaws(uint8 fee, bool feeOn) public onlyTeam{
        require(fee<=50,"diamond paws Fee is capped to 50%");
        noDiamondPawsFeeOn=feeOn;
        noDiamondPawsFeePercent=fee;
    }
    uint8 public noDiamondPawsFeePercent=50;
    bool public noDiamondPawsFeeOn=true;

    //withdraws all dividents of address
    function claimToken(address addr, address token, uint256 payableAmount) private{
        require(!_isWithdrawing);
        _isWithdrawing=true;
        uint256 amount;
        if(isExcludedFromStaking(addr)){
            //if excluded just withdraw remaining toBePaid BNB
            amount=toBePaid[addr];
            toBePaid[addr]=0;
        }
        else{
            uint256 newAmount=_newDividentsOf(addr);
            //sets payout mapping to current amount
            alreadyPaidShares[addr] = profitPerShare * _balances[addr];
            //the amount to be paid 
            amount=toBePaid[addr]+newAmount;
            toBePaid[addr]=0;
        }
        if(amount==0&&payableAmount==0){//no withdraw if 0 amount
            _isWithdrawing=false;
            return;
        }
        //If you don't have diamond paws you are redistributing a part of your reward
        //Compound wont be punished
        if(noDiamondPawsFeeOn&&_NoDiamondPaws[addr]&&token!=address(this)){
            uint256 noDiamondPawsFee=amount*noDiamondPawsFeePercent/100;
            amount=amount-noDiamondPawsFee;
            _distributeStake(noDiamondPawsFee,false);
        }

        totalPayouts+=amount;
        amount+=payableAmount;
        address[] memory path = new address[](2);
        path[0] = _pancakeRouter.WETH(); //BNB
        path[1] = token;

        _pancakeRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
        0,
        path,
        addr,
        block.timestamp);
        
        emit OnWithdrawToken(amount,token, addr);
        _isWithdrawing=false;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Swap Contract Tokens//////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    //tracks auto generated BNB, useful for ticker etc
    uint256 public totalLPBNB;
    //Locks the swap if already swapping
    bool private _isSwappingContractModifier;
    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

    //swaps the token on the contract for Marketing BNB and LP Token.
    //always swaps the sellLimit of token to avoid a large price impact
    function _swapContractToken(uint16 permilleOfPancake,bool ignoreLimits) private lockTheSwap{
        require(permilleOfPancake<=500);
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_liquidityTax+_stakingTax;
        if(totalTax==0) return;

        uint256 tokenToSwap=_balances[_pancakePairAddress]*permilleOfPancake/1000;
        if(tokenToSwap>sellLimit&&!ignoreLimits) tokenToSwap=sellLimit;
        
        //only swap if contractBalance is larger than tokenToSwap, and totalTax is unequal to 0
        bool NotEnoughToken=contractBalance<tokenToSwap;
        if(NotEnoughToken){
            if(ignoreLimits)
                tokenToSwap=contractBalance;
            else return;
        }

        //splits the token in TokenForLiquidity and tokenForMarketing
        uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax;
        uint256 tokenForMarketing= tokenToSwap-tokenForLiquidity;

        //splits tokenForLiquidity in 2 halves
        uint256 liqToken=tokenForLiquidity/2;
        uint256 liqBNBToken=tokenForLiquidity-liqToken;

        //swaps marktetingToken and the liquidity token half for BNB
        uint256 swapToken=liqBNBToken+tokenForMarketing;
        //Gets the initial BNB balance, so swap won't touch any staked BNB
        uint256 initialBNBBalance = address(this).balance;
        _swapTokenForBNB(swapToken);
        uint256 newBNB=(address(this).balance - initialBNBBalance);
        //calculates the amount of BNB belonging to the LP-Pair and converts them to LP
        uint256 liqBNB = (newBNB*liqBNBToken)/swapToken;
        _addLiquidity(liqToken, liqBNB);
        //Get the BNB balance after LP generation to get the
        //exact amount of token left for Staking
        uint256 distributeBNB=(address(this).balance - initialBNBBalance);
        //distributes remaining BNB between stakers and Marketing
        _distributeStake(distributeBNB,true);
    }
    //swaps tokens on the contract for BNB
    function _swapTokenForBNB(uint256 amount) private {
        _approve(address(this), address(_pancakeRouter), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _pancakeRouter.WETH();

        _pancakeRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    //Adds Liquidity directly to the contract where LP are locked(unlike safemoon forks, that transfer it to the owner)
    function _addLiquidity(uint256 tokenamount, uint256 bnbamount) private {
        totalLPBNB+=bnbamount;
        _approve(address(this), address(_pancakeRouter), tokenamount);
        _pancakeRouter.addLiquidityETH{value: bnbamount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //public functions /////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////// 
    function getLiquidityReleaseTimeInSeconds() public view returns (uint256){
        if(block.timestamp<_liquidityUnlockTime){
            return _liquidityUnlockTime-block.timestamp;
        }
        return 0;
    }

    function getLimits() public view returns(uint256 balance, uint256 sell){
        return(balanceLimit/10, sellLimit/10);
    }

    function getTaxes() public view returns(uint256 liquidityTax,uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){
        if(_botProtection) buyTax=_calculateLaunchTax();
        else buyTax= _buyTax;
       
        return (_liquidityTax,_stakingTax,buyTax,_sellTax,_transferTax);
    }

    function getWhitelistedStatus(address AddressToCheck) public view returns(bool){
        return _whiteList.contains(AddressToCheck);
    }

    function hasDiamondPaws(address AddressToCheck) public view returns(bool){
        return !_NoDiamondPaws[AddressToCheck];
    }

    //How long is a given address still locked from selling
    function getAddressSellLockTimeInSeconds(address AddressToCheck) public view returns (uint256){
       uint256 lockTime=_sellLock[AddressToCheck];
       if(lockTime<=block.timestamp){
           return 0;
       }
       return lockTime-block.timestamp;
    }
    function getSellLockTimeInSeconds() public view returns(uint256){
        return sellLockTime;
    }
    
    

    bool allowTaxFreeCompound=true;
    function TeamSetCompoundTaxFree(bool taxFree) public onlyTeam{
        allowTaxFreeCompound=taxFree;
    }

    //withdraws dividents of sender
    function ClaimDOT() public {
        claimToken(msg.sender,tokenToClaim,0);
    }
    function Compound() public{
        if(allowTaxFreeCompound)
            oneTimeExcluced=msg.sender;
        claimToken(msg.sender,address(this),0);
    }
    
    function ClaimAnyToken(address token) public payable{
        claimToken(msg.sender,token,msg.value);
    }
    
    
    function getDividents(address addr) private view returns (uint256){
        if(isExcludedFromStaking(addr)) return toBePaid[addr];
        return _newDividentsOf(addr)+toBePaid[addr];
    }

    function getDividentsOf(address addr) public view returns (uint256){
        uint256 amount=getDividents(addr);
        if(noDiamondPawsFeeOn&&_NoDiamondPaws[addr])
            amount-=amount*noDiamondPawsFeePercent/100;
        return amount;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Settings//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    bool public sellLockDisabled;
    uint256 public sellLockTime;
    bool public manualConversion;
    uint16 public AutoLPTreshold=50;
    
    function TeamSetAutoLPTreshold(uint16 treshold) public onlyTeam{
        require(treshold>0,"treshold needs to be more than 0");
        require(treshold<=50,"treshold needs to be below 50");
        AutoLPTreshold=treshold;
    }
    
    //Excludes account from Staking total 
    function TeamExcludeFromStaking(address addr) public onlyTeam{
        require(!isExcludedFromStaking(addr));
        _totalShares-=_balances[addr];
        uint256 newDividents=_newDividentsOf(addr);
        alreadyPaidShares[addr]=_balances[addr]*profitPerShare;
        toBePaid[addr]+=newDividents;
        _excludedFromStaking.add(addr);
    }    

    //Includes excluded Account to staking
    function TeamIncludeToStaking(address addr) public onlyTeam{
        require(isExcludedFromStaking(addr));
        _totalShares+=_balances[addr];
        _excludedFromStaking.remove(addr);
        //sets alreadyPaidShares to the current amount
        alreadyPaidShares[addr]=_balances[addr]*profitPerShare;
    }

    function TeamWithdrawMarketingBNB() public onlyTeam{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        (bool sent,) =TeamWallet.call{value: (amount)}("");
        require(sent,"withdraw failed");
    } 
    function TeamWithdrawMarketingBNB(uint256 amount) public onlyTeam{
        require(amount<=marketingBalance);
        marketingBalance-=amount;
        (bool sent,) =TeamWallet.call{value: (amount)}("");
        require(sent,"withdraw failed");
    } 

    //switches autoLiquidity and marketing BNB generation during transfers
    function TeamSwitchManualBNBConversion(bool manual) public onlyTeam{
        manualConversion=manual;
    }
    //Sets SellLockTime, needs to be lower than MaxSellLockTime
    function TeamSetSellLockTime(uint256 sellLockSeconds)public onlyTeam{
            require(sellLockSeconds<=MaxSellLockTime,"Sell Lock time too high");
            sellLockTime=sellLockSeconds;
    } 

    //Sets Taxes, is limited by MaxTax(20%) to make it impossible to create honeypot
    function TeamSetTaxes(uint8 liquidityTaxes, uint8 stakingTaxes,uint8 buyTax, uint8 sellTax, uint8 transferTax) public onlyTeam{
        uint8 totalTax=liquidityTaxes+stakingTaxes;
        require(totalTax==100, "liq+staking needs to equal 100%");
        require(buyTax<=MaxTax&&sellTax<=MaxTax,"taxes higher than max tax");
        require(transferTax<=50,"transferTax higher than max transferTax");        
        _liquidityTax=liquidityTaxes;
        _stakingTax=stakingTaxes;
        
        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;
    }
    //How much of the staking tax should be allocated for marketing
    function TeamChangeMarketingShare(uint8 newShare) public onlyTeam{
        require(newShare<=50); 
        marketingShare=newShare;
    }
    
    //manually converts contract token to LP and staking BNB
    function TeamCreateLPandBNB(uint16 PermilleOfPancake, bool ignoreLimits) public onlyTeam{
    _swapContractToken(PermilleOfPancake, ignoreLimits);
    }
    
    
    //Exclude/Include account from fees (eg. CEX)
    function TeamExcludeAccountFromFees(address account) public onlyTeam {
        _excluded.add(account);
    }
    function TeamIncludeAccountToFees(address account) public onlyTeam {
        _excluded.remove(account);
    }
    //Exclude/Include account from fees (eg. CEX)
    function TeamExcludeAccountFromSellLock(address account) public onlyTeam {
        _excludedFromSellLock.add(account);
    }
    function TeamIncludeAccountToSellLock(address account) public onlyTeam {
        _excludedFromSellLock.remove(account);
    }
    
     //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) public onlyTeam{
 
        //Calculates the target Limits based on supply
        uint256 targetBalanceLimit=_totalSupply/BalanceLimitDivider;
        uint256 targetSellLimit=_totalSupply/SellLimitDivider;

        require((newBalanceLimit>=targetBalanceLimit), 
        "newBalanceLimit needs to be at least target");
        require((newSellLimit>=targetSellLimit), 
        "newSellLimit needs to be at least target");

        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;     
    }

    event OnSwitchSellLock(bool disabled);
    //Disables the timeLock after selling for everyone
    function TeamDisableSellLock(bool disabled) public onlyTeam{
        sellLockDisabled=disabled;
        emit OnSwitchSellLock(disabled);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    function SetupCreateLP(uint8 TeamTokenPercent) public payable onlyTeam{
        require(IBEP20(_pancakePairAddress).totalSupply()==0,"There are alreadyLP");
        
        uint256 Token=_balances[address(this)];
        
        uint256 TeamToken=Token*TeamTokenPercent/100;
        uint256 LPToken=Token-TeamToken;
        
        _removeToken(address(this),TeamToken);  
        _addToken(msg.sender, TeamToken);
        emit Transfer(address(this), msg.sender, TeamToken);
        
        _addLiquidity(LPToken, msg.value);
        
    }

    
    bool public tradingEnabled;
    //Enables trading for everyone
    function SetupEnableTrading(bool BotProtection) public onlyTeam{
        require(IBEP20(_pancakePairAddress).totalSupply()>0,"there are no LP");
        require(!tradingEnabled);
        tradingEnabled=true;
        _botProtection=BotProtection;
        launchTimestamp=block.timestamp;
        //Liquidity gets locked for 7 days at start, needs to be prolonged once
        //start is successful
        _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
    }

    function SetupAddOrRemoveWhitelist(address[] memory addresses,bool Add) public onlyTeam{
        for(uint i=0; i<addresses.length; i++){
            if(Add) _whiteList.add(addresses[i]);
            else _whiteList.remove(addresses[i]);
        }
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Liquidity Lock////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //the timestamp when Liquidity unlocks
    uint256 private _liquidityUnlockTime;

    //Sets Liquidity Release to 20% at a time and prolongs liquidity Lock for a Week after Release. 
    //Should be called once start was successful.
    bool public liquidityRelease20Percent;
    function TeamlimitLiquidityReleaseTo20Percent() public onlyTeam{
        liquidityRelease20Percent=true;
    }

    function TeamUnlockLiquidityInSeconds(uint256 secondsUntilUnlock) public onlyTeam{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
    }
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime);
        _liquidityUnlockTime=newUnlockTime;
    }

    //Release Liquidity Tokens once unlock time is over
    function TeamReleaseLiquidity() public onlyTeam {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        
        IPancakeERC20 liquidityToken = IPancakeERC20(_pancakePairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        if(liquidityRelease20Percent)
        {
            _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
            //regular liquidity release, only releases 20% at a time and locks liquidity for another week
            amount=amount*2/10;
            liquidityToken.transfer(TeamWallet, amount);
        }
        else
        {
            //Liquidity release if something goes wrong at start
            //liquidityRelease20Percent should be called once everything is clear
            liquidityToken.transfer(TeamWallet, amount);
        }
    }
    //Removes Liquidity once unlock Time is over, 
    function TeamRemoveLiquidity(bool addToStaking) public onlyTeam {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
        IPancakeERC20 liquidityToken = IPancakeERC20(_pancakePairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        if(liquidityRelease20Percent){
            amount=amount*2/10; //only remove 20% each
        } 
        liquidityToken.approve(address(_pancakeRouter),amount);
        //Removes Liquidity and either distributes liquidity BNB to stakers, or 
        // adds them to marketing Balance
        //Token will be converted
        //to Liquidity and Staking BNB again
        uint256 initialBNBBalance = address(this).balance;
        _pancakeRouter.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            0,
            0,
            address(this),
            block.timestamp
            );
        uint256 newBNBBalance = address(this).balance-initialBNBBalance;
        if(addToStaking){
            _distributeStake(newBNBBalance,true);
        }
        else{
            marketingBalance+=newBNBBalance;
        }

    }
    //Releases all remaining BNB on the contract wallet, so BNB wont be burned
    //Can only be called 30 days after Liquidity unlocks 
    function TeamRemoveRemainingBNB() public onlyTeam{
        require(block.timestamp >= _liquidityUnlockTime+30 days, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
        (bool sent,) =TeamWallet.call{value: (address(this).balance)}("");
        require(sent);
    }
    function RescueStrandedToken(address tokenAddress) public onlyTeam{
        require(tokenAddress!=_pancakePairAddress&&tokenAddress!=address(this),"can't Rescue LP token or this token");
        IBEP20 token=IBEP20(tokenAddress);
        token.transfer(msg.sender,token.balanceOf(address(this)));
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //external//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

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

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

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

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

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

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address _owner, address spender) external view override returns (uint256) {
        return _allowances[_owner][spender];
    }

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "Approve from zero");
        require(spender != address(0), "Approve to zero");

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

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");

        _approve(sender, msg.sender, currentAllowance - amount);
        return true;
    }

    // IBEP20 - Helpers

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 currentAllowance = _allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "<0 allowance");

        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

}

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":false,"internalType":"bool","name":"disabled","type":"bool"}],"name":"OnSwitchSellLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"OnWithdrawToken","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"AutoLPTreshold","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"ClaimAnyToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ClaimDOT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MaxSellLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"RescueStrandedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"Add","type":"bool"}],"name":"SetupAddOrRemoveWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"TeamTokenPercent","type":"uint8"}],"name":"SetupCreateLP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"BotProtection","type":"bool"}],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"TeamChangeMarketingShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"PermilleOfPancake","type":"uint16"},{"internalType":"bool","name":"ignoreLimits","type":"bool"}],"name":"TeamCreateLPandBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamExcludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamExcludeAccountFromSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"TeamExcludeFromStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamIncludeAccountToFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamIncludeAccountToSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"TeamIncludeToStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamReleaseLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"addToStaking","type":"bool"}],"name":"TeamRemoveLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamRemoveRemainingBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"treshold","type":"uint16"}],"name":"TeamSetAutoLPTreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"taxFree","type":"bool"}],"name":"TeamSetCompoundTaxFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"fee","type":"uint8"},{"internalType":"bool","name":"feeOn","type":"bool"}],"name":"TeamSetDiamondPaws","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellLockSeconds","type":"uint256"}],"name":"TeamSetSellLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"stakingTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"TeamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualBNBConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamUnlockLiquidityInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"TeamUpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TeamWithdrawMarketingBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamWithdrawMarketingBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamlimitLiquidityReleaseTo20Percent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getAddressSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getDividentsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLimits","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"liquidityTax","type":"uint256"},{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getWhitelistedStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"hasDiamondPaws","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityRelease20Percent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"noDiamondPawsFeeOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noDiamondPawsFeePercent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalLPBNB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"}]

6080604052600f8054600160281b600160c81b031916787083609fce4d1d8dc0c979aab8c869ea2c8734020000000000179055620000406012600a6200077c565b6200004d9060656200083b565b6016556019805460ff19166032179055601d805461013261ffff19909116179055601f805461ff0019166101001790556021805461320062ffff00199091161790553480156200009c57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601380546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e9081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b1580156200013e57600080fd5b505afa15801562000153573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001799190620006ce565b6001600160a01b031663c9c6539630601360009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620001d757600080fd5b505afa158015620001ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002129190620006ce565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200025b57600080fd5b505af115801562000270573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002969190620006ce565b601260006101000a8154816001600160a01b0302191690836001600160a01b03160217905550620002d730600b6200049360201b620027761790919060201c565b50620002f561dead600b6200049360201b620027761790919060201c565b506013546200031c90600b906001600160a01b031662000493602090811b6200277617901c565b506012546200034390600b906001600160a01b031662000493602090811b6200277617901c565b506200036a30620003576012600a6200077c565b620003649060656200083b565b620004b3565b3060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6200039c6012600a6200077c565b620003a99060656200083b565b60405190815260200160405180910390a36107d0620003cb6012600a6200077c565b620003d89060656200083b565b620003e4919062000712565b6011556064620003f76012600a6200077c565b620004049060656200083b565b62000410919062000712565b601055601f805462ff0000191662010000179055611c206020908155600f80546432140a006464ffffffffff199091161790556200045c9060059033906200277662000493821b17901c565b506200048c73bfaa2949b803ef7e0905336a37f10823901050d760056200049360201b620027761790919060201c565b506200088d565b6000620004aa836001600160a01b038416620005a3565b90505b92915050565b6001600160a01b038216600090815260016020526040812054620004d9908390620006f7565b9050620004e683620005f5565b156200050c576001600160a01b0390921660009081526001602052604090209190915550565b8160166000828254620005209190620006f7565b9091555060009050620005338462000612565b9050816015546200054591906200083b565b6001600160a01b0385166000908152601b6020908152604080832093909355601c905290812080548392906200057d908490620006f7565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b6000818152600183016020526040812054620005ec57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620004ad565b506000620004ad565b6000620004ad82600b620006ab60201b6200278b1790919060201c565b6001600160a01b03811660009081526001602052604081205460155482916200063b916200083b565b6001600160a01b0384166000908152601b6020526040902054909150811015620006685750600092915050565b6001600160a01b0383166000908152601b602052604090205468010000000000000000906200069890836200085d565b620006a4919062000712565b9392505050565b6001600160a01b03811660009081526001830160205260408120541515620004aa565b600060208284031215620006e0578081fd5b81516001600160a01b0381168114620006a4578182fd5b600082198211156200070d576200070d62000877565b500190565b6000826200072e57634e487b7160e01b81526012600452602481fd5b500490565b600181815b808511156200077457816000190482111562000758576200075862000877565b808516156200076657918102915b93841c939080029062000738565b509250929050565b6000620004aa60ff8416836000826200079857506001620004ad565b81620007a757506000620004ad565b8160018114620007c05760028114620007cb57620007eb565b6001915050620004ad565b60ff841115620007df57620007df62000877565b50506001821b620004ad565b5060208310610133831016604e8410600b841016171562000810575081810a620004ad565b6200081c838362000733565b806000190482111562000833576200083362000877565b029392505050565b600081600019048311821515161562000858576200085862000877565b500290565b60008282101562000872576200087262000877565b500390565b634e487b7160e01b600052601160045260246000fd5b614558806200089d6000396000f3fe6080604052600436106104315760003560e01c8063715018a611610227578063b3da7ef51161012d578063dff6bcbf116100b0578063f00df36511610077578063f00df36514610d1c578063f24a1e7014610d32578063f2fde38b14610d47578063f88b0e4614610d67578063f9963ca114610d7d57005b8063dff6bcbf14610c87578063e7b1568414610ca7578063e8d834a614610cc7578063ead8acb014610ce7578063eb8e886314610d0757005b8063d5002f2e116100f4578063d5002f2e14610bd7578063d51f383b14610bec578063d63607d814610c0c578063d8e8de3414610c21578063dd62ed3e14610c4157005b8063b3da7ef514610b4d578063b717a7d714610b6d578063bc515e5014610b8d578063c3a3c03214610ba2578063ce7de67614610bb757005b80638728ecd1116101b55780638da5cb5b1161017c5780638da5cb5b14610a6c57806395d89b4114610ac05780639fa62d5f14610aed578063a457c2d714610b0d578063a9059cbb14610b2d57005b80638728ecd114610a2c578063887c60fb14610a4c578063893d20e814610a6c5780638d060d7714610a8a5780638d2c503914610aa057005b80637f919373116101f95780637f919373146109b2578063846a0efa146109c7578063852147f7146109dc5780638650e92a146109fc57806386d0ada814610a1257005b8063715018a6146109475780637335307b1461095c57806373ddf08e1461097c578063762bb2821461099c57005b8063395093511161033757806358780a82116102ba57806365cf7c9b1161028157806365cf7c9b14610871578063677a8870146108875780636a3821e2146108c75780636f89e409146108e757806370a082311461091157005b806358780a82146107e8578063588aeaf21461080857806358e5536514610828578063592d66001461083e5780635a037ab21461085157005b806345fec486116102fe57806345fec4861461075757806349bdf873146107775780634ada218b146107915780634f91e48c146107b257806353c2ab56146107c857005b806339509351146106d75780633a6dd489146106f75780633c7a309b146107175780633eaaf86b1461072c5780634089b1701461074157005b806318160ddd116103bf5780632b80e5a9116103865780632b80e5a9146106595780632c889d1814610678578063311a869714610698578063313ce567146106ad5780633478154b146106c157005b806318160ddd146105ba57806318a91092146105cf57806318cb474f146105e257806323b872dd146105fc5780632973ef2d1461061c57005b80630c4d4801116104035780630c4d4801146104f85780630fd99e16146105185780631087a0d4146105415780631285073c1461057b57806314e913771461059a57005b806306fdde031461043a57806309218ee71461047c578063095ea7b3146104a85780630b1daa3e146104d857005b3661043857005b005b34801561044657600080fd5b506040805180820190915260078152661098589e511bdd60ca1b60208201525b604051610473919061422f565b60405180910390f35b34801561048857600080fd5b506019546104969060ff1681565b60405160ff9091168152602001610473565b3480156104b457600080fd5b506104c86104c3366004613ee4565b610d9d565b6040519015158152602001610473565b3480156104e457600080fd5b506104386104f3366004613e34565b610db4565b34801561050457600080fd5b506104386105133660046140fd565b610df1565b34801561052457600080fd5b5061052e6107d081565b60405161ffff9091168152602001610473565b34801561054d57600080fd5b506104c861055c366004613e34565b6001600160a01b031660009081526004602052604090205460ff161590565b34801561058757600080fd5b506020545b604051908152602001610473565b3480156105a657600080fd5b506104386105b5366004613fe8565b610e9c565b3480156105c657600080fd5b5061058c610f17565b6104386105dd366004613e34565b610f35565b3480156105ee57600080fd5b50601d546104969060ff1681565b34801561060857600080fd5b506104c8610617366004613ea4565b610f43565b34801561062857600080fd5b50610631610fda565b604080519586526020860194909452928401919091526060830152608082015260a001610473565b34801561066557600080fd5b50601d546104c890610100900460ff1681565b34801561068457600080fd5b50610438610693366004614065565b61103f565b3480156106a457600080fd5b50610496606481565b3480156106b957600080fd5b506012610496565b3480156106cd57600080fd5b5061052e611c2081565b3480156106e357600080fd5b506104c86106f2366004613ee4565b611076565b34801561070357600080fd5b5060215461052e90610100900461ffff1681565b34801561072357600080fd5b506104386110ad565b34801561073857600080fd5b5061058c61128d565b34801561074d57600080fd5b5061058c60185481565b34801561076357600080fd5b50610438610772366004614020565b6112a7565b34801561078357600080fd5b506023546104c89060ff1681565b34801561079d57600080fd5b506021546104c8906301000000900460ff1681565b3480156107be57600080fd5b5061058c60115481565b3480156107d457600080fd5b5061058c6107e3366004613e34565b611393565b3480156107f457600080fd5b50610438610803366004613fe8565b611404565b34801561081457600080fd5b50610438610823366004613e34565b611539565b34801561083457600080fd5b5061058c601a5481565b61043861084c3660046140e3565b611569565b34801561085d57600080fd5b5061043861086c366004613e34565b6116ec565b34801561087d57600080fd5b5061058c600e5481565b34801561089357600080fd5b506108af73bfaa2949b803ef7e0905336a37f10823901050d781565b6040516001600160a01b039091168152602001610473565b3480156108d357600080fd5b506104386108e2366004613f0f565b611844565b3480156108f357600080fd5b506108fc61190b565b60408051928352602083019190915201610473565b34801561091d57600080fd5b5061058c61092c366004613e34565b6001600160a01b031660009081526001602052604090205490565b34801561095357600080fd5b50610438611934565b34801561096857600080fd5b506104c8610977366004613e34565b6119e7565b34801561098857600080fd5b506104386109973660046140e3565b6119f4565b3480156109a857600080fd5b5061058c60105481565b3480156109be57600080fd5b50610438611a40565b3480156109d357600080fd5b50610438611b13565b3480156109e857600080fd5b506104386109f7366004613e34565b611b44565b348015610a0857600080fd5b5061058c60155481565b348015610a1e57600080fd5b506021546104c89060ff1681565b348015610a3857600080fd5b5061058c610a47366004613e34565b611bfb565b348015610a5857600080fd5b50601f546104c89062010000900460ff1681565b348015610a7857600080fd5b506000546001600160a01b03166108af565b348015610a9657600080fd5b5061058c601e5481565b348015610aac57600080fd5b50610438610abb366004613fe8565b611c2e565b348015610acc57600080fd5b50604080518082019091526004815263189113d560e21b6020820152610466565b348015610af957600080fd5b50610438610b08366004614095565b611c66565b348015610b1957600080fd5b506104c8610b28366004613ee4565b611dac565b348015610b3957600080fd5b506104c8610b48366004613ee4565b611e28565b348015610b5957600080fd5b50610438610b68366004614118565b611e35565b348015610b7957600080fd5b50610438610b8836600461403a565b611fe8565b348015610b9957600080fd5b50610438612017565b348015610bae57600080fd5b5061058c612039565b348015610bc357600080fd5b50610438610bd2366004613e34565b612059565b348015610be357600080fd5b5061058c61213d565b348015610bf857600080fd5b50610438610c07366004614065565b612163565b348015610c1857600080fd5b506104386121df565b348015610c2d57600080fd5b506104c8610c3c366004613e34565b612213565b348015610c4d57600080fd5b5061058c610c5c366004613e6c565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610c9357600080fd5b50610438610ca2366004613e34565b612220565b348015610cb357600080fd5b50610438610cc2366004613fe8565b612250565b348015610cd357600080fd5b50610438610ce2366004613fe8565b61228f565b348015610cf357600080fd5b50610438610d02366004614065565b6124e6565b348015610d1357600080fd5b50610496601481565b348015610d2857600080fd5b5061058c60175481565b348015610d3e57600080fd5b50610438612554565b348015610d5357600080fd5b50610438610d62366004613e34565b612621565b348015610d7357600080fd5b5061058c60205481565b348015610d8957600080fd5b50610438610d98366004613e34565b61274a565b6000610daa3384846127ad565b5060015b92915050565b610dbd336128a0565b610de25760405162461bcd60e51b8152600401610dd9906142ac565b60405180910390fd5b610ded6009826128de565b5050565b610dfa336128a0565b610e165760405162461bcd60e51b8152600401610dd9906142ac565b60328260ff161115610e745760405162461bcd60e51b815260206004820152602160248201527f6469616d6f6e642070617773204665652069732063617070656420746f2035306044820152602560f81b6064820152608401610dd9565b601d805460ff9390931660ff19921515610100029290921661ffff1990931692909217179055565b610ea5336128a0565b610ec15760405162461bcd60e51b8152600401610dd9906142ac565b601f8054821515620100000262ff0000199091161790556040517fcf9eab7a3a95938e6ae84e8f571451986ace439f2ee92df873ae3e21549c3bb890610f0c90831515815260200190565b60405180910390a150565b6000610f256012600a6143b4565b610f3090606561445f565b905090565b610f403382346128f3565b50565b6000610f50848484612c80565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610fbb5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610dd9565b610fcf8533610fca868561447e565b6127ad565b506001949350505050565b600d54600090819081908190819060ff161561100257610ff8612eee565b60ff169250611011565b600f5462010000900460ff1692505b5050600f5460ff80821695610100830482169550929350630100000082048116926401000000009092041690565b611048336128a0565b6110645760405162461bcd60e51b8152600401610dd9906142ac565b610f406110714283614314565b612f6d565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610daa918590610fca908690614314565b6110b6336128a0565b6110d25760405162461bcd60e51b8152600401610dd9906142ac565b6022544210156110f45760405162461bcd60e51b8152600401610dd990614282565b6012546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561113c57600080fd5b505afa158015611150573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611174919061407d565b60235490915060ff16156112465761118f62093a8042614314565b602255600a61119f82600261445f565b6111a99190614351565b60405163a9059cbb60e01b815273bfaa2949b803ef7e0905336a37f10823901050d76004820152602481018290529091506001600160a01b0383169063a9059cbb906044015b602060405180830381600087803b15801561120957600080fd5b505af115801561121d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112419190614004565b505050565b60405163a9059cbb60e01b815273bfaa2949b803ef7e0905336a37f10823901050d76004820152602481018290526001600160a01b0383169063a9059cbb906044016111ef565b6112996012600a6143b4565b6112a490606561445f565b81565b6112b0336128a0565b6112cc5760405162461bcd60e51b8152600401610dd9906142ac565b60008161ffff16116113205760405162461bcd60e51b815260206004820181905260248201527f74726573686f6c64206e6565647320746f206265206d6f7265207468616e20306044820152606401610dd9565b60328161ffff1611156113755760405162461bcd60e51b815260206004820152601d60248201527f74726573686f6c64206e6565647320746f2062652062656c6f772035300000006044820152606401610dd9565b6021805461ffff9092166101000262ffff0019909216919091179055565b60008061139f83612f80565b601d54909150610100900460ff1680156113d157506001600160a01b03831660009081526004602052604090205460ff165b15610dae57601d546064906113e99060ff168361445f565b6113f39190614351565b6113fd908261447e565b9392505050565b61140d336128a0565b6114295760405162461bcd60e51b8152600401610dd9906142ac565b601254604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561146e57600080fd5b505afa158015611482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a6919061407d565b116114e55760405162461bcd60e51b815260206004820152600f60248201526e0746865726520617265206e6f204c5608c1b6044820152606401610dd9565b6021546301000000900460ff16156114fc57600080fd5b6021805463ff00000019166301000000179055600d805482151560ff1990911617905542600e8190556115339062093a8090614314565b60225550565b611542336128a0565b61155e5760405162461bcd60e51b8152600401610dd9906142ac565b610ded600582612776565b611572336128a0565b61158e5760405162461bcd60e51b8152600401610dd9906142ac565b601260009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115dc57600080fd5b505afa1580156115f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611614919061407d565b156116575760405162461bcd60e51b8152602060048201526013602482015272054686572652061726520616c72656164794c5606c1b6044820152606401610dd9565b3060009081526001602052604081205490606461167760ff85168461445f565b6116819190614351565b9050600061168f828461447e565b905061169b3083612fd8565b6116a533836130bc565b604051828152339030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36116e6813461319f565b50505050565b6116f5336128a0565b6117115760405162461bcd60e51b8152600401610dd9906142ac565b6012546001600160a01b0382811691161480159061173857506001600160a01b0381163014155b6117905760405162461bcd60e51b815260206004820152602360248201527f63616e277420526573637565204c5020746f6b656e206f72207468697320746f60448201526235b2b760e91b6064820152608401610dd9565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a082319060240160206040518083038186803b1580156117db57600080fd5b505afa1580156117ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611813919061407d565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016111ef565b61184d336128a0565b6118695760405162461bcd60e51b8152600401610dd9906142ac565b60005b82518110156112415781156118bc576118b683828151811061189e57634e487b7160e01b600052603260045260246000fd5b6020026020010151600761277690919063ffffffff16565b506118f9565b6118f78382815181106118df57634e487b7160e01b600052603260045260246000fd5b602002602001015160076128de90919063ffffffff16565b505b80611903816144b8565b91505061186c565b600080600a60105461191d9190614351565b600a60115461192c9190614351565b915091509091565b336119476000546001600160a01b031690565b6001600160a01b03161461199d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dd9565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610dae600b8361278b565b6119fd336128a0565b611a195760405162461bcd60e51b8152600401610dd9906142ac565b60328160ff161115611a2a57600080fd5b6019805460ff191660ff92909216919091179055565b611a49336128a0565b611a655760405162461bcd60e51b8152600401610dd9906142ac565b601a805460009182905560405190919073bfaa2949b803ef7e0905336a37f10823901050d79083905b60006040518083038185875af1925050503d8060008114611acb576040519150601f19603f3d011682016040523d82523d6000602084013e611ad0565b606091505b5050905080610ded5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610dd9565b601f54610100900460ff1615611b3657601480546001600160a01b031916331790555b611b42333060006128f3565b565b611b4d336128a0565b611b695760405162461bcd60e51b8152600401610dd9906142ac565b611b72816119e7565b611b7b57600080fd5b6001600160a01b0381166000908152600160205260408120546016805491929091611ba7908490614314565b90915550611bb89050600b826128de565b506015546001600160a01b038216600090815260016020526040902054611bdf919061445f565b6001600160a01b039091166000908152601b6020526040902055565b6001600160a01b038116600090815260036020526040812054428111611c245750600092915050565b6113fd428261447e565b611c37336128a0565b611c535760405162461bcd60e51b8152600401610dd9906142ac565b6021805460ff1916911515919091179055565b611c6f336128a0565b611c8b5760405162461bcd60e51b8152600401610dd9906142ac565b60006064611c9b6012600a6143b4565b611ca690606561445f565b611cb09190614351565b905060006107d0611cc36012600a6143b4565b611cce90606561445f565b611cd89190614351565b905081841015611d3e5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610dd9565b80831015611d9f5760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610dd9565b5050601091909155601155565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611e0f5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610dd9565b611e1e3385610fca868561447e565b5060019392505050565b6000610daa338484612c80565b611e3e336128a0565b611e5a5760405162461bcd60e51b8152600401610dd9906142ac565b6000611e66858761432c565b90508060ff16606414611ebb5760405162461bcd60e51b815260206004820152601f60248201527f6c69712b7374616b696e67206e6565647320746f20657175616c2031303025006044820152606401610dd9565b601460ff851611801590611ed35750601460ff841611155b611f1f5760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610dd9565b60328260ff161115611f835760405162461bcd60e51b815260206004820152602760248201527f7472616e7366657254617820686967686572207468616e206d6178207472616e6044820152660e6cccae4a8c2f60cb1b6064820152608401610dd9565b50600f805460ff9283166401000000000264ff000000001994841663010000000263ff0000001996851662010000029690961663ffff0000199785166101000261ffff1990931694909816939093171794909416949094179190911716919091179055565b611ff1336128a0565b61200d5760405162461bcd60e51b8152600401610dd9906142ac565b610ded828261325d565b600f54611b429033906501000000000090046001600160a01b031660006128f3565b60006022544210156120535742602254610f30919061447e565b50600090565b612062336128a0565b61207e5760405162461bcd60e51b8152600401610dd9906142ac565b612087816119e7565b1561209157600080fd5b6001600160a01b03811660009081526001602052604081205460168054919290916120bd90849061447e565b90915550600090506120ce826133f9565b6015546001600160a01b0384166000908152600160205260409020549192506120f69161445f565b6001600160a01b0383166000908152601b6020908152604080832093909355601c9052908120805483929061212c908490614314565b909155506112419050600b83612776565b600061214b6012600a6143b4565b61215690606561445f565b601654610f30919061447e565b61216c336128a0565b6121885760405162461bcd60e51b8152600401610dd9906142ac565b611c208111156121da5760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610dd9565b602055565b6121e8336128a0565b6122045760405162461bcd60e51b8152600401610dd9906142ac565b6023805460ff19166001179055565b6000610dae60078361278b565b612229336128a0565b6122455760405162461bcd60e51b8152600401610dd9906142ac565b610ded6005826128de565b612259336128a0565b6122755760405162461bcd60e51b8152600401610dd9906142ac565b601f80549115156101000261ff0019909216919091179055565b612298336128a0565b6122b45760405162461bcd60e51b8152600401610dd9906142ac565b6022544210156122d65760405162461bcd60e51b8152600401610dd990614282565b6122e362093a8042614314565b6022556012546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561232e57600080fd5b505afa158015612342573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612366919061407d565b60235490915060ff161561238e57600a61238182600261445f565b61238b9190614351565b90505b60135460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529083169063095ea7b390604401602060405180830381600087803b1580156123dc57600080fd5b505af11580156123f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124149190614004565b5060135460405163af2979eb60e01b815247916001600160a01b03169063af2979eb9061245090309086906000908190849042906004016141bf565b602060405180830381600087803b15801561246a57600080fd5b505af115801561247e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a2919061407d565b5060006124af824761447e565b905084156124c7576124c281600161347f565b6124df565b80601a60008282546124d99190614314565b90915550505b5050505050565b6124ef336128a0565b61250b5760405162461bcd60e51b8152600401610dd9906142ac565b601a5481111561251a57600080fd5b80601a600082825461252c919061447e565b909155505060405160009073bfaa2949b803ef7e0905336a37f10823901050d7908390611a8e565b61255d336128a0565b6125795760405162461bcd60e51b8152600401610dd9906142ac565b6022546125899062278d00614314565b4210156125a85760405162461bcd60e51b8152600401610dd990614282565b6125b562093a8042614314565b60225560405160009073bfaa2949b803ef7e0905336a37f10823901050d79047908381818185875af1925050503d806000811461260e576040519150601f19603f3d011682016040523d82523d6000602084013e612613565b606091505b5050905080610f4057600080fd5b336126346000546001600160a01b031690565b6001600160a01b03161461268a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dd9565b6001600160a01b0381166126ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dd9565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b612753336128a0565b61276f5760405162461bcd60e51b8152600401610dd9906142ac565b610ded6009825b60006113fd836001600160a01b038416613542565b6001600160a01b038116600090815260018301602052604081205415156113fd565b6001600160a01b0383166127f75760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610dd9565b6001600160a01b03821661283f5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610dd9565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080546001600160a01b0383811691161480610dae57506001600160a01b03821673bfaa2949b803ef7e0905336a37f10823901050d71492915050565b60006113fd836001600160a01b038416613591565b601454600160a01b900460ff161561290a57600080fd5b6014805460ff60a01b1916600160a01b1790556000612928846119e7565b1561295057506001600160a01b0383166000908152601c6020526040812080549190556129d0565b600061295b856133f9565b6001600160a01b0386166000908152600160205260409020546015549192506129839161445f565b6001600160a01b0386166000908152601b6020908152604080832093909355601c905220546129b3908290614314565b6001600160a01b0386166000908152601c60205260408120559150505b801580156129dc575081155b156129f45750506014805460ff60a01b191690555050565b601d54610100900460ff168015612a2357506001600160a01b03841660009081526004602052604090205460ff165b8015612a3857506001600160a01b0383163014155b15612a7857601d54600090606490612a539060ff168461445f565b612a5d9190614351565b9050612a69818361447e565b9150612a7681600061347f565b505b8060186000828254612a8a9190614314565b90915550612a9a90508282614314565b60408051600280825260608201835292935060009290916020830190803683375050601354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015612b0457600080fd5b505afa158015612b18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3c9190613e50565b81600081518110612b5d57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508381600181518110612b9f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260135460405163b6f9de9560e01b815291169063b6f9de95908490612be59060009086908b9042906004016141fa565b6000604051808303818588803b158015612bfe57600080fd5b505af1158015612c12573d6000803e3d6000fd5b50505050507f2ffc7392cfc852563f87a930acb52ee96fbd5607bd8476d3bf3b9c59340854e0828587604051612c64939291909283526001600160a01b03918216602084015216604082015260600190565b60405180910390a150506014805460ff60a01b19169055505050565b6001600160a01b038316612ccb5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610dd9565b6001600160a01b038216612d145760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610dd9565b6000612d2160058561278b565b80612d325750612d3260058461278b565b6014549091506001600160a01b0384811691161415612d5f5750601480546001600160a01b031916905560015b60006001600160a01b038516301480612d8057506001600160a01b03841630145b6013546012549192506001600160a01b03908116916000918881169116148015612dbb5750816001600160a01b0316866001600160a01b0316145b80612def57506012546001600160a01b038781169116148015612def5750816001600160a01b0316876001600160a01b0316145b6012549091506000906001600160a01b0388811691161480612e225750826001600160a01b0316876001600160a01b0316145b6012549091506000906001600160a01b038a811691161480612e555750836001600160a01b0316896001600160a01b0316145b90508480612e605750825b80612e685750855b15612e7d57612e788989896136a8565b612ee3565b6021546301000000900460ff16612ed65760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610dd9565b612ee38989898486613773565b505050505050505050565b6000610258600e54612f009190614314565b421115612f175750600f5462010000900460ff1690565b6000600e5442612f27919061447e565b9050600061025882600f60029054906101000a900460ff166063612f4b9190614495565b60ff16612f58919061445f565b612f629190614351565b6113fd90606361447e565b6022548111612f7b57600080fd5b602255565b6000612f8b826119e7565b15612fac57506001600160a01b03166000908152601c602052604090205490565b6001600160a01b0382166000908152601c6020526040902054612fce836133f9565b610dae9190614314565b6001600160a01b038216600090815260016020526040812054612ffc90839061447e565b9050613007836119e7565b1561302c576001600160a01b0390921660009081526001602052604090209190915550565b816016600082825461303e919061447e565b909155506000905061304f846133f9565b6001600160a01b038516600090815260016020526040902083905560155490915061307b90839061445f565b6001600160a01b0385166000908152601b6020908152604080832093909355601c905290812080548392906130b1908490614314565b909155505050505050565b6001600160a01b0382166000908152600160205260408120546130e0908390614314565b90506130eb836119e7565b15613110576001600160a01b0390921660009081526001602052604090209190915550565b81601660008282546131229190614314565b9091555060009050613133846133f9565b905081601554613143919061445f565b6001600160a01b0385166000908152601b6020908152604080832093909355601c90529081208054839290613179908490614314565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b80601e60008282546131b19190614314565b90915550506013546131ce9030906001600160a01b0316846127ad565b60135460405163f305d71960e01b81526001600160a01b039091169063f305d71990839061320b90309087906000908190849042906004016141bf565b6060604051808303818588803b15801561322457600080fd5b505af1158015613238573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124df91906140b6565b601f805460ff191660011790556101f461ffff8316111561327d57600080fd5b30600090815260016020526040812054600f549091906132a79060ff61010082048116911661432c565b60ff169050806132b85750506133eb565b6012546001600160a01b03166000908152600160205260408120546103e8906132e69061ffff88169061445f565b6132f09190614351565b905060115481118015613301575083155b1561330b57506011545b808310801561332b5784156133225783915061332b565b505050506133eb565b600f5460009061ffff8516906133449060ff168561445f565b61334e9190614351565b9050600061335c828561447e565b9050600061336b600284614351565b90506000613379828561447e565b905060006133878483614314565b90504761339382613b81565b600061339f824761447e565b90506000836133ae868461445f565b6133b89190614351565b90506133c4868261319f565b60006133d0844761447e565b90506133dd81600161347f565b505050505050505050505050505b5050601f805460ff19169055565b6001600160a01b03811660009081526001602052604081205460155482916134209161445f565b6001600160a01b0384166000908152601b602052604090205490915081101561344c5750600092915050565b6001600160a01b0383166000908152601b6020526040902054600160401b90613475908361447e565b6113fd9190614351565b6019546000906064906134959060ff168561445f565b61349f9190614351565b905060006134ad828561447e565b905081601a60008282546134c19190614314565b909155505080156116e65782156134ea5780601760008282546134e49190614314565b90915550505b60006134f461213d565b9050806135185781601a600082825461350d9190614314565b909155506124df9050565b80613527600160401b8461445f565b6135319190614351565b601560008282546124d99190614314565b600081815260018301602052604081205461358957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610dae565b506000610dae565b6000818152600183016020526040812054801561369e5760006135b560018361447e565b85549091506000906135c99060019061447e565b905060008660000182815481106135f057634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061362157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526001890190915260409020849055865487908061366257634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610dae565b6000915050610dae565b6001600160a01b0383166000908152600160205260409020548181101561370c5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610dd9565b6137168483612fd8565b61372083836130bc565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161376591815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156137e15760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610dd9565b6000831561390c57601f5462010000900460ff1615801561380a575061380860098961278b565b155b156138d6576001600160a01b03881660009081526003602052604090205442101561386c5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610dd9565b6020546138799042614314565b6001600160a01b0389166000908152600360205260409020556011548611156138d65760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610dd9565b506001600160a01b0387166000908152600460205260409020805460ff19166001179055600f546301000000900460ff16613a7d565b84156139705760105461391f8785614314565b11156139605760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610dd9565b61396987613d05565b9050613a7d565b61397c6012600a6143b4565b86116139a457600f546139a49089906501000000000090046001600160a01b031660006128f3565b6010546139b18785614314565b11156139f25760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610dd9565b6139fd60098961278b565b613a6d576001600160a01b03881660009081526003602052604090205442101580613a305750601f5462010000900460ff165b613a6d5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610dd9565b50600f54640100000000900460ff165b6012546001600160a01b03898116911614801590613a9e575060215460ff16155b8015613aad5750601f5460ff16155b8015613ab65750835b15613ad257602154613ad290610100900461ffff16600061325d565b600f54600090613afa9088908490613af59060ff8082169161010090041661432c565b613dc2565b90506000613b08828961447e565b9050613b148a89612fd8565b613b1e30836130bc565b613b2889826130bc565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613b6d91815260200190565b60405180910390a350505050505050505050565b601354613b999030906001600160a01b0316836127ad565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613bdc57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015613c3057600080fd5b505afa158015613c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c689190613e50565b81600181518110613c8957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b815291169063791ac94790613ccf9085906000908690309042906004016142d8565b600060405180830381600087803b158015613ce957600080fd5b505af1158015613cfd573d6000803e3d6000fd5b505050505050565b600d5460009060ff16613d23575050600f5462010000900460ff1690565b610258600e54613d339190614314565b421015613d98576000613d44612eee565b9050613d5160078461278b565b15610dae57600f54613d6e9060149062010000900460ff1661432c565b60ff168160ff161015613d8d5750600f5462010000900460ff16610dae565b6113fd601482614495565b5050600d805460ff19169055600f805461ffff1916613232179081905560ff620100009091041690565b60006127108260ff168460ff1686613dda919061445f565b613de4919061445f565b613dee9190614351565b949350505050565b8035613e01816144ff565b919050565b8035613e0181614514565b803561ffff81168114613e0157600080fd5b803560ff81168114613e0157600080fd5b600060208284031215613e45578081fd5b81356113fd816144ff565b600060208284031215613e61578081fd5b81516113fd816144ff565b60008060408385031215613e7e578081fd5b8235613e89816144ff565b91506020830135613e99816144ff565b809150509250929050565b600080600060608486031215613eb8578081fd5b8335613ec3816144ff565b92506020840135613ed3816144ff565b929592945050506040919091013590565b60008060408385031215613ef6578182fd5b8235613f01816144ff565b946020939093013593505050565b60008060408385031215613f21578182fd5b823567ffffffffffffffff80821115613f38578384fd5b818501915085601f830112613f4b578384fd5b8135602082821115613f5f57613f5f6144e9565b8160051b604051601f19603f83011681018181108682111715613f8457613f846144e9565b604052838152828101945085830182870184018b1015613fa2578889fd5b8896505b84871015613fcb57613fb781613df6565b865260019690960195948301948301613fa6565b509650613fdb9050878201613e06565b9450505050509250929050565b600060208284031215613ff9578081fd5b81356113fd81614514565b600060208284031215614015578081fd5b81516113fd81614514565b600060208284031215614031578081fd5b6113fd82613e11565b6000806040838503121561404c578182fd5b61405583613e11565b91506020830135613e9981614514565b600060208284031215614076578081fd5b5035919050565b60006020828403121561408e578081fd5b5051919050565b600080604083850312156140a7578182fd5b50508035926020909101359150565b6000806000606084860312156140ca578283fd5b8351925060208401519150604084015190509250925092565b6000602082840312156140f4578081fd5b6113fd82613e23565b6000806040838503121561410f578182fd5b61405583613e23565b600080600080600060a0868803121561412f578283fd5b61413886613e23565b945061414660208701613e23565b935061415460408701613e23565b925061416260608701613e23565b915061417060808701613e23565b90509295509295909350565b6000815180845260208085019450808401835b838110156141b45781516001600160a01b03168752958201959082019060010161418f565b509495945050505050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b848152608060208201526000614213608083018661417c565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b8181101561425b5785810183015185820160400152820161423f565b8181111561426c5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b60208082526012908201527143616c6c6572206e6f7420696e205465616d60701b604082015260600190565b85815284602082015260a0604082015260006142f760a083018661417c565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115614327576143276144d3565b500190565b600060ff821660ff84168060ff03821115614349576143496144d3565b019392505050565b60008261436c57634e487b7160e01b81526012600452602481fd5b500490565b600181815b808511156143ac578160001904821115614392576143926144d3565b8085161561439f57918102915b93841c9390800290614376565b509250929050565b60006113fd60ff8416836000826143cd57506001610dae565b816143da57506000610dae565b81600181146143f057600281146143fa57614416565b6001915050610dae565b60ff84111561440b5761440b6144d3565b50506001821b610dae565b5060208310610133831016604e8410600b8410161715614439575081810a610dae565b6144438383614371565b8060001904821115614457576144576144d3565b029392505050565b6000816000190483118215151615614479576144796144d3565b500290565b600082821015614490576144906144d3565b500390565b600060ff821660ff8416808210156144af576144af6144d3565b90039392505050565b60006000198214156144cc576144cc6144d3565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f4057600080fd5b8015158114610f4057600080fdfea2646970667358221220093eefa7184ddfc9b070cc5a37de7dd0a1af63e1a383a6b886f84adae57e013264736f6c63430008040033

Deployed ByteCode Sourcemap

29169:40413:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67242:94;;;;;;;;;;-1:-1:-1;67323:5:0;;;;;;;;;;;;-1:-1:-1;;;67323:5:0;;;;67242:94;;;;;;;:::i;:::-;;;;;;;;43032:30;;;;;;;;;;-1:-1:-1;43032:30:0;;;;;;;;;;;22417:4:1;22405:17;;;22387:36;;22375:2;22360:18;43032:30:0;22342:87:1;68121:161:0;;;;;;;;;;-1:-1:-1;68121:161:0;;;;;:::i;:::-;;:::i;:::-;;;8560:14:1;;8553:22;8535:41;;8523:2;8508:18;68121:161:0;8490:92:1;59621:127:0;;;;;;;;;;-1:-1:-1;59621:127:0;;;;;:::i;:::-;;:::i;46924:210::-;;;;;;;;;;-1:-1:-1;46924:210:0;;;;;:::i;:::-;;:::i;30428:44::-;;;;;;;;;;;;30468:4;30428:44;;;;;20356:6:1;20344:19;;;20326:38;;20314:2;20299:18;30428:44:0;20281:89:1;53908:130:0;;;;;;;;;;-1:-1:-1;53908:130:0;;;;;:::i;:::-;-1:-1:-1;;;;;54000:30:0;53976:4;54000:30;;;:14;:30;;;;;;;;53999:31;;53908:130;54379:102;;;;;;;;;;-1:-1:-1;54461:12:0;;54379:102;;;20521:25:1;;;20509:2;20494:18;54379:102:0;20476:76:1;60558:145:0;;;;;;;;;;-1:-1:-1;60558:145:0;;;;;:::i;:::-;;:::i;67552:102::-;;;;;;;;;;;;;:::i;54950:109::-;;;;;;:::i;:::-;;:::i;47140:39::-;;;;;;;;;;-1:-1:-1;47140:39:0;;;;;;;;68595:392;;;;;;;;;;-1:-1:-1;68595:392:0;;;;;:::i;:::-;;:::i;53436:316::-;;;;;;;;;;;;;:::i;:::-;;;;22036:25:1;;;22092:2;22077:18;;22070:34;;;;22120:18;;;22113:34;;;;22178:2;22163:18;;22156:34;22221:3;22206:19;;22199:35;22023:3;22008:19;53436:316:0;21990:250:1;47186:35:0;;;;;;;;;;-1:-1:-1;47186:35:0;;;;;;;;;;;63174:157;;;;;;;;;;-1:-1:-1;63174:157:0;;;;;:::i;:::-;;:::i;30303:45::-;;;;;;;;;;;;30345:3;30303:45;;67450:94;;;;;;;;;;-1:-1:-1;29913:2:0;67450:94;;30555:47;;;;;;;;;;;;30595:7;30555:47;;69022:205;;;;;;;;;;-1:-1:-1;69022:205:0;;;;;:::i;:::-;;:::i;55975:31::-;;;;;;;;;;-1:-1:-1;55975:31:0;;;;;;;;;;;63632:924;;;;;;;;;;;;;:::i;29922:57::-;;;;;;;;;;;;;:::i;42804:27::-;;;;;;;;;;;;;;;;56019:234;;;;;;;;;;-1:-1:-1;56019:234:0;;;;;:::i;:::-;;:::i;63010:37::-;;;;;;;;;;-1:-1:-1;63010:37:0;;;;;;;;61614:26;;;;;;;;;;-1:-1:-1;61614:26:0;;;;;;;;;;;31930:25;;;;;;;;;;;;;;;;55277:254;;;;;;;;;;-1:-1:-1;55277:254:0;;;;;:::i;:::-;;:::i;61683:482::-;;;;;;;;;;-1:-1:-1;61683:482:0;;;;;:::i;:::-;;:::i;59205:110::-;;;;;;;;;;-1:-1:-1;59205:110:0;;;;;:::i;:::-;;:::i;43114:31::-;;;;;;;;;;;;;;;;61041:559;;;;;;:::i;:::-;;:::i;66408:306::-;;;;;;;;;;-1:-1:-1;66408:306:0;;;;;:::i;:::-;;:::i;30141:30::-;;;;;;;;;;;;;;;;31229:77;;;;;;;;;;;;31264:42;31229:77;;;;;-1:-1:-1;;;;;7460:32:1;;;7442:51;;7430:2;7415:18;31229:77:0;7397:102:1;62173:257:0;;;;;;;;;;-1:-1:-1;62173:257:0;;;;;:::i;:::-;;:::i;53301:127::-;;;;;;;;;;;;;:::i;:::-;;;;21698:25:1;;;21754:2;21739:18;;21732:34;;;;21671:18;53301:127:0;21653:119:1;67662:121:0;;;;;;;;;;-1:-1:-1;67662:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;67757:18:0;67730:7;67757:18;;;:9;:18;;;;;;;67662:121;10748:140;;;;;;;;;;;;;:::i;43708:132::-;;;;;;;;;;-1:-1:-1;43708:132:0;;;;;:::i;:::-;;:::i;58768:140::-;;;;;;;;;;-1:-1:-1;58768:140:0;;;;;:::i;:::-;;:::i;31895:28::-;;;;;;;;;;;;;;;;57047:233;;;;;;;;;;;;;:::i;54780:158::-;;;;;;;;;;;;;:::i;56720:319::-;;;;;;;;;;-1:-1:-1;56720:319:0;;;;;:::i;:::-;;:::i;42404:29::-;;;;;;;;;;;;;;;;55940:28;;;;;;;;;;-1:-1:-1;55940:28:0;;;;;;;;54107:266;;;;;;;;;;-1:-1:-1;54107:266:0;;;;;:::i;:::-;;:::i;55871:28::-;;;;;;;;;;-1:-1:-1;55871:28:0;;;;;;;;;;;67140:94;;;;;;;;;;-1:-1:-1;67192:7:0;10172:6;-1:-1:-1;;;;;10172:6:0;67140:94;67552:102;49318:25;;;;;;;;;;;;;;;;57627:109;;;;;;;;;;-1:-1:-1;57627:109:0;;;;;:::i;:::-;;:::i;67344:98::-;;;;;;;;;;-1:-1:-1;67427:7:0;;;;;;;;;;;;-1:-1:-1;;;67427:7:0;;;;67344:98;;59857:593;;;;;;;;;;-1:-1:-1;59857:593:0;;;;;:::i;:::-;;:::i;69235:342::-;;;;;;;;;;-1:-1:-1;69235:342:0;;;;;:::i;:::-;;:::i;67791:167::-;;;;;;;;;;-1:-1:-1;67791:167:0;;;;;:::i;:::-;;:::i;58103:590::-;;;;;;;;;;-1:-1:-1;58103:590:0;;;;;:::i;:::-;;:::i;58982:154::-;;;;;;;;;;-1:-1:-1;58982:154:0;;;;;:::i;:::-;;:::i;54691:83::-;;;;;;;;;;;;;:::i;53073:220::-;;;;;;;;;;;;;:::i;56309:355::-;;;;;;;;;;-1:-1:-1;56309:355:0;;;;;:::i;:::-;;:::i;43393:106::-;;;;;;;;;;;;;:::i;57807:201::-;;;;;;;;;;-1:-1:-1;57807:201:0;;;;;:::i;:::-;;:::i;63054:112::-;;;;;;;;;;;;;:::i;53760:140::-;;;;;;;;;;-1:-1:-1;53760:140:0;;;;;:::i;:::-;;:::i;67966:147::-;;;;;;;;;;-1:-1:-1;67966:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;68077:19:0;;;68050:7;68077:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;67966:147;59321:111;;;;;;;;;;-1:-1:-1;59321:111:0;;;;;:::i;:::-;;:::i;54538:108::-;;;;;;;;;;-1:-1:-1;54538:108:0;;;;;:::i;:::-;;:::i;64614:1327::-;;;;;;;;;;-1:-1:-1;64614:1327:0;;;;;:::i;:::-;;:::i;57287:255::-;;;;;;;;;;-1:-1:-1;57287:255:0;;;;;:::i;:::-;;:::i;30839:31::-;;;;;;;;;;;;30868:2;30839:31;;42701:33;;;;;;;;;;;;;;;;66086:316;;;;;;;;;;;;;:::i;11043:236::-;;;;;;;;;;-1:-1:-1;11043:236:0;;;;;:::i;:::-;;:::i;55906:27::-;;;;;;;;;;;;;;;;59489:126;;;;;;;;;;-1:-1:-1;59489:126:0;;;;;:::i;:::-;;:::i;68121:161::-;68198:4;68215:37;68224:10;68236:7;68245:6;68215:8;:37::i;:::-;-1:-1:-1;68270:4:0;68121:161;;;;;:::o;59621:127::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;;;;;;;;;59703:37:::1;:21;59732:7:::0;59703:28:::1;:37::i;:::-;;59621:127:::0;:::o;46924:210::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;47014:2:::1;47009:3;:7;;;;47001:52;;;::::0;-1:-1:-1;;;47001:52:0;;18598:2:1;47001:52:0::1;::::0;::::1;18580:21:1::0;18637:2;18617:18;;;18610:30;18676:34;18656:18;;;18649:62;-1:-1:-1;;;18727:18:1;;;18720:31;18768:19;;47001:52:0::1;18570:223:1::0;47001:52:0::1;47064:18;:24:::0;;::::1;47099:27:::0;;;::::1;-1:-1:-1::0;;47064:24:0;::::1;;;;47099:27:::0;;;;-1:-1:-1;;47099:27:0;;;;;;;::::1;::::0;;46924:210::o;60558:145::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;60628:16:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;60628:25:0;;::::1;;::::0;;60669:26:::1;::::0;::::1;::::0;::::1;::::0;60645:8;8560:14:1;8553:22;8535:41;;8523:2;8508:18;;8490:92;60669:26:0::1;;;;;;;;60558:145:::0;:::o;67552:102::-;67607:7;29966:13;29913:2;29966;:13;:::i;:::-;29960:19;;:3;:19;:::i;:::-;67627;;67552:102;:::o;54950:109::-;55013:38;55024:10;55035:5;55041:9;55013:10;:38::i;:::-;54950:109;:::o;68595:392::-;68695:4;68712:36;68722:6;68730:9;68741:6;68712:9;:36::i;:::-;-1:-1:-1;;;;;68788:19:0;;68761:24;68788:19;;;:11;:19;;;;;;;;68808:10;68788:31;;;;;;;;68838:26;;;;68830:59;;;;-1:-1:-1;;;68830:59:0;;13186:2:1;68830:59:0;;;13168:21:1;13225:2;13205:18;;;13198:30;-1:-1:-1;;;13244:18:1;;;13237:50;13304:18;;68830:59:0;13158:170:1;68830:59:0;68902:55;68911:6;68919:10;68931:25;68950:6;68931:16;:25;:::i;:::-;68902:8;:55::i;:::-;-1:-1:-1;68975:4:0;;68595:392;-1:-1:-1;;;;68595:392:0:o;53436:316::-;53586:14;;53476:20;;;;;;;;;;53586:14;;53583:78;;;53609:21;:19;:21::i;:::-;53602:28;;;;53583:78;;;53654:7;;;;;;;;-1:-1:-1;53583:78:0;-1:-1:-1;;53689:13:0;;;;;;;;53703:11;;;;;-1:-1:-1;53436:316:0;;-1:-1:-1;53722:8:0;;;;;;53731:12;;;;;;53436:316::o;63174:157::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;63266:57:::1;63288:34;63307:15;63288:18:::0;:34:::1;:::i;:::-;63266:21;:57::i;69022:205::-:0;69130:10;69104:4;69151:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;69151:32:0;;;;;;;;;;69104:4;;69121:76;;69142:7;;69151:45;;69186:10;;69151:45;:::i;63632:924::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;63776:20:::1;;63757:15;:39;;63749:68;;;;-1:-1:-1::0;;;63749:68:0::1;;;;;;;:::i;:::-;63883:19;::::0;63931:39:::1;::::0;-1:-1:-1;;;63931:39:0;;63964:4:::1;63931:39;::::0;::::1;7442:51:1::0;-1:-1:-1;;;;;63883:19:0;;::::1;::::0;63838:28:::1;::::0;63883:19;;63931:24:::1;::::0;7415:18:1;;63931:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63984:25;::::0;63914:56;;-1:-1:-1;63984:25:0::1;;63981:568;;;64056:40;30742:6;64056:15;:40;:::i;:::-;64035:20;:61:::0;64234:2:::1;64225:8;:6:::0;64232:1:::1;64225:8;:::i;:::-;:11;;;;:::i;:::-;64251:43;::::0;-1:-1:-1;;;64251:43:0;;31264:42:::1;64251:43;::::0;::::1;7678:51:1::0;7745:18;;;7738:34;;;64218:18:0;;-1:-1:-1;;;;;;64251:23:0;::::1;::::0;::::1;::::0;7651:18:1;;64251:43:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59703:37;59621:127:::0;:::o;63981:568::-:1;64494:43;::::0;-1:-1:-1;;;64494:43:0;;31264:42:::1;64494:43;::::0;::::1;7678:51:1::0;7745:18;;;7738:34;;;-1:-1:-1;;;;;64494:23:0;::::1;::::0;::::1;::::0;7651:18:1;;64494:43:0::1;7633:145:1::0;29922:57:0;29966:13;29913:2;29966;:13;:::i;:::-;29960:19;;:3;:19;:::i;:::-;29922:57;:::o;56019:234::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;56110:1:::1;56101:8;:10;;;56093:54;;;::::0;-1:-1:-1;;;56093:54:0;;10957:2:1;56093:54:0::1;::::0;::::1;10939:21:1::0;;;10976:18;;;10969:30;11035:34;11015:18;;;11008:62;11087:18;;56093:54:0::1;10929:182:1::0;56093:54:0::1;56176:2;56166:8;:12;;;;56158:53;;;::::0;-1:-1:-1;;;56158:53:0;;12137:2:1;56158:53:0::1;::::0;::::1;12119:21:1::0;12176:2;12156:18;;;12149:30;12215:31;12195:18;;;12188:59;12264:18;;56158:53:0::1;12109:179:1::0;56158:53:0::1;56222:14;:23:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;56222:23:0;;::::1;::::0;;;::::1;::::0;;56019:234::o;55277:254::-;55336:7;55355:14;55370:18;55383:4;55370:12;:18::i;:::-;55402;;55355:33;;-1:-1:-1;55402:18:0;;;;;:40;;;;-1:-1:-1;;;;;;55422:20:0;;;;;;:14;:20;;;;;;;;55402:40;55399:100;;;55472:23;;55496:3;;55465:30;;55472:23;;55465:6;:30;:::i;:::-;:34;;;;:::i;:::-;55457:42;;;;:::i;:::-;;55517:6;-1:-1:-1;;;55277:254:0:o;61683:482::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;61772:19:::1;::::0;61765:41:::1;::::0;;-1:-1:-1;;;61765:41:0;;;;61807:1:::1;::::0;-1:-1:-1;;;;;61772:19:0::1;::::0;61765:39:::1;::::0;:41:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;61772:19;61765:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;61757:70;;;::::0;-1:-1:-1;;;61757:70:0;;16444:2:1;61757:70:0::1;::::0;::::1;16426:21:1::0;16483:2;16463:18;;;16456:30;-1:-1:-1;;;16502:18:1;;;16495:45;16557:18;;61757:70:0::1;16416:165:1::0;61757:70:0::1;61847:14;::::0;;;::::1;;;61846:15;61838:24;;;::::0;::::1;;61873:14;:19:::0;;-1:-1:-1;;61873:19:0::1;::::0;::::1;::::0;;61903:14:::1;:28:::0;;;::::1;;-1:-1:-1::0;;61903:28:0;;::::1;;::::0;;61958:15:::1;61942;:31:::0;;;62117:40:::1;::::0;30742:6:::1;::::0;62117:40:::1;:::i;:::-;62096:20;:61:::0;-1:-1:-1;61683:482:0:o;59205:110::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;59285:22:::1;:9;59299:7:::0;59285:13:::1;:22::i;61041:559::-:0;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;61137:19:::1;;;;;;;;;-1:-1:-1::0;;;;;61137:19:0::1;-1:-1:-1::0;;;;;61130:39:0::1;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44:::0;61122:75:::1;;;::::0;-1:-1:-1;;;61122:75:0;;13879:2:1;61122:75:0::1;::::0;::::1;13861:21:1::0;13918:2;13898:18;;;13891:30;-1:-1:-1;;;13937:18:1;;;13930:49;13996:18;;61122:75:0::1;13851:169:1::0;61122:75:0::1;61250:4;61218:13;61232:24:::0;;;:9:::1;:24;::::0;;;;;;61318:3:::1;61295:22;;::::0;::::1;61232:24:::0;61295:22:::1;:::i;:::-;:26;;;;:::i;:::-;61277:44:::0;-1:-1:-1;61332:15:0::1;61348;61277:44:::0;61348:5;:15:::1;:::i;:::-;61332:31;;61384:37;61405:4;61411:9;61384:12;:37::i;:::-;61434:32;61444:10;61456:9;61434;:32::i;:::-;61482:46;::::0;20521:25:1;;;61506:10:0::1;::::0;61499:4:::1;::::0;61482:46:::1;::::0;20509:2:1;20494:18;61482:46:0::1;;;;;;;61549:33;61563:7;61572:9;61549:13;:33::i;:::-;32226:1;;;61041:559:::0;:::o;66408:306::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;66507:19:::1;::::0;-1:-1:-1;;;;;66493:33:0;;::::1;66507:19:::0;::::1;66493:33;::::0;::::1;::::0;:62:::1;;-1:-1:-1::0;;;;;;66528:27:0;::::1;66550:4;66528:27;;66493:62;66485:109;;;::::0;-1:-1:-1;;;66485:109:0;;14980:2:1;66485:109:0::1;::::0;::::1;14962:21:1::0;15019:2;14999:18;;;14992:30;15058:34;15038:18;;;15031:62;-1:-1:-1;;;15109:18:1;;;15102:33;15152:19;;66485:109:0::1;14952:225:1::0;66485:109:0::1;66675:30;::::0;-1:-1:-1;;;66675:30:0;;66699:4:::1;66675:30;::::0;::::1;7442:51:1::0;66625:12:0;;-1:-1:-1;;;;;66649:14:0;::::1;::::0;::::1;::::0;66664:10:::1;::::0;66649:14;;66675:15:::1;::::0;7415:18:1;;66675:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66649:57;::::0;-1:-1:-1;;;;;;66649:57:0::1;::::0;;;;;;-1:-1:-1;;;;;7696:32:1;;;66649:57:0::1;::::0;::::1;7678:51:1::0;7745:18;;;7738:34;7651:18;;66649:57:0::1;7633:145:1::0;62173:257:0;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;62275:6:::1;62271:152;62287:9;:16;62285:1;:18;62271:152;;;62327:3;62324:87;;;62332:28;62347:9;62357:1;62347:12;;;;;;-1:-1:-1::0;;;62347:12:0::1;;;;;;;;;;;;;;;62332:10;:14;;:28;;;;:::i;:::-;;62324:87;;;62380:31;62398:9;62408:1;62398:12;;;;;;-1:-1:-1::0;;;62398:12:0::1;;;;;;;;;;;;;;;62380:10;:17;;:31;;;;:::i;:::-;;62324:87;62305:3:::0;::::1;::::0;::::1;:::i;:::-;;;;62271:152;;53301:127:::0;53342:15;53359:12;53403:2;53390:12;;:15;;;;:::i;:::-;53417:2;53407:9;;:12;;;;:::i;:::-;53383:37;;;;53301:127;;:::o;10748:140::-;10330:10;10319:7;10145;10172:6;-1:-1:-1;;;;;10172:6:0;;10107:79;10319:7;-1:-1:-1;;;;;10319:21:0;;10311:66;;;;-1:-1:-1;;;10311:66:0;;15384:2:1;10311:66:0;;;15366:21:1;;;15403:18;;;15396:30;15462:34;15442:18;;;15435:62;15514:18;;10311:66:0;15356:182:1;10311:66:0;10847:1:::1;10831:6:::0;;10810:40:::1;::::0;-1:-1:-1;;;;;10831:6:0;;::::1;::::0;10810:40:::1;::::0;10847:1;;10810:40:::1;10878:1;10861:19:::0;;-1:-1:-1;;;;;;10861:19:0::1;::::0;;10748:140::o;43708:132::-;43774:4;43797:35;:20;43827:4;43797:29;:35::i;58768:140::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;58862:2:::1;58852:8;:12;;;;58844:21;;;::::0;::::1;;58877:14;:23:::0;;-1:-1:-1;;58877:23:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;58768:140::o;57047:233::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;57124:16:::1;::::0;;57109:14:::1;57151:18:::0;;;;57194:36:::1;::::0;57124:16;;57109:14;31264:42:::1;::::0;57124:16;;57194:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57180:50;;;57249:4;57241:31;;;::::0;-1:-1:-1;;;57241:31:0;;19000:2:1;57241:31:0::1;::::0;::::1;18982:21:1::0;19039:2;19019:18;;;19012:30;-1:-1:-1;;;19058:18:1;;;19051:45;19113:18;;57241:31:0::1;18972:165:1::0;54780:158:0;54820:20;;;;;;;54817:64;;;54855:15;:26;;-1:-1:-1;;;;;;54855:26:0;54871:10;54855:26;;;54817:64;54892:38;54903:10;54922:4;54928:1;54892:10;:38::i;:::-;54780:158::o;56720:319::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;56798:27:::1;56820:4;56798:21;:27::i;:::-;56790:36;;;::::0;::::1;;-1:-1:-1::0;;;;;56851:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;56837:12:::1;:29:::0;;56851:15;;56837:12;;:29:::1;::::0;56851:15;;56837:29:::1;:::i;:::-;::::0;;;-1:-1:-1;56877:33:0::1;::::0;-1:-1:-1;56877:20:0::1;56905:4:::0;56877:27:::1;:33::i;:::-;-1:-1:-1::0;57017:14:0::1;::::0;-1:-1:-1;;;;;57001:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;57017:14;57001:30:::1;:::i;:::-;-1:-1:-1::0;;;;;56977:23:0;;::::1;;::::0;;;:17:::1;:23;::::0;;;;:54;56720:319::o;54107:266::-;-1:-1:-1;;;;;54228:25:0;;54193:7;54228:25;;;:9;:25;;;;;;54276:15;54266:25;;54263:62;;-1:-1:-1;54313:1:0;;54107:266;-1:-1:-1;;54107:266:0:o;54263:62::-;54341:24;54350:15;54341:8;:24;:::i;57627:109::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;57705:16:::1;:23:::0;;-1:-1:-1;;57705:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57627:109::o;59857:593::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;60015:26:::1;30345:3;29966:13;29913:2;29966;:13;:::i;:::-;29960:19;::::0;:3:::1;:19;:::i;:::-;60042:32;;;;:::i;:::-;60015:59:::0;-1:-1:-1;60085:23:0::1;30468:4;29966:13;29913:2;29966;:13;:::i;:::-;29960:19;::::0;:3:::1;:19;:::i;:::-;60109:29;;;;:::i;:::-;60085:53;;60177:18;60160:15;:35;;60151:103;;;::::0;-1:-1:-1;;;60151:103:0;;11725:2:1;60151:103:0::1;::::0;::::1;11707:21:1::0;11764:2;11744:18;;;11737:30;11803:34;11783:18;;;11776:62;-1:-1:-1;;;11854:18:1;;;11847:41;11905:19;;60151:103:0::1;11697:233:1::0;60151:103:0::1;60288:15;60274:12;:29;;60265:94;;;::::0;-1:-1:-1;;;60265:94:0;;14571:2:1;60265:94:0::1;::::0;::::1;14553:21:1::0;14610:2;14590:18;;;14583:30;14649:34;14629:18;;;14622:62;-1:-1:-1;;;14700:18:1;;;14693:38;14748:19;;60265:94:0::1;14543:230:1::0;60265:94:0::1;-1:-1:-1::0;;60372:12:0::1;:30:::0;;;;60413:9:::1;:24:::0;59857:593::o;69235:342::-;69378:10;69322:4;69366:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;69366:32:0;;;;;;;;;;69417:35;;;;69409:60;;;;-1:-1:-1;;;69409:60:0;;19696:2:1;69409:60:0;;;19678:21:1;19735:2;19715:18;;;19708:30;-1:-1:-1;;;19754:18:1;;;19747:42;19806:18;;69409:60:0;19668:162:1;69409:60:0;69482:65;69491:10;69503:7;69512:34;69531:15;69512:16;:34;:::i;69482:65::-;-1:-1:-1;69565:4:0;;69235:342;-1:-1:-1;;;69235:342:0:o;67791:167::-;67871:4;67888:40;67898:10;67910:9;67921:6;67888:9;:40::i;58103:590::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;58240:14:::1;58255:27;58270:12:::0;58255:14;:27:::1;:::i;:::-;58240:42;;58301:8;:13;;58311:3;58301:13;58293:57;;;::::0;-1:-1:-1;;;58293:57:0;;16788:2:1;58293:57:0::1;::::0;::::1;16770:21:1::0;16827:2;16807:18;;;16800:30;16866:33;16846:18;;;16839:61;16917:18;;58293:57:0::1;16760:181:1::0;58293:57:0::1;30868:2;58369:14;::::0;::::1;;::::0;::::1;::::0;:31:::1;;-1:-1:-1::0;30868:2:0::1;58385:15;::::0;::::1;;;58369:31;58361:68;;;::::0;-1:-1:-1;;;58361:68:0;;17148:2:1;58361:68:0::1;::::0;::::1;17130:21:1::0;17187:2;17167:18;;;17160:30;17226:27;17206:18;;;17199:55;17271:18;;58361:68:0::1;17120:175:1::0;58361:68:0::1;58461:2;58448:11;:15;;;;58440:66;;;::::0;-1:-1:-1;;;58440:66:0;;18190:2:1;58440:66:0::1;::::0;::::1;18172:21:1::0;18229:2;18209:18;;;18202:30;18268:34;18248:18;;;18241:62;-1:-1:-1;;;18319:18:1;;;18312:37;18366:19;;58440:66:0::1;18162:229:1::0;58440:66:0::1;-1:-1:-1::0;58525:13:0::1;:28:::0;;::::1;58661:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;58634:16:0;;::::1;::::0;::::1;-1:-1:-1::0;;58609:14:0;;::::1;::::0;::::1;58634:16:::0;;;;-1:-1:-1;;58564:24:0;;::::1;58525:28;58564:24;-1:-1:-1::0;;58564:24:0;;;58525:28;;;::::1;58564:24:::0;;;;::::1;58634:16:::0;;;;;;;;;;;::::1;58661:24;::::0;;;::::1;::::0;;58103:590::o;58982:154::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;59077:51:::1;59096:17;59115:12;59077:18;:51::i;54691:83::-:0;54751:12;;54729:37;;54740:10;;54751:12;;;-1:-1:-1;;;;;54751:12:0;54764:1;54729:10;:37::i;53073:220::-;53138:7;53176:20;;53160:15;:36;53157:110;;;53240:15;53219:20;;:36;;;;:::i;53157:110::-;-1:-1:-1;53284:1:0;;53073:220::o;56309:355::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;56390:27:::1;56412:4;56390:21;:27::i;:::-;56389:28;56381:37;;;::::0;::::1;;-1:-1:-1::0;;;;;56443:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;56429:12:::1;:29:::0;;56443:15;;56429:12;;:29:::1;::::0;56443:15;;56429:29:::1;:::i;:::-;::::0;;;-1:-1:-1;56469:20:0::1;::::0;-1:-1:-1;56490:21:0::1;56506:4:::0;56490:15:::1;:21::i;:::-;56562:14;::::0;-1:-1:-1;;;;;56546:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;56469:42;;-1:-1:-1;56546:30:0::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;56522:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;:54;;;;56587:8:::1;:14:::0;;;;;:28;;56603:12;;56522:23;56587:28:::1;::::0;56603:12;;56587:28:::1;:::i;:::-;::::0;;;-1:-1:-1;56626:30:0::1;::::0;-1:-1:-1;56626:20:0::1;56651:4:::0;56626:24:::1;:30::i;43393:106::-:0;43440:7;29966:13;29913:2;29966;:13;:::i;:::-;29960:19;;:3;:19;:::i;:::-;43466:12;;:25;;;;:::i;57807:201::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;30595:7:::1;57898:32:::0;::::1;;57890:67;;;::::0;-1:-1:-1;;;57890:67:0;;19344:2:1;57890:67:0::1;::::0;::::1;19326:21:1::0;19383:2;19363:18;;;19356:30;19422:25;19402:18;;;19395:53;19465:18;;57890:67:0::1;19316:173:1::0;57890:67:0::1;57972:12;:28:::0;57807:201::o;63054:112::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;63128:25:::1;:30:::0;;-1:-1:-1;;63128:30:0::1;63154:4;63128:30;::::0;;63054:112::o;53760:140::-;53834:4;53857:35;:10;53877:14;53857:19;:35::i;59321:111::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;59399:25:::1;:9;59416:7:::0;59399:16:::1;:25::i;54538:108::-:0;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;54610:20:::1;:28:::0;;;::::1;;;;-1:-1:-1::0;;54610:28:0;;::::1;::::0;;;::::1;::::0;;54538:108::o;64614:1327::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;64774:20:::1;;64755:15;:39;;64747:68;;;;-1:-1:-1::0;;;64747:68:0::1;;;;;;;:::i;:::-;64847:40;30742:6;64847:15;:40;:::i;:::-;64826:20;:61:::0;64943:19:::1;::::0;64991:39:::1;::::0;-1:-1:-1;;;64991:39:0;;65024:4:::1;64991:39;::::0;::::1;7442:51:1::0;-1:-1:-1;;;;;64943:19:0;;::::1;::::0;64898:28:::1;::::0;64943:19;;64991:24:::1;::::0;7415:18:1;;64991:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65044:25;::::0;64974:56;;-1:-1:-1;65044:25:0::1;;65041:97;;;65101:2;65092:8;:6:::0;65099:1:::1;65092:8;:::i;:::-;:11;;;;:::i;:::-;65085:18;;65041:97;65180:14;::::0;65149:54:::1;::::0;-1:-1:-1;;;65149:54:0;;-1:-1:-1;;;;;65180:14:0;;::::1;65149:54;::::0;::::1;7678:51:1::0;7745:18;;;7738:34;;;65149:22:0;;::::1;::::0;::::1;::::0;7651:18:1;;65149:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;65480:14:0::1;::::0;:216:::1;::::0;-1:-1:-1;;;65480:216:0;;65448:21:::1;::::0;-1:-1:-1;;;;;65480:14:0::1;::::0;:62:::1;::::0;:216:::1;::::0;65565:4:::1;::::0;65585:6;;65420:25:::1;::::0;;;65565:4;;65666:15:::1;::::0;65480:216:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;65707:21:0::1;65731:39;65753:17:::0;65731:21:::1;:39;:::i;:::-;65707:63;;65784:12;65781:151;;;65812:36;65829:13;65843:4;65812:16;:36::i;:::-;65781:151;;;65907:13;65889:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;65781:151:0::1;32226:1;;;;64614:1327:::0;:::o;57287:255::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;57379:16:::1;;57371:6;:24;;57363:33;;;::::0;::::1;;57425:6;57407:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;57456:36:0::1;::::0;57443:9:::1;::::0;31264:42:::1;::::0;57480:6;;57456:36:::1;7277:14:1::0;66086:316:0;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;66173:20:::1;::::0;:28:::1;::::0;66194:7:::1;66173:28;:::i;:::-;66154:15;:47;;66146:76;;;;-1:-1:-1::0;;;66146:76:0::1;;;;;;;:::i;:::-;66254:40;30742:6;66254:15;:40;:::i;:::-;66233:20;:61:::0;66319:51:::1;::::0;66306:9:::1;::::0;31264:42:::1;::::0;66343:21:::1;::::0;66306:9;66319:51;66306:9;66319:51;66343:21;31264:42;66319:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66305:65;;;66389:4;66381:13;;;::::0;::::1;11043:236:::0;10330:10;10319:7;10145;10172:6;-1:-1:-1;;;;;10172:6:0;;10107:79;10319:7;-1:-1:-1;;;;;10319:21:0;;10311:66;;;;-1:-1:-1;;;10311:66:0;;15384:2:1;10311:66:0;;;15366:21:1;;;15403:18;;;15396:30;15462:34;15442:18;;;15435:62;15514:18;;10311:66:0;15356:182:1;10311:66:0;-1:-1:-1;;;;;11124:22:0;::::1;11116:73;;;::::0;-1:-1:-1;;;11116:73:0;;11318:2:1;11116:73:0::1;::::0;::::1;11300:21:1::0;11357:2;11337:18;;;11330:30;11396:34;11376:18;;;11369:62;-1:-1:-1;;;11447:18:1;;;11440:36;11493:19;;11116:73:0::1;11290:228:1::0;11116:73:0::1;11226:6;::::0;;11205:38:::1;::::0;-1:-1:-1;;;;;11205:38:0;;::::1;::::0;11226:6;::::1;::::0;11205:38:::1;::::0;::::1;11254:6;:17:::0;;-1:-1:-1;;;;;;11254:17:0::1;-1:-1:-1::0;;;;;11254:17:0;;;::::1;::::0;;;::::1;::::0;;11043:236::o;59489:126::-;32173:19;32181:10;32173:7;:19::i;:::-;32165:50;;;;-1:-1:-1;;;32165:50:0;;;;;;;:::i;:::-;59573:34:::1;:21;59599:7:::0;25794:152;25864:4;25888:50;25893:3;-1:-1:-1;;;;;25913:23:0;;25888:4;:50::i;26366:167::-;-1:-1:-1;;;;;26500:23:0;;26446:4;23175:19;;;:12;;;:19;;;;;;:24;;26470:55;23078:129;68288:299;-1:-1:-1;;;;;68381:19:0;;68373:49;;;;-1:-1:-1;;;68373:49:0;;12495:2:1;68373:49:0;;;12477:21:1;12534:2;12514:18;;;12507:30;-1:-1:-1;;;12553:18:1;;;12546:47;12610:18;;68373:49:0;12467:167:1;68373:49:0;-1:-1:-1;;;;;68441:21:0;;68433:49;;;;-1:-1:-1;;;68433:49:0;;14227:2:1;68433:49:0;;;14209:21:1;14266:2;14246:18;;;14239:30;-1:-1:-1;;;14285:18:1;;;14278:45;14340:18;;68433:49:0;14199:165:1;68433:49:0;-1:-1:-1;;;;;68495:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;68547:32;;20521:25:1;;;68547:32:0;;20494:18:1;68547:32:0;;;;;;;68288:299;;;:::o;32453:115::-;32506:4;10172:6;;-1:-1:-1;;;;;32529:13:0;;;10172:6;;32529:13;;:31;;-1:-1:-1;;;;;;32544:16:0;;31264:42;32544:16;32522:38;32453:115;-1:-1:-1;;32453:115:0:o;26122:158::-;26195:4;26219:53;26227:3;-1:-1:-1;;;;;26247:23:0;;26219:7;:53::i;47272:1646::-;47371:14;;-1:-1:-1;;;47371:14:0;;;;47370:15;47362:24;;;;;;47397:14;:19;;-1:-1:-1;;;;47397:19:0;-1:-1:-1;;;47397:19:0;;;;47455:27;47477:4;47455:21;:27::i;:::-;47452:495;;;-1:-1:-1;;;;;;47569:14:0;;;;;;:8;:14;;;;;;;47598:16;;;47452:495;;;47655:17;47673:21;47689:4;47673:15;:21::i;:::-;-1:-1:-1;;;;;47805:15:0;;;;;;:9;:15;;;;;;47788:14;;47655:39;;-1:-1:-1;47788:32:0;;;:::i;:::-;-1:-1:-1;;;;;47762:23:0;;;;;;:17;:23;;;;;;;;:58;;;;47880:8;:14;;;;:24;;47895:9;;47880:24;:::i;:::-;-1:-1:-1;;;;;47919:14:0;;47934:1;47919:14;;;:8;:14;;;;;:16;47873:31;-1:-1:-1;;47452:495:0;47960:9;;:27;;;;-1:-1:-1;47971:16:0;;47960:27;47957:124;;;-1:-1:-1;;48028:14:0;:20;;-1:-1:-1;;;;48028:20:0;;;-1:-1:-1;;47272:1646:0:o;47957:124::-;48218:18;;;;;;;:40;;;;-1:-1:-1;;;;;;48238:20:0;;;;;;:14;:20;;;;;;;;48218:40;:62;;;;-1:-1:-1;;;;;;48260:20:0;;48275:4;48260:20;;48218:62;48215:252;;;48328:23;;48296:24;;48352:3;;48321:30;;48328:23;;48321:6;:30;:::i;:::-;:34;;;;:::i;:::-;48296:59;-1:-1:-1;48377:23:0;48296:59;48377:6;:23;:::i;:::-;48370:30;;48415:40;48432:16;48449:5;48415:16;:40::i;:::-;48215:252;;48493:6;48479:12;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;48510:21:0;;-1:-1:-1;48518:13:0;48510:21;;:::i;:::-;48566:16;;;48580:1;48566:16;;;;;;;;48510:21;;-1:-1:-1;48542:21:0;;48566:16;;;;;;;;;;-1:-1:-1;;48603:14:0;;:21;;;-1:-1:-1;;;48603:21:0;;;;48542:40;;-1:-1:-1;;;;;;48603:14:0;;;;:19;;-1:-1:-1;48603:21:0;;;;;;;;;;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48593:4;48598:1;48593:7;;;;;;-1:-1:-1;;;48593:7:0;;;;;;;;;;;;;;:31;-1:-1:-1;;;;;48593:31:0;;;-1:-1:-1;;;;;48593:31:0;;;;;48651:5;48641:4;48646:1;48641:7;;;;;;-1:-1:-1;;;48641:7:0;;;;;;;;;-1:-1:-1;;;;;48641:15:0;;;:7;;;;;;;;;:15;48669:14;;:149;;-1:-1:-1;;;48669:149:0;;:14;;;:65;;48742:6;;48669:149;;:14;;48772:4;;48787;;48802:15;;48669:149;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48844:35;48860:6;48867:5;48874:4;48844:35;;;;;;;20759:25:1;;;-1:-1:-1;;;;;20858:15:1;;;20853:2;20838:18;;20831:43;20910:15;20905:2;20890:18;;20883:43;20747:2;20732:18;;20714:218;48844:35:0;;;;;;;;-1:-1:-1;;48890:14:0;:20;;-1:-1:-1;;;;48890:20:0;;;-1:-1:-1;;;47272:1646:0:o;34819:1653::-;-1:-1:-1;;;;;34915:20:0;;34907:51;;;;-1:-1:-1;;;34907:51:0;;9912:2:1;34907:51:0;;;9894:21:1;9951:2;9931:18;;;9924:30;-1:-1:-1;;;9970:18:1;;;9963:48;10028:18;;34907:51:0;9884:168:1;34907:51:0;-1:-1:-1;;;;;34977:23:0;;34969:52;;;;-1:-1:-1;;;34969:52:0;;12841:2:1;34969:52:0;;;12823:21:1;12880:2;12860:18;;;12853:30;-1:-1:-1;;;12899:18:1;;;12892:46;12955:18;;34969:52:0;12813:166:1;34969:52:0;35114:15;35133:26;:9;35152:6;35133:18;:26::i;:::-;:59;;;-1:-1:-1;35163:29:0;:9;35182;35163:18;:29::i;:::-;35207:15;;35114:79;;-1:-1:-1;;;;;;35207:26:0;;;:15;;:26;35204:113;;;-1:-1:-1;35249:15:0;:26;;-1:-1:-1;;;;;;35249:26:0;;;;35204:113;35405:23;-1:-1:-1;;;;;35430:21:0;;35446:4;35430:21;;:49;;-1:-1:-1;;;;;;35455:24:0;;35474:4;35455:24;35430:49;35612:14;;35677:19;;35405:75;;-1:-1:-1;;;;;;35612:14:0;;;;35582:21;;35667:29;;;35677:19;;35667:29;:59;;;;;35713:13;-1:-1:-1;;;;;35700:26:0;:9;-1:-1:-1;;;;;35700:26:0;;35667:59;35666:136;;;-1:-1:-1;35755:19:0;;-1:-1:-1;;;;;35742:32:0;;;35755:19;;35742:32;:59;;;;;35788:13;-1:-1:-1;;;;;35778:23:0;:6;-1:-1:-1;;;;;35778:23:0;;35742:59;35928:19;;35638:165;;-1:-1:-1;35905:11:0;;-1:-1:-1;;;;;35917:30:0;;;35928:19;;35917:30;;:59;;;35963:13;-1:-1:-1;;;;;35950:26:0;:9;-1:-1:-1;;;;;35950:26:0;;35917:59;36006:19;;35905:71;;-1:-1:-1;35987:10:0;;-1:-1:-1;;;;;35998:27:0;;;36006:19;;35998:27;;:53;;;36038:13;-1:-1:-1;;;;;36028:23:0;:6;-1:-1:-1;;;;;36028:23:0;;35998:53;35987:64;;36094:18;:41;;;;36116:19;36094:41;:55;;;;36139:10;36094:55;36091:374;;;36165:43;36182:6;36190:9;36201:6;36165:16;:43::i;:::-;36091:374;;;36327:14;;;;;;;36319:49;;;;-1:-1:-1;;;36319:49:0;;15745:2:1;36319:49:0;;;15727:21:1;15784:2;15764:18;;;15757:30;15823:25;15803:18;;;15796:53;15866:18;;36319:49:0;15717:173:1;36319:49:0;36383:52;36398:6;36405:9;36415:6;36422:5;36428:6;36383:14;:52::i;:::-;34819:1653;;;;;;;;;:::o;40426:312::-;40479:5;30124:10;40515:15;;:26;;;;:::i;:::-;40499:15;:42;40496:61;;;-1:-1:-1;40550:7:0;;;;;;;;40426:312::o;40496:61::-;40568:23;40608:15;;40592;:31;;;;:::i;:::-;40568:55;;40634:9;30124:10;40681:15;40672:7;;;;;;;;;;;30087:2;40662:17;;;;:::i;:::-;40661:35;;;;;;:::i;:::-;:46;;;;:::i;:::-;40650:58;;30087:2;40650:58;:::i;63337:230::-;63493:20;;63479:13;:34;63471:43;;;;;;63525:20;:34;63337:230::o;55077:192::-;55135:7;55157:27;55179:4;55157:21;:27::i;:::-;55154:53;;;-1:-1:-1;;;;;;55193:14:0;;;;;:8;:14;;;;;;;55077:192::o;55154:53::-;-1:-1:-1;;;;;55247:14:0;;;;;;:8;:14;;;;;;55225:21;55256:4;55225:15;:21::i;:::-;:36;;;;:::i;44693:669::-;-1:-1:-1;;;;;44828:15:0;;44810:17;44828:15;;;:9;:15;;;;;;:22;;44844:6;;44828:22;:::i;:::-;44810:40;;44874:27;44896:4;44874:21;:27::i;:::-;44871:102;;;-1:-1:-1;;;;;44916:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;44693:669:0:o;44871:102::-;44997:6;44983:12;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;45059:15:0;;-1:-1:-1;45075:21:0;45091:4;45075:15;:21::i;:::-;-1:-1:-1;;;;;45134:15:0;;;;;;:9;:15;;;;;:25;;;45243:14;;45059:37;;-1:-1:-1;45243:26:0;;45150:9;;45243:26;:::i;:::-;-1:-1:-1;;;;;45217:23:0;;;;;;:17;:23;;;;;;;;:52;;;;45330:8;:14;;;;;:23;;45346:7;;45217:23;45330;;45346:7;;45330:23;:::i;:::-;;;;-1:-1:-1;;;;;;44693:669:0:o;43935:666::-;-1:-1:-1;;;;;44067:15:0;;44049:17;44067:15;;;:9;:15;;;;;;:22;;44083:6;;44067:22;:::i;:::-;44049:40;;44113:27;44135:4;44113:21;:27::i;:::-;44110:102;;;-1:-1:-1;;;;;44155:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;43935:666:0:o;44110:102::-;44236:6;44222:12;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;44298:15:0;;-1:-1:-1;44314:21:0;44330:4;44314:15;:21::i;:::-;44298:37;;44436:9;44419:14;;:26;;;;:::i;:::-;-1:-1:-1;;;;;44393:23:0;;;;;;:17;:23;;;;;;;;:52;;;;44506:8;:14;;;;;:23;;44522:7;;44393:23;44506;;44522:7;;44506:23;:::i;:::-;;;;-1:-1:-1;;;;;;;;44568:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;43935:666:0:o;52337:397::-;52431:9;52419:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;52483:14:0;;52451:61;;52468:4;;-1:-1:-1;;;;;52483:14:0;52500:11;52451:8;:61::i;:::-;52523:14;;:203;;-1:-1:-1;;;52523:203:0;;-1:-1:-1;;;;;52523:14:0;;;;:30;;52561:9;;52523:203;;52594:4;;52614:11;;52523:14;;;;52594:4;;52700:15;;52523:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49723:1982::-;49471:27;:34;;-1:-1:-1;;49471:34:0;49501:4;49471:34;;;49852:3:::1;49833:22;::::0;::::1;;;49825:31;;;::::0;::::1;;49909:4;49867:23;49891:24:::0;;;:9:::1;:24;::::0;;;;;49956:11:::1;::::0;49891:24;;49867:23;49942:25:::1;::::0;49956:11:::1;;::::0;::::1;::::0;::::1;::::0;49942:13:::1;:25;:::i;:::-;49926:41;;::::0;-1:-1:-1;49981:11:0;49978:23:::1;;49994:7;;;;49978:23;50043:19;::::0;-1:-1:-1;;;;;50043:19:0::1;50013;50033:30:::0;;;:9:::1;:30;::::0;;;;;50082:4:::1;::::0;50033:48:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;:53;;;;:::i;:::-;50013:73;;50112:9;;50100:11;:21;:36;;;;;50124:12;50123:13;50100:36;50097:62;;;-1:-1:-1::0;50150:9:0::1;::::0;50097:62:::1;50297:27:::0;;::::1;50335:132:::0;::::1;;;50371:12;50368:88;;;50414:15;50402:27;;50368:88;;;50449:7;;;;;;50368:88;50589:13;::::0;50550:25:::1;::::0;50576:36:::1;::::0;::::1;::::0;50577:25:::1;::::0;50589:13:::1;;50577:11:::0;:25:::1;:::i;:::-;50576:36;;;;:::i;:::-;50550:62:::0;-1:-1:-1;50623:25:0::1;50650:29;50550:62:::0;50650:11;:29:::1;:::i;:::-;50623:56:::0;-1:-1:-1;50740:16:0::1;50757:19;50775:1;50757:17:::0;:19:::1;:::i;:::-;50740:36:::0;-1:-1:-1;50787:19:0::1;50807:26;50740:36:::0;50807:17;:26:::1;:::i;:::-;50787:46:::0;-1:-1:-1;50916:17:0::1;50934:29;50946:17:::0;50787:46;50934:29:::1;:::i;:::-;50916:47:::0;-1:-1:-1;51078:21:0::1;51110:27;50916:47:::0;51110:16:::1;:27::i;:::-;51148:14;51164:41;51188:17:::0;51164:21:::1;:41;:::i;:::-;51148:58:::0;-1:-1:-1;51306:14:0::1;51344:9:::0;51324:18:::1;51331:11:::0;51148:58;51324:18:::1;:::i;:::-;51323:30;;;;:::i;:::-;51306:47;;51364:31;51378:8;51388:6;51364:13;:31::i;:::-;51518:21;51541:41;51565:17:::0;51541:21:::1;:41;:::i;:::-;51518:65;;51661:36;51678:13;51692:4;51661:16;:36::i;:::-;49516:1;;;;;;;;;;;;;;-1:-1:-1::0;;49528:27:0;:35;;-1:-1:-1;;49528:35:0;;;49723:1982::o;45508:427::-;-1:-1:-1;;;;;45629:17:0;;45571:7;45629:17;;;:9;:17;;;;;;45612:14;;45571:7;;45612:34;;;:::i;:::-;-1:-1:-1;;;;;45809:25:0;;;;;;:17;:25;;;;;;45591:55;;-1:-1:-1;45798:36:0;;45795:49;;;-1:-1:-1;45843:1:0;;45508:427;-1:-1:-1;;45508:427:0:o;45795:49::-;-1:-1:-1;;;;;45876:25:0;;;;;;:17;:25;;;;;;-1:-1:-1;;;42323:5:0;45863:38;;:10;:38;:::i;:::-;45862:65;;;;:::i;46005:833::-;46162:14;;46124:22;;46180:3;;46150:26;;46162:14;;46150:9;:26;:::i;:::-;46149:34;;;;:::i;:::-;46124:59;-1:-1:-1;46194:14:0;46211:26;46124:59;46211:9;:26;:::i;:::-;46194:43;;46267:14;46249:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;46305:10:0;;46301:530;;46335:16;46332:83;;;46393:6;46371:18;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;46332:83:0;46429:19;46449:16;:14;:16::i;:::-;46429:36;-1:-1:-1;46559:16:0;46555:265;;46616:6;46596:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;46555:265:0;;-1:-1:-1;46555:265:0;;46792:11;46757:31;-1:-1:-1;;;46757:6:0;:31;:::i;:::-;46756:47;;;;:::i;:::-;46737:14;;:67;;;;;;;:::i;20849:414::-;20912:4;23175:19;;;:12;;;:19;;;;;;20929:327;;-1:-1:-1;20972:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;21155:18;;21133:19;;;:12;;;:19;;;;;;:40;;;;21188:11;;20929:327;-1:-1:-1;21239:5:0;21232:12;;21439:1553;21505:4;21644:19;;;:12;;;:19;;;;;;21680:15;;21676:1309;;22042:21;22066:14;22079:1;22066:10;:14;:::i;:::-;22115:18;;22042:38;;-1:-1:-1;22095:17:0;;22115:22;;22136:1;;22115:22;:::i;:::-;22095:42;;22382:17;22402:3;:11;;22414:9;22402:22;;;;;;-1:-1:-1;;;22402:22:0;;;;;;;;;;;;;;;;;22382:42;;22548:9;22519:3;:11;;22531:13;22519:26;;;;;;-1:-1:-1;;;22519:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;22625:23;;;:12;;;:23;;;;;;:36;;;22786:17;;22625:3;;22786:17;;;-1:-1:-1;;;22786:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;22881:3;:12;;:19;22894:5;22881:19;;;;;;;;;;;22874:26;;;22924:4;22917:11;;;;;;;;21676:1309;22968:5;22961:12;;;;;40804:440;-1:-1:-1;;;;;40923:17:0;;40899:21;40923:17;;;:9;:17;;;;;;40959:23;;;;40951:60;;;;-1:-1:-1;;;40951:60:0;;10604:2:1;40951:60:0;;;10586:21:1;10643:2;10623:18;;;10616:30;-1:-1:-1;;;10662:18:1;;;10655:54;10726:18;;40951:60:0;10576:174:1;40951:60:0;41067:27;41080:6;41087;41067:12;:27::i;:::-;41147:28;41157:9;41168:6;41147:9;:28::i;:::-;41217:9;-1:-1:-1;;;;;41201:33:0;41210:6;-1:-1:-1;;;;;41201:33:0;;41227:6;41201:33;;;;20521:25:1;;20509:2;20494:18;;20476:76;41201:33:0;;;;;;;;40804:440;;;;:::o;36575:3246::-;-1:-1:-1;;;;;36718:20:0;;;36691:24;36718:20;;;:9;:20;;;;;;;36773:17;;;;;;;;36809:23;;;;36801:60;;;;-1:-1:-1;;;36801:60:0;;10604:2:1;36801:60:0;;;10586:21:1;10643:2;10623:18;;;10616:30;-1:-1:-1;;;10662:18:1;;;10655:54;10726:18;;36801:60:0;10576:174:1;36801:60:0;36874:9;36897:6;36894:1741;;;36923:16;;;;;;;36922:17;:58;;;;-1:-1:-1;36942:38:0;:21;36973:6;36942:30;:38::i;:::-;36941:39;36922:58;36919:476;;;-1:-1:-1;;;;;37008:17:0;;;;;;:9;:17;;;;;;37027:15;-1:-1:-1;37008:34:0;37000:64;;;;-1:-1:-1;;;37000:64:0;;20037:2:1;37000:64:0;;;20019:21:1;20076:2;20056:18;;;20049:30;-1:-1:-1;;;20095:18:1;;;20088:48;20153:18;;37000:64:0;20009:168:1;37000:64:0;37189:12;;37173:28;;:15;:28;:::i;:::-;-1:-1:-1;;;;;37155:17:0;;;;;;:9;:17;;;;;:46;37351:9;;37343:17;;;37335:44;;;;-1:-1:-1;;;37335:44:0;;13535:2:1;37335:44:0;;;13517:21:1;13574:2;13554:18;;;13547:30;-1:-1:-1;;;13593:18:1;;;13586:45;13648:18;;37335:44:0;13507:165:1;37335:44:0;-1:-1:-1;;;;;;37468:22:0;;;;;;:14;:22;;;;;:27;;-1:-1:-1;;37468:27:0;37491:4;37468:27;;;37514:8;;;;;37468:27;37514:8;36894:1741;;;37545:5;37542:1093;;;37690:12;;37665:23;37682:6;37665:16;:23;:::i;:::-;:37;;37657:65;;;;-1:-1:-1;;;37657:65:0;;17502:2:1;37657:65:0;;;17484:21:1;17541:2;17521:18;;;17514:30;-1:-1:-1;;;17560:18:1;;;17553:46;17616:18;;37657:65:0;17474:166:1;37657:65:0;37741:21;37752:9;37741:10;:21::i;:::-;37737:25;;37542:1093;;;38002:15;29913:2;38002;:15;:::i;:::-;37994:6;:23;37991:61;;38037:12;;38019:33;;38030:6;;38037:12;;;-1:-1:-1;;;;;38037:12:0;38050:1;38019:10;:33::i;:::-;38191:12;;38166:23;38183:6;38166:16;:23;:::i;:::-;:37;;38158:65;;;;-1:-1:-1;;;38158:65:0;;17502:2:1;38158:65:0;;;17484:21:1;17541:2;17521:18;;;17514:30;-1:-1:-1;;;17560:18:1;;;17553:46;17616:18;;38158:65:0;17474:166:1;38158:65:0;38455:38;:21;38486:6;38455:30;:38::i;:::-;38451:139;;-1:-1:-1;;;;;38520:17:0;;;;;;:9;:17;;;;;;38539:15;-1:-1:-1;38520:34:0;;:52;;-1:-1:-1;38556:16:0;;;;;;;38520:52;38512:78;;;;-1:-1:-1;;;38512:78:0;;17847:2:1;38512:78:0;;;17829:21:1;17886:2;17866:18;;;17859:30;-1:-1:-1;;;17905:18:1;;;17898:44;17959:18;;38512:78:0;17819:164:1;38512:78:0;-1:-1:-1;38609:12:0;;;;;;;37542:1093;38970:19;;-1:-1:-1;;;;;38962:27:0;;;38970:19;;38962:27;;;;38961:50;;-1:-1:-1;38994:16:0;;;;38993:17;38961:50;:82;;;;-1:-1:-1;39015:27:0;;;;39014:28;38961:82;:90;;;;;39045:6;38961:90;38958:148;;;39085:14;;39066:40;;39085:14;;;;;39100:5;39066:18;:40::i;:::-;39343:13;;39282:21;;39304:53;;39318:6;;39326:3;;39331:25;;39343:13;;;;;;39331:11;;;:25;:::i;:::-;39304:13;:53::i;:::-;39282:75;-1:-1:-1;39421:19:0;39441:20;39282:75;39441:6;:20;:::i;:::-;39421:40;;39519:27;39532:6;39539;39519:12;:27::i;:::-;39622:39;39640:4;39647:13;39622:9;:39::i;:::-;39716:33;39726:9;39737:11;39716:9;:33::i;:::-;39791:9;-1:-1:-1;;;;;39775:38:0;39784:6;-1:-1:-1;;;;;39775:38:0;;39801:11;39775:38;;;;20521:25:1;;20509:2;20494:18;;20476:76;39775:38:0;;;;;;;;36575:3246;;;;;;;;;;:::o;51755:455::-;51848:14;;51816:56;;51833:4;;-1:-1:-1;;;;;51848:14:0;51865:6;51816:8;:56::i;:::-;51907:16;;;51921:1;51907:16;;;;;;;;51883:21;;51907:16;;;;;;;;;;-1:-1:-1;51907:16:0;51883:40;;51952:4;51934;51939:1;51934:7;;;;;;-1:-1:-1;;;51934:7:0;;;;;;;;;-1:-1:-1;;;;;51934:23:0;;;:7;;;;;;;;;;:23;;;;51978:14;;:21;;;-1:-1:-1;;;51978:21:0;;;;:14;;;;;:19;;:21;;;;;51934:7;;51978:21;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51968:4;51973:1;51968:7;;;;;;-1:-1:-1;;;51968:7:0;;;;;;;;;-1:-1:-1;;;;;51968:31:0;;;:7;;;;;;;;;:31;52012:14;;:190;;-1:-1:-1;;;52012:190:0;;:14;;;:65;;:190;;52092:6;;52012:14;;52129:4;;52156;;52176:15;;52012:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51755:455;;:::o;39829:542::-;39912:14;;39885:5;;39912:14;;39908:34;;-1:-1:-1;;39935:7:0;;;;;;;;39829:542::o;39908:34::-;30124:10;39973:15;;:26;;;;:::i;:::-;39956:15;:44;39953:303;;;40016:9;40026:21;:19;:21::i;:::-;40016:31;-1:-1:-1;40065:30:0;:10;40085:9;40065:19;:30::i;:::-;40062:158;;;40123:7;;:23;;30217:2;;40123:7;;;;;:23;:::i;:::-;40118:29;;:3;:29;;;40115:89;;;-1:-1:-1;40153:7:0;;;;;;;40115:89;;;40184:20;30217:2;40184:20;;:::i;39953:303::-;-1:-1:-1;;40266:14:0;:20;;-1:-1:-1;;40266:20:0;;;40297:13;:16;;-1:-1:-1;;40324:14:0;;;;;;;40266:20;40356:7;;;;;;39829:542::o;41299:156::-;41389:7;41442:5;41428:10;41417:21;;41424:3;41417:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;41416:31;;;;:::i;:::-;41409:38;41299:156;-1:-1:-1;;;;41299:156:0:o;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;:::-;63:85;;;:::o;153:128::-;218:20;;247:28;218:20;247:28;:::i;286:159::-;353:20;;413:6;402:18;;392:29;;382:2;;435:1;432;425:12;450:156;516:20;;576:4;565:16;;555:27;;545:2;;596:1;593;586:12;611:257;670:6;723:2;711:9;702:7;698:23;694:32;691:2;;;744:6;736;729:22;691:2;788:9;775:23;807:31;832:5;807:31;:::i;873:261::-;943:6;996:2;984:9;975:7;971:23;967:32;964:2;;;1017:6;1009;1002:22;964:2;1054:9;1048:16;1073:31;1098:5;1073:31;:::i;1139:398::-;1207:6;1215;1268:2;1256:9;1247:7;1243:23;1239:32;1236:2;;;1289:6;1281;1274:22;1236:2;1333:9;1320:23;1352:31;1377:5;1352:31;:::i;:::-;1402:5;-1:-1:-1;1459:2:1;1444:18;;1431:32;1472:33;1431:32;1472:33;:::i;:::-;1524:7;1514:17;;;1226:311;;;;;:::o;1542:466::-;1619:6;1627;1635;1688:2;1676:9;1667:7;1663:23;1659:32;1656:2;;;1709:6;1701;1694:22;1656:2;1753:9;1740:23;1772:31;1797:5;1772:31;:::i;:::-;1822:5;-1:-1:-1;1879:2:1;1864:18;;1851:32;1892:33;1851:32;1892:33;:::i;:::-;1646:362;;1944:7;;-1:-1:-1;;;1998:2:1;1983:18;;;;1970:32;;1646:362::o;2013:325::-;2081:6;2089;2142:2;2130:9;2121:7;2117:23;2113:32;2110:2;;;2163:6;2155;2148:22;2110:2;2207:9;2194:23;2226:31;2251:5;2226:31;:::i;:::-;2276:5;2328:2;2313:18;;;;2300:32;;-1:-1:-1;;;2100:238:1:o;2343:1247::-;2433:6;2441;2494:2;2482:9;2473:7;2469:23;2465:32;2462:2;;;2515:6;2507;2500:22;2462:2;2560:9;2547:23;2589:18;2630:2;2622:6;2619:14;2616:2;;;2651:6;2643;2636:22;2616:2;2694:6;2683:9;2679:22;2669:32;;2739:7;2732:4;2728:2;2724:13;2720:27;2710:2;;2766:6;2758;2751:22;2710:2;2807;2794:16;2829:4;2852:2;2848;2845:10;2842:2;;;2858:18;;:::i;:::-;2904:2;2901:1;2897:10;2936:2;2930:9;2999:2;2995:7;2990:2;2986;2982:11;2978:25;2970:6;2966:38;3054:6;3042:10;3039:22;3034:2;3022:10;3019:18;3016:46;3013:2;;;3065:18;;:::i;:::-;3101:2;3094:22;3151:18;;;3185:15;;;;-1:-1:-1;3220:11:1;;;3250;;;3246:20;;3243:33;-1:-1:-1;3240:2:1;;;3294:6;3286;3279:22;3240:2;3321:6;3312:15;;3336:169;3350:2;3347:1;3344:9;3336:169;;;3407:23;3426:3;3407:23;:::i;:::-;3395:36;;3368:1;3361:9;;;;;3451:12;;;;3483;;3336:169;;;-1:-1:-1;3524:6:1;-1:-1:-1;3549:35:1;;-1:-1:-1;3565:18:1;;;3549:35;:::i;:::-;3539:45;;;;;;2452:1138;;;;;:::o;3595:251::-;3651:6;3704:2;3692:9;3683:7;3679:23;3675:32;3672:2;;;3725:6;3717;3710:22;3672:2;3769:9;3756:23;3788:28;3810:5;3788:28;:::i;3851:255::-;3918:6;3971:2;3959:9;3950:7;3946:23;3942:32;3939:2;;;3992:6;3984;3977:22;3939:2;4029:9;4023:16;4048:28;4070:5;4048:28;:::i;4111:194::-;4169:6;4222:2;4210:9;4201:7;4197:23;4193:32;4190:2;;;4243:6;4235;4228:22;4190:2;4271:28;4289:9;4271:28;:::i;4310:323::-;4374:6;4382;4435:2;4423:9;4414:7;4410:23;4406:32;4403:2;;;4456:6;4448;4441:22;4403:2;4484:28;4502:9;4484:28;:::i;:::-;4474:38;;4562:2;4551:9;4547:18;4534:32;4575:28;4597:5;4575:28;:::i;4638:190::-;4697:6;4750:2;4738:9;4729:7;4725:23;4721:32;4718:2;;;4771:6;4763;4756:22;4718:2;-1:-1:-1;4799:23:1;;4708:120;-1:-1:-1;4708:120:1:o;4833:194::-;4903:6;4956:2;4944:9;4935:7;4931:23;4927:32;4924:2;;;4977:6;4969;4962:22;4924:2;-1:-1:-1;5005:16:1;;4914:113;-1:-1:-1;4914:113:1:o;5032:258::-;5100:6;5108;5161:2;5149:9;5140:7;5136:23;5132:32;5129:2;;;5182:6;5174;5167:22;5129:2;-1:-1:-1;;5210:23:1;;;5280:2;5265:18;;;5252:32;;-1:-1:-1;5119:171:1:o;5295:316::-;5383:6;5391;5399;5452:2;5440:9;5431:7;5427:23;5423:32;5420:2;;;5473:6;5465;5458:22;5420:2;5507:9;5501:16;5491:26;;5557:2;5546:9;5542:18;5536:25;5526:35;;5601:2;5590:9;5586:18;5580:25;5570:35;;5410:201;;;;;:::o;5616:192::-;5673:6;5726:2;5714:9;5705:7;5701:23;5697:32;5694:2;;;5747:6;5739;5732:22;5694:2;5775:27;5792:9;5775:27;:::i;5813:321::-;5876:6;5884;5937:2;5925:9;5916:7;5912:23;5908:32;5905:2;;;5958:6;5950;5943:22;5905:2;5986:27;6003:9;5986:27;:::i;6139:474::-;6224:6;6232;6240;6248;6256;6309:3;6297:9;6288:7;6284:23;6280:33;6277:2;;;6331:6;6323;6316:22;6277:2;6359:27;6376:9;6359:27;:::i;:::-;6349:37;;6405:36;6437:2;6426:9;6422:18;6405:36;:::i;:::-;6395:46;;6460:36;6492:2;6481:9;6477:18;6460:36;:::i;:::-;6450:46;;6515:36;6547:2;6536:9;6532:18;6515:36;:::i;:::-;6505:46;;6570:37;6602:3;6591:9;6587:19;6570:37;:::i;:::-;6560:47;;6267:346;;;;;;;;:::o;6618:463::-;6671:3;6709:5;6703:12;6736:6;6731:3;6724:19;6762:4;6791:2;6786:3;6782:12;6775:19;;6828:2;6821:5;6817:14;6849:3;6861:195;6875:6;6872:1;6869:13;6861:195;;;6940:13;;-1:-1:-1;;;;;6936:39:1;6924:52;;6996:12;;;;7031:15;;;;6972:1;6890:9;6861:195;;;-1:-1:-1;7072:3:1;;6679:402;-1:-1:-1;;;;;6679:402:1:o;7783:607::-;-1:-1:-1;;;;;8142:15:1;;;8124:34;;8189:2;8174:18;;8167:34;;;;8232:2;8217:18;;8210:34;;;;8275:2;8260:18;;8253:34;;;;8324:15;;;8318:3;8303:19;;8296:44;8104:3;8356:19;;8349:35;;;;8073:3;8058:19;;8040:350::o;8587:510::-;8858:6;8847:9;8840:25;8901:3;8896:2;8885:9;8881:18;8874:31;8821:4;8922:57;8974:3;8963:9;8959:19;8951:6;8922:57;:::i;:::-;-1:-1:-1;;;;;9015:32:1;;;;9010:2;8995:18;;8988:60;-1:-1:-1;9079:2:1;9064:18;9057:34;8914:65;8830:267;-1:-1:-1;;8830:267:1:o;9102:603::-;9214:4;9243:2;9272;9261:9;9254:21;9304:6;9298:13;9347:6;9342:2;9331:9;9327:18;9320:34;9372:4;9385:140;9399:6;9396:1;9393:13;9385:140;;;9494:14;;;9490:23;;9484:30;9460:17;;;9479:2;9456:26;9449:66;9414:10;;9385:140;;;9543:6;9540:1;9537:13;9534:2;;;9613:4;9608:2;9599:6;9588:9;9584:22;9580:31;9573:45;9534:2;-1:-1:-1;9689:2:1;9668:15;-1:-1:-1;;9664:29:1;9649:45;;;;9696:2;9645:54;;9223:482;-1:-1:-1;;;9223:482:1:o;10057:340::-;10259:2;10241:21;;;10298:2;10278:18;;;10271:30;-1:-1:-1;;;10332:2:1;10317:18;;10310:46;10388:2;10373:18;;10231:166::o;15895:342::-;16097:2;16079:21;;;16136:2;16116:18;;;16109:30;-1:-1:-1;;;16170:2:1;16155:18;;16148:48;16228:2;16213:18;;16069:168::o;20937:582::-;21236:6;21225:9;21218:25;21279:6;21274:2;21263:9;21259:18;21252:34;21322:3;21317:2;21306:9;21302:18;21295:31;21199:4;21343:57;21395:3;21384:9;21380:19;21372:6;21343:57;:::i;:::-;-1:-1:-1;;;;;21436:32:1;;;;21431:2;21416:18;;21409:60;-1:-1:-1;21500:3:1;21485:19;21478:35;21335:65;21208:311;-1:-1:-1;;;21208:311:1:o;22434:128::-;22474:3;22505:1;22501:6;22498:1;22495:13;22492:2;;;22511:18;;:::i;:::-;-1:-1:-1;22547:9:1;;22482:80::o;22567:204::-;22605:3;22641:4;22638:1;22634:12;22673:4;22670:1;22666:12;22708:3;22702:4;22698:14;22693:3;22690:23;22687:2;;;22716:18;;:::i;:::-;22752:13;;22613:158;-1:-1:-1;;;22613:158:1:o;22776:217::-;22816:1;22842;22832:2;;-1:-1:-1;;;22867:31:1;;22921:4;22918:1;22911:15;22949:4;22874:1;22939:15;22832:2;-1:-1:-1;22978:9:1;;22822:171::o;22998:422::-;23087:1;23130:5;23087:1;23144:270;23165:7;23155:8;23152:21;23144:270;;;23224:4;23220:1;23216:6;23212:17;23206:4;23203:27;23200:2;;;23233:18;;:::i;:::-;23283:7;23273:8;23269:22;23266:2;;;23303:16;;;;23266:2;23382:22;;;;23342:15;;;;23144:270;;;23148:3;23062:358;;;;;:::o;23425:140::-;23483:5;23512:47;23553:4;23543:8;23539:19;23533:4;23619:5;23649:8;23639:2;;-1:-1:-1;23690:1:1;23704:5;;23639:2;23738:4;23728:2;;-1:-1:-1;23775:1:1;23789:5;;23728:2;23820:4;23838:1;23833:59;;;;23906:1;23901:130;;;;23813:218;;23833:59;23863:1;23854:10;;23877:5;;;23901:130;23938:3;23928:8;23925:17;23922:2;;;23945:18;;:::i;:::-;-1:-1:-1;;24001:1:1;23987:16;;24016:5;;23813:218;;24115:2;24105:8;24102:16;24096:3;24090:4;24087:13;24083:36;24077:2;24067:8;24064:16;24059:2;24053:4;24050:12;24046:35;24043:77;24040:2;;;-1:-1:-1;24152:19:1;;;24184:5;;24040:2;24231:34;24256:8;24250:4;24231:34;:::i;:::-;24301:6;24297:1;24293:6;24289:19;24280:7;24277:32;24274:2;;;24312:18;;:::i;:::-;24350:20;;23629:747;-1:-1:-1;;;23629:747:1:o;24381:168::-;24421:7;24487:1;24483;24479:6;24475:14;24472:1;24469:21;24464:1;24457:9;24450:17;24446:45;24443:2;;;24494:18;;:::i;:::-;-1:-1:-1;24534:9:1;;24433:116::o;24554:125::-;24594:4;24622:1;24619;24616:8;24613:2;;;24627:18;;:::i;:::-;-1:-1:-1;24664:9:1;;24603:76::o;24684:195::-;24722:4;24759;24756:1;24752:12;24791:4;24788:1;24784:12;24816:3;24811;24808:12;24805:2;;;24823:18;;:::i;:::-;24860:13;;;24731:148;-1:-1:-1;;;24731:148:1:o;24884:135::-;24923:3;-1:-1:-1;;24944:17:1;;24941:2;;;24964:18;;:::i;:::-;-1:-1:-1;25011:1:1;25000:13;;24931:88::o;25024:127::-;25085:10;25080:3;25076:20;25073:1;25066:31;25116:4;25113:1;25106:15;25140:4;25137:1;25130:15;25156:127;25217:10;25212:3;25208:20;25205:1;25198:31;25248:4;25245:1;25238:15;25272:4;25269:1;25262:15;25288:131;-1:-1:-1;;;;;25363:31:1;;25353:42;;25343:2;;25409:1;25406;25399:12;25424:118;25510:5;25503:13;25496:21;25489:5;25486:32;25476:2;;25532:1;25529;25522:12

Swarm Source

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