ETH Price: $2,514.95 (-0.56%)

Contract

0xAB8F447FbBCa82FcCC05B8eee6882395d1a87407
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Distributor ...162115502022-12-18 12:22:59620 days ago1671366179IN
0xAB8F447F...5d1a87407
0 ETH0.0004114.22607522
Set Distributor ...162115442022-12-18 12:21:47620 days ago1671366107IN
0xAB8F447F...5d1a87407
0 ETH0.0004048614.04155408
Set Distributor ...162115342022-12-18 12:19:47620 days ago1671365987IN
0xAB8F447F...5d1a87407
0 ETH0.0004225814.65641891
Approve162084002022-12-18 1:49:23621 days ago1671328163IN
0xAB8F447F...5d1a87407
0 ETH0.0005924412.73263852
Approve162008642022-12-17 0:34:23622 days ago1671237263IN
0xAB8F447F...5d1a87407
0 ETH0.0007120415.30282489
Approve162006142022-12-16 23:44:11622 days ago1671234251IN
0xAB8F447F...5d1a87407
0 ETH0.0011298424.28218052
Approve161993772022-12-16 19:33:59622 days ago1671219239IN
0xAB8F447F...5d1a87407
0 ETH0.0007792516.74729379
Set Distributor ...161993742022-12-16 19:33:23622 days ago1671219203IN
0xAB8F447F...5d1a87407
0 ETH0.0004851316.82552758
Approve161992152022-12-16 19:01:23622 days ago1671217283IN
0xAB8F447F...5d1a87407
0 ETH0.0009283319.96625402
Approve161990682022-12-16 18:31:59622 days ago1671215519IN
0xAB8F447F...5d1a87407
0 ETH0.0010449422.45739172
Set Distributor ...161988232022-12-16 17:42:47622 days ago1671212567IN
0xAB8F447F...5d1a87407
0 ETH0.000825728.62546099
Set Distributor ...161987262022-12-16 17:23:23622 days ago1671211403IN
0xAB8F447F...5d1a87407
0 ETH0.0009136831.67561571
Set Distributor ...161987202022-12-16 17:22:11622 days ago1671211331IN
0xAB8F447F...5d1a87407
0 ETH0.0009924334.41996429
Approve161987192022-12-16 17:21:59622 days ago1671211319IN
0xAB8F447F...5d1a87407
0 ETH0.0015130532.51773386
Set Distributor ...161987142022-12-16 17:20:59622 days ago1671211259IN
0xAB8F447F...5d1a87407
0 ETH0.0008598529.82173465
Approve161987062022-12-16 17:19:23622 days ago1671211163IN
0xAB8F447F...5d1a87407
0 ETH0.0014083130.26674897
Set Distributor ...161987012022-12-16 17:18:23622 days ago1671211103IN
0xAB8F447F...5d1a87407
0 ETH0.0008614429.86474759
Approve161986772022-12-16 17:13:23622 days ago1671210803IN
0xAB8F447F...5d1a87407
0 ETH0.0014911432.04702491
Approve161986592022-12-16 17:09:47622 days ago1671210587IN
0xAB8F447F...5d1a87407
0 ETH0.0011242224.17946274
Approve161986592022-12-16 17:09:47622 days ago1671210587IN
0xAB8F447F...5d1a87407
0 ETH0.001171625.17946274
Approve161986572022-12-16 17:09:23622 days ago1671210563IN
0xAB8F447F...5d1a87407
0 ETH0.0011880625.55262393
Manual Send161986542022-12-16 17:08:47622 days ago1671210527IN
0xAB8F447F...5d1a87407
0 ETH0.0008529226.20118365
Approve161986492022-12-16 17:07:47622 days ago1671210467IN
0xAB8F447F...5d1a87407
0 ETH0.0012732427.39159397
Approve161986482022-12-16 17:07:35622 days ago1671210455IN
0xAB8F447F...5d1a87407
0 ETH0.0012908227.76262204
Approve161986462022-12-16 17:07:11622 days ago1671210431IN
0xAB8F447F...5d1a87407
0 ETH0.0012870927.6825065
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
161986542022-12-16 17:08:47622 days ago1671210527
0xAB8F447F...5d1a87407
0.24562075 ETH
161985462022-12-16 16:47:11622 days ago1671209231
0xAB8F447F...5d1a87407
0.03209076 ETH
161985462022-12-16 16:47:11622 days ago1671209231
0xAB8F447F...5d1a87407
0.04278769 ETH
161985292022-12-16 16:43:47622 days ago1671209027
0xAB8F447F...5d1a87407
0.00427876 ETH
161985292022-12-16 16:43:47622 days ago1671209027
0xAB8F447F...5d1a87407
0.03423015 ETH
161985292022-12-16 16:43:47622 days ago1671209027
0xAB8F447F...5d1a87407
0.04278769 ETH
161985242022-12-16 16:42:47622 days ago1671208967
0xAB8F447F...5d1a87407
0.00427876 ETH
161985242022-12-16 16:42:47622 days ago1671208967
0xAB8F447F...5d1a87407
0.03423015 ETH
161985242022-12-16 16:42:47622 days ago1671208967
0xAB8F447F...5d1a87407
0.04278769 ETH
161985232022-12-16 16:42:35622 days ago1671208955
0xAB8F447F...5d1a87407
0.00427876 ETH
161985232022-12-16 16:42:35622 days ago1671208955
0xAB8F447F...5d1a87407
0.03423015 ETH
161985232022-12-16 16:42:35622 days ago1671208955
0xAB8F447F...5d1a87407
0.04278769 ETH
161985222022-12-16 16:42:23622 days ago1671208943
0xAB8F447F...5d1a87407
0.00427876 ETH
161985222022-12-16 16:42:23622 days ago1671208943
0xAB8F447F...5d1a87407
0.03423015 ETH
161985222022-12-16 16:42:23622 days ago1671208943
0xAB8F447F...5d1a87407
0.04278769 ETH
161985002022-12-16 16:37:59622 days ago1671208679
0xAB8F447F...5d1a87407
0.00461701 ETH
161985002022-12-16 16:37:59622 days ago1671208679
0xAB8F447F...5d1a87407
0.03693609 ETH
161985002022-12-16 16:37:59622 days ago1671208679
0xAB8F447F...5d1a87407
0.04617011 ETH
161984932022-12-16 16:36:35622 days ago1671208595
0xAB8F447F...5d1a87407
0.00383629 ETH
161984932022-12-16 16:36:35622 days ago1671208595
0xAB8F447F...5d1a87407
0.04987178 ETH
161984932022-12-16 16:36:35622 days ago1671208595
0xAB8F447F...5d1a87407
0.05754436 ETH
161984812022-12-16 16:34:11622 days ago1671208451
0xAB8F447F...5d1a87407
0.00282095 ETH
161984812022-12-16 16:34:11622 days ago1671208451
0xAB8F447F...5d1a87407
0.0366724 ETH
161984812022-12-16 16:34:11622 days ago1671208451
0xAB8F447F...5d1a87407
0.0423143 ETH
161984792022-12-16 16:33:47622 days ago1671208427
0xAB8F447F...5d1a87407
0.00302134 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SmartTools

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-16
*/

// SPDX-License-Identifier: MIT

/**
Website:
http://smarttoolserc.com

Telegram Group:
https://t.me/SmartToolsERC

Announcement:
https://t.me/SmartToolsNews

Twitter:
https://twitter.com/SmartToolsERC

Medium:
https://medium.com/@SmartToolsERC

Reddit:
https://www.reddit.com/user/SmartToolsERC
*/

pragma solidity ^0.8.7;
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;
    }
}

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

/**
 * Allows for contract ownership for multiple adressess
 */
abstract contract Auth {
    address internal owner;
    mapping (address => bool) internal authorizations;

    constructor(address _owner) {
        owner = _owner;
        authorizations[_owner] = true;
    }

    /**
     * Function modifier to require caller to be contract owner
     */
    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER"); _;
    }

    /**
     * Function modifier to require caller to be authorized
     */
    modifier authorized() {
        require(isAuthorized(msg.sender), "!AUTHORIZED"); _;
    }

    /**
     * Authorize address. Owner only
     */
    function authorize(address account) public onlyOwner {
        authorizations[account] = true;
    }

    /**
     * Remove address authorization. Owner only
     */
    function unauthorize(address account) public onlyOwner {
        authorizations[account] = false;
    }

    /**
     * Check if address is owner
     */
    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    /**
     * Return address authorization status
     */
    function isAuthorized(address account) public view returns (bool) {
        return authorizations[account];
    }

    /**
     * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized
     */
    function transferOwnership(address payable account) public onlyOwner {
        owner = account;
        authorizations[account] = true;
        emit OwnershipTransferred(account);
    }

    event OwnershipTransferred(address owner);
}

/* Standard IDEXFactory */
interface IDEXFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

/* Standard IDEXRouter */
interface IDEXRouter {
    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 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 for the DividendDistributor */
interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function deposit() external payable;
    function process(uint256 gas) external;
}

/* Our DividendDistributor contract responsible for distributing the earn token */
contract DividendDistributor is IDividendDistributor {
    using SafeMath for uint256;

    address _token;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }

    // EARN 
    IBEP20 USDT = IBEP20(0xdAC17F958D2ee523a2206206994597C13D831ec7); 
    address WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    IDEXRouter router;

    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 = 30 * 60;
    uint256 public minDistribution = 1 * (10 ** 12);

    uint256 currentIndex;

    bool initialized;
    modifier initialization() {
        require(!initialized);
        _;
        initialized = true;
    }

    modifier onlyToken() {
        require(msg.sender == _token); _;
    }

    constructor (address _router) {
        router = _router != address(0)
            ? IDEXRouter(_router)
            : IDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _token = msg.sender;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
    }

    function setShare(address shareholder, uint256 amount) external override onlyToken {
        if(shares[shareholder].amount > 0){
            distributeDividend(shareholder);
        }

        if(amount > 0 && shares[shareholder].amount == 0){
            addShareholder(shareholder);
        }else if(amount == 0 && shares[shareholder].amount > 0){
            removeShareholder(shareholder);
        }

        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function deposit() external payable override onlyToken {
        uint256 balanceBefore = USDT.balanceOf(address(this));

        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(USDT);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}(
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amount = USDT.balanceOf(address(this)).sub(balanceBefore);

        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
    }

    function process(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        uint256 iterations = 0;

        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount){
                currentIndex = 0;
            }

            if(shouldDistribute(shareholders[currentIndex])){
                distributeDividend(shareholders[currentIndex]);
            }

            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
    }
    
    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);
            USDT.transfer(shareholder, amount);
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
        }
    }
    
    function claimDividend(address shareholder) external onlyToken{
        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();
    }
}

/* Token contract */
contract  SmartTools is IBEP20, Auth {
    using SafeMath for uint256;

    // Addresses
    address USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7; 
    address WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;
    address DEV =  0xaF2b9620dAe505cAcCd24506787B2Fc807295031;

    // These are owner by default
    address private  autoLiquidityReceiver;
    address private  marketingFeeReceiver;

    // Name and symbol
    string constant _name = "Smart Tools";
    string constant _symbol = "SMART";
    uint8 constant _decimals = 18;

    // Total supply
    uint256 _totalSupply = 1000000000 * (10 ** _decimals); 

    // Max wallet and TX
    uint256 public   _maxBuyTxAmount = _totalSupply * 100 / 1000; 
    uint256 public _maxSellTxAmount = _totalSupply * 100 / 1000; 
    uint256 public _maxWalletToken = ( _totalSupply * 100 ) / 1000; 

    // Mappings
    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) _allowances;
    mapping (address => bool) private Launching;
    bool private LaunchingEnabled = true;
    mapping (address => bool) isFeeExempt;
    mapping (address => bool) isTxLimitExempt;
    mapping (address => bool) isTimelockExempt;
    mapping (address => bool) isDividendExempt;
    mapping (address => bool) private isBlacklisted;
    
    // Buy Fees
    uint256 public  LiquidityFeeBuy = 1; 
    uint256 public buybackFeeBuy = 1;
    uint256 private reflectionFeeBuy = 0;
    uint256 public marketingFeeBuy = 2;
    uint256 private treasuryFeeBuy = 0;
    uint256 public  totalFeeBuy = 4;

    // Sell fees
    uint256 public LiquidityFeeSell = 1;
    uint256 public buybackFeeSell = 1;
    uint256 private reflectionFeeSell = 0;
    uint256 public marketingFeeSell = 2;
    uint256 private treasuryFeeSell = 0;
    uint256 public  totalFeeSell = 4;

    // Fee variables
    uint256 liquidityFee;
    uint256 buybackFee;
    uint256 reflectionFee;
    uint256 marketingFee;
    uint256 devFee;
    uint256 totalFee;
    uint256 feeDenominator = 100;

    // GREED
    uint256 GREEDTriggeredAt;
    uint256 GREEDDuration = 3600;
    
    // Dead blocks
    uint256 deadBlocks = 3;

    // Sell amount of tokens when a sell takes place
    uint256 private swapThreshold = _totalSupply * 20 / 10000; // 2% of supply

    // Liquidity
    uint256 targetLiquidity = 20;
    uint256 targetLiquidityDenominator = 100;

    // Buyback settings
    uint256 buybackMultiplierNumerator = 200;
    uint256 buybackMultiplierDenominator = 100;
    uint256 buybackMultiplierTriggeredAt;
    uint256 buybackMultiplierLength = 30 minutes;

    bool private autoBuybackEnabled = false;
    bool private autoBuybackMultiplier = false;
    uint256 autoBuybackCap;
    uint256 autoBuybackAccumulator;
    uint256 autoBuybackAmount;
    uint256 autoBuybackBlockPeriod;
    uint256 autoBuybackBlockLast;

    DividendDistributor distributor;
    uint256 distributorGas = 500000;

    // Cooldown & timer functionality
    bool private buyCooldownEnabled = false;
    uint8 private cooldownTimerInterval = 30;
    mapping (address => uint) private cooldownTimer;

    // Other variables
    IDEXRouter public router;
    address public pair;
    uint256 private launchedAt;
    bool private DCGMembers = false;
    bool public tradingOpen = false;
    bool public swapEnabled = true;
    bool inSwap;
    modifier swapping() { inSwap = true; _; inSwap = false; }

    /* Token constructor */
    constructor () Auth(msg.sender) {

        router = IDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IDEXFactory(router.factory()).createPair(WETH, address(this));
        _allowances[address(this)][address(router)] = type(uint256).max;

        distributor = new DividendDistributor(address(router));
        
        // Should be the owner wallet/token distributor
        address _presaler = msg.sender;
        isFeeExempt[_presaler] = true;
        isTxLimitExempt[_presaler] = true;
        
        // No timelock for these people
        isTimelockExempt[msg.sender] = true;
        isTimelockExempt[DEAD] = true;
        isTimelockExempt[address(this)] = true;
        isTimelockExempt[DEV] = true;
        
        // Exempt from dividend
        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;

        // Set the marketing and liq receiver to the owner as default
        autoLiquidityReceiver = msg.sender;
        marketingFeeReceiver = 0xaF2b9620dAe505cAcCd24506787B2Fc807295031;

        _balances[_presaler] = _totalSupply;
        emit Transfer(address(0), _presaler, _totalSupply);
    }

    receive() external payable { }

    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 approveMax(address spender) external returns (bool) {
        return approve(spender, type(uint256).max);
    }

    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] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");
        }
        return _transferFrom(sender, recipient, amount);
    }

     function launch(bool _DCGMembers) external authorized {
        require(!tradingOpen && _DCGMembers);
        tradingOpen = true;
        LaunchingEnabled = false;
        launchedAt = block.number;
    }
    // settting the max wallet in percentages
    // NOTE: 1% = 100
     function setMaxWalletPercent(uint256 maxWallPercent) external onlyOwner() {
        _maxWalletToken = _totalSupply.mul(maxWallPercent).div(10000);

    }

    // Main transfer function
    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        if(!launched() && recipient == pair){ require(_balances[sender] > 0); launch(); }
        
        if(inSwap){ return _basicTransfer(sender, recipient, amount); }

        // Check if trading is enabled
        if(!authorizations[sender] && !authorizations[recipient] && !Launching[recipient]){
            require(tradingOpen,"Trading not enabled yet");
        }

        // Check if address is blacklisted
        require(!isBlacklisted[recipient] && !isBlacklisted[sender], 'Address is blacklisted');

        // Check if buying or selling
        bool isSell = recipient == pair; 

        // Set buy or sell fees
        setCorrectFees(isSell);

        // Check max wallet
        checkMaxWallet(sender, recipient, amount);
   
        // Buycooldown 
        checkBuyCooldown(sender, recipient);

        // Checks maxTx
        checkTxLimit(sender, amount, recipient, isSell);

        // Check if we are in GREEDTime
        bool GREEDMode = inGREEDTime();

        // Check if we should do the swapback
        if(shouldSwapBack()){ swapBack(); }

        //Exchange tokens
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");

        uint256 amountReceived = shouldTakeFee(sender) ? takeFee(sender, amount, isSell, GREEDMode) : amount;
        _balances[recipient] = _balances[recipient].add(amountReceived);

        // Dividend tracker
        if(!isDividendExempt[sender]) {
            try distributor.setShare(sender, _balances[sender]) {} catch {}
        }

        if(!isDividendExempt[recipient]) {
            try distributor.setShare(recipient, _balances[recipient]) {} catch {} 
        }

        try distributor.process(distributorGas) {} catch {}

        emit Transfer(sender, recipient, amountReceived);
        return true;
    }

    // Do a normal transfer
    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
        return true;
    }

    // Set the correct fees for buying or selling
    function setCorrectFees(bool isSell) internal {
        if(isSell){
            liquidityFee = LiquidityFeeSell;
            buybackFee = buybackFeeSell;
            reflectionFee = reflectionFeeSell;
            marketingFee = marketingFeeSell;
            devFee = treasuryFeeSell;
            totalFee = totalFeeSell;
        } else {
            liquidityFee = LiquidityFeeBuy;
            buybackFee = buybackFeeBuy;
            reflectionFee = reflectionFeeBuy;
            marketingFee = marketingFeeBuy;
            devFee = treasuryFeeBuy;
            totalFee = totalFeeBuy;
        }
    }

    // Check if we are in GREED time
    function inGREEDTime() public view returns (bool){
        if(GREEDTriggeredAt.add(GREEDDuration) > block.timestamp){
            return true;
        } else {
            return false;
        }
    }


    // Check for maxTX
    function checkTxLimit(address sender, uint256 amount, address recipient, bool isSell) internal view {
        if (recipient != owner){
            if(isSell){
                require(amount <= _maxSellTxAmount || isTxLimitExempt[sender] || isTxLimitExempt[recipient], "TX Limit Exceeded");
            } else {
                require(amount <= _maxBuyTxAmount || isTxLimitExempt[sender] || isTxLimitExempt[recipient], "TX Limit Exceeded");
            }
        }
    }

    // Check buy cooldown
    function checkBuyCooldown(address sender, address recipient) internal {
        if (sender == pair &&
            buyCooldownEnabled &&
            !isTimelockExempt[recipient]) {
            require(cooldownTimer[recipient] < block.timestamp,"Please wait between two buys");
            cooldownTimer[recipient] = block.timestamp + cooldownTimerInterval;
        }
    }

    // Check maxWallet
    function checkMaxWallet(address sender, address recipient, uint256 amount) internal view {
        if (!authorizations[sender] && recipient != owner && recipient != address(this)  && recipient != address(DEAD) && recipient != pair && recipient != marketingFeeReceiver && recipient != autoLiquidityReceiver && recipient != DEV){
            uint256 heldTokens = balanceOf(recipient);
            require((heldTokens + amount) <= _maxWalletToken,"Total Holding is currently limited, you can not buy that much.");
        }
    }

    // Check if sender is not feeExempt
    function shouldTakeFee(address sender) internal view returns (bool) {
        return !isFeeExempt[sender];
    }

    // Get total fee's or multiplication of fees
    function getTotalFee(bool selling) public view returns (uint256) {
        if(launchedAt + deadBlocks >= block.number){ return feeDenominator.sub(1); }
        if(selling && buybackMultiplierTriggeredAt.add(buybackMultiplierLength) > block.timestamp){ return getMultipliedFee(); }
        return totalFee;
    }

    // Get a multiplied fee when buybackMultiplier is active
    function getMultipliedFee() public view returns (uint256) {
        uint256 remainingTime = buybackMultiplierTriggeredAt.add(buybackMultiplierLength).sub(block.timestamp);
        uint256 feeIncrease = totalFee.mul(buybackMultiplierNumerator).div(buybackMultiplierDenominator).sub(totalFee);
        return totalFee.add(feeIncrease.mul(remainingTime).div(buybackMultiplierLength));
    }

    // Take the normal total Fee or the GREED Fee
    function takeFee(address sender, uint256 amount, bool isSell, bool GREEDMode) internal returns (uint256) {
        uint256 feeAmount;
        
        // Check if we are GREEDd
        if (GREEDMode){
            if(isSell){
                // We are selling so up the selling tax to 1.5x
                feeAmount = amount.mul(totalFee).mul(3).div(2).div(feeDenominator);
            } else {
                // We are buying so cut our taxes in half
                feeAmount = amount.mul(totalFee).div(2).div(feeDenominator);
            }
        } else {
            feeAmount = amount.mul(totalFee).div(feeDenominator);
        }

        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);

        return amount.sub(feeAmount);
    }

    // Check if we should sell tokens
    function shouldSwapBack() internal view returns (bool) {
        return msg.sender != pair
        && !inSwap
        && swapEnabled
        && _balances[address(this)] >= swapThreshold;
    }

    // switch Trading
    function tradingStatus(bool _status) public onlyOwner {
        tradingOpen = _status;
        launch();
    }

    // Enable GREED
    function enableGREED(uint256 _seconds) public authorized {
        GREEDTriggeredAt = block.timestamp;
        GREEDDuration = _seconds;
    }

    // Disable the GREED mode
    function disableGREED() external authorized {
        GREEDTriggeredAt = 0;
    }

    // Enable/disable cooldown between trades
    function cooldownEnabled(bool _status, uint8 _interval) public authorized {
        buyCooldownEnabled = _status;
        cooldownTimerInterval = _interval;
    }

    // Blacklist/unblacklist an address
    function Approve(address _address, bool _value) public authorized{
        isBlacklisted[_address] = _value;
    }

    // Main swapback to sell tokens for WBNB
    function swapBack() internal swapping {
        uint256 dynamicLiquidityFee = isOverLiquified(targetLiquidity, targetLiquidityDenominator) ? 0 : liquidityFee;
        uint256 amountToLiquify = swapThreshold.mul(dynamicLiquidityFee).div(totalFee).div(2);
        uint256 amountToSwap = swapThreshold.sub(amountToLiquify);

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

        uint256 balanceBefore = address(this).balance;

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );
        uint256 amountBNB = address(this).balance.sub(balanceBefore);
        uint256 totalBNBFee = totalFee.sub(dynamicLiquidityFee.div(2));
        uint256 amountBNBLiquidity = amountBNB.mul(dynamicLiquidityFee).div(totalBNBFee).div(2);
        uint256 amountBNBReflection = amountBNB.mul(reflectionFee).div(totalBNBFee);
        uint256 amountBNBMarketing = amountBNB.mul(marketingFee).div(totalBNBFee);
        uint256 amountBNBDev = amountBNB.mul(devFee).div(totalBNBFee); 


        try distributor.deposit{value: amountBNBReflection}() {} catch {}
        (bool successMarketing, /* bytes memory data */) = payable(marketingFeeReceiver).call{value: amountBNBMarketing, gas: 30000}("");
        (bool successDev, /* bytes memory data */) = payable(DEV).call{value: amountBNBDev, gas: 30000}(""); 
        require(successMarketing, "marketing receiver rejected ETH transfer");
        require(successDev, "dev receiver rejected ETH transfer");

        if(amountToLiquify > 0){
            router.addLiquidityETH{value: amountBNBLiquidity}(
                address(this),
                amountToLiquify,
                0,
                0,
                autoLiquidityReceiver,
                block.timestamp
            );
            emit AutoLiquify(amountBNBLiquidity, amountToLiquify);
        }
    }

    // Check if autoBuyback is enabled
    function shouldAutoBuyback() internal view returns (bool) {
        return msg.sender != pair
            && !inSwap
            && autoBuybackEnabled
            && autoBuybackBlockLast + autoBuybackBlockPeriod <= block.number
            && address(this).balance >= autoBuybackAmount;
    }

    // Trigger a manual buyback
    function triggerManualBuyback(uint256 amount, bool triggerBuybackMultiplier) external authorized {
        uint256 amountWithDecimals = amount * (10 ** 18);
        uint256 amountToBuy = amountWithDecimals.div(100);
        buyTokens(amountToBuy, DEAD);
        if(triggerBuybackMultiplier){
            buybackMultiplierTriggeredAt = block.timestamp;
            emit BuybackMultiplierActive(buybackMultiplierLength);
        }
    }
    
    // Stop the buyback Multiplier
    function clearBuybackMultiplier() external authorized {
        buybackMultiplierTriggeredAt = 0;
    }

    // Trigger an autobuyback
    function triggerAutoBuyback() internal {
        buyTokens(autoBuybackAmount, DEAD);
        if(autoBuybackMultiplier){
            buybackMultiplierTriggeredAt = block.timestamp;
            emit BuybackMultiplierActive(buybackMultiplierLength);
        }
        autoBuybackBlockLast = block.number;
        autoBuybackAccumulator = autoBuybackAccumulator.add(autoBuybackAmount);
        if(autoBuybackAccumulator > autoBuybackCap){ autoBuybackEnabled = false; }
    }

    // Buy amount of tokens with bnb from the contract
    function buyTokens(uint256 amount, address to) internal swapping {
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(this);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            to,
            block.timestamp
        );
    }

    // Set autobuyback settings
    function setAutoBuybackSettings(bool _enabled, uint256 _cap, uint256 _amount, uint256 _period, bool _autoBuybackMultiplier) external authorized {
        autoBuybackEnabled = _enabled;
        autoBuybackCap = _cap;
        autoBuybackAccumulator = 0;
        autoBuybackAmount = _amount;
        autoBuybackBlockPeriod = _period;
        autoBuybackBlockLast = block.number;
        autoBuybackMultiplier = _autoBuybackMultiplier;
    }

    // Set buybackmultiplier settings
    function setBuybackMultiplierSettings(uint256 numerator, uint256 denominator, uint256 length) external authorized {
        require(numerator / denominator <= 2 && numerator > denominator);
        buybackMultiplierNumerator = numerator;
        buybackMultiplierDenominator = denominator;
        buybackMultiplierLength = length;
    }

    // Check when the token is launched
    function launched() internal view returns (bool) {
        return launchedAt != 0;
    }

    // Set the launchedAt to token launch
    function launch() internal {
        launchedAt = block.number;
        swapEnabled = true;
    }

    // Set max buy TX 
    function setBuyTxLimitInPercent(uint256 maxBuyTxPercent) external authorized {
        _maxBuyTxAmount = _totalSupply.mul(maxBuyTxPercent).div(10000);
    }

    // Set max sell TX 
    function setSellTxLimitInPercent(uint256 maxSellTxPercent) external authorized {
        _maxSellTxAmount = _totalSupply.mul(maxSellTxPercent).div(10000);
    }

    // Exempt from dividend
    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]);
        }
    }

    // Exempt from fee
    function setIsFeeExempt(address holder, bool exempt) external authorized {
        isFeeExempt[holder] = exempt;
    }

    // Exempt from max TX
    function setIsTxLimitExempt(address holder, bool exempt) external authorized {
        isTxLimitExempt[holder] = exempt;
    }

    // Exempt from buy CD
    function setIsTimelockExempt(address holder, bool exempt) external authorized {
        isTimelockExempt[holder] = exempt;
    }

    // Set our buy fees
    function setBuyFees(uint256 _liquidityFeeBuy, uint256 _buybackFeeBuy, uint256 _reflectionFeeBuy, uint256 _marketingFeeBuy, uint256 _devFeeBuy, uint256 _feeDenominator) external authorized {
        LiquidityFeeBuy = _liquidityFeeBuy;
        buybackFeeBuy = _buybackFeeBuy;
        reflectionFeeBuy = _reflectionFeeBuy;
        marketingFeeBuy = _marketingFeeBuy;
        treasuryFeeBuy = _devFeeBuy;
        totalFeeBuy = _liquidityFeeBuy.add(_buybackFeeBuy).add(_reflectionFeeBuy).add(_marketingFeeBuy).add(_devFeeBuy);
        feeDenominator = _feeDenominator;
    }

    // Set our sell fees
    function setSellFees(uint256 _liquidityFeeSell, uint256 _buybackFeeSell, uint256 _reflectionFeeSell, uint256 _marketingFeeSell, uint256 _devFeeSell, uint256 _feeDenominator) external authorized {
        LiquidityFeeSell = _liquidityFeeSell;
        buybackFeeSell = _buybackFeeSell;
        reflectionFeeSell = _reflectionFeeSell;
        marketingFeeSell = _marketingFeeSell;
        treasuryFeeSell = _devFeeSell;
        totalFeeSell = _liquidityFeeSell.add(_buybackFeeSell).add(_reflectionFeeSell).add(_marketingFeeSell).add(_devFeeSell);
        feeDenominator = _feeDenominator;
    }

    // Set the marketing and liquidity receivers
    function setFeeReceivers(address _autoLiquidityReceiver, address _marketingFeeReceiver) external authorized {
        autoLiquidityReceiver = _autoLiquidityReceiver;
        marketingFeeReceiver = _marketingFeeReceiver;
    }

    // Set swapBack settings
    function setSwapBackSettings(bool _enabled, uint256 _amount) external authorized {
        swapEnabled = _enabled;
        swapThreshold = _totalSupply * _amount / 10000; 
    }

    // Set target liquidity
    function setTargetLiquidity(uint256 _target, uint256 _denominator) external authorized {
        targetLiquidity = _target;
        targetLiquidityDenominator = _denominator;
    }

    // Send BNB to marketingwallet
    function manualSend () external authorized {
        uint256 contractETHBalance = address(this).balance;
        payable(marketingFeeReceiver).transfer(contractETHBalance);
    }
    
    // Set criteria for auto distribution
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external authorized {
        distributor.setDistributionCriteria(_minPeriod, _minDistribution);
    }
    
    // Let people claim there dividend
    function claimDividend() external {
        distributor.claimDividend(msg.sender);
    }
    
    // Check how much earnings are unpaid
    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        return distributor.getUnpaidEarnings(shareholder);
    } 

    // Set gas for distributor
    function setDistributorSettings(uint256 gas) external authorized {
        require(gas < 750000);
        distributorGas = gas;
    }
    
    // Get the circulatingSupply
    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO));
    }

    // Get the liquidity backing
    function getLiquidityBacking(uint256 accuracy) public view returns (uint256) {
        return accuracy.mul(balanceOf(pair).mul(2)).div(getCirculatingSupply());
    }

    // Get if we are over liquified or not
    function isOverLiquified(uint256 target, uint256 accuracy) public view returns (bool) {
        return getLiquidityBacking(accuracy) > target;
    }

    function updateLaunching(address[] calldata _addresses, bool _enabled) external authorized {
        require(LaunchingEnabled, "Launching disabled");
        for (uint256 i = 0; i < _addresses.length; i++) {
            Launching[_addresses[i]] = _enabled;
        }
    }
    event AutoLiquify(uint256 amountBNB, uint256 amountBOG);
    event BuybackMultiplierActive(uint256 duration);
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountBNB","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountBOG","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"BuybackMultiplierActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"Approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"LiquidityFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LiquidityFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxBuyTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSellTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearBuybackMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"},{"internalType":"uint8","name":"_interval","type":"uint8"}],"name":"cooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"disableGREED","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"enableGREED","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"accuracy","type":"uint256"}],"name":"getLiquidityBacking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMultipliedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"selling","type":"bool"}],"name":"getTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"}],"name":"getUnpaidEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inGREEDTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"accuracy","type":"uint256"}],"name":"isOverLiquified","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":"bool","name":"_DCGMembers","type":"bool"}],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IDEXRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"},{"internalType":"bool","name":"_autoBuybackMultiplier","type":"bool"}],"name":"setAutoBuybackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_buybackFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_reflectionFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_devFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_feeDenominator","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuyTxPercent","type":"uint256"}],"name":"setBuyTxLimitInPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"setBuybackMultiplierSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistribution","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setDistributorSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_autoLiquidityReceiver","type":"address"},{"internalType":"address","name":"_marketingFeeReceiver","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":"exempt","type":"bool"}],"name":"setIsTimelockExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWallPercent","type":"uint256"}],"name":"setMaxWalletPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeSell","type":"uint256"},{"internalType":"uint256","name":"_buybackFeeSell","type":"uint256"},{"internalType":"uint256","name":"_reflectionFeeSell","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeSell","type":"uint256"},{"internalType":"uint256","name":"_devFeeSell","type":"uint256"},{"internalType":"uint256","name":"_feeDenominator","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSellTxPercent","type":"uint256"}],"name":"setSellTxLimitInPercent","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":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"setTargetLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"tradingStatus","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"triggerBuybackMultiplier","type":"bool"}],"name":"triggerManualBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"updateLaunching","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600280546001600160a01b031990811673dac17f958d2ee523a2206206994597c13d831ec71790915560038054821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc217905560048054821661dead17905560058054821690556006805490911673af2b9620dae505caccd24506787b2fc8072950311790556200008c6012600a620005f3565b6200009c90633b9aca006200060b565b6009556103e86009546064620000b391906200060b565b620000bf91906200062d565b600a556103e86009546064620000d691906200060b565b620000e291906200062d565b600b556103e86009546064620000f991906200060b565b6200010591906200062d565b600c556001601060006101000a81548160ff02191690831515021790555060016016556001601755600060185560026019556000601a556004601b556001601c556001601d556000601e556002601f55600060205560046021556064602855610e10602a556003602b5561271060095460146200018391906200060b565b6200018f91906200062d565b602c556014602d556064602e81905560c8602f556030556107086032556033805461ffff199081169091556207a120603a55603b8054611e0092169190911790556040805462ffffff191662010000179055348015620001ee57600080fd5b5060008054336001600160a01b031991821681178355825260016020818152604093849020805460ff1916909217909155603d8054737a250d5630b4cf539739df2c5dacb4c659f2488d931683179055825163c45a015560e01b81529251919263c45a015592600480830193928290030181865afa15801562000275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029b919062000650565b6003546040516364e329cb60e11b81526001600160a01b03918216600482015230602482015291169063c9c65396906044016020604051808303816000875af1158015620002ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000313919062000650565b603e80546001600160a01b0319166001600160a01b03928316179055306000908152600e60209081526040808320603d80548616855292529182902060001990555490519116906200036590620004d0565b6001600160a01b039091168152602001604051809103906000f08015801562000392573d6000803e3d6000fd5b50603980546001600160a01b039283166001600160a01b031991821617909155336000818152601160209081526040808320805460ff199081166001908117909255601284528285208054821683179055601384528285208054821683179055600480548916865283862080548316841790553080875284872080548416851790556006548a1687528487208054841685179055603e548a16875260148652848720805484168517905586528386208054831684179055549097168452818420805490971617909555600780548516841790556008805490941673af2b9620dae505caccd24506787b2fc80729503117909355600954828252600d84528482208190559351938452909283927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3506200067b565b61103b806200397e83390190565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000535578160001904821115620005195762000519620004de565b808516156200052757918102915b93841c9390800290620004f9565b509250929050565b6000826200054e57506001620005ed565b816200055d57506000620005ed565b81600181146200057657600281146200058157620005a1565b6001915050620005ed565b60ff841115620005955762000595620004de565b50506001821b620005ed565b5060208310610133831016604e8410600b8410161715620005c6575081810a620005ed565b620005d28383620004f4565b8060001904821115620005e957620005e9620004de565b0290505b92915050565b60006200060460ff8416836200053d565b9392505050565b6000816000190483118215151615620006285762000628620004de565b500290565b6000826200064b57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200066357600080fd5b81516001600160a01b03811681146200060457600080fd5b6132f3806200068b6000396000f3fe6080604052600436106103d25760003560e01c8063769b3fdd116101fd578063d806d12f11610118578063f2fde38b116100ab578063f84ba65d1161007a578063f84ba65d14610b4f578063f887ea4014610b6f578063fb5f27fb14610b8f578063fe9fbb8014610ba5578063ffb54a9914610bc557600080fd5b8063f2fde38b14610ada578063f429389014610afa578063f708a64f14610b0f578063f74c9f4714610b2f57600080fd5b8063e3aa51bc116100e7578063e3aa51bc14610a65578063f0b37c0414610a85578063f0fc6bca14610aa5578063f1f3bca314610aba57600080fd5b8063d806d12f146109ca578063dd62ed3e146109df578063df20fd4914610a25578063df4a76c514610a4557600080fd5b8063a4b45c0011610190578063b6a5d7de1161015f578063b6a5d7de14610954578063ba876bb914610974578063cf4be39414610994578063d51ed1c8146109aa57600080fd5b8063a4b45c00146108df578063a8aa1b31146108ff578063a9059cbb1461091f578063b210b06d1461093f57600080fd5b806382bf293c116101cc57806382bf293c1461083f578063893d20e81461085f57806395d89b41146108915780639d1944f5146108bf57600080fd5b8063769b3fdd146107d357806378109e54146107e95780637affa29b146107ff57806382334b941461081f57600080fd5b80632e4a9bd7116102ed5780634f7b4d4911610280578063658d4b7f1161024f578063658d4b7f1461073d5780636ddd17131461075d57806370a082311461077d57806371916a6b146107b357600080fd5b80634f7b4d49146106d257806350db71fb146106e75780635314841614610707578063571ac8b01461071d57600080fd5b8063313ce567116102bc578063313ce56714610675578063334773271461069157806337bc957e146106a75780634dfc855a146106bd57600080fd5b80632e4a9bd7146105fa5780632f54bf6e146106105780632f5620d11461063f5780632fe76bc21461065f57600080fd5b80631f478f1e1161036557806328fd31981161033457806328fd3198146105855780632b112e49146105a55780632d48e896146105ba5780632d594567146105da57600080fd5b80631f478f1e14610505578063201e7991146105255780632375ce401461054557806323b872dd1461056557600080fd5b80631161ae39116103a15780631161ae391461049a57806313374e7a146104ba57806318160ddd146104d057806318197c85146104e557600080fd5b806306fdde03146103de578063095ea7b3146104245780630d2959801461045457806310075a691461047657600080fd5b366103d957005b600080fd5b3480156103ea57600080fd5b5060408051808201909152600b81526a536d61727420546f6f6c7360a81b60208201525b60405161041b9190612d44565b60405180910390f35b34801561043057600080fd5b5061044461043f366004612dae565b610be4565b604051901515815260200161041b565b34801561046057600080fd5b5061047461046f366004612def565b610c51565b005b34801561048257600080fd5b5061048c60195481565b60405190815260200161041b565b3480156104a657600080fd5b506104446104b5366004612e0a565b610caf565b3480156104c657600080fd5b5061048c601f5481565b3480156104dc57600080fd5b5060095461048c565b3480156104f157600080fd5b50610474610500366004612e2c565b610cc3565b34801561051157600080fd5b50610474610520366004612eb0565b610da6565b34801561053157600080fd5b50610474610540366004612e0a565b610df6565b34801561055157600080fd5b50610474610560366004612ee5565b610e26565b34801561057157600080fd5b50610444610580366004612f11565b610e7b565b34801561059157600080fd5b5061048c6105a0366004612f52565b610f3d565b3480156105b157600080fd5b5061048c610fac565b3480156105c657600080fd5b506104746105d5366004612e0a565b610ffe565b3480156105e657600080fd5b506104746105f5366004612f6f565b61108d565b34801561060657600080fd5b5061048c60175481565b34801561061c57600080fd5b5061044461062b366004612f52565b6000546001600160a01b0391821691161490565b34801561064b57600080fd5b5061047461065a366004612fac565b6110d9565b34801561066b57600080fd5b5061048c601c5481565b34801561068157600080fd5b506040516012815260200161041b565b34801561069d57600080fd5b5061048c600a5481565b3480156106b357600080fd5b5061048c601d5481565b3480156106c957600080fd5b5061044461113f565b3480156106de57600080fd5b5061047461116b565b3480156106f357600080fd5b50610474610702366004612eb0565b611197565b34801561071357600080fd5b5061048c60215481565b34801561072957600080fd5b50610444610738366004612f52565b6111e7565b34801561074957600080fd5b50610474610758366004612eb0565b6111f5565b34801561076957600080fd5b506040546104449062010000900460ff1681565b34801561078957600080fd5b5061048c610798366004612f52565b6001600160a01b03166000908152600d602052604090205490565b3480156107bf57600080fd5b506104746107ce366004612def565b611245565b3480156107df57600080fd5b5061048c60165481565b3480156107f557600080fd5b5061048c600c5481565b34801561080b57600080fd5b5061047461081a366004612ffc565b6112a8565b34801561082b57600080fd5b5061047461083a366004613015565b6112f4565b34801561084b57600080fd5b5061047461085a366004612ffc565b61139c565b34801561086b57600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161041b565b34801561089d57600080fd5b5060408051808201909152600581526414d350549560da1b602082015261040e565b3480156108cb57600080fd5b506104746108da366004612ffc565b6113e7565b3480156108eb57600080fd5b506104746108fa366004613038565b611420565b34801561090b57600080fd5b50603e54610879906001600160a01b031681565b34801561092b57600080fd5b5061044461093a366004612dae565b611473565b34801561094b57600080fd5b50610474611480565b34801561096057600080fd5b5061047461096f366004612f52565b6114ac565b34801561098057600080fd5b5061047461098f366004613066565b6114fd565b3480156109a057600080fd5b5061048c600b5481565b3480156109b657600080fd5b5061048c6109c5366004612ffc565b611560565b3480156109d657600080fd5b5061048c6115a1565b3480156109eb57600080fd5b5061048c6109fa366004613038565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205490565b348015610a3157600080fd5b50610474610a403660046130a9565b611614565b348015610a5157600080fd5b50610474610a60366004612ffc565b611671565b348015610a7157600080fd5b50610474610a80366004612ffc565b6116b7565b348015610a9157600080fd5b50610474610aa0366004612f52565b6116e5565b348015610ab157600080fd5b50610474611730565b348015610ac657600080fd5b5061048c610ad5366004612def565b611789565b348015610ae657600080fd5b50610474610af5366004612f52565b6117e6565b348015610b0657600080fd5b5061047461187c565b348015610b1b57600080fd5b50610474610b2a366004612eb0565b6118df565b348015610b3b57600080fd5b50610474610b4a366004613066565b6119e3565b348015610b5b57600080fd5b50610474610b6a366004612eb0565b611a40565b348015610b7b57600080fd5b50603d54610879906001600160a01b031681565b348015610b9b57600080fd5b5061048c601b5481565b348015610bb157600080fd5b50610444610bc0366004612f52565b611a90565b348015610bd157600080fd5b5060405461044490610100900460ff1681565b336000818152600e602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610c3f9086815260200190565b60405180910390a35060015b92915050565b6000546001600160a01b03163314610c845760405162461bcd60e51b8152600401610c7b906130c5565b60405180910390fd5b6040805443603f5562ffff0019169115156101000262ff000019169190911762010000179055565b50565b600082610cbb83611560565b119392505050565b610ccc33611a90565b610ce85760405162461bcd60e51b8152600401610c7b906130e5565b60105460ff16610d2f5760405162461bcd60e51b815260206004820152601260248201527113185d5b98da1a5b99c8191a5cd8589b195960721b6044820152606401610c7b565b60005b82811015610da05781600f6000868685818110610d5157610d5161310a565b9050602002016020810190610d669190612f52565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d9881613136565b915050610d32565b50505050565b610daf33611a90565b610dcb5760405162461bcd60e51b8152600401610c7b906130e5565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b610dff33611a90565b610e1b5760405162461bcd60e51b8152600401610c7b906130e5565b602d91909155602e55565b610e2f33611a90565b610e4b5760405162461bcd60e51b8152600401610c7b906130e5565b6002610e578385613151565b11158015610e6457508183115b610e6d57600080fd5b602f92909255603055603255565b6001600160a01b0383166000908152600e6020908152604080832033845290915281205460001914610f28576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600e82528381203382529091529190912054610f03918490611aae565b6001600160a01b0385166000908152600e602090815260408083203384529091529020555b610f33848484611ae8565b90505b9392505050565b60395460405163051fa63360e31b81526001600160a01b03838116600483015260009216906328fd319890602401602060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4b9190613173565b6005546001600160a01b03166000908152600d6020526040812054610ff9906004546001600160a01b03166000908152600d6020526040902054610ff39060095490611fc6565b90611fc6565b905090565b61100733611a90565b6110235760405162461bcd60e51b8152600401610c7b906130e5565b6039546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015b600060405180830381600087803b15801561107157600080fd5b505af1158015611085573d6000803e3d6000fd5b505050505050565b61109633611a90565b6110b25760405162461bcd60e51b8152600401610c7b906130e5565b603b805461ffff191692151561ff0019169290921761010060ff9290921691909102179055565b6110e233611a90565b6110fe5760405162461bcd60e51b8152600401610c7b906130e5565b6033805460349590955560006035556036939093556037919091554360385561ffff1990921692151561ff0019169290921761010091151591909102179055565b600042611159602a5460295461200890919063ffffffff16565b11156111655750600190565b50600090565b61117433611a90565b6111905760405162461bcd60e51b8152600401610c7b906130e5565b6000602955565b6111a033611a90565b6111bc5760405162461bcd60e51b8152600401610c7b906130e5565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6000610c4b82600019610be4565b6111fe33611a90565b61121a5760405162461bcd60e51b8152600401610c7b906130e5565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b61124e33611a90565b61126a5760405162461bcd60e51b8152600401610c7b906130e5565b604054610100900460ff1615801561127f5750805b61128857600080fd5b506040805461ff0019166101001790556010805460ff1916905543603f55565b6112b133611a90565b6112cd5760405162461bcd60e51b8152600401610c7b906130e5565b6112ee6127106112e88360095461206790919063ffffffff16565b906120e6565b600a5550565b6112fd33611a90565b6113195760405162461bcd60e51b8152600401610c7b906130e5565b600061132d83670de0b6b3a764000061318c565b9050600061133c8260646120e6565b6004549091506113569082906001600160a01b0316612128565b8215610da057426031556032546040519081527f39d2389ec5c1fa77b2c0d374bc61b6d7bd97ccba280fcdeb4e9c7644898d7c3a9060200160405180910390a150505050565b6000546001600160a01b031633146113c65760405162461bcd60e51b8152600401610c7b906130c5565b6113e16127106112e88360095461206790919063ffffffff16565b600c5550565b6113f033611a90565b61140c5760405162461bcd60e51b8152600401610c7b906130e5565b620b71b0811061141b57600080fd5b603a55565b61142933611a90565b6114455760405162461bcd60e51b8152600401610c7b906130e5565b600780546001600160a01b039384166001600160a01b03199182161790915560088054929093169116179055565b6000610f36338484611ae8565b61148933611a90565b6114a55760405162461bcd60e51b8152600401610c7b906130e5565b6000603155565b6000546001600160a01b031633146114d65760405162461bcd60e51b8152600401610c7b906130c5565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b61150633611a90565b6115225760405162461bcd60e51b8152600401610c7b906130e5565b601c869055601d859055601e849055601f83905560208290556115538261154d858188818c8c612008565b90612008565b6021556028555050505050565b6000610c4b61156d610fac565b603e546001600160a01b03166000908152600d60205260409020546112e89061159a906002905b90612067565b8590612067565b6000806115bf42610ff360325460315461200890919063ffffffff16565b905060006115e6602754610ff36030546112e8602f5460275461206790919063ffffffff16565b905061160d6116046032546112e8858561206790919063ffffffff16565b60275490612008565b9250505090565b61161d33611a90565b6116395760405162461bcd60e51b8152600401610c7b906130e5565b6040805462ff0000191662010000841515021790556009546127109061166090839061318c565b61166a9190613151565b602c555050565b61167a33611a90565b6116965760405162461bcd60e51b8152600401610c7b906130e5565b6116b16127106112e88360095461206790919063ffffffff16565b600b5550565b6116c033611a90565b6116dc5760405162461bcd60e51b8152600401610c7b906130e5565b42602955602a55565b6000546001600160a01b0316331461170f5760405162461bcd60e51b8152600401610c7b906130c5565b6001600160a01b03166000908152600160205260409020805460ff19169055565b603954604051630afbf02f60e11b81523360048201526001600160a01b03909116906315f7e05e90602401600060405180830381600087803b15801561177557600080fd5b505af1158015610da0573d6000803e3d6000fd5b600043602b54603f5461179c91906131ab565b106117af57602854610c4b906001611fc6565b8180156117d15750426117cf60325460315461200890919063ffffffff16565b115b156117de57610c4b6115a1565b505060275490565b6000546001600160a01b031633146118105760405162461bcd60e51b8152600401610c7b906130c5565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b61188533611a90565b6118a15760405162461bcd60e51b8152600401610c7b906130e5565b60085460405147916001600160a01b03169082156108fc029083906000818181858888f193505050501580156118db573d6000803e3d6000fd5b5050565b6118e833611a90565b6119045760405162461bcd60e51b8152600401610c7b906130e5565b6001600160a01b038216301480159061192b5750603e546001600160a01b03838116911614155b61193457600080fd5b6001600160a01b0382166000908152601460205260409020805460ff1916821580159190911790915561199a57603954604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca9690604401611057565b6039546001600160a01b038381166000818152600d602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401611057565b6119ec33611a90565b611a085760405162461bcd60e51b8152600401610c7b906130e5565b6016869055601785905560188490556019839055601a829055611a338261154d858188818c8c612008565b601b556028555050505050565b611a4933611a90565b611a655760405162461bcd60e51b8152600401610c7b906130e5565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6001600160a01b031660009081526001602052604090205460ff1690565b60008184841115611ad25760405162461bcd60e51b8152600401610c7b9190612d44565b506000611adf84866131c3565b95945050505050565b6000611af5603f54151590565b158015611b0f5750603e546001600160a01b038481169116145b15611b50576001600160a01b0384166000908152600d6020526040902054611b3657600080fd5b611b5043603f556040805462ff0000191662010000179055565b6040546301000000900460ff1615611b7457611b6d848484612238565b9050610f36565b6001600160a01b03841660009081526001602052604090205460ff16158015611bb657506001600160a01b03831660009081526001602052604090205460ff16155b8015611bdb57506001600160a01b0383166000908152600f602052604090205460ff16155b15611c3757604054610100900460ff16611c375760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420656e61626c6564207965740000000000000000006044820152606401610c7b565b6001600160a01b03831660009081526015602052604090205460ff16158015611c7957506001600160a01b03841660009081526015602052604090205460ff16155b611cbe5760405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc81a5cc8189b1858dadb1a5cdd195960521b6044820152606401610c7b565b603e546001600160a01b03848116911614611cd88161231e565b611ce3858585612372565b611ced85856124e4565b611cf9858486846125c6565b6000611d0361113f565b9050611d0d6126fe565b15611d1a57611d1a61275a565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0389166000908152600d9091529190912054611d6c918690611aae565b6001600160a01b0387166000908152600d6020908152604080832093909355601190529081205460ff1615611da15784611dad565b611dad87868585612c16565b6001600160a01b0387166000908152600d6020526040902054909150611dd39082612008565b6001600160a01b038088166000908152600d6020908152604080832094909455918a1681526014909152205460ff16611e77576039546001600160a01b038881166000818152600d602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015611e6457600080fd5b505af1925050508015611e75575060015b505b6001600160a01b03861660009081526014602052604090205460ff16611f08576039546001600160a01b038781166000818152600d602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015611ef557600080fd5b505af1925050508015611f06575060015b505b603954603a546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991611f409160040190815260200190565b600060405180830381600087803b158015611f5a57600080fd5b505af1925050508015611f6b575060015b50856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611fb191815260200190565b60405180910390a35060019695505050505050565b6000610f3683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611aae565b60008061201583856131ab565b905083811015610f365760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c7b565b60008261207657506000610c4b565b6000612082838561318c565b90508261208f8583613151565b14610f365760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c7b565b6000610f3683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612d16565b6040805463ff0000001916630100000017815580516002808252606082018352600092602083019080368337505060035482519293506001600160a01b03169183915060009061217a5761217a61310a565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106121ae576121ae61310a565b6001600160a01b039283166020918202929092010152603d5460405163b6f9de9560e01b815291169063b6f9de959085906121f49060009086908890429060040161321e565b6000604051808303818588803b15801561220d57600080fd5b505af1158015612221573d6000803e3d6000fd5b50506040805463ff00000019169055505050505050565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600d90915291822054612289918490611aae565b6001600160a01b038086166000908152600d602052604080822093909355908516815220546122b89083612008565b6001600160a01b038085166000818152600d602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061230c9086815260200190565b60405180910390a35060019392505050565b801561234b57601c54602255601d54602355601e54602455601f5460255560205460265560215460275550565b601654602255601754602355601854602455601954602555601a54602655601b5460275550565b6001600160a01b03831660009081526001602052604090205460ff161580156123a957506000546001600160a01b03838116911614155b80156123be57506001600160a01b0382163014155b80156123d857506004546001600160a01b03838116911614155b80156123f25750603e546001600160a01b03838116911614155b801561240c57506008546001600160a01b03838116911614155b801561242657506007546001600160a01b03838116911614155b801561244057506006546001600160a01b03838116911614155b156124df576001600160a01b0382166000908152600d6020526040902054600c5461246b83836131ab565b1115610da05760405162461bcd60e51b815260206004820152603e60248201527f546f74616c20486f6c64696e672069732063757272656e746c79206c696d697460448201527f65642c20796f752063616e206e6f74206275792074686174206d7563682e00006064820152608401610c7b565b505050565b603e546001600160a01b0383811691161480156125035750603b5460ff165b801561252857506001600160a01b03811660009081526013602052604090205460ff16155b156118db576001600160a01b0381166000908152603c602052604090205442116125945760405162461bcd60e51b815260206004820152601c60248201527f506c656173652077616974206265747765656e2074776f2062757973000000006044820152606401610c7b565b603b546125a990610100900460ff16426131ab565b6001600160a01b0382166000908152603c60205260409020555050565b6000546001600160a01b03838116911614610da057801561267257600b548311158061260a57506001600160a01b03841660009081526012602052604090205460ff165b8061262d57506001600160a01b03821660009081526012602052604090205460ff165b61266d5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610c7b565b610da0565b600a548311158061269b57506001600160a01b03841660009081526012602052604090205460ff165b806126be57506001600160a01b03821660009081526012602052604090205460ff165b610da05760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610c7b565b603e546000906001600160a01b0316331480159061272657506040546301000000900460ff16155b801561273a575060405462010000900460ff165b8015610ff9575050602c54306000908152600d6020526040902054101590565b6040805463ff00000019166301000000179055602d54602e5460009161277f91610caf565b61278b5760225461278e565b60005b905060006127b260026112e86027546112e886602c5461206790919063ffffffff16565b905060006127cb82602c54611fc690919063ffffffff16565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106128055761280561310a565b6001600160a01b0392831660209182029290920101526003548251911690829060019081106128365761283661310a565b6001600160a01b039283166020918202929092010152603d5460405163791ac94760e01b81524792919091169063791ac94790612880908690600090879030904290600401613253565b600060405180830381600087803b15801561289a57600080fd5b505af11580156128ae573d6000803e3d6000fd5b5050505060006128c78247611fc690919063ffffffff16565b905060006128e26128d98860026120e6565b60275490611fc6565b905060006128f760026112e88481878d612067565b90506000612914836112e86024548761206790919063ffffffff16565b90506000612931846112e86025548861206790919063ffffffff16565b9050600061294e856112e86026548961206790919063ffffffff16565b9050603960009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129a057600080fd5b505af1935050505080156129b2575060015b506008546040516000916001600160a01b03169061753090859084818181858888f193505050503d8060008114612a05576040519150601f19603f3d011682016040523d82523d6000602084013e612a0a565b606091505b50506006546040519192506000916001600160a01b039091169061753090859084818181858888f193505050503d8060008114612a63576040519150601f19603f3d011682016040523d82523d6000602084013e612a68565b606091505b5050905081612aca5760405162461bcd60e51b815260206004820152602860248201527f6d61726b6574696e672072656365697665722072656a656374656420455448206044820152673a3930b739b332b960c11b6064820152608401610c7b565b80612b225760405162461bcd60e51b815260206004820152602260248201527f6465762072656365697665722072656a656374656420455448207472616e736660448201526132b960f11b6064820152608401610c7b565b8b15612bfa57603d5460075460405163f305d71960e01b8152306004820152602481018f905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990889060c40160606040518083038185885af1158015612b98573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bbd919061328f565b505060408051888152602081018f90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b50506040805463ff000000191690555050505050505050505050565b6000808215612c71578315612c5157612c4a6028546112e860026112e860036115946027548c61206790919063ffffffff16565b9050612c8f565b612c4a6028546112e860026112e86027548a61206790919063ffffffff16565b612c8c6028546112e86027548861206790919063ffffffff16565b90505b306000908152600d6020526040902054612ca99082612008565b306000818152600d6020526040908190209290925590516001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612cfa9085815260200190565b60405180910390a3612d0c8582611fc6565b9695505050505050565b60008183612d375760405162461bcd60e51b8152600401610c7b9190612d44565b506000611adf8486613151565b600060208083528351808285015260005b81811015612d7157858101830151858201604001528201612d55565b81811115612d83576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610cac57600080fd5b60008060408385031215612dc157600080fd5b8235612dcc81612d99565b946020939093013593505050565b80358015158114612dea57600080fd5b919050565b600060208284031215612e0157600080fd5b610f3682612dda565b60008060408385031215612e1d57600080fd5b50508035926020909101359150565b600080600060408486031215612e4157600080fd5b833567ffffffffffffffff80821115612e5957600080fd5b818601915086601f830112612e6d57600080fd5b813581811115612e7c57600080fd5b8760208260051b8501011115612e9157600080fd5b602092830195509350612ea79186019050612dda565b90509250925092565b60008060408385031215612ec357600080fd5b8235612ece81612d99565b9150612edc60208401612dda565b90509250929050565b600080600060608486031215612efa57600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612f2657600080fd5b8335612f3181612d99565b92506020840135612f4181612d99565b929592945050506040919091013590565b600060208284031215612f6457600080fd5b8135610f3681612d99565b60008060408385031215612f8257600080fd5b612f8b83612dda565b9150602083013560ff81168114612fa157600080fd5b809150509250929050565b600080600080600060a08688031215612fc457600080fd5b612fcd86612dda565b9450602086013593506040860135925060608601359150612ff060808701612dda565b90509295509295909350565b60006020828403121561300e57600080fd5b5035919050565b6000806040838503121561302857600080fd5b82359150612edc60208401612dda565b6000806040838503121561304b57600080fd5b823561305681612d99565b91506020830135612fa181612d99565b60008060008060008060c0878903121561307f57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600080604083850312156130bc57600080fd5b612dcc83612dda565b60208082526006908201526510a7aba722a960d11b604082015260600190565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561314a5761314a613120565b5060010190565b60008261316e57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561318557600080fd5b5051919050565b60008160001904831182151516156131a6576131a6613120565b500290565b600082198211156131be576131be613120565b500190565b6000828210156131d5576131d5613120565b500390565b600081518084526020808501945080840160005b838110156132135781516001600160a01b0316875295820195908201906001016131ee565b509495945050505050565b84815260806020820152600061323760808301866131da565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a06040820152600061327260a08301866131da565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156132a457600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220c6c8c532e8ff76afc989b367495d6f6f853e56ac0504b444b809125c8cd92f5f64736f6c634300080a00336080604052600180546001600160a01b031990811673dac17f958d2ee523a2206206994597c13d831ec7179091556002805490911673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790556ec097ce7bc90715b34b9f1000000000600c55610708600d5564e8d4a51000600e5534801561007a57600080fd5b5060405161103b38038061103b833981016040819052610099916100f3565b6001600160a01b0381166100c157737a250d5630b4cf539739df2c5dacb4c659f2488d6100c3565b805b600380546001600160a01b03929092166001600160a01b0319928316179055600080549091163317905550610123565b60006020828403121561010557600080fd5b81516001600160a01b038116811461011c57600080fd5b9392505050565b610f09806101326000396000f3fe6080604052600436106100dd5760003560e01c8063997664d71161007f578063e2d2e21911610059578063e2d2e2191461022e578063efca2eed14610244578063ffb2c4791461025a578063ffd49c841461027a57600080fd5b8063997664d7146101b9578063ce7c2ac2146101cf578063d0e30db01461022657600080fd5b806328fd3198116100bb57806328fd31981461014d5780632d48e8961461016d5780633a98ef391461018d5780634fab0ae8146101a357600080fd5b806311ce023d146100e257806314b6ca961461010b57806315f7e05e1461012d575b600080fd5b3480156100ee57600080fd5b506100f8600c5481565b6040519081526020015b60405180910390f35b34801561011757600080fd5b5061012b610126366004610c8c565b610290565b005b34801561013957600080fd5b5061012b610148366004610cb6565b610408565b34801561015957600080fd5b506100f8610168366004610cb6565b61042b565b34801561017957600080fd5b5061012b610188366004610cd1565b6104b4565b34801561019957600080fd5b506100f860085481565b3480156101af57600080fd5b506100f8600e5481565b3480156101c557600080fd5b506100f860095481565b3480156101db57600080fd5b5061020b6101ea366004610cb6565b60076020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610102565b61012b6104d6565b34801561023a57600080fd5b506100f8600b5481565b34801561025057600080fd5b506100f8600a5481565b34801561026657600080fd5b5061012b610275366004610cf3565b610705565b34801561028657600080fd5b506100f8600d5481565b6000546001600160a01b031633146102a757600080fd5b6001600160a01b038216600090815260076020526040902054156102ce576102ce82610805565b6000811180156102f457506001600160a01b038216600090815260076020526040902054155b1561035a57600480546001600160a01b0384166000818152600560205260408120839055600183018455929092527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b031916909117905561038d565b8015801561037f57506001600160a01b03821660009081526007602052604090205415155b1561038d5761038d82610921565b6001600160a01b0382166000908152600760205260409020546008546103be9183916103b891610a36565b90610a81565b6008556001600160a01b03821660009081526007602052604090208190556103e581610ae5565b6001600160a01b0390921660009081526007602052604090206001019190915550565b6000546001600160a01b0316331461041f57600080fd5b61042881610805565b50565b6001600160a01b03811660009081526007602052604081205461045057506000919050565b6001600160a01b03821660009081526007602052604081205461047290610ae5565b6001600160a01b0384166000908152600760205260409020600101549091508082116104a2575060009392505050565b6104ac8282610a36565b949350505050565b6000546001600160a01b031633146104cb57600080fd5b600d91909155600e55565b6000546001600160a01b031633146104ed57600080fd5b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055a9190610d0c565b6040805160028082526060820183529293506000929091602083019080368337505060025482519293506001600160a01b0316918391506000906105a0576105a0610d25565b6001600160a01b03928316602091820292909201015260018054835192169183919081106105d0576105d0610d25565b6001600160a01b03928316602091820292909201015260035460405163b6f9de9560e01b815291169063b6f9de9590349061061690600090869030904290600401610d3b565b6000604051808303818588803b15801561062f57600080fd5b505af1158015610643573d6000803e3d6000fd5b50506001546040516370a0823160e01b8152306004820152600094506106c393508692506001600160a01b03909116906370a0823190602401602060405180830381865afa158015610699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bd9190610d0c565b90610a36565b6009549091506106d39082610a81565b600955600854600c546106fd916106f4916106ee9085610b02565b90610b81565b600b5490610a81565b600b55505050565b6000546001600160a01b0316331461071c57600080fd5b60045480610728575050565b6000805a905060005b848310801561073f57508381105b156107fe5783600f5410610753576000600f555b6107856004600f548154811061076b5761076b610d25565b6000918252602090912001546001600160a01b0316610bc3565b156107bc576107bc6004600f54815481106107a2576107a2610d25565b6000918252602090912001546001600160a01b0316610805565b6107d16107ca5a8490610a36565b8490610a81565b92505a600f805491935060006107e683610dbb565b919050555080806107f690610dbb565b915050610731565b5050505050565b6001600160a01b0381166000908152600760205260409020546108255750565b60006108308261042b565b9050801561091d57600a546108459082610a81565b600a5560015460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af115801561089b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190610dd6565b506001600160a01b038216600090815260066020908152604080832042905560079091529020600201546108f39082610a81565b6001600160a01b03831660009081526007602052604090206002810191909155546103e590610ae5565b5050565b6004805461093190600190610df8565b8154811061094157610941610d25565b60009182526020808320909101546001600160a01b038481168452600590925260409092205460048054929093169291811061097f5761097f610d25565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600591829052604081205460048054919392916109cb90600190610df8565b815481106109db576109db610d25565b60009182526020808320909101546001600160a01b031683528201929092526040019020556004805480610a1157610a11610e0f565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000610a7883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610c08565b90505b92915050565b600080610a8e8385610e25565b905083811015610a785760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b6000610a7b600c546106ee600b5485610b0290919063ffffffff16565b600082610b1157506000610a7b565b6000610b1d8385610e3d565b905082610b2a8583610e5c565b14610a785760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610adc565b6000610a7883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610c42565b600d546001600160a01b03821660009081526006602052604081205490914291610bed9190610e25565b108015610a7b5750600e54610c018361042b565b1192915050565b60008184841115610c2c5760405162461bcd60e51b8152600401610adc9190610e7e565b506000610c398486610df8565b95945050505050565b60008183610c635760405162461bcd60e51b8152600401610adc9190610e7e565b506000610c398486610e5c565b80356001600160a01b0381168114610c8757600080fd5b919050565b60008060408385031215610c9f57600080fd5b610ca883610c70565b946020939093013593505050565b600060208284031215610cc857600080fd5b610a7882610c70565b60008060408385031215610ce457600080fd5b50508035926020909101359150565b600060208284031215610d0557600080fd5b5035919050565b600060208284031215610d1e57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015610d855784516001600160a01b031683529383019391830191600101610d60565b50506001600160a01b039690961660408501525050506060015292915050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415610dcf57610dcf610da5565b5060010190565b600060208284031215610de857600080fd5b81518015158114610a7857600080fd5b600082821015610e0a57610e0a610da5565b500390565b634e487b7160e01b600052603160045260246000fd5b60008219821115610e3857610e38610da5565b500190565b6000816000190483118215151615610e5757610e57610da5565b500290565b600082610e7957634e487b7160e01b600052601260045260246000fd5b500490565b600060208083528351808285015260005b81811015610eab57858101830151858201604001528201610e8f565b81811115610ebd576000604083870101525b50601f01601f191692909201604001939250505056fea26469706673582212202cbdd18c511828bb62f4f7a50edd2dc3c61ce59e621d34126c5c013b9511b9f764736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106103d25760003560e01c8063769b3fdd116101fd578063d806d12f11610118578063f2fde38b116100ab578063f84ba65d1161007a578063f84ba65d14610b4f578063f887ea4014610b6f578063fb5f27fb14610b8f578063fe9fbb8014610ba5578063ffb54a9914610bc557600080fd5b8063f2fde38b14610ada578063f429389014610afa578063f708a64f14610b0f578063f74c9f4714610b2f57600080fd5b8063e3aa51bc116100e7578063e3aa51bc14610a65578063f0b37c0414610a85578063f0fc6bca14610aa5578063f1f3bca314610aba57600080fd5b8063d806d12f146109ca578063dd62ed3e146109df578063df20fd4914610a25578063df4a76c514610a4557600080fd5b8063a4b45c0011610190578063b6a5d7de1161015f578063b6a5d7de14610954578063ba876bb914610974578063cf4be39414610994578063d51ed1c8146109aa57600080fd5b8063a4b45c00146108df578063a8aa1b31146108ff578063a9059cbb1461091f578063b210b06d1461093f57600080fd5b806382bf293c116101cc57806382bf293c1461083f578063893d20e81461085f57806395d89b41146108915780639d1944f5146108bf57600080fd5b8063769b3fdd146107d357806378109e54146107e95780637affa29b146107ff57806382334b941461081f57600080fd5b80632e4a9bd7116102ed5780634f7b4d4911610280578063658d4b7f1161024f578063658d4b7f1461073d5780636ddd17131461075d57806370a082311461077d57806371916a6b146107b357600080fd5b80634f7b4d49146106d257806350db71fb146106e75780635314841614610707578063571ac8b01461071d57600080fd5b8063313ce567116102bc578063313ce56714610675578063334773271461069157806337bc957e146106a75780634dfc855a146106bd57600080fd5b80632e4a9bd7146105fa5780632f54bf6e146106105780632f5620d11461063f5780632fe76bc21461065f57600080fd5b80631f478f1e1161036557806328fd31981161033457806328fd3198146105855780632b112e49146105a55780632d48e896146105ba5780632d594567146105da57600080fd5b80631f478f1e14610505578063201e7991146105255780632375ce401461054557806323b872dd1461056557600080fd5b80631161ae39116103a15780631161ae391461049a57806313374e7a146104ba57806318160ddd146104d057806318197c85146104e557600080fd5b806306fdde03146103de578063095ea7b3146104245780630d2959801461045457806310075a691461047657600080fd5b366103d957005b600080fd5b3480156103ea57600080fd5b5060408051808201909152600b81526a536d61727420546f6f6c7360a81b60208201525b60405161041b9190612d44565b60405180910390f35b34801561043057600080fd5b5061044461043f366004612dae565b610be4565b604051901515815260200161041b565b34801561046057600080fd5b5061047461046f366004612def565b610c51565b005b34801561048257600080fd5b5061048c60195481565b60405190815260200161041b565b3480156104a657600080fd5b506104446104b5366004612e0a565b610caf565b3480156104c657600080fd5b5061048c601f5481565b3480156104dc57600080fd5b5060095461048c565b3480156104f157600080fd5b50610474610500366004612e2c565b610cc3565b34801561051157600080fd5b50610474610520366004612eb0565b610da6565b34801561053157600080fd5b50610474610540366004612e0a565b610df6565b34801561055157600080fd5b50610474610560366004612ee5565b610e26565b34801561057157600080fd5b50610444610580366004612f11565b610e7b565b34801561059157600080fd5b5061048c6105a0366004612f52565b610f3d565b3480156105b157600080fd5b5061048c610fac565b3480156105c657600080fd5b506104746105d5366004612e0a565b610ffe565b3480156105e657600080fd5b506104746105f5366004612f6f565b61108d565b34801561060657600080fd5b5061048c60175481565b34801561061c57600080fd5b5061044461062b366004612f52565b6000546001600160a01b0391821691161490565b34801561064b57600080fd5b5061047461065a366004612fac565b6110d9565b34801561066b57600080fd5b5061048c601c5481565b34801561068157600080fd5b506040516012815260200161041b565b34801561069d57600080fd5b5061048c600a5481565b3480156106b357600080fd5b5061048c601d5481565b3480156106c957600080fd5b5061044461113f565b3480156106de57600080fd5b5061047461116b565b3480156106f357600080fd5b50610474610702366004612eb0565b611197565b34801561071357600080fd5b5061048c60215481565b34801561072957600080fd5b50610444610738366004612f52565b6111e7565b34801561074957600080fd5b50610474610758366004612eb0565b6111f5565b34801561076957600080fd5b506040546104449062010000900460ff1681565b34801561078957600080fd5b5061048c610798366004612f52565b6001600160a01b03166000908152600d602052604090205490565b3480156107bf57600080fd5b506104746107ce366004612def565b611245565b3480156107df57600080fd5b5061048c60165481565b3480156107f557600080fd5b5061048c600c5481565b34801561080b57600080fd5b5061047461081a366004612ffc565b6112a8565b34801561082b57600080fd5b5061047461083a366004613015565b6112f4565b34801561084b57600080fd5b5061047461085a366004612ffc565b61139c565b34801561086b57600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161041b565b34801561089d57600080fd5b5060408051808201909152600581526414d350549560da1b602082015261040e565b3480156108cb57600080fd5b506104746108da366004612ffc565b6113e7565b3480156108eb57600080fd5b506104746108fa366004613038565b611420565b34801561090b57600080fd5b50603e54610879906001600160a01b031681565b34801561092b57600080fd5b5061044461093a366004612dae565b611473565b34801561094b57600080fd5b50610474611480565b34801561096057600080fd5b5061047461096f366004612f52565b6114ac565b34801561098057600080fd5b5061047461098f366004613066565b6114fd565b3480156109a057600080fd5b5061048c600b5481565b3480156109b657600080fd5b5061048c6109c5366004612ffc565b611560565b3480156109d657600080fd5b5061048c6115a1565b3480156109eb57600080fd5b5061048c6109fa366004613038565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205490565b348015610a3157600080fd5b50610474610a403660046130a9565b611614565b348015610a5157600080fd5b50610474610a60366004612ffc565b611671565b348015610a7157600080fd5b50610474610a80366004612ffc565b6116b7565b348015610a9157600080fd5b50610474610aa0366004612f52565b6116e5565b348015610ab157600080fd5b50610474611730565b348015610ac657600080fd5b5061048c610ad5366004612def565b611789565b348015610ae657600080fd5b50610474610af5366004612f52565b6117e6565b348015610b0657600080fd5b5061047461187c565b348015610b1b57600080fd5b50610474610b2a366004612eb0565b6118df565b348015610b3b57600080fd5b50610474610b4a366004613066565b6119e3565b348015610b5b57600080fd5b50610474610b6a366004612eb0565b611a40565b348015610b7b57600080fd5b50603d54610879906001600160a01b031681565b348015610b9b57600080fd5b5061048c601b5481565b348015610bb157600080fd5b50610444610bc0366004612f52565b611a90565b348015610bd157600080fd5b5060405461044490610100900460ff1681565b336000818152600e602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610c3f9086815260200190565b60405180910390a35060015b92915050565b6000546001600160a01b03163314610c845760405162461bcd60e51b8152600401610c7b906130c5565b60405180910390fd5b6040805443603f5562ffff0019169115156101000262ff000019169190911762010000179055565b50565b600082610cbb83611560565b119392505050565b610ccc33611a90565b610ce85760405162461bcd60e51b8152600401610c7b906130e5565b60105460ff16610d2f5760405162461bcd60e51b815260206004820152601260248201527113185d5b98da1a5b99c8191a5cd8589b195960721b6044820152606401610c7b565b60005b82811015610da05781600f6000868685818110610d5157610d5161310a565b9050602002016020810190610d669190612f52565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d9881613136565b915050610d32565b50505050565b610daf33611a90565b610dcb5760405162461bcd60e51b8152600401610c7b906130e5565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b610dff33611a90565b610e1b5760405162461bcd60e51b8152600401610c7b906130e5565b602d91909155602e55565b610e2f33611a90565b610e4b5760405162461bcd60e51b8152600401610c7b906130e5565b6002610e578385613151565b11158015610e6457508183115b610e6d57600080fd5b602f92909255603055603255565b6001600160a01b0383166000908152600e6020908152604080832033845290915281205460001914610f28576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600e82528381203382529091529190912054610f03918490611aae565b6001600160a01b0385166000908152600e602090815260408083203384529091529020555b610f33848484611ae8565b90505b9392505050565b60395460405163051fa63360e31b81526001600160a01b03838116600483015260009216906328fd319890602401602060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4b9190613173565b6005546001600160a01b03166000908152600d6020526040812054610ff9906004546001600160a01b03166000908152600d6020526040902054610ff39060095490611fc6565b90611fc6565b905090565b61100733611a90565b6110235760405162461bcd60e51b8152600401610c7b906130e5565b6039546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015b600060405180830381600087803b15801561107157600080fd5b505af1158015611085573d6000803e3d6000fd5b505050505050565b61109633611a90565b6110b25760405162461bcd60e51b8152600401610c7b906130e5565b603b805461ffff191692151561ff0019169290921761010060ff9290921691909102179055565b6110e233611a90565b6110fe5760405162461bcd60e51b8152600401610c7b906130e5565b6033805460349590955560006035556036939093556037919091554360385561ffff1990921692151561ff0019169290921761010091151591909102179055565b600042611159602a5460295461200890919063ffffffff16565b11156111655750600190565b50600090565b61117433611a90565b6111905760405162461bcd60e51b8152600401610c7b906130e5565b6000602955565b6111a033611a90565b6111bc5760405162461bcd60e51b8152600401610c7b906130e5565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6000610c4b82600019610be4565b6111fe33611a90565b61121a5760405162461bcd60e51b8152600401610c7b906130e5565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b61124e33611a90565b61126a5760405162461bcd60e51b8152600401610c7b906130e5565b604054610100900460ff1615801561127f5750805b61128857600080fd5b506040805461ff0019166101001790556010805460ff1916905543603f55565b6112b133611a90565b6112cd5760405162461bcd60e51b8152600401610c7b906130e5565b6112ee6127106112e88360095461206790919063ffffffff16565b906120e6565b600a5550565b6112fd33611a90565b6113195760405162461bcd60e51b8152600401610c7b906130e5565b600061132d83670de0b6b3a764000061318c565b9050600061133c8260646120e6565b6004549091506113569082906001600160a01b0316612128565b8215610da057426031556032546040519081527f39d2389ec5c1fa77b2c0d374bc61b6d7bd97ccba280fcdeb4e9c7644898d7c3a9060200160405180910390a150505050565b6000546001600160a01b031633146113c65760405162461bcd60e51b8152600401610c7b906130c5565b6113e16127106112e88360095461206790919063ffffffff16565b600c5550565b6113f033611a90565b61140c5760405162461bcd60e51b8152600401610c7b906130e5565b620b71b0811061141b57600080fd5b603a55565b61142933611a90565b6114455760405162461bcd60e51b8152600401610c7b906130e5565b600780546001600160a01b039384166001600160a01b03199182161790915560088054929093169116179055565b6000610f36338484611ae8565b61148933611a90565b6114a55760405162461bcd60e51b8152600401610c7b906130e5565b6000603155565b6000546001600160a01b031633146114d65760405162461bcd60e51b8152600401610c7b906130c5565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b61150633611a90565b6115225760405162461bcd60e51b8152600401610c7b906130e5565b601c869055601d859055601e849055601f83905560208290556115538261154d858188818c8c612008565b90612008565b6021556028555050505050565b6000610c4b61156d610fac565b603e546001600160a01b03166000908152600d60205260409020546112e89061159a906002905b90612067565b8590612067565b6000806115bf42610ff360325460315461200890919063ffffffff16565b905060006115e6602754610ff36030546112e8602f5460275461206790919063ffffffff16565b905061160d6116046032546112e8858561206790919063ffffffff16565b60275490612008565b9250505090565b61161d33611a90565b6116395760405162461bcd60e51b8152600401610c7b906130e5565b6040805462ff0000191662010000841515021790556009546127109061166090839061318c565b61166a9190613151565b602c555050565b61167a33611a90565b6116965760405162461bcd60e51b8152600401610c7b906130e5565b6116b16127106112e88360095461206790919063ffffffff16565b600b5550565b6116c033611a90565b6116dc5760405162461bcd60e51b8152600401610c7b906130e5565b42602955602a55565b6000546001600160a01b0316331461170f5760405162461bcd60e51b8152600401610c7b906130c5565b6001600160a01b03166000908152600160205260409020805460ff19169055565b603954604051630afbf02f60e11b81523360048201526001600160a01b03909116906315f7e05e90602401600060405180830381600087803b15801561177557600080fd5b505af1158015610da0573d6000803e3d6000fd5b600043602b54603f5461179c91906131ab565b106117af57602854610c4b906001611fc6565b8180156117d15750426117cf60325460315461200890919063ffffffff16565b115b156117de57610c4b6115a1565b505060275490565b6000546001600160a01b031633146118105760405162461bcd60e51b8152600401610c7b906130c5565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b61188533611a90565b6118a15760405162461bcd60e51b8152600401610c7b906130e5565b60085460405147916001600160a01b03169082156108fc029083906000818181858888f193505050501580156118db573d6000803e3d6000fd5b5050565b6118e833611a90565b6119045760405162461bcd60e51b8152600401610c7b906130e5565b6001600160a01b038216301480159061192b5750603e546001600160a01b03838116911614155b61193457600080fd5b6001600160a01b0382166000908152601460205260409020805460ff1916821580159190911790915561199a57603954604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca9690604401611057565b6039546001600160a01b038381166000818152600d602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401611057565b6119ec33611a90565b611a085760405162461bcd60e51b8152600401610c7b906130e5565b6016869055601785905560188490556019839055601a829055611a338261154d858188818c8c612008565b601b556028555050505050565b611a4933611a90565b611a655760405162461bcd60e51b8152600401610c7b906130e5565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6001600160a01b031660009081526001602052604090205460ff1690565b60008184841115611ad25760405162461bcd60e51b8152600401610c7b9190612d44565b506000611adf84866131c3565b95945050505050565b6000611af5603f54151590565b158015611b0f5750603e546001600160a01b038481169116145b15611b50576001600160a01b0384166000908152600d6020526040902054611b3657600080fd5b611b5043603f556040805462ff0000191662010000179055565b6040546301000000900460ff1615611b7457611b6d848484612238565b9050610f36565b6001600160a01b03841660009081526001602052604090205460ff16158015611bb657506001600160a01b03831660009081526001602052604090205460ff16155b8015611bdb57506001600160a01b0383166000908152600f602052604090205460ff16155b15611c3757604054610100900460ff16611c375760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420656e61626c6564207965740000000000000000006044820152606401610c7b565b6001600160a01b03831660009081526015602052604090205460ff16158015611c7957506001600160a01b03841660009081526015602052604090205460ff16155b611cbe5760405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc81a5cc8189b1858dadb1a5cdd195960521b6044820152606401610c7b565b603e546001600160a01b03848116911614611cd88161231e565b611ce3858585612372565b611ced85856124e4565b611cf9858486846125c6565b6000611d0361113f565b9050611d0d6126fe565b15611d1a57611d1a61275a565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0389166000908152600d9091529190912054611d6c918690611aae565b6001600160a01b0387166000908152600d6020908152604080832093909355601190529081205460ff1615611da15784611dad565b611dad87868585612c16565b6001600160a01b0387166000908152600d6020526040902054909150611dd39082612008565b6001600160a01b038088166000908152600d6020908152604080832094909455918a1681526014909152205460ff16611e77576039546001600160a01b038881166000818152600d602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015611e6457600080fd5b505af1925050508015611e75575060015b505b6001600160a01b03861660009081526014602052604090205460ff16611f08576039546001600160a01b038781166000818152600d602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015611ef557600080fd5b505af1925050508015611f06575060015b505b603954603a546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991611f409160040190815260200190565b600060405180830381600087803b158015611f5a57600080fd5b505af1925050508015611f6b575060015b50856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611fb191815260200190565b60405180910390a35060019695505050505050565b6000610f3683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611aae565b60008061201583856131ab565b905083811015610f365760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c7b565b60008261207657506000610c4b565b6000612082838561318c565b90508261208f8583613151565b14610f365760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c7b565b6000610f3683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612d16565b6040805463ff0000001916630100000017815580516002808252606082018352600092602083019080368337505060035482519293506001600160a01b03169183915060009061217a5761217a61310a565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106121ae576121ae61310a565b6001600160a01b039283166020918202929092010152603d5460405163b6f9de9560e01b815291169063b6f9de959085906121f49060009086908890429060040161321e565b6000604051808303818588803b15801561220d57600080fd5b505af1158015612221573d6000803e3d6000fd5b50506040805463ff00000019169055505050505050565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600d90915291822054612289918490611aae565b6001600160a01b038086166000908152600d602052604080822093909355908516815220546122b89083612008565b6001600160a01b038085166000818152600d602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061230c9086815260200190565b60405180910390a35060019392505050565b801561234b57601c54602255601d54602355601e54602455601f5460255560205460265560215460275550565b601654602255601754602355601854602455601954602555601a54602655601b5460275550565b6001600160a01b03831660009081526001602052604090205460ff161580156123a957506000546001600160a01b03838116911614155b80156123be57506001600160a01b0382163014155b80156123d857506004546001600160a01b03838116911614155b80156123f25750603e546001600160a01b03838116911614155b801561240c57506008546001600160a01b03838116911614155b801561242657506007546001600160a01b03838116911614155b801561244057506006546001600160a01b03838116911614155b156124df576001600160a01b0382166000908152600d6020526040902054600c5461246b83836131ab565b1115610da05760405162461bcd60e51b815260206004820152603e60248201527f546f74616c20486f6c64696e672069732063757272656e746c79206c696d697460448201527f65642c20796f752063616e206e6f74206275792074686174206d7563682e00006064820152608401610c7b565b505050565b603e546001600160a01b0383811691161480156125035750603b5460ff165b801561252857506001600160a01b03811660009081526013602052604090205460ff16155b156118db576001600160a01b0381166000908152603c602052604090205442116125945760405162461bcd60e51b815260206004820152601c60248201527f506c656173652077616974206265747765656e2074776f2062757973000000006044820152606401610c7b565b603b546125a990610100900460ff16426131ab565b6001600160a01b0382166000908152603c60205260409020555050565b6000546001600160a01b03838116911614610da057801561267257600b548311158061260a57506001600160a01b03841660009081526012602052604090205460ff165b8061262d57506001600160a01b03821660009081526012602052604090205460ff165b61266d5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610c7b565b610da0565b600a548311158061269b57506001600160a01b03841660009081526012602052604090205460ff165b806126be57506001600160a01b03821660009081526012602052604090205460ff165b610da05760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610c7b565b603e546000906001600160a01b0316331480159061272657506040546301000000900460ff16155b801561273a575060405462010000900460ff165b8015610ff9575050602c54306000908152600d6020526040902054101590565b6040805463ff00000019166301000000179055602d54602e5460009161277f91610caf565b61278b5760225461278e565b60005b905060006127b260026112e86027546112e886602c5461206790919063ffffffff16565b905060006127cb82602c54611fc690919063ffffffff16565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106128055761280561310a565b6001600160a01b0392831660209182029290920101526003548251911690829060019081106128365761283661310a565b6001600160a01b039283166020918202929092010152603d5460405163791ac94760e01b81524792919091169063791ac94790612880908690600090879030904290600401613253565b600060405180830381600087803b15801561289a57600080fd5b505af11580156128ae573d6000803e3d6000fd5b5050505060006128c78247611fc690919063ffffffff16565b905060006128e26128d98860026120e6565b60275490611fc6565b905060006128f760026112e88481878d612067565b90506000612914836112e86024548761206790919063ffffffff16565b90506000612931846112e86025548861206790919063ffffffff16565b9050600061294e856112e86026548961206790919063ffffffff16565b9050603960009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129a057600080fd5b505af1935050505080156129b2575060015b506008546040516000916001600160a01b03169061753090859084818181858888f193505050503d8060008114612a05576040519150601f19603f3d011682016040523d82523d6000602084013e612a0a565b606091505b50506006546040519192506000916001600160a01b039091169061753090859084818181858888f193505050503d8060008114612a63576040519150601f19603f3d011682016040523d82523d6000602084013e612a68565b606091505b5050905081612aca5760405162461bcd60e51b815260206004820152602860248201527f6d61726b6574696e672072656365697665722072656a656374656420455448206044820152673a3930b739b332b960c11b6064820152608401610c7b565b80612b225760405162461bcd60e51b815260206004820152602260248201527f6465762072656365697665722072656a656374656420455448207472616e736660448201526132b960f11b6064820152608401610c7b565b8b15612bfa57603d5460075460405163f305d71960e01b8152306004820152602481018f905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990889060c40160606040518083038185885af1158015612b98573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bbd919061328f565b505060408051888152602081018f90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b50506040805463ff000000191690555050505050505050505050565b6000808215612c71578315612c5157612c4a6028546112e860026112e860036115946027548c61206790919063ffffffff16565b9050612c8f565b612c4a6028546112e860026112e86027548a61206790919063ffffffff16565b612c8c6028546112e86027548861206790919063ffffffff16565b90505b306000908152600d6020526040902054612ca99082612008565b306000818152600d6020526040908190209290925590516001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612cfa9085815260200190565b60405180910390a3612d0c8582611fc6565b9695505050505050565b60008183612d375760405162461bcd60e51b8152600401610c7b9190612d44565b506000611adf8486613151565b600060208083528351808285015260005b81811015612d7157858101830151858201604001528201612d55565b81811115612d83576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610cac57600080fd5b60008060408385031215612dc157600080fd5b8235612dcc81612d99565b946020939093013593505050565b80358015158114612dea57600080fd5b919050565b600060208284031215612e0157600080fd5b610f3682612dda565b60008060408385031215612e1d57600080fd5b50508035926020909101359150565b600080600060408486031215612e4157600080fd5b833567ffffffffffffffff80821115612e5957600080fd5b818601915086601f830112612e6d57600080fd5b813581811115612e7c57600080fd5b8760208260051b8501011115612e9157600080fd5b602092830195509350612ea79186019050612dda565b90509250925092565b60008060408385031215612ec357600080fd5b8235612ece81612d99565b9150612edc60208401612dda565b90509250929050565b600080600060608486031215612efa57600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612f2657600080fd5b8335612f3181612d99565b92506020840135612f4181612d99565b929592945050506040919091013590565b600060208284031215612f6457600080fd5b8135610f3681612d99565b60008060408385031215612f8257600080fd5b612f8b83612dda565b9150602083013560ff81168114612fa157600080fd5b809150509250929050565b600080600080600060a08688031215612fc457600080fd5b612fcd86612dda565b9450602086013593506040860135925060608601359150612ff060808701612dda565b90509295509295909350565b60006020828403121561300e57600080fd5b5035919050565b6000806040838503121561302857600080fd5b82359150612edc60208401612dda565b6000806040838503121561304b57600080fd5b823561305681612d99565b91506020830135612fa181612d99565b60008060008060008060c0878903121561307f57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600080604083850312156130bc57600080fd5b612dcc83612dda565b60208082526006908201526510a7aba722a960d11b604082015260600190565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561314a5761314a613120565b5060010190565b60008261316e57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561318557600080fd5b5051919050565b60008160001904831182151516156131a6576131a6613120565b500290565b600082198211156131be576131be613120565b500190565b6000828210156131d5576131d5613120565b500390565b600081518084526020808501945080840160005b838110156132135781516001600160a01b0316875295820195908201906001016131ee565b509495945050505050565b84815260806020820152600061323760808301866131da565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a06040820152600061327260a08301866131da565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156132a457600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220c6c8c532e8ff76afc989b367495d6f6f853e56ac0504b444b809125c8cd92f5f64736f6c634300080a0033

Deployed Bytecode Sourcemap

12041:25107:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17274:80;;;;;;;;;;-1:-1:-1;17346:5:0;;;;;;;;;;;;-1:-1:-1;;;17346:5:0;;;;17274:80;;;;;;;:::i;:::-;;;;;;;;17696:216;;;;;;;;;;-1:-1:-1;17696:216:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;17696:216:0;1072:187:1;25971:113:0;;;;;;;;;;-1:-1:-1;25971:113:0;;;;;:::i;:::-;;:::i;:::-;;13665:34;;;;;;;;;;;;;;;;;;;1760:25:1;;;1748:2;1733:18;13665:34:0;1614:177:1;36594:150:0;;;;;;;;;;-1:-1:-1;36594:150:0;;;;;:::i;:::-;;:::i;13931:35::-;;;;;;;;;;;;;;;;17004:88;;;;;;;;;;-1:-1:-1;17077:12:0;;17004:88;;36752:277;;;;;;;;;;-1:-1:-1;36752:277:0;;;;;:::i;:::-;;:::i;26649:116::-;;;;;;;;;;-1:-1:-1;26649:116:0;;;;;:::i;:::-;;:::i;34979:183::-;;;;;;;;;;-1:-1:-1;34979:183:0;;;;;:::i;:::-;;:::i;31314:342::-;;;;;;;;;;-1:-1:-1;31314:342:0;;;;;:::i;:::-;;:::i;18214:368::-;;;;;;;;;;-1:-1:-1;18214:368:0;;;;;:::i;:::-;;:::i;35822:146::-;;;;;;;;;;-1:-1:-1;35822:146:0;;;;;:::i;:::-;;:::i;36191:142::-;;;;;;;;;;;;;:::i;35442:183::-;;;;;;;;;;-1:-1:-1;35442:183:0;;;;;:::i;:::-;;:::i;26435:165::-;;;;;;;;;;-1:-1:-1;26435:165:0;;;;;:::i;:::-;;:::i;13583:32::-;;;;;;;;;;;;;;;;3640:103;;;;;;;;;;-1:-1:-1;3640:103:0;;;;;:::i;:::-;3695:4;3730:5;-1:-1:-1;;;;;3719:16:0;;;3730:5;;3719:16;;3640:103;30822:445;;;;;;;;;;-1:-1:-1;30822:445:0;;;;;:::i;:::-;;:::i;13805:35::-;;;;;;;;;;;;;;;;17098:80;;;;;;;;;;-1:-1:-1;17098:80:0;;12722:2;5040:36:1;;5028:2;5013:18;17098:80:0;4898:184:1;12843:60:0;;;;;;;;;;;;;;;;13847:33;;;;;;;;;;;;;;;;22111:207;;;;;;;;;;;;;:::i;26297:83::-;;;;;;;;;;;;;:::i;33065:130::-;;;;;;;;;;-1:-1:-1;33065:130:0;;;;;:::i;:::-;;:::i;14015:32::-;;;;;;;;;;;;;;;;17920:122;;;;;;;;;;-1:-1:-1;17920:122:0;;;;;:::i;:::-;;:::i;32747:120::-;;;;;;;;;;-1:-1:-1;32747:120:0;;;;;:::i;:::-;;:::i;15581:30::-;;;;;;;;;;-1:-1:-1;15581:30:0;;;;;;;;;;;17444:105;;;;;;;;;;-1:-1:-1;17444:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;17528:18:0;17510:7;17528:18;;;:9;:18;;;;;;;17444:105;18591:209;;;;;;;;;;-1:-1:-1;18591:209:0;;;;;:::i;:::-;;:::i;13540:35::-;;;;;;;;;;;;;;;;12978:62;;;;;;;;;;;;;;;;31978:158;;;;;;;;;;-1:-1:-1;31978:158:0;;;;;:::i;:::-;;:::i;29243:442::-;;;;;;;;;;-1:-1:-1;29243:442:0;;;;;:::i;:::-;;:::i;18877:156::-;;;;;;;;;;-1:-1:-1;18877:156:0;;;;;:::i;:::-;;:::i;17360:78::-;;;;;;;;;;-1:-1:-1;17412:7:0;17430:5;-1:-1:-1;;;;;17430:5:0;17360:78;;;-1:-1:-1;;;;;5689:32:1;;;5671:51;;5659:2;5644:18;17360:78:0;5525:203:1;17184:84:0;;;;;;;;;;-1:-1:-1;17258:7:0;;;;;;;;;;;;-1:-1:-1;;;17258:7:0;;;;17184:84;;36009:136;;;;;;;;;;-1:-1:-1;36009:136:0;;;;;:::i;:::-;;:::i;34496:228::-;;;;;;;;;;-1:-1:-1;34496:228:0;;;;;:::i;:::-;;:::i;15446:19::-;;;;;;;;;;-1:-1:-1;15446:19:0;;;;-1:-1:-1;;;;;15446:19:0;;;18050:156;;;;;;;;;;-1:-1:-1;18050:156:0;;;;;:::i;:::-;;:::i;29733:105::-;;;;;;;;;;;;;:::i;3298:102::-;;;;;;;;;;-1:-1:-1;3298:102:0;;;;;:::i;:::-;;:::i;33839:599::-;;;;;;;;;;-1:-1:-1;33839:599:0;;;;;:::i;:::-;;:::i;12911:59::-;;;;;;;;;;;;;;;;36375:167;;;;;;;;;;-1:-1:-1;36375:167:0;;;;;:::i;:::-;;:::i;24412:391::-;;;;;;;;;;;;;:::i;17555:133::-;;;;;;;;;;-1:-1:-1;17555:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;17657:19:0;;;17639:7;17657:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;17555:133;34762:180;;;;;;;;;;-1:-1:-1;34762:180:0;;;;;:::i;:::-;;:::i;32169:162::-;;;;;;;;;;-1:-1:-1;32169:162:0;;;;;:::i;:::-;;:::i;26113:145::-;;;;;;;;;;-1:-1:-1;26113:145:0;;;;;:::i;:::-;;:::i;3475:105::-;;;;;;;;;;-1:-1:-1;3475:105:0;;;;;:::i;:::-;;:::i;35677:90::-;;;;;;;;;;;;;:::i;24027:315::-;;;;;;;;;;-1:-1:-1;24027:315:0;;;;;:::i;:::-;;:::i;4047:189::-;;;;;;;;;;-1:-1:-1;4047:189:0;;;;;:::i;:::-;;:::i;35206:181::-;;;;;;;;;;;;;:::i;32368:347::-;;;;;;;;;;-1:-1:-1;32368:347:0;;;;;:::i;:::-;;:::i;33228:577::-;;;;;;;;;;-1:-1:-1;33228:577:0;;;;;:::i;:::-;;:::i;32902:128::-;;;;;;;;;;-1:-1:-1;32902:128:0;;;;;:::i;:::-;;:::i;15415:24::-;;;;;;;;;;-1:-1:-1;15415:24:0;;;;-1:-1:-1;;;;;15415:24:0;;;13747:31;;;;;;;;;;;;;;;;3813:115;;;;;;;;;;-1:-1:-1;3813:115:0;;;;;:::i;:::-;;:::i;15543:31::-;;;;;;;;;;-1:-1:-1;15543:31:0;;;;;;;;;;;17696:216;17800:10;17771:4;17788:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;17788:32:0;;;;;;;;;;:41;;;17845:37;17771:4;;17788:32;;17845:37;;;;17823:6;1760:25:1;;1748:2;1733:18;;1614:177;17845:37:0;;;;;;;;-1:-1:-1;17900:4:0;17696:216;;;;;:::o;25971:113::-;3695:4;3730:5;-1:-1:-1;;;;;3730:5:0;3022:10;3719:16;3006:38;;;;-1:-1:-1;;;3006:38:0;;;;;;;:::i;:::-;;;;;;;;;26036:11:::1;:21:::0;;31897:12;31884:10;:25;-1:-1:-1;;31920:18:0;26036:21;::::1;;;;-1:-1:-1::0;;31920:18:0;;;;;;;;;25971:113::o;26068:8::-:1;25971:113:::0;:::o;36594:150::-;36674:4;36730:6;36698:29;36718:8;36698:19;:29::i;:::-;:38;;36594:150;-1:-1:-1;;;36594:150:0:o;36752:277::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;36862:16:::1;::::0;::::1;;36854:47;;;::::0;-1:-1:-1;;;36854:47:0;;8269:2:1;36854:47:0::1;::::0;::::1;8251:21:1::0;8308:2;8288:18;;;8281:30;-1:-1:-1;;;8327:18:1;;;8320:48;8385:18;;36854:47:0::1;8067:342:1::0;36854:47:0::1;36917:9;36912:110;36932:21:::0;;::::1;36912:110;;;37002:8;36975:9;:24;36985:10;;36996:1;36985:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36975:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;36975:24:0;:35;;-1:-1:-1;;36975:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36955:3;::::1;::::0;::::1;:::i;:::-;;;;36912:110;;;;36752:277:::0;;;:::o;26649:116::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26725:23:0;;;::::1;;::::0;;;:13:::1;:23;::::0;;;;:32;;-1:-1:-1;;26725:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;26649:116::o;34979:183::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;35077:15:::1;:25:::0;;;;35113:26:::1;:41:::0;34979:183::o;31314:342::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;31474:1:::1;31447:23;31459:11:::0;31447:9;:23:::1;:::i;:::-;:28;;:55;;;;;31491:11;31479:9;:23;31447:55;31439:64;;;::::0;::::1;;31514:26;:38:::0;;;;31563:28:::1;:42:::0;31616:23:::1;:32:::0;31314:342::o;18214:368::-;-1:-1:-1;;;;;18334:19:0;;18314:4;18334:19;;;:11;:19;;;;;;;;18354:10;18334:31;;;;;;;;-1:-1:-1;;18334:52:0;18331:186;;18436:69;;;;;;;;;;;-1:-1:-1;;;18436:69:0;;;;;;;;-1:-1:-1;;;;;18436:19:0;;-1:-1:-1;18436:19:0;;;:11;:19;;;;;18456:10;18436:31;;;;;;;;;;:69;;18472:6;;18436:35;:69::i;:::-;-1:-1:-1;;;;;18402:19:0;;;;;;:11;:19;;;;;;;;18422:10;18402:31;;;;;;;:103;18331:186;18534:40;18548:6;18556:9;18567:6;18534:13;:40::i;:::-;18527:47;;18214:368;;;;;;:::o;35822:146::-;35918:11;;:42;;-1:-1:-1;;;35918:42:0;;-1:-1:-1;;;;;5689:32:1;;;35918:42:0;;;5671:51:1;35891:7:0;;35918:11;;:29;;5644:18:1;;35918:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36191:142::-;36319:4;;-1:-1:-1;;;;;36319:4:0;36244:7;17528:18;;;:9;:18;;;;;;36271:54;;36298:4;;-1:-1:-1;;;;;36298:4:0;17510:7;17528:18;;;:9;:18;;;;;;36271:33;;:12;;;:16;:33::i;:::-;:37;;:54::i;:::-;36264:61;;36191:142;:::o;35442:183::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;35552:11:::1;::::0;:65:::1;::::0;-1:-1:-1;;;35552:65:0;;::::1;::::0;::::1;9403:25:1::0;;;9444:18;;;9437:34;;;-1:-1:-1;;;;;35552:11:0;;::::1;::::0;:35:::1;::::0;9376:18:1;;35552:65:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35442:183:::0;;:::o;26435:165::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;26520:18:::1;:28:::0;;-1:-1:-1;;26559:33:0;26520:28;::::1;;-1:-1:-1::0;;26559:33:0;;;;;26520:28:::1;;26559:33:::0;;;::::1;::::0;;;::::1;;::::0;;26435:165::o;30822:445::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;30977:18:::1;:29:::0;;31017:14:::1;:21:::0;;;;-1:-1:-1;31049:22:0::1;:26:::0;31086:17:::1;:27:::0;;;;31124:22:::1;:32:::0;;;;31190:12:::1;31167:20;:35:::0;-1:-1:-1;;31213:46:0;;;30977:29;::::1;;-1:-1:-1::0;;31213:46:0;;;;;30977:29:::1;31213:46:::0;::::1;;::::0;;;::::1;;::::0;;30822:445::o;22111:207::-;22155:4;22212:15;22174:35;22195:13;;22174:16;;:20;;:35;;;;:::i;:::-;:53;22171:140;;;-1:-1:-1;22250:4:0;;22111:207::o;22171:140::-;-1:-1:-1;22294:5:0;;22111:207::o;26297:83::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;26371:1:::1;26352:16;:20:::0;26297:83::o;33065:130::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33154:24:0;;;::::1;;::::0;;;:16:::1;:24;::::0;;;;:33;;-1:-1:-1;;33154:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33065:130::o;17920:122::-;17975:4;17999:35;18007:7;-1:-1:-1;;17999:7:0;:35::i;32747:120::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32831:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;;-1:-1:-1;;32831:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32747:120::o;18591:209::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;18665:11:::1;::::0;::::1;::::0;::::1;;;18664:12;:27:::0;::::1;;;;18680:11;18664:27;18656:36;;;::::0;::::1;;-1:-1:-1::0;18703:11:0::1;:18:::0;;-1:-1:-1;;18703:18:0::1;;;::::0;;18732:16:::1;:24:::0;;-1:-1:-1;;18732:24:0::1;::::0;;18780:12:::1;18767:10;:25:::0;18591:209::o;31978:158::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;32084:44:::1;32122:5;32084:33;32101:15;32084:12;;:16;;:33;;;;:::i;:::-;:37:::0;::::1;:44::i;:::-;32066:15;:62:::0;-1:-1:-1;31978:158:0:o;29243:442::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;29351:26:::1;29380:19;:6:::0;29390:8:::1;29380:19;:::i;:::-;29351:48:::0;-1:-1:-1;29410:19:0::1;29432:27;29351:48:::0;29455:3:::1;29432:22;:27::i;:::-;29493:4;::::0;29410:49;;-1:-1:-1;29470:28:0::1;::::0;29410:49;;-1:-1:-1;;;;;29493:4:0::1;29470:9;:28::i;:::-;29512:24;29509:169;;;29583:15;29552:28;:46:::0;29642:23:::1;::::0;29618:48:::1;::::0;1760:25:1;;;29618:48:0::1;::::0;1748:2:1;1733:18;29618:48:0::1;;;;;;;29340:345;;29243:442:::0;;:::o;18877:156::-;3695:4;3730:5;-1:-1:-1;;;;;3730:5:0;3022:10;3719:16;3006:38;;;;-1:-1:-1;;;3006:38:0;;;;;;;:::i;:::-;18980:43:::1;19017:5;18980:32;18997:14;18980:12;;:16;;:32;;;;:::i;:43::-;18962:15;:61:::0;-1:-1:-1;18877:156:0:o;36009:136::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;36099:6:::1;36093:3;:12;36085:21;;;::::0;::::1;;36117:14;:20:::0;36009:136::o;34496:228::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;34615:21:::1;:46:::0;;-1:-1:-1;;;;;34615:46:0;;::::1;-1:-1:-1::0;;;;;;34615:46:0;;::::1;;::::0;;;34672:20:::1;:44:::0;;;;;::::1;::::0;::::1;;::::0;;34496:228::o;18050:156::-;18130:4;18154:44;18168:10;18180:9;18191:6;18154:13;:44::i;29733:105::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;29829:1:::1;29798:28;:32:::0;29733:105::o;3298:102::-;3695:4;3730:5;-1:-1:-1;;;;;3730:5:0;3022:10;3719:16;3006:38;;;;-1:-1:-1;;;3006:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3362:23:0::1;;::::0;;;3388:4:::1;3362:23;::::0;;;;;;;:30;;-1:-1:-1;;3362:30:0::1;::::0;;::::1;::::0;;3298:102::o;33839:599::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;34044:16:::1;:36:::0;;;34091:14:::1;:32:::0;;;34134:17:::1;:38:::0;;;34183:16:::1;:36:::0;;;34230:15:::1;:29:::0;;;34285:102:::1;34248:11:::0;34285:85:::1;34202:17:::0;34285:85;34154:18;34285:85;34063:17;34108:15;34285:21:::1;:38::i;:::-;:42:::0;::::1;:62::i;:102::-;34270:12;:117:::0;34398:14:::1;:32:::0;-1:-1:-1;;;;;33839:599:0:o;36375:167::-;36443:7;36470:64;36511:22;:20;:22::i;:::-;36493:4;;-1:-1:-1;;;;;36493:4:0;17510:7;17528:18;;;:9;:18;;;;;;36470:36;;36483:22;;36503:1;;36483:15;:19;;:22::i;:::-;36470:8;;:12;:36::i;24412:391::-;24461:7;24481:21;24505:78;24567:15;24505:57;24538:23;;24505:28;;:32;;:57;;;;:::i;:78::-;24481:102;;24594:19;24616:88;24695:8;;24616:74;24661:28;;24616:40;24629:26;;24616:8;;:12;;:40;;;;:::i;:88::-;24594:110;;24722:73;24735:59;24770:23;;24735:30;24751:13;24735:11;:15;;:30;;;;:::i;:59::-;24722:8;;;:12;:73::i;:::-;24715:80;;;;24412:391;:::o;34762:180::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;34854:11:::1;:22:::0;;-1:-1:-1;;34854:22:0::1;::::0;;::::1;;;;::::0;;34903:12:::1;::::0;34928:5:::1;::::0;34903:22:::1;::::0;34918:7;;34903:22:::1;:::i;:::-;:30;;;;:::i;:::-;34887:13;:46:::0;-1:-1:-1;;34762:180:0:o;32169:162::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;32278:45:::1;32317:5;32278:34;32295:16;32278:12;;:16;;:34;;;;:::i;:45::-;32259:16;:64:::0;-1:-1:-1;32169:162:0:o;26113:145::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;26200:15:::1;26181:16;:34:::0;26226:13:::1;:24:::0;26113:145::o;3475:105::-;3695:4;3730:5;-1:-1:-1;;;;;3730:5:0;3022:10;3719:16;3006:38;;;;-1:-1:-1;;;3006:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3541:23:0::1;3567:5;3541:23:::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;3541:31:0::1;::::0;;3475:105::o;35677:90::-;35722:11;;:37;;-1:-1:-1;;;35722:37:0;;35748:10;35722:37;;;5671:51:1;-1:-1:-1;;;;;35722:11:0;;;;:25;;5644:18:1;;35722:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24027:315;24083:7;24133:12;24119:10;;24106;;:23;;;;:::i;:::-;:39;24103:76;;24155:14;;:21;;24174:1;24155:18;:21::i;24103:76::-;24192:7;:86;;;;;24263:15;24203:57;24236:23;;24203:28;;:32;;:57;;;;:::i;:::-;:75;24192:86;24189:120;;;24288:18;:16;:18::i;24189:120::-;-1:-1:-1;;24326:8:0;;;24027:315::o;4047:189::-;3695:4;3730:5;-1:-1:-1;;;;;3730:5:0;3022:10;3719:16;3006:38;;;;-1:-1:-1;;;3006:38:0;;;;;;;:::i;:::-;4127:5:::1;:15:::0;;-1:-1:-1;;;;;;4127:15:0::1;-1:-1:-1::0;;;;;4127:15:0;::::1;::::0;;::::1;::::0;;4153:23;;;-1:-1:-1;4153:23:0::1;::::0;;;;;;;;:30;;-1:-1:-1;;4153:30:0::1;::::0;;::::1;::::0;;;4199:29;;5671:51:1;;;4199:29:0::1;::::0;5644:18:1;4199:29:0::1;;;;;;;4047:189:::0;:::o;35206:181::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;35329:20:::1;::::0;35321:58:::1;::::0;35289:21:::1;::::0;-1:-1:-1;;;;;35329:20:0::1;::::0;35321:58;::::1;;;::::0;35289:21;;35260:26:::1;35321:58:::0;35260:26;35321:58;35289:21;35329:20;35321:58;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;35249:138;35206:181::o:0;32368:347::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32465:23:0;::::1;32483:4;32465:23;::::0;::::1;::::0;:41:::1;;-1:-1:-1::0;32502:4:0::1;::::0;-1:-1:-1;;;;;32492:14:0;;::::1;32502:4:::0;::::1;32492:14;;32465:41;32457:50;;;::::0;::::1;;-1:-1:-1::0;;;;;32518:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;:33;;-1:-1:-1;;32518:33:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;32562:146:::1;;32587:11;::::0;:31:::1;::::0;-1:-1:-1;;;32587:31:0;;-1:-1:-1;;;;;10204:32:1;;;32587:31:0::1;::::0;::::1;10186:51:1::0;32587:11:0::1;10253:18:1::0;;;10246:34;32587:11:0;;::::1;::::0;:20:::1;::::0;10159:18:1;;32587:31:0::1;10004:282:1::0;32562:146:0::1;32649:11;::::0;-1:-1:-1;;;;;32678:17:0;;::::1;32649:11;32678:17:::0;;;:9:::1;:17;::::0;;;;;;;32649:47;;-1:-1:-1;;;32649:47:0;;::::1;::::0;::::1;10186:51:1::0;;;;10253:18;;;10246:34;32649:11:0;::::1;::::0;:20:::1;::::0;10159:18:1;;32649:47:0::1;10004:282:1::0;33228:577:0;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;33427:15:::1;:34:::0;;;33472:13:::1;:30:::0;;;33513:16:::1;:36:::0;;;33560:15:::1;:34:::0;;;33605:14:::1;:27:::0;;;33657:97:::1;33622:10:::0;33657:81:::1;33578:16:::0;33657:81;33532:17;33657:81;33445:16;33488:14;33657:20:::1;:36::i;:97::-;33643:11;:111:::0;33765:14:::1;:32:::0;-1:-1:-1;;;;;33228:577:0:o;32902:128::-;3183:24;3196:10;3183:12;:24::i;:::-;3175:48;;;;-1:-1:-1;;;3175:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32990:23:0;;;::::1;;::::0;;;:15:::1;:23;::::0;;;;:32;;-1:-1:-1;;32990:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32902:128::o;3813:115::-;-1:-1:-1;;;;;3897:23:0;3873:4;3897:23;;;:14;:23;;;;;;;;;3813:115::o;700:192::-;786:7;822:12;814:6;;;;806:29;;;;-1:-1:-1;;;806:29:0;;;;;;;;:::i;:::-;-1:-1:-1;846:9:0;858:5;862:1;858;:5;:::i;:::-;846:17;700:192;-1:-1:-1;;;;;700:192:0:o;19072:1951::-;19164:4;19185:10;31772;;:15;;;31705:90;19185:10;19184:11;:32;;;;-1:-1:-1;19212:4:0;;-1:-1:-1;;;;;19199:17:0;;;19212:4;;19199:17;19184:32;19181:81;;;-1:-1:-1;;;;;19227:17:0;;19247:1;19227:17;;;:9;:17;;;;;;19219:30;;;;;;19251:8;31897:12;31884:10;:25;31920:11;:18;;-1:-1:-1;;31920:18:0;;;;;31846:100;19251:8;19285:6;;;;;;;19282:63;;;19301:41;19316:6;19324:9;19335:6;19301:14;:41::i;:::-;19294:48;;;;19282:63;-1:-1:-1;;;;;19401:22:0;;;;;;:14;:22;;;;;;;;19400:23;:53;;;;-1:-1:-1;;;;;;19428:25:0;;;;;;:14;:25;;;;;;;;19427:26;19400:53;:78;;;;-1:-1:-1;;;;;;19458:20:0;;;;;;:9;:20;;;;;;;;19457:21;19400:78;19397:155;;;19502:11;;;;;;;19494:46;;;;-1:-1:-1;;;19494:46:0;;10902:2:1;19494:46:0;;;10884:21:1;10941:2;10921:18;;;10914:30;10980:25;10960:18;;;10953:53;11023:18;;19494:46:0;10700:347:1;19494:46:0;-1:-1:-1;;;;;19617:24:0;;;;;;:13;:24;;;;;;;;19616:25;:51;;;;-1:-1:-1;;;;;;19646:21:0;;;;;;:13;:21;;;;;;;;19645:22;19616:51;19608:86;;;;-1:-1:-1;;;19608:86:0;;11254:2:1;19608:86:0;;;11236:21:1;11293:2;11273:18;;;11266:30;-1:-1:-1;;;11312:18:1;;;11305:52;11374:18;;19608:86:0;11052:346:1;19608:86:0;19773:4;;-1:-1:-1;;;;;19760:17:0;;;19773:4;;19760:17;19824:22;19760:17;19824:14;:22::i;:::-;19888:41;19903:6;19911:9;19922:6;19888:14;:41::i;:::-;19970:35;19987:6;19995:9;19970:16;:35::i;:::-;20043:47;20056:6;20064;20072:9;20083:6;20043:12;:47::i;:::-;20144:14;20161:13;:11;:13::i;:::-;20144:30;;20237:16;:14;:16::i;:::-;20234:35;;;20256:10;:8;:10::i;:::-;20328:53;;;;;;;;;;;-1:-1:-1;;;20328:53:0;;;;;;;;-1:-1:-1;;;;;20328:17:0;;-1:-1:-1;20328:17:0;;;:9;:17;;;;;;;;:53;;20350:6;;20328:21;:53::i;:::-;-1:-1:-1;;;;;20308:17:0;;;;;;:9;:17;;;;;;;;:73;;;;23942:11;:19;;;;;;;;23941:20;20419:75;;20488:6;20419:75;;;20443:42;20451:6;20459;20467;20475:9;20443:7;:42::i;:::-;-1:-1:-1;;;;;20528:20:0;;;;;;:9;:20;;;;;;20394:100;;-1:-1:-1;20528:40:0;;20394:100;20528:24;:40::i;:::-;-1:-1:-1;;;;;20505:20:0;;;;;;;:9;:20;;;;;;;;:63;;;;20614:24;;;;;:16;:24;;;;;;;20610:119;;20659:11;;-1:-1:-1;;;;;20688:17:0;;;20659:11;20688:17;;;:9;:17;;;;;;;;20659:47;;-1:-1:-1;;;20659:47:0;;;;;10186:51:1;;;;10253:18;;;10246:34;20659:11:0;;;:20;;10159:18:1;;20659:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20655:63;;-1:-1:-1;;;;;20745:27:0;;;;;;:16;:27;;;;;;;;20741:129;;20793:11;;-1:-1:-1;;;;;20825:20:0;;;20793:11;20825:20;;;:9;:20;;;;;;;;20793:53;;-1:-1:-1;;;20793:53:0;;;;;10186:51:1;;;;10253:18;;;10246:34;20793:11:0;;;:20;;10159:18:1;;20793:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20789:69;;20886:11;;20906:14;;20886:35;;-1:-1:-1;;;;;;20886:35:0;;-1:-1:-1;;;;;20886:11:0;;;;:19;;:35;;;;1760:25:1;;;1748:2;1733:18;;1614:177;20886:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20882:51;20967:9;-1:-1:-1;;;;;20950:43:0;20959:6;-1:-1:-1;;;;;20950:43:0;;20978:14;20950:43;;;;1760:25:1;;1748:2;1733:18;;1614:177;20950:43:0;;;;;;;;-1:-1:-1;21011:4:0;;19072:1951;-1:-1:-1;;;;;;19072:1951:0:o;558:136::-;616:7;643:43;647:1;650;643:43;;;;;;;;;;;;;;;;;:3;:43::i;371:181::-;429:7;;461:5;465:1;461;:5;:::i;:::-;449:17;;490:1;485;:6;;477:46;;;;-1:-1:-1;;;477:46:0;;11605:2:1;477:46:0;;;11587:21:1;11644:2;11624:18;;;11617:30;11683:29;11663:18;;;11656:57;11730:18;;477:46:0;11403:351:1;898:250:0;956:7;980:6;976:47;;-1:-1:-1;1010:1:0;1003:8;;976:47;1035:9;1047:5;1051:1;1047;:5;:::i;:::-;1035:17;-1:-1:-1;1080:1:0;1071:5;1075:1;1035:17;1071:5;:::i;:::-;:10;1063:56;;;;-1:-1:-1;;;1063:56:0;;11961:2:1;1063:56:0;;;11943:21:1;12000:2;11980:18;;;11973:30;12039:34;12019:18;;;12012:62;-1:-1:-1;;;12090:18:1;;;12083:31;12131:19;;1063:56:0;11759:397:1;1154:132:0;1212:7;1239:39;1243:1;1246;1239:39;;;;;;;;;;;;;;;;;:3;:39::i;30420:361::-;15658:6;:13;;-1:-1:-1;;15658:13:0;;;;;30520:16;;30534:1:::1;30520:16:::0;;;;;::::1;::::0;;-1:-1:-1;;30520:16:0::1;::::0;::::1;::::0;15658:6;30520:16:::1;::::0;::::1;-1:-1:-1::0;;30557:4:0::1;::::0;30547:7;;;;-1:-1:-1;;;;;;30557:4:0::1;::::0;30547:7;;-1:-1:-1;30557:4:0::1;::::0;30547:7:::1;;;;:::i;:::-;;;;;;:14;-1:-1:-1::0;;;;;30547:14:0::1;;;-1:-1:-1::0;;;;;30547:14:0::1;;;::::0;::::1;30590:4;30572;30577:1;30572:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30572:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;30608:6:::1;::::0;:165:::1;::::0;-1:-1:-1;;;30608:165:0;;:6;::::1;::::0;:57:::1;::::0;30673:6;;30608:165:::1;::::0;:6:::1;::::0;30711:4;;30730:2;;30747:15:::1;::::0;30608:165:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;15676:6:0;:14;;-1:-1:-1;;15676:14:0;;;-1:-1:-1;;;;;;30420:361:0:o;21060:330::-;21190:53;;;;;;;;;;;-1:-1:-1;;;21190:53:0;;;;;;;;-1:-1:-1;;;;;21190:17:0;;21153:4;21190:17;;;:9;:17;;;;;;;:53;;21212:6;;21190:21;:53::i;:::-;-1:-1:-1;;;;;21170:17:0;;;;;;;:9;:17;;;;;;:73;;;;21277:20;;;;;;;:32;;21302:6;21277:24;:32::i;:::-;-1:-1:-1;;;;;21254:20:0;;;;;;;:9;:20;;;;;;;:55;;;;21325:35;;;;;;;;;;21353:6;1760:25:1;;1748:2;1733:18;;1614:177;21325:35:0;;;;;;;;-1:-1:-1;21378:4:0;21060:330;;;;;:::o;21449:616::-;21509:6;21506:552;;;21546:16;;21531:12;:31;21590:14;;21577:10;:27;21635:17;;21619:13;:33;21682:16;;21667:12;:31;21722:15;;21713:6;:24;21763:12;;21752:8;:23;25971:113;:::o;21506:552::-;21823:15;;21808:12;:30;21866:13;;21853:10;:26;21910:16;;21894:13;:32;21956:15;;21941:12;:30;21995:14;;21986:6;:23;22035:11;;22024:8;:22;21449:616;:::o;23275:531::-;-1:-1:-1;;;;;23380:22:0;;;;;;:14;:22;;;;;;;;23379:23;:45;;;;-1:-1:-1;23419:5:0;;-1:-1:-1;;;;;23406:18:0;;;23419:5;;23406:18;;23379:45;:75;;;;-1:-1:-1;;;;;;23428:26:0;;23449:4;23428:26;;23379:75;:106;;;;-1:-1:-1;23480:4:0;;-1:-1:-1;;;;;23459:26:0;;;23480:4;;23459:26;;23379:106;:127;;;;-1:-1:-1;23502:4:0;;-1:-1:-1;;;;;23489:17:0;;;23502:4;;23489:17;;23379:127;:164;;;;-1:-1:-1;23523:20:0;;-1:-1:-1;;;;;23510:33:0;;;23523:20;;23510:33;;23379:164;:202;;;;-1:-1:-1;23560:21:0;;-1:-1:-1;;;;;23547:34:0;;;23560:21;;23547:34;;23379:202;:222;;;;-1:-1:-1;23598:3:0;;-1:-1:-1;;;;;23585:16:0;;;23598:3;;23585:16;;23379:222;23375:424;;;-1:-1:-1;;;;;17528:18:0;;23617;17528;;;:9;:18;;;;;;23706:15;;23682:19;23695:6;17528:18;23682:19;:::i;:::-;23681:40;;23673:114;;;;-1:-1:-1;;;23673:114:0;;13476:2:1;23673:114:0;;;13458:21:1;13515:2;13495:18;;;13488:30;13554:34;13534:18;;;13527:62;13625:32;13605:18;;;13598:60;13675:19;;23673:114:0;13274:426:1;23375:424:0;23275:531;;;:::o;22865:378::-;22960:4;;-1:-1:-1;;;;;22950:14:0;;;22960:4;;22950:14;:49;;;;-1:-1:-1;22981:18:0;;;;22950:49;:94;;;;-1:-1:-1;;;;;;23017:27:0;;;;;;:16;:27;;;;;;;;23016:28;22950:94;22946:290;;;-1:-1:-1;;;;;23069:24:0;;;;;;:13;:24;;;;;;23096:15;-1:-1:-1;23061:82:0;;;;-1:-1:-1;;;23061:82:0;;13907:2:1;23061:82:0;;;13889:21:1;13946:2;13926:18;;;13919:30;13985;13965:18;;;13958:58;14033:18;;23061:82:0;13705:352:1;23061:82:0;23203:21;;23185:39;;23203:21;;;;;23185:15;:39;:::i;:::-;-1:-1:-1;;;;;23158:24:0;;;;;;:13;:24;;;;;:66;22865:378;;:::o;22352:478::-;22480:5;;-1:-1:-1;;;;;22467:18:0;;;22480:5;;22467:18;22463:360;;22504:6;22501:311;;;22548:16;;22538:6;:26;;:53;;;-1:-1:-1;;;;;;22568:23:0;;;;;;:15;:23;;;;;;;;22538:53;:83;;;-1:-1:-1;;;;;;22595:26:0;;;;;;:15;:26;;;;;;;;22538:83;22530:113;;;;-1:-1:-1;;;22530:113:0;;14264:2:1;22530:113:0;;;14246:21:1;14303:2;14283:18;;;14276:30;-1:-1:-1;;;14322:18:1;;;14315:47;14379:18;;22530:113:0;14062:341:1;22530:113:0;22501:311;;;22702:15;;22692:6;:25;;:52;;;-1:-1:-1;;;;;;22721:23:0;;;;;;:15;:23;;;;;;;;22692:52;:82;;;-1:-1:-1;;;;;;22748:26:0;;;;;;:15;:26;;;;;;;;22692:82;22684:112;;;;-1:-1:-1;;;22684:112:0;;14264:2:1;22684:112:0;;;14246:21:1;14303:2;14283:18;;;14276:30;-1:-1:-1;;;14322:18:1;;;14315:47;14379:18;;22684:112:0;14062:341:1;25743:197:0;25830:4;;25792;;-1:-1:-1;;;;;25830:4:0;25816:10;:18;;;;:38;;-1:-1:-1;25848:6:0;;;;;;;25847:7;25816:38;:62;;;;-1:-1:-1;25867:11:0;;;;;;;25816:62;:116;;;;-1:-1:-1;;25919:13:0;;25909:4;25891:24;;;;:9;:24;;;;;;:41;;;25743:197::o;26819:2037::-;15658:6;:13;;-1:-1:-1;;15658:13:0;;;;;26914:15:::1;::::0;26931:26:::1;::::0;15658:13;;26898:60:::1;::::0;:15:::1;:60::i;:::-;:79;;26965:12;;26898:79;;;26961:1;26898:79;26868:109;;26988:23;27014:59;27071:1;27014:52;27057:8;;27014:38;27032:19;27014:13;;:17;;:38;;;;:::i;:59::-;26988:85;;27084:20;27107:34;27125:15;27107:13;;:17;;:34;;;;:::i;:::-;27178:16;::::0;;27192:1:::1;27178:16:::0;;;;;::::1;::::0;;27084:57;;-1:-1:-1;27154:21:0::1;::::0;27178:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;27178:16:0::1;27154:40;;27223:4;27205;27210:1;27205:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27205:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;27249:4:::1;::::0;27239:7;;27249:4;::::1;::::0;27239;;27249;;27239:7;::::1;;;;;:::i;:::-;-1:-1:-1::0;;;;;27239:14:0;;::::1;:7;::::0;;::::1;::::0;;;;;:14;27324:6:::1;::::0;:188:::1;::::0;-1:-1:-1;;;27324:188:0;;27290:21:::1;::::0;27324:6;;;::::1;::::0;:57:::1;::::0;:188:::1;::::0;27396:12;;27266:21:::1;::::0;27439:4;;27466::::1;::::0;27486:15:::1;::::0;27324:188:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27523:17;27543:40;27569:13;27543:21;:25;;:40;;;;:::i;:::-;27523:60:::0;-1:-1:-1;27594:19:0::1;27616:40;27629:26;:19:::0;27653:1:::1;27629:23;:26::i;:::-;27616:8;::::0;;:12:::1;:40::i;:::-;27594:62:::0;-1:-1:-1;27667:26:0::1;27696:58;27752:1;27696:51;27594:62:::0;27696:51;:9;27710:19;27696:13:::1;:34::i;:58::-;27667:87;;27765:27;27795:45;27828:11;27795:28;27809:13;;27795:9;:13;;:28;;;;:::i;:45::-;27765:75;;27851:26;27880:44;27912:11;27880:27;27894:12;;27880:9;:13;;:27;;;;:::i;:44::-;27851:73;;27935:20;27958:38;27984:11;27958:21;27972:6;;27958:9;:13;;:21;;;;:::i;:38::-;27935:61;;28016:11;;;;;;;;;-1:-1:-1::0;;;;;28016:11:0::1;-1:-1:-1::0;;;;;28016:19:0::1;;28043;28016:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;-1:-1:-1::0;28146:20:0::1;::::0;28138:77:::1;::::0;28088:21:::1;::::0;-1:-1:-1;;;;;28146:20:0::1;::::0;28205:5:::1;::::0;28180:18;;28088:21;28138:77;28088:21;28138:77;28180:18;28146:20;28205:5;28138:77:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;28279:3:0::1;::::0;28271:54:::1;::::0;28087:128;;-1:-1:-1;28227:15:0::1;::::0;-1:-1:-1;;;;;28279:3:0;;::::1;::::0;28315:5:::1;::::0;28296:12;;28227:15;28271:54;28227:15;28271:54;28296:12;28279:3;28315:5;28271:54:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28226:99;;;28345:16;28337:69;;;::::0;-1:-1:-1;;;28337:69:0;;15407:2:1;28337:69:0::1;::::0;::::1;15389:21:1::0;15446:2;15426:18;;;15419:30;15485:34;15465:18;;;15458:62;-1:-1:-1;;;15536:18:1;;;15529:38;15584:19;;28337:69:0::1;15205:404:1::0;28337:69:0::1;28425:10;28417:57;;;::::0;-1:-1:-1;;;28417:57:0;;15816:2:1;28417:57:0::1;::::0;::::1;15798:21:1::0;15855:2;15835:18;;;15828:30;15894:34;15874:18;;;15867:62;-1:-1:-1;;;15945:18:1;;;15938:32;15987:19;;28417:57:0::1;15614:398:1::0;28417:57:0::1;28490:19:::0;;28487:362:::1;;28525:6;::::0;28699:21:::1;::::0;28525:244:::1;::::0;-1:-1:-1;;;28525:244:0;;28601:4:::1;28525:244;::::0;::::1;16358:34:1::0;16408:18;;;16401:34;;;28525:6:0::1;16451:18:1::0;;;16444:34;;;16494:18;;;16487:34;-1:-1:-1;;;;;28699:21:0;;::::1;16537:19:1::0;;;16530:44;28739:15:0::1;16590:19:1::0;;;16583:35;28525:6:0;::::1;::::0;:22:::1;::::0;28555:18;;16292:19:1;;28525:244:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;28789:48:0::1;::::0;;9403:25:1;;;9459:2;9444:18;;9437:34;;;28789:48:0::1;::::0;-1:-1:-1;9376:18:1;28789:48:0::1;;;;;;;28487:362;-1:-1:-1::0;;15676:6:0;:14;;-1:-1:-1;;15676:14:0;;;-1:-1:-1;;;;;;;;;;;26819:2037:0:o;24862:834::-;24958:7;24978:17;25055:9;25051:460;;;25083:6;25080:335;;;25186:54;25225:14;;25186:34;25218:1;25186:27;25211:1;25186:20;25197:8;;25186:6;:10;;:20;;;;:::i;:54::-;25174:66;;25051:460;;25080:335;25352:47;25384:14;;25352:27;25377:1;25352:20;25363:8;;25352:6;:10;;:20;;;;:::i;25051:460::-;25459:40;25484:14;;25459:20;25470:8;;25459:6;:10;;:20;;;;:::i;:40::-;25447:52;;25051:460;25568:4;25550:24;;;;:9;:24;;;;;;:39;;25579:9;25550:28;:39::i;:::-;25541:4;25523:24;;;;:9;:24;;;;;;;:66;;;;25605:42;;-1:-1:-1;;;;;25605:42:0;;;;;;;25637:9;1760:25:1;;1748:2;1733:18;;1614:177;25605:42:0;;;;;;;;25667:21;:6;25678:9;25667:10;:21::i;:::-;25660:28;24862:834;-1:-1:-1;;;;;;24862:834:0:o;1292:345::-;1378:7;1480:12;1473:5;1465:28;;;;-1:-1:-1;;;1465:28:0;;;;;;;;:::i;:::-;-1:-1:-1;1504:9:0;1516:5;1520:1;1516;:5;:::i;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1264:160::-;1329:20;;1385:13;;1378:21;1368:32;;1358:60;;1414:1;1411;1404:12;1358:60;1264:160;;;:::o;1429:180::-;1485:6;1538:2;1526:9;1517:7;1513:23;1509:32;1506:52;;;1554:1;1551;1544:12;1506:52;1577:26;1593:9;1577:26;:::i;1796:248::-;1864:6;1872;1925:2;1913:9;1904:7;1900:23;1896:32;1893:52;;;1941:1;1938;1931:12;1893:52;-1:-1:-1;;1964:23:1;;;2034:2;2019:18;;;2006:32;;-1:-1:-1;1796:248:1:o;2049:689::-;2141:6;2149;2157;2210:2;2198:9;2189:7;2185:23;2181:32;2178:52;;;2226:1;2223;2216:12;2178:52;2266:9;2253:23;2295:18;2336:2;2328:6;2325:14;2322:34;;;2352:1;2349;2342:12;2322:34;2390:6;2379:9;2375:22;2365:32;;2435:7;2428:4;2424:2;2420:13;2416:27;2406:55;;2457:1;2454;2447:12;2406:55;2497:2;2484:16;2523:2;2515:6;2512:14;2509:34;;;2539:1;2536;2529:12;2509:34;2594:7;2587:4;2577:6;2574:1;2570:14;2566:2;2562:23;2558:34;2555:47;2552:67;;;2615:1;2612;2605:12;2552:67;2646:4;2638:13;;;;-1:-1:-1;2670:6:1;-1:-1:-1;2695:37:1;;2711:20;;;-1:-1:-1;2695:37:1;:::i;:::-;2685:47;;2049:689;;;;;:::o;2743:315::-;2808:6;2816;2869:2;2857:9;2848:7;2844:23;2840:32;2837:52;;;2885:1;2882;2875:12;2837:52;2924:9;2911:23;2943:31;2968:5;2943:31;:::i;:::-;2993:5;-1:-1:-1;3017:35:1;3048:2;3033:18;;3017:35;:::i;:::-;3007:45;;2743:315;;;;;:::o;3063:316::-;3140:6;3148;3156;3209:2;3197:9;3188:7;3184:23;3180:32;3177:52;;;3225:1;3222;3215:12;3177:52;-1:-1:-1;;3248:23:1;;;3318:2;3303:18;;3290:32;;-1:-1:-1;3369:2:1;3354:18;;;3341:32;;3063:316;-1:-1:-1;3063:316:1:o;3384:456::-;3461:6;3469;3477;3530:2;3518:9;3509:7;3505:23;3501:32;3498:52;;;3546:1;3543;3536:12;3498:52;3585:9;3572:23;3604:31;3629:5;3604:31;:::i;:::-;3654:5;-1:-1:-1;3711:2:1;3696:18;;3683:32;3724:33;3683:32;3724:33;:::i;:::-;3384:456;;3776:7;;-1:-1:-1;;;3830:2:1;3815:18;;;;3802:32;;3384:456::o;3845:247::-;3904:6;3957:2;3945:9;3936:7;3932:23;3928:32;3925:52;;;3973:1;3970;3963:12;3925:52;4012:9;3999:23;4031:31;4056:5;4031:31;:::i;4097:337::-;4160:6;4168;4221:2;4209:9;4200:7;4196:23;4192:32;4189:52;;;4237:1;4234;4227:12;4189:52;4260:26;4276:9;4260:26;:::i;:::-;4250:36;;4336:2;4325:9;4321:18;4308:32;4380:4;4373:5;4369:16;4362:5;4359:27;4349:55;;4400:1;4397;4390:12;4349:55;4423:5;4413:15;;;4097:337;;;;;:::o;4439:454::-;4528:6;4536;4544;4552;4560;4613:3;4601:9;4592:7;4588:23;4584:33;4581:53;;;4630:1;4627;4620:12;4581:53;4653:26;4669:9;4653:26;:::i;:::-;4643:36;;4726:2;4715:9;4711:18;4698:32;4688:42;;4777:2;4766:9;4762:18;4749:32;4739:42;;4828:2;4817:9;4813:18;4800:32;4790:42;;4851:36;4882:3;4871:9;4867:19;4851:36;:::i;:::-;4841:46;;4439:454;;;;;;;;:::o;5087:180::-;5146:6;5199:2;5187:9;5178:7;5174:23;5170:32;5167:52;;;5215:1;5212;5205:12;5167:52;-1:-1:-1;5238:23:1;;5087:180;-1:-1:-1;5087:180:1:o;5272:248::-;5337:6;5345;5398:2;5386:9;5377:7;5373:23;5369:32;5366:52;;;5414:1;5411;5404:12;5366:52;5450:9;5437:23;5427:33;;5479:35;5510:2;5499:9;5495:18;5479:35;:::i;5733:388::-;5801:6;5809;5862:2;5850:9;5841:7;5837:23;5833:32;5830:52;;;5878:1;5875;5868:12;5830:52;5917:9;5904:23;5936:31;5961:5;5936:31;:::i;:::-;5986:5;-1:-1:-1;6043:2:1;6028:18;;6015:32;6056:33;6015:32;6056:33;:::i;6126:523::-;6230:6;6238;6246;6254;6262;6270;6323:3;6311:9;6302:7;6298:23;6294:33;6291:53;;;6340:1;6337;6330:12;6291:53;-1:-1:-1;;6363:23:1;;;6433:2;6418:18;;6405:32;;-1:-1:-1;6484:2:1;6469:18;;6456:32;;6535:2;6520:18;;6507:32;;-1:-1:-1;6586:3:1;6571:19;;6558:33;;-1:-1:-1;6638:3:1;6623:19;6610:33;;-1:-1:-1;6126:523:1;-1:-1:-1;6126:523:1:o;6654:248::-;6719:6;6727;6780:2;6768:9;6759:7;6755:23;6751:32;6748:52;;;6796:1;6793;6786:12;6748:52;6819:26;6835:9;6819:26;:::i;7393:329::-;7595:2;7577:21;;;7634:1;7614:18;;;7607:29;-1:-1:-1;;;7667:2:1;7652:18;;7645:36;7713:2;7698:18;;7393:329::o;7727:335::-;7929:2;7911:21;;;7968:2;7948:18;;;7941:30;-1:-1:-1;;;8002:2:1;7987:18;;7980:41;8053:2;8038:18;;7727:335::o;8414:127::-;8475:10;8470:3;8466:20;8463:1;8456:31;8506:4;8503:1;8496:15;8530:4;8527:1;8520:15;8546:127;8607:10;8602:3;8598:20;8595:1;8588:31;8638:4;8635:1;8628:15;8662:4;8659:1;8652:15;8678:135;8717:3;-1:-1:-1;;8738:17:1;;8735:43;;;8758:18;;:::i;:::-;-1:-1:-1;8805:1:1;8794:13;;8678:135::o;8818:217::-;8858:1;8884;8874:132;;8928:10;8923:3;8919:20;8916:1;8909:31;8963:4;8960:1;8953:15;8991:4;8988:1;8981:15;8874:132;-1:-1:-1;9020:9:1;;8818:217::o;9040:184::-;9110:6;9163:2;9151:9;9142:7;9138:23;9134:32;9131:52;;;9179:1;9176;9169:12;9131:52;-1:-1:-1;9202:16:1;;9040:184;-1:-1:-1;9040:184:1:o;9482:168::-;9522:7;9588:1;9584;9580:6;9576:14;9573:1;9570:21;9565:1;9558:9;9551:17;9547:45;9544:71;;;9595:18;;:::i;:::-;-1:-1:-1;9635:9:1;;9482:168::o;9655:128::-;9695:3;9726:1;9722:6;9719:1;9716:13;9713:39;;;9732:18;;:::i;:::-;-1:-1:-1;9768:9:1;;9655:128::o;10570:125::-;10610:4;10638:1;10635;10632:8;10629:34;;;10643:18;;:::i;:::-;-1:-1:-1;10680:9:1;;10570:125::o;12293:461::-;12346:3;12384:5;12378:12;12411:6;12406:3;12399:19;12437:4;12466:2;12461:3;12457:12;12450:19;;12503:2;12496:5;12492:14;12524:1;12534:195;12548:6;12545:1;12542:13;12534:195;;;12613:13;;-1:-1:-1;;;;;12609:39:1;12597:52;;12669:12;;;;12704:15;;;;12645:1;12563:9;12534:195;;;-1:-1:-1;12745:3:1;;12293:461;-1:-1:-1;;;;;12293:461:1:o;12759:510::-;13030:6;13019:9;13012:25;13073:3;13068:2;13057:9;13053:18;13046:31;12993:4;13094:57;13146:3;13135:9;13131:19;13123:6;13094:57;:::i;:::-;-1:-1:-1;;;;;13187:32:1;;;;13182:2;13167:18;;13160:60;-1:-1:-1;13251:2:1;13236:18;13229:34;13086:65;12759:510;-1:-1:-1;;12759:510:1:o;14408:582::-;14707:6;14696:9;14689:25;14750:6;14745:2;14734:9;14730:18;14723:34;14793:3;14788:2;14777:9;14773:18;14766:31;14670:4;14814:57;14866:3;14855:9;14851:19;14843:6;14814:57;:::i;:::-;-1:-1:-1;;;;;14907:32:1;;;;14902:2;14887:18;;14880:60;-1:-1:-1;14971:3:1;14956:19;14949:35;14806:65;14408:582;-1:-1:-1;;;14408:582:1:o;16629:306::-;16717:6;16725;16733;16786:2;16774:9;16765:7;16761:23;16757:32;16754:52;;;16802:1;16799;16792:12;16754:52;16831:9;16825:16;16815:26;;16881:2;16870:9;16866:18;16860:25;16850:35;;16925:2;16914:9;16910:18;16904:25;16894:35;;16629:306;;;;;:::o

Swarm Source

ipfs://2cbdd18c511828bb62f4f7a50edd2dc3c61ce59e621d34126c5c013b9511b9f7

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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