ETH Price: $3,669.77 (+1.21%)

Token

ERC-20: Shenobi (SHEJA)
 

Overview

Max Total Supply

100,000,000,000,000,000,000,000 SHEJA

Holders

52

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Balance
810,718,773 SHEJA

Value
$0.00
0xf2624e239bE3903d67eC6A33064B6414478a63eF
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Shenobi

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-08
*/

/**
Tg link ; https://t.me/shenobierc_portal
Twitter link ; twitter.com/shenobitoken
Web link ; http://sheja.lol/

*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;


library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {return a + b;}
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {return a - b;}
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {return a * b;}
    function div(uint256 a, uint256 b) internal pure returns (uint256) {return a / b;}
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {return a % b;}

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked{require(b <= a, errorMessage); return a - b;}}

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked{require(b > 0, errorMessage); return a / b;}}

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked{require(b > 0, errorMessage); return a % b;}}}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function circulatingSupply() 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);}

abstract contract Ownable {
    address internal owner;
    constructor(address _owner) {owner = _owner;}
    modifier onlyOwner() {require(isOwner(msg.sender), "!OWNER"); _;}
    function isOwner(address account) public view returns (bool) {return account == owner;}
    function transferOwnership(address payable adr) public onlyOwner {owner = adr; emit OwnershipTransferred(adr);}
    event OwnershipTransferred(address owner);
}

interface stakeIntegration {
    function stakingWithdraw(address depositor, uint256 _amount) external;
    function stakingDeposit(address depositor, uint256 _amount) external;
    function stakingClaimToCompound(address sender, address recipient) external;
    function internalClaimRewards(address sender) external;
}

interface tokenStaking {
    function deposit(uint256 amount) external;
    function withdraw(uint256 amount) external;
    function compound() external;
}

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

interface IRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);

    function 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;
}

contract Shenobi is IERC20, tokenStaking, Ownable {
    using SafeMath for uint256;
    string private constant _name = 'Shenobi';
    string private constant _symbol = 'SHEJA';
    uint8 private constant _decimals = 9;
    uint256 private _totalSupply = 100000000000000 * (10 ** _decimals);
    uint256 public _maxTxAmount = ( _totalSupply * 100 ) / 10000;
    uint256 public _maxWalletToken = ( _totalSupply * 100 ) / 10000;
    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) public isFeeExempt;
    mapping (address => bool) public isDividendExempt;
    IRouter router;
    address public pair;
    bool private swapEnabled = true;
    bool private tradingAllowed = false;
    bool public reflectionsEnabled = true;
    uint256 private liquidityFee = 0;
    uint256 private marketingFee = 1000;
    uint256 private reflectionFee = 0;
    uint256 private developmentFee = 1000;
    uint256 private burnFee = 0;
    uint256 private tokenFee = 0;
    uint256 private totalFee = 2000;
    uint256 private sellFee = 4000;
    uint256 private transferFee = 4000;
    uint256 private denominator = 10000;
    uint256 private swapTimes;
    bool private swapping;
    bool private feeless;
    uint256 private swapAmount = 1;
    uint256 private swapThreshold = ( _totalSupply * 500 ) / 100000;
    uint256 private minTokenAmount = ( _totalSupply * 10 ) / 100000;
    modifier feelessTransaction {feeless = true; _; feeless = false;}
    modifier lockTheSwap {swapping = true; _; swapping = false;}
    mapping(address => uint256) public amountStaked;
    uint256 public totalStaked;
    uint256 private staking = 0;
    stakeIntegration internal stakingContract;
    address internal token_receiver;
    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public currentDividends;
    uint256 public dividendsBeingDistributed;
    uint256 internal dividendsPerShare;
    uint256 internal dividendsPerShareAccuracyFactor = 10 ** 36;
    address[] shareholders; mapping (address => Share) public shares; 
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) shareholderClaims;
    struct Share {uint256 amount; uint256 totalExcluded; uint256 totalRealised; }
    uint256 public excessDividends;
    uint256 public eventFeesCollected;
    uint256 public reflectionEvent;
    bool public distributingReflections;
    uint256 internal disbursements;
    bool internal releaseDistributing;
    mapping (address => uint256) public buyMultiplier;
    uint256 internal currentIndex;
    uint256 public gasAmount = 500000;
    uint256 public distributionInterval = 12 hours;
    uint256 public distributionTime;
    uint256 private minBuyAmount = ( _totalSupply * 10 ) / 100000;
    uint256 private maxDropAmount = ( _totalSupply * 500 ) / 10000;
    address internal constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address internal utility_receiver = 0x505517DD99670a085e200db4A14475F25aed3e35;
    address internal staking_receiver = 0x505517DD99670a085e200db4A14475F25aed3e35; 
    address internal marketing_receiver = 0x165b9A3D43cbdCC763214fD4E7DB787454b34Afe;
    address internal liquidity_receiver = 0x505517DD99670a085e200db4A14475F25aed3e35;
    mapping (uint256 => mapping (address => uint256)) internal userEventData;
    struct eventData {
        uint256 reflectionAmount;
        uint256 reflectionsDisbursed;
        uint256 eventTimestamp;
        uint256 totalFees;
        uint256 totalExcess;}
    mapping(uint256 => eventData) public eventStats;

    constructor() Ownable(msg.sender) {
        IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        address _pair = IFactory(_router.factory()).createPair(address(this), _router.WETH());
        router = _router;
        pair = _pair;
        token_receiver = msg.sender;
        isFeeExempt[address(this)] = true;
        isFeeExempt[liquidity_receiver] = true;
        isFeeExempt[marketing_receiver] = true;
        isFeeExempt[token_receiver] = true;
        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(stakingContract)] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[address(pair)] = true;
        isDividendExempt[address(DEAD)] = true;
        isDividendExempt[address(0)] = true;
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable {}
    function name() public pure returns (string memory) {return _name;}
    function symbol() public pure returns (string memory) {return _symbol;}
    function decimals() public pure returns (uint8) {return _decimals;}
    function getOwner() external view override returns (address) { return owner; }
    function totalSupply() public view override returns (uint256) {return _totalSupply;}
    function balanceOf(address account) public view override returns (uint256) {return _balances[account];}
    function transfer(address recipient, uint256 amount) public override returns (bool) {_transfer(msg.sender, recipient, amount);return true;}
    function allowance(address owner, address spender) public view override returns (uint256) {return _allowances[owner][spender];}
    function approve(address spender, uint256 amount) public override returns (bool) {_approve(msg.sender, spender, amount);return true;}
    function availableBalance(address wallet) public view returns (uint256) {return _balances[wallet].sub(amountStaked[wallet]);}
    function circulatingSupply() public view override returns (uint256) {return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(address(0)));}

    function preTxCheck(address sender, address recipient, uint256 amount) internal view {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount <= balanceOf(sender),"You are trying to transfer more than your balance");
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        preTxCheck(sender, recipient, amount);
        checkTradingAllowed(sender, recipient);
        checkMaxWallet(sender, recipient, amount); 
        checkTxLimit(sender, recipient, amount);
        transactionCounters(sender, recipient);
        setBuyMultiplier(sender, recipient, amount);
        swapBack(sender, recipient, amount);
        _balances[sender] = _balances[sender].sub(amount);
        uint256 amountReceived = shouldTakeFee(sender, recipient) ? takeFee(sender, recipient, amount) : amount;
        _balances[recipient] = _balances[recipient].add(amountReceived);
        emit Transfer(sender, recipient, amountReceived);
        processRewards(sender, recipient);
    }

    function setStructure(uint256 _liquidity, uint256 _marketing, uint256 _reflections, uint256 _burn, 
        uint256 _token, uint256 _staking, uint256 _development, uint256 _total, uint256 _sell, uint256 _trans) external onlyOwner {
        liquidityFee = _liquidity; marketingFee = _marketing; reflectionFee = _reflections; staking = _staking; developmentFee = _development;
        burnFee = _burn; totalFee = _total; sellFee = _sell; transferFee = _trans; tokenFee = _token;
        require(totalFee <= denominator && sellFee <= denominator && burnFee <= denominator && tokenFee <= denominator 
            && transferFee <= denominator, "totalFee and sellFee cannot be more than 20%");
    }

    function setParameters(uint256 _buy, uint256 _wallet) external onlyOwner {
        uint256 newTx = totalSupply().mul(_buy).div(uint256(10000));
        uint256 newWallet = totalSupply().mul(_wallet).div(uint256(10000)); uint256 limit = totalSupply().mul(5).div(1000);
        require(newTx >= limit && newWallet >= limit, "ERC20: max TXs and max Wallet cannot be less than .5%");
        _maxTxAmount = newTx; _maxWalletToken = newWallet;
    }

    function internalDeposit(address sender, uint256 amount) internal {
        require(amount <= _balances[sender].sub(amountStaked[sender]), "ERC20: Cannot stake more than available balance");
        stakingContract.stakingDeposit(sender, amount);
        amountStaked[sender] = amountStaked[sender].add(amount);
        totalStaked = totalStaked.add(amount);
    }

    function deposit(uint256 amount) override external {
        internalDeposit(msg.sender, amount);
    }

    function withdraw(uint256 amount) override external {
        require(amount <= amountStaked[msg.sender], "ERC20: Cannot unstake more than amount staked");
        stakingContract.stakingWithdraw(msg.sender, amount);
        amountStaked[msg.sender] = amountStaked[msg.sender].sub(amount);
        totalStaked = totalStaked.sub(amount);
    }

    function compound() override external feelessTransaction {
        uint256 initialToken = balanceOf(msg.sender);
        stakingContract.stakingClaimToCompound(msg.sender, msg.sender);
        uint256 afterToken = balanceOf(msg.sender).sub(initialToken);
        internalDeposit(msg.sender, afterToken);
    }

    function setStakingAddress(address _staking) external onlyOwner {
        stakingContract = stakeIntegration(_staking); isFeeExempt[_staking] = true;
    }

    function checkTradingAllowed(address sender, address recipient) internal view {
        if(!isFeeExempt[sender] && !isFeeExempt[recipient]){require(tradingAllowed, "tradingAllowed");}
    }
    
    function checkMaxWallet(address sender, address recipient, uint256 amount) internal view {
        if(!isFeeExempt[sender] && !isFeeExempt[recipient] && recipient != address(pair) && recipient != address(DEAD)){
            require((_balances[recipient].add(amount)) <= _maxWalletToken, "Exceeds maximum wallet amount.");}
    }

    function transactionCounters(address sender, address recipient) internal {
        if(recipient == pair && !isFeeExempt[sender] && !swapping){swapTimes += uint256(1);}
    }

    function setBuyMultiplier(address sender, address recipient, uint256 amount) internal {
        if(sender == pair && amount >= minBuyAmount){buyMultiplier[recipient] = buyMultiplier[recipient].add(uint256(1));}
        if(sender == pair && amount < minBuyAmount){buyMultiplier[recipient] = uint256(1);}
        if(recipient == pair){buyMultiplier[sender] = uint256(0);}
    }

    function checkTxLimit(address sender, address recipient, uint256 amount) internal view {
        if(amountStaked[sender] > uint256(0)){require((amount.add(amountStaked[sender])) <= balanceOf(sender), "ERC20: Exceeds maximum allowed not currently staked.");}
        require(amount <= _maxTxAmount || isFeeExempt[sender] || isFeeExempt[recipient], "TX Limit Exceeded");
    }

    function startTrading() external onlyOwner {
        tradingAllowed = true;
        distributionTime = block.timestamp;
    }

    function setSwapbackSettings(uint256 _swapAmount, uint256 _swapThreshold, uint256 _minTokenAmount) external onlyOwner {
        swapAmount = _swapAmount; swapThreshold = totalSupply().mul(_swapThreshold).div(uint256(100000)); minTokenAmount = totalSupply().mul(_minTokenAmount).div(uint256(100000));
    }

    function setUserMultiplier(address user, uint256 multiplier) external onlyOwner {
        buyMultiplier[user] = multiplier;
    }

    function setInternalAddresses(address _marketing, address _liquidity, address _utility, address _token, address _staking) external onlyOwner {
        marketing_receiver = _marketing; liquidity_receiver = _liquidity; utility_receiver = _utility; token_receiver = _token; staking_receiver = _staking;
        isFeeExempt[_marketing] = true; isFeeExempt[_liquidity] = true; isFeeExempt[_utility] = true; isFeeExempt[_token] = true; isFeeExempt[_staking] = true;
    }

    function setisExempt(address _address, bool _enabled) external onlyOwner {
        isFeeExempt[_address] = _enabled;
    }

    function setDividendInfo(uint256 excess, uint256 current, uint256 distributing) external onlyOwner {
        excessDividends = excess; currentDividends = current; dividendsBeingDistributed = distributing;
    }

    function setMinBuyAmount(uint256 amount) external onlyOwner {
        minBuyAmount = _totalSupply.mul(amount).div(100000);
    }

    function swapAndLiquify(uint256 tokens) private lockTheSwap {
        uint256 _denominator = totalFee.add(1).mul(2);
        if(totalFee == uint256(0)){_denominator = liquidityFee.add(
            marketingFee).add(staking).add(developmentFee).add(1).mul(2);}
        uint256 tokensToAddLiquidityWith = tokens.mul(liquidityFee).div(_denominator);
        uint256 toSwap = tokens.sub(tokensToAddLiquidityWith);
        uint256 initialBalance = address(this).balance;
        swapTokensForETH(toSwap);
        uint256 deltaBalance = address(this).balance.sub(initialBalance);
        uint256 unitBalance= deltaBalance.div(_denominator.sub(liquidityFee));
        uint256 ETHToAddLiquidityWith = unitBalance.mul(liquidityFee);
        if(ETHToAddLiquidityWith > uint256(0)){addLiquidity(
            tokensToAddLiquidityWith, ETHToAddLiquidityWith, liquidity_receiver); }
        uint256 stakingAmount = unitBalance.mul(2).mul(staking);
        if(stakingAmount > 0){payable(staking_receiver).transfer(stakingAmount);}
        uint256 marketingAmount = unitBalance.mul(2).mul(marketingFee);
        if(marketingAmount > 0){payable(marketing_receiver).transfer(marketingAmount);}
        uint256 excessAmount = address(this).balance;
        if(excessAmount > uint256(0)){payable(utility_receiver).transfer(excessAmount);}
    }

    function addLiquidity(uint256 tokenAmount, uint256 ETHAmount, address receiver) private {
        _approve(address(this), address(router), tokenAmount);
        router.addLiquidityETH{value: ETHAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            address(receiver),
            block.timestamp);
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        _approve(address(this), address(router), tokenAmount);
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp);
    }

    function shouldSwapBack(address sender, address recipient, uint256 amount) internal view returns (bool) {
        bool aboveMin = amount >= minTokenAmount;
        bool aboveThreshold = viewAvailableBalance() >= swapThreshold;
        return !swapping && swapEnabled && tradingAllowed && aboveMin && !isFeeExempt[sender] 
            && recipient == pair && swapTimes >= swapAmount && aboveThreshold;
    }

    function swapBack(address sender, address recipient, uint256 amount) internal {
        if(shouldSwapBack(sender, recipient, amount)){swapAndLiquify(swapThreshold); swapTimes = uint256(0);}
    }

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

    function getTotalFee(address sender, address recipient) internal view returns (uint256) {
        if(recipient == pair && sellFee > uint256(0)){return sellFee;}
        if(sender == pair && totalFee > uint256(0)){return totalFee;}
        return transferFee;
    }

    function takeFee(address sender, address recipient, uint256 amount) internal returns (uint256) {
        if(getTotalFee(sender, recipient) > 0 && !swapping){
        uint256 feeAmount = amount.div(denominator).mul(getTotalFee(sender, recipient));
        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);
        if(reflectionFee > uint256(0) && reflectionFee <= getTotalFee(sender, recipient)){
            currentDividends = currentDividends.add((amount.div(denominator).mul(reflectionFee)));
            eventFeesCollected = eventFeesCollected.add((amount.div(denominator).mul(reflectionFee)));}
        if(burnFee > uint256(0) && burnFee <= getTotalFee(sender, recipient)){
            _transfer(address(this), address(DEAD), amount.div(denominator).mul(burnFee));}
        if(tokenFee > uint256(0) && tokenFee <= getTotalFee(sender, recipient)){
            _transfer(address(this), address(token_receiver), amount.div(denominator).mul(tokenFee));}
        return amount.sub(feeAmount);} return amount;
    }

    function setisDividendExempt(address holder, bool exempt) external onlyOwner {
        isDividendExempt[holder] = exempt;
        if(exempt){setShare(holder, 0);}
        if(buyMultiplier[holder] > 0){setShare(holder, balanceOf(holder).mul(buyMultiplier[holder]));}
        else{setShare(holder, balanceOf(holder));}
    }

    function processRewards(address sender, address recipient) internal {
        if(releaseDistributing){dividendsBeingDistributed = uint256(0);}
        if(shares[recipient].amount > uint256(0)){distributeDividend(recipient);}
        if(shares[sender].amount > uint256(0) && recipient != pair){distributeDividend(sender);}
        if(recipient == pair && shares[sender].amount > uint256(0)){excessDividends = excessDividends.add(getUnpaidEarnings(sender));}
        if(!isDividendExempt[sender]){setShare(sender, balanceOf(sender));}
        if(!isDividendExempt[recipient]){setShare(recipient, balanceOf(recipient));}
        if(!isDividendExempt[recipient] && sender == pair && buyMultiplier[recipient] >= uint256(1)){
            setShare(recipient, balanceOf(recipient).mul(buyMultiplier[recipient]));}
        if(distributionTime.add(distributionInterval) <= block.timestamp && tradingAllowed && 
            currentDividends > uint256(0) && !swapping && reflectionsEnabled){
            createReflectionEvent();}
        processReflections(gasAmount);
        if(shares[recipient].amount > uint256(0)){distributeDividend(recipient);}
    }

    function createReflectionEvent() internal {
            distributingReflections = true;
            eventStats[reflectionEvent].totalExcess = excessDividends;
            excessDividends = uint256(0);
            reflectionEvent = reflectionEvent.add(uint256(1));
            eventStats[reflectionEvent].totalFees = eventFeesCollected;
            eventStats[reflectionEvent].reflectionAmount = currentDividends;
            eventStats[reflectionEvent].eventTimestamp = block.timestamp;
            if(currentDividends > maxDropAmount){currentDividends = maxDropAmount;}
            depositRewards(currentDividends);
            currentDividends = uint256(0);
            eventFeesCollected = uint256(0);
            distributionTime = block.timestamp;
            processReflections(gasAmount);
    }

    function manualReflectionEvent() external onlyOwner {
        createReflectionEvent();
    }

    function rescueERC20(address _address) external onlyOwner {
        uint256 _amount = IERC20(_address).balanceOf(address(this));
        IERC20(_address).transfer(utility_receiver, _amount);
    }

    function setMaxDropAmount(uint256 amount) external onlyOwner {
        maxDropAmount = _totalSupply.mul(amount).div(100000);
    }

    function setDistributionInterval(uint256 interval) external onlyOwner {
        distributionInterval = interval;
    }

    function setReleaseDistributing(bool enable) external onlyOwner {
        releaseDistributing = enable;
    }

    function enableReflections(bool enable) external onlyOwner {
        reflectionsEnabled = enable;
    }

    function setGasAmount(uint256 gas) external onlyOwner {
        gasAmount = gas;
    }

    function closeReflectionEvent() external onlyOwner {
        dividendsBeingDistributed = uint256(0);
    }

    function setShare(address shareholder, uint256 amount) internal {
        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 depositRewards(uint256 amount) internal {
        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
        dividendsBeingDistributed = amount;
    }

    function rescueETH(uint256 _amount) external {
        payable(utility_receiver).transfer(_amount);
    }

    function setTokenAddress(address _address) external onlyOwner {
        token_receiver = _address;
    }

    function totalReflectionsDistributed(address _wallet) external view returns (uint256) {
        address shareholder = _wallet;
        return uint256(shares[shareholder].totalRealised);
    }

    function claimReflections() external {
        distributeDividend(msg.sender);
    }

    function viewRemainingBeingDisbursed() external view returns (uint256 distributing, uint256 distributed) {
        return(dividendsBeingDistributed, eventStats[reflectionEvent].reflectionsDisbursed);
    }

    function viewDisbursementShareholders() external view returns (uint256 disbursementsAmt, uint256 shareholdersAmt) {
        return(disbursements, shareholders.length);
    }

    function manualProcessReflections(uint256 gas) external onlyOwner {
        processReflections(gas);
    }

    function processReflections(uint256 gas) internal {
        uint256 currentAmount = totalDistributed;
        uint256 shareholderCount = shareholders.length;
        if(shareholderCount == uint256(0)) { return; }
        uint256 gasUsed = uint256(0);
        uint256 gasLeft = gasleft();
        uint256 iterations = uint256(0);
        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount){
                currentIndex = uint256(0);}
                distributeDividend(shareholders[currentIndex]);
            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
            disbursements++;}
        if(disbursements >= shareholderCount && totalDistributed > currentAmount){
            distributingReflections = false;
            dividendsBeingDistributed = uint256(0);
            disbursements = uint256(0);}
    }

    function distributeDividend(address shareholder) internal {
        uint256 amount = getUnpaidEarnings(shareholder);
        if(shares[shareholder].amount == 0 || amount > balanceOf(address(this))){ return; }
        if(amount > uint256(0)){
            totalDistributed = totalDistributed.add(amount);
            eventStats[reflectionEvent].reflectionsDisbursed = eventStats[reflectionEvent].reflectionsDisbursed.add(amount);
            _basicTransfer(address(this), shareholder, amount);
            userEventData[reflectionEvent][shareholder] = amount;
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            buyMultiplier[shareholder] = uint256(0);
            setShare(shareholder, balanceOf(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();
    }

    function balanceInformation() external view returns (uint256 balance, uint256 available, uint256 current, uint256 distributing, uint256 excess) {
        return(balanceOf(address(this)), balanceOf(address(this)).sub(currentDividends).sub(dividendsBeingDistributed), currentDividends, dividendsBeingDistributed, excessDividends);
    }

    function viewAvailableBalance() public view returns (uint256 contractBalance) {
        return balanceOf(address(this)).sub(currentDividends).sub(dividendsBeingDistributed);
    }

    function viewLastFiveReflectionEvents() external view returns (uint256, uint256, uint256, uint256, uint256) {
        return(eventStats[reflectionEvent].reflectionAmount, eventStats[reflectionEvent.sub(1)].reflectionAmount, eventStats[reflectionEvent.sub(2)].reflectionAmount,
            eventStats[reflectionEvent.sub(3)].reflectionAmount, eventStats[reflectionEvent.sub(4)].reflectionAmount);
    }

    function viewUserReflectionStats(uint256 eventNumber, address wallet) external view returns (uint256) {
        return userEventData[eventNumber][wallet];
    }

    function viewMyReflectionStats(uint256 eventNumber) external view returns (uint256) {
        return userEventData[eventNumber][msg.sender];
    }
}

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":"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":[],"name":"_maxTxAmount","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":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountStaked","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":"wallet","type":"address"}],"name":"availableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceInformation","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"distributing","type":"uint256"},{"internalType":"uint256","name":"excess","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"buyMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReflections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeReflectionEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributingReflections","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributionInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributionTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendsBeingDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"enableReflections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eventFeesCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"eventStats","outputs":[{"internalType":"uint256","name":"reflectionAmount","type":"uint256"},{"internalType":"uint256","name":"reflectionsDisbursed","type":"uint256"},{"internalType":"uint256","name":"eventTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalFees","type":"uint256"},{"internalType":"uint256","name":"totalExcess","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"excessDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"}],"name":"getUnpaidEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","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":"uint256","name":"gas","type":"uint256"}],"name":"manualProcessReflections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualReflectionEvent","outputs":[],"stateMutability":"nonpayable","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":"reflectionEvent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"setDistributionInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"excess","type":"uint256"},{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"distributing","type":"uint256"}],"name":"setDividendInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setGasAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketing","type":"address"},{"internalType":"address","name":"_liquidity","type":"address"},{"internalType":"address","name":"_utility","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_staking","type":"address"}],"name":"setInternalAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxDropAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buy","type":"uint256"},{"internalType":"uint256","name":"_wallet","type":"uint256"}],"name":"setParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setReleaseDistributing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"}],"name":"setStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_reflections","type":"uint256"},{"internalType":"uint256","name":"_burn","type":"uint256"},{"internalType":"uint256","name":"_token","type":"uint256"},{"internalType":"uint256","name":"_staking","type":"uint256"},{"internalType":"uint256","name":"_development","type":"uint256"},{"internalType":"uint256","name":"_total","type":"uint256"},{"internalType":"uint256","name":"_sell","type":"uint256"},{"internalType":"uint256","name":"_trans","type":"uint256"}],"name":"setStructure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapAmount","type":"uint256"},{"internalType":"uint256","name":"_swapThreshold","type":"uint256"},{"internalType":"uint256","name":"_minTokenAmount","type":"uint256"}],"name":"setSwapbackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"multiplier","type":"uint256"}],"name":"setUserMultiplier","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":"_address","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setisExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"totalExcluded","type":"uint256"},{"internalType":"uint256","name":"totalRealised","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"totalReflectionsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"viewAvailableBalance","outputs":[{"internalType":"uint256","name":"contractBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewDisbursementShareholders","outputs":[{"internalType":"uint256","name":"disbursementsAmt","type":"uint256"},{"internalType":"uint256","name":"shareholdersAmt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewLastFiveReflectionEvents","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNumber","type":"uint256"}],"name":"viewMyReflectionStats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewRemainingBeingDisbursed","outputs":[{"internalType":"uint256","name":"distributing","type":"uint256"},{"internalType":"uint256","name":"distributed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNumber","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"}],"name":"viewUserReflectionStats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a620005df565b6200002490655af3107a4000620005f7565b60015561271060015460646200003b9190620005f7565b62000047919062000611565b60025561271060015460646200005e9190620005f7565b6200006a919062000611565b6003556009805462ffffff60a01b19166201000160a01b1790556000600a8190556103e8600b819055600c829055600d55600e819055600f556107d0601055610fa060118190556012556127106013556001601681905554620186a090620000d5906101f4620005f7565b620000e1919062000611565b601755620186a0600154600a620000f99190620005f7565b62000105919062000611565b6018556000601b556ec097ce7bc90715b34b9f10000000006024556207a12060315561a8c0603255620186a0600154600a620001429190620005f7565b6200014e919062000611565b6034556127106001546101f4620001669190620005f7565b62000172919062000611565b603555603680546001600160a01b031990811673505517dd99670a085e200db4a14475f25aed3e359081179092556037805482168317905560388054821673165b9a3d43cbdcc763214fd4e7db787454b34afe179055603980549091169091179055348015620001e157600080fd5b50600080546001600160a01b031916331781556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d9291839163c45a0155916004808201926020929091908290030181865afa15801562000249573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026f919062000634565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002bd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e3919062000634565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000331573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000357919062000634565b600880546001600160a01b038581166001600160a01b03199283161790925560098054848416908316178155601d8054909216339081178355306000818152600660209081526040808320805460ff1990811660019081179092556039548a16855282852080548216831790556038548a168552828520805482168317905597548916845281842080548916821790558584528184208054891682179055601c548916845281842080548916821790559383526007825280832080548816851790559454909616815283812080548616831790557fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d80548616831790557f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df805490951682179094555481845260048552828420819055915191825293945090917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350506200065f565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000521578160001904821115620005055762000505620004ca565b808516156200051357918102915b93841c9390800290620004e5565b509250929050565b6000826200053a57506001620005d9565b816200054957506000620005d9565b81600181146200056257600281146200056d576200058d565b6001915050620005d9565b60ff841115620005815762000581620004ca565b50506001821b620005d9565b5060208310610133831016604e8410600b8410161715620005b2575081810a620005d9565b620005be8383620004e0565b8060001904821115620005d557620005d5620004ca565b0290505b92915050565b6000620005f060ff84168362000529565b9392505050565b8082028115828204841417620005d957620005d9620004ca565b6000826200062f57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200064757600080fd5b81516001600160a01b0381168114620005f057600080fd5b613a43806200066f6000396000f3fe60806040526004361061041f5760003560e01c8063893d20e81161021e578063ccec371611610123578063e2910950116100ab578063efca2eed1161007a578063efca2eed14610d62578063f2fde38b14610d78578063f4e0d9ac14610d98578063f69e204614610db8578063feb3040214610dcd57600080fd5b8063e291095014610cb2578063e94dd17c14610cf5578063ef40a67014610d15578063ef43b02b14610d4257600080fd5b8063d494c388116100f2578063d494c38814610beb578063d9c47ade14610c0b578063dbb108b714610c2b578063dd62ed3e14610c4c578063dee5434b14610c9257600080fd5b8063ccec371614610b44578063ce7c2ac214610b64578063d156875014610bbb578063d4348de014610bd157600080fd5b8063a61fba42116101a6578063b7e5595c11610175578063b7e5595c14610a93578063bbc3f06914610ac0578063c0c4939414610ad5578063c61ca2b714610aeb578063caa2344414610b2457600080fd5b8063a61fba42146109fb578063a8aa1b3114610a33578063a9059cbb14610a53578063b6b55f2514610a7357600080fd5b806395d89b41116101ed57806395d89b4114610957578063997664d7146109855780639e252f001461099b5780639fb05d37146109bb578063a0821be3146109db57600080fd5b8063893d20e8146108d05780638c7d13021461090257806392a65e00146109225780639358928b1461094257600080fd5b80633850f6871161032457806371201a0e116102ac5780637d1db4a51161027b5780637d1db4a51461085a578063817b1cd21461087057806382262808146108865780638331c1061461089b578063884870c7146108b057600080fd5b806371201a0e146107f957806375a729441461080f57806378109e54146108245780637a16a49e1461083a57600080fd5b806348ff2b8b116102f357806348ff2b8b1461077857806349c1cf6e146107985780636570e4eb146107ae57806367b50af9146107c357806370a08231146107d957600080fd5b80633850f687146106ec5780633a98ef39146107025780633f4218e0146107185780634355855a1461074857600080fd5b8063234353aa116103a7578063293230b811610376578063293230b81461064c5780632b37e0cc146106615780632e1a7d4d146106815780632f54bf6e146106a1578063313ce567146106d057600080fd5b8063234353aa146105a257806323b872dd146105ec57806326a4e8d21461060c57806328fd31981461062c57600080fd5b80630c8f78fb116103ee5780630c8f78fb146104d35780630dc6e50e146104f557806312f02ffe1461051557806318160ddd1461055057806319e4574d1461056557600080fd5b80630122690f1461042b57806306fdde031461045457806308e20e1f1461048d578063095ea7b3146104a357600080fd5b3661042657005b600080fd5b34801561043757600080fd5b5061044160225481565b6040519081526020015b60405180910390f35b34801561046057600080fd5b506040805180820190915260078152665368656e6f626960c81b60208201525b60405161044b9190613535565b34801561049957600080fd5b5061044160215481565b3480156104af57600080fd5b506104c36104be366004613598565b610de5565b604051901515815260200161044b565b3480156104df57600080fd5b506104f36104ee3660046135c4565b610dfc565b005b34801561050157600080fd5b506104f36105103660046135dd565b610e34565b34801561052157600080fd5b50602254602b546000908152603b60205260409020600101545b6040805192835260208301919091520161044b565b34801561055c57600080fd5b50600154610441565b34801561057157600080fd5b5061057a610f43565b604080519586526020860194909452928401919091526060830152608082015260a00161044b565b3480156105ae57600080fd5b5061057a6105bd3660046135c4565b603b60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b3480156105f857600080fd5b506104c3610607366004613645565b611025565b34801561061857600080fd5b506104f3610627366004613686565b61108f565b34801561063857600080fd5b50610441610647366004613686565b6110db565b34801561065857600080fd5b506104f3611166565b34801561066d57600080fd5b506104f361067c366004613598565b6111a9565b34801561068d57600080fd5b506104f361069c3660046135c4565b6111ef565b3480156106ad57600080fd5b506104c36106bc366004613686565b6000546001600160a01b0391821691161490565b3480156106dc57600080fd5b506040516009815260200161044b565b3480156106f857600080fd5b50610441602b5481565b34801561070e57600080fd5b50610441601e5481565b34801561072457600080fd5b506104c3610733366004613686565b60066020526000908152604090205460ff1681565b34801561075457600080fd5b506104c3610763366004613686565b60076020526000908152604090205460ff1681565b34801561078457600080fd5b506104f36107933660046136b1565b611306565b3480156107a457600080fd5b5061044160335481565b3480156107ba57600080fd5b5061044161135b565b3480156107cf57600080fd5b5061044160315481565b3480156107e557600080fd5b506104416107f4366004613686565b61137d565b34801561080557600080fd5b5061044160325481565b34801561081b57600080fd5b5061057a611398565b34801561083057600080fd5b5061044160035481565b34801561084657600080fd5b506104f36108553660046135c4565b6113d8565b34801561086657600080fd5b5061044160025481565b34801561087c57600080fd5b50610441601a5481565b34801561089257600080fd5b506104f3611407565b3480156108a757600080fd5b506104f3611412565b3480156108bc57600080fd5b506104f36108cb3660046136ea565b611443565b3480156108dc57600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161044b565b34801561090e57600080fd5b506104f361091d3660046135c4565b611547565b34801561092e57600080fd5b506104f361093d36600461370c565b611593565b34801561094e57600080fd5b506104416115db565b34801561096357600080fd5b506040805180820190915260058152645348454a4160d81b6020820152610480565b34801561099157600080fd5b50610441601f5481565b3480156109a757600080fd5b506104f36109b63660046135c4565b611601565b3480156109c757600080fd5b506104f36109d6366004613729565b61163f565b3480156109e757600080fd5b506104416109f6366004613686565b61171c565b348015610a0757600080fd5b50610441610a163660046135c4565b6000908152603a6020908152604080832033845290915290205490565b348015610a3f57600080fd5b506009546108ea906001600160a01b031681565b348015610a5f57600080fd5b506104c3610a6e366004613598565b611749565b348015610a7f57600080fd5b506104f3610a8e3660046135c4565b611756565b348015610a9f57600080fd5b50610441610aae366004613686565b602f6020526000908152604090205481565b348015610acc57600080fd5b506104f3611763565b348015610ae157600080fd5b5061044160295481565b348015610af757600080fd5b50610441610b06366004613686565b6001600160a01b031660009081526026602052604090206002015490565b348015610b3057600080fd5b506104f3610b3f36600461370c565b611795565b348015610b5057600080fd5b506104f3610b5f366004613686565b6117d2565b348015610b7057600080fd5b50610ba0610b7f366004613686565b60266020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161044b565b348015610bc757600080fd5b50610441602a5481565b348015610bdd57600080fd5b50602c546104c39060ff1681565b348015610bf757600080fd5b506104f3610c063660046135c4565b6118e5565b348015610c1757600080fd5b506104f3610c263660046135c4565b611931565b348015610c3757600080fd5b506009546104c390600160b01b900460ff1681565b348015610c5857600080fd5b50610441610c6736600461379a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610c9e57600080fd5b506104f3610cad3660046137c8565b611964565b348015610cbe57600080fd5b50610441610ccd3660046137f4565b6000918252603a602090815260408084206001600160a01b0393909316845291905290205490565b348015610d0157600080fd5b506104f3610d103660046137c8565b61199c565b348015610d2157600080fd5b50610441610d30366004613686565b60196020526000908152604090205481565b348015610d4e57600080fd5b506104f3610d5d3660046136b1565b6119fe565b348015610d6e57600080fd5b5061044160205481565b348015610d8457600080fd5b506104f3610d93366004613686565b611abc565b348015610da457600080fd5b506104f3610db3366004613686565b611b3a565b348015610dc457600080fd5b506104f3611b9e565b348015610dd957600080fd5b50602d5460255461053b565b6000610df2338484611c47565b5060015b92915050565b6000546001600160a01b03163314610e2f5760405162461bcd60e51b8152600401610e2690613819565b60405180910390fd5b603155565b6000546001600160a01b03163314610e5e5760405162461bcd60e51b8152600401610e2690613819565b600a8a9055600b899055600c889055601b859055600d849055600e879055601083905560118290556012819055600f8690556013548311801590610ea6575060135460115411155b8015610eb65750601354600e5411155b8015610ec65750601354600f5411155b8015610ed6575060135460125411155b610f375760405162461bcd60e51b815260206004820152602c60248201527f746f74616c46656520616e642073656c6c4665652063616e6e6f74206265206d60448201526b6f7265207468616e2032302560a01b6064820152608401610e26565b50505050505050505050565b6000806000806000603b6000602b54815260200190815260200160002060000154603b6000610f7e6001602b54611d6b90919063ffffffff16565b815260200190815260200160002060000154603b6000610faa6002602b54611d6b90919063ffffffff16565b815260200190815260200160002060000154603b6000610fd66003602b54611d6b90919063ffffffff16565b815260200190815260200160002060000154603b60006110026004602b54611d6b90919063ffffffff16565b815260200190815260200160002060000154945094509450945094509091929394565b6000611032848484611d77565b611084843361107f856040518060600160405280602881526020016139e6602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611eb2565b611c47565b5060015b9392505050565b6000546001600160a01b031633146110b95760405162461bcd60e51b8152600401610e2690613819565b601d80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116600090815260266020526040812054810361110257506000919050565b6001600160a01b03821660009081526026602052604081205461112490611ede565b6001600160a01b038416600090815260266020526040902060010154909150808211611154575060009392505050565b61115e8282611d6b565b949350505050565b6000546001600160a01b031633146111905760405162461bcd60e51b8152600401610e2690613819565b6009805460ff60a81b1916600160a81b17905542603355565b6000546001600160a01b031633146111d35760405162461bcd60e51b8152600401610e2690613819565b6001600160a01b039091166000908152602f6020526040902055565b336000908152601960205260409020548111156112645760405162461bcd60e51b815260206004820152602d60248201527f45524332303a2043616e6e6f7420756e7374616b65206d6f7265207468616e2060448201526c185b5bdd5b9d081cdd185ad959609a1b6064820152608401610e26565b601c5460405163d8a9bf2960e01b8152336004820152602481018390526001600160a01b039091169063d8a9bf2990604401600060405180830381600087803b1580156112b057600080fd5b505af11580156112c4573d6000803e3d6000fd5b5050336000908152601960205260409020546112e39250905082611d6b565b33600090815260196020526040902055601a546113009082611d6b565b601a5550565b6000546001600160a01b031633146113305760405162461bcd60e51b8152600401610e2690613819565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b60006113786022546113726021546113723061137d565b90611d6b565b905090565b6001600160a01b031660009081526004602052604090205490565b60008060008060006113a93061137d565b6113be6022546113726021546113723061137d565b602154602254602954945094509450945094509091929394565b6000546001600160a01b031633146114025760405162461bcd60e51b8152600401610e2690613819565b603255565b61141033611efb565b565b6000546001600160a01b0316331461143c5760405162461bcd60e51b8152600401610e2690613819565b6000602255565b6000546001600160a01b0316331461146d5760405162461bcd60e51b8152600401610e2690613819565b600061148e6127106114888561148260015490565b9061203e565b9061204a565b905060006114a56127106114888561148260015490565b905060006114bd6103e8611488600561148260015490565b90508083101580156114cf5750808210155b6115395760405162461bcd60e51b815260206004820152603560248201527f45524332303a206d61782054587320616e64206d61782057616c6c65742063616044820152746e6e6f74206265206c657373207468616e202e352560581b6064820152608401610e26565b506002919091556003555050565b6000546001600160a01b031633146115715760405162461bcd60e51b8152600401610e2690613819565b61158d620186a06114888360015461203e90919063ffffffff16565b60355550565b6000546001600160a01b031633146115bd5760405162461bcd60e51b8152600401610e2690613819565b60098054911515600160b01b0260ff60b01b19909216919091179055565b60006113786115ea600061137d565b6113726115f861dead61137d565b60015490611d6b565b6036546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561163b573d6000803e3d6000fd5b5050565b6000546001600160a01b031633146116695760405162461bcd60e51b8152600401610e2690613819565b603880546001600160a01b039687166001600160a01b0319918216811790925560398054968816968216871790556036805495881695821686179055601d805494881694821685179055603780549390971692168217909555600094855260066020526040808620805460ff199081166001908117909255958752818720805487168217905593865280862080548616851790559185528185208054851684179055845290922080549091169091179055565b6001600160a01b0381166000908152601960209081526040808320546004909252822054610df691611d6b565b6000610df2338484611d77565b6117603382612056565b50565b6000546001600160a01b0316331461178d5760405162461bcd60e51b8152600401610e2690613819565b6114106121a1565b6000546001600160a01b031633146117bf5760405162461bcd60e51b8152600401610e2690613819565b602e805460ff1916911515919091179055565b6000546001600160a01b031633146117fc5760405162461bcd60e51b8152600401610e2690613819565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118679190613839565b60365460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156118bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e09190613852565b505050565b6000546001600160a01b0316331461190f5760405162461bcd60e51b8152600401610e2690613819565b61192b620186a06114888360015461203e90919063ffffffff16565b60345550565b6000546001600160a01b0316331461195b5760405162461bcd60e51b8152600401610e2690613819565b61176081612245565b6000546001600160a01b0316331461198e5760405162461bcd60e51b8152600401610e2690613819565b602992909255602155602255565b6000546001600160a01b031633146119c65760405162461bcd60e51b8152600401610e2690613819565b60168390556119df620186a06114888461148260015490565b6017556119f6620186a06114888361148260015490565b601855505050565b6000546001600160a01b03163314611a285760405162461bcd60e51b8152600401610e2690613819565b6001600160a01b0382166000908152600760205260409020805460ff19168215801591909117909155611a6057611a60826000612340565b6001600160a01b0382166000908152602f602052604090205415611aaf576001600160a01b0382166000908152602f602052604090205461163b908390611aaa906114828361137d565b612340565b61163b82611aaa8461137d565b6000546001600160a01b03163314611ae65760405162461bcd60e51b8152600401610e2690613819565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a150565b6000546001600160a01b03163314611b645760405162461bcd60e51b8152600401610e2690613819565b601c80546001600160a01b039092166001600160a01b0319909216821790556000908152600660205260409020805460ff19166001179055565b6015805461ff0019166101001790556000611bb83361137d565b601c546040516334c5cbab60e11b8152336004820181905260248201529192506001600160a01b03169063698b975690604401600060405180830381600087803b158015611c0557600080fd5b505af1158015611c19573d6000803e3d6000fd5b505050506000611c2c826113723361137d565b9050611c383382612056565b50506015805461ff0019169055565b6001600160a01b038316611ca95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e26565b6001600160a01b038216611d0a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e26565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006110888284613885565b611d8283838361247a565b611d8c83836125b2565b611d97838383612643565b611da283838361272f565b611dac8383612871565b611db78383836128d7565b611dc28383836129ab565b6001600160a01b038316600090815260046020526040902054611de59082611d6b565b6001600160a01b038416600090815260046020526040812091909155611e0b84846129d0565b611e155781611e20565b611e20848484612a16565b6001600160a01b038416600090815260046020526040902054909150611e469082612bec565b6001600160a01b0380851660008181526004602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e9a9085815260200190565b60405180910390a3611eac8484612bf8565b50505050565b60008184841115611ed65760405162461bcd60e51b8152600401610e269190613535565b505050900390565b6000610df66024546114886023548561203e90919063ffffffff16565b6000611f06826110db565b6001600160a01b0383166000908152602660205260409020549091501580611f355750611f323061137d565b81115b15611f3e575050565b801561163b57602054611f519082612bec565b6020908155602b546000908152603b9091526040902060010154611f759082612bec565b602b546000908152603b6020526040902060010155611f95308383612e4b565b50602b546000908152603a602090815260408083206001600160a01b03861684528252808320849055602882528083204290556026909152902060020154611fdd9082612bec565b6001600160a01b038316600090815260266020526040902060028101919091555461200790611ede565b6001600160a01b038316600090815260266020908152604080832060010193909355602f90529081205561163b82611aaa8161137d565b60006110888284613898565b600061108882846138af565b6001600160a01b03821660009081526019602090815260408083205460049092529091205461208491611d6b565b8111156120eb5760405162461bcd60e51b815260206004820152602f60248201527f45524332303a2043616e6e6f74207374616b65206d6f7265207468616e20617660448201526e61696c61626c652062616c616e636560881b6064820152608401610e26565b601c5460405163773a0f0960e01b81526001600160a01b038481166004830152602482018490529091169063773a0f0990604401600060405180830381600087803b15801561213957600080fd5b505af115801561214d573d6000803e3d6000fd5b5050506001600160a01b038316600090815260196020526040902054612174915082612bec565b6001600160a01b038316600090815260196020526040902055601a5461219a9082612bec565b601a555050565b602c805460ff1916600190811790915560298054602b80546000908152603b60205260408120600401929092559155546121da91612bec565b602b818155602a546000928352603b602052604080842060030191909155602180548354855282852055915483529091204260029091015560355490541115612224576035546021555b61222f602154612ec0565b60006021819055602a5542603355603154611410905b6020546025548061225557505050565b6000805a905060005b858310801561226c57508381105b1561230b5783603054106122805760006030555b6122b2602560305481548110612298576122986138d1565b6000918252602090912001546001600160a01b0316611efb565b6122c76122c05a8490611d6b565b8490612bec565b92505a6030805491935060006122dc836138e7565b919050555080806122ec906138e7565b602d80549193509091506000612301836138e7565b919050555061225e565b83602d541015801561231e575084602054115b1561233857602c805460ff1916905560006022819055602d555b505050505050565b60008111801561236657506001600160a01b038216600090815260266020526040902054155b156123cc57602580546001600160a01b0384166000818152602760205260408120839055600183018455929092527f401968ff42a154441da5f6c4c935ac46b8671f0e062baaa62a7545ba53bb6e4c0180546001600160a01b03191690911790556123ff565b801580156123f157506001600160a01b03821660009081526026602052604090205415155b156123ff576123ff82612ef9565b6001600160a01b038216600090815260266020526040902054601e5461243091839161242a91611d6b565b90612bec565b601e556001600160a01b038216600090815260266020526040902081905561245781611ede565b6001600160a01b0390921660009081526026602052604090206001019190915550565b6001600160a01b0383166124de5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e26565b6001600160a01b0382166125405760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e26565b6125498361137d565b8111156118e05760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b6064820152608401610e26565b6001600160a01b03821660009081526006602052604090205460ff161580156125f457506001600160a01b03811660009081526006602052604090205460ff16155b1561163b57600954600160a81b900460ff1661163b5760405162461bcd60e51b815260206004820152600e60248201526d1d1c98591a5b99d05b1b1bddd95960921b6044820152606401610e26565b6001600160a01b03831660009081526006602052604090205460ff1615801561268557506001600160a01b03821660009081526006602052604090205460ff16155b801561269f57506009546001600160a01b03838116911614155b80156126b657506001600160a01b03821661dead14155b156118e0576003546001600160a01b0383166000908152600460205260409020546126e19083612bec565b11156118e05760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178696d756d2077616c6c657420616d6f756e742e00006044820152606401610e26565b6001600160a01b038316600090815260196020526040902054156127e5576127568361137d565b6001600160a01b03841660009081526019602052604090205461277a908390612bec565b11156127e55760405162461bcd60e51b815260206004820152603460248201527f45524332303a2045786365656473206d6178696d756d20616c6c6f776564206e60448201527337ba1031bab93932b73a363c9039ba30b5b2b21760611b6064820152608401610e26565b6002548111158061280e57506001600160a01b03831660009081526006602052604090205460ff165b8061283157506001600160a01b03821660009081526006602052604090205460ff165b6118e05760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610e26565b6009546001600160a01b0382811691161480156128a757506001600160a01b03821660009081526006602052604090205460ff16155b80156128b6575060155460ff16155b1561163b576001601460008282546128ce9190613900565b90915550505050565b6009546001600160a01b0384811691161480156128f657506034548110155b15612939576001600160a01b0382166000908152602f602052604090205461291f906001612bec565b6001600160a01b0383166000908152602f60205260409020555b6009546001600160a01b038481169116148015612957575060345481105b15612979576001600160a01b0382166000908152602f60205260409020600190555b6009546001600160a01b03908116908316036118e05750506001600160a01b03166000908152602f6020526040812055565b6129b683838361300e565b156118e0576129c66017546130c6565b6000601455505050565b6001600160a01b03821660009081526006602052604081205460ff161580156110885750506001600160a01b031660009081526006602052604090205460ff1615919050565b600080612a2385856132d1565b118015612a33575060155460ff16155b15612be5576000612a55612a4786866132d1565b60135461148290869061204a565b30600090815260046020526040902054909150612a729082612bec565b30600081815260046020526040908190209290925590516001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612ac39085815260200190565b60405180910390a36000600c54118015612ae85750612ae285856132d1565b600c5411155b15612b3d57612b14612b0b600c546114826013548761204a90919063ffffffff16565b60215490612bec565b602155600c54601354612b3991612b309161148290879061204a565b602a5490612bec565b602a555b6000600e54118015612b5a5750612b5485856132d1565b600e5411155b15612b8657612b863061dead612b81600e546114826013548961204a90919063ffffffff16565b611d77565b6000600f54118015612ba35750612b9d85856132d1565b600f5411155b15612bd357601d54600f54601354612bd39230926001600160a01b0390911691612b81919061148290899061204a565b612bdd8382611d6b565b915050611088565b5092915050565b60006110888284613900565b602e5460ff1615612c095760006022555b6001600160a01b03811660009081526026602052604090205415612c3057612c3081611efb565b6001600160a01b03821660009081526026602052604090205415801590612c6557506009546001600160a01b03828116911614155b15612c7357612c7382611efb565b6009546001600160a01b038281169116148015612ca757506001600160a01b03821660009081526026602052604090205415155b15612cc557612cc1612cb8836110db565b60295490612bec565b6029555b6001600160a01b03821660009081526007602052604090205460ff16612cf257612cf282611aaa8461137d565b6001600160a01b03811660009081526007602052604090205460ff16612d1f57612d1f81611aaa8361137d565b6001600160a01b03811660009081526007602052604090205460ff16158015612d5557506009546001600160a01b038381169116145b8015612d7a57506001600160a01b0381166000908152602f6020526040902054600111155b15612dab576001600160a01b0381166000908152602f6020526040902054612dab908290611aaa906114828361137d565b42612dc3603254603354612bec90919063ffffffff16565b11158015612dda5750600954600160a81b900460ff165b8015612de857506000602154115b8015612df7575060155460ff16155b8015612e0c5750600954600160b01b900460ff165b15612e1957612e196121a1565b612e24603154612245565b6001600160a01b0381166000908152602660205260409020541561163b5761163b81611efb565b6001600160a01b038316600090815260046020526040812054612e6e9083611d6b565b6001600160a01b038086166000908152600460205260408082209390935590851681522054612e9d9083612bec565b6001600160a01b0384166000908152600460205260409020555060019392505050565b601f54612ecd9082612bec565b601f55601e54602454612ef191612ee891611488908561203e565b60235490612bec565b602355602255565b60258054612f0990600190613885565b81548110612f1957612f196138d1565b60009182526020808320909101546001600160a01b0384811684526027909252604090922054602580549290931692918110612f5757612f576138d1565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260279182905260408120546025805491939291612fa390600190613885565b81548110612fb357612fb36138d1565b60009182526020808320909101546001600160a01b031683528201929092526040019020556025805480612fe957612fe9613913565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000806018548310159050600060175461302661135b565b601554911115915060ff161580156130475750600954600160a01b900460ff165b801561305c5750600954600160a81b900460ff165b80156130655750815b801561308a57506001600160a01b03861660009081526006602052604090205460ff16155b80156130a357506009546001600160a01b038681169116145b80156130b3575060165460145410155b80156130bc5750805b9695505050505050565b6015805460ff191660019081179091556010546000916130ed916002916114829190612bec565b601054909150613127576131246002611482600161242a600d5461242a601b5461242a600b54600a54612bec90919063ffffffff16565b90505b600061314282611488600a548661203e90919063ffffffff16565b905060006131508483611d6b565b90504761315c82613338565b60006131684783611d6b565b9050600061318b613184600a5488611d6b90919063ffffffff16565b839061204a565b905060006131a4600a548361203e90919063ffffffff16565b905080156131c5576039546131c590879083906001600160a01b031661348a565b601b546000906131da9061148285600261203e565b9050801561321e576037546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561321c573d6000803e3d6000fd5b505b600b546000906132339061148286600261203e565b90508015613277576038546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015613275573d6000803e3d6000fd5b505b4780156132ba576036546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156132b8573d6000803e3d6000fd5b505b50506015805460ff19169055505050505050505050565b6009546000906001600160a01b0383811691161480156132f357506000601154115b156133015750601154610df6565b6009546001600160a01b03848116911614801561332057506000601054115b1561332e5750601054610df6565b5060125492915050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061336d5761336d6138d1565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156133c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ea9190613929565b816001815181106133fd576133fd6138d1565b6001600160a01b0392831660209182029290920101526008546134239130911684611c47565b60085460405163791ac94760e01b81526001600160a01b039091169063791ac9479061345c908590600090869030904290600401613946565b600060405180830381600087803b15801561347657600080fd5b505af1158015612338573d6000803e3d6000fd5b6008546134a29030906001600160a01b031685611c47565b60085460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0383811660848301524260a48301529091169063f305d71990849060c40160606040518083038185885af1158015613510573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061233891906139b7565b600060208083528351808285015260005b8181101561356257858101830151858201604001528201613546565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461176057600080fd5b600080604083850312156135ab57600080fd5b82356135b681613583565b946020939093013593505050565b6000602082840312156135d657600080fd5b5035919050565b6000806000806000806000806000806101408b8d0312156135fd57600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b60008060006060848603121561365a57600080fd5b833561366581613583565b9250602084013561367581613583565b929592945050506040919091013590565b60006020828403121561369857600080fd5b813561108881613583565b801515811461176057600080fd5b600080604083850312156136c457600080fd5b82356136cf81613583565b915060208301356136df816136a3565b809150509250929050565b600080604083850312156136fd57600080fd5b50508035926020909101359150565b60006020828403121561371e57600080fd5b8135611088816136a3565b600080600080600060a0868803121561374157600080fd5b853561374c81613583565b9450602086013561375c81613583565b9350604086013561376c81613583565b9250606086013561377c81613583565b9150608086013561378c81613583565b809150509295509295909350565b600080604083850312156137ad57600080fd5b82356137b881613583565b915060208301356136df81613583565b6000806000606084860312156137dd57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561380757600080fd5b8235915060208301356136df81613583565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60006020828403121561384b57600080fd5b5051919050565b60006020828403121561386457600080fd5b8151611088816136a3565b634e487b7160e01b600052601160045260246000fd5b81810381811115610df657610df661386f565b8082028115828204841417610df657610df661386f565b6000826138cc57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6000600182016138f9576138f961386f565b5060010190565b80820180821115610df657610df661386f565b634e487b7160e01b600052603160045260246000fd5b60006020828403121561393b57600080fd5b815161108881613583565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156139965784516001600160a01b031683529383019391830191600101613971565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156139cc57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220bf0bee966b55d73f9237f53a9d3ea98898e80a6c0c586126b7d4d73b0bc2f34564736f6c63430008130033

Deployed Bytecode

0x60806040526004361061041f5760003560e01c8063893d20e81161021e578063ccec371611610123578063e2910950116100ab578063efca2eed1161007a578063efca2eed14610d62578063f2fde38b14610d78578063f4e0d9ac14610d98578063f69e204614610db8578063feb3040214610dcd57600080fd5b8063e291095014610cb2578063e94dd17c14610cf5578063ef40a67014610d15578063ef43b02b14610d4257600080fd5b8063d494c388116100f2578063d494c38814610beb578063d9c47ade14610c0b578063dbb108b714610c2b578063dd62ed3e14610c4c578063dee5434b14610c9257600080fd5b8063ccec371614610b44578063ce7c2ac214610b64578063d156875014610bbb578063d4348de014610bd157600080fd5b8063a61fba42116101a6578063b7e5595c11610175578063b7e5595c14610a93578063bbc3f06914610ac0578063c0c4939414610ad5578063c61ca2b714610aeb578063caa2344414610b2457600080fd5b8063a61fba42146109fb578063a8aa1b3114610a33578063a9059cbb14610a53578063b6b55f2514610a7357600080fd5b806395d89b41116101ed57806395d89b4114610957578063997664d7146109855780639e252f001461099b5780639fb05d37146109bb578063a0821be3146109db57600080fd5b8063893d20e8146108d05780638c7d13021461090257806392a65e00146109225780639358928b1461094257600080fd5b80633850f6871161032457806371201a0e116102ac5780637d1db4a51161027b5780637d1db4a51461085a578063817b1cd21461087057806382262808146108865780638331c1061461089b578063884870c7146108b057600080fd5b806371201a0e146107f957806375a729441461080f57806378109e54146108245780637a16a49e1461083a57600080fd5b806348ff2b8b116102f357806348ff2b8b1461077857806349c1cf6e146107985780636570e4eb146107ae57806367b50af9146107c357806370a08231146107d957600080fd5b80633850f687146106ec5780633a98ef39146107025780633f4218e0146107185780634355855a1461074857600080fd5b8063234353aa116103a7578063293230b811610376578063293230b81461064c5780632b37e0cc146106615780632e1a7d4d146106815780632f54bf6e146106a1578063313ce567146106d057600080fd5b8063234353aa146105a257806323b872dd146105ec57806326a4e8d21461060c57806328fd31981461062c57600080fd5b80630c8f78fb116103ee5780630c8f78fb146104d35780630dc6e50e146104f557806312f02ffe1461051557806318160ddd1461055057806319e4574d1461056557600080fd5b80630122690f1461042b57806306fdde031461045457806308e20e1f1461048d578063095ea7b3146104a357600080fd5b3661042657005b600080fd5b34801561043757600080fd5b5061044160225481565b6040519081526020015b60405180910390f35b34801561046057600080fd5b506040805180820190915260078152665368656e6f626960c81b60208201525b60405161044b9190613535565b34801561049957600080fd5b5061044160215481565b3480156104af57600080fd5b506104c36104be366004613598565b610de5565b604051901515815260200161044b565b3480156104df57600080fd5b506104f36104ee3660046135c4565b610dfc565b005b34801561050157600080fd5b506104f36105103660046135dd565b610e34565b34801561052157600080fd5b50602254602b546000908152603b60205260409020600101545b6040805192835260208301919091520161044b565b34801561055c57600080fd5b50600154610441565b34801561057157600080fd5b5061057a610f43565b604080519586526020860194909452928401919091526060830152608082015260a00161044b565b3480156105ae57600080fd5b5061057a6105bd3660046135c4565b603b60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b3480156105f857600080fd5b506104c3610607366004613645565b611025565b34801561061857600080fd5b506104f3610627366004613686565b61108f565b34801561063857600080fd5b50610441610647366004613686565b6110db565b34801561065857600080fd5b506104f3611166565b34801561066d57600080fd5b506104f361067c366004613598565b6111a9565b34801561068d57600080fd5b506104f361069c3660046135c4565b6111ef565b3480156106ad57600080fd5b506104c36106bc366004613686565b6000546001600160a01b0391821691161490565b3480156106dc57600080fd5b506040516009815260200161044b565b3480156106f857600080fd5b50610441602b5481565b34801561070e57600080fd5b50610441601e5481565b34801561072457600080fd5b506104c3610733366004613686565b60066020526000908152604090205460ff1681565b34801561075457600080fd5b506104c3610763366004613686565b60076020526000908152604090205460ff1681565b34801561078457600080fd5b506104f36107933660046136b1565b611306565b3480156107a457600080fd5b5061044160335481565b3480156107ba57600080fd5b5061044161135b565b3480156107cf57600080fd5b5061044160315481565b3480156107e557600080fd5b506104416107f4366004613686565b61137d565b34801561080557600080fd5b5061044160325481565b34801561081b57600080fd5b5061057a611398565b34801561083057600080fd5b5061044160035481565b34801561084657600080fd5b506104f36108553660046135c4565b6113d8565b34801561086657600080fd5b5061044160025481565b34801561087c57600080fd5b50610441601a5481565b34801561089257600080fd5b506104f3611407565b3480156108a757600080fd5b506104f3611412565b3480156108bc57600080fd5b506104f36108cb3660046136ea565b611443565b3480156108dc57600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161044b565b34801561090e57600080fd5b506104f361091d3660046135c4565b611547565b34801561092e57600080fd5b506104f361093d36600461370c565b611593565b34801561094e57600080fd5b506104416115db565b34801561096357600080fd5b506040805180820190915260058152645348454a4160d81b6020820152610480565b34801561099157600080fd5b50610441601f5481565b3480156109a757600080fd5b506104f36109b63660046135c4565b611601565b3480156109c757600080fd5b506104f36109d6366004613729565b61163f565b3480156109e757600080fd5b506104416109f6366004613686565b61171c565b348015610a0757600080fd5b50610441610a163660046135c4565b6000908152603a6020908152604080832033845290915290205490565b348015610a3f57600080fd5b506009546108ea906001600160a01b031681565b348015610a5f57600080fd5b506104c3610a6e366004613598565b611749565b348015610a7f57600080fd5b506104f3610a8e3660046135c4565b611756565b348015610a9f57600080fd5b50610441610aae366004613686565b602f6020526000908152604090205481565b348015610acc57600080fd5b506104f3611763565b348015610ae157600080fd5b5061044160295481565b348015610af757600080fd5b50610441610b06366004613686565b6001600160a01b031660009081526026602052604090206002015490565b348015610b3057600080fd5b506104f3610b3f36600461370c565b611795565b348015610b5057600080fd5b506104f3610b5f366004613686565b6117d2565b348015610b7057600080fd5b50610ba0610b7f366004613686565b60266020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161044b565b348015610bc757600080fd5b50610441602a5481565b348015610bdd57600080fd5b50602c546104c39060ff1681565b348015610bf757600080fd5b506104f3610c063660046135c4565b6118e5565b348015610c1757600080fd5b506104f3610c263660046135c4565b611931565b348015610c3757600080fd5b506009546104c390600160b01b900460ff1681565b348015610c5857600080fd5b50610441610c6736600461379a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610c9e57600080fd5b506104f3610cad3660046137c8565b611964565b348015610cbe57600080fd5b50610441610ccd3660046137f4565b6000918252603a602090815260408084206001600160a01b0393909316845291905290205490565b348015610d0157600080fd5b506104f3610d103660046137c8565b61199c565b348015610d2157600080fd5b50610441610d30366004613686565b60196020526000908152604090205481565b348015610d4e57600080fd5b506104f3610d5d3660046136b1565b6119fe565b348015610d6e57600080fd5b5061044160205481565b348015610d8457600080fd5b506104f3610d93366004613686565b611abc565b348015610da457600080fd5b506104f3610db3366004613686565b611b3a565b348015610dc457600080fd5b506104f3611b9e565b348015610dd957600080fd5b50602d5460255461053b565b6000610df2338484611c47565b5060015b92915050565b6000546001600160a01b03163314610e2f5760405162461bcd60e51b8152600401610e2690613819565b60405180910390fd5b603155565b6000546001600160a01b03163314610e5e5760405162461bcd60e51b8152600401610e2690613819565b600a8a9055600b899055600c889055601b859055600d849055600e879055601083905560118290556012819055600f8690556013548311801590610ea6575060135460115411155b8015610eb65750601354600e5411155b8015610ec65750601354600f5411155b8015610ed6575060135460125411155b610f375760405162461bcd60e51b815260206004820152602c60248201527f746f74616c46656520616e642073656c6c4665652063616e6e6f74206265206d60448201526b6f7265207468616e2032302560a01b6064820152608401610e26565b50505050505050505050565b6000806000806000603b6000602b54815260200190815260200160002060000154603b6000610f7e6001602b54611d6b90919063ffffffff16565b815260200190815260200160002060000154603b6000610faa6002602b54611d6b90919063ffffffff16565b815260200190815260200160002060000154603b6000610fd66003602b54611d6b90919063ffffffff16565b815260200190815260200160002060000154603b60006110026004602b54611d6b90919063ffffffff16565b815260200190815260200160002060000154945094509450945094509091929394565b6000611032848484611d77565b611084843361107f856040518060600160405280602881526020016139e6602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611eb2565b611c47565b5060015b9392505050565b6000546001600160a01b031633146110b95760405162461bcd60e51b8152600401610e2690613819565b601d80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116600090815260266020526040812054810361110257506000919050565b6001600160a01b03821660009081526026602052604081205461112490611ede565b6001600160a01b038416600090815260266020526040902060010154909150808211611154575060009392505050565b61115e8282611d6b565b949350505050565b6000546001600160a01b031633146111905760405162461bcd60e51b8152600401610e2690613819565b6009805460ff60a81b1916600160a81b17905542603355565b6000546001600160a01b031633146111d35760405162461bcd60e51b8152600401610e2690613819565b6001600160a01b039091166000908152602f6020526040902055565b336000908152601960205260409020548111156112645760405162461bcd60e51b815260206004820152602d60248201527f45524332303a2043616e6e6f7420756e7374616b65206d6f7265207468616e2060448201526c185b5bdd5b9d081cdd185ad959609a1b6064820152608401610e26565b601c5460405163d8a9bf2960e01b8152336004820152602481018390526001600160a01b039091169063d8a9bf2990604401600060405180830381600087803b1580156112b057600080fd5b505af11580156112c4573d6000803e3d6000fd5b5050336000908152601960205260409020546112e39250905082611d6b565b33600090815260196020526040902055601a546113009082611d6b565b601a5550565b6000546001600160a01b031633146113305760405162461bcd60e51b8152600401610e2690613819565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b60006113786022546113726021546113723061137d565b90611d6b565b905090565b6001600160a01b031660009081526004602052604090205490565b60008060008060006113a93061137d565b6113be6022546113726021546113723061137d565b602154602254602954945094509450945094509091929394565b6000546001600160a01b031633146114025760405162461bcd60e51b8152600401610e2690613819565b603255565b61141033611efb565b565b6000546001600160a01b0316331461143c5760405162461bcd60e51b8152600401610e2690613819565b6000602255565b6000546001600160a01b0316331461146d5760405162461bcd60e51b8152600401610e2690613819565b600061148e6127106114888561148260015490565b9061203e565b9061204a565b905060006114a56127106114888561148260015490565b905060006114bd6103e8611488600561148260015490565b90508083101580156114cf5750808210155b6115395760405162461bcd60e51b815260206004820152603560248201527f45524332303a206d61782054587320616e64206d61782057616c6c65742063616044820152746e6e6f74206265206c657373207468616e202e352560581b6064820152608401610e26565b506002919091556003555050565b6000546001600160a01b031633146115715760405162461bcd60e51b8152600401610e2690613819565b61158d620186a06114888360015461203e90919063ffffffff16565b60355550565b6000546001600160a01b031633146115bd5760405162461bcd60e51b8152600401610e2690613819565b60098054911515600160b01b0260ff60b01b19909216919091179055565b60006113786115ea600061137d565b6113726115f861dead61137d565b60015490611d6b565b6036546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561163b573d6000803e3d6000fd5b5050565b6000546001600160a01b031633146116695760405162461bcd60e51b8152600401610e2690613819565b603880546001600160a01b039687166001600160a01b0319918216811790925560398054968816968216871790556036805495881695821686179055601d805494881694821685179055603780549390971692168217909555600094855260066020526040808620805460ff199081166001908117909255958752818720805487168217905593865280862080548616851790559185528185208054851684179055845290922080549091169091179055565b6001600160a01b0381166000908152601960209081526040808320546004909252822054610df691611d6b565b6000610df2338484611d77565b6117603382612056565b50565b6000546001600160a01b0316331461178d5760405162461bcd60e51b8152600401610e2690613819565b6114106121a1565b6000546001600160a01b031633146117bf5760405162461bcd60e51b8152600401610e2690613819565b602e805460ff1916911515919091179055565b6000546001600160a01b031633146117fc5760405162461bcd60e51b8152600401610e2690613819565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118679190613839565b60365460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156118bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e09190613852565b505050565b6000546001600160a01b0316331461190f5760405162461bcd60e51b8152600401610e2690613819565b61192b620186a06114888360015461203e90919063ffffffff16565b60345550565b6000546001600160a01b0316331461195b5760405162461bcd60e51b8152600401610e2690613819565b61176081612245565b6000546001600160a01b0316331461198e5760405162461bcd60e51b8152600401610e2690613819565b602992909255602155602255565b6000546001600160a01b031633146119c65760405162461bcd60e51b8152600401610e2690613819565b60168390556119df620186a06114888461148260015490565b6017556119f6620186a06114888361148260015490565b601855505050565b6000546001600160a01b03163314611a285760405162461bcd60e51b8152600401610e2690613819565b6001600160a01b0382166000908152600760205260409020805460ff19168215801591909117909155611a6057611a60826000612340565b6001600160a01b0382166000908152602f602052604090205415611aaf576001600160a01b0382166000908152602f602052604090205461163b908390611aaa906114828361137d565b612340565b61163b82611aaa8461137d565b6000546001600160a01b03163314611ae65760405162461bcd60e51b8152600401610e2690613819565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a150565b6000546001600160a01b03163314611b645760405162461bcd60e51b8152600401610e2690613819565b601c80546001600160a01b039092166001600160a01b0319909216821790556000908152600660205260409020805460ff19166001179055565b6015805461ff0019166101001790556000611bb83361137d565b601c546040516334c5cbab60e11b8152336004820181905260248201529192506001600160a01b03169063698b975690604401600060405180830381600087803b158015611c0557600080fd5b505af1158015611c19573d6000803e3d6000fd5b505050506000611c2c826113723361137d565b9050611c383382612056565b50506015805461ff0019169055565b6001600160a01b038316611ca95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e26565b6001600160a01b038216611d0a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e26565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006110888284613885565b611d8283838361247a565b611d8c83836125b2565b611d97838383612643565b611da283838361272f565b611dac8383612871565b611db78383836128d7565b611dc28383836129ab565b6001600160a01b038316600090815260046020526040902054611de59082611d6b565b6001600160a01b038416600090815260046020526040812091909155611e0b84846129d0565b611e155781611e20565b611e20848484612a16565b6001600160a01b038416600090815260046020526040902054909150611e469082612bec565b6001600160a01b0380851660008181526004602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e9a9085815260200190565b60405180910390a3611eac8484612bf8565b50505050565b60008184841115611ed65760405162461bcd60e51b8152600401610e269190613535565b505050900390565b6000610df66024546114886023548561203e90919063ffffffff16565b6000611f06826110db565b6001600160a01b0383166000908152602660205260409020549091501580611f355750611f323061137d565b81115b15611f3e575050565b801561163b57602054611f519082612bec565b6020908155602b546000908152603b9091526040902060010154611f759082612bec565b602b546000908152603b6020526040902060010155611f95308383612e4b565b50602b546000908152603a602090815260408083206001600160a01b03861684528252808320849055602882528083204290556026909152902060020154611fdd9082612bec565b6001600160a01b038316600090815260266020526040902060028101919091555461200790611ede565b6001600160a01b038316600090815260266020908152604080832060010193909355602f90529081205561163b82611aaa8161137d565b60006110888284613898565b600061108882846138af565b6001600160a01b03821660009081526019602090815260408083205460049092529091205461208491611d6b565b8111156120eb5760405162461bcd60e51b815260206004820152602f60248201527f45524332303a2043616e6e6f74207374616b65206d6f7265207468616e20617660448201526e61696c61626c652062616c616e636560881b6064820152608401610e26565b601c5460405163773a0f0960e01b81526001600160a01b038481166004830152602482018490529091169063773a0f0990604401600060405180830381600087803b15801561213957600080fd5b505af115801561214d573d6000803e3d6000fd5b5050506001600160a01b038316600090815260196020526040902054612174915082612bec565b6001600160a01b038316600090815260196020526040902055601a5461219a9082612bec565b601a555050565b602c805460ff1916600190811790915560298054602b80546000908152603b60205260408120600401929092559155546121da91612bec565b602b818155602a546000928352603b602052604080842060030191909155602180548354855282852055915483529091204260029091015560355490541115612224576035546021555b61222f602154612ec0565b60006021819055602a5542603355603154611410905b6020546025548061225557505050565b6000805a905060005b858310801561226c57508381105b1561230b5783603054106122805760006030555b6122b2602560305481548110612298576122986138d1565b6000918252602090912001546001600160a01b0316611efb565b6122c76122c05a8490611d6b565b8490612bec565b92505a6030805491935060006122dc836138e7565b919050555080806122ec906138e7565b602d80549193509091506000612301836138e7565b919050555061225e565b83602d541015801561231e575084602054115b1561233857602c805460ff1916905560006022819055602d555b505050505050565b60008111801561236657506001600160a01b038216600090815260266020526040902054155b156123cc57602580546001600160a01b0384166000818152602760205260408120839055600183018455929092527f401968ff42a154441da5f6c4c935ac46b8671f0e062baaa62a7545ba53bb6e4c0180546001600160a01b03191690911790556123ff565b801580156123f157506001600160a01b03821660009081526026602052604090205415155b156123ff576123ff82612ef9565b6001600160a01b038216600090815260266020526040902054601e5461243091839161242a91611d6b565b90612bec565b601e556001600160a01b038216600090815260266020526040902081905561245781611ede565b6001600160a01b0390921660009081526026602052604090206001019190915550565b6001600160a01b0383166124de5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e26565b6001600160a01b0382166125405760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e26565b6125498361137d565b8111156118e05760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b6064820152608401610e26565b6001600160a01b03821660009081526006602052604090205460ff161580156125f457506001600160a01b03811660009081526006602052604090205460ff16155b1561163b57600954600160a81b900460ff1661163b5760405162461bcd60e51b815260206004820152600e60248201526d1d1c98591a5b99d05b1b1bddd95960921b6044820152606401610e26565b6001600160a01b03831660009081526006602052604090205460ff1615801561268557506001600160a01b03821660009081526006602052604090205460ff16155b801561269f57506009546001600160a01b03838116911614155b80156126b657506001600160a01b03821661dead14155b156118e0576003546001600160a01b0383166000908152600460205260409020546126e19083612bec565b11156118e05760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178696d756d2077616c6c657420616d6f756e742e00006044820152606401610e26565b6001600160a01b038316600090815260196020526040902054156127e5576127568361137d565b6001600160a01b03841660009081526019602052604090205461277a908390612bec565b11156127e55760405162461bcd60e51b815260206004820152603460248201527f45524332303a2045786365656473206d6178696d756d20616c6c6f776564206e60448201527337ba1031bab93932b73a363c9039ba30b5b2b21760611b6064820152608401610e26565b6002548111158061280e57506001600160a01b03831660009081526006602052604090205460ff165b8061283157506001600160a01b03821660009081526006602052604090205460ff165b6118e05760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610e26565b6009546001600160a01b0382811691161480156128a757506001600160a01b03821660009081526006602052604090205460ff16155b80156128b6575060155460ff16155b1561163b576001601460008282546128ce9190613900565b90915550505050565b6009546001600160a01b0384811691161480156128f657506034548110155b15612939576001600160a01b0382166000908152602f602052604090205461291f906001612bec565b6001600160a01b0383166000908152602f60205260409020555b6009546001600160a01b038481169116148015612957575060345481105b15612979576001600160a01b0382166000908152602f60205260409020600190555b6009546001600160a01b03908116908316036118e05750506001600160a01b03166000908152602f6020526040812055565b6129b683838361300e565b156118e0576129c66017546130c6565b6000601455505050565b6001600160a01b03821660009081526006602052604081205460ff161580156110885750506001600160a01b031660009081526006602052604090205460ff1615919050565b600080612a2385856132d1565b118015612a33575060155460ff16155b15612be5576000612a55612a4786866132d1565b60135461148290869061204a565b30600090815260046020526040902054909150612a729082612bec565b30600081815260046020526040908190209290925590516001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612ac39085815260200190565b60405180910390a36000600c54118015612ae85750612ae285856132d1565b600c5411155b15612b3d57612b14612b0b600c546114826013548761204a90919063ffffffff16565b60215490612bec565b602155600c54601354612b3991612b309161148290879061204a565b602a5490612bec565b602a555b6000600e54118015612b5a5750612b5485856132d1565b600e5411155b15612b8657612b863061dead612b81600e546114826013548961204a90919063ffffffff16565b611d77565b6000600f54118015612ba35750612b9d85856132d1565b600f5411155b15612bd357601d54600f54601354612bd39230926001600160a01b0390911691612b81919061148290899061204a565b612bdd8382611d6b565b915050611088565b5092915050565b60006110888284613900565b602e5460ff1615612c095760006022555b6001600160a01b03811660009081526026602052604090205415612c3057612c3081611efb565b6001600160a01b03821660009081526026602052604090205415801590612c6557506009546001600160a01b03828116911614155b15612c7357612c7382611efb565b6009546001600160a01b038281169116148015612ca757506001600160a01b03821660009081526026602052604090205415155b15612cc557612cc1612cb8836110db565b60295490612bec565b6029555b6001600160a01b03821660009081526007602052604090205460ff16612cf257612cf282611aaa8461137d565b6001600160a01b03811660009081526007602052604090205460ff16612d1f57612d1f81611aaa8361137d565b6001600160a01b03811660009081526007602052604090205460ff16158015612d5557506009546001600160a01b038381169116145b8015612d7a57506001600160a01b0381166000908152602f6020526040902054600111155b15612dab576001600160a01b0381166000908152602f6020526040902054612dab908290611aaa906114828361137d565b42612dc3603254603354612bec90919063ffffffff16565b11158015612dda5750600954600160a81b900460ff165b8015612de857506000602154115b8015612df7575060155460ff16155b8015612e0c5750600954600160b01b900460ff165b15612e1957612e196121a1565b612e24603154612245565b6001600160a01b0381166000908152602660205260409020541561163b5761163b81611efb565b6001600160a01b038316600090815260046020526040812054612e6e9083611d6b565b6001600160a01b038086166000908152600460205260408082209390935590851681522054612e9d9083612bec565b6001600160a01b0384166000908152600460205260409020555060019392505050565b601f54612ecd9082612bec565b601f55601e54602454612ef191612ee891611488908561203e565b60235490612bec565b602355602255565b60258054612f0990600190613885565b81548110612f1957612f196138d1565b60009182526020808320909101546001600160a01b0384811684526027909252604090922054602580549290931692918110612f5757612f576138d1565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260279182905260408120546025805491939291612fa390600190613885565b81548110612fb357612fb36138d1565b60009182526020808320909101546001600160a01b031683528201929092526040019020556025805480612fe957612fe9613913565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000806018548310159050600060175461302661135b565b601554911115915060ff161580156130475750600954600160a01b900460ff165b801561305c5750600954600160a81b900460ff165b80156130655750815b801561308a57506001600160a01b03861660009081526006602052604090205460ff16155b80156130a357506009546001600160a01b038681169116145b80156130b3575060165460145410155b80156130bc5750805b9695505050505050565b6015805460ff191660019081179091556010546000916130ed916002916114829190612bec565b601054909150613127576131246002611482600161242a600d5461242a601b5461242a600b54600a54612bec90919063ffffffff16565b90505b600061314282611488600a548661203e90919063ffffffff16565b905060006131508483611d6b565b90504761315c82613338565b60006131684783611d6b565b9050600061318b613184600a5488611d6b90919063ffffffff16565b839061204a565b905060006131a4600a548361203e90919063ffffffff16565b905080156131c5576039546131c590879083906001600160a01b031661348a565b601b546000906131da9061148285600261203e565b9050801561321e576037546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561321c573d6000803e3d6000fd5b505b600b546000906132339061148286600261203e565b90508015613277576038546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015613275573d6000803e3d6000fd5b505b4780156132ba576036546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156132b8573d6000803e3d6000fd5b505b50506015805460ff19169055505050505050505050565b6009546000906001600160a01b0383811691161480156132f357506000601154115b156133015750601154610df6565b6009546001600160a01b03848116911614801561332057506000601054115b1561332e5750601054610df6565b5060125492915050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061336d5761336d6138d1565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156133c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ea9190613929565b816001815181106133fd576133fd6138d1565b6001600160a01b0392831660209182029290920101526008546134239130911684611c47565b60085460405163791ac94760e01b81526001600160a01b039091169063791ac9479061345c908590600090869030904290600401613946565b600060405180830381600087803b15801561347657600080fd5b505af1158015612338573d6000803e3d6000fd5b6008546134a29030906001600160a01b031685611c47565b60085460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0383811660848301524260a48301529091169063f305d71990849060c40160606040518083038185885af1158015613510573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061233891906139b7565b600060208083528351808285015260005b8181101561356257858101830151858201604001528201613546565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461176057600080fd5b600080604083850312156135ab57600080fd5b82356135b681613583565b946020939093013593505050565b6000602082840312156135d657600080fd5b5035919050565b6000806000806000806000806000806101408b8d0312156135fd57600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b60008060006060848603121561365a57600080fd5b833561366581613583565b9250602084013561367581613583565b929592945050506040919091013590565b60006020828403121561369857600080fd5b813561108881613583565b801515811461176057600080fd5b600080604083850312156136c457600080fd5b82356136cf81613583565b915060208301356136df816136a3565b809150509250929050565b600080604083850312156136fd57600080fd5b50508035926020909101359150565b60006020828403121561371e57600080fd5b8135611088816136a3565b600080600080600060a0868803121561374157600080fd5b853561374c81613583565b9450602086013561375c81613583565b9350604086013561376c81613583565b9250606086013561377c81613583565b9150608086013561378c81613583565b809150509295509295909350565b600080604083850312156137ad57600080fd5b82356137b881613583565b915060208301356136df81613583565b6000806000606084860312156137dd57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561380757600080fd5b8235915060208301356136df81613583565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60006020828403121561384b57600080fd5b5051919050565b60006020828403121561386457600080fd5b8151611088816136a3565b634e487b7160e01b600052601160045260246000fd5b81810381811115610df657610df661386f565b8082028115828204841417610df657610df661386f565b6000826138cc57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6000600182016138f9576138f961386f565b5060010190565b80820180821115610df657610df661386f565b634e487b7160e01b600052603160045260246000fd5b60006020828403121561393b57600080fd5b815161108881613583565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156139965784516001600160a01b031683529383019391830191600101613971565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156139cc57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220bf0bee966b55d73f9237f53a9d3ea98898e80a6c0c586126b7d4d73b0bc2f34564736f6c63430008130033

Deployed Bytecode Sourcemap

4436:27329:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6419:40;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;6419:40:0;;;;;;;;9114:67;;;;;;;;;;-1:-1:-1;9174:5:0;;;;;;;;;;;;-1:-1:-1;;;9174:5:0;;;;9114:67;;;;;;;:::i;6381:31::-;;;;;;;;;;;;;;;;9898:133;;;;;;;;;;-1:-1:-1;9898:133:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;9898:133:0;1205:187:1;25415:88:0;;;;;;;;;;-1:-1:-1;25415:88:0;;;;;:::i;:::-;;:::i;:::-;;12394:700;;;;;;;;;;-1:-1:-1;12394:700:0;;;;;:::i;:::-;;:::i;26920:207::-;;;;;;;;;;-1:-1:-1;27043:25:0;;27081:15;;26982:20;27070:27;;;:10;:27;;;;;:48;;;26920:207;;;;2560:25:1;;;2616:2;2601:18;;2594:34;;;;2533:18;26920:207:0;2386:248:1;9421:84:0;;;;;;;;;;-1:-1:-1;9491:12:0;;9421:84;;31032:404;;;;;;;;;;;;;:::i;:::-;;;;2898:25:1;;;2954:2;2939:18;;2932:34;;;;2982:18;;;2975:34;;;;3040:2;3025:18;;3018:34;3083:3;3068:19;;3061:35;2885:3;2870:19;31032:404:0;2639:463:1;8124:47:0;;;;;;;;;;-1:-1:-1;8124:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10677:309;;;;;;;;;;-1:-1:-1;10677:309:0;;;;;:::i;:::-;;:::i;26510:106::-;;;;;;;;;;-1:-1:-1;26510:106:0;;;;;:::i;:::-;;:::i;29369:473::-;;;;;;;;;;-1:-1:-1;29369:473:0;;;;;:::i;:::-;;:::i;16388:128::-;;;;;;;;;;;;;:::i;16839:131::-;;;;;;;;;;-1:-1:-1;16839:131:0;;;;;:::i;:::-;;:::i;14049:347::-;;;;;;;;;;-1:-1:-1;14049:347:0;;;;;:::i;:::-;;:::i;2324:87::-;;;;;;;;;;-1:-1:-1;2324:87:0;;;;;:::i;:::-;2379:4;2404:5;-1:-1:-1;;;;;2393:16:0;;;2404:5;;2393:16;;2324:87;9264:67;;;;;;;;;;-1:-1:-1;9264:67:0;;4657:1;3962:36:1;;3950:2;3935:18;9264:67:0;3820:184:1;6912:30:0;;;;;;;;;;;;;;;;6274:26;;;;;;;;;;;;;;;;4996:44;;;;;;;;;;-1:-1:-1;4996:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;5047:49;;;;;;;;;;-1:-1:-1;5047:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;17454:124;;;;;;;;;;-1:-1:-1;17454:124:0;;;;;:::i;:::-;;:::i;7253:31::-;;;;;;;;;;;;;;;;30843:181;;;;;;;;;;;;;:::i;7160:33::-;;;;;;;;;;;;;;;;9511:103;;;;;;;;;;-1:-1:-1;9511:103:0;;;;;:::i;:::-;;:::i;7200:46::-;;;;;;;;;;;;;;;;30499:336;;;;;;;;;;;;;:::i;4805:63::-;;;;;;;;;;;;;;;;25055:120;;;;;;;;;;-1:-1:-1;25055:120:0;;;;;:::i;:::-;;:::i;4738:60::-;;;;;;;;;;;;;;;;6121:26;;;;;;;;;;;;;;;;26826:86;;;;;;;;;;;;;:::i;25511:108::-;;;;;;;;;;;;;:::i;13102:449::-;;;;;;;;;;-1:-1:-1;13102:449:0;;;;;:::i;:::-;;:::i;9337:78::-;;;;;;;;;;-1:-1:-1;9389:7:0;9407:5;-1:-1:-1;;;;;9407:5:0;9337:78;;;-1:-1:-1;;;;;4936:32:1;;;4918:51;;4906:2;4891:18;9337:78:0;4772:203:1;24915:132:0;;;;;;;;;;-1:-1:-1;24915:132:0;;;;;:::i;:::-;;:::i;25302:105::-;;;;;;;;;;-1:-1:-1;25302:105:0;;;;;:::i;:::-;;:::i;10168:138::-;;;;;;;;;;;;;:::i;9187:71::-;;;;;;;;;;-1:-1:-1;9249:7:0;;;;;;;;;;;;-1:-1:-1;;;9249:7:0;;;;9187:71;;6307:29;;;;;;;;;;;;;;;;26395:107;;;;;;;;;;-1:-1:-1;26395:107:0;;;;;:::i;:::-;;:::i;16978:468::-;;;;;;;;;;-1:-1:-1;16978:468:0;;;;;:::i;:::-;;:::i;10037:125::-;;;;;;;;;;-1:-1:-1;10037:125:0;;;;;:::i;:::-;;:::i;31614:148::-;;;;;;;;;;-1:-1:-1;31614:148:0;;;;;:::i;:::-;31689:7;31716:26;;;:13;:26;;;;;;;;31743:10;31716:38;;;;;;;;;31614:148;5124:19;;;;;;;;;;-1:-1:-1;5124:19:0;;;;-1:-1:-1;;;;;5124:19:0;;;9620:139;;;;;;;;;;-1:-1:-1;9620:139:0;;;;;:::i;:::-;;:::i;13936:105::-;;;;;;;;;;-1:-1:-1;13936:105:0;;;;;:::i;:::-;;:::i;7068:49::-;;;;;;;;;;-1:-1:-1;7068:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;24606:94;;;;;;;;;;;;;:::i;6835:30::-;;;;;;;;;;;;;;;;26624:194;;;;;;;;;;-1:-1:-1;26624:194:0;;;;;:::i;:::-;-1:-1:-1;;;;;26776:19:0;26701:7;26776:19;;;:6;:19;;;;;:33;;;;26624:194;25183:111;;;;;;;;;;-1:-1:-1;25183:111:0;;;;;:::i;:::-;;:::i;24708:199::-;;;;;;;;;;-1:-1:-1;24708:199:0;;;;;:::i;:::-;;:::i;6597:40::-;;;;;;;;;;-1:-1:-1;6597:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6246:25:1;;;6302:2;6287:18;;6280:34;;;;6330:18;;;6323:34;6234:2;6219:18;6597:40:0;6044:319:1;6872:33:0;;;;;;;;;;;;;;;;6949:35;;;;;;;;;;-1:-1:-1;6949:35:0;;;;;;;;17806:130;;;;;;;;;;-1:-1:-1;17806:130:0;;;;;:::i;:::-;;:::i;27318:108::-;;;;;;;;;;-1:-1:-1;27318:108:0;;;;;:::i;:::-;;:::i;5230:37::-;;;;;;;;;;-1:-1:-1;5230:37:0;;;;-1:-1:-1;;;5230:37:0;;;;;;9765:127;;;;;;;;;;-1:-1:-1;9765:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;9863:18:0;;;9846:7;9863:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9765:127;17586:212;;;;;;;;;;-1:-1:-1;17586:212:0;;;;;:::i;:::-;;:::i;31444:162::-;;;;;;;;;;-1:-1:-1;31444:162:0;;;;;:::i;:::-;31537:7;31564:26;;;:13;:26;;;;;;;;-1:-1:-1;;;;;31564:34:0;;;;;;;;;;;;;31444:162;16524:307;;;;;;;;;;-1:-1:-1;16524:307:0;;;;;:::i;:::-;;:::i;6067:47::-;;;;;;;;;;-1:-1:-1;6067:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;22282:327;;;;;;;;;;-1:-1:-1;22282:327:0;;;;;:::i;:::-;;:::i;6343:31::-;;;;;;;;;;;;;;;;2417:111;;;;;;;;;;-1:-1:-1;2417:111:0;;;;;:::i;:::-;;:::i;14726:157::-;;;;;;;;;;-1:-1:-1;14726:157:0;;;;;:::i;:::-;;:::i;14404:314::-;;;;;;;;;;;;;:::i;27135:175::-;;;;;;;;;;-1:-1:-1;27267:13:0;;27282:12;:19;27135:175;;9898:133;9973:4;9980:37;9989:10;10001:7;10010:6;9980:8;:37::i;:::-;-1:-1:-1;10025:4:0;9898:133;;;;;:::o;25415:88::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;;;;;;;;;25480:9:::1;:15:::0;25415:88::o;12394:700::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;12636:12:::1;:25:::0;;;12663:12:::1;:25:::0;;;12690:13:::1;:28:::0;;;12720:7:::1;:18:::0;;;12740:14:::1;:29:::0;;;-1:-1:-1;12780:15:0;;;12797:8:::1;:17:::0;;;12816:7:::1;:15:::0;;;12833:11:::1;:20:::0;;;12855:8:::1;:17:::0;;;12903:11:::1;::::0;12891:23;::::1;::::0;::::1;::::0;:49:::1;;;12929:11;;12918:7;;:22;;12891:49;:75;;;;;12955:11;;12944:7;;:22;;12891:75;:102;;;;;12982:11;;12970:8;;:23;;12891:102;:146;;;;;13026:11;;13011;;:26;;12891:146;12883:203;;;::::0;-1:-1:-1;;;12883:203:0;;8198:2:1;12883:203:0::1;::::0;::::1;8180:21:1::0;8237:2;8217:18;;;8210:30;8276:34;8256:18;;;8249:62;-1:-1:-1;;;8327:18:1;;;8320:42;8379:19;;12883:203:0::1;7996:408:1::0;12883:203:0::1;12394:700:::0;;;;;;;;;;:::o;31032:404::-;31095:7;31104;31113;31122;31131;31158:10;:27;31169:15;;31158:27;;;;;;;;;;;:44;;;31204:10;:34;31215:22;31235:1;31215:15;;:19;;:22;;;;:::i;:::-;31204:34;;;;;;;;;;;:51;;;31257:10;:34;31268:22;31288:1;31268:15;;:19;;:22;;;;:::i;:::-;31257:34;;;;;;;;;;;:51;;;31323:10;:34;31334:22;31354:1;31334:15;;:19;;:22;;;;:::i;:::-;31323:34;;;;;;;;;;;:51;;;31376:10;:34;31387:22;31407:1;31387:15;;:19;;:22;;;;:::i;:::-;31376:34;;;;;;;;;;;:51;;;31151:277;;;;;;;;;;31032:404;;;;;:::o;10677:309::-;10775:4;10792:36;10802:6;10810:9;10821:6;10792:9;:36::i;:::-;10839:117;10848:6;10856:10;10868:87;10904:6;10868:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10868:19:0;;;;;;:11;:19;;;;;;;;10888:10;10868:31;;;;;;;;;:87;:35;:87::i;:::-;10839:8;:117::i;:::-;-1:-1:-1;10974:4:0;10677:309;;;;;;:::o;26510:106::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;26583:14:::1;:25:::0;;-1:-1:-1;;;;;;26583:25:0::1;-1:-1:-1::0;;;;;26583:25:0;;;::::1;::::0;;;::::1;::::0;;26510:106::o;29369:473::-;-1:-1:-1;;;;;29461:19:0;;29438:7;29461:19;;;:6;:19;;;;;:26;:31;;29458:48;;-1:-1:-1;29502:1:0;;29369:473;-1:-1:-1;29369:473:0:o;29458:48::-;-1:-1:-1;;;;;29575:19:0;;29516:33;29575:19;;;:6;:19;;;;;:26;29552:50;;:22;:50::i;:::-;-1:-1:-1;;;;;29648:19:0;;29613:32;29648:19;;;:6;:19;;;;;:33;;;29516:86;;-1:-1:-1;29695:53:0;;;29692:70;;-1:-1:-1;29758:1:0;;29369:473;-1:-1:-1;;;29369:473:0:o;29692:70::-;29779:55;:25;29809:24;29779:29;:55::i;:::-;29772:62;29369:473;-1:-1:-1;;;;29369:473:0:o;16388:128::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;16442:14:::1;:21:::0;;-1:-1:-1;;;;16442:21:0::1;-1:-1:-1::0;;;16442:21:0::1;::::0;;16493:15:::1;16474:16;:34:::0;16388:128::o;16839:131::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16930:19:0;;::::1;;::::0;;;:13:::1;:19;::::0;;;;:32;16839:131::o;14049:347::-;14143:10;14130:24;;;;:12;:24;;;;;;14120:34;;;14112:92;;;;-1:-1:-1;;;14112:92:0;;8611:2:1;14112:92:0;;;8593:21:1;8650:2;8630:18;;;8623:30;8689:34;8669:18;;;8662:62;-1:-1:-1;;;8740:18:1;;;8733:43;8793:19;;14112:92:0;8409:409:1;14112:92:0;14215:15;;:51;;-1:-1:-1;;;14215:51:0;;14247:10;14215:51;;;8997::1;9064:18;;;9057:34;;;-1:-1:-1;;;;;14215:15:0;;;;:31;;8970:18:1;;14215:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14317:10:0;14304:24;;;;:12;:24;;;;;;:36;;-1:-1:-1;14304:24:0;-1:-1:-1;14333:6:0;14304:28;:36::i;:::-;14290:10;14277:24;;;;:12;:24;;;;;:63;14365:11;;:23;;14381:6;14365:15;:23::i;:::-;14351:11;:37;-1:-1:-1;14049:347:0:o;17454:124::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17538:21:0;;;::::1;;::::0;;;:11:::1;:21;::::0;;;;:32;;-1:-1:-1;;17538:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;17454:124::o;30843:181::-;30896:23;30939:77;30990:25;;30939:46;30968:16;;30939:24;30957:4;30939:9;:24::i;:::-;:28;;:46::i;:77::-;30932:84;;30843:181;:::o;9511:103::-;-1:-1:-1;;;;;9594:18:0;9577:7;9594:18;;;:9;:18;;;;;;;9511:103::o;30499:336::-;30552:15;30569:17;30588:15;30605:20;30627:14;30661:24;30679:4;30661:9;:24::i;:::-;30687:77;30738:25;;30687:46;30716:16;;30687:24;30705:4;30687:9;:24::i;:77::-;30766:16;;30784:25;;30811:15;;30654:173;;;;;;;;;;30499:336;;;;;:::o;25055:120::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;25136:20:::1;:31:::0;25055:120::o;26826:86::-;26874:30;26893:10;26874:18;:30::i;:::-;26826:86::o;25511:108::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;25609:1:::1;25573:25;:38:::0;25511:108::o;13102:449::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;13186:13:::1;13202:43;13238:5;13202:23;13220:4;13202:13;9491:12:::0;;;9421:84;13202:13:::1;:17:::0;::::1;:23::i;:::-;:27:::0;::::1;:43::i;:::-;13186:59;;13256:17;13276:46;13315:5;13276:26;13294:7;13276:13;9491:12:::0;;;9421:84;13276:46:::1;13256:66;;13324:13;13340:30;13365:4;13340:20;13358:1;13340:13;9491:12:::0;;;9421:84;13340:30:::1;13324:46;;13398:5;13389;:14;;:36;;;;;13420:5;13407:9;:18;;13389:36;13381:102;;;::::0;-1:-1:-1;;;13381:102:0;;9304:2:1;13381:102:0::1;::::0;::::1;9286:21:1::0;9343:2;9323:18;;;9316:30;9382:34;9362:18;;;9355:62;-1:-1:-1;;;9433:18:1;;;9426:51;9494:19;;13381:102:0::1;9102:417:1::0;13381:102:0::1;-1:-1:-1::0;13494:12:0::1;:20:::0;;;;13516:15:::1;:27:::0;-1:-1:-1;;13102:449:0:o;24915:132::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;25003:36:::1;25032:6;25003:24;25020:6;25003:12;;:16;;:24;;;;:::i;:36::-;24987:13;:52:::0;-1:-1:-1;24915:132:0:o;25302:105::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;25372:18:::1;:27:::0;;;::::1;;-1:-1:-1::0;;;25372:27:0::1;-1:-1:-1::0;;;;25372:27:0;;::::1;::::0;;;::::1;::::0;;25302:105::o;10168:138::-;10227:7;10244:60;10282:21;10300:1;10282:9;:21::i;:::-;10244:33;10261:15;7461:42;10261:9;:15::i;:::-;10244:12;;;:16;:33::i;26395:107::-;26459:16;;26451:43;;-1:-1:-1;;;;;26459:16:0;;;;26451:43;;;;;26486:7;;26459:16;26451:43;26459:16;26451:43;26486:7;26459:16;26451:43;;;;;;;;;;;;;;;;;;;;;26395:107;:::o;16978:468::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;17130:18:::1;:31:::0;;-1:-1:-1;;;;;17130:31:0;;::::1;-1:-1:-1::0;;;;;;17130:31:0;;::::1;::::0;::::1;::::0;;;17163:18:::1;:31:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;17196:16:::1;:27:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;17225:14:::1;:23:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;17250:16:::1;:27:::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;17130:18:::1;17288:23:::0;;;:11:::1;:23;::::0;;;;;:30;;-1:-1:-1;;17288:30:0;;::::1;17130:31:::0;17288:30;;::::1;::::0;;;17320:23;;;;;;:30;;;::::1;::::0;::::1;::::0;;17352:21;;;;;;:28;;;::::1;::::0;::::1;::::0;;17382:19;;;;;;:26;;;::::1;::::0;::::1;::::0;;17410:21;;;;;:28;;;;::::1;::::0;;::::1;::::0;;16978:468::o;10037:125::-;-1:-1:-1;;;;;10139:20:0;;10100:7;10139:20;;;:12;:20;;;;;;;;;10117:9;:17;;;;;;:43;;:21;:43::i;9620:139::-;9698:4;9705:40;9715:10;9727:9;9738:6;9705:9;:40::i;13936:105::-;13998:35;14014:10;14026:6;13998:15;:35::i;:::-;13936:105;:::o;24606:94::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;24669:23:::1;:21;:23::i;25183:111::-:0;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;25258:19:::1;:28:::0;;-1:-1:-1;;25258:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25183:111::o;24708:199::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;24795:41:::1;::::0;-1:-1:-1;;;24795:41:0;;24830:4:::1;24795:41;::::0;::::1;4918:51:1::0;24777:15:0::1;::::0;-1:-1:-1;;;;;24795:26:0;::::1;::::0;::::1;::::0;4891:18:1;;24795:41:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24873:16;::::0;24847:52:::1;::::0;-1:-1:-1;;;24847:52:0;;-1:-1:-1;;;;;24873:16:0;;::::1;24847:52;::::0;::::1;8997:51:1::0;9064:18;;;9057:34;;;24777:59:0;;-1:-1:-1;24847:25:0;::::1;::::0;::::1;::::0;8970:18:1;;24847:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24766:141;24708:199:::0;:::o;17806:130::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;17892:36:::1;17921:6;17892:24;17909:6;17892:12;;:16;;:24;;;;:::i;:36::-;17877:12;:51:::0;-1:-1:-1;17806:130:0:o;27318:108::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;27395:23:::1;27414:3;27395:18;:23::i;17586:212::-:0;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;17696:15:::1;:24:::0;;;;17722:16:::1;:26:::0;17750:25:::1;:40:::0;17586:212::o;16524:307::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;16653:10:::1;:24:::0;;;16695:54:::1;16741:6;16695:33;16713:14:::0;16695:13:::1;9491:12:::0;;;9421:84;16695:54:::1;16679:13;:70:::0;16768:55:::1;16815:6;16768:34;16786:15:::0;16768:13:::1;9491:12:::0;;;9421:84;16768:55:::1;16751:14;:72:::0;-1:-1:-1;;;16524:307:0:o;22282:327::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22370:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;:33;;-1:-1:-1;;22370:33:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;22414:32:::1;;22425:19;22434:6;22442:1;22425:8;:19::i;:::-;-1:-1:-1::0;;;;;22459:21:0;::::1;22483:1;22459:21:::0;;;:13:::1;:21;::::0;;;;;:25;22456:146:::1;;-1:-1:-1::0;;;;;22525:21:0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;22486:62:::1;::::0;22495:6;;22503:44:::1;::::0;:17:::1;22495:6:::0;22503:9:::1;:17::i;:44::-;22486:8;:62::i;22456:146::-;22565:35;22574:6;22582:17;22592:6;22582:9;:17::i;2417:111::-:0;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;2483:5:::1;:11:::0;;-1:-1:-1;;;;;;2483:11:0::1;-1:-1:-1::0;;;;;2483:11:0;::::1;::::0;;::::1;::::0;;;2501:25:::1;::::0;4918:51:1;;;2501:25:0::1;::::0;4906:2:1;4891:18;2501:25:0::1;;;;;;;2417:111:::0;:::o;14726:157::-;2379:4;2404:5;-1:-1:-1;;;;;2404:5:0;2291:10;2393:16;2275:38;;;;-1:-1:-1;;;2275:38:0;;;;;;;:::i;:::-;14801:15:::1;:44:::0;;-1:-1:-1;;;;;14801:44:0;;::::1;-1:-1:-1::0;;;;;;14801:44:0;;::::1;::::0;::::1;::::0;;:15:::1;14847:21:::0;;;:11:::1;:21;::::0;;;;:28;;-1:-1:-1;;14847:28:0::1;14801:44:::0;14847:28:::1;::::0;;14726:157::o;14404:314::-;5959:7;:14;;-1:-1:-1;;5959:14:0;;;;;;14495:21:::1;14505:10;14495:9;:21::i;:::-;14527:15;::::0;:62:::1;::::0;-1:-1:-1;;;14527:62:0;;14566:10:::1;14527:62;::::0;::::1;10391:34:1::0;;;10441:18;;;10434:43;14472:44:0;;-1:-1:-1;;;;;;14527:15:0::1;::::0;:38:::1;::::0;10326:18:1;;14527:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;14600:18;14621:39;14647:12;14621:21;14631:10;14621:9;:21::i;:39::-;14600:60;;14671:39;14687:10;14699;14671:15;:39::i;:::-;-1:-1:-1::0;;5978:7:0;:15;;-1:-1:-1;;5978:15:0;;;14404:314::o;11257:335::-;-1:-1:-1;;;;;11350:19:0;;11342:68;;;;-1:-1:-1;;;11342:68:0;;10690:2:1;11342:68:0;;;10672:21:1;10729:2;10709:18;;;10702:30;10768:34;10748:18;;;10741:62;-1:-1:-1;;;10819:18:1;;;10812:34;10863:19;;11342:68:0;10488:400:1;11342:68:0;-1:-1:-1;;;;;11429:21:0;;11421:68;;;;-1:-1:-1;;;11421:68:0;;11095:2:1;11421:68:0;;;11077:21:1;11134:2;11114:18;;;11107:30;11173:34;11153:18;;;11146:62;-1:-1:-1;;;11224:18:1;;;11217:32;11266:19;;11421:68:0;10893:398:1;11421:68:0;-1:-1:-1;;;;;11500:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11552:32;;160:25:1;;;11552:32:0;;133:18:1;11552:32:0;;;;;;;11257:335;;;:::o;302:82::-;360:7;377:5;381:1;377;:5;:::i;11600:786::-;11689:37;11700:6;11708:9;11719:6;11689:10;:37::i;:::-;11737:38;11757:6;11765:9;11737:19;:38::i;:::-;11786:41;11801:6;11809:9;11820:6;11786:14;:41::i;:::-;11839:39;11852:6;11860:9;11871:6;11839:12;:39::i;:::-;11889:38;11909:6;11917:9;11889:19;:38::i;:::-;11938:43;11955:6;11963:9;11974:6;11938:16;:43::i;:::-;11992:35;12001:6;12009:9;12020:6;11992:8;:35::i;:::-;-1:-1:-1;;;;;12058:17:0;;;;;;:9;:17;;;;;;:29;;12080:6;12058:21;:29::i;:::-;-1:-1:-1;;;;;12038:17:0;;;;;;:9;:17;;;;;:49;;;;12123:32;12048:6;12145:9;12123:13;:32::i;:::-;:78;;12195:6;12123:78;;;12158:34;12166:6;12174:9;12185:6;12158:7;:34::i;:::-;-1:-1:-1;;;;;12235:20:0;;;;;;:9;:20;;;;;;12098:103;;-1:-1:-1;12235:40:0;;12098:103;12235:24;:40::i;:::-;-1:-1:-1;;;;;12212:20:0;;;;;;;:9;:20;;;;;;;:63;;;;12291:43;;;;;;;;;;12319:14;160:25:1;;148:2;133:18;;14:177;12291:43:0;;;;;;;;12345:33;12360:6;12368:9;12345:14;:33::i;:::-;11678:708;11600:786;;;:::o;656:162::-;742:7;788:12;780:6;;;;772:29;;;;-1:-1:-1;;;772:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;810:5:0;;;656:162::o;29850:170::-;29920:7;29947:65;29980:31;;29947:28;29957:17;;29947:5;:9;;:28;;;;:::i;28415:946::-;28484:14;28501:30;28519:11;28501:17;:30::i;:::-;-1:-1:-1;;;;;28545:19:0;;;;;;:6;:19;;;;;:26;28484:47;;-1:-1:-1;28545:31:0;;:68;;;28589:24;28607:4;28589:9;:24::i;:::-;28580:6;:33;28545:68;28542:83;;;28616:7;28415:946;:::o;28542:83::-;28638:19;;28635:719;;28692:16;;:28;;28713:6;28692:20;:28::i;:::-;28673:16;:47;;;28797:15;;28786:27;;;;:10;:27;;;;;;:48;;;:60;;28839:6;28786:52;:60::i;:::-;28746:15;;28735:27;;;;:10;:27;;;;;:48;;:111;28861:50;28884:4;28891:11;28904:6;28861:14;:50::i;:::-;-1:-1:-1;28940:15:0;;28926:30;;;;:13;:30;;;;;;;;-1:-1:-1;;;;;28926:43:0;;;;;;;;;:52;;;28993:17;:30;;;;;29026:15;28993:48;;29092:6;:19;;;;;:33;;;:45;;28972:6;29092:37;:45::i;:::-;-1:-1:-1;;;;;29056:19:0;;;;;;:6;:19;;;;;:33;;;:81;;;;29211:26;29188:50;;:22;:50::i;:::-;-1:-1:-1;;;;;29152:19:0;;;;;;:6;:19;;;;;;;;:33;;:86;;;;29253:13;:26;;;;;:39;29307:45;29159:11;29329:22;29159:11;29329:9;:22::i;390:82::-;448:7;465:5;469:1;465;:5;:::i;478:82::-;536:7;553:5;557:1;553;:5;:::i;13559:369::-;-1:-1:-1;;;;;13676:20:0;;;;;;:12;:20;;;;;;;;;13654:9;:17;;;;;;;:43;;:21;:43::i;:::-;13644:6;:53;;13636:113;;;;-1:-1:-1;;;13636:113:0;;12158:2:1;13636:113:0;;;12140:21:1;12197:2;12177:18;;;12170:30;12236:34;12216:18;;;12209:62;-1:-1:-1;;;12287:18:1;;;12280:45;12342:19;;13636:113:0;11956:411:1;13636:113:0;13760:15;;:46;;-1:-1:-1;;;13760:46:0;;-1:-1:-1;;;;;9015:32:1;;;13760:46:0;;;8997:51:1;9064:18;;;9057:34;;;13760:15:0;;;;:30;;8970:18:1;;13760:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;13840:20:0;;;;;;:12;:20;;;;;;:32;;-1:-1:-1;13865:6:0;13840:24;:32::i;:::-;-1:-1:-1;;;;;13817:20:0;;;;;;:12;:20;;;;;:55;13897:11;;:23;;13913:6;13897:15;:23::i;:::-;13883:11;:37;-1:-1:-1;;13559:369:0:o;23783:815::-;23840:23;:30;;-1:-1:-1;;23840:30:0;23866:4;23840:30;;;;;;23927:15;;;23896;;;23840:23;23885:27;;;:10;:27;;;;;:39;;:57;;;;23957:28;;24018:15;:31;;:19;:31::i;:::-;24000:15;:49;;;24104:18;;24064:27;;;;:10;:27;;;;;;:37;;:58;;;;24184:16;;;24148:15;;24137:27;;;;;:63;24226:15;;24215:27;;;;;24260:15;24215:42;;;;:60;24312:13;;24293:16;;:32;24290:71;;;24346:13;;24327:16;:32;24290:71;24375:32;24390:16;;24375:14;:32::i;:::-;24449:1;24422:16;:29;;;24466:18;:31;24531:15;24512:16;:34;24580:9;;24561:29;;27434:973;27519:16;;27573:12;:19;;27603:46;;27640:7;;27434:973;:::o;27603:46::-;27659:15;27698;27716:9;27698:27;;27736:18;27778:397;27794:3;27784:7;:13;:46;;;;;27814:16;27801:10;:29;27784:46;27778:397;;;27866:16;27850:12;;:32;27847:82;;27925:1;27902:12;:25;27847:82;27947:46;27966:12;27979;;27966:26;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;27966:26:0;27947:18;:46::i;:::-;28018:35;28030:22;28042:9;28030:7;;:11;:22::i;:::-;28018:7;;:11;:35::i;:::-;28008:45;;28078:9;28102:12;:14;;28068:19;;-1:-1:-1;28102:12:0;:14;;;:::i;:::-;;;;;;28131:12;;;;;:::i;:::-;28158:13;:15;;28131:12;;-1:-1:-1;28158:15:0;;-1:-1:-1;28158:13:0;:15;;;:::i;:::-;;;;;;27778:397;;;28205:16;28188:13;;:33;;:69;;;;;28244:13;28225:16;;:32;28188:69;28185:215;;;28273:23;:31;;-1:-1:-1;;28273:31:0;;;28299:5;28319:25;:38;;;28372:13;:26;28185:215;27484:923;;;;;27434:973;:::o;25627:482::-;25714:1;25705:6;:10;:45;;;;-1:-1:-1;;;;;;25719:19:0;;;;;;:6;:19;;;;;:26;:31;25705:45;25702:177;;;30127:12;:19;;-1:-1:-1;;;;;30093:31:0;;;;;;:18;:31;;;;;:53;;;30157:30;;;;;;;;;;;;;-1:-1:-1;;;;;;30157:30:0;;;;;;25702:177;;;25799:11;;:45;;;;-1:-1:-1;;;;;;25814:19:0;;25843:1;25814:19;;;:6;:19;;;;;:26;:30;;25799:45;25796:83;;;25846:30;25864:11;25846:17;:30::i;:::-;-1:-1:-1;;;;;25919:19:0;;;;;;:6;:19;;;;;:26;25903:11;;:55;;25951:6;;25903:43;;:15;:43::i;:::-;:47;;:55::i;:::-;25889:11;:69;-1:-1:-1;;;;;25969:19:0;;;;;;:6;:19;;;;;:35;;;26051:50;25998:6;26051:22;:50::i;:::-;-1:-1:-1;;;;;26015:19:0;;;;;;;:6;:19;;;;;:33;;:86;;;;-1:-1:-1;25627:482:0:o;10314:355::-;-1:-1:-1;;;;;10418:20:0;;10410:70;;;;-1:-1:-1;;;10410:70:0;;12846:2:1;10410:70:0;;;12828:21:1;12885:2;12865:18;;;12858:30;12924:34;12904:18;;;12897:62;-1:-1:-1;;;12975:18:1;;;12968:35;13020:19;;10410:70:0;12644:401:1;10410:70:0;-1:-1:-1;;;;;10499:23:0;;10491:71;;;;-1:-1:-1;;;10491:71:0;;13252:2:1;10491:71:0;;;13234:21:1;13291:2;13271:18;;;13264:30;13330:34;13310:18;;;13303:62;-1:-1:-1;;;13381:18:1;;;13374:33;13424:19;;10491:71:0;13050:399:1;10491:71:0;10591:17;10601:6;10591:9;:17::i;:::-;10581:6;:27;;10573:88;;;;-1:-1:-1;;;10573:88:0;;13656:2:1;10573:88:0;;;13638:21:1;13695:2;13675:18;;;13668:30;13734:34;13714:18;;;13707:62;-1:-1:-1;;;13785:18:1;;;13778:47;13842:19;;10573:88:0;13454:413:1;14891:191:0;-1:-1:-1;;;;;14984:19:0;;;;;;:11;:19;;;;;;;;14983:20;:47;;;;-1:-1:-1;;;;;;15008:22:0;;;;;;:11;:22;;;;;;;;15007:23;14983:47;14980:95;;;15040:14;;-1:-1:-1;;;15040:14:0;;;;15032:41;;;;-1:-1:-1;;;15032:41:0;;14074:2:1;15032:41:0;;;14056:21:1;14113:2;14093:18;;;14086:30;-1:-1:-1;;;14132:18:1;;;14125:44;14186:18;;15032:41:0;13872:338:1;15094:331:0;-1:-1:-1;;;;;15198:19:0;;;;;;:11;:19;;;;;;;;15197:20;:47;;;;-1:-1:-1;;;;;;15222:22:0;;;;;;:11;:22;;;;;;;;15221:23;15197:47;:77;;;;-1:-1:-1;15269:4:0;;-1:-1:-1;;;;;15248:26:0;;;15269:4;;15248:26;;15197:77;:107;;;;-1:-1:-1;;;;;;15278:26:0;;7461:42;15278:26;;15197:107;15194:224;;;15366:15;;-1:-1:-1;;;;;15329:20:0;;;;;;:9;:20;;;;;;:32;;15354:6;15329:24;:32::i;:::-;15328:53;;15320:96;;;;-1:-1:-1;;;15320:96:0;;14417:2:1;15320:96:0;;;14399:21:1;14456:2;14436:18;;;14429:30;14495:32;14475:18;;;14468:60;14545:18;;15320:96:0;14215:354:1;16003:377:0;-1:-1:-1;;;;;16104:20:0;;16135:1;16104:20;;;:12;:20;;;;;;:33;16101:160;;16185:17;16195:6;16185:9;:17::i;:::-;-1:-1:-1;;;;;16159:20:0;;;;;;:12;:20;;;;;;16148:32;;:6;;:10;:32::i;:::-;16147:55;;16139:120;;;;-1:-1:-1;;;16139:120:0;;14776:2:1;16139:120:0;;;14758:21:1;14815:2;14795:18;;;14788:30;14854:34;14834:18;;;14827:62;-1:-1:-1;;;14905:18:1;;;14898:50;14965:19;;16139:120:0;14574:416:1;16139:120:0;16289:12;;16279:6;:22;;:45;;;-1:-1:-1;;;;;;16305:19:0;;;;;;:11;:19;;;;;;;;16279:45;:71;;;-1:-1:-1;;;;;;16328:22:0;;;;;;:11;:22;;;;;;;;16279:71;16271:101;;;;-1:-1:-1;;;16271:101:0;;15197:2:1;16271:101:0;;;15179:21:1;15236:2;15216:18;;;15209:30;-1:-1:-1;;;15255:18:1;;;15248:47;15312:18;;16271:101:0;14995:341:1;15433:175:0;15533:4;;-1:-1:-1;;;;;15520:17:0;;;15533:4;;15520:17;:41;;;;-1:-1:-1;;;;;;15542:19:0;;;;;;:11;:19;;;;;;;;15541:20;15520:41;:54;;;;-1:-1:-1;15566:8:0;;;;15565:9;15520:54;15517:84;;;15597:1;15576:9;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;15433:175:0;;:::o;15616:379::-;15726:4;;-1:-1:-1;;;;;15716:14:0;;;15726:4;;15716:14;:40;;;;;15744:12;;15734:6;:22;;15716:40;15713:114;;;-1:-1:-1;;;;;15785:24:0;;;;;;:13;:24;;;;;;:40;;15822:1;15785:28;:40::i;:::-;-1:-1:-1;;;;;15758:24:0;;;;;;:13;:24;;;;;:67;15713:114;15850:4;;-1:-1:-1;;;;;15840:14:0;;;15850:4;;15840:14;:39;;;;;15867:12;;15858:6;:21;15840:39;15837:83;;;-1:-1:-1;;;;;15881:24:0;;;;;;:13;:24;;;;;15916:1;15881:37;;15837:83;15946:4;;-1:-1:-1;;;;;15946:4:0;;;15933:17;;;;15930:58;;-1:-1:-1;;;;;;;15952:21:0;15984:1;15952:21;;;:13;:21;;;;;:34;15616:379::o;20524:197::-;20616:41;20631:6;20639:9;20650:6;20616:14;:41::i;:::-;20613:101;;;20659:29;20674:13;;20659:14;:29::i;:::-;20710:1;20690:9;:22;20524:197;;;:::o;20729:160::-;-1:-1:-1;;;;;20835:19:0;;20810:4;20835:19;;;:11;:19;;;;;;;;20834:20;:47;;;;-1:-1:-1;;;;;;;20859:22:0;;;;;:11;:22;;;;;;;;20858:23;;20729:160;-1:-1:-1;20729:160:0:o;21173:1101::-;21259:7;21315:1;21282:30;21294:6;21302:9;21282:11;:30::i;:::-;:34;:47;;;;-1:-1:-1;21321:8:0;;;;21320:9;21282:47;21279:973;;;21341:17;21361:59;21389:30;21401:6;21409:9;21389:11;:30::i;:::-;21372:11;;21361:23;;:6;;:10;:23::i;:59::-;21476:4;21458:24;;;;:9;:24;;;;;;21341:79;;-1:-1:-1;21458:39:0;;21341:79;21458:28;:39::i;:::-;21449:4;21431:24;;;;:9;:24;;;;;;;:66;;;;21513:42;;-1:-1:-1;;;;;21513:42:0;;;;;;;21545:9;160:25:1;;148:2;133:18;;14:177;21513:42:0;;;;;;;;21593:1;21569:13;;:26;:77;;;;;21616:30;21628:6;21636:9;21616:11;:30::i;:::-;21599:13;;:47;;21569:77;21566:287;;;21681:66;21703:42;21731:13;;21703:23;21714:11;;21703:6;:10;;:23;;;;:::i;:42::-;21681:16;;;:20;:66::i;:::-;21662:16;:85;21835:13;;21818:11;;21783:68;;21807:42;;:23;;:6;;:10;:23::i;:42::-;21783:18;;;:22;:68::i;:::-;21762:18;:89;21566:287;21884:1;21866:7;;:20;:65;;;;;21901:30;21913:6;21921:9;21901:11;:30::i;:::-;21890:7;;:41;;21866:65;21863:163;;;21947:77;21965:4;7461:42;21987:36;22015:7;;21987:23;21998:11;;21987:6;:10;;:23;;;;:::i;:36::-;21947:9;:77::i;:::-;22058:1;22039:8;;:21;:67;;;;;22076:30;22088:6;22096:9;22076:11;:30::i;:::-;22064:8;;:42;;22039:67;22036:176;;;22155:14;;22200:8;;22183:11;;22122:88;;22140:4;;-1:-1:-1;;;;;22155:14:0;;;;22172:37;;22200:8;22172:23;;:6;;:10;:23::i;22122:88::-;22229:21;:6;22240:9;22229:10;:21::i;:::-;22222:28;;;;;21279:973;-1:-1:-1;22260:6:0;21173:1101;-1:-1:-1;;21173:1101:0:o;214:82::-;272:7;289:5;293:1;289;:5;:::i;22617:1158::-;22699:19;;;;22696:64;;;22756:1;22720:25;:38;22696:64;-1:-1:-1;;;;;22773:17:0;;22808:1;22773:17;;;:6;:17;;;;;:24;:37;22770:73;;22812:29;22831:9;22812:18;:29::i;:::-;-1:-1:-1;;;;;22856:14:0;;22888:1;22856:14;;;:6;:14;;;;;:21;:34;;;;:55;;-1:-1:-1;22907:4:0;;-1:-1:-1;;;;;22894:17:0;;;22907:4;;22894:17;;22856:55;22853:88;;;22913:26;22932:6;22913:18;:26::i;:::-;22967:4;;-1:-1:-1;;;;;22954:17:0;;;22967:4;;22954:17;:55;;;;-1:-1:-1;;;;;;22975:14:0;;23007:1;22975:14;;;:6;:14;;;;;:21;:34;;22954:55;22951:126;;;23029:46;23049:25;23067:6;23049:17;:25::i;:::-;23029:15;;;:19;:46::i;:::-;23011:15;:64;22951:126;-1:-1:-1;;;;;23091:24:0;;;;;;:16;:24;;;;;;;;23087:67;;23117:35;23126:6;23134:17;23144:6;23134:9;:17::i;23117:35::-;-1:-1:-1;;;;;23168:27:0;;;;;;:16;:27;;;;;;;;23164:76;;23197:41;23206:9;23217:20;23227:9;23217;:20::i;23197:41::-;-1:-1:-1;;;;;23254:27:0;;;;;;:16;:27;;;;;;;;23253:28;:46;;;;-1:-1:-1;23295:4:0;;-1:-1:-1;;;;;23285:14:0;;;23295:4;;23285:14;23253:46;:88;;;;-1:-1:-1;;;;;;23303:24:0;;;;;;:13;:24;;;;;;23339:1;-1:-1:-1;23303:38:0;23253:88;23250:180;;;-1:-1:-1;;;;;23402:24:0;;;;;;:13;:24;;;;;;23357:71;;23366:9;;23377:50;;:20;23366:9;23377;:20::i;23357:71::-;23489:15;23443:42;23464:20;;23443:16;;:20;;:42;;;;:::i;:::-;:61;;:79;;;;-1:-1:-1;23508:14:0;;-1:-1:-1;;;23508:14:0;;;;23443:79;:126;;;;;23567:1;23540:16;;:29;23443:126;:139;;;;-1:-1:-1;23574:8:0;;;;23573:9;23443:139;:161;;;;-1:-1:-1;23586:18:0;;-1:-1:-1;;;23586:18:0;;;;23443:161;23440:205;;;23620:23;:21;:23::i;:::-;23655:29;23674:9;;23655:18;:29::i;:::-;-1:-1:-1;;;;;23698:17:0;;23733:1;23698:17;;;:6;:17;;;;;:24;:37;23695:73;;23737:29;23756:9;23737:18;:29::i;10994:255::-;-1:-1:-1;;;;;11124:17:0;;11087:4;11124:17;;;:9;:17;;;;;;:29;;11146:6;11124:21;:29::i;:::-;-1:-1:-1;;;;;11104:17:0;;;;;;;:9;:17;;;;;;:49;;;;11187:20;;;;;;;:32;;11212:6;11187:24;:32::i;:::-;-1:-1:-1;;;;;11164:20:0;;;;;;:9;:20;;;;;:55;-1:-1:-1;11237:4:0;10994:255;;;;;:::o;26117:270::-;26194:14;;:26;;26213:6;26194:18;:26::i;:::-;26177:14;:43;26321:11;;26273:31;;26251:83;;26273:60;;:43;;26309:6;26273:35;:43::i;:60::-;26251:17;;;:21;:83::i;:::-;26231:17;:103;26345:25;:34;26117:270::o;30203:288::-;30319:12;30332:19;;:21;;30352:1;;30332:21;:::i;:::-;30319:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30284:31:0;;;;;:18;:31;;;;;;;;30271:12;:45;;30319:35;;;;;30271:12;:45;;;;;;:::i;:::-;;;;;;;;;;;;;:83;;-1:-1:-1;;;;;;30271:83:0;-1:-1:-1;;;;;30271:83:0;;;;;;30423:31;;;;;:18;:31;;;;;;;;30384:12;30397:19;;30423:31;;:18;30271:45;30397:21;;-1:-1:-1;;30397:21:0;:::i;:::-;30384:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30384:35:0;30365:55;;;;;;;;;;;;:89;30465:12;:18;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;30465:18:0;;;;;-1:-1:-1;;;;;;30465:18:0;;;;;;-1:-1:-1;30203:288:0:o;20105:411::-;20203:4;20220:13;20246:14;;20236:6;:24;;20220:40;;20271:19;20319:13;;20293:22;:20;:22::i;:::-;20351:8;;20293:39;-1:-1:-1;20293:39:0;;-1:-1:-1;20351:8:0;;20350:9;:24;;;;-1:-1:-1;20363:11:0;;-1:-1:-1;;;20363:11:0;;;;20350:24;:42;;;;-1:-1:-1;20378:14:0;;-1:-1:-1;;;20378:14:0;;;;20350:42;:54;;;;;20396:8;20350:54;:78;;;;-1:-1:-1;;;;;;20409:19:0;;;;;;:11;:19;;;;;;;;20408:20;20350:78;:113;;;;-1:-1:-1;20459:4:0;;-1:-1:-1;;;;;20446:17:0;;;20459:4;;20446:17;20350:113;:140;;;;;20480:10;;20467:9;;:23;;20350:140;:158;;;;;20494:14;20350:158;20343:165;20105:411;-1:-1:-1;;;;;;20105:411:0:o;17944:1343::-;6023:8;:15;;-1:-1:-1;;6023:15:0;6034:4;6023:15;;;;;;18038:8:::1;::::0;6023;;18038:22:::1;::::0;18058:1:::1;::::0;18038:15:::1;::::0;:8;:12:::1;:15::i;:22::-;18074:8;::::0;18015:45;;-1:-1:-1;18071:135:0::1;;18113:91;18202:1;18113:84;18195:1;18113:77;18175:14;;18113:57;18162:7;;18113:44;18144:12;;18113;;:16;;:44;;;;:::i;:91::-;18098:106;;18071:135;18216:32;18251:42;18280:12;18251:24;18262:12;;18251:6;:10;;:24;;;;:::i;:42::-;18216:77:::0;-1:-1:-1;18304:14:0::1;18321:36;:6:::0;18216:77;18321:10:::1;:36::i;:::-;18304:53:::0;-1:-1:-1;18393:21:0::1;18425:24;18304:53:::0;18425:16:::1;:24::i;:::-;18460:20;18483:41;:21;18509:14:::0;18483:25:::1;:41::i;:::-;18460:64;;18535:19;18556:48;18573:30;18590:12;;18573;:16;;:30;;;;:::i;:::-;18556:12:::0;;:16:::1;:48::i;:::-;18535:69;;18615:29;18647;18663:12;;18647:11;:15;;:29;;;;:::i;:::-;18615:61:::0;-1:-1:-1;18690:34:0;;18687:137:::1;;18802:18;::::0;18726:95:::1;::::0;18753:24;;18779:21;;-1:-1:-1;;;;;18802:18:0::1;18726:12;:95::i;:::-;18881:7;::::0;18834:21:::1;::::0;18858:31:::1;::::0;:18:::1;:11:::0;18874:1:::1;18858:15;:18::i;:31::-;18834:55:::0;-1:-1:-1;18903:17:0;;18900:73:::1;;18930:16;::::0;18922:49:::1;::::0;-1:-1:-1;;;;;18930:16:0;;::::1;::::0;18922:49;::::1;;;::::0;18957:13;;18930:16:::1;18922:49:::0;18930:16;18922:49;18957:13;18930:16;18922:49;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;18900:73;19032:12;::::0;18983:23:::1;::::0;19009:36:::1;::::0;:18:::1;:11:::0;19025:1:::1;19009:15;:18::i;:36::-;18983:62:::0;-1:-1:-1;19059:19:0;;19056:79:::1;;19088:18;::::0;19080:53:::1;::::0;-1:-1:-1;;;;;19088:18:0;;::::1;::::0;19080:53;::::1;;;::::0;19117:15;;19088:18:::1;19080:53:::0;19088:18;19080:53;19117:15;19088:18;19080:53;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;19056:79;19168:21;19203:25:::0;;19200:80:::1;;19238:16;::::0;19230:48:::1;::::0;-1:-1:-1;;;;;19238:16:0;;::::1;::::0;19230:48;::::1;;;::::0;19265:12;;19238:16:::1;19230:48:::0;19238:16;19230:48;19265:12;19238:16;19230:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;19200:80;-1:-1:-1::0;;6043:8:0;:16;;-1:-1:-1;;6043:16:0;;;-1:-1:-1;;;;;;;;;17944:1343:0:o;20897:268::-;21012:4;;20976:7;;-1:-1:-1;;;;;20999:17:0;;;21012:4;;20999:17;:41;;;;;21038:1;21020:7;;:20;20999:41;20996:62;;;-1:-1:-1;21049:7:0;;21042:14;;20996:62;21081:4;;-1:-1:-1;;;;;21071:14:0;;;21081:4;;21071:14;:39;;;;;21108:1;21089:8;;:21;21071:39;21068:61;;;-1:-1:-1;21119:8:0;;21112:15;;21068:61;-1:-1:-1;21146:11:0;;20897:268;;;;:::o;19663:434::-;19753:16;;;19767:1;19753:16;;;;;;;;19729:21;;19753:16;;;;;;;;;;-1:-1:-1;19753:16:0;19729:40;;19798:4;19780;19785:1;19780:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19780:23:0;;;:7;;;;;;;;;;:23;;;;19824:6;;:13;;;-1:-1:-1;;;19824:13:0;;;;:6;;;;;:11;;:13;;;;;19780:7;;19824:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19814:4;19819:1;19814:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19814:23:0;;;:7;;;;;;;;;:23;19880:6;;19848:53;;19865:4;;19880:6;19889:11;19848:8;:53::i;:::-;19912:6;;:177;;-1:-1:-1;;;19912:177:0;;-1:-1:-1;;;;;19912:6:0;;;;:57;;:177;;19984:11;;19912:6;;20026:4;;20053;;20073:15;;19912:177;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19295:360;19426:6;;19394:53;;19411:4;;-1:-1:-1;;;;;19426:6:0;19435:11;19394:8;:53::i;:::-;19458:6;;:189;;-1:-1:-1;;;19458:189:0;;19521:4;19458:189;;;17317:34:1;17367:18;;;17360:34;;;19458:6:0;17410:18:1;;;17403:34;;;17453:18;;;17446:34;-1:-1:-1;;;;;17517:15:1;;;17496:19;;;17489:44;19631:15:0;17549:19:1;;;17542:35;19458:6:0;;;;:22;;19488:9;;17251:19:1;;19458:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:180::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;-1:-1:-1;1548:23:1;;1397:180;-1:-1:-1;1397:180:1:o;1582:799::-;1722:6;1730;1738;1746;1754;1762;1770;1778;1786;1794;1847:3;1835:9;1826:7;1822:23;1818:33;1815:53;;;1864:1;1861;1854:12;1815:53;-1:-1:-1;;1887:23:1;;;1957:2;1942:18;;1929:32;;-1:-1:-1;2008:2:1;1993:18;;1980:32;;2059:2;2044:18;;2031:32;;-1:-1:-1;2110:3:1;2095:19;;2082:33;;-1:-1:-1;2162:3:1;2147:19;;2134:33;;-1:-1:-1;2214:3:1;2199:19;;2186:33;;-1:-1:-1;2266:3:1;2251:19;;2238:33;;-1:-1:-1;2318:3:1;2303:19;;2290:33;;-1:-1:-1;2370:3:1;2355:19;2342:33;;-1:-1:-1;1582:799:1;-1:-1:-1;1582:799:1:o;3107:456::-;3184:6;3192;3200;3253:2;3241:9;3232:7;3228:23;3224:32;3221:52;;;3269:1;3266;3259:12;3221:52;3308:9;3295:23;3327:31;3352:5;3327:31;:::i;:::-;3377:5;-1:-1:-1;3434:2:1;3419:18;;3406:32;3447:33;3406:32;3447:33;:::i;:::-;3107:456;;3499:7;;-1:-1:-1;;;3553:2:1;3538:18;;;;3525:32;;3107:456::o;3568:247::-;3627:6;3680:2;3668:9;3659:7;3655:23;3651:32;3648:52;;;3696:1;3693;3686:12;3648:52;3735:9;3722:23;3754:31;3779:5;3754:31;:::i;4009:118::-;4095:5;4088:13;4081:21;4074:5;4071:32;4061:60;;4117:1;4114;4107:12;4132:382;4197:6;4205;4258:2;4246:9;4237:7;4233:23;4229:32;4226:52;;;4274:1;4271;4264:12;4226:52;4313:9;4300:23;4332:31;4357:5;4332:31;:::i;:::-;4382:5;-1:-1:-1;4439:2:1;4424:18;;4411:32;4452:30;4411:32;4452:30;:::i;:::-;4501:7;4491:17;;;4132:382;;;;;:::o;4519:248::-;4587:6;4595;4648:2;4636:9;4627:7;4623:23;4619:32;4616:52;;;4664:1;4661;4654:12;4616:52;-1:-1:-1;;4687:23:1;;;4757:2;4742:18;;;4729:32;;-1:-1:-1;4519:248:1:o;4980:241::-;5036:6;5089:2;5077:9;5068:7;5064:23;5060:32;5057:52;;;5105:1;5102;5095:12;5057:52;5144:9;5131:23;5163:28;5185:5;5163:28;:::i;5226:813::-;5321:6;5329;5337;5345;5353;5406:3;5394:9;5385:7;5381:23;5377:33;5374:53;;;5423:1;5420;5413:12;5374:53;5462:9;5449:23;5481:31;5506:5;5481:31;:::i;:::-;5531:5;-1:-1:-1;5588:2:1;5573:18;;5560:32;5601:33;5560:32;5601:33;:::i;:::-;5653:7;-1:-1:-1;5712:2:1;5697:18;;5684:32;5725:33;5684:32;5725:33;:::i;:::-;5777:7;-1:-1:-1;5836:2:1;5821:18;;5808:32;5849:33;5808:32;5849:33;:::i;:::-;5901:7;-1:-1:-1;5960:3:1;5945:19;;5932:33;5974;5932;5974;:::i;:::-;6026:7;6016:17;;;5226:813;;;;;;;;:::o;6368:388::-;6436:6;6444;6497:2;6485:9;6476:7;6472:23;6468:32;6465:52;;;6513:1;6510;6503:12;6465:52;6552:9;6539:23;6571:31;6596:5;6571:31;:::i;:::-;6621:5;-1:-1:-1;6678:2:1;6663:18;;6650:32;6691:33;6650:32;6691:33;:::i;6761:316::-;6838:6;6846;6854;6907:2;6895:9;6886:7;6882:23;6878:32;6875:52;;;6923:1;6920;6913:12;6875:52;-1:-1:-1;;6946:23:1;;;7016:2;7001:18;;6988:32;;-1:-1:-1;7067:2:1;7052:18;;;7039:32;;6761:316;-1:-1:-1;6761:316:1:o;7082:315::-;7150:6;7158;7211:2;7199:9;7190:7;7186:23;7182:32;7179:52;;;7227:1;7224;7217:12;7179:52;7263:9;7250:23;7240:33;;7323:2;7312:9;7308:18;7295:32;7336:31;7361:5;7336:31;:::i;7662:329::-;7864:2;7846:21;;;7903:1;7883:18;;;7876:29;-1:-1:-1;;;7936:2:1;7921:18;;7914:36;7982:2;7967:18;;7662:329::o;9524:184::-;9594:6;9647:2;9635:9;9626:7;9622:23;9618:32;9615:52;;;9663:1;9660;9653:12;9615:52;-1:-1:-1;9686:16:1;;9524:184;-1:-1:-1;9524:184:1:o;9713:245::-;9780:6;9833:2;9821:9;9812:7;9808:23;9804:32;9801:52;;;9849:1;9846;9839:12;9801:52;9881:9;9875:16;9900:28;9922:5;9900:28;:::i;11296:127::-;11357:10;11352:3;11348:20;11345:1;11338:31;11388:4;11385:1;11378:15;11412:4;11409:1;11402:15;11428:128;11495:9;;;11516:11;;;11513:37;;;11530:18;;:::i;11561:168::-;11634:9;;;11665;;11682:15;;;11676:22;;11662:37;11652:71;;11703:18;;:::i;11734:217::-;11774:1;11800;11790:132;;11844:10;11839:3;11835:20;11832:1;11825:31;11879:4;11876:1;11869:15;11907:4;11904:1;11897:15;11790:132;-1:-1:-1;11936:9:1;;11734:217::o;12372:127::-;12433:10;12428:3;12424:20;12421:1;12414:31;12464:4;12461:1;12454:15;12488:4;12485:1;12478:15;12504:135;12543:3;12564:17;;;12561:43;;12584:18;;:::i;:::-;-1:-1:-1;12631:1:1;12620:13;;12504:135::o;15341:125::-;15406:9;;;15427:10;;;15424:36;;;15440:18;;:::i;15471:127::-;15532:10;15527:3;15523:20;15520:1;15513:31;15563:4;15560:1;15553:15;15587:4;15584:1;15577:15;15735:251;15805:6;15858:2;15846:9;15837:7;15833:23;15829:32;15826:52;;;15874:1;15871;15864:12;15826:52;15906:9;15900:16;15925:31;15950:5;15925:31;:::i;15991:980::-;16253:4;16301:3;16290:9;16286:19;16332:6;16321:9;16314:25;16358:2;16396:6;16391:2;16380:9;16376:18;16369:34;16439:3;16434:2;16423:9;16419:18;16412:31;16463:6;16498;16492:13;16529:6;16521;16514:22;16567:3;16556:9;16552:19;16545:26;;16606:2;16598:6;16594:15;16580:29;;16627:1;16637:195;16651:6;16648:1;16645:13;16637:195;;;16716:13;;-1:-1:-1;;;;;16712:39:1;16700:52;;16807:15;;;;16772:12;;;;16748:1;16666:9;16637:195;;;-1:-1:-1;;;;;;;16888:32:1;;;;16883:2;16868:18;;16861:60;-1:-1:-1;;;16952:3:1;16937:19;16930:35;16849:3;15991:980;-1:-1:-1;;;15991:980:1:o;17588:306::-;17676:6;17684;17692;17745:2;17733:9;17724:7;17720:23;17716:32;17713:52;;;17761:1;17758;17751:12;17713:52;17790:9;17784:16;17774:26;;17840:2;17829:9;17825:18;17819:25;17809:35;;17884:2;17873:9;17869:18;17863:25;17853:35;;17588:306;;;;;:::o

Swarm Source

ipfs://bf0bee966b55d73f9237f53a9d3ea98898e80a6c0c586126b7d4d73b0bc2f345
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.