ETH Price: $1,927.95 (-1.93%)
 

Overview

ETH Balance

0.024749543250407209 ETH

Eth Value

$47.72 (@ $1,927.95/ETH)

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Max Wallet180802322023-09-06 21:58:59907 days ago1694037539IN
Apex Ventures: Apex Token
0 ETH0.0006322219.5500021
Set Tx Limit180802242023-09-06 21:57:23907 days ago1694037443IN
Apex Ventures: Apex Token
0 ETH0.0005762717.84975396
Approve170128072023-04-09 19:30:351057 days ago1681068635IN
Apex Ventures: Apex Token
0 ETH0.0004849719.96599657
Approve168979412023-03-24 14:25:471073 days ago1679667947IN
Apex Ventures: Apex Token
0 ETH0.0014546531.48461092
Approve167986552023-03-10 15:36:111087 days ago1678462571IN
Apex Ventures: Apex Token
0 ETH0.001431430.94929905
Approve167693662023-03-06 12:39:351091 days ago1678106375IN
Apex Ventures: Apex Token
0 ETH0.000564923.26819758
Approve164657902023-01-23 0:01:591133 days ago1674432119IN
Apex Ventures: Apex Token
0 ETH0.0007019215.09063279
Approve163681652023-01-09 8:51:471147 days ago1673254307IN
Apex Ventures: Apex Token
0 ETH0.0006728214.4464118
Transfer163679312023-01-09 8:04:591147 days ago1673251499IN
Apex Ventures: Apex Token
0 ETH0.0037097113.49118033
Approve162863662022-12-28 22:53:591158 days ago1672268039IN
Apex Ventures: Apex Token
0 ETH0.0008264217.74440543
Approve161231872022-12-06 3:52:591181 days ago1670298779IN
Apex Ventures: Apex Token
0 ETH0.0006182413.27444529
Approve161065432022-12-03 20:02:591184 days ago1670097779IN
Apex Ventures: Apex Token
0 ETH0.0007640516.40513537
Approve161064982022-12-03 19:53:591184 days ago1670097239IN
Apex Ventures: Apex Token
0 ETH0.0007317815.71220293
Approve161064432022-12-03 19:42:591184 days ago1670096579IN
Apex Ventures: Apex Token
0 ETH0.0007128415.30558724
Approve161062912022-12-03 19:12:111184 days ago1670094731IN
Apex Ventures: Apex Token
0 ETH0.0006254513.42917839
Approve159340902022-11-09 17:55:351208 days ago1668016535IN
Apex Ventures: Apex Token
0 ETH0.002179146.78793318
Approve159130862022-11-06 19:32:111211 days ago1667763131IN
Apex Ventures: Apex Token
0 ETH0.0005976112.83146293
Approve158545612022-10-29 15:19:231219 days ago1667056763IN
Apex Ventures: Apex Token
0 ETH0.0006753214.5
Claim Dividend158415502022-10-27 19:38:591221 days ago1666899539IN
Apex Ventures: Apex Token
0 ETH0.0014563222.68597107
Claim Dividend158370302022-10-27 4:29:591221 days ago1666844999IN
Apex Ventures: Apex Token
0 ETH0.000341869.43101904
Approve158301782022-10-26 5:32:471222 days ago1666762367IN
Apex Ventures: Apex Token
0 ETH0.000394098.46176962
Approve158218032022-10-25 1:27:111223 days ago1666661231IN
Apex Ventures: Apex Token
0 ETH0.0007022915.18074432
Approve158117062022-10-23 15:28:231225 days ago1666538903IN
Apex Ventures: Apex Token
0 ETH0.0006529814.02047711
Approve157840582022-10-19 18:51:111229 days ago1666205471IN
Apex Ventures: Apex Token
0 ETH0.0020285743.5559906
Approve157821362022-10-19 12:25:111229 days ago1666182311IN
Apex Ventures: Apex Token
0 ETH0.000786716.89157052
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer164657922023-01-23 0:02:231133 days ago1674432143
Apex Ventures: Apex Token
0.02482651 ETH
Deposit164657922023-01-23 0:02:231133 days ago1674432143
Apex Ventures: Apex Token
0.00930994 ETH
Transfer164657922023-01-23 0:02:231133 days ago1674432143
Apex Ventures: Apex Token
0.02792983 ETH
Deposit161231892022-12-06 3:53:231181 days ago1670298803
Apex Ventures: Apex Token
0.01331844 ETH
Transfer161231892022-12-06 3:53:231181 days ago1670298803
Apex Ventures: Apex Token
0.03995532 ETH
Transfer161065002022-12-03 19:54:231184 days ago1670097263
Apex Ventures: Apex Token
0.03868683 ETH
Deposit161065002022-12-03 19:54:231184 days ago1670097263
Apex Ventures: Apex Token
0.01450756 ETH
Transfer161065002022-12-03 19:54:231184 days ago1670097263
Apex Ventures: Apex Token
0.04352268 ETH
Add Liquidity ET...159712842022-11-14 22:32:351202 days ago1668465155
Apex Ventures: Apex Token
0.02383959 ETH
Transfer159712842022-11-14 22:32:351202 days ago1668465155
Apex Ventures: Apex Token
0.02383959 ETH
Transfer159194682022-11-07 16:53:471210 days ago1667840027
Apex Ventures: Apex Token
0.04766952 ETH
Deposit159194682022-11-07 16:53:471210 days ago1667840027
Apex Ventures: Apex Token
0.01787607 ETH
Transfer159194682022-11-07 16:53:471210 days ago1667840027
Apex Ventures: Apex Token
0.05362821 ETH
Transfer158153922022-10-24 3:50:351224 days ago1666583435
Apex Ventures: Apex Token
0.0533007 ETH
Deposit158153922022-10-24 3:50:351224 days ago1666583435
Apex Ventures: Apex Token
0.01998776 ETH
Transfer158153922022-10-24 3:50:351224 days ago1666583435
Apex Ventures: Apex Token
0.05996329 ETH
Transfer157789782022-10-19 1:49:471229 days ago1666144187
Apex Ventures: Apex Token
0.05861306 ETH
Deposit157789782022-10-19 1:49:471229 days ago1666144187
Apex Ventures: Apex Token
0.02197989 ETH
Transfer157789782022-10-19 1:49:471229 days ago1666144187
Apex Ventures: Apex Token
0.06593969 ETH
Deposit157377152022-10-13 7:30:351235 days ago1665646235
Apex Ventures: Apex Token
0.02352372 ETH
Transfer157377152022-10-13 7:30:351235 days ago1665646235
Apex Ventures: Apex Token
0.07057118 ETH
Transfer156980592022-10-07 18:41:231241 days ago1665168083
Apex Ventures: Apex Token
0.06302525 ETH
Deposit156980592022-10-07 18:41:231241 days ago1665168083
Apex Ventures: Apex Token
0.02363447 ETH
Transfer156980592022-10-07 18:41:231241 days ago1665168083
Apex Ventures: Apex Token
0.07090341 ETH
Transfer156805752022-10-05 8:00:591243 days ago1664956859
Apex Ventures: Apex Token
0.07279058 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
av

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license
/**
 *Submitted for verification at Etherscan.io on 2022-09-06
*/

//SPDX-License-Identifier: Unlicensed
pragma solidity >=0.5.0 <0.9.0;
/**
       d8888 8888888b.  8888888888 Y88b   d88P                                             
      d88888 888   Y88b 888         Y88b d88P                                              
     d88P888 888    888 888          Y88o88P                                               
    d88P 888 888   d88P 8888888       Y888P                                                
   d88P  888 8888888P"  888           d888b                                                
  d88P   888 888        888          d88888b                                               
 d8888888888 888        888         d88P Y88b                                              
d88P     888 888        8888888888 d88P   Y88b                                             
                                                                                                                                                                                  
                                                                                           
888     888 8888888888 888b    888 88888888888 888     888 8888888b.  8888888888 .d8888b.  
888     888 888        8888b   888     888     888     888 888   Y88b 888       d88P  Y88b 
888     888 888        88888b  888     888     888     888 888    888 888       Y88b.      
Y88b   d88P 8888888    888Y88b 888     888     888     888 888   d88P 8888888    "Y888b.   
 Y88b d88P  888        888 Y88b888     888     888     888 8888888P"  888           "Y88b. 
  Y88o88P   888        888  Y88888     888     888     888 888 T88b   888             "888 
   Y888P    888        888   Y8888     888     Y88b. .d88P 888  T88b  888       Y88b  d88P 
    Y8P     8888888888 888    Y888     888      "Y88888P"  888   T88b 8888888888 "Y8888P"  



$APEX IS THE FIRST PROTOCOL TO ENSURE FUNDAMENTAL SUSTAINABILITY AND FAIRNESS IN REWARD DISTRIBUTION!


https://www.apexventureseth.com/
https://t.me/ApexVenturesOfficial


Welcome to APEX Ventures...  If you're reading these contract notes you're either a gem hunter watching new pairs, 
or you're a savvy investor who "Does YOR" and consumes all documentation before making a decision.  Perhaps we 
should address both audiences. The recent bear market has changed the crypto landscape as we know it, 
entire sub-industries like Defi 2.0 and FaaS we're brought to their knees.  We watched as giants tumbled one by one.
Strong, Ohm, Time, Mim, MCC, Luna, UST, Three Arrows.. the list goes on.  As the dust settled we looked around 
and asked ourselves one VERY SIMPLE question... who was actually left making profits?  

It was a simple question with a simple answer; the people getting their hands dirty and physically operating
the miners processing the transactions were the ones earning consistent reliable profits. That's why were 
introducing a totally unique and brand new utility that's never been tried as a layer-2 on Ethereum blockchain,
we're it calling MaaS, Mining as a service! Our innovative protocol will revolutionise the defi world and
offer truly sustainable yield generation to our holders and unlike our predecessors there won’t be a 
requirement to sell your $Apex tokens to materialise these rewards. 

Furthermore, Apex Ventures will offer our second brand new innovative utility to the Apex ecosystem which we 
are calling NaaS, NFTs as a service! Combining the protocols of MaaS and NaaS will allow us to offer exclusive 
yields to our NFT holders!    

You don’t want to miss this! Come check us out for yourself.... https://t.me/ApexVenturesOfficial

*/
abstract contract Context {
    function _msgSender() internal view returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
    
        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
    
        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
    
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
    
        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    
        return c;
    }
}

interface IERC20 {
    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 IUniswapV2Factory {
    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 IUniswapV2Pair {
    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;

    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    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 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 IUniswapV2Router02 is IUniswapV2Router01 {
    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;
}

interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution,uint256 _minHoldReq) external;
    function setShare(address shareholder, uint256 amount) external;
    function deposit() external payable;
    function process(uint256 gas) external;        
    function claimDividendFor(address shareholder) external;
    function holdReq() external view returns(uint256);
    function getShareholderInfo(address shareholder) external view returns (uint256, uint256, uint256, uint256);
    function getAccountInfo(address shareholder) external view returns (uint256, uint256, uint256, uint256);
}

contract DividendDistributor is IDividendDistributor {
    using SafeMath for uint256;
    
    address _token;
    
    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }
    
    address[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) shareholderClaims;
    mapping (address => Share) public shares;
    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;
    
    uint256 public minPeriod = 24*60 minutes; // amount of time for min distribution to accumalate, once over it sends after x amount automatically.
    uint256 public minHoldReq = 100 * (10**9); // 100 tokens for rewards
    uint256 public minDistribution = 0.01 * (10 ** 18); // .01 token with 18 decimals reward for auto claim
    
    uint256 currentIndex;
    
    bool initialized;
    modifier initialization() {
        require(!initialized);
        _;
        initialized = true;
    }
    
    modifier onlyToken() {
        require(msg.sender == _token); _;
    }

    constructor () {
        _token = msg.sender;
    }

    function getShareholderInfo(address shareholder) external view override returns (uint256, uint256, uint256, uint256) {
        return (
            totalShares,
            totalDistributed,
            shares[shareholder].amount,
            shares[shareholder].totalRealised             
        );
    }

    function holdReq() external view override returns(uint256) {
        return minHoldReq;
    }

    function getAccountInfo(address shareholder) external view override returns(
        uint256 pendingReward,
        uint256 lastClaimTime,
        uint256 nextClaimTime,
        uint256 secondsUntilAutoClaimAvailable){
            
        pendingReward = getUnpaidEarnings(shareholder);
        lastClaimTime = shareholderClaims[shareholder];
        nextClaimTime = lastClaimTime + minPeriod;
        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _minHoldReq) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
        minHoldReq = _minHoldReq * (10**9);
        emit DistributionCriteriaUpdated(minPeriod, minDistribution, minHoldReq);
    }
    
    function setShare(address shareholder, uint256 amount) external override onlyToken {
        if(shares[shareholder].amount > 0){
            distributeDividend(shareholder);
        }
    
        if(amount >= minHoldReq && shares[shareholder].amount == 0){
            addShareholder(shareholder);
        }else if(amount < minHoldReq && shares[shareholder].amount > 0){
            removeShareholder(shareholder);
        }
    
        if(amount < minHoldReq) amount = 1;
        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            
        emit ShareUpdated(shareholder, amount);
    }
    
    function deposit() external payable override {

        uint256 amount = msg.value;
    
        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
            
        emit Deposit(amount);
    }
    
    function process(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;
    
        if(shareholderCount == 0) { return; }
    
        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();
    
        uint256 iterations = 0;
        uint256 count = 0;
    
        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount){
                currentIndex = 0;
            }
    
            if(shouldDistribute(shareholders[currentIndex])){
                distributeDividend(shareholders[currentIndex]);
                count++;
            }
    
            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
            
        emit DividendsProcessed(iterations, count, currentIndex);
    }
    
    function shouldDistribute(address shareholder) internal view returns (bool) {
        return shareholderClaims[shareholder] + minPeriod < block.timestamp
        && getUnpaidEarnings(shareholder) > minDistribution;
    }
    
    function distributeDividend(address shareholder) internal {
        if(shares[shareholder].amount == 0){ return; }
        uint256 amount = getUnpaidEarnings(shareholder);
        if(amount > 0){
            totalDistributed = totalDistributed.add(amount);
            payable(shareholder).transfer(amount);
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
                        
            emit Distribution(shareholder, amount);
        }
    }

    function claimDividend() public {
        distributeDividend(msg.sender);
    }
    
    function claimDividendFor(address shareholder) public override {
        distributeDividend(shareholder);
    }

    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }
    
        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;
    
        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }
    
        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }
    
    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }
    
    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }
    
    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }
        
    event DistributionCriteriaUpdated(uint256 minPeriod, uint256 minDistribution, uint256 minHoldReq);
    event ShareUpdated(address shareholder, uint256 amount);
    event Deposit(uint256 amountETH);
    event Distribution(address shareholder, uint256 amount);
    event DividendsProcessed(uint256 iterations, uint256 count, uint256 index);
}

contract av is IERC20, Context {
    address public owner;
    address public autoLiquidityReceiver;
    address public treasuryFeeReceiver;
    address public pair;

    string constant _name = "Apex Ventures";
    string constant _symbol = "Apex";

    uint256 public constant _initialSupply = 1_000_000; // put supply amount here
    uint256 _totalSupply = _initialSupply * (10**_decimals); // total supply amount
    uint256 treasuryFees;
    uint256 feeAmount;
    uint256 liquidityAmount;
    uint32 distributorGas = 500000;
    uint16 feeDenominator = 100;
    uint16 totalFee;
    uint8 constant _decimals = 9;

    bool public autoClaimEnabled;
    bool public feeEnabled;
    bool public fundRewards;
    mapping(address => mapping(address => uint256)) _allowances;
    mapping(address => bool) authorizations;
    mapping(address => bool) public bannedUsers;
    mapping(address => uint256) _balances;
    mapping(address => uint256) cooldown;
    mapping(address => bool) isDividendExempt;
    mapping(address => bool) isFeeExempt;
    mapping(address => bool) public lpHolder;
    mapping(address => bool) public lpPairs;    
    mapping(address => bool) maxWalletExempt;
    struct IFees {
        uint16 liquidityFee;
        uint16 treasuryFee;
        uint16 reflectionFee;
        uint16 totalFee;
    }
    struct ICooldown {
        bool buycooldownEnabled;
        bool sellcooldownEnabled;
        uint8 cooldownLimit;
        uint8 cooldownTime;
    }
    struct ILiquiditySettings {
        uint256 liquidityFeeAccumulator;
        uint256 numTokensToSwap;
        uint256 lastSwap;
        uint8 swapInterval;
        bool swapEnabled;
        bool inSwap;
        bool autoLiquifyEnabled;
    }
    struct ILaunch {
        uint256 launchBlock;
        uint256 launchedAt;
        uint8 sniperBlocks;
        uint8 snipersCaught;
        bool tradingOpen;
        bool launchProtection;
        bool earlySellFee;
    }
    struct ITransactionSettings {
        uint256 maxTxAmount;
        uint256 maxWalletAmount;
        bool txLimits;
    }        
    IUniswapV2Router02 public router;
    IDividendDistributor public distributor;
    ILiquiditySettings public LiquiditySettings;
    ICooldown public cooldownInfo;    
    ILaunch public Launch;
    ITransactionSettings public TransactionSettings;
    IFees public BuyFees;
    IFees public SellFees;
    IFees public MaxFees;
    IFees public TransferFees;
    modifier swapping() {
        LiquiditySettings.inSwap = true;
        _;
        LiquiditySettings.inSwap = false;
    }
    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER");
        _;
    }
    modifier authorized() {
        require(isAuthorized(msg.sender), "!AUTHORIZED");
        _;
    }

    constructor() {
        owner = _msgSender();
        authorizations[owner] = true;
        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IUniswapV2Factory(router.factory()).createPair(router.WETH(), address(this));
        lpPairs[pair] = true;
        lpHolder[_msgSender()] = true;
        _allowances[address(this)][address(router)] = type(uint256).max;
        _allowances[_msgSender()][address(router)] = type(uint256).max;

        distributor = new DividendDistributor();

        isFeeExempt[address(this)] = true;
        isFeeExempt[_msgSender()] = true;

        maxWalletExempt[_msgSender()] = true;
        maxWalletExempt[address(this)] = true;
        maxWalletExempt[pair] = true;

        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[address(0xDead)] = true;
        setFeeReceivers(0x3f2A0733bF10526b635535667AA51a5d9e59953C,0x8f3625575254dC6A6C52043D8Ac7E2A48C7A4497);
        cooldownInfo.cooldownLimit = 60; // cooldown cannot go over 60 seconds
        MaxFees.totalFee = 20; // 20%
        BuyFees = IFees({
            liquidityFee: 1,
            reflectionFee: 3,
            treasuryFee: 5,
            totalFee: 2 + 3 + 5
        });
        SellFees = IFees({
            liquidityFee: 2,
            reflectionFee: 6,
            treasuryFee: 12,
            totalFee: 2 + 6 + 12
        });     
        cooldownInfo = ICooldown ({
            buycooldownEnabled: true,
            sellcooldownEnabled: true,
            cooldownLimit: 60, // cooldown cannot go over 60 seconds
            cooldownTime: 30
        });
        TransactionSettings.maxTxAmount = _totalSupply / 100;
        TransactionSettings.maxWalletAmount = _totalSupply / 50;
        TransactionSettings.txLimits = true;     
        LiquiditySettings.autoLiquifyEnabled = true;   
        LiquiditySettings.swapEnabled = true;
        LiquiditySettings.numTokensToSwap = (_totalSupply * 10) / (10000);
        feeEnabled = true;
        fundRewards = true;
        autoClaimEnabled = true;
        _balances[_msgSender()] = _totalSupply;
        emit Transfer(address(0), _msgSender(), _totalSupply);
    }
    receive() external payable {}
    // =============================================================
    //                      OWNERSHIP OPERATIONS
    // =============================================================    
    function transferOwnership(address payable adr) external onlyOwner {
        isFeeExempt[owner] = false;
        maxWalletExempt[owner] = false;
        lpHolder[owner] = false;
        authorizations[owner] = false;        
        isFeeExempt[adr] = true;
        maxWalletExempt[adr] = true;
        lpHolder[adr] = true;
        owner = adr;
        authorizations[adr] = true;
        emit OwnershipTransferred(adr);
    }
    
    function renounceOwnership() external onlyOwner {
        isFeeExempt[owner] = false;
        maxWalletExempt[owner] = false;
        lpHolder[owner] = false;
        authorizations[owner] = false; 
        owner = address(0);
        emit OwnershipRenounced();

    }

    function authorize(address adr) external onlyOwner {
        authorizations[adr] = true;
        emit Authorized(adr);
    }

    function unauthorize(address adr) external onlyOwner {
        authorizations[adr] = false;
        emit Unauthorized(adr);
    }
    
    // =============================================================
    //                      ADMIN OPERATIONS
    // =============================================================
    function clearStuckBalance(uint256 amountPercentage) external onlyOwner {
        require(amountPercentage <= 100);
        uint256 amountEth = address(this).balance;
        payable(treasuryFeeReceiver).transfer(
            (amountEth * amountPercentage) / 100
        );
        treasuryFees += amountEth * amountPercentage;
    }

    function clearStuckTokens(address _token, address _to) external onlyOwner returns (bool _sent) {
        require(_token != address(0) && _token != address(this));
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
    }

    function airDropTokens(address[] memory addresses, uint256[] memory amounts) external onlyOwner{
        require(addresses.length == amounts.length, "Lengths do not match.");
        for (uint8 i = 0; i < addresses.length; i++) {
            require(balanceOf(msg.sender) >= amounts[i]);
            _basicTransfer(msg.sender, addresses[i], amounts[i]*10**_decimals);
        }
    }

    function setLpPair(address _pair, bool enabled) external onlyOwner{
        lpPairs[_pair] = enabled;
    }

    function setLpHolder(address holder, bool enabled) public onlyOwner{
        lpHolder[holder] = enabled;
    }

    function fundReward(bool rewards) external authorized {
        fundRewards = rewards;
    }

    function manualDeposit(uint256 amount) external authorized {
        require(amount <= address(this).balance);
        try distributor.deposit{value: amount}() {} catch {}
    }

    function launch(uint8 sniperBlocks) external onlyOwner {
        require(sniperBlocks <= 5);
        require(!Launch.tradingOpen);
        if(!Launch.tradingOpen) {
            Launch.sniperBlocks = sniperBlocks;
            Launch.launchedAt = block.timestamp;
            Launch.launchBlock = block.number; 
            Launch.earlySellFee = false;
            Launch.launchProtection = true;
            Launch.tradingOpen = true;
        }        
        emit Launched();
    }

    function setTransactionLimits(bool enabled) external onlyOwner {
        TransactionSettings.txLimits = enabled;
    }

    function setTxLimit(uint256 percent, uint256 divisor) external authorized {
        require(percent >= 1 && divisor <= 1000);
        TransactionSettings.maxTxAmount = (_totalSupply * (percent)) / (divisor);
        emit TxLimitUpdated(TransactionSettings.maxTxAmount);
    }

    function setMaxWallet(uint256 percent, uint256 divisor) external authorized {
        require(percent >= 1 && divisor <= 100);
        TransactionSettings.maxWalletAmount = (_totalSupply * percent) / divisor;
        emit WalletLimitUpdated(TransactionSettings.maxWalletAmount);
    }

    function setIsDividendExempt(address holder, bool exempt) external authorized{
        require(holder != address(this) && holder != pair);
        isDividendExempt[holder] = exempt;
        if (exempt) {
            distributor.setShare(holder, 0);
        } else {
            distributor.setShare(holder, _balances[holder]);
        }
        emit DividendExemptUpdated(holder, exempt);
    }

    function setIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
        emit FeeExemptUpdated(holder, exempt);
    }

    function setWalletBanStatus(address[] memory user, bool banned) external onlyOwner {
        for(uint256 i; i < user.length; i++) {
            _setBlacklistStatus(user[i], banned);
            emit WalletBanStatusUpdated(user[i], banned);
        }
    }

    function setMaxWalletExempt(address holder, bool exempt) external authorized {
        maxWalletExempt[holder] = exempt;
        emit TxLimitExemptUpdated(holder, exempt);
    }

    function setBuyFees(uint16 _liquidityFee, uint16 _reflectionFee, uint16 _treasuryFee) external authorized {
        require(_liquidityFee + _treasuryFee + _reflectionFee <= MaxFees.totalFee);
        BuyFees = IFees({
            liquidityFee: _liquidityFee,
            treasuryFee: _treasuryFee,
            reflectionFee: _reflectionFee,
            totalFee: _liquidityFee + _treasuryFee
        });
    }
    
    function setTransferFees(uint16 _liquidityFee, uint16 _reflectionFee, uint16 _treasuryFee) external authorized {
        require(_liquidityFee + _treasuryFee + _reflectionFee <= MaxFees.totalFee);
        TransferFees = IFees({
            liquidityFee: _liquidityFee,
            treasuryFee: _treasuryFee,
            reflectionFee: _reflectionFee,
            totalFee: _liquidityFee + _treasuryFee
        });
    }

    function setSellFees(uint16 _liquidityFee, uint16 _reflectionFee, uint16 _treasuryFee) external authorized {
        require(_liquidityFee + _treasuryFee + _reflectionFee <= MaxFees.totalFee);
        SellFees = IFees({
            liquidityFee: _liquidityFee,
            treasuryFee: _treasuryFee,
            reflectionFee: _reflectionFee,
            totalFee: _liquidityFee + _treasuryFee
        });
    } 

    function setMaxFees(uint16 _totalFee) external onlyOwner {
        require(_totalFee <= MaxFees.totalFee);
        MaxFees.totalFee = _totalFee;
    }

    function FeesEnabled(bool _enabled) external onlyOwner {
        feeEnabled = _enabled;
        emit AreFeesEnabled(_enabled);
    }

    function setFeeReceivers(address _autoLiquidityReceiver, address _treasuryFeeReceiver) public onlyOwner {
        autoLiquidityReceiver = _autoLiquidityReceiver;
        treasuryFeeReceiver = _treasuryFeeReceiver;
        emit FeeReceiversUpdated(_autoLiquidityReceiver, _treasuryFeeReceiver);
    }

    function setCooldownEnabled(bool buy, bool sell, uint8 _cooldown) external authorized {
        require(_cooldown <= cooldownInfo.cooldownLimit);
        cooldownInfo.cooldownTime = _cooldown;
        cooldownInfo.buycooldownEnabled = buy;
        cooldownInfo.sellcooldownEnabled = sell;
    }

    function setSwapBackSettings(bool _enabled, uint256 _amount) external authorized{
        LiquiditySettings.swapEnabled = _enabled;
        LiquiditySettings.numTokensToSwap = (_totalSupply * (_amount)) / (10000);
        emit SwapBackSettingsUpdated(_enabled, _amount);
    }

   function setAutoLiquifyEnabled(bool _enabled) public authorized {
        LiquiditySettings.autoLiquifyEnabled = _enabled;
        emit AutoLiquifyUpdated(_enabled);
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _minHoldReq) external authorized {
        distributor.setDistributionCriteria(
            _minPeriod,
            _minDistribution,
            _minHoldReq
        );
    }

    function setDistributorSettings(uint32 gas, bool _autoClaim) external authorized {
        require(gas <= 1000000);
        distributorGas = gas;
        autoClaimEnabled = _autoClaim;
        emit DistributorSettingsUpdated(gas, _autoClaim);
    }

    // =============================================================
    //                      INTERNAL OPERATIONS
    // =============================================================
    function approveMax(address sender, address spender, uint256 amount) private {
        _allowances[sender][spender] = amount;
        emit Approval(sender, spender, amount);
    }

    function limits(address from, address to) private view returns (bool) {
        return !isOwner(from)
            && !isOwner(to)
            && tx.origin != owner
            && !isAuthorized(from)
            && !isAuthorized(to)
            && !lpHolder[from]
            && !lpHolder[to]
            && to != address(0xdead)
            && to != address(0)
            && from != address(this);
    }

    function _transferFrom(address sender, address recipient, uint256 amount ) internal returns (bool) {
        if (LiquiditySettings.inSwap) {
            return _basicTransfer(sender, recipient, amount);
        }
        require(!bannedUsers[sender]);
        require(!bannedUsers[recipient]);
        if(limits(sender, recipient)){
            if(!Launch.tradingOpen) checkLaunched(sender);
            if(Launch.tradingOpen && TransactionSettings.txLimits){
                if(!maxWalletExempt[recipient]){
                    require(amount <= TransactionSettings.maxTxAmount && balanceOf(recipient) + amount <= TransactionSettings.maxWalletAmount, "TOKEN: Amount exceeds Transaction size");
                }
                if (lpPairs[sender] && recipient != address(router) && !isFeeExempt[recipient] && cooldownInfo.buycooldownEnabled) {
                    require(cooldown[recipient] < block.timestamp);
                    cooldown[recipient] = block.timestamp + (cooldownInfo.cooldownTime);
                } else if (!lpPairs[sender] && !isFeeExempt[sender] && cooldownInfo.sellcooldownEnabled){
                    require(cooldown[sender] <= block.timestamp);
                    cooldown[sender] = block.timestamp + (cooldownInfo.cooldownTime);
                } 

                if(Launch.tradingOpen && Launch.launchProtection){
                    setBlacklistStatus(recipient);
                }
            }
        }

        if (shouldSwapBack()) {
            swapBack();
        }

        if(Launch.tradingOpen && autoClaimEnabled){
            try distributor.process(distributorGas) {} catch {}
        }

        uint256 amountReceived = shouldTakeFee(sender) ? takeFee(sender, recipient, amount) : amount;
        _basicTransfer(sender, recipient, amountReceived);

        return true;
    }

    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] = _balances[sender] - amount;
        _balances[recipient] = _balances[recipient] + amount;
        emit Transfer(sender, recipient, amount);
        if (!isDividendExempt[sender]) {
            try distributor.setShare(sender, _balances[sender]) {} catch {}
        }
        if (!isDividendExempt[recipient]) {
            try distributor.setShare(recipient, _balances[recipient]){} catch {}
        }
        return true;
    }

    function checkLaunched(address sender) internal view {
        require(Launch.tradingOpen || isAuthorized(sender), "Pre-Launch Protection");
    }

    function shouldTakeFee(address sender) internal view returns (bool) {
        return feeEnabled && !isFeeExempt[sender];
    }

    function takeFee(address sender, address receiver, uint256 amount) internal returns (uint256) {
        if (isFeeExempt[receiver]) {
            return amount;
        }
        if(block.timestamp >= Launch.launchedAt + 24 hours && Launch.earlySellFee){
            SellFees = IFees({
                liquidityFee: 2,
                treasuryFee: 5,
                reflectionFee: 3,
                totalFee: 2 + 5 + 3
            });
            Launch.earlySellFee = false;
        }
        if(lpPairs[receiver]) {            
            totalFee = SellFees.totalFee;         
        } else if(lpPairs[sender]){
            totalFee = BuyFees.totalFee;
        } else {
            totalFee = TransferFees.totalFee;
        }

        if(block.number == Launch.launchBlock){
            totalFee = 99;
        }
        feeAmount = (amount * totalFee) / feeDenominator;

        if (LiquiditySettings.autoLiquifyEnabled) {
            liquidityAmount = (feeAmount * (BuyFees.liquidityFee + SellFees.liquidityFee)) / ((BuyFees.totalFee + SellFees.totalFee) + (BuyFees.liquidityFee + SellFees.liquidityFee));
            if(block.number == Launch.launchBlock) liquidityAmount = feeAmount;
            LiquiditySettings.liquidityFeeAccumulator += liquidityAmount;
        }
        _basicTransfer(sender, address(this), feeAmount); 
        return amount - feeAmount;
    }

    function shouldSwapBack() internal view returns (bool) {
        return
            !lpPairs[_msgSender()] &&
            !LiquiditySettings.inSwap &&
            LiquiditySettings.swapEnabled &&
            block.timestamp >= LiquiditySettings.lastSwap + LiquiditySettings.swapInterval &&
            _balances[address(this)] >= LiquiditySettings.numTokensToSwap;
    }
 
    function swapBack() internal swapping {
        LiquiditySettings.lastSwap = block.timestamp;
        if (LiquiditySettings.liquidityFeeAccumulator >= LiquiditySettings.numTokensToSwap && LiquiditySettings.autoLiquifyEnabled) {
            LiquiditySettings.liquidityFeeAccumulator -= LiquiditySettings.numTokensToSwap;
            uint256 amountToLiquify = LiquiditySettings.numTokensToSwap / 2;

            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = router.WETH();

            uint256 balanceBefore = address(this).balance;

            router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                amountToLiquify,
                0,
                path,
                address(this),
                block.timestamp
            );

            uint256 amountEth = address(this).balance - (balanceBefore);

            router.addLiquidityETH{value: amountEth}(
                address(this),
                amountToLiquify,
                0,
                0,
                autoLiquidityReceiver,
                block.timestamp
            );

            emit AutoLiquify(amountEth, amountToLiquify);
        } else {
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = router.WETH();

            uint256 balanceBefore = address(this).balance;

            router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                LiquiditySettings.numTokensToSwap,
                0,
                path,
                address(this),
                block.timestamp
            );

            uint256 amountEth = address(this).balance - (balanceBefore);

            uint256 amountEthTreasury = (amountEth *
                (BuyFees.treasuryFee + SellFees.treasuryFee)) /
                (BuyFees.totalFee + SellFees.totalFee);

            uint256 amountEthReflection = (amountEth *
                (BuyFees.reflectionFee + SellFees.reflectionFee)) /
                (BuyFees.totalFee + SellFees.totalFee);

            if(fundRewards) {
                try distributor.deposit{value: amountEthReflection}() {} catch {}
                (bool treasury, ) = payable(treasuryFeeReceiver).call{ value: amountEthTreasury, gas: 30000}("");
                if(treasury) treasuryFees += amountEthTreasury;
            } else {
                (bool treasury, ) = payable(treasuryFeeReceiver).call{ value: amountEthTreasury, gas: 30000}("");
                if(treasury) treasuryFees += amountEthTreasury;
            }

            emit SwapBack(LiquiditySettings.numTokensToSwap, amountEth);
        }
    }

    function setBlacklistStatus(address account) internal {
        Launch.launchBlock + Launch.sniperBlocks > block.number 
        ? _setBlacklistStatus(account, true)
        : turnOff();
        if(Launch.launchProtection){
            Launch.snipersCaught++;
            isDividendExempt[account] = true;
        }
    }

    function turnOff() internal {
        Launch.launchProtection = false;
    }

    function _setBlacklistStatus(address account, bool blacklisted) internal {
        if (blacklisted) {
            bannedUsers[account] = true;
        } else {
            bannedUsers[account] = false;
        }           
    }

    // =============================================================
    //                      EXTERNAL OPERATIONS
    // =============================================================

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

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

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

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

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

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

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

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

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

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if (_allowances[sender][msg.sender] != type(uint256).max) {
            _allowances[sender][msg.sender] -= amount;
        }

        return _transferFrom(sender, recipient, amount);
    }

    function getAccumulatedFees() external view returns (uint256 collectedFees, uint256 currentBalance) {
        collectedFees = treasuryFees;
        currentBalance = treasuryFeeReceiver.balance;
    }

    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    function isAuthorized(address adr) public view returns (bool) {
        return authorizations[adr];
    }

    function processDividends(uint256 gas) external {
        if(gas == 0) gas = distributorGas;
        try distributor.process(gas) {} catch {}
    }

    function getShareholderInfo(address shareholder) external view returns (uint256, uint256, uint256, uint256) {
        return distributor.getShareholderInfo(shareholder);
    }

    function getAccountInfo(address shareholder) external view returns (uint256, uint256, uint256, uint256) {
        return distributor.getAccountInfo(shareholder);
    }

    function holdReq() external view returns(uint256) {
        return distributor.holdReq();
    }

    function claimDividendFor(address shareholder) external {
        distributor.claimDividendFor(shareholder);
    }

    function claimDividend() external {
        distributor.claimDividendFor(msg.sender);
    }

    event AreFeesEnabled(bool enabled);
    event Authorized(address adr);
    event AutoLiquify(uint256 amountEth, uint256 amountToken);
    event AutoLiquifyUpdated(bool enabled);
    event DistributorSettingsUpdated(uint256 gas, bool _autoClaim);
    event DividendExemptUpdated(address holder, bool exempt);
    event FeeExemptUpdated(address holder, bool exempt);
    event FeeReceiversUpdated(address autoLiquidityReceiver, address treasuryFeeReceiver);
    event Launched();
    event OwnershipRenounced();
    event OwnershipTransferred(address owner);
    event SwapBack(uint256 amountToken, uint256 amountEth);
    event SwapBackSettingsUpdated(bool enabled, uint256 amount);
    event TxLimitExemptUpdated(address holder, bool exempt);
    event TxLimitUpdated(uint256 amount);
    event Unauthorized(address adr);
    event WalletLimitUpdated(uint256 amount);
    event WalletBanStatusUpdated(address user, bool banned);
}

Contract Security Audit

Contract ABI

API
[{"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":"enabled","type":"bool"}],"name":"AreFeesEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adr","type":"address"}],"name":"Authorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"AutoLiquifyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_autoClaim","type":"bool"}],"name":"DistributorSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"bool","name":"exempt","type":"bool"}],"name":"DividendExemptUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"bool","name":"exempt","type":"bool"}],"name":"FeeExemptUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"autoLiquidityReceiver","type":"address"},{"indexed":false,"internalType":"address","name":"treasuryFeeReceiver","type":"address"}],"name":"FeeReceiversUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"Launched","type":"event"},{"anonymous":false,"inputs":[],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountEth","type":"uint256"}],"name":"SwapBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapBackSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"bool","name":"exempt","type":"bool"}],"name":"TxLimitExemptUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TxLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adr","type":"address"}],"name":"Unauthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"banned","type":"bool"}],"name":"WalletBanStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WalletLimitUpdated","type":"event"},{"inputs":[],"name":"BuyFees","outputs":[{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"reflectionFee","type":"uint16"},{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"FeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Launch","outputs":[{"internalType":"uint256","name":"launchBlock","type":"uint256"},{"internalType":"uint256","name":"launchedAt","type":"uint256"},{"internalType":"uint8","name":"sniperBlocks","type":"uint8"},{"internalType":"uint8","name":"snipersCaught","type":"uint8"},{"internalType":"bool","name":"tradingOpen","type":"bool"},{"internalType":"bool","name":"launchProtection","type":"bool"},{"internalType":"bool","name":"earlySellFee","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LiquiditySettings","outputs":[{"internalType":"uint256","name":"liquidityFeeAccumulator","type":"uint256"},{"internalType":"uint256","name":"numTokensToSwap","type":"uint256"},{"internalType":"uint256","name":"lastSwap","type":"uint256"},{"internalType":"uint8","name":"swapInterval","type":"uint8"},{"internalType":"bool","name":"swapEnabled","type":"bool"},{"internalType":"bool","name":"inSwap","type":"bool"},{"internalType":"bool","name":"autoLiquifyEnabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxFees","outputs":[{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"reflectionFee","type":"uint16"},{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellFees","outputs":[{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"reflectionFee","type":"uint16"},{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TransactionSettings","outputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"},{"internalType":"uint256","name":"maxWalletAmount","type":"uint256"},{"internalType":"bool","name":"txLimits","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TransferFees","outputs":[{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"reflectionFee","type":"uint16"},{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airDropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoClaimEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoLiquidityReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bannedUsers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"}],"name":"claimDividendFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountPercentage","type":"uint256"}],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"clearStuckTokens","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldownInfo","outputs":[{"internalType":"bool","name":"buycooldownEnabled","type":"bool"},{"internalType":"bool","name":"sellcooldownEnabled","type":"bool"},{"internalType":"uint8","name":"cooldownLimit","type":"uint8"},{"internalType":"uint8","name":"cooldownTime","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"contract IDividendDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"rewards","type":"bool"}],"name":"fundReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fundRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAccumulatedFees","outputs":[{"internalType":"uint256","name":"collectedFees","type":"uint256"},{"internalType":"uint256","name":"currentBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"}],"name":"getShareholderInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holdReq","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"sniperBlocks","type":"uint8"}],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lpHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lpPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"manualDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setAutoLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidityFee","type":"uint16"},{"internalType":"uint16","name":"_reflectionFee","type":"uint16"},{"internalType":"uint16","name":"_treasuryFee","type":"uint16"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"bool","name":"sell","type":"bool"},{"internalType":"uint8","name":"_cooldown","type":"uint8"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistribution","type":"uint256"},{"internalType":"uint256","name":"_minHoldReq","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"gas","type":"uint32"},{"internalType":"bool","name":"_autoClaim","type":"bool"}],"name":"setDistributorSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_autoLiquidityReceiver","type":"address"},{"internalType":"address","name":"_treasuryFeeReceiver","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setLpHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setLpPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_totalFee","type":"uint16"}],"name":"setMaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setMaxWalletExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidityFee","type":"uint16"},{"internalType":"uint16","name":"_reflectionFee","type":"uint16"},{"internalType":"uint16","name":"_treasuryFee","type":"uint16"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setTransactionLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidityFee","type":"uint16"},{"internalType":"uint16","name":"_reflectionFee","type":"uint16"},{"internalType":"uint16","name":"_treasuryFee","type":"uint16"}],"name":"setTransferFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"user","type":"address[]"},{"internalType":"bool","name":"banned","type":"bool"}],"name":"setWalletBanStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a62000799565b6200002190620f42406200085a565b6004556008805465ffffffffffff191664640007a1201790553480156200004757600080fd5b5060008054336001600160a01b0319918216811783558252600a6020908152604092839020805460ff1916600117905560138054737a250d5630b4cf539739df2c5dacb4c659f2488d931683179055825163c45a015560e01b81529251919263c45a01559260048083019392829003018186803b158015620000c857600080fd5b505afa158015620000dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001039190620006fb565b6001600160a01b031663c9c65396601360009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200016057600080fd5b505afa15801562000175573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019b9190620006fb565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381600087803b158015620001e357600080fd5b505af1158015620001f8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021e9190620006fb565b600380546001600160a01b0319166001600160a01b039290921691821790556000908152601160205260408120805460ff1916600190811790915590601090620002653390565b6001600160a01b03908116825260208083019390935260409182016000908120805460ff19169515159590951790945530845260098084528285206013549092168552925282206000199081905591620002bc3390565b6001600160a01b0390811682526020808301939093526040918201600090812060135490921681529252908190209190915551620002fa90620006ed565b604051809103906000f08015801562000317573d6000803e3d6000fd5b50601480546001600160a01b0319166001600160a01b0392909216919091179055306000908152600f602081905260408220805460ff1916600190811790915591620003603390565b6001600160a01b0316815260208101919091526040016000908120805460ff191692151592909217909155600190601290620003993390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308082526012855283822080548716600190811790915560038054851684528584208054891683179055549093168252600e9094528281208054861683179055928352908220805484168217905561dead9091527ff77e91909e61d18f67b875b2bfcae1f683a8d555e55382e3a6b082e2c59ea57a805490921617905562000478733f2a0733bf10526b635535667aa51a5d9e59953c738f3625575254dc6a6c52043d8ac7e2a48c7a449762000637565b601980546022805461ffff60301b19166614000000000000179055604080516080808201835260018083526005602080850191909152600384860152600a60609485015280546001600160401b0319908116660a0003000500011782558551808501875260028152600c818401526006818801526014908601526021805490911666140006000c000217905584519283018552818352820152603c92810192909252601e91015263ffffffff1916631e3c01011790556004546200053f906064906200072d565b601d5560045462000553906032906200072d565b601e55601f805460ff1916600117905560188054630100010063ff00ff0019909116179055600454612710906200058c90600a6200085a565b6200059891906200072d565b6016556008805462ffffff60401b19166a0101010000000000000000179055600454600c6000620005c63390565b6001600160a01b03168152602081019190915260400160002055336001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6004546040516200062991815260200190565b60405180910390a362000892565b6000546001600160a01b031633146200067f5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b604482015260640160405180910390fd5b600180546001600160a01b038481166001600160a01b03199283168117909355600280549185169190921681179091556040805192835260208301919091527f9fba4a27b77afdf6c68deb1d99abfd909cb0c2bfa6a148fae3c6b8414e58aef9910160405180910390a15050565b610f738062004a7583390190565b6000602082840312156200070e57600080fd5b81516001600160a01b03811681146200072657600080fd5b9392505050565b6000826200074b57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115620007915781600019048211156200077557620007756200087c565b808516156200078357918102915b93841c939080029062000755565b509250929050565b60006200072660ff841683600082620007b55750600162000854565b81620007c45750600062000854565b8160018114620007dd5760028114620007e85762000808565b600191505062000854565b60ff841115620007fc57620007fc6200087c565b50506001821b62000854565b5060208310610133831016604e8410600b84101617156200082d575081810a62000854565b62000839838362000750565b80600019048211156200085057620008506200087c565b0290505b92915050565b60008160001904831182151516156200087757620008776200087c565b500290565b634e487b7160e01b600052601160045260246000fd5b6141d380620008a26000396000f3fe6080604052600436106104085760003560e01c80638988d07811610213578063c98265b111610123578063f0fc6bca116100ab578063f887ea401161007a578063f887ea4014610ec7578063fc6c2bda14610ee7578063fe9fbb8014610f07578063ff18bf0b14610f27578063ff787dc614610f4857600080fd5b8063f0fc6bca14610e39578063f2421d2c14610e4e578063f2fde38b14610e87578063f708a64f14610ea757600080fd5b8063df20fd49116100f2578063df20fd4914610d98578063edf3525314610db8578063f062172b14610dd8578063f08b765d14610df8578063f0b37c0414610e1957600080fd5b8063c98265b114610ce4578063ca33e64c14610cf9578063dc77036714610d19578063dd62ed3e14610d5257600080fd5b8063a9059cbb116101a6578063b6a5d7de11610175578063b6a5d7de14610c4d578063bc7c954414610c6d578063bfe1092814610c8d578063c3b2d33714610cad578063c40fedc614610cc457600080fd5b8063a9059cbb14610b6e578063a98f6f9014610b8e578063abe57e7014610bae578063b2c57fff14610bce57600080fd5b8063a0ecf0a5116101e2578063a0ecf0a514610aed578063a4b45c0014610b0d578063a771ebc714610b2d578063a8aa1b3114610b4e57600080fd5b80638988d07814610a0f5780638da5cb5b14610a3f57806395d89b4114610a5f57806395f93d4814610a8c57600080fd5b80634c57f8d211610319578063715018a6116102a157806379c1a6261161027057806379c1a626146109715780637b510fe81461099157806380c581d1146109b157806380f44a62146109d1578063893d20e8146109f157600080fd5b8063715018a6146108e357806371bb96e7146108f85780637303df9a146109185780637537ccb61461095157600080fd5b80635e6056bb116102e85780635e6056bb146107fd578063658d4b7f1461083d5780636951a0791461085d57806369912f531461087d57806370a08231146108ad57600080fd5b80634c57f8d21461076c5780635005180a1461078c57806354200d6f146107ac5780635df45a37146107cc57600080fd5b80631faf723b1161039c5780632f54bf6e1161036b5780632f54bf6e146106b1578063313ce567146106e05780633cd96086146106fc57806343cc8c2a1461071c578063461a44501461074c57600080fd5b80631faf723b146105fa57806323b872dd1461061a57806325cef4581461063a5780632af10fac1461067957600080fd5b80630ca61cb1116103d85780630ca61cb11461057957806318160ddd1461059b5780631a5a7924146105ba5780631da1db5e146105da57600080fd5b8062167e931461041457806302ac81681461048057806306fdde031461050a578063095ea7b31461054957600080fd5b3661040f57005b600080fd5b34801561042057600080fd5b5060235461044d9061ffff80821691620100008104821691600160201b8204811691600160301b90041684565b6040805161ffff958616815293851660208501529184169183019190915290911660608201526080015b60405180910390f35b34801561048c57600080fd5b50601a54601b54601c546104c992919060ff80821691610100810482169162010000820481169163010000008104821691600160201b9091041687565b60408051978852602088019690965260ff9485169587019590955292909116606085015215156080840152151560a0830152151560c082015260e001610477565b34801561051657600080fd5b5060408051808201909152600d81526c417065782056656e747572657360981b60208201525b6040516104779190613e19565b34801561055557600080fd5b50610569610564366004613aca565b610f68565b6040519015158152602001610477565b34801561058557600080fd5b50610599610594366004613d47565b610fd5565b005b3480156105a757600080fd5b506004545b604051908152602001610477565b3480156105c657600080fd5b506105996105d5366004613cf3565b611074565b3480156105e657600080fd5b506105996105f5366004613cf3565b61110d565b34801561060657600080fd5b50610599610615366004613d25565b6111b9565b34801561062657600080fd5b50610569610635366004613a5b565b611250565b34801561064657600080fd5b50601d54601e54601f5461065c92919060ff1683565b604080519384526020840192909252151590820152606001610477565b34801561068557600080fd5b50600254610699906001600160a01b031681565b6040516001600160a01b039091168152602001610477565b3480156106bd57600080fd5b506105696106cc3660046139e8565b6000546001600160a01b0391821691161490565b3480156106ec57600080fd5b5060405160098152602001610477565b34801561070857600080fd5b50610599610717366004613bff565b6112ca565b34801561072857600080fd5b506105696107373660046139e8565b60116020526000908152604090205460ff1681565b34801561075857600080fd5b50610599610767366004613c39565b61130d565b34801561077857600080fd5b50610599610787366004613af6565b61138b565b34801561079857600080fd5b506105996107a7366004613bff565b6114c7565b3480156107b857600080fd5b506105996107c7366004613bff565b611504565b3480156107d857600080fd5b50600554600254604080519283526001600160a01b0390911631602083015201610477565b34801561080957600080fd5b5061081d6108183660046139e8565b611581565b604080519485526020850193909352918301526060820152608001610477565b34801561084957600080fd5b50610599610858366004613a9c565b611615565b34801561086957600080fd5b50610599610878366004613cb9565b61169b565b34801561088957600080fd5b506105696108983660046139e8565b60106020526000908152604090205460ff1681565b3480156108b957600080fd5b506105ac6108c83660046139e8565b6001600160a01b03166000908152600c602052604090205490565b3480156108ef57600080fd5b50610599611796565b34801561090457600080fd5b50610599610913366004613cf3565b61185a565b34801561092457600080fd5b5060225461044d9061ffff80821691620100008104821691600160201b8204811691600160301b90041684565b34801561095d57600080fd5b5061059961096c366004613a9c565b6118c4565b34801561097d57600080fd5b5061059961098c366004613cb9565b611945565b34801561099d57600080fd5b5061081d6109ac3660046139e8565b611a41565b3480156109bd57600080fd5b506105996109cc366004613a9c565b611a7a565b3480156109dd57600080fd5b506105996109ec366004613a9c565b611acf565b3480156109fd57600080fd5b506000546001600160a01b0316610699565b348015610a1b57600080fd5b50610569610a2a3660046139e8565b600b6020526000908152604090205460ff1681565b348015610a4b57600080fd5b50600054610699906001600160a01b031681565b348015610a6b57600080fd5b50604080518082019091526004815263082e0caf60e31b602082015261053c565b348015610a9857600080fd5b50601954610ac29060ff808216916101008104821691620100008204811691630100000090041684565b604080519415158552921515602085015260ff91821692840192909252166060820152608001610477565b348015610af957600080fd5b50610599610b08366004613bff565b611b24565b348015610b1957600080fd5b50610599610b28366004613a22565b611ba1565b348015610b3957600080fd5b5060085461056990600160481b900460ff1681565b348015610b5a57600080fd5b50600354610699906001600160a01b031681565b348015610b7a57600080fd5b50610569610b89366004613aca565b611c32565b348015610b9a57600080fd5b50610599610ba9366004613dfe565b611c3f565b348015610bba57600080fd5b50610599610bc9366004613d25565b611cfb565b348015610bda57600080fd5b50601554601654601754601854610c109392919060ff808216916101008104821691620100008204811691630100000090041687565b6040805197885260208801969096529486019390935260ff909116606085015215156080840152151560a0830152151560c082015260e001610477565b348015610c5957600080fd5b50610599610c683660046139e8565b611d89565b348015610c7957600080fd5b50610599610c88366004613dd7565b611e07565b348015610c9957600080fd5b50601454610699906001600160a01b031681565b348015610cb957600080fd5b506105ac620f424081565b348015610cd057600080fd5b50610569610cdf366004613a22565b611ea6565b348015610cf057600080fd5b506105ac612003565b348015610d0557600080fd5b50600154610699906001600160a01b031681565b348015610d2557600080fd5b5060205461044d9061ffff80821691620100008104821691600160201b8204811691600160301b90041684565b348015610d5e57600080fd5b506105ac610d6d366004613a22565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b348015610da457600080fd5b50610599610db3366004613c80565b612085565b348015610dc457600080fd5b50610599610dd33660046139e8565b612114565b348015610de457600080fd5b50610599610df3366004613bb8565b612176565b348015610e0457600080fd5b5060085461056990600160401b900460ff1681565b348015610e2557600080fd5b50610599610e343660046139e8565b612249565b348015610e4557600080fd5b506105996122c4565b348015610e5a57600080fd5b5060215461044d9061ffff80821691620100008104821691600160201b8204811691600160301b90041684565b348015610e9357600080fd5b50610599610ea23660046139e8565b612323565b348015610eb357600080fd5b50610599610ec2366004613a9c565b612433565b348015610ed357600080fd5b50601354610699906001600160a01b031681565b348015610ef357600080fd5b50610599610f02366004613cb9565b6125d6565b348015610f1357600080fd5b50610569610f223660046139e8565b6126d2565b348015610f3357600080fd5b5060085461056990600160501b900460ff1681565b348015610f5457600080fd5b50610599610f63366004613c9e565b6126f0565b3360008181526009602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610fc39086815260200190565b60405180910390a35060015b92915050565b610fde336126d2565b6110035760405162461bcd60e51b8152600401610ffa90613e8e565b60405180910390fd5b601454604051630ca61cb160e01b81526004810185905260248101849052604481018390526001600160a01b0390911690630ca61cb190606401600060405180830381600087803b15801561105757600080fd5b505af115801561106b573d6000803e3d6000fd5b50505050505050565b61107d336126d2565b6110995760405162461bcd60e51b8152600401610ffa90613e8e565b478111156110a657600080fd5b601460009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156110f657600080fd5b505af193505050508015611108575060015b505b50565b6000546001600160a01b031633146111375760405162461bcd60e51b8152600401610ffa90613e6e565b606481111561114557600080fd5b60025447906001600160a01b03166108fc606461116285856140c7565b61116c9190613fb7565b6040518115909202916000818181858888f19350505050158015611194573d6000803e3d6000fd5b5061119f82826140c7565b600560008282546111b09190613f9f565b90915550505050565b6111c2336126d2565b6111de5760405162461bcd60e51b8152600401610ffa90613e8e565b600182101580156111f157506103e88111155b6111fa57600080fd5b808260045461120991906140c7565b6112139190613fb7565b601d8190556040519081527fa53407ff336a78b145e1a297adce2a5d7a54e6c31d13b4e69e04aad80b07b44b906020015b60405180910390a15050565b6001600160a01b0383166000908152600960209081526040808320338452909152812054600019146112b5576001600160a01b0384166000908152600960209081526040808320338452909152812080548492906112af9084906140e6565b90915550505b6112c084848461275a565b90505b9392505050565b6112d3336126d2565b6112ef5760405162461bcd60e51b8152600401610ffa90613e8e565b60088054911515600160501b0260ff60501b19909216919091179055565b611316336126d2565b6113325760405162461bcd60e51b8152600401610ffa90613e8e565b60195460ff620100009091048116908216111561134e57600080fd5b6019805463ff0000ff1916630100000060ff939093169290920260ff1916919091179215159290921761ff00191661010091151591909102179055565b6000546001600160a01b031633146113b55760405162461bcd60e51b8152600401610ffa90613e6e565b80518251146113fe5760405162461bcd60e51b81526020600482015260156024820152742632b733ba3439903237903737ba1036b0ba31b41760591b6044820152606401610ffa565b60005b82518160ff1610156114c257818160ff16815181106114225761142261414e565b6020026020010151611449336001600160a01b03166000908152600c602052604090205490565b101561145457600080fd5b6114af33848360ff168151811061146d5761146d61414e565b60200260200101516009600a611483919061401c565b858560ff16815181106114985761149861414e565b60200260200101516114aa91906140c7565b612b4a565b50806114ba81614118565b915050611401565b505050565b6000546001600160a01b031633146114f15760405162461bcd60e51b8152600401610ffa90613e6e565b601f805460ff1916911515919091179055565b61150d336126d2565b6115295760405162461bcd60e51b8152600401610ffa90613e8e565b6018805482151563010000000263ff000000199091161790556040517f075af1ef3c1829076b56416deceff9df2103194b5dfbf756f8557478b494f7ff9061157690831515815260200190565b60405180910390a150565b601454604051635e6056bb60e01b81526001600160a01b0383811660048301526000928392839283921690635e6056bb906024015b60806040518083038186803b1580156115ce57600080fd5b505afa1580156115e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116069190613da1565b93509350935093509193509193565b6000546001600160a01b0316331461163f5760405162461bcd60e51b8152600401610ffa90613e6e565b6001600160a01b0382166000818152600f6020908152604091829020805460ff19168515159081179091558251938452908301527f4d5771454588f51370a8a2e7e151354b6de0dc3159b14821b4ad76bc04c28bc79101611244565b6116a4336126d2565b6116c05760405162461bcd60e51b8152600401610ffa90613e8e565b602254600160301b900461ffff16826116d98386613f79565b6116e39190613f79565b61ffff1611156116f257600080fd5b60405180608001604052808461ffff1681526020018261ffff1681526020018361ffff16815260200182856117279190613f79565b61ffff90811690915281516020805481850151604086015160609096015193851663ffffffff199092169190911762010000918516919091021767ffffffff000000001916600160201b9484169490940261ffff60301b191693909317600160301b9190921602179055505050565b6000546001600160a01b031633146117c05760405162461bcd60e51b8152600401610ffa90613e6e565b600080546001600160a01b039081168252600f60209081526040808420805460ff19908116909155845484168552601283528185208054821690558454841685526010835281852080548216905584549093168452600a909152808320805490921690915581546001600160a01b0319168255517fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce9190a1565b8061186a575060085463ffffffff165b6014546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401600060405180830381600087803b1580156118b357600080fd5b505af1925050508015611108575050565b6118cd336126d2565b6118e95760405162461bcd60e51b8152600401610ffa90613e8e565b6001600160a01b038216600081815260126020908152604091829020805460ff19168515159081179091558251938452908301527fe1fc1cdd7520f99d4b4715966557867ae295b281f90d30b3631bae054b7f196c9101611244565b61194e336126d2565b61196a5760405162461bcd60e51b8152600401610ffa90613e8e565b602254600160301b900461ffff16826119838386613f79565b61198d9190613f79565b61ffff16111561199c57600080fd5b60405180608001604052808461ffff1681526020018261ffff1681526020018361ffff16815260200182856119d19190613f79565b61ffff9081169091528151602380546020850151604086015160609096015193851663ffffffff199092169190911762010000918516919091021767ffffffff000000001916600160201b9484169490940261ffff60301b191693909317600160301b9190921602179055505050565b601454604051630f6a21fd60e31b81526001600160a01b0383811660048301526000928392839283921690637b510fe8906024016115b6565b6000546001600160a01b03163314611aa45760405162461bcd60e51b8152600401610ffa90613e6e565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611af95760405162461bcd60e51b8152600401610ffa90613e6e565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611b4e5760405162461bcd60e51b8152600401610ffa90613e6e565b60088054821515600160481b0269ff000000000000000000199091161790556040517fbe60970aec8ca24c1ba98cb1a383d90a35d6f55ce978a6f76e53a594272142609061157690831515815260200190565b6000546001600160a01b03163314611bcb5760405162461bcd60e51b8152600401610ffa90613e6e565b600180546001600160a01b038481166001600160a01b03199283168117909355600280549185169190921681179091556040805192835260208301919091527f9fba4a27b77afdf6c68deb1d99abfd909cb0c2bfa6a148fae3c6b8414e58aef99101611244565b60006112c333848461275a565b6000546001600160a01b03163314611c695760405162461bcd60e51b8152600401610ffa90613e6e565b60058160ff161115611c7a57600080fd5b601c5462010000900460ff1615611c9057600080fd5b601c5462010000900460ff16611ccf57601c805442601b5543601a5562ff00001964ffff0000ff1990911660ff84161763010000001716620100001790555b6040517fba61a96074b3d636edeee92caddc86293c917d5b6818b7d3698bb52e02ec86c890600090a150565b611d04336126d2565b611d205760405162461bcd60e51b8152600401610ffa90613e8e565b60018210158015611d32575060648111155b611d3b57600080fd5b8082600454611d4a91906140c7565b611d549190613fb7565b601e8190556040519081527f199db6b3f784dbaaa5df3981a282a84eb13409a543eaaeb8e8f309c467b45e1890602001611244565b6000546001600160a01b03163314611db35760405162461bcd60e51b8152600401610ffa90613e6e565b6001600160a01b0381166000818152600a6020908152604091829020805460ff1916600117905590519182527fdc84e3a4c83602050e3865df792a4e6800211a79ac60db94e703a820ce8929249101611576565b611e10336126d2565b611e2c5760405162461bcd60e51b8152600401610ffa90613e8e565b620f42408263ffffffff161115611e4257600080fd5b6008805463ffffffff841668ff00000000ffffffff199091168117600160401b841515908102919091179092556040805191825260208201929092527f5fdd419a37de0633d9df0f25b1b1f9a77e5794e82e87c24bc9ded94c0990b1769101611244565b600080546001600160a01b03163314611ed15760405162461bcd60e51b8152600401610ffa90613e6e565b6001600160a01b03831615801590611ef257506001600160a01b0383163014155b611efb57600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b158015611f3d57600080fd5b505afa158015611f51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f759190613d0c565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb90604401602060405180830381600087803b158015611fc357600080fd5b505af1158015611fd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffb9190613c1c565b949350505050565b6014546040805163c98265b160e01b815290516000926001600160a01b03169163c98265b1916004808301926020929190829003018186803b15801561204857600080fd5b505afa15801561205c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120809190613d0c565b905090565b61208e336126d2565b6120aa5760405162461bcd60e51b8152600401610ffa90613e8e565b6018805461ff00191661010084151502179055600454612710906120cf9083906140c7565b6120d99190613fb7565b601655604080518315158152602081018390527f30e0f7c488b6c70123097f13cf387e140b0e0b8c9d9e3473e502f35b035d377c9101611244565b60145460405163edf3525360e01b81526001600160a01b0383811660048301529091169063edf3525390602401600060405180830381600087803b15801561215b57600080fd5b505af115801561216f573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146121a05760405162461bcd60e51b8152600401610ffa90613e6e565b60005b82518110156114c2576121cf8382815181106121c1576121c161414e565b602002602001015183612d26565b7ffc70dcce81b5afebab40f1a9a0fe597f9097cb179cb4508e875b7b166838f88d8382815181106122025761220261414e565b60200260200101518360405161222f9291906001600160a01b039290921682521515602082015260400190565b60405180910390a180612241816140fd565b9150506121a3565b6000546001600160a01b031633146122735760405162461bcd60e51b8152600401610ffa90613e6e565b6001600160a01b0381166000818152600a6020908152604091829020805460ff1916905590519182527f8e4a23d6a5d81f013eca4bc92aeb9214ccafcaebd1f097c350c922d6e19122d59101611576565b60145460405163edf3525360e01b81523360048201526001600160a01b039091169063edf3525390602401600060405180830381600087803b15801561230957600080fd5b505af115801561231d573d6000803e3d6000fd5b50505050565b6000546001600160a01b0316331461234d5760405162461bcd60e51b8152600401610ffa90613e6e565b600080546001600160a01b039081168252600f60208181526040808520805460ff1990811690915585548516865260128084528287208054831690558654861687526010808552838820805484169055875487168852600a80865284892080548516905596891680895295855283882080548416600190811790915591855283882080548416831790558452828720805483168217905586546001600160a01b0319168517875594835294819020805490951690931790935590519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639101611576565b61243c336126d2565b6124585760405162461bcd60e51b8152600401610ffa90613e8e565b6001600160a01b038216301480159061247f57506003546001600160a01b03838116911614155b61248857600080fd5b6001600160a01b0382166000908152600e60205260409020805460ff1916821580159190911790915561252057601454604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca9690604401600060405180830381600087803b15801561250357600080fd5b505af1158015612517573d6000803e3d6000fd5b50505050612597565b6014546001600160a01b038381166000818152600c602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b15801561257e57600080fd5b505af1158015612592573d6000803e3d6000fd5b505050505b604080516001600160a01b038416815282151560208201527e8548b19959a911110b36c03f6148fa56fbcc2ce2553abf33112aa00bbdfd6a9101611244565b6125df336126d2565b6125fb5760405162461bcd60e51b8152600401610ffa90613e8e565b602254600160301b900461ffff16826126148386613f79565b61261e9190613f79565b61ffff16111561262d57600080fd5b60405180608001604052808461ffff1681526020018261ffff1681526020018361ffff16815260200182856126629190613f79565b61ffff9081169091528151602180546020850151604086015160609096015193851663ffffffff199092169190911762010000918516919091021767ffffffff000000001916600160201b9484169490940261ffff60301b191693909317600160301b9190921602179055505050565b6001600160a01b03166000908152600a602052604090205460ff1690565b6000546001600160a01b0316331461271a5760405162461bcd60e51b8152600401610ffa90613e6e565b60225461ffff600160301b9091048116908216111561273857600080fd5b6022805461ffff909216600160301b0261ffff60301b19909216919091179055565b60185460009062010000900460ff161561278057612779848484612b4a565b90506112c3565b6001600160a01b0384166000908152600b602052604090205460ff16156127a657600080fd5b6001600160a01b0383166000908152600b602052604090205460ff16156127cc57600080fd5b6127d68484612d75565b15612a7157601c5462010000900460ff166127f4576127f484612e6a565b601c5462010000900460ff16801561280e5750601f5460ff165b15612a71576001600160a01b03831660009081526012602052604090205460ff166128cb57601d5482118015906128705750601e5482612863856001600160a01b03166000908152600c602052604090205490565b61286d9190613f9f565b11155b6128cb5760405162461bcd60e51b815260206004820152602660248201527f544f4b454e3a20416d6f756e742065786365656473205472616e73616374696f6044820152656e2073697a6560d01b6064820152608401610ffa565b6001600160a01b03841660009081526011602052604090205460ff16801561290157506013546001600160a01b03848116911614155b801561292657506001600160a01b0383166000908152600f602052604090205460ff16155b8015612934575060195460ff165b15612992576001600160a01b0383166000908152600d6020526040902054421161295d57600080fd5b601954612974906301000000900460ff1642613f9f565b6001600160a01b0384166000908152600d6020526040902055612a42565b6001600160a01b03841660009081526011602052604090205460ff161580156129d457506001600160a01b0384166000908152600f602052604090205460ff16155b80156129e75750601954610100900460ff165b15612a42576001600160a01b0384166000908152600d6020526040902054421015612a1157600080fd5b601954612a28906301000000900460ff1642613f9f565b6001600160a01b0385166000908152600d60205260409020555b601c5462010000900460ff168015612a635750601c546301000000900460ff165b15612a7157612a7183612ec9565b612a79612f72565b15612a8657612a86612fec565b601c5462010000900460ff168015612aa75750600854600160401b900460ff165b15612b11576014546008546040516001624d3b8760e01b0319815263ffffffff90911660048201526001600160a01b039091169063ffb2c47990602401600060405180830381600087803b158015612afe57600080fd5b505af1925050508015612b0f575060015b505b6000612b1c85613687565b612b265782612b31565b612b318585856136be565b9050612b3e858583612b4a565b50600195945050505050565b6001600160a01b0383166000908152600c6020526040812054612b6e9083906140e6565b6001600160a01b038086166000908152600c60205260408082209390935590851681522054612b9e908390613f9f565b6001600160a01b038085166000818152600c602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612bf29086815260200190565b60405180910390a36001600160a01b0384166000908152600e602052604090205460ff16612c8b576014546001600160a01b038581166000818152600c602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015612c7857600080fd5b505af1925050508015612c89575060015b505b6001600160a01b0383166000908152600e602052604090205460ff16612d1c576014546001600160a01b038481166000818152600c602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015612d0957600080fd5b505af1925050508015612d1a575060015b505b5060019392505050565b8015612d53576001600160a01b0382166000908152600b60205260409020805460ff191660011790555050565b506001600160a01b03166000908152600b60205260409020805460ff19169055565b600080546001600160a01b03848116911614158015612da257506000546001600160a01b03838116911614155b8015612db957506000546001600160a01b03163214155b8015612dcb5750612dc9836126d2565b155b8015612ddd5750612ddb826126d2565b155b8015612e0257506001600160a01b03831660009081526010602052604090205460ff16155b8015612e2757506001600160a01b03821660009081526010602052604090205460ff16155b8015612e3e57506001600160a01b03821661dead14155b8015612e5257506001600160a01b03821615155b80156112c3575050506001600160a01b031630141590565b601c5462010000900460ff1680612e855750612e85816126d2565b61110a5760405162461bcd60e51b815260206004820152601560248201527428393296a630bab731b410283937ba32b1ba34b7b760591b6044820152606401610ffa565b601c54601a544391612ee09160ff90911690613f9f565b11612efc57612ef7601c805463ff00000019169055565b612f07565b612f07816001612d26565b601c546301000000900460ff161561110a57601c8054610100900460ff16906001612f3183614118565b825460ff9182166101009390930a9283029190920219909116179055506001600160a01b03166000908152600e60205260409020805460ff19166001179055565b3360009081526011602052604081205460ff16158015612f9b575060185462010000900460ff16155b8015612fae5750601854610100900460ff165b8015612fcc5750601854601754612fc89160ff1690613f9f565b4210155b8015612080575050601654306000908152600c6020526040902054101590565b6018805462ff0000191662010000179055426017556016546015541080159061301e57506018546301000000900460ff165b1561329d57601654601580546000906130389084906140e6565b909155505060165460009061304f90600290613fb7565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106130895761308961414e565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156130dd57600080fd5b505afa1580156130f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131159190613a05565b816001815181106131285761312861414e565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b81524792919091169063791ac94790613172908690600090879030904290600401613eb3565b600060405180830381600087803b15801561318c57600080fd5b505af11580156131a0573d6000803e3d6000fd5b50505050600081476131b291906140e6565b60135460015460405163f305d71960e01b81523060048201526024810188905260006044820181905260648201526001600160a01b0391821660848201524260a4820152929350169063f305d71990839060c4016060604051808303818588803b15801561321f57600080fd5b505af1158015613233573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906132589190613d73565b505060408051838152602081018790527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a150505050613679565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106132d2576132d261414e565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561332657600080fd5b505afa15801561333a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335e9190613a05565b816001815181106133715761337161414e565b6001600160a01b03928316602091820292909201015260135460165460405163791ac94760e01b81524793929092169163791ac947916133bc91600090879030904290600401613eb3565b600060405180830381600087803b1580156133d657600080fd5b505af11580156133ea573d6000803e3d6000fd5b50505050600081476133fc91906140e6565b6021546020549192506000916134259161ffff600160301b918290048116929190910416613f79565b60215460205461ffff928316926134489262010000908190048216920416613f79565b6134569061ffff16846140c7565b6134609190613fb7565b6021546020549192506000916134899161ffff600160301b918290048116929190910416613f79565b60215460205461ffff928316926134ad92600160201b908190048216920416613f79565b6134bb9061ffff16856140c7565b6134c59190613fb7565b600854909150600160501b900460ff16156135bc57601460009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561352a57600080fd5b505af19350505050801561353c575060015b506002546040516000916001600160a01b03169061753090859084818181858888f193505050503d806000811461358f576040519150601f19603f3d011682016040523d82523d6000602084013e613594565b606091505b5050905080156135b65782600560008282546135b09190613f9f565b90915550505b50613637565b6002546040516000916001600160a01b03169061753090859084818181858888f193505050503d806000811461360e576040519150601f19603f3d011682016040523d82523d6000602084013e613613565b606091505b50509050801561363557826005600082825461362f9190613f9f565b90915550505b505b60165460408051918252602082018590527f05ab84b321981d7d9a13402e494604c50821bcb5f2400d128fa06cd6451113d4910160405180910390a150505050505b6018805462ff000019169055565b600854600090600160481b900460ff168015610fcf5750506001600160a01b03166000908152600f602052604090205460ff161590565b6001600160a01b0382166000908152600f602052604081205460ff16156136e65750806112c3565b601b546136f69062015180613f9f565b421015801561370e5750601c54600160201b900460ff165b1561376257604080516080810182526002815260056020820152600391810191909152600a6060909101526021805467ffffffffffffffff1916660a000300050002179055601c805464ff00000000191690555b6001600160a01b03831660009081526011602052604090205460ff16156137ad576021546008805461ffff60301b1916600160301b9283900461ffff1690920291909117905561381e565b6001600160a01b03841660009081526011602052604090205460ff16156137f8576020546008805461ffff60301b1916600160301b9283900461ffff1690920291909117905561381e565b6023546008805461ffff60301b1916600160301b9283900461ffff169092029190911790555b601a54431415613840576008805461ffff60301b191666630000000000001790555b60085461ffff600160201b820481169161386391600160301b90910416846140c7565b61386d9190613fb7565b6006556018546301000000900460ff161561392a576021546020546138999161ffff9081169116613f79565b6021546020546138bc9161ffff600160301b918290048116929190910416613f79565b6138c69190613f79565b60215460205461ffff928316926138e09281169116613f79565b61ffff166006546138f191906140c7565b6138fb9190613fb7565b600755601a5443141561390f576006546007555b60075460158054600090613924908490613f9f565b90915550505b6139378430600654612b4a565b506006546112c090836140e6565b600082601f83011261395657600080fd5b8135602061396b61396683613f55565b613f24565b80838252828201915082860187848660051b890101111561398b57600080fd5b60005b858110156139b35781356139a18161417a565b8452928401929084019060010161398e565b5090979650505050505050565b803561ffff811681146139d257600080fd5b919050565b803560ff811681146139d257600080fd5b6000602082840312156139fa57600080fd5b81356112c38161417a565b600060208284031215613a1757600080fd5b81516112c38161417a565b60008060408385031215613a3557600080fd5b8235613a408161417a565b91506020830135613a508161417a565b809150509250929050565b600080600060608486031215613a7057600080fd5b8335613a7b8161417a565b92506020840135613a8b8161417a565b929592945050506040919091013590565b60008060408385031215613aaf57600080fd5b8235613aba8161417a565b91506020830135613a508161418f565b60008060408385031215613add57600080fd5b8235613ae88161417a565b946020939093013593505050565b60008060408385031215613b0957600080fd5b823567ffffffffffffffff80821115613b2157600080fd5b613b2d86838701613945565b9350602091508185013581811115613b4457600080fd5b85019050601f81018613613b5757600080fd5b8035613b6561396682613f55565b80828252848201915084840189868560051b8701011115613b8557600080fd5b600094505b83851015613ba8578035835260019490940193918501918501613b8a565b5080955050505050509250929050565b60008060408385031215613bcb57600080fd5b823567ffffffffffffffff811115613be257600080fd5b613bee85828601613945565b9250506020830135613a508161418f565b600060208284031215613c1157600080fd5b81356112c38161418f565b600060208284031215613c2e57600080fd5b81516112c38161418f565b600080600060608486031215613c4e57600080fd5b8335613c598161418f565b92506020840135613c698161418f565b9150613c77604085016139d7565b90509250925092565b60008060408385031215613c9357600080fd5b8235613ae88161418f565b600060208284031215613cb057600080fd5b6112c3826139c0565b600080600060608486031215613cce57600080fd5b613cd7846139c0565b9250613ce5602085016139c0565b9150613c77604085016139c0565b600060208284031215613d0557600080fd5b5035919050565b600060208284031215613d1e57600080fd5b5051919050565b60008060408385031215613d3857600080fd5b50508035926020909101359150565b600080600060608486031215613d5c57600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215613d8857600080fd5b8351925060208401519150604084015190509250925092565b60008060008060808587031215613db757600080fd5b505082516020840151604085015160609095015191969095509092509050565b60008060408385031215613dea57600080fd5b823563ffffffff81168114613aba57600080fd5b600060208284031215613e1057600080fd5b6112c3826139d7565b600060208083528351808285015260005b81811015613e4657858101830151858201604001528201613e2a565b81811115613e58576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526006908201526510a7aba722a960d11b604082015260600190565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613f035784516001600160a01b031683529383019391830191600101613ede565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715613f4d57613f4d614164565b604052919050565b600067ffffffffffffffff821115613f6f57613f6f614164565b5060051b60200190565b600061ffff808316818516808303821115613f9657613f96614138565b01949350505050565b60008219821115613fb257613fb2614138565b500190565b600082613fd457634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115614014578160001904821115613ffa57613ffa614138565b8085161561400757918102915b93841c9390800290613fde565b509250929050565b60006112c360ff84168360008261403557506001610fcf565b8161404257506000610fcf565b816001811461405857600281146140625761407e565b6001915050610fcf565b60ff84111561407357614073614138565b50506001821b610fcf565b5060208310610133831016604e8410600b84101617156140a1575081810a610fcf565b6140ab8383613fd9565b80600019048211156140bf576140bf614138565b029392505050565b60008160001904831182151516156140e1576140e1614138565b500290565b6000828210156140f8576140f8614138565b500390565b600060001982141561411157614111614138565b5060010190565b600060ff821660ff81141561412f5761412f614138565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461110a57600080fd5b801515811461110a57600080fdfea2646970667358221220498df7f314c7b69bda78464e594f051060113af24720807e0208a3bc56e6576064736f6c6343000807003360806040526ec097ce7bc90715b34b9f100000000060095562015180600a5564174876e800600b55662386f26fc10000600c5534801561003e57600080fd5b50600080546001600160a01b03191633179055610f13806100606000396000f3fe6080604052600436106101145760003560e01c8063c98265b1116100a0578063edf3525311610064578063edf352531461030e578063efca2eed1461032e578063f0fc6bca14610344578063ffb2c47914610359578063ffd49c841461037957600080fd5b8063c98265b11461026e578063ccc3aeb514610283578063ce7c2ac214610299578063d0e30db0146102f0578063e2d2e219146102f857600080fd5b80633a98ef39116100e75780633a98ef39146101a45780634fab0ae8146101ba5780635e6056bb146101d05780637b510fe814610238578063997664d71461025857600080fd5b80630ca61cb11461011957806311ce023d1461013b57806314b6ca961461016457806328fd319814610184575b600080fd5b34801561012557600080fd5b50610139610134366004610d8f565b61038f565b005b34801561014757600080fd5b5061015160095481565b6040519081526020015b60405180910390f35b34801561017057600080fd5b5061013961017f366004610d4c565b610410565b34801561019057600080fd5b5061015161019f366004610d31565b6105d5565b3480156101b057600080fd5b5061015160055481565b3480156101c657600080fd5b50610151600c5481565b3480156101dc57600080fd5b506102186101eb366004610d31565b6005546007546001600160a01b038316600090815260046020526040902080546002909101549193509193565b60408051948552602085019390935291830152606082015260800161015b565b34801561024457600080fd5b50610218610253366004610d31565b61065e565b34801561026457600080fd5b5061015160065481565b34801561027a57600080fd5b50600b54610151565b34801561028f57600080fd5b50610151600b5481565b3480156102a557600080fd5b506102d56102b4366004610d31565b60046020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161015b565b6101396106bb565b34801561030457600080fd5b5061015160085481565b34801561031a57600080fd5b50610139610329366004610d31565b61072d565b34801561033a57600080fd5b5061015160075481565b34801561035057600080fd5b50610139610739565b34801561036557600080fd5b50610139610374366004610d76565b610744565b34801561038557600080fd5b50610151600a5481565b6000546001600160a01b031633146103a657600080fd5b600a839055600c8290556103be81633b9aca00610e4a565b600b819055600a54600c546040805192835260208301919091528101919091527fa3ee1581e8a82306c635df5050a65411026337c131e127415291f47a720612689060600160405180910390a1505050565b6000546001600160a01b0316331461042757600080fd5b6001600160a01b0382166000908152600460205260409020541561044e5761044e82610897565b600b54811015801561047657506001600160a01b038216600090815260046020526040902054155b156104db57600180546001600160a01b03841660008181526002602052604081208390558284018455929092527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319169091179055610511565b600b548110801561050357506001600160a01b03821660009081526004602052604090205415155b1561051157610511826109c8565b600b5481101561051f575060015b6001600160a01b03821660009081526004602052604090205460055461055091839161054a91610adb565b90610b26565b6005556001600160a01b038216600090815260046020526040902081905561057781610b8a565b6001600160a01b0383166000818152600460209081526040918290206001019390935580519182529181018390527f465bc1e774b3c331b04932a22f9781dbb864defe943d70548ba9b8af6c528b5c91015b60405180910390a15050565b6001600160a01b0381166000908152600460205260408120546105fa57506000919050565b6001600160a01b03821660009081526004602052604081205461061c90610b8a565b6001600160a01b03841660009081526004602052604090206001015490915080821161064c575060009392505050565b6106568282610adb565b949350505050565b60008060008061066d856105d5565b6001600160a01b038616600090815260036020526040902054600a5491955093506106989084610e10565b91504282116106a85760006106b2565b6106b28242610adb565b90509193509193565b60065434906106ca9082610b26565b6006556005546009546106f4916106eb916106e59085610ba7565b90610c26565b60085490610b26565b6008556040518181527f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384269060200160405180910390a150565b61073681610897565b50565b61074233610897565b565b6000546001600160a01b0316331461075b57600080fd5b60015480610767575050565b6000805a90506000805b858410801561077f57508482105b1561084c5784600d5410610793576000600d555b6107c56001600d54815481106107ab576107ab610ec7565b6000918252602090912001546001600160a01b0316610c68565b1561080a576107fc6001600d54815481106107e2576107e2610ec7565b6000918252602090912001546001600160a01b0316610897565b8061080681610e80565b9150505b61081f6108185a8590610adb565b8590610b26565b93505a600d8054919450600061083483610e80565b9190505550818061084490610e80565b925050610771565b600d54604080518481526020810184905280820192909252517f96b82f6a439ac2d3939f479dd110e1915927d68eac70cf39a47cf294d53234ee9181900360600190a1505050505050565b6001600160a01b0381166000908152600460205260409020546108b75750565b60006108c2826105d5565b905080156109c4576007546108d79082610b26565b6007556040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610910573d6000803e3d6000fd5b506001600160a01b038216600090815260036020908152604080832042905560049091529020600201546109449082610b26565b6001600160a01b038316600090815260046020526040902060028101919091555461096e90610b8a565b6001600160a01b0383166000818152600460209081526040918290206001019390935580519182529181018390527f33ad5d6b2a46b5457e0d36286a2686a0390b0821dedbbdf8dcdcda64f4782c6891016105c9565b5050565b600180546109d7908290610e69565b815481106109e7576109e7610ec7565b60009182526020808320909101546001600160a01b0384811684526002909252604090922054600180549290931692918110610a2557610a25610ec7565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260029182905260408120546001805491939291610a70908290610e69565b81548110610a8057610a80610ec7565b60009182526020808320909101546001600160a01b031683528201929092526040019020556001805480610ab657610ab6610eb1565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000610b1d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610cad565b90505b92915050565b600080610b338385610e10565b905083811015610b1d5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b6000610b206009546106e560085485610ba790919063ffffffff16565b600082610bb657506000610b20565b6000610bc28385610e4a565b905082610bcf8583610e28565b14610b1d5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b81565b6000610b1d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610ce7565b600a546001600160a01b03821660009081526003602052604081205490914291610c929190610e10565b108015610b205750600c54610ca6836105d5565b1192915050565b60008184841115610cd15760405162461bcd60e51b8152600401610b819190610dbb565b506000610cde8486610e69565b95945050505050565b60008183610d085760405162461bcd60e51b8152600401610b819190610dbb565b506000610cde8486610e28565b80356001600160a01b0381168114610d2c57600080fd5b919050565b600060208284031215610d4357600080fd5b610b1d82610d15565b60008060408385031215610d5f57600080fd5b610d6883610d15565b946020939093013593505050565b600060208284031215610d8857600080fd5b5035919050565b600080600060608486031215610da457600080fd5b505081359360208301359350604090920135919050565b600060208083528351808285015260005b81811015610de857858101830151858201604001528201610dcc565b81811115610dfa576000604083870101525b50601f01601f1916929092016040019392505050565b60008219821115610e2357610e23610e9b565b500190565b600082610e4557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615610e6457610e64610e9b565b500290565b600082821015610e7b57610e7b610e9b565b500390565b6000600019821415610e9457610e94610e9b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fdfea2646970667358221220b40af97b1703cba216db56558488359d7aa03b63053dc6720471121d0b96423064736f6c63430008070033

Deployed Bytecode

0x6080604052600436106104085760003560e01c80638988d07811610213578063c98265b111610123578063f0fc6bca116100ab578063f887ea401161007a578063f887ea4014610ec7578063fc6c2bda14610ee7578063fe9fbb8014610f07578063ff18bf0b14610f27578063ff787dc614610f4857600080fd5b8063f0fc6bca14610e39578063f2421d2c14610e4e578063f2fde38b14610e87578063f708a64f14610ea757600080fd5b8063df20fd49116100f2578063df20fd4914610d98578063edf3525314610db8578063f062172b14610dd8578063f08b765d14610df8578063f0b37c0414610e1957600080fd5b8063c98265b114610ce4578063ca33e64c14610cf9578063dc77036714610d19578063dd62ed3e14610d5257600080fd5b8063a9059cbb116101a6578063b6a5d7de11610175578063b6a5d7de14610c4d578063bc7c954414610c6d578063bfe1092814610c8d578063c3b2d33714610cad578063c40fedc614610cc457600080fd5b8063a9059cbb14610b6e578063a98f6f9014610b8e578063abe57e7014610bae578063b2c57fff14610bce57600080fd5b8063a0ecf0a5116101e2578063a0ecf0a514610aed578063a4b45c0014610b0d578063a771ebc714610b2d578063a8aa1b3114610b4e57600080fd5b80638988d07814610a0f5780638da5cb5b14610a3f57806395d89b4114610a5f57806395f93d4814610a8c57600080fd5b80634c57f8d211610319578063715018a6116102a157806379c1a6261161027057806379c1a626146109715780637b510fe81461099157806380c581d1146109b157806380f44a62146109d1578063893d20e8146109f157600080fd5b8063715018a6146108e357806371bb96e7146108f85780637303df9a146109185780637537ccb61461095157600080fd5b80635e6056bb116102e85780635e6056bb146107fd578063658d4b7f1461083d5780636951a0791461085d57806369912f531461087d57806370a08231146108ad57600080fd5b80634c57f8d21461076c5780635005180a1461078c57806354200d6f146107ac5780635df45a37146107cc57600080fd5b80631faf723b1161039c5780632f54bf6e1161036b5780632f54bf6e146106b1578063313ce567146106e05780633cd96086146106fc57806343cc8c2a1461071c578063461a44501461074c57600080fd5b80631faf723b146105fa57806323b872dd1461061a57806325cef4581461063a5780632af10fac1461067957600080fd5b80630ca61cb1116103d85780630ca61cb11461057957806318160ddd1461059b5780631a5a7924146105ba5780631da1db5e146105da57600080fd5b8062167e931461041457806302ac81681461048057806306fdde031461050a578063095ea7b31461054957600080fd5b3661040f57005b600080fd5b34801561042057600080fd5b5060235461044d9061ffff80821691620100008104821691600160201b8204811691600160301b90041684565b6040805161ffff958616815293851660208501529184169183019190915290911660608201526080015b60405180910390f35b34801561048c57600080fd5b50601a54601b54601c546104c992919060ff80821691610100810482169162010000820481169163010000008104821691600160201b9091041687565b60408051978852602088019690965260ff9485169587019590955292909116606085015215156080840152151560a0830152151560c082015260e001610477565b34801561051657600080fd5b5060408051808201909152600d81526c417065782056656e747572657360981b60208201525b6040516104779190613e19565b34801561055557600080fd5b50610569610564366004613aca565b610f68565b6040519015158152602001610477565b34801561058557600080fd5b50610599610594366004613d47565b610fd5565b005b3480156105a757600080fd5b506004545b604051908152602001610477565b3480156105c657600080fd5b506105996105d5366004613cf3565b611074565b3480156105e657600080fd5b506105996105f5366004613cf3565b61110d565b34801561060657600080fd5b50610599610615366004613d25565b6111b9565b34801561062657600080fd5b50610569610635366004613a5b565b611250565b34801561064657600080fd5b50601d54601e54601f5461065c92919060ff1683565b604080519384526020840192909252151590820152606001610477565b34801561068557600080fd5b50600254610699906001600160a01b031681565b6040516001600160a01b039091168152602001610477565b3480156106bd57600080fd5b506105696106cc3660046139e8565b6000546001600160a01b0391821691161490565b3480156106ec57600080fd5b5060405160098152602001610477565b34801561070857600080fd5b50610599610717366004613bff565b6112ca565b34801561072857600080fd5b506105696107373660046139e8565b60116020526000908152604090205460ff1681565b34801561075857600080fd5b50610599610767366004613c39565b61130d565b34801561077857600080fd5b50610599610787366004613af6565b61138b565b34801561079857600080fd5b506105996107a7366004613bff565b6114c7565b3480156107b857600080fd5b506105996107c7366004613bff565b611504565b3480156107d857600080fd5b50600554600254604080519283526001600160a01b0390911631602083015201610477565b34801561080957600080fd5b5061081d6108183660046139e8565b611581565b604080519485526020850193909352918301526060820152608001610477565b34801561084957600080fd5b50610599610858366004613a9c565b611615565b34801561086957600080fd5b50610599610878366004613cb9565b61169b565b34801561088957600080fd5b506105696108983660046139e8565b60106020526000908152604090205460ff1681565b3480156108b957600080fd5b506105ac6108c83660046139e8565b6001600160a01b03166000908152600c602052604090205490565b3480156108ef57600080fd5b50610599611796565b34801561090457600080fd5b50610599610913366004613cf3565b61185a565b34801561092457600080fd5b5060225461044d9061ffff80821691620100008104821691600160201b8204811691600160301b90041684565b34801561095d57600080fd5b5061059961096c366004613a9c565b6118c4565b34801561097d57600080fd5b5061059961098c366004613cb9565b611945565b34801561099d57600080fd5b5061081d6109ac3660046139e8565b611a41565b3480156109bd57600080fd5b506105996109cc366004613a9c565b611a7a565b3480156109dd57600080fd5b506105996109ec366004613a9c565b611acf565b3480156109fd57600080fd5b506000546001600160a01b0316610699565b348015610a1b57600080fd5b50610569610a2a3660046139e8565b600b6020526000908152604090205460ff1681565b348015610a4b57600080fd5b50600054610699906001600160a01b031681565b348015610a6b57600080fd5b50604080518082019091526004815263082e0caf60e31b602082015261053c565b348015610a9857600080fd5b50601954610ac29060ff808216916101008104821691620100008204811691630100000090041684565b604080519415158552921515602085015260ff91821692840192909252166060820152608001610477565b348015610af957600080fd5b50610599610b08366004613bff565b611b24565b348015610b1957600080fd5b50610599610b28366004613a22565b611ba1565b348015610b3957600080fd5b5060085461056990600160481b900460ff1681565b348015610b5a57600080fd5b50600354610699906001600160a01b031681565b348015610b7a57600080fd5b50610569610b89366004613aca565b611c32565b348015610b9a57600080fd5b50610599610ba9366004613dfe565b611c3f565b348015610bba57600080fd5b50610599610bc9366004613d25565b611cfb565b348015610bda57600080fd5b50601554601654601754601854610c109392919060ff808216916101008104821691620100008204811691630100000090041687565b6040805197885260208801969096529486019390935260ff909116606085015215156080840152151560a0830152151560c082015260e001610477565b348015610c5957600080fd5b50610599610c683660046139e8565b611d89565b348015610c7957600080fd5b50610599610c88366004613dd7565b611e07565b348015610c9957600080fd5b50601454610699906001600160a01b031681565b348015610cb957600080fd5b506105ac620f424081565b348015610cd057600080fd5b50610569610cdf366004613a22565b611ea6565b348015610cf057600080fd5b506105ac612003565b348015610d0557600080fd5b50600154610699906001600160a01b031681565b348015610d2557600080fd5b5060205461044d9061ffff80821691620100008104821691600160201b8204811691600160301b90041684565b348015610d5e57600080fd5b506105ac610d6d366004613a22565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b348015610da457600080fd5b50610599610db3366004613c80565b612085565b348015610dc457600080fd5b50610599610dd33660046139e8565b612114565b348015610de457600080fd5b50610599610df3366004613bb8565b612176565b348015610e0457600080fd5b5060085461056990600160401b900460ff1681565b348015610e2557600080fd5b50610599610e343660046139e8565b612249565b348015610e4557600080fd5b506105996122c4565b348015610e5a57600080fd5b5060215461044d9061ffff80821691620100008104821691600160201b8204811691600160301b90041684565b348015610e9357600080fd5b50610599610ea23660046139e8565b612323565b348015610eb357600080fd5b50610599610ec2366004613a9c565b612433565b348015610ed357600080fd5b50601354610699906001600160a01b031681565b348015610ef357600080fd5b50610599610f02366004613cb9565b6125d6565b348015610f1357600080fd5b50610569610f223660046139e8565b6126d2565b348015610f3357600080fd5b5060085461056990600160501b900460ff1681565b348015610f5457600080fd5b50610599610f63366004613c9e565b6126f0565b3360008181526009602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610fc39086815260200190565b60405180910390a35060015b92915050565b610fde336126d2565b6110035760405162461bcd60e51b8152600401610ffa90613e8e565b60405180910390fd5b601454604051630ca61cb160e01b81526004810185905260248101849052604481018390526001600160a01b0390911690630ca61cb190606401600060405180830381600087803b15801561105757600080fd5b505af115801561106b573d6000803e3d6000fd5b50505050505050565b61107d336126d2565b6110995760405162461bcd60e51b8152600401610ffa90613e8e565b478111156110a657600080fd5b601460009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156110f657600080fd5b505af193505050508015611108575060015b505b50565b6000546001600160a01b031633146111375760405162461bcd60e51b8152600401610ffa90613e6e565b606481111561114557600080fd5b60025447906001600160a01b03166108fc606461116285856140c7565b61116c9190613fb7565b6040518115909202916000818181858888f19350505050158015611194573d6000803e3d6000fd5b5061119f82826140c7565b600560008282546111b09190613f9f565b90915550505050565b6111c2336126d2565b6111de5760405162461bcd60e51b8152600401610ffa90613e8e565b600182101580156111f157506103e88111155b6111fa57600080fd5b808260045461120991906140c7565b6112139190613fb7565b601d8190556040519081527fa53407ff336a78b145e1a297adce2a5d7a54e6c31d13b4e69e04aad80b07b44b906020015b60405180910390a15050565b6001600160a01b0383166000908152600960209081526040808320338452909152812054600019146112b5576001600160a01b0384166000908152600960209081526040808320338452909152812080548492906112af9084906140e6565b90915550505b6112c084848461275a565b90505b9392505050565b6112d3336126d2565b6112ef5760405162461bcd60e51b8152600401610ffa90613e8e565b60088054911515600160501b0260ff60501b19909216919091179055565b611316336126d2565b6113325760405162461bcd60e51b8152600401610ffa90613e8e565b60195460ff620100009091048116908216111561134e57600080fd5b6019805463ff0000ff1916630100000060ff939093169290920260ff1916919091179215159290921761ff00191661010091151591909102179055565b6000546001600160a01b031633146113b55760405162461bcd60e51b8152600401610ffa90613e6e565b80518251146113fe5760405162461bcd60e51b81526020600482015260156024820152742632b733ba3439903237903737ba1036b0ba31b41760591b6044820152606401610ffa565b60005b82518160ff1610156114c257818160ff16815181106114225761142261414e565b6020026020010151611449336001600160a01b03166000908152600c602052604090205490565b101561145457600080fd5b6114af33848360ff168151811061146d5761146d61414e565b60200260200101516009600a611483919061401c565b858560ff16815181106114985761149861414e565b60200260200101516114aa91906140c7565b612b4a565b50806114ba81614118565b915050611401565b505050565b6000546001600160a01b031633146114f15760405162461bcd60e51b8152600401610ffa90613e6e565b601f805460ff1916911515919091179055565b61150d336126d2565b6115295760405162461bcd60e51b8152600401610ffa90613e8e565b6018805482151563010000000263ff000000199091161790556040517f075af1ef3c1829076b56416deceff9df2103194b5dfbf756f8557478b494f7ff9061157690831515815260200190565b60405180910390a150565b601454604051635e6056bb60e01b81526001600160a01b0383811660048301526000928392839283921690635e6056bb906024015b60806040518083038186803b1580156115ce57600080fd5b505afa1580156115e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116069190613da1565b93509350935093509193509193565b6000546001600160a01b0316331461163f5760405162461bcd60e51b8152600401610ffa90613e6e565b6001600160a01b0382166000818152600f6020908152604091829020805460ff19168515159081179091558251938452908301527f4d5771454588f51370a8a2e7e151354b6de0dc3159b14821b4ad76bc04c28bc79101611244565b6116a4336126d2565b6116c05760405162461bcd60e51b8152600401610ffa90613e8e565b602254600160301b900461ffff16826116d98386613f79565b6116e39190613f79565b61ffff1611156116f257600080fd5b60405180608001604052808461ffff1681526020018261ffff1681526020018361ffff16815260200182856117279190613f79565b61ffff90811690915281516020805481850151604086015160609096015193851663ffffffff199092169190911762010000918516919091021767ffffffff000000001916600160201b9484169490940261ffff60301b191693909317600160301b9190921602179055505050565b6000546001600160a01b031633146117c05760405162461bcd60e51b8152600401610ffa90613e6e565b600080546001600160a01b039081168252600f60209081526040808420805460ff19908116909155845484168552601283528185208054821690558454841685526010835281852080548216905584549093168452600a909152808320805490921690915581546001600160a01b0319168255517fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce9190a1565b8061186a575060085463ffffffff165b6014546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401600060405180830381600087803b1580156118b357600080fd5b505af1925050508015611108575050565b6118cd336126d2565b6118e95760405162461bcd60e51b8152600401610ffa90613e8e565b6001600160a01b038216600081815260126020908152604091829020805460ff19168515159081179091558251938452908301527fe1fc1cdd7520f99d4b4715966557867ae295b281f90d30b3631bae054b7f196c9101611244565b61194e336126d2565b61196a5760405162461bcd60e51b8152600401610ffa90613e8e565b602254600160301b900461ffff16826119838386613f79565b61198d9190613f79565b61ffff16111561199c57600080fd5b60405180608001604052808461ffff1681526020018261ffff1681526020018361ffff16815260200182856119d19190613f79565b61ffff9081169091528151602380546020850151604086015160609096015193851663ffffffff199092169190911762010000918516919091021767ffffffff000000001916600160201b9484169490940261ffff60301b191693909317600160301b9190921602179055505050565b601454604051630f6a21fd60e31b81526001600160a01b0383811660048301526000928392839283921690637b510fe8906024016115b6565b6000546001600160a01b03163314611aa45760405162461bcd60e51b8152600401610ffa90613e6e565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611af95760405162461bcd60e51b8152600401610ffa90613e6e565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611b4e5760405162461bcd60e51b8152600401610ffa90613e6e565b60088054821515600160481b0269ff000000000000000000199091161790556040517fbe60970aec8ca24c1ba98cb1a383d90a35d6f55ce978a6f76e53a594272142609061157690831515815260200190565b6000546001600160a01b03163314611bcb5760405162461bcd60e51b8152600401610ffa90613e6e565b600180546001600160a01b038481166001600160a01b03199283168117909355600280549185169190921681179091556040805192835260208301919091527f9fba4a27b77afdf6c68deb1d99abfd909cb0c2bfa6a148fae3c6b8414e58aef99101611244565b60006112c333848461275a565b6000546001600160a01b03163314611c695760405162461bcd60e51b8152600401610ffa90613e6e565b60058160ff161115611c7a57600080fd5b601c5462010000900460ff1615611c9057600080fd5b601c5462010000900460ff16611ccf57601c805442601b5543601a5562ff00001964ffff0000ff1990911660ff84161763010000001716620100001790555b6040517fba61a96074b3d636edeee92caddc86293c917d5b6818b7d3698bb52e02ec86c890600090a150565b611d04336126d2565b611d205760405162461bcd60e51b8152600401610ffa90613e8e565b60018210158015611d32575060648111155b611d3b57600080fd5b8082600454611d4a91906140c7565b611d549190613fb7565b601e8190556040519081527f199db6b3f784dbaaa5df3981a282a84eb13409a543eaaeb8e8f309c467b45e1890602001611244565b6000546001600160a01b03163314611db35760405162461bcd60e51b8152600401610ffa90613e6e565b6001600160a01b0381166000818152600a6020908152604091829020805460ff1916600117905590519182527fdc84e3a4c83602050e3865df792a4e6800211a79ac60db94e703a820ce8929249101611576565b611e10336126d2565b611e2c5760405162461bcd60e51b8152600401610ffa90613e8e565b620f42408263ffffffff161115611e4257600080fd5b6008805463ffffffff841668ff00000000ffffffff199091168117600160401b841515908102919091179092556040805191825260208201929092527f5fdd419a37de0633d9df0f25b1b1f9a77e5794e82e87c24bc9ded94c0990b1769101611244565b600080546001600160a01b03163314611ed15760405162461bcd60e51b8152600401610ffa90613e6e565b6001600160a01b03831615801590611ef257506001600160a01b0383163014155b611efb57600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b158015611f3d57600080fd5b505afa158015611f51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f759190613d0c565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb90604401602060405180830381600087803b158015611fc357600080fd5b505af1158015611fd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffb9190613c1c565b949350505050565b6014546040805163c98265b160e01b815290516000926001600160a01b03169163c98265b1916004808301926020929190829003018186803b15801561204857600080fd5b505afa15801561205c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120809190613d0c565b905090565b61208e336126d2565b6120aa5760405162461bcd60e51b8152600401610ffa90613e8e565b6018805461ff00191661010084151502179055600454612710906120cf9083906140c7565b6120d99190613fb7565b601655604080518315158152602081018390527f30e0f7c488b6c70123097f13cf387e140b0e0b8c9d9e3473e502f35b035d377c9101611244565b60145460405163edf3525360e01b81526001600160a01b0383811660048301529091169063edf3525390602401600060405180830381600087803b15801561215b57600080fd5b505af115801561216f573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146121a05760405162461bcd60e51b8152600401610ffa90613e6e565b60005b82518110156114c2576121cf8382815181106121c1576121c161414e565b602002602001015183612d26565b7ffc70dcce81b5afebab40f1a9a0fe597f9097cb179cb4508e875b7b166838f88d8382815181106122025761220261414e565b60200260200101518360405161222f9291906001600160a01b039290921682521515602082015260400190565b60405180910390a180612241816140fd565b9150506121a3565b6000546001600160a01b031633146122735760405162461bcd60e51b8152600401610ffa90613e6e565b6001600160a01b0381166000818152600a6020908152604091829020805460ff1916905590519182527f8e4a23d6a5d81f013eca4bc92aeb9214ccafcaebd1f097c350c922d6e19122d59101611576565b60145460405163edf3525360e01b81523360048201526001600160a01b039091169063edf3525390602401600060405180830381600087803b15801561230957600080fd5b505af115801561231d573d6000803e3d6000fd5b50505050565b6000546001600160a01b0316331461234d5760405162461bcd60e51b8152600401610ffa90613e6e565b600080546001600160a01b039081168252600f60208181526040808520805460ff1990811690915585548516865260128084528287208054831690558654861687526010808552838820805484169055875487168852600a80865284892080548516905596891680895295855283882080548416600190811790915591855283882080548416831790558452828720805483168217905586546001600160a01b0319168517875594835294819020805490951690931790935590519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639101611576565b61243c336126d2565b6124585760405162461bcd60e51b8152600401610ffa90613e8e565b6001600160a01b038216301480159061247f57506003546001600160a01b03838116911614155b61248857600080fd5b6001600160a01b0382166000908152600e60205260409020805460ff1916821580159190911790915561252057601454604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca9690604401600060405180830381600087803b15801561250357600080fd5b505af1158015612517573d6000803e3d6000fd5b50505050612597565b6014546001600160a01b038381166000818152600c602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b15801561257e57600080fd5b505af1158015612592573d6000803e3d6000fd5b505050505b604080516001600160a01b038416815282151560208201527e8548b19959a911110b36c03f6148fa56fbcc2ce2553abf33112aa00bbdfd6a9101611244565b6125df336126d2565b6125fb5760405162461bcd60e51b8152600401610ffa90613e8e565b602254600160301b900461ffff16826126148386613f79565b61261e9190613f79565b61ffff16111561262d57600080fd5b60405180608001604052808461ffff1681526020018261ffff1681526020018361ffff16815260200182856126629190613f79565b61ffff9081169091528151602180546020850151604086015160609096015193851663ffffffff199092169190911762010000918516919091021767ffffffff000000001916600160201b9484169490940261ffff60301b191693909317600160301b9190921602179055505050565b6001600160a01b03166000908152600a602052604090205460ff1690565b6000546001600160a01b0316331461271a5760405162461bcd60e51b8152600401610ffa90613e6e565b60225461ffff600160301b9091048116908216111561273857600080fd5b6022805461ffff909216600160301b0261ffff60301b19909216919091179055565b60185460009062010000900460ff161561278057612779848484612b4a565b90506112c3565b6001600160a01b0384166000908152600b602052604090205460ff16156127a657600080fd5b6001600160a01b0383166000908152600b602052604090205460ff16156127cc57600080fd5b6127d68484612d75565b15612a7157601c5462010000900460ff166127f4576127f484612e6a565b601c5462010000900460ff16801561280e5750601f5460ff165b15612a71576001600160a01b03831660009081526012602052604090205460ff166128cb57601d5482118015906128705750601e5482612863856001600160a01b03166000908152600c602052604090205490565b61286d9190613f9f565b11155b6128cb5760405162461bcd60e51b815260206004820152602660248201527f544f4b454e3a20416d6f756e742065786365656473205472616e73616374696f6044820152656e2073697a6560d01b6064820152608401610ffa565b6001600160a01b03841660009081526011602052604090205460ff16801561290157506013546001600160a01b03848116911614155b801561292657506001600160a01b0383166000908152600f602052604090205460ff16155b8015612934575060195460ff165b15612992576001600160a01b0383166000908152600d6020526040902054421161295d57600080fd5b601954612974906301000000900460ff1642613f9f565b6001600160a01b0384166000908152600d6020526040902055612a42565b6001600160a01b03841660009081526011602052604090205460ff161580156129d457506001600160a01b0384166000908152600f602052604090205460ff16155b80156129e75750601954610100900460ff165b15612a42576001600160a01b0384166000908152600d6020526040902054421015612a1157600080fd5b601954612a28906301000000900460ff1642613f9f565b6001600160a01b0385166000908152600d60205260409020555b601c5462010000900460ff168015612a635750601c546301000000900460ff165b15612a7157612a7183612ec9565b612a79612f72565b15612a8657612a86612fec565b601c5462010000900460ff168015612aa75750600854600160401b900460ff165b15612b11576014546008546040516001624d3b8760e01b0319815263ffffffff90911660048201526001600160a01b039091169063ffb2c47990602401600060405180830381600087803b158015612afe57600080fd5b505af1925050508015612b0f575060015b505b6000612b1c85613687565b612b265782612b31565b612b318585856136be565b9050612b3e858583612b4a565b50600195945050505050565b6001600160a01b0383166000908152600c6020526040812054612b6e9083906140e6565b6001600160a01b038086166000908152600c60205260408082209390935590851681522054612b9e908390613f9f565b6001600160a01b038085166000818152600c602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612bf29086815260200190565b60405180910390a36001600160a01b0384166000908152600e602052604090205460ff16612c8b576014546001600160a01b038581166000818152600c602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015612c7857600080fd5b505af1925050508015612c89575060015b505b6001600160a01b0383166000908152600e602052604090205460ff16612d1c576014546001600160a01b038481166000818152600c602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015612d0957600080fd5b505af1925050508015612d1a575060015b505b5060019392505050565b8015612d53576001600160a01b0382166000908152600b60205260409020805460ff191660011790555050565b506001600160a01b03166000908152600b60205260409020805460ff19169055565b600080546001600160a01b03848116911614158015612da257506000546001600160a01b03838116911614155b8015612db957506000546001600160a01b03163214155b8015612dcb5750612dc9836126d2565b155b8015612ddd5750612ddb826126d2565b155b8015612e0257506001600160a01b03831660009081526010602052604090205460ff16155b8015612e2757506001600160a01b03821660009081526010602052604090205460ff16155b8015612e3e57506001600160a01b03821661dead14155b8015612e5257506001600160a01b03821615155b80156112c3575050506001600160a01b031630141590565b601c5462010000900460ff1680612e855750612e85816126d2565b61110a5760405162461bcd60e51b815260206004820152601560248201527428393296a630bab731b410283937ba32b1ba34b7b760591b6044820152606401610ffa565b601c54601a544391612ee09160ff90911690613f9f565b11612efc57612ef7601c805463ff00000019169055565b612f07565b612f07816001612d26565b601c546301000000900460ff161561110a57601c8054610100900460ff16906001612f3183614118565b825460ff9182166101009390930a9283029190920219909116179055506001600160a01b03166000908152600e60205260409020805460ff19166001179055565b3360009081526011602052604081205460ff16158015612f9b575060185462010000900460ff16155b8015612fae5750601854610100900460ff165b8015612fcc5750601854601754612fc89160ff1690613f9f565b4210155b8015612080575050601654306000908152600c6020526040902054101590565b6018805462ff0000191662010000179055426017556016546015541080159061301e57506018546301000000900460ff165b1561329d57601654601580546000906130389084906140e6565b909155505060165460009061304f90600290613fb7565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106130895761308961414e565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156130dd57600080fd5b505afa1580156130f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131159190613a05565b816001815181106131285761312861414e565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b81524792919091169063791ac94790613172908690600090879030904290600401613eb3565b600060405180830381600087803b15801561318c57600080fd5b505af11580156131a0573d6000803e3d6000fd5b50505050600081476131b291906140e6565b60135460015460405163f305d71960e01b81523060048201526024810188905260006044820181905260648201526001600160a01b0391821660848201524260a4820152929350169063f305d71990839060c4016060604051808303818588803b15801561321f57600080fd5b505af1158015613233573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906132589190613d73565b505060408051838152602081018790527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a150505050613679565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106132d2576132d261414e565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561332657600080fd5b505afa15801561333a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335e9190613a05565b816001815181106133715761337161414e565b6001600160a01b03928316602091820292909201015260135460165460405163791ac94760e01b81524793929092169163791ac947916133bc91600090879030904290600401613eb3565b600060405180830381600087803b1580156133d657600080fd5b505af11580156133ea573d6000803e3d6000fd5b50505050600081476133fc91906140e6565b6021546020549192506000916134259161ffff600160301b918290048116929190910416613f79565b60215460205461ffff928316926134489262010000908190048216920416613f79565b6134569061ffff16846140c7565b6134609190613fb7565b6021546020549192506000916134899161ffff600160301b918290048116929190910416613f79565b60215460205461ffff928316926134ad92600160201b908190048216920416613f79565b6134bb9061ffff16856140c7565b6134c59190613fb7565b600854909150600160501b900460ff16156135bc57601460009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561352a57600080fd5b505af19350505050801561353c575060015b506002546040516000916001600160a01b03169061753090859084818181858888f193505050503d806000811461358f576040519150601f19603f3d011682016040523d82523d6000602084013e613594565b606091505b5050905080156135b65782600560008282546135b09190613f9f565b90915550505b50613637565b6002546040516000916001600160a01b03169061753090859084818181858888f193505050503d806000811461360e576040519150601f19603f3d011682016040523d82523d6000602084013e613613565b606091505b50509050801561363557826005600082825461362f9190613f9f565b90915550505b505b60165460408051918252602082018590527f05ab84b321981d7d9a13402e494604c50821bcb5f2400d128fa06cd6451113d4910160405180910390a150505050505b6018805462ff000019169055565b600854600090600160481b900460ff168015610fcf5750506001600160a01b03166000908152600f602052604090205460ff161590565b6001600160a01b0382166000908152600f602052604081205460ff16156136e65750806112c3565b601b546136f69062015180613f9f565b421015801561370e5750601c54600160201b900460ff165b1561376257604080516080810182526002815260056020820152600391810191909152600a6060909101526021805467ffffffffffffffff1916660a000300050002179055601c805464ff00000000191690555b6001600160a01b03831660009081526011602052604090205460ff16156137ad576021546008805461ffff60301b1916600160301b9283900461ffff1690920291909117905561381e565b6001600160a01b03841660009081526011602052604090205460ff16156137f8576020546008805461ffff60301b1916600160301b9283900461ffff1690920291909117905561381e565b6023546008805461ffff60301b1916600160301b9283900461ffff169092029190911790555b601a54431415613840576008805461ffff60301b191666630000000000001790555b60085461ffff600160201b820481169161386391600160301b90910416846140c7565b61386d9190613fb7565b6006556018546301000000900460ff161561392a576021546020546138999161ffff9081169116613f79565b6021546020546138bc9161ffff600160301b918290048116929190910416613f79565b6138c69190613f79565b60215460205461ffff928316926138e09281169116613f79565b61ffff166006546138f191906140c7565b6138fb9190613fb7565b600755601a5443141561390f576006546007555b60075460158054600090613924908490613f9f565b90915550505b6139378430600654612b4a565b506006546112c090836140e6565b600082601f83011261395657600080fd5b8135602061396b61396683613f55565b613f24565b80838252828201915082860187848660051b890101111561398b57600080fd5b60005b858110156139b35781356139a18161417a565b8452928401929084019060010161398e565b5090979650505050505050565b803561ffff811681146139d257600080fd5b919050565b803560ff811681146139d257600080fd5b6000602082840312156139fa57600080fd5b81356112c38161417a565b600060208284031215613a1757600080fd5b81516112c38161417a565b60008060408385031215613a3557600080fd5b8235613a408161417a565b91506020830135613a508161417a565b809150509250929050565b600080600060608486031215613a7057600080fd5b8335613a7b8161417a565b92506020840135613a8b8161417a565b929592945050506040919091013590565b60008060408385031215613aaf57600080fd5b8235613aba8161417a565b91506020830135613a508161418f565b60008060408385031215613add57600080fd5b8235613ae88161417a565b946020939093013593505050565b60008060408385031215613b0957600080fd5b823567ffffffffffffffff80821115613b2157600080fd5b613b2d86838701613945565b9350602091508185013581811115613b4457600080fd5b85019050601f81018613613b5757600080fd5b8035613b6561396682613f55565b80828252848201915084840189868560051b8701011115613b8557600080fd5b600094505b83851015613ba8578035835260019490940193918501918501613b8a565b5080955050505050509250929050565b60008060408385031215613bcb57600080fd5b823567ffffffffffffffff811115613be257600080fd5b613bee85828601613945565b9250506020830135613a508161418f565b600060208284031215613c1157600080fd5b81356112c38161418f565b600060208284031215613c2e57600080fd5b81516112c38161418f565b600080600060608486031215613c4e57600080fd5b8335613c598161418f565b92506020840135613c698161418f565b9150613c77604085016139d7565b90509250925092565b60008060408385031215613c9357600080fd5b8235613ae88161418f565b600060208284031215613cb057600080fd5b6112c3826139c0565b600080600060608486031215613cce57600080fd5b613cd7846139c0565b9250613ce5602085016139c0565b9150613c77604085016139c0565b600060208284031215613d0557600080fd5b5035919050565b600060208284031215613d1e57600080fd5b5051919050565b60008060408385031215613d3857600080fd5b50508035926020909101359150565b600080600060608486031215613d5c57600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215613d8857600080fd5b8351925060208401519150604084015190509250925092565b60008060008060808587031215613db757600080fd5b505082516020840151604085015160609095015191969095509092509050565b60008060408385031215613dea57600080fd5b823563ffffffff81168114613aba57600080fd5b600060208284031215613e1057600080fd5b6112c3826139d7565b600060208083528351808285015260005b81811015613e4657858101830151858201604001528201613e2a565b81811115613e58576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526006908201526510a7aba722a960d11b604082015260600190565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613f035784516001600160a01b031683529383019391830191600101613ede565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715613f4d57613f4d614164565b604052919050565b600067ffffffffffffffff821115613f6f57613f6f614164565b5060051b60200190565b600061ffff808316818516808303821115613f9657613f96614138565b01949350505050565b60008219821115613fb257613fb2614138565b500190565b600082613fd457634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115614014578160001904821115613ffa57613ffa614138565b8085161561400757918102915b93841c9390800290613fde565b509250929050565b60006112c360ff84168360008261403557506001610fcf565b8161404257506000610fcf565b816001811461405857600281146140625761407e565b6001915050610fcf565b60ff84111561407357614073614138565b50506001821b610fcf565b5060208310610133831016604e8410600b84101617156140a1575081810a610fcf565b6140ab8383613fd9565b80600019048211156140bf576140bf614138565b029392505050565b60008160001904831182151516156140e1576140e1614138565b500290565b6000828210156140f8576140f8614138565b500390565b600060001982141561411157614111614138565b5060010190565b600060ff821660ff81141561412f5761412f614138565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461110a57600080fd5b801515811461110a57600080fdfea2646970667358221220498df7f314c7b69bda78464e594f051060113af24720807e0208a3bc56e6576064736f6c63430008070033

Deployed Bytecode Sourcemap

22052:26291:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24541:25;;;;;;;;;;-1:-1:-1;24541:25:0;;;;;;;;;;;;;;;-1:-1:-1;;;24541:25:0;;;;;-1:-1:-1;;;24541:25:0;;;;;;;;;15456:6:1;15489:15;;;15471:34;;15541:15;;;15536:2;15521:18;;15514:43;15593:15;;;15573:18;;;15566:43;;;;15645:15;;;15640:2;15625:18;;15618:43;15433:3;15418:19;24541:25:0;;;;;;;;24377:21;;;;;;;;;;-1:-1:-1;24377:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24377:21:0;;;;;;;;;;19084:25:1;;;19140:2;19125:18;;19118:34;;;;19200:4;19188:17;;;19168:18;;;19161:45;;;;19242:17;;;;19237:2;19222:18;;19215:45;19304:14;19297:22;19291:3;19276:19;;19269:51;19364:14;19357:22;19351:3;19336:19;;19329:51;19424:14;19417:22;19411:3;19396:19;;19389:51;19071:3;19056:19;24377:21:0;18795:651:1;44920:94:0;;;;;;;;;;-1:-1:-1;45001:5:0;;;;;;;;;;;;-1:-1:-1;;;45001:5:0;;;;44920:94;;;;;;;:::i;45404:216::-;;;;;;;;;;-1:-1:-1;45404:216:0;;;;;:::i;:::-;;:::i;:::-;;;11650:14:1;;11643:22;11625:41;;11613:2;11598:18;45404:216:0;11485:187:1;35137:267:0;;;;;;;;;;-1:-1:-1;35137:267:0;;;;;:::i;:::-;;:::i;:::-;;44602:102;;;;;;;;;;-1:-1:-1;44684:12:0;;44602:102;;;15818:25:1;;;15806:2;15791:18;44602:102:0;15672:177:1;30011:180:0;;;;;;;;;;-1:-1:-1;30011:180:0;;;;;:::i;:::-;;:::i;28607:340::-;;;;;;;;;;-1:-1:-1;28607:340:0;;;;;:::i;:::-;;:::i;30829:279::-;;;;;;;;;;-1:-1:-1;30829:279:0;;;;;:::i;:::-;;:::i;45791:310::-;;;;;;;;;;-1:-1:-1;45791:310:0;;;;;:::i;:::-;;:::i;24405:47::-;;;;;;;;;;-1:-1:-1;24405:47:0;;;;;;;;;;;;;;;;;;17288:25:1;;;17344:2;17329:18;;17322:34;;;;17399:14;17392:22;17372:18;;;17365:50;17276:2;17261:18;24405:47:0;17092:329:1;22160:34:0;;;;;;;;;;-1:-1:-1;22160:34:0;;;;-1:-1:-1;;;;;22160:34:0;;;;;;-1:-1:-1;;;;;9449:32:1;;;9431:51;;9419:2;9404:18;22160:34:0;9285:203:1;46319:103:0;;;;;;;;;;-1:-1:-1;46319:103:0;;;;;:::i;:::-;46374:4;46409:5;-1:-1:-1;;;;;46398:16:0;;;46409:5;;46398:16;;46319:103;44712:94;;;;;;;;;;-1:-1:-1;44712:94:0;;22685:1;20070:36:1;;20058:2;20043:18;44712:94:0;19928:184:1;29909:94:0;;;;;;;;;;-1:-1:-1;29909:94:0;;;;;:::i;:::-;;:::i;23176:39::-;;;;;;;;;;-1:-1:-1;23176:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34361:299;;;;;;;;;;-1:-1:-1;34361:299:0;;;;;:::i;:::-;;:::i;29275:389::-;;;;;;;;;;-1:-1:-1;29275:389:0;;;;;:::i;:::-;;:::i;30701:120::-;;;;;;;;;;-1:-1:-1;30701:120:0;;;;;:::i;:::-;;:::i;34955:174::-;;;;;;;;;;-1:-1:-1;34955:174:0;;;;;:::i;:::-;;:::i;46109:202::-;;;;;;;;;;-1:-1:-1;46236:12:0;;46276:19;;46109:202;;;17013:25:1;;;-1:-1:-1;;;;;46276:19:0;;;:27;17069:2:1;17054:18;;17047:34;16986:18;46109:202:0;16839:248:1;46703:177:0;;;;;;;;;;-1:-1:-1;46703:177:0;;;;;:::i;:::-;;:::i;:::-;;;;17981:25:1;;;18037:2;18022:18;;18015:34;;;;18065:18;;;18058:34;18123:2;18108:18;;18101:34;17968:3;17953:19;46703:177:0;17750:391:1;31823:167:0;;;;;;;;;;-1:-1:-1;31823:167:0;;;;;:::i;:::-;;:::i;32454:417::-;;;;;;;;;;-1:-1:-1;32454:417:0;;;;;:::i;:::-;;:::i;23129:40::-;;;;;;;;;;-1:-1:-1;23129:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45122:119;;;;;;;;;;-1:-1:-1;45122:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;45215:18:0;45188:7;45215:18;;;:9;:18;;;;;;;45122:119;27858:276;;;;;;;;;;;;;:::i;46545:150::-;;;;;;;;;;-1:-1:-1;46545:150:0;;;;;:::i;:::-;;:::i;24514:20::-;;;;;;;;;;-1:-1:-1;24514:20:0;;;;;;;;;;;;;;;-1:-1:-1;;;24514:20:0;;;;;-1:-1:-1;;;24514:20:0;;;;;32266:180;;;;;;;;;;-1:-1:-1;32266:180:0;;;;;:::i;:::-;;:::i;32883:427::-;;;;;;;;;;-1:-1:-1;32883:427:0;;;;;:::i;:::-;;:::i;46888:169::-;;;;;;;;;;-1:-1:-1;46888:169:0;;;;;:::i;:::-;;:::i;29672:109::-;;;;;;;;;;-1:-1:-1;29672:109:0;;;;;:::i;:::-;;:::i;29789:112::-;;;;;;;;;;-1:-1:-1;29789:112:0;;;;;:::i;:::-;;:::i;45022:92::-;;;;;;;;;;-1:-1:-1;45074:7:0;45101:5;-1:-1:-1;;;;;45101:5:0;45022:92;;22901:43;;;;;;;;;;-1:-1:-1;22901:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22090:20;;;;;;;;;;-1:-1:-1;22090:20:0;;;;-1:-1:-1;;;;;22090:20:0;;;44814:98;;;;;;;;;;-1:-1:-1;44897:7:0;;;;;;;;;;;;-1:-1:-1;;;44897:7:0;;;;44814:98;;24337:29;;;;;;;;;;-1:-1:-1;24337:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11913:14:1;;11906:22;11888:41;;11972:14;;11965:22;11960:2;11945:18;;11938:50;12036:4;12024:17;;;12004:18;;;11997:45;;;;12078:17;12073:2;12058:18;;12051:45;11875:3;11860:19;24337:29:0;11677:425:1;33907:135:0;;;;;;;;;;-1:-1:-1;33907:135:0;;;;;:::i;:::-;;:::i;34050:303::-;;;;;;;;;;-1:-1:-1;34050:303:0;;;;;:::i;:::-;;:::i;22730:22::-;;;;;;;;;;-1:-1:-1;22730:22:0;;;;-1:-1:-1;;;22730:22:0;;;;;;22201:19;;;;;;;;;;-1:-1:-1;22201:19:0;;;;-1:-1:-1;;;;;22201:19:0;;;45628:155;;;;;;;;;;-1:-1:-1;45628:155:0;;;;;:::i;:::-;;:::i;30199:494::-;;;;;;;;;;-1:-1:-1;30199:494:0;;;;;:::i;:::-;;:::i;31116:288::-;;;;;;;;;;-1:-1:-1;31116:288:0;;;;;:::i;:::-;;:::i;24287:43::-;;;;;;;;;;-1:-1:-1;24287:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18439:25:1;;;18495:2;18480:18;;18473:34;;;;18523:18;;;18516:34;;;;18598:4;18586:17;;;18581:2;18566:18;;18559:45;18648:14;18641:22;18635:3;18620:19;;18613:51;18708:14;18701:22;18695:3;18680:19;;18673:51;18768:14;18761:22;18755:3;18740:19;;18733:51;18426:3;18411:19;24287:43:0;18146:644:1;28142:127:0;;;;;;;;;;-1:-1:-1;28142:127:0;;;;;:::i;:::-;;:::i;35412:253::-;;;;;;;;;;-1:-1:-1;35412:253:0;;;;;:::i;:::-;;:::i;24241:39::-;;;;;;;;;;-1:-1:-1;24241:39:0;;;;-1:-1:-1;;;;;24241:39:0;;;22316:50;;;;;;;;;;;;22357:9;22316:50;;28955:312;;;;;;;;;;-1:-1:-1;28955:312:0;;;;;:::i;:::-;;:::i;47065:97::-;;;;;;;;;;;;;:::i;22117:36::-;;;;;;;;;;-1:-1:-1;22117:36:0;;;;-1:-1:-1;;;;;22117:36:0;;;24459:20;;;;;;;;;;-1:-1:-1;24459:20:0;;;;;;;;;;;;;;;-1:-1:-1;;;24459:20:0;;;;;-1:-1:-1;;;24459:20:0;;;;;45249:147;;;;;;;;;;-1:-1:-1;45249:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;45360:19:0;;;45333:7;45360:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;45249:147;34668:280;;;;;;;;;;-1:-1:-1;34668:280:0;;;;;:::i;:::-;;:::i;47170:116::-;;;;;;;;;;-1:-1:-1;47170:116:0;;;;;:::i;:::-;;:::i;31998:260::-;;;;;;;;;;-1:-1:-1;31998:260:0;;;;;:::i;:::-;;:::i;22695:28::-;;;;;;;;;;-1:-1:-1;22695:28:0;;;;-1:-1:-1;;;22695:28:0;;;;;;28277:132;;;;;;;;;;-1:-1:-1;28277:132:0;;;;;:::i;:::-;;:::i;47294:93::-;;;;;;;;;;;;;:::i;24486:21::-;;;;;;;;;;-1:-1:-1;24486:21:0;;;;;;;;;;;;;;;-1:-1:-1;;;24486:21:0;;;;;-1:-1:-1;;;24486:21:0;;;;;27408:438;;;;;;;;;;-1:-1:-1;27408:438:0;;;;;:::i;:::-;;:::i;31412:403::-;;;;;;;;;;-1:-1:-1;31412:403:0;;;;;:::i;:::-;;:::i;24202:32::-;;;;;;;;;;-1:-1:-1;24202:32:0;;;;-1:-1:-1;;;;;24202:32:0;;;33318:419;;;;;;;;;;-1:-1:-1;33318:419:0;;;;;:::i;:::-;;:::i;46430:107::-;;;;;;;;;;-1:-1:-1;46430:107:0;;;;;:::i;:::-;;:::i;22759:23::-;;;;;;;;;;-1:-1:-1;22759:23:0;;;;-1:-1:-1;;;22759:23:0;;;;;;33746:153;;;;;;;;;;-1:-1:-1;33746:153:0;;;;;:::i;:::-;;:::i;45404:216::-;45508:10;45479:4;45496:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;45496:32:0;;;;;;;;;;:41;;;45553:37;45479:4;;45496:32;;45553:37;;;;45531:6;15818:25:1;;15806:2;15791:18;;15672:177;45553:37:0;;;;;;;;-1:-1:-1;45608:4:0;45404:216;;;;;:::o;35137:267::-;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;;;;;;;;;35268:11:::1;::::0;:128:::1;::::0;-1:-1:-1;;;35268:128:0;;::::1;::::0;::::1;17628:25:1::0;;;17669:18;;;17662:34;;;17712:18;;;17705:34;;;-1:-1:-1;;;;;35268:11:0;;::::1;::::0;:35:::1;::::0;17601:18:1;;35268:128:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35137:267:::0;;;:::o;30011:180::-;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;30099:21:::1;30089:6;:31;;30081:40;;;::::0;::::1;;30136:11;;;;;;;;;-1:-1:-1::0;;;;;30136:11:0::1;-1:-1:-1::0;;;;;30136:19:0::1;;30163:6;30136:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;30132:52:::0;::::1;30011:180:::0;:::o;28607:340::-;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;28718:3:::1;28698:16;:23;;28690:32;;;::::0;::::1;;28793:19;::::0;28753:21:::1;::::0;-1:-1:-1;;;;;28793:19:0::1;28785:99;28870:3;28838:28;28850:16:::0;28753:21;28838:28:::1;:::i;:::-;28837:36;;;;:::i;:::-;28785:99;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;28911:28:0::1;28923:16:::0;28911:9;:28:::1;:::i;:::-;28895:12;;:44;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;28607:340:0:o;30829:279::-;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;30933:1:::1;30922:7;:12;;:31;;;;;30949:4;30938:7;:15;;30922:31;30914:40;;;::::0;::::1;;31029:7;31016;31000:12;;:24;;;;:::i;:::-;30999:38;;;;:::i;:::-;30965:19;:72:::0;;;31053:47:::1;::::0;15818:25:1;;;31053:47:0::1;::::0;15806:2:1;15791:18;31053:47:0::1;;;;;;;;30829:279:::0;;:::o;45791:310::-;-1:-1:-1;;;;;45912:19:0;;45891:4;45912:19;;;:11;:19;;;;;;;;45932:10;45912:31;;;;;;;;-1:-1:-1;;45912:52:0;45908:126;;-1:-1:-1;;;;;45981:19:0;;;;;;:11;:19;;;;;;;;46001:10;45981:31;;;;;;;:41;;46016:6;;45981:19;:41;;46016:6;;45981:41;:::i;:::-;;;;-1:-1:-1;;45908:126:0;46053:40;46067:6;46075:9;46086:6;46053:13;:40::i;:::-;46046:47;;45791:310;;;;;;:::o;29909:94::-;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;29974:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;29974:21:0::1;-1:-1:-1::0;;;;29974:21:0;;::::1;::::0;;;::::1;::::0;;29909:94::o;34361:299::-;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;34479:12:::1;:26:::0;::::1;::::0;;;::::1;::::0;::::1;34466:39:::0;;::::1;;;34458:48;;;::::0;::::1;;34517:12;:37:::0;;-1:-1:-1;;34565:37:0;34517;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;34565:37:0;;;;;;::::1;;::::0;;;::::1;-1:-1:-1::0;;34613:39:0::1;34517:37;34613:39:::0;::::1;;::::0;;;::::1;;::::0;;34361:299::o;29275:389::-;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;29409:7:::1;:14;29389:9;:16;:34;29381:68;;;::::0;-1:-1:-1;;;29381:68:0;;14401:2:1;29381:68:0::1;::::0;::::1;14383:21:1::0;14440:2;14420:18;;;14413:30;-1:-1:-1;;;14459:18:1;;;14452:51;14520:18;;29381:68:0::1;14199:345:1::0;29381:68:0::1;29465:7;29460:197;29482:9;:16;29478:1;:20;;;29460:197;;;29553:7;29561:1;29553:10;;;;;;;;;;:::i;:::-;;;;;;;29528:21;29538:10;-1:-1:-1::0;;;;;45215:18:0;45188:7;45215:18;;;:9;:18;;;;;;;45122:119;29528:21:::1;:35;;29520:44;;;::::0;::::1;;29579:66;29594:10;29606:9;29616:1;29606:12;;;;;;;;;;:::i;:::-;;;;;;;22685:1;29631:2;:13;;;;:::i;:::-;29620:7;29628:1;29620:10;;;;;;;;;;:::i;:::-;;;;;;;:24;;;;:::i;:::-;29579:14;:66::i;:::-;-1:-1:-1::0;29500:3:0;::::1;::::0;::::1;:::i;:::-;;;;29460:197;;;;29275:389:::0;;:::o;30701:120::-;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;30775:28;:38;;-1:-1:-1;;30775:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;30701:120::o;34955:174::-;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;35030:36;:47;;;::::1;;::::0;::::1;-1:-1:-1::0;;35030:47:0;;::::1;;::::0;;35093:28:::1;::::0;::::1;::::0;::::1;::::0;35069:8;11650:14:1;11643:22;11625:41;;11613:2;11598:18;;11485:187;35093:28:0::1;;;;;;;;34955:174:::0;:::o;46703:177::-;46829:11;;:43;;-1:-1:-1;;;46829:43:0;;-1:-1:-1;;;;;9449:32:1;;;46829:43:0;;;9431:51:1;46775:7:0;;;;;;;;46829:11;;:30;;9404:18:1;;46829:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46822:50;;;;;;;;46703:177;;;;;:::o;31823:167::-;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31906:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;;;;:28;;-1:-1:-1;;31906:28:0::1;::::0;::::1;;::::0;;::::1;::::0;;;31950:32;;10186:51:1;;;10253:18;;;10246:50;31950:32:0::1;::::0;10159:18:1;31950:32:0::1;10018:284:1::0;32454:417:0;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;32628:7:::1;:16:::0;-1:-1:-1;;;32628:16:0;::::1;;;32610:14:::0;32579:28:::1;32595:12:::0;32579:13;:28:::1;:::i;:::-;:45;;;;:::i;:::-;:65;;;;32571:74;;;::::0;::::1;;32666:197;;;;;;;;32701:13;32666:197;;;;;;32742:12;32666:197;;;;;;32784:14;32666:197;;;;;;32839:12;32823:13;:28;;;;:::i;:::-;32666:197;::::0;;::::1;::::0;;;32656:207;;:7:::1;:207:::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;32656:207:0;;;;;;;;;;::::1;::::0;;;::::1;;-1:-1:-1::0;;32656:207:0;-1:-1:-1;;;32656:207:0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;32656:207:0;;;;;-1:-1:-1;;;32656:207:0;;;::::1;;;::::0;;-1:-1:-1;;;32454:417:0:o;27858:276::-;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;27938:5:::1;27929::::0;;-1:-1:-1;;;;;27929:5:0;;::::1;27917:18:::0;;:11:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;27917:26:0;;::::1;::::0;;;27970:5;;;::::1;27954:22:::0;;:15:::1;:22:::0;;;;;:30;;;::::1;::::0;;28004:5;;;::::1;27995:15:::0;;:8:::1;:15:::0;;;;;:23;;;::::1;::::0;;28044:5;;;;::::1;28029:21:::0;;:14:::1;:21:::0;;;;;;:29;;;;::::1;::::0;;;28070:18;;-1:-1:-1;;;;;;28070:18:0::1;::::0;;28104:20;::::1;::::0;27938:5;28104:20:::1;27858:276::o:0;46545:150::-;46607:8;46604:33;;-1:-1:-1;46623:14:0;;;;46604:33;46652:11;;:24;;-1:-1:-1;;;;;;46652:24:0;;;;;15818:25:1;;;-1:-1:-1;;;;;46652:11:0;;;;:19;;15791:18:1;;46652:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30011:180:0;:::o;32266:::-;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32354:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;;;;;:32;;-1:-1:-1;;32354:32:0::1;::::0;::::1;;::::0;;::::1;::::0;;;32402:36;;10186:51:1;;;10253:18;;;10246:50;32402:36:0::1;::::0;10159:18:1;32402:36:0::1;10018:284:1::0;32883:427:0;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;33062:7:::1;:16:::0;-1:-1:-1;;;33062:16:0;::::1;;;33044:14:::0;33013:28:::1;33029:12:::0;33013:13;:28:::1;:::i;:::-;:45;;;;:::i;:::-;:65;;;;33005:74;;;::::0;::::1;;33105:197;;;;;;;;33140:13;33105:197;;;;;;33181:12;33105:197;;;;;;33223:14;33105:197;;;;;;33278:12;33262:13;:28;;;;:::i;:::-;33105:197;::::0;;::::1;::::0;;;33090:212;;:12:::1;:212:::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;33090:212:0;;;;;;;;;;::::1;::::0;;;::::1;;-1:-1:-1::0;;33090:212:0;-1:-1:-1;;;33090:212:0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;33090:212:0;;;;;-1:-1:-1;;;33090:212:0;;;::::1;;;::::0;;-1:-1:-1;;;32883:427:0:o;46888:169::-;47010:11;;:39;;-1:-1:-1;;;47010:39:0;;-1:-1:-1;;;;;9449:32:1;;;47010:39:0;;;9431:51:1;46956:7:0;;;;;;;;47010:11;;:26;;9404:18:1;;47010:39:0;9285:203:1;29672:109:0;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29749:14:0;;;::::1;;::::0;;;:7:::1;:14;::::0;;;;:24;;-1:-1:-1;;29749:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29672:109::o;29789:112::-;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29867:16:0;;;::::1;;::::0;;;:8:::1;:16;::::0;;;;:26;;-1:-1:-1;;29867:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29789:112::o;33907:135::-;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;33973:10:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;33973:21:0::1;-1:-1:-1::0;;33973:21:0;;::::1;;::::0;;34010:24:::1;::::0;::::1;::::0;::::1;::::0;33986:8;11650:14:1;11643:22;11625:41;;11613:2;11598:18;;11485:187;34050:303:0;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;34165:21:::1;:46:::0;;-1:-1:-1;;;;;34165:46:0;;::::1;-1:-1:-1::0;;;;;;34165:46:0;;::::1;::::0;::::1;::::0;;;34222:19:::1;:42:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;34280:65:::1;::::0;;9921:34:1;;;9986:2;9971:18;;9964:43;;;;34280:65:0::1;::::0;9856:18:1;34280:65:0::1;9709:304:1::0;45628:155:0;45708:4;45731:44;45745:10;45757:9;45768:6;45731:13;:44::i;30199:494::-;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;30289:1:::1;30273:12;:17;;;;30265:26;;;::::0;::::1;;30311:18:::0;;;;::::1;;;30310:19;30302:28;;;::::0;::::1;;30345:18:::0;;;;::::1;;;30341:311;;30380:19:::0;:34;;30449:15:::1;30429:17:::0;:35;30500:12:::1;30380:6;30479:33:::0;-1:-1:-1;;;;30570:30:0;;;30380:34:::1;::::0;::::1;30570:30:::0;;::::1;30615:25;::::0;::::1;::::0;;30341:311:::1;30675:10;::::0;::::1;::::0;;;::::1;30199:494:::0;:::o;31116:288::-;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;31222:1:::1;31211:7;:12;;:30;;;;;31238:3;31227:7;:14;;31211:30;31203:39;;;::::0;::::1;;31318:7;31307;31292:12;;:22;;;;:::i;:::-;31291:34;;;;:::i;:::-;31253:35:::0;:72;;;31341:55:::1;::::0;15818:25:1;;;31341:55:0::1;::::0;15806:2:1;15791:18;31341:55:0::1;15672:177:1::0;28142:127:0;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28204:19:0;::::1;;::::0;;;:14:::1;:19;::::0;;;;;;;;:26;;-1:-1:-1;;28204:26:0::1;28226:4;28204:26;::::0;;28246:15;;9431:51:1;;;28246:15:0::1;::::0;9404:18:1;28246:15:0::1;9285:203:1::0;35412:253:0;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;35519:7:::1;35512:3;:14;;;;35504:23;;;::::0;::::1;;35538:14;:20:::0;;::::1;::::0;::::1;-1:-1:-1::0;;35569:29:0;;;;;-1:-1:-1;;;35569:29:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;35614:43:::1;::::0;;19816:42:1;;;19889:2;19874:18;;19867:50;;;;35614:43:0::1;::::0;19789:18:1;35614:43:0::1;19649:274:1::0;28955:312:0;29038:10;46409:5;;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29069:20:0;::::1;::::0;;::::1;::::0;:47:::1;;-1:-1:-1::0;;;;;;29093:23:0;::::1;29111:4;29093:23;;29069:47;29061:56;;;::::0;::::1;;29155:39;::::0;-1:-1:-1;;;29155:39:0;;29188:4:::1;29155:39;::::0;::::1;9431:51:1::0;29128:24:0::1;::::0;-1:-1:-1;;;;;29155:24:0;::::1;::::0;::::1;::::0;9404:18:1;;29155:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29213:46;::::0;-1:-1:-1;;;29213:46:0;;-1:-1:-1;;;;;10507:32:1;;;29213:46:0::1;::::0;::::1;10489:51:1::0;10556:18;;;10549:34;;;29128:66:0;;-1:-1:-1;29213:23:0;;::::1;::::0;::::1;::::0;10462:18:1;;29213:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29205:54:::0;28955:312;-1:-1:-1;;;;28955:312:0:o;47065:97::-;47133:11;;:21;;;-1:-1:-1;;;47133:21:0;;;;47106:7;;-1:-1:-1;;;;;47133:11:0;;:19;;:21;;;;;;;;;;;;;;:11;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47126:28;;47065:97;:::o;34668:280::-;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;34759:29;:40;;-1:-1:-1;;34759:40:0::1;;::::0;::::1;;;;::::0;;34847:12:::1;::::0;34876:5:::1;::::0;34847:24:::1;::::0;34863:7;;34847:24:::1;:::i;:::-;34846:36;;;;:::i;:::-;34810:33:::0;:72;34898:42:::1;::::0;;12300:14:1;;12293:22;12275:41;;12347:2;12332:18;;12325:34;;;34898:42:0::1;::::0;12248:18:1;34898:42:0::1;12107:258:1::0;47170:116:0;47237:11;;:41;;-1:-1:-1;;;47237:41:0;;-1:-1:-1;;;;;9449:32:1;;;47237:41:0;;;9431:51:1;47237:11:0;;;;:28;;9404:18:1;;47237:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47170:116;:::o;31998:260::-;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;32096:9:::1;32092:159;32111:4;:11;32107:1;:15;32092:159;;;32144:36;32164:4;32169:1;32164:7;;;;;;;;:::i;:::-;;;;;;;32173:6;32144:19;:36::i;:::-;32200:39;32223:4;32228:1;32223:7;;;;;;;;:::i;:::-;;;;;;;32232:6;32200:39;;;;;;-1:-1:-1::0;;;;;10204:32:1;;;;10186:51;;10280:14;10273:22;10268:2;10253:18;;10246:50;10174:2;10159:18;;10018:284;32200:39:0::1;;;;;;;;32124:3:::0;::::1;::::0;::::1;:::i;:::-;;;;32092:159;;28277:132:::0;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28341:19:0;::::1;28363:5;28341:19:::0;;;:14:::1;:19;::::0;;;;;;;;:27;;-1:-1:-1;;28341:27:0::1;::::0;;28384:17;;9431:51:1;;;28384:17:0::1;::::0;9404:18:1;28384:17:0::1;9285:203:1::0;47294:93:0;47339:11;;:40;;-1:-1:-1;;;47339:40:0;;47368:10;47339:40;;;9431:51:1;-1:-1:-1;;;;;47339:11:0;;;;:28;;9404:18:1;;47339:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47294:93::o;27408:438::-;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;27507:5:::1;27498::::0;;-1:-1:-1;;;;;27498:5:0;;::::1;27486:18:::0;;:11:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;27486:26:0;;::::1;::::0;;;27539:5;;;::::1;27523:22:::0;;:15:::1;:22:::0;;;;;;:30;;;::::1;::::0;;27573:5;;;::::1;27564:15:::0;;:8:::1;:15:::0;;;;;;:23;;;::::1;::::0;;27613:5;;;::::1;27598:21:::0;;:14:::1;:21:::0;;;;;;:29;;;::::1;::::0;;27646:16;;::::1;::::0;;;;;;;;;:23;;;::::1;-1:-1:-1::0;27646:23:0;;::::1;::::0;;;27680:20;;;;;;:27;;;::::1;::::0;::::1;::::0;;27718:13;;;;;:20;;;::::1;::::0;::::1;::::0;;27749:11;;-1:-1:-1;;;;;;27749:11:0::1;::::0;::::1;::::0;;27771:19;;;;;;;:26;;;;::::1;::::0;;::::1;::::0;;;27813:25;;9431:51:1;;;27813:25:0::1;::::0;9404:18:1;27813:25:0::1;9285:203:1::0;31412:403:0;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31508:23:0;::::1;31526:4;31508:23;::::0;::::1;::::0;:41:::1;;-1:-1:-1::0;31545:4:0::1;::::0;-1:-1:-1;;;;;31535:14:0;;::::1;31545:4:::0;::::1;31535:14;;31508:41;31500:50;;;::::0;::::1;;-1:-1:-1::0;;;;;31561:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;:33;;-1:-1:-1;;31561:33:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;31605:150:::1;;31632:11;::::0;:31:::1;::::0;-1:-1:-1;;;31632:31:0;;-1:-1:-1;;;;;10507:32:1;;;31632:31:0::1;::::0;::::1;10489:51:1::0;31632:11:0::1;10556:18:1::0;;;10549:34;31632:11:0;;::::1;::::0;:20:::1;::::0;10462:18:1;;31632:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31605:150;;;31696:11;::::0;-1:-1:-1;;;;;31725:17:0;;::::1;31696:11;31725:17:::0;;;:9:::1;:17;::::0;;;;;;;31696:47;;-1:-1:-1;;;31696:47:0;;::::1;::::0;::::1;10489:51:1::0;;;;10556:18;;;10549:34;31696:11:0;::::1;::::0;:20:::1;::::0;10462:18:1;;31696:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31605:150;31770:37;::::0;;-1:-1:-1;;;;;10204:32:1;;10186:51;;10280:14;;10273:22;10268:2;10253:18;;10246:50;31770:37:0::1;::::0;10159:18:1;31770:37:0::1;10018:284:1::0;33318:419:0;24841:24;24854:10;24841:12;:24::i;:::-;24833:48;;;;-1:-1:-1;;;24833:48:0;;;;;;;:::i;:::-;33493:7:::1;:16:::0;-1:-1:-1;;;33493:16:0;::::1;;;33475:14:::0;33444:28:::1;33460:12:::0;33444:13;:28:::1;:::i;:::-;:45;;;;:::i;:::-;:65;;;;33436:74;;;::::0;::::1;;33532:197;;;;;;;;33567:13;33532:197;;;;;;33608:12;33532:197;;;;;;33650:14;33532:197;;;;;;33705:12;33689:13;:28;;;;:::i;:::-;33532:197;::::0;;::::1;::::0;;;33521:208;;:8:::1;:208:::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;33521:208:0;;;;;;;;;;::::1;::::0;;;::::1;;-1:-1:-1::0;;33521:208:0;-1:-1:-1;;;33521:208:0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;33521:208:0;;;;;-1:-1:-1;;;33521:208:0;;;::::1;;;::::0;;-1:-1:-1;;;33318:419:0:o;46430:107::-;-1:-1:-1;;;;;46510:19:0;46486:4;46510:19;;;:14;:19;;;;;;;;;46430:107::o;33746:153::-;46374:4;46409:5;-1:-1:-1;;;;;46409:5:0;24752:10;46398:16;24736:38;;;;-1:-1:-1;;;24736:38:0;;;;;;;:::i;:::-;33835:7:::1;:16:::0;::::1;-1:-1:-1::0;;;33835:16:0;;::::1;::::0;::::1;33822:29:::0;;::::1;;;33814:38;;;::::0;::::1;;33863:7;:28:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;33863:28:0::1;-1:-1:-1::0;;;;33863:28:0;;::::1;::::0;;;::::1;::::0;;33746:153::o;36475:1862::-;36589:24;;36568:4;;36589:24;;;;;36585:105;;;36637:41;36652:6;36660:9;36671:6;36637:14;:41::i;:::-;36630:48;;;;36585:105;-1:-1:-1;;;;;36709:19:0;;;;;;:11;:19;;;;;;;;36708:20;36700:29;;;;;;-1:-1:-1;;;;;36749:22:0;;;;;;:11;:22;;;;;;;;36748:23;36740:32;;;;;;36786:25;36793:6;36801:9;36786:6;:25::i;:::-;36783:1156;;;36831:18;;;;;;;36827:45;;36851:21;36865:6;36851:13;:21::i;:::-;36890:18;;;;;;;:50;;;;-1:-1:-1;36912:28:0;;;;36890:50;36887:1041;;;-1:-1:-1;;;;;36964:26:0;;;;;;:15;:26;;;;;;;;36960:238;;37032:19;:31;37022:41;;;;;:113;;-1:-1:-1;37100:35:0;;37090:6;37067:20;37077:9;-1:-1:-1;;;;;45215:18:0;45188:7;45215:18;;;:9;:18;;;;;;;45122:119;37067:20;:29;;;;:::i;:::-;:68;;37022:113;37014:164;;;;-1:-1:-1;;;37014:164:0;;13644:2:1;37014:164:0;;;13626:21:1;13683:2;13663:18;;;13656:30;13722:34;13702:18;;;13695:62;-1:-1:-1;;;13773:18:1;;;13766:36;13819:19;;37014:164:0;13442:402:1;37014:164:0;-1:-1:-1;;;;;37220:15:0;;;;;;:7;:15;;;;;;;;:47;;;;-1:-1:-1;37260:6:0;;-1:-1:-1;;;;;37239:28:0;;;37260:6;;37239:28;;37220:47;:74;;;;-1:-1:-1;;;;;;37272:22:0;;;;;;:11;:22;;;;;;;;37271:23;37220:74;:109;;;;-1:-1:-1;37298:12:0;:31;;;37220:109;37216:555;;;-1:-1:-1;;;;;37362:19:0;;;;;;:8;:19;;;;;;37384:15;-1:-1:-1;37354:46:0;;;;;;37464:12;:25;37445:45;;37464:25;;;;;37445:15;:45;:::i;:::-;-1:-1:-1;;;;;37423:19:0;;;;;;:8;:19;;;;;:67;37216:555;;;-1:-1:-1;;;;;37521:15:0;;;;;;:7;:15;;;;;;;;37520:16;:40;;;;-1:-1:-1;;;;;;37541:19:0;;;;;;:11;:19;;;;;;;;37540:20;37520:40;:76;;;;-1:-1:-1;37564:12:0;:32;;;;;;37520:76;37516:255;;;-1:-1:-1;;;;;37628:16:0;;;;;;:8;:16;;;;;;37648:15;-1:-1:-1;37628:35:0;37620:44;;;;;;37725:12;:25;37706:45;;37725:25;;;;;37706:15;:45;:::i;:::-;-1:-1:-1;;;;;37687:16:0;;;;;;:8;:16;;;;;:64;37516:255;37795:18;;;;;;;:45;;;;-1:-1:-1;37817:23:0;;;;;;;37795:45;37792:121;;;37864:29;37883:9;37864:18;:29::i;:::-;37955:16;:14;:16::i;:::-;37951:59;;;37988:10;:8;:10::i;:::-;38025:18;;;;;;;:38;;;;-1:-1:-1;38047:16:0;;-1:-1:-1;;;38047:16:0;;;;38025:38;38022:119;;;38083:11;;38103:14;;38083:35;;-1:-1:-1;;;;;;38083:35:0;;38103:14;;;;38083:35;;;19596:42:1;-1:-1:-1;;;;;38083:11:0;;;;:19;;19569:18:1;;38083:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38079:51;;38153:22;38178:21;38192:6;38178:13;:21::i;:::-;:67;;38239:6;38178:67;;;38202:34;38210:6;38218:9;38229:6;38202:7;:34::i;:::-;38153:92;;38256:49;38271:6;38279:9;38290:14;38256;:49::i;:::-;-1:-1:-1;38325:4:0;;36475:1862;-1:-1:-1;;;;;36475:1862:0:o;38345:568::-;-1:-1:-1;;;;;38475:17:0;;38438:4;38475:17;;;:9;:17;;;;;;:26;;38495:6;;38475:26;:::i;:::-;-1:-1:-1;;;;;38455:17:0;;;;;;;:9;:17;;;;;;:46;;;;38535:20;;;;;;;:29;;38558:6;;38535:29;:::i;:::-;-1:-1:-1;;;;;38512:20:0;;;;;;;:9;:20;;;;;;;:52;;;;38580:35;;;;;;;;;;38608:6;15818:25:1;;15806:2;15791:18;;15672:177;38580:35:0;;;;;;;;-1:-1:-1;;;;;38631:24:0;;;;;;:16;:24;;;;;;;;38626:120;;38676:11;;-1:-1:-1;;;;;38705:17:0;;;38676:11;38705:17;;;:9;:17;;;;;;;;38676:47;;-1:-1:-1;;;38676:47:0;;;;;10489:51:1;;;;10556:18;;;10549:34;38676:11:0;;;:20;;10462:18:1;;38676:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38672:63;;-1:-1:-1;;;;;38761:27:0;;;;;;:16;:27;;;;;;;;38756:128;;38809:11;;-1:-1:-1;;;;;38841:20:0;;;38809:11;38841:20;;;:9;:20;;;;;;;;38809:53;;-1:-1:-1;;;38809:53:0;;;;;10489:51:1;;;;10556:18;;;10549:34;38809:11:0;;;:20;;10462:18:1;;38809:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38805:68;;-1:-1:-1;38901:4:0;38345:568;;;;;:::o;44169:234::-;44257:11;44253:132;;;-1:-1:-1;;;;;44285:20:0;;;;;;:11;:20;;;;;:27;;-1:-1:-1;;44285:27:0;44308:4;44285:27;;;44169:234;;:::o;44253:132::-;-1:-1:-1;;;;;;44345:20:0;44368:5;44345:20;;;:11;:20;;;;;:28;;-1:-1:-1;;44345:28:0;;;44169:234::o;36052:415::-;36116:4;46409:5;;-1:-1:-1;;;;;46398:16:0;;;46409:5;;46398:16;36140:14;:43;;;;-1:-1:-1;46374:4:0;46409:5;-1:-1:-1;;;;;46398:16:0;;;46409:5;;46398:16;36171:12;36140:43;:78;;;;-1:-1:-1;36213:5:0;;-1:-1:-1;;;;;36213:5:0;36200:9;:18;;36140:78;:114;;;;;36236:18;36249:4;36236:12;:18::i;:::-;36235:19;36140:114;:148;;;;;36272:16;36285:2;36272:12;:16::i;:::-;36271:17;36140:148;:180;;;;-1:-1:-1;;;;;;36306:14:0;;;;;;:8;:14;;;;;;;;36305:15;36140:180;:210;;;;-1:-1:-1;;;;;;36338:12:0;;;;;;:8;:12;;;;;;;;36337:13;36140:210;:248;;;;-1:-1:-1;;;;;;36367:21:0;;36381:6;36367:21;;36140:248;:281;;;;-1:-1:-1;;;;;;36405:16:0;;;;36140:281;:319;;;;-1:-1:-1;;;;;;;;36438:21:0;36454:4;36438:21;;;36052:415::o;38921:148::-;38993:18;;;;;;;;:42;;;39015:20;39028:6;39015:12;:20::i;:::-;38985:76;;;;-1:-1:-1;;;38985:76:0;;14051:2:1;38985:76:0;;;14033:21:1;14090:2;14070:18;;;14063:30;-1:-1:-1;;;14109:18:1;;;14102:51;14170:18;;38985:76:0;13849:345:1;43746:329:0;43832:19;;:6;43811:18;43854:12;;43811:40;;43832:19;;;;;43811:40;:::i;:::-;:55;:123;;43925:9;44122:23;:31;;-1:-1:-1;;44122:31:0;;;44083:78;43925:9;43811:123;;;43879:34;43899:7;43908:4;43879:19;:34::i;:::-;43948:23;;;;;;;43945:123;;;43987:20;:22;;;;;;;;:20;:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44024:25:0;-1:-1:-1;44024:25:0;;;:16;:25;;;;;:32;;-1:-1:-1;;44024:32:0;-1:-1:-1;44024:32:0;;;43746:329::o;40630:377::-;3781:10;40679:4;40717:21;;;:7;:21;;;;;;;;40716:22;:64;;;;-1:-1:-1;40756:24:0;;;;;;;40755:25;40716:64;:110;;;;-1:-1:-1;40797:29:0;;;;;;;40716:110;:205;;;;-1:-1:-1;40891:30:0;;40862:26;;:59;;40891:30;;;40862:59;:::i;:::-;40843:15;:78;;40716:205;:283;;;;-1:-1:-1;;40966:33:0;;40956:4;40938:24;;;;:9;:24;;;;;;:61;;;40630:377::o;41016:2722::-;24604:24;:31;;-1:-1:-1;;24604:31:0;;;;;41094:15:::1;41065:26:::0;:44;41169:33;;24604:17;41124:41;:78:::1;::::0;::::1;::::0;:118:::1;;-1:-1:-1::0;41206:36:0;;;;::::1;;;41124:118;41120:2611;;;41304:33:::0;;:17:::1;41259:78:::0;;:41:::1;::::0;:78:::1;::::0;41304:33;;41259:78:::1;:::i;:::-;::::0;;;-1:-1:-1;;41378:33:0;;41352:23:::1;::::0;41378:37:::1;::::0;41414:1:::1;::::0;41378:37:::1;:::i;:::-;41456:16;::::0;;41470:1:::1;41456:16:::0;;;;;::::1;::::0;;41352:63;;-1:-1:-1;41432:21:0::1;::::0;41456:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;41456:16:0::1;41432:40;;41505:4;41487;41492:1;41487:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41487:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;41535:6:::1;::::0;:13:::1;::::0;;-1:-1:-1;;;41535:13:0;;;;:6;;;::::1;::::0;:11:::1;::::0;:13:::1;::::0;;::::1;::::0;41487:7;;41535:13;;;;;:6;:13;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41525:4;41530:1;41525:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41525:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;41627:6:::1;::::0;:215:::1;::::0;-1:-1:-1;;;41627:215:0;;41589:21:::1;::::0;41627:6;;;::::1;::::0;:57:::1;::::0;:215:::1;::::0;41703:15;;41565:21:::1;::::0;41757:4;;41788::::1;::::0;41812:15:::1;::::0;41627:215:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41859:17;41904:13;41879:21;:39;;;;:::i;:::-;41935:6;::::0;;42100:21;41935:235:::1;::::0;-1:-1:-1;;;41935:235:0;;42002:4:::1;41935:235;::::0;::::1;11214:34:1::0;11264:18;;;11257:34;;;41935:6:0::1;11307:18:1::0;;;11300:34;;;11350:18;;;11343:34;-1:-1:-1;;;;;42100:21:0;;::::1;11393:19:1::0;;;11386:44;42140:15:0::1;11446:19:1::0;;;11439:35;41859:59:0;;-1:-1:-1;41935:6:0::1;::::0;:22:::1;::::0;41859:59;;11148:19:1;;41935:235:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;42192:39:0::1;::::0;;17013:25:1;;;17069:2;17054:18;;17047:34;;;42192:39:0::1;::::0;-1:-1:-1;16986:18:1;42192:39:0::1;;;;;;;41244:999;;;;41120:2611;;;42288:16;::::0;;42302:1:::1;42288:16:::0;;;;;::::1;::::0;;42264:21:::1;::::0;42288:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;42288:16:0::1;42264:40;;42337:4;42319;42324:1;42319:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42319:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;42367:6:::1;::::0;:13:::1;::::0;;-1:-1:-1;;;42367:13:0;;;;:6;;;::::1;::::0;:11:::1;::::0;:13:::1;::::0;;::::1;::::0;42319:7;;42367:13;;;;;:6;:13;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42357:4;42362:1;42357:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42357:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;42459:6:::1;::::0;42535:33;;42459:233:::1;::::0;-1:-1:-1;;;42459:233:0;;42421:21:::1;::::0;42459:6;;;::::1;::::0;:57:::1;::::0;:233:::1;::::0;42397:21:::1;::::0;42607:4;;42638::::1;::::0;42662:15:::1;::::0;42459:233:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42709:17;42754:13;42729:21;:39;;;;:::i;:::-;42928:8;:17:::0;42909:7:::1;:16:::0;42709:59;;-1:-1:-1;42785:25:0::1;::::0;42909:36:::1;::::0;42928:17:::1;-1:-1:-1::0;;;42928:17:0;;;::::1;::::0;::::1;::::0;42909:16;;;::::1;;:36;:::i;:::-;42866:8;:20:::0;42844:7:::1;:19:::0;42813:133:::1;::::0;;::::1;::::0;42844:42:::1;::::0;42866:20;;;;::::1;::::0;::::1;::::0;42844:19:::1;;:42;:::i;:::-;42814:73;::::0;::::1;;:9:::0;:73:::1;:::i;:::-;42813:133;;;;:::i;:::-;43112:8;:17:::0;43093:7:::1;:16:::0;42785:161;;-1:-1:-1;42963:27:0::1;::::0;43093:36:::1;::::0;43112:17:::1;-1:-1:-1::0;;;43112:17:0;;;::::1;::::0;::::1;::::0;43093:16;;;::::1;;:36;:::i;:::-;43048:8;:22:::0;43024:7:::1;:21:::0;42993:137:::1;::::0;;::::1;::::0;43024:46:::1;::::0;-1:-1:-1;;;43048:22:0;;;::::1;::::0;::::1;::::0;43024:21:::1;;:46;:::i;:::-;42994:77;::::0;::::1;;:9:::0;:77:::1;:::i;:::-;42993:137;;;;:::i;:::-;43150:11;::::0;42963:167;;-1:-1:-1;;;;43150:11:0;::::1;;;43147:497;;;43186:11;;;;;;;;;-1:-1:-1::0;;;;;43186:11:0::1;-1:-1:-1::0;;;;;43186:19:0::1;;43213;43186:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;-1:-1:-1::0;43293:19:0::1;::::0;43285:76:::1;::::0;43266:13:::1;::::0;-1:-1:-1;;;;;43293:19:0::1;::::0;43351:5:::1;::::0;43327:17;;43266:13;43285:76;43266:13;43285:76;43327:17;43293:19;43351:5;43285:76:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43265:96;;;43383:8;43380:46;;;43409:17;43393:12;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43380:46:0::1;43163:279;43147:497;;;43495:19;::::0;43487:76:::1;::::0;43468:13:::1;::::0;-1:-1:-1;;;;;43495:19:0::1;::::0;43553:5:::1;::::0;43529:17;;43468:13;43487:76;43468:13;43487:76;43529:17;43495:19;43553:5;43487:76:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43467:96;;;43585:8;43582:46;;;43611:17;43595:12;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43582:46:0::1;43448:196;43147:497;43674:33:::0;;43665:54:::1;::::0;;17013:25:1;;;17069:2;17054:18;;17047:34;;;43665:54:0::1;::::0;16986:18:1;43665:54:0::1;;;;;;;42249:1482;;;;;41120:2611;24658:24:::0;:32;;-1:-1:-1;;24658:32:0;;;41016:2722::o;39077:128::-;39163:10;;39139:4;;-1:-1:-1;;;39163:10:0;;;;:34;;;;-1:-1:-1;;;;;;;39178:19:0;;;;;:11;:19;;;;;;;;39177:20;;39077:128::o;39213:1409::-;-1:-1:-1;;;;;39322:21:0;;39298:7;39322:21;;;:11;:21;;;;;;;;39318:67;;;-1:-1:-1;39367:6:0;39360:13;;39318:67;39417:17;;:28;;39437:8;39417:28;:::i;:::-;39398:15;:47;;:70;;;;-1:-1:-1;39449:19:0;;-1:-1:-1;;;39449:19:0;;;;39398:70;39395:316;;;39495:162;;;;;;;;39534:1;39495:162;;39567:1;39495:162;;;;39602:1;39495:162;;;;;;;39632:9;39495:162;;;;;39484:8;:173;;-1:-1:-1;;39484:173:0;;;;;39672:19;:27;;-1:-1:-1;;39672:27:0;;;39395:316;-1:-1:-1;;;;;39724:17:0;;;;;;:7;:17;;;;;;;;39721:242;;;39781:8;:17;39770:8;:28;;-1:-1:-1;;;;39770:28:0;-1:-1:-1;;;39781:17:0;;;;;;39770:28;;;;;;;;;39721:242;;;-1:-1:-1;;;;;39828:15:0;;;;;;:7;:15;;;;;;;;39825:138;;;39870:7;:16;39859:8;:27;;-1:-1:-1;;;;39859:27:0;-1:-1:-1;;;39870:16:0;;;;;;39859:27;;;;;;;;;39825:138;;;39930:12;:21;39919:8;:32;;-1:-1:-1;;;;39919:32:0;-1:-1:-1;;;39930:21:0;;;;;;39919:32;;;;;;;;;39825:138;39994:6;:18;39978:12;:34;39975:78;;;40028:8;:13;;-1:-1:-1;;;;40028:13:0;;;;;39975:78;40097:14;;;-1:-1:-1;;;40097:14:0;;;;;40076:17;;-1:-1:-1;;;40085:8:0;;;;40076:6;:17;:::i;:::-;40075:36;;;;:::i;:::-;40063:9;:48;40128:36;;;;;;;40124:395;;;40328:8;:21;40305:7;:20;:44;;40328:21;;;;;40305:20;:44;:::i;:::-;40283:8;:17;40264:7;:16;:36;;40283:17;-1:-1:-1;;;40283:17:0;;;;;;;40264:16;;;;;:36;:::i;:::-;40263:87;;;;:::i;:::-;40236:8;:21;40213:7;:20;40199:152;;;;;40213:44;;40236:21;;;40213:20;:44;:::i;:::-;40200:58;;:9;;:58;;;;:::i;:::-;40199:152;;;;:::i;:::-;40181:15;:170;40385:6;:18;40369:12;:34;40366:66;;;40423:9;;40405:15;:27;40366:66;40492:15;;40447:17;:60;;:41;;:60;;40492:15;;40447:60;:::i;:::-;;;;-1:-1:-1;;40124:395:0;40529:48;40544:6;40560:4;40567:9;;40529:14;:48::i;:::-;-1:-1:-1;40605:9:0;;40596:18;;:6;:18;:::i;14:748:1:-;68:5;121:3;114:4;106:6;102:17;98:27;88:55;;139:1;136;129:12;88:55;175:6;162:20;201:4;225:60;241:43;281:2;241:43;:::i;:::-;225:60;:::i;:::-;307:3;331:2;326:3;319:15;359:2;354:3;350:12;343:19;;394:2;386:6;382:15;446:3;441:2;435;432:1;428:10;420:6;416:23;412:32;409:41;406:61;;;463:1;460;453:12;406:61;485:1;495:238;509:2;506:1;503:9;495:238;;;580:3;567:17;597:31;622:5;597:31;:::i;:::-;641:18;;679:12;;;;711;;;;527:1;520:9;495:238;;;-1:-1:-1;751:5:1;;14:748;-1:-1:-1;;;;;;;14:748:1:o;767:159::-;834:20;;894:6;883:18;;873:29;;863:57;;916:1;913;906:12;863:57;767:159;;;:::o;931:156::-;997:20;;1057:4;1046:16;;1036:27;;1026:55;;1077:1;1074;1067:12;1092:247;1151:6;1204:2;1192:9;1183:7;1179:23;1175:32;1172:52;;;1220:1;1217;1210:12;1172:52;1259:9;1246:23;1278:31;1303:5;1278:31;:::i;1344:251::-;1414:6;1467:2;1455:9;1446:7;1442:23;1438:32;1435:52;;;1483:1;1480;1473:12;1435:52;1515:9;1509:16;1534:31;1559:5;1534:31;:::i;1860:388::-;1928:6;1936;1989:2;1977:9;1968:7;1964:23;1960:32;1957:52;;;2005:1;2002;1995:12;1957:52;2044:9;2031:23;2063:31;2088:5;2063:31;:::i;:::-;2113:5;-1:-1:-1;2170:2:1;2155:18;;2142:32;2183:33;2142:32;2183:33;:::i;:::-;2235:7;2225:17;;;1860:388;;;;;:::o;2253:456::-;2330:6;2338;2346;2399:2;2387:9;2378:7;2374:23;2370:32;2367:52;;;2415:1;2412;2405:12;2367:52;2454:9;2441:23;2473:31;2498:5;2473:31;:::i;:::-;2523:5;-1:-1:-1;2580:2:1;2565:18;;2552:32;2593:33;2552:32;2593:33;:::i;:::-;2253:456;;2645:7;;-1:-1:-1;;;2699:2:1;2684:18;;;;2671:32;;2253:456::o;2714:382::-;2779:6;2787;2840:2;2828:9;2819:7;2815:23;2811:32;2808:52;;;2856:1;2853;2846:12;2808:52;2895:9;2882:23;2914:31;2939:5;2914:31;:::i;:::-;2964:5;-1:-1:-1;3021:2:1;3006:18;;2993:32;3034:30;2993:32;3034:30;:::i;3101:315::-;3169:6;3177;3230:2;3218:9;3209:7;3205:23;3201:32;3198:52;;;3246:1;3243;3236:12;3198:52;3285:9;3272:23;3304:31;3329:5;3304:31;:::i;:::-;3354:5;3406:2;3391:18;;;;3378:32;;-1:-1:-1;;;3101:315:1:o;3421:1149::-;3539:6;3547;3600:2;3588:9;3579:7;3575:23;3571:32;3568:52;;;3616:1;3613;3606:12;3568:52;3656:9;3643:23;3685:18;3726:2;3718:6;3715:14;3712:34;;;3742:1;3739;3732:12;3712:34;3765:61;3818:7;3809:6;3798:9;3794:22;3765:61;:::i;:::-;3755:71;;3845:2;3835:12;;3900:2;3889:9;3885:18;3872:32;3929:2;3919:8;3916:16;3913:36;;;3945:1;3942;3935:12;3913:36;3968:24;;;-1:-1:-1;4023:4:1;4015:13;;4011:27;-1:-1:-1;4001:55:1;;4052:1;4049;4042:12;4001:55;4088:2;4075:16;4111:60;4127:43;4167:2;4127:43;:::i;4111:60::-;4193:3;4217:2;4212:3;4205:15;4245:2;4240:3;4236:12;4229:19;;4276:2;4272;4268:11;4324:7;4319:2;4313;4310:1;4306:10;4302:2;4298:19;4294:28;4291:41;4288:61;;;4345:1;4342;4335:12;4288:61;4367:1;4358:10;;4377:163;4391:2;4388:1;4385:9;4377:163;;;4448:17;;4436:30;;4409:1;4402:9;;;;;4486:12;;;;4518;;4377:163;;;4381:3;4559:5;4549:15;;;;;;;3421:1149;;;;;:::o;4575:477::-;4665:6;4673;4726:2;4714:9;4705:7;4701:23;4697:32;4694:52;;;4742:1;4739;4732:12;4694:52;4782:9;4769:23;4815:18;4807:6;4804:30;4801:50;;;4847:1;4844;4837:12;4801:50;4870:61;4923:7;4914:6;4903:9;4899:22;4870:61;:::i;:::-;4860:71;;;4981:2;4970:9;4966:18;4953:32;4994:28;5016:5;4994:28;:::i;5057:241::-;5113:6;5166:2;5154:9;5145:7;5141:23;5137:32;5134:52;;;5182:1;5179;5172:12;5134:52;5221:9;5208:23;5240:28;5262:5;5240:28;:::i;5303:245::-;5370:6;5423:2;5411:9;5402:7;5398:23;5394:32;5391:52;;;5439:1;5436;5429:12;5391:52;5471:9;5465:16;5490:28;5512:5;5490:28;:::i;5553:446::-;5622:6;5630;5638;5691:2;5679:9;5670:7;5666:23;5662:32;5659:52;;;5707:1;5704;5697:12;5659:52;5746:9;5733:23;5765:28;5787:5;5765:28;:::i;:::-;5812:5;-1:-1:-1;5869:2:1;5854:18;;5841:32;5882:30;5841:32;5882:30;:::i;:::-;5931:7;-1:-1:-1;5957:36:1;5989:2;5974:18;;5957:36;:::i;:::-;5947:46;;5553:446;;;;;:::o;6004:309::-;6069:6;6077;6130:2;6118:9;6109:7;6105:23;6101:32;6098:52;;;6146:1;6143;6136:12;6098:52;6185:9;6172:23;6204:28;6226:5;6204:28;:::i;6318:184::-;6376:6;6429:2;6417:9;6408:7;6404:23;6400:32;6397:52;;;6445:1;6442;6435:12;6397:52;6468:28;6486:9;6468:28;:::i;6507:328::-;6581:6;6589;6597;6650:2;6638:9;6629:7;6625:23;6621:32;6618:52;;;6666:1;6663;6656:12;6618:52;6689:28;6707:9;6689:28;:::i;:::-;6679:38;;6736:37;6769:2;6758:9;6754:18;6736:37;:::i;:::-;6726:47;;6792:37;6825:2;6814:9;6810:18;6792:37;:::i;6840:180::-;6899:6;6952:2;6940:9;6931:7;6927:23;6923:32;6920:52;;;6968:1;6965;6958:12;6920:52;-1:-1:-1;6991:23:1;;6840:180;-1:-1:-1;6840:180:1:o;7025:184::-;7095:6;7148:2;7136:9;7127:7;7123:23;7119:32;7116:52;;;7164:1;7161;7154:12;7116:52;-1:-1:-1;7187:16:1;;7025:184;-1:-1:-1;7025:184:1:o;7214:248::-;7282:6;7290;7343:2;7331:9;7322:7;7318:23;7314:32;7311:52;;;7359:1;7356;7349:12;7311:52;-1:-1:-1;;7382:23:1;;;7452:2;7437:18;;;7424:32;;-1:-1:-1;7214:248:1:o;7467:316::-;7544:6;7552;7560;7613:2;7601:9;7592:7;7588:23;7584:32;7581:52;;;7629:1;7626;7619:12;7581:52;-1:-1:-1;;7652:23:1;;;7722:2;7707:18;;7694:32;;-1:-1:-1;7773:2:1;7758:18;;;7745:32;;7467:316;-1:-1:-1;7467:316:1:o;7788:306::-;7876:6;7884;7892;7945:2;7933:9;7924:7;7920:23;7916:32;7913:52;;;7961:1;7958;7951:12;7913:52;7990:9;7984:16;7974:26;;8040:2;8029:9;8025:18;8019:25;8009:35;;8084:2;8073:9;8069:18;8063:25;8053:35;;7788:306;;;;;:::o;8099:368::-;8196:6;8204;8212;8220;8273:3;8261:9;8252:7;8248:23;8244:33;8241:53;;;8290:1;8287;8280:12;8241:53;-1:-1:-1;;8313:16:1;;8369:2;8354:18;;8348:25;8413:2;8398:18;;8392:25;8457:2;8442:18;;;8436:25;8313:16;;8348:25;;-1:-1:-1;8436:25:1;;-1:-1:-1;8099:368:1;-1:-1:-1;8099:368:1:o;8472:411::-;8536:6;8544;8597:2;8585:9;8576:7;8572:23;8568:32;8565:52;;;8613:1;8610;8603:12;8565:52;8652:9;8639:23;8702:10;8695:5;8691:22;8684:5;8681:33;8671:61;;8728:1;8725;8718:12;8888:182;8945:6;8998:2;8986:9;8977:7;8973:23;8969:32;8966:52;;;9014:1;9011;9004:12;8966:52;9037:27;9054:9;9037:27;:::i;12840:597::-;12952:4;12981:2;13010;12999:9;12992:21;13042:6;13036:13;13085:6;13080:2;13069:9;13065:18;13058:34;13110:1;13120:140;13134:6;13131:1;13128:13;13120:140;;;13229:14;;;13225:23;;13219:30;13195:17;;;13214:2;13191:26;13184:66;13149:10;;13120:140;;;13278:6;13275:1;13272:13;13269:91;;;13348:1;13343:2;13334:6;13323:9;13319:22;13315:31;13308:42;13269:91;-1:-1:-1;13421:2:1;13400:15;-1:-1:-1;;13396:29:1;13381:45;;;;13428:2;13377:54;;12840:597;-1:-1:-1;;;12840:597:1:o;14549:329::-;14751:2;14733:21;;;14790:1;14770:18;;;14763:29;-1:-1:-1;;;14823:2:1;14808:18;;14801:36;14869:2;14854:18;;14549:329::o;14883:335::-;15085:2;15067:21;;;15124:2;15104:18;;;15097:30;-1:-1:-1;;;15158:2:1;15143:18;;15136:41;15209:2;15194:18;;14883:335::o;15854:980::-;16116:4;16164:3;16153:9;16149:19;16195:6;16184:9;16177:25;16221:2;16259:6;16254:2;16243:9;16239:18;16232:34;16302:3;16297:2;16286:9;16282:18;16275:31;16326:6;16361;16355:13;16392:6;16384;16377:22;16430:3;16419:9;16415:19;16408:26;;16469:2;16461:6;16457:15;16443:29;;16490:1;16500:195;16514:6;16511:1;16508:13;16500:195;;;16579:13;;-1:-1:-1;;;;;16575:39:1;16563:52;;16670:15;;;;16635:12;;;;16611:1;16529:9;16500:195;;;-1:-1:-1;;;;;;;16751:32:1;;;;16746:2;16731:18;;16724:60;-1:-1:-1;;;16815:3:1;16800:19;16793:35;16712:3;15854:980;-1:-1:-1;;;15854:980:1:o;20117:275::-;20188:2;20182:9;20253:2;20234:13;;-1:-1:-1;;20230:27:1;20218:40;;20288:18;20273:34;;20309:22;;;20270:62;20267:88;;;20335:18;;:::i;:::-;20371:2;20364:22;20117:275;;-1:-1:-1;20117:275:1:o;20397:183::-;20457:4;20490:18;20482:6;20479:30;20476:56;;;20512:18;;:::i;:::-;-1:-1:-1;20557:1:1;20553:14;20569:4;20549:25;;20397:183::o;20585:224::-;20624:3;20652:6;20685:2;20682:1;20678:10;20715:2;20712:1;20708:10;20746:3;20742:2;20738:12;20733:3;20730:21;20727:47;;;20754:18;;:::i;:::-;20790:13;;20585:224;-1:-1:-1;;;;20585:224:1:o;20814:128::-;20854:3;20885:1;20881:6;20878:1;20875:13;20872:39;;;20891:18;;:::i;:::-;-1:-1:-1;20927:9:1;;20814:128::o;20947:217::-;20987:1;21013;21003:132;;21057:10;21052:3;21048:20;21045:1;21038:31;21092:4;21089:1;21082:15;21120:4;21117:1;21110:15;21003:132;-1:-1:-1;21149:9:1;;20947:217::o;21169:422::-;21258:1;21301:5;21258:1;21315:270;21336:7;21326:8;21323:21;21315:270;;;21395:4;21391:1;21387:6;21383:17;21377:4;21374:27;21371:53;;;21404:18;;:::i;:::-;21454:7;21444:8;21440:22;21437:55;;;21474:16;;;;21437:55;21553:22;;;;21513:15;;;;21315:270;;;21319:3;21169:422;;;;;:::o;21596:140::-;21654:5;21683:47;21724:4;21714:8;21710:19;21704:4;21790:5;21820:8;21810:80;;-1:-1:-1;21861:1:1;21875:5;;21810:80;21909:4;21899:76;;-1:-1:-1;21946:1:1;21960:5;;21899:76;21991:4;22009:1;22004:59;;;;22077:1;22072:130;;;;21984:218;;22004:59;22034:1;22025:10;;22048:5;;;22072:130;22109:3;22099:8;22096:17;22093:43;;;22116:18;;:::i;:::-;-1:-1:-1;;22172:1:1;22158:16;;22187:5;;21984:218;;22286:2;22276:8;22273:16;22267:3;22261:4;22258:13;22254:36;22248:2;22238:8;22235:16;22230:2;22224:4;22221:12;22217:35;22214:77;22211:159;;;-1:-1:-1;22323:19:1;;;22355:5;;22211:159;22402:34;22427:8;22421:4;22402:34;:::i;:::-;22472:6;22468:1;22464:6;22460:19;22451:7;22448:32;22445:58;;;22483:18;;:::i;:::-;22521:20;;21741:806;-1:-1:-1;;;21741:806:1:o;22552:168::-;22592:7;22658:1;22654;22650:6;22646:14;22643:1;22640:21;22635:1;22628:9;22621:17;22617:45;22614:71;;;22665:18;;:::i;:::-;-1:-1:-1;22705:9:1;;22552:168::o;22725:125::-;22765:4;22793:1;22790;22787:8;22784:34;;;22798:18;;:::i;:::-;-1:-1:-1;22835:9:1;;22725:125::o;22855:135::-;22894:3;-1:-1:-1;;22915:17:1;;22912:43;;;22935:18;;:::i;:::-;-1:-1:-1;22982:1:1;22971:13;;22855:135::o;22995:175::-;23032:3;23076:4;23069:5;23065:16;23105:4;23096:7;23093:17;23090:43;;;23113:18;;:::i;:::-;23162:1;23149:15;;22995:175;-1:-1:-1;;22995:175:1:o;23175:127::-;23236:10;23231:3;23227:20;23224:1;23217:31;23267:4;23264:1;23257:15;23291:4;23288:1;23281:15;23307:127;23368:10;23363:3;23359:20;23356:1;23349:31;23399:4;23396:1;23389:15;23423:4;23420:1;23413:15;23439:127;23500:10;23495:3;23491:20;23488:1;23481:31;23531:4;23528:1;23521:15;23555:4;23552:1;23545:15;23571:131;-1:-1:-1;;;;;23646:31:1;;23636:42;;23626:70;;23692:1;23689;23682:12;23707:118;23793:5;23786:13;23779:21;23772:5;23769:32;23759:60;;23815:1;23812;23805:12

Swarm Source

ipfs://b40af97b1703cba216db56558488359d7aa03b63053dc6720471121d0b964230

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

OVERVIEW

Defi 4.0 is here. Apex offers sustainable $ETH rewards from 3 different sources. Mining as a service & NFTs as a service.

Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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