BNB Price: $614.38 (-0.08%)
 

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Approve925584592026-04-14 21:28:371 hr ago1776202117IN
0xa573513C...d5B914444
0 BNB0.000001580.065
Approve924318242026-04-14 5:37:3817 hrs ago1776145058IN
0xa573513C...d5B914444
0 BNB0.000009260.2
Approve922749352026-04-13 9:59:2737 hrs ago1776074367IN
0xa573513C...d5B914444
0 BNB0.000003030.065
Transfer922748532026-04-13 9:58:5037 hrs ago1776074330IN
0xa573513C...d5B914444
0 BNB0.000003990.06565
Approve921114752026-04-12 13:31:072 days ago1776000667IN
0xa573513C...d5B914444
0 BNB0.000003050.06565
Approve920895112026-04-12 10:46:002 days ago1775990760IN
0xa573513C...d5B914444
0 BNB0.000001590.06565
Approve919609122026-04-11 18:40:303 days ago1775932830IN
0xa573513C...d5B914444
0 BNB0.000001570.065
Approve919512182026-04-11 17:27:443 days ago1775928464IN
0xa573513C...d5B914444
0 BNB0.000002430.1
Approve919271592026-04-11 14:26:493 days ago1775917609IN
0xa573513C...d5B914444
0 BNB0.000001720.06565
Approve919261092026-04-11 14:18:563 days ago1775917136IN
0xa573513C...d5B914444
0 BNB0.000001720.06565
Approve919260742026-04-11 14:18:413 days ago1775917121IN
0xa573513C...d5B914444
0 BNB0.000001590.06565
Approve919245062026-04-11 14:06:543 days ago1775916414IN
0xa573513C...d5B914444
0 BNB0.000001720.06565
Approve919244812026-04-11 14:06:433 days ago1775916403IN
0xa573513C...d5B914444
0 BNB0.000001720.06565
Approve919244552026-04-11 14:06:313 days ago1775916391IN
0xa573513C...d5B914444
0 BNB0.000001720.06565
Approve919244272026-04-11 14:06:193 days ago1775916379IN
0xa573513C...d5B914444
0 BNB0.000001590.06565
Approve918751812026-04-11 7:56:343 days ago1775894194IN
0xa573513C...d5B914444
0 BNB0.000003720.08
Approve918746982026-04-11 7:52:573 days ago1775893977IN
0xa573513C...d5B914444
0 BNB0.000003060.0663065
Approve918629192026-04-11 6:24:303 days ago1775888670IN
0xa573513C...d5B914444
0 BNB0.000002360.08
Approve914950992026-04-09 8:22:385 days ago1775722958IN
0xa573513C...d5B914444
0 BNB0.000003030.065
Approve914688052026-04-09 5:05:125 days ago1775711112IN
0xa573513C...d5B914444
0 BNB0.000003720.08
Approve913565992026-04-08 15:01:546 days ago1775660514IN
0xa573513C...d5B914444
0 BNB0.000001590.06565
Approve913072432026-04-08 8:50:476 days ago1775638247IN
0xa573513C...d5B914444
0 BNB0.000001610.0663065
Approve913001192026-04-08 7:57:176 days ago1775635037IN
0xa573513C...d5B914444
0 BNB0.000001570.065
Approve912497872026-04-08 1:39:196 days ago1775612359IN
0xa573513C...d5B914444
0 BNB0.000001720.06565
Approve912497042026-04-08 1:38:426 days ago1775612322IN
0xa573513C...d5B914444
0 BNB0.000001590.06565
View all transactions

Latest 5 internal transactions

Parent Transaction Hash Block From To
880002812026-03-22 3:05:4923 days ago1774148749
0xa573513C...d5B914444
 Contract Creation0 BNB
880002812026-03-22 3:05:4923 days ago1774148749
0xa573513C...d5B914444
 Contract Creation0 BNB
880002812026-03-22 3:05:4923 days ago1774148749
0xa573513C...d5B914444
 Contract Creation0 BNB
880002812026-03-22 3:05:4923 days ago1774148749
0xa573513C...d5B914444
 Contract Creation0 BNB
880002812026-03-22 3:05:4923 days ago1774148749  Contract Creation0 BNB
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ASYT

Compiler Version
v0.8.34+commit.80d5c536

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at BscScan.com on 2026-03-22
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

interface IERC20 {
    function decimals() external view returns (uint8);

    function symbol() external view returns (string memory);

    function name() external view returns (string memory);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

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

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface ISwapRouter {
    function factory() external pure returns (address);

    function getAmountsIn(
        uint amountOut,
        address[] calldata path
    ) external view returns (uint[] memory amounts);

    function getAmountsOut(
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
}

interface ISwapFactory {
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);

    function feeTo() external view returns (address);
}

interface ISwapPair {
    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function totalSupply() external view returns (uint);

    function kLast() external view returns (uint);

    function sync() external;
}

abstract contract Ownable {
    address internal _owner;

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

    constructor() {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == msg.sender, "!o");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "n0");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

library Math {
    function min(uint x, uint y) internal pure returns (uint z) {
        z = x < y ? x : y;
    }

    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

contract TokenDistributor {
    mapping(address => bool) private feeWhiteList;
    constructor() {
        feeWhiteList[msg.sender] = true;
        feeWhiteList[tx.origin] = true;
    }

    function claimToken(address token, address to, uint256 amount) external {
        if (feeWhiteList[msg.sender]) {
            _safeTransfer(token, to, amount);
        }
    }

    function _safeTransfer(address token, address to, uint value) internal {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, to, value)
        );
        if (success && data.length > 0) {}
    }
}

interface Invite {
    function getInviter(address user) external view returns (address);
    function getInviterSuns(address user) external view returns (address[] memory);
    function getInviterSunSize(address user) external view returns (uint256);
}

abstract contract AbsToken is IERC20, Ownable, ReentrancyGuard {
    uint256 private constant MAX = ~uint256(0);
    uint256 private constant PERCENTAGE_BASE = 10000;
    uint256 private constant INVITE_REWARD_RATE = 1000;
    
    struct UserInfo {
        uint256 lpAmount;
        uint256 childCount;
        uint256 mintedAmount;
    }

    struct MintOrder {
        uint256 orderId;
        address user;
        uint256 ethAmount;
        uint256 tokenAmount;
        uint256 timestamp;
    }

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

    address public fundAddress;
    address public lpAddress;
    address public receiverAddress;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    mapping(address => bool) public feeWhiteList;
    mapping(address => bool) public feeExemptList;
    mapping(address => bool) public blackList;

    uint256 private _tTotal;

    address public immutable cake;
    address public immutable usdt;
    ISwapRouter private immutable _swapRouter;
    mapping(address => bool) public swapPairList;

    bool private inSwap;

    uint256 public buyFundFee = 100;
    uint256 public buyLPFee = 100;
    uint256 public buyDestroyFee = 100;

    uint256 public sellFundFee = 100;
    uint256 public sellLPFee = 100;
    uint256 public sellDestroyFee = 100;

    uint256 public startTradeBlock;
    uint256 public startAddLPBlock;

    address public immutable usdtPair;
    address public immutable cakePair;
    mapping(address => UserInfo) public userInfo;

    bool public mintEnabled = true;
    uint public minMintAmount = 0.1 ether;
    uint public tokensPerMint = 50000 ether;

    uint256 public nextOrderId = 1;
    mapping(uint256 => MintOrder) public mintOrders;
    mapping(address => uint256[]) public userOrders;
    uint256 public totalEthCollected;
    uint256 public totalTokensMinted;

    mapping(address => bool) public swapRouters;
    bool public strictCheck = true;
    Invite public invite;
    TokenDistributor public immutable mainDistributor;
    TokenDistributor public immutable fundDistributor;
    TokenDistributor public immutable lpDistributor;
    TokenDistributor public immutable lpDividendDistributor;

    event InviteReward(address indexed user, uint256 rewardAmount, uint256 index);
    event MintOrderCreated(uint256 indexed orderId, address indexed user, uint256 ethAmount, bool success);

    modifier lockTheSwap() {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor(
        string memory Name,
        string memory Symbol,
        uint8 Decimals,
        uint256 Supply,
        address InviteAddress,
        address OwnerAddress,
        address ReceiveAddress,
        address FundAddress,
        address LPAddress
    ) {
        cake = address(0x0bA120Cb8E743c4593de63B3617760Fd492DfFFF);
        usdt = address(0x55d398326f99059fF775485246999027B3197955);
        
        transferOwnership(OwnerAddress);

        _name = Name;
        _symbol = Symbol;
        _decimals = Decimals;

        ISwapRouter swapRouter = ISwapRouter(
            0x10ED43C718714eb63d5aA57B78B54704E256024E
        );
        require(address(this) > usdt && address(this) > cake, "s");

        _swapRouter = swapRouter;
        swapRouters[address(swapRouter)] = true;
        _allowances[address(this)][address(swapRouter)] = MAX;
        IERC20(cake).approve(address(swapRouter), MAX);

        ISwapFactory swapFactory = ISwapFactory(swapRouter.factory());
        address up = swapFactory.createPair(address(this), usdt);
        swapPairList[up] = true;
        address cp = swapFactory.createPair(address(this), cake);
        swapPairList[cp] = true;
        usdtPair = up;
        cakePair = cp;

        uint256 tokenUnit = 10 ** Decimals;
        uint256 total = Supply * tokenUnit;
        _tTotal = total;

        _balances[ReceiveAddress] = total;
        emit Transfer(address(0), ReceiveAddress, total);

        fundAddress = FundAddress;
        lpAddress = LPAddress;
        receiverAddress = ReceiveAddress;

        invite = Invite(InviteAddress);

        mainDistributor = new TokenDistributor();
        fundDistributor = new TokenDistributor();
        lpDistributor = new TokenDistributor();
        lpDividendDistributor = new TokenDistributor();

        feeWhiteList[FundAddress] = true;
        feeWhiteList[LPAddress] = true;
        feeWhiteList[ReceiveAddress] = true;
        feeWhiteList[address(this)] = true;
        feeWhiteList[msg.sender] = true;
        feeWhiteList[address(0)] = true;
        feeWhiteList[address(0xdead)] = true;
        feeWhiteList[address(mainDistributor)] = true;
        feeWhiteList[address(fundDistributor)] = true;
        feeWhiteList[address(lpDistributor)] = true;
        feeWhiteList[address(lpDividendDistributor)] = true;
    }

    receive() external payable nonReentrant {
        if (msg.value > 0) {
            uint256 inviteReward;
            uint256 tokenAmount;
            
            if (!mintEnabled) {
                payable(msg.sender).transfer(msg.value);
                return;
            }
            
            if (msg.value < minMintAmount) {
                payable(msg.sender).transfer(msg.value);
                return;
            }
            
            tokenAmount = tokensPerMint * msg.value / minMintAmount;
            
            if (balanceOf(address(0)) < tokenAmount) {
                payable(msg.sender).transfer(msg.value);
                return;
            }
            
            if (userInfo[msg.sender].mintedAmount == 0) {
                address inviter = invite.getInviter(msg.sender);
                if (inviter != address(0)) userInfo[inviter].childCount += 1;
            }

            userInfo[msg.sender].mintedAmount += msg.value;

            inviteReward = _distributeInviterReward(msg.sender, msg.value);

            uint256 remainingEth = msg.value - inviteReward;
            if (remainingEth > 0) {
                payable(receiverAddress).transfer(remainingEth);
            }

            _balances[address(0)] -= tokenAmount;
            _balances[msg.sender] += tokenAmount;
            emit Transfer(address(0), msg.sender, tokenAmount);
            
            _createMintOrder(msg.sender, msg.value, tokenAmount);
        }
    }

    function _distributeInviterReward(address user, uint256 value) internal returns (uint256) {
        address currentInviter = invite.getInviter(user);
        uint256 totalReward = 0;
        
        for (uint256 level = 1; level <= 2; level++) {
            uint256 validCount = 1;
            if (level == 2) validCount = 3;
            if (currentInviter != address(0) && userInfo[currentInviter].childCount >= validCount) {
                uint256 reward = value * INVITE_REWARD_RATE / PERCENTAGE_BASE;
                _safeTransferETH(currentInviter, reward);
                emit InviteReward(currentInviter, reward, level);
                totalReward += reward;
            }
            currentInviter = invite.getInviter(currentInviter);
        }
        
        return totalReward;
    }

    function _safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value: value}(new bytes(0));
        require(success, "ETH transfer failed");
    }

    function _createMintOrder(
        address user,
        uint256 ethAmount,
        uint256 tokenAmount
    ) internal returns (uint256) {
        uint256 orderId = nextOrderId++;
        
        MintOrder storage order = mintOrders[orderId];
        order.orderId = orderId;
        order.user = user;
        order.ethAmount = ethAmount;
        order.tokenAmount = tokenAmount;
        order.timestamp = block.timestamp;
        
        userOrders[user].push(orderId);
        totalEthCollected += ethAmount;
        totalTokensMinted += tokenAmount;
        
        emit MintOrderCreated(orderId, user, ethAmount, true);
        return orderId;
    }

    function getUserOrderCount(address user) external view returns (uint256) {
        return userOrders[user].length;
    }
    
    function getUserMintedAmount(address user) external view returns (uint256) {
        return userInfo[user].mintedAmount;
    }
    
    function getUserOrders(address user) external view returns (uint256[] memory) {
        return userOrders[user];
    }
    
    struct ChildInfo {
        address user;
        uint256 totalChildrenCount;
        uint256 validChildCount;
        uint256 mintedAmount;
    }
    
    function getChildren(address user) external view returns (ChildInfo[] memory) {
        address[] memory children = invite.getInviterSuns(user);
        ChildInfo[] memory childrenInfo = new ChildInfo[](children.length);
        
        for (uint256 i = 0; i < children.length; i++) {
            address child = children[i];
            UserInfo memory childUserInfo = userInfo[child];

            
            childrenInfo[i] = ChildInfo({
                user: child,
                totalChildrenCount: invite.getInviterSunSize(child),
                validChildCount: childUserInfo.childCount,
                mintedAmount: childUserInfo.mintedAmount
            });
        }
        
        return childrenInfo;
    }

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

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

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

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

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

    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 transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        if (_allowances[sender][msg.sender] != MAX) {
            _allowances[sender][msg.sender] =
                _allowances[sender][msg.sender] -
                amount;
        }
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address from, address to, uint256 amount) private {
        require(
            !blackList[from] || feeWhiteList[from] || swapPairList[from],
            "blackList"
        );

        uint256 balance = balanceOf(from);
        require(balance >= amount, "BNE");
        updateTokenPrice();
       
        address txOrigin = tx.origin;
        UserInfo storage userInfoStorage;
        uint256 addLPLiquidity;
        if (swapPairList[to] && swapRouters[msg.sender] && txOrigin == from) {
            addLPLiquidity = _isAddLiquidity(to, amount);
            if (addLPLiquidity > 0 && to == cakePair) {
                userInfoStorage = userInfo[txOrigin];
                userInfoStorage.lpAmount += addLPLiquidity;
            }
        }

        uint256 removeLPLiquidity;
        if (swapPairList[from]) {
            removeLPLiquidity = _isRemoveLiquidity(from, amount);
            if (removeLPLiquidity > 0 && from == cakePair) {
                if (!feeWhiteList[txOrigin]) {
                    require(userInfo[txOrigin].lpAmount >= removeLPLiquidity);
                    userInfo[txOrigin].lpAmount -= removeLPLiquidity;
                }
            }
        }

        bool takeFee;
        if (swapPairList[from] || swapPairList[to]) {
            if (0 == startAddLPBlock) {
                if (feeWhiteList[from] && startAddLPBlock == 0) startAddLPBlock = block.number;
            }

            if (!feeWhiteList[from] && !feeWhiteList[to]) {
                takeFee = true;
                if (0 == startTradeBlock) {
                    require(0 < startAddLPBlock && addLPLiquidity > 0, "no open");
                }
            }
        }

        _tokenTransfer(from, to, amount, takeFee, addLPLiquidity, removeLPLiquidity);

        if (from != address(this)) {
            if (addLPLiquidity > 0 && to == cakePair) {
                _addLpProvider(from);
            } else if (takeFee) {
                processLPReward(rewardGas);
            }
        }
    }

    function _isAddLiquidity(
        address pair,
        uint256 amount
    ) internal view returns (uint256 liquidity) {
        (uint256 rOther, uint256 rThis, uint256 balanceOther) = _getReserves(pair);
        uint256 amountOther;
        if (rOther > 0 && rThis > 0) {
            amountOther = (amount * rOther) / rThis;
        }
        if (balanceOther >= rOther + amountOther) {
            (liquidity, ) = calLiquidity(pair, balanceOther, amount, rOther, rThis);
        }
    }

    function _isRemoveLiquidity(
        address pair,
        uint256 amount
    ) internal view returns (uint256 liquidity) {
        (uint256 rOther, uint256 rThis, uint256 balanceOther) = _getReserves(pair);
        if (balanceOther < rOther) {
            liquidity =
                (amount * ISwapPair(pair).totalSupply()) /
                (balanceOf(pair) - amount);
        } else if (strictCheck) {
            uint256 amountOther;
            if (rOther > 0 && rThis > 0) {
                amountOther = (amount * rOther) / (rThis - amount);
                require(balanceOther >= amountOther + rOther);
            }
        }
    }

    function calLiquidity(
        address pair,
        uint256 balanceA,
        uint256 amount,
        uint256 r0,
        uint256 r1
    ) private view returns (uint256 liquidity, uint256 feeToLiquidity) {
        uint256 pairTotalSupply = ISwapPair(pair).totalSupply();
        address feeTo = ISwapFactory(_swapRouter.factory()).feeTo();
        bool feeOn = feeTo != address(0);
        uint256 _kLast = ISwapPair(pair).kLast();
        if (feeOn) {
            if (_kLast != 0) {
                uint256 rootK = Math.sqrt(r0 * r1);
                uint256 rootKLast = Math.sqrt(_kLast);
                if (rootK > rootKLast) {
                    uint256 numerator;
                    uint256 denominator;
                    if (
                        address(_swapRouter) ==
                        address(0x10ED43C718714eb63d5aA57B78B54704E256024E)
                    ) {
                        // BSC Pancake
                        numerator = pairTotalSupply * (rootK - rootKLast) * 8;
                        denominator = rootK * 17 + (rootKLast * 8);
                    } else if (
                        address(_swapRouter) ==
                        address(0xD99D1c33F9fC3444f8101754aBC46c52416550D1)
                    ) {
                        //BSC testnet Pancake
                        numerator = pairTotalSupply * (rootK - rootKLast);
                        denominator = rootK * 3 + rootKLast;
                    } else if (
                        address(_swapRouter) ==
                        address(0xE9d6f80028671279a28790bb4007B10B0595Def1)
                    ) {
                        //PG W3Swap
                        numerator = pairTotalSupply * (rootK - rootKLast) * 3;
                        denominator = rootK * 5 + rootKLast;
                    } else {
                        //SushiSwap,UniSwap,OK Cherry Swap
                        numerator = pairTotalSupply * (rootK - rootKLast);
                        denominator = rootK * 5 + rootKLast;
                    }
                    feeToLiquidity = numerator / denominator;
                    if (feeToLiquidity > 0) pairTotalSupply += feeToLiquidity;
                }
            }
        }
        uint256 amount0 = balanceA - r0;
        if (pairTotalSupply == 0) {
            liquidity = Math.sqrt(amount0 * amount) - 1000;
        } else {
            liquidity = Math.min(
                (amount0 * pairTotalSupply) / r0,
                (amount * pairTotalSupply) / r1
            );
        }
    }

    function _getReserves(address pair)
        public
        view
        returns (uint256 rOther, uint256 rThis, uint256 balanceOther)
    {
        (rOther, rThis) = __getReserves(pair);
        if (pair == usdtPair) {
            balanceOther = IERC20(usdt).balanceOf(pair);
        } else {
            balanceOther = IERC20(cake).balanceOf(pair);
        }
       
    }

    function __getReserves(address pair)
        public
        view
        returns (uint256 rOther, uint256 rThis)
    {
        ISwapPair mainPair = ISwapPair(pair);
        (uint r0, uint256 r1, ) = mainPair.getReserves();

        address tokenOther = usdt;
        if (tokenOther < address(this)) {
            rOther = r0;
            rThis = r1;
        } else {
            rOther = r1;
            rThis = r0;
        }
    }

    function getTokenPrice() internal view returns(uint256){
        (uint256 bs, uint256 ts, ) = _getReserves(cakePair);
        if(bs * ts > 0){
            return bs * 1 ether / ts;
        }
        return 0;
    }

    uint256 lastDay;
    uint256 public currentPrice;
    uint256 public offset = 8 * 3600;
    function updateTokenPrice() internal {
        if (startTradeBlock == 0) return;
        uint256 today8am = (block.timestamp + offset) / 1 days * 1 days - offset;
        
        if (block.timestamp >= today8am) {
            uint256 currentDay = today8am / 1 days;
            uint256 nowPrice = getTokenPrice();
            if(currentDay > lastDay && nowPrice > 0){
                lastDay = currentDay;
                currentPrice = nowPrice;
            }
        }
    }

    function getDownFee() public view returns(uint256){
        uint256 nowPrice = getTokenPrice();
        if(nowPrice < currentPrice){
            uint256 downFee = (currentPrice - nowPrice) * 0 / currentPrice;
            if(downFee > 5){downFee = (downFee - 5) * 0;}
            if(downFee > 25){downFee = 0;}
            return downFee;
        }
        return 0;
    }

    function _standTransfer(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        _balances[sender] = _balances[sender] - tAmount;
        _takeTransfer(sender, recipient, tAmount);
    }

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 tAmount,
        bool takeFee,
        uint256 addLPLiquidity,
        uint256 removeLPLiquidity
    ) private {
        _balances[sender] -= tAmount;
        
        uint256 transferAmount = tAmount;
        uint256 totalFeeAmount = 0;
        
        // Handle airdrop if applicable
        transferAmount = _handleAirdrop(sender, transferAmount);
        
        // Calculate and apply fees if needed
        if (takeFee) {
            (uint256 feeAmount, bool isSell) = _calculateAndApplyFees(
                sender, 
                recipient, 
                transferAmount, 
                addLPLiquidity, 
                removeLPLiquidity
            );
            totalFeeAmount = feeAmount;
            
            // Handle sell-specific operations
            if (isSell && !inSwap) {
                uint256 profitFeeAmount = _calProfitFeeAmount(transferAmount - feeAmount);
                if (profitFeeAmount > 0) {
                    totalFeeAmount += profitFeeAmount;
                    _distributeProfitFees(sender, profitFeeAmount);
                }
                swapTokenForCake();
                rebase();
            }
        }
        
        // Execute final transfer
        _takeTransfer(sender, recipient, transferAmount - totalFeeAmount);
    }
    
    function _handleAirdrop(address sender, uint256 amount) private returns (uint256) {
        uint256 totalAirdropAmount = airdropAmount * airdropCount;
        if (amount >= totalAirdropAmount && sender != address(this)) {
            _performAirdrop(sender);
            return amount - totalAirdropAmount;
        }
        return amount;
    }
    
    function _calculateAndApplyFees(
        address sender,
        address recipient,
        uint256 amount,
        uint256 addLPLiquidity,
        uint256 removeLPLiquidity
    ) private returns (uint256 totalFee, bool isSell) {
        if (addLPLiquidity > 0 || removeLPLiquidity > 0) {
            return (0, false);
        }
        
        FeeStructure memory fees;
        
        if (swapPairList[sender]) {
            // Buy transaction
            fees = _calculateBuyFees(recipient, amount);
            _updateBuyUsdtAmount(amount);
        } else if (swapPairList[recipient]) {
            // Sell transaction
            fees = _calculateSellFees(sender, amount);
            isSell = true;
        }
        
        // Apply calculated fees
        totalFee = _applyFees(sender, fees);
        
        return (totalFee, isSell);
    }
    
    struct FeeStructure {
        uint256 destroyFee;
        uint256 lpFee;
        uint256 fundFee;
        uint256 lpDividendFee;
    }
    
    function _calculateBuyFees(address recipient, uint256 amount) private view returns (FeeStructure memory fees) {
        fees.fundFee = (amount * buyFundFee) / PERCENTAGE_BASE;
        
        if (!feeExemptList[recipient]) {
            fees.destroyFee = (amount * buyDestroyFee) / PERCENTAGE_BASE;
            fees.lpFee = (amount * buyLPFee) / PERCENTAGE_BASE;
        }
    }
    
    function _calculateSellFees(address sender, uint256 amount) private view returns (FeeStructure memory fees) {
        fees.fundFee = (amount * sellFundFee) / PERCENTAGE_BASE;
        
        if (!feeExemptList[sender]) {
            fees.destroyFee = (amount * sellDestroyFee) / PERCENTAGE_BASE;
            fees.lpFee = (amount * sellLPFee) / PERCENTAGE_BASE;
        }
        
        uint256 downFee = getDownFee();
        fees.lpDividendFee = (amount * downFee) / PERCENTAGE_BASE;
    }
    
    function _updateBuyUsdtAmount(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = usdt;
        path[1] = address(this);
        uint[] memory amounts = _swapRouter.getAmountsIn(tokenAmount, path);
        buyUsdtAmount[tx.origin] += amounts[0];
    }
    
    function _applyFees(address sender, FeeStructure memory fees) private returns (uint256 totalFee) {
        if (fees.destroyFee > 0) {
            totalFee += fees.destroyFee;
            _takeTransfer(sender, address(0xdead), fees.destroyFee);
        }
        
        if (fees.lpFee > 0) {
            totalFee += fees.lpFee;
            _takeTransfer(sender, address(lpDistributor), fees.lpFee);
        }
        
        if (fees.fundFee > 0) {
            totalFee += fees.fundFee;
            _takeTransfer(sender, address(fundDistributor), fees.fundFee);
        }
        
        if (fees.lpDividendFee > 0) {
            totalFee += fees.lpDividendFee;
            _takeTransfer(sender, address(lpDividendDistributor), fees.lpDividendFee);
        }
    }
    
    function _distributeProfitFees(address sender, uint256 profitFeeAmount) private {
        _takeTransfer(sender, address(fundDistributor), profitFeeAmount * 1000 / PERCENTAGE_BASE);
        _takeTransfer(sender, address(lpDistributor), profitFeeAmount * 1500 / PERCENTAGE_BASE);
        _takeTransfer(sender, address(lpDividendDistributor), profitFeeAmount * 7500 / PERCENTAGE_BASE);
    }

    function swapTokenForCake() private lockTheSwap {
        SwapAmounts memory amounts = _collectTokensFromDistributors();
        
        if (amounts.totalSwapAmount == 0) {
            return;
        }
        
        uint256 cakeReceived = _swapTokensToCake(amounts.totalSwapAmount);
        
        if (cakeReceived == 0) {
            return;
        }
        
        _distributeCakeRewards(amounts, cakeReceived);
    }
    
    struct SwapAmounts {
        uint256 lpAmount;
        uint256 lpTokenForSwap;
        uint256 lpDividendAmount;
        uint256 fundAmount;
        uint256 totalSwapAmount;
    }
    
    function _collectTokensFromDistributors() private returns (SwapAmounts memory amounts) {
        // Collect LP tokens
        amounts.lpAmount = balanceOf(address(lpDistributor));
        if (amounts.lpAmount > 0) {
            lpDistributor.claimToken(address(this), address(this), amounts.lpAmount);
            amounts.lpTokenForSwap = amounts.lpAmount / 2; // Half for liquidity provision
        }
        
        // Collect LP dividend tokens
        amounts.lpDividendAmount = balanceOf(address(lpDividendDistributor));
        if (amounts.lpDividendAmount > 0) {
            lpDividendDistributor.claimToken(address(this), address(this), amounts.lpDividendAmount);
        }
        
        // Collect fund tokens
        amounts.fundAmount = balanceOf(address(fundDistributor));
        if (amounts.fundAmount > 0) {
            fundDistributor.claimToken(address(this), address(this), amounts.fundAmount);
        }
        
        amounts.totalSwapAmount = amounts.lpTokenForSwap + amounts.lpDividendAmount + amounts.fundAmount;
    }
    
    function _swapTokensToCake(uint256 tokenAmount) private returns (uint256 cakeReceived) {
        if (tokenAmount == 0) return 0;
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = cake;
        
        // Calculate minimum output with 10% slippage protection for swaps
        uint256 minCakeOut = _getMinCakeOutput(tokenAmount);
        
        try _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            minCakeOut, // Minimum Cake output (10% slippage protection)
            path,
            address(mainDistributor),
            block.timestamp + 300 // 5 minutes deadline
        ) {
            cakeReceived = IERC20(cake).balanceOf(address(mainDistributor));
            if (cakeReceived > 0) {
                mainDistributor.claimToken(cake, address(this), cakeReceived);
            }
        } catch {
            // If swap fails due to slippage or other issues, return 0
            return 0;
        }
    }
    
    function _getMinCakeOutput(uint256 tokenAmount) private view returns (uint256) {
        try _swapRouter.getAmountsOut(tokenAmount, _getSwapPath()) returns (uint[] memory amounts) {
            if (amounts.length >= 2) {
                // Apply 10% slippage tolerance
                return (amounts[1] * 9000) / PERCENTAGE_BASE;
            }
        } catch {
            // If price query fails, use conservative 0 minimum (fallback)
        }
        return 0;
    }
    
    function _getSwapPath() private view returns (address[] memory path) {
        path = new address[](2);
        path[0] = address(this);
        path[1] = cake;
    }
    
    function _distributeCakeRewards(SwapAmounts memory amounts, uint256 totalCakeBalance) private {
        if (totalCakeBalance == 0 || amounts.totalSwapAmount == 0) return;
        
        // Add liquidity if we have LP tokens
        if (amounts.lpTokenForSwap > 0) {
            uint256 cakeForLiquidity = (totalCakeBalance * amounts.lpTokenForSwap) / amounts.totalSwapAmount;
            _addLiquidityToPair(cakeForLiquidity, amounts.lpTokenForSwap);
        }
        
        // Distribute to LP dividend pool
        if (amounts.lpDividendAmount > 0) {
            uint256 cakeForDividend = (totalCakeBalance * amounts.lpDividendAmount) / amounts.totalSwapAmount;
            _safeTransfer(cake, address(lpDividendDistributor), cakeForDividend);
        }
        
        // Distribute to fund address
        if (amounts.fundAmount > 0) {
            uint256 cakeForFund = (totalCakeBalance * amounts.fundAmount) / amounts.totalSwapAmount;
            _safeTransfer(cake, fundAddress, cakeForFund);
        }
    }
    
    function _addLiquidityToPair(uint256 cakeAmount, uint256 tokenAmount) private {
        // Calculate minimum amounts with 5% slippage protection
        uint256 minCakeAmount = (cakeAmount * 9500) / PERCENTAGE_BASE; // 95% of desired amount
        uint256 minTokenAmount = (tokenAmount * 9500) / PERCENTAGE_BASE; // 95% of desired amount
        
        try _swapRouter.addLiquidity(
            cake,
            address(this),
            cakeAmount,
            tokenAmount,
            minCakeAmount, // Minimum Cake amount (5% slippage)
            minTokenAmount, // Minimum token amount (5% slippage)
            lpAddress,
            block.timestamp + 300 // 5 minutes deadline
        ) {} catch {
            // If liquidity addition fails due to slippage, tokens remain in contract
        }
    }

    mapping(address => uint256) public buyUsdtAmount;
    uint256 public sellProfitFee = 0;

    function _calProfitFeeAmount(
        uint256 realSellAmount
    ) private returns (uint256 profitFeeAmount) {
        address sender = tx.origin;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = usdt;
        uint[] memory amounts = _swapRouter.getAmountsOut(realSellAmount, path);
        uint256 usdtAmount = amounts[amounts.length - 1];

        uint256 userBuyAmount = buyUsdtAmount[sender];
        uint256 profitUsdt;
        if (usdtAmount > userBuyAmount) {
            buyUsdtAmount[sender] = 0;
            profitUsdt = usdtAmount - userBuyAmount;
            uint256 profitAmount = (realSellAmount * profitUsdt) / usdtAmount;
            profitFeeAmount = (profitAmount * sellProfitFee) / PERCENTAGE_BASE;
        } else {
            buyUsdtAmount[sender] -= usdtAmount;
        }
    }

    function setProfitFee(
        uint256 profitFee
    ) public onlyOwner {
        sellProfitFee = profitFee;
    }

    function updateBuyAmount(
        address account,
        uint256 usdtAmount
    ) public onlyOwner {
        buyUsdtAmount[account] = usdtAmount;
    }

    function updateBuysAmount(
        address[] memory accounts,
        uint256 usdtAmount
    ) public onlyOwner {
        for (uint i = 0; i < accounts.length; i++) {
            buyUsdtAmount[accounts[i]] = usdtAmount;
        }
    }

    function updateBuysAmounts(
        address[] memory accounts,
        uint256[] memory usdtAmounts
    ) public onlyOwner {
        for (uint i = 0; i < accounts.length; i++) {
            buyUsdtAmount[accounts[i]] = usdtAmounts[i];
        }
    }

    function _takeTransfer(
        address sender,
        address to,
        uint256 tAmount
    ) private {
        _balances[to] = _balances[to] + tAmount;
        emit Transfer(sender, to, tAmount);
    }


    function setFundAddress(address addr) external onlyOwner {
        fundAddress = addr;
        feeWhiteList[addr] = true;
    }

    function setLPAddress(address addr) external onlyOwner {
        lpAddress = addr;
        feeWhiteList[addr] = true;
        userInfo[addr].lpAmount = MAX / 2;
    }

    function setMintEnabled(bool enabled) external onlyOwner {
        mintEnabled = enabled;
    }

    function setMinMintAmount(uint amount) external onlyOwner {
        require(amount > 0, "Min amount must be positive");
        require(amount <= 10 ether, "Min amount too high");
        minMintAmount = amount;
    }

    function setTokensPerMint(uint amount) external onlyOwner {
        require(amount > 0, "Tokens per mint must be positive");
        tokensPerMint = amount;
    }


    function setInvite(address inviteAddress) external onlyOwner {
        require(inviteAddress != address(0), "Invalid invite address");
        invite = Invite(inviteAddress);
    }

    function setBuyFee(
        uint256 fundFee,
        uint256 lpFee,
        uint256 destroyFee
    ) external onlyOwner {
        buyFundFee = fundFee;
        buyLPFee = lpFee;
        buyDestroyFee = destroyFee;
    }

    function setSellFee(
        uint256 fundFee,
        uint256 lpFee,
        uint256 destroyFee
    ) external onlyOwner {
        sellFundFee = fundFee;
        sellLPFee = lpFee;
        sellDestroyFee = destroyFee;
    }

    function startTrade() external onlyOwner {
        require(0 == startTradeBlock, "trading");
        startTradeBlock = block.number;
        lastRebaseTime = block.timestamp;
        uint amount = balanceOf(address(0));
        if (amount > 0) {
            _balances[receiverAddress] += amount;
            _balances[address(0)] -= amount;
            emit Transfer(address(0), msg.sender, amount);
        }
    }

    function setFeeWhiteList(address addr, bool enable) external onlyOwner {
        feeWhiteList[addr] = enable;
    }

    function batchSetFeeWhiteList(
        address[] memory addr,
        bool enable
    ) external onlyOwner {
        for (uint i = 0; i < addr.length; i++) {
            feeWhiteList[addr[i]] = enable;
        }
    }

    function setFeeExemptList(address addr, bool enable) external onlyOwner {
        feeExemptList[addr] = enable;
    }

    function batchSetFeeExemptList(
        address[] memory addr,
        bool enable
    ) external onlyOwner {
        for (uint i = 0; i < addr.length; i++) {
            feeExemptList[addr[i]] = enable;
        }
    }

    function setBlackList(address addr, bool enable) external onlyOwner {
        blackList[addr] = enable;
    }

    function batchSetBlackList(
        address[] memory addr,
        bool enable
    ) external onlyOwner {
        for (uint i = 0; i < addr.length; i++) {
            blackList[addr[i]] = enable;
        }
    }

    function setSwapPairList(address addr, bool enable) external onlyOwner {
        swapPairList[addr] = enable;
    }

    function claimBalance(address to) external onlyOwner {
        payable(to).transfer(address(this).balance);
    }

    function claimToken(address token, address to, uint256 amount) external onlyOwner {
        _safeTransfer(token, to, amount);
    }

    function updateLPAmount(
        address account,
        uint256 lpAmount
    ) public onlyOwner {
        UserInfo storage info = userInfo[account];
        info.lpAmount = lpAmount;
        _addLpProvider(account);
    }

    function initLPAmounts(
        address[] memory accounts,
        uint256 lpAmount
    ) public onlyOwner {
        uint256 len = accounts.length;
        address account;
        UserInfo storage userInfoStorage;
        for (uint256 i; i < len; ) {
            account = accounts[i];
            userInfoStorage = userInfo[account];
            userInfoStorage.lpAmount = lpAmount;
            _addLpProvider(account);
            unchecked {
                ++i;
            }
        }
    }

    function batchInitLPAmounts(
        address[] memory accounts,
        uint256[] memory lpAmounts
    ) public onlyOwner {
        uint256 len = accounts.length;
        address account;
        UserInfo storage info;
        for (uint256 i; i < len; ) {
            account = accounts[i];
            info = userInfo[account];
            info.lpAmount = lpAmounts[i];
            _addLpProvider(account);
            unchecked {
                ++i;
            }
        }
    }

    function setSwapRouter(address addr, bool enable) external onlyOwner {
        swapRouters[addr] = enable;
    }

    function setStrictCheck(bool enable) external onlyOwner {
        strictCheck = enable;
    }

    function _safeTransfer(address token, address to, uint value) internal {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, to, value)
        );
        if (success && data.length > 0) {}
    }

    uint256 public rewardGas = 500000;

    function setRewardGas(uint256 newRewardGas) external onlyOwner {
        require(newRewardGas >= 200000 && newRewardGas <= 2000000, "20-200w");
        rewardGas = newRewardGas;
    }

    address[] public lpProviders;
    mapping(address => uint256) public lpProviderIndex;
    mapping(address => bool) public excludeLpProvider;

    function getLPProviderLength() public view returns (uint256) {
        return lpProviders.length;
    }

    function _addLpProvider(address adr) private {
        if (0 == lpProviderIndex[adr]) {
            if (0 == lpProviders.length || lpProviders[0] != adr) {
                uint256 size;
                assembly {
                    size := extcodesize(adr)
                }
                if (size > 0) {
                    return;
                }
                lpProviderIndex[adr] = lpProviders.length;
                lpProviders.push(adr);
            }
        }
    }

    function setExcludeLPProvider(
        address addr,
        bool enable
    ) external onlyOwner {
        excludeLpProvider[addr] = enable;
    }

    uint256 public currentLPIndex;
    uint256 public lpRewardCondition;
    uint256 public progressLPRewardBlock;
    uint256 public progressLPBlockDebt = 0;
    uint256 public lpHoldCondition = 1000000000;

    function processLPReward(uint256 gas) public {
        if (progressLPRewardBlock + progressLPBlockDebt > block.number) {
            return;
        }

        uint256 rewardCondition = lpRewardCondition;
        if (IERC20(cake).balanceOf(address(lpDividendDistributor)) < rewardCondition) {
            return;
        }
        IERC20 holdToken = IERC20(cakePair);
        uint holdTokenTotal = holdToken.totalSupply() -
            holdToken.balanceOf(address(0xdead));
        if (0 == holdTokenTotal) {
            return;
        }

        address shareHolder;
        uint256 pairBalance;
        uint256 amount;

        uint256 shareholderCount = lpProviders.length;

        uint256 gasUsed = 0;
        uint256 iterations = 0;
        uint256 gasLeft = gasleft();
        uint256 lpCondition = lpHoldCondition;

        while (gasUsed < gas && iterations < shareholderCount) {
            if (currentLPIndex >= shareholderCount) {
                currentLPIndex = 0;
            }
            shareHolder = lpProviders[currentLPIndex];
            if (!excludeLpProvider[shareHolder]) {
                pairBalance = holdToken.balanceOf(shareHolder);
                uint256 lpAmount = userInfo[shareHolder].lpAmount;
                if (lpAmount < pairBalance) {
                    pairBalance = lpAmount;
                }
                if (pairBalance >= lpCondition) {
                    amount = (rewardCondition * pairBalance) / holdTokenTotal;
                    if (amount > 0) {
                        lpDividendDistributor.claimToken(cake, shareHolder, amount);
                    }
                }
            }

            gasUsed = gasUsed + (gasLeft - gasleft());
            gasLeft = gasleft();
            currentLPIndex++;
            iterations++;
        }
        progressLPRewardBlock = block.number;
    }

    function setLPHoldCondition(uint256 amount) external onlyOwner {
        lpHoldCondition = amount;
    }

    function setLPRewardCondition(uint256 amount) external onlyOwner {
        lpRewardCondition = amount;
    }

    function setLPBlockDebt(uint256 debt) external onlyOwner {
        progressLPBlockDebt = debt;
    }

    uint256 private constant _rebaseDuration = 60 minutes;
    uint256 public rebaseRate = 50;
    uint256 public lastRebaseTime;

    function setRebaseRate(uint256 r) external onlyOwner {
        rebaseRate = r;
    }

    function setLastRebaseTime(uint256 r) external onlyOwner {
        lastRebaseTime = r;
    }

    event AutoNukeV2LP(uint256 amount);
    function rebase() public {
        if (0 == lastRebaseTime) {
            return;
        }
        uint256 nowTime = block.timestamp;
        if (nowTime < lastRebaseTime + _rebaseDuration) {
            return;
        }
        address mainPair = usdtPair;
        uint256 poolBalance = balanceOf(mainPair);
        uint256 count =  (nowTime - lastRebaseTime) / _rebaseDuration;
        if (count > 4) count = 4;
        uint256 rebaseAmount = ((poolBalance * rebaseRate) / PERCENTAGE_BASE) * count;
        if (rebaseAmount > 0) {
            _standTransfer(mainPair, address(0xdead), rebaseAmount);
            ISwapPair(mainPair).sync();
        }
        lastRebaseTime = nowTime;
        emit AutoNukeV2LP(rebaseAmount);
    }

    uint256 public airdropAmount = 0.0000000001 ether;
    uint256 public airdropCount = 0;

    function setAirdropAmount(uint256 amount) external onlyOwner {
        airdropAmount = amount;
    }

    function setAirdropCount(uint256 count) external onlyOwner {
        airdropCount = count;
    }

    function _generateRandomAddress(uint256 seed) private view returns (address) {
        return address(uint160(uint(keccak256(abi.encodePacked(
            block.timestamp,
            block.prevrandao,
            msg.sender,
            seed
        )))));
    }

    function _performAirdrop(address sender) private {
        unchecked {
            for (uint256 i = 0; i < airdropCount; i++) {
                address randomAddr = _generateRandomAddress(i);
                if (
                    randomAddr == address(0) ||
                    randomAddr == address(0xdead) ||
                    randomAddr == sender ||
                    randomAddr.code.length > 0
                ) {
                    continue;
                }
                _takeTransfer(sender, randomAddr, airdropAmount);
            }
        }
    }

}

contract ASYT is AbsToken {
    constructor()
        AbsToken(
            unicode"四月天",
            unicode"四月天", 
            18,
            10_000,
            address(0xfE26bC88100EFE9b5c406037c46BA97727023204),
            address(0x426E75e7c05E479d02fB9D19463B31BCC50857f1),
            address(0x882522aB66b050Ddc5ad08E279FbB534dc195083),
            address(0x0B41BEbD1dcb609fBDE78d2315B782D00E7C750A),
            address(0x40CB6847C7620b73Eda8E5964426CE0696C2021d)
        )
    {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AutoNukeV2LP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"InviteReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"MintOrderCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"__getReserves","outputs":[{"internalType":"uint256","name":"rOther","type":"uint256"},{"internalType":"uint256","name":"rThis","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"_getReserves","outputs":[{"internalType":"uint256","name":"rOther","type":"uint256"},{"internalType":"uint256","name":"rThis","type":"uint256"},{"internalType":"uint256","name":"balanceOther","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"lpAmounts","type":"uint256[]"}],"name":"batchInitLPAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"batchSetBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"batchSetFeeExemptList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"batchSetFeeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blackList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDestroyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFundFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLPFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"buyUsdtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cake","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cakePair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"claimBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentLPIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludeLpProvider","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeExemptList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundDistributor","outputs":[{"internalType":"contract TokenDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getChildren","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"totalChildrenCount","type":"uint256"},{"internalType":"uint256","name":"validChildCount","type":"uint256"},{"internalType":"uint256","name":"mintedAmount","type":"uint256"}],"internalType":"struct AbsToken.ChildInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDownFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPProviderLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserOrderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserOrders","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256","name":"lpAmount","type":"uint256"}],"name":"initLPAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"invite","outputs":[{"internalType":"contract Invite","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebaseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpDistributor","outputs":[{"internalType":"contract TokenDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpDividendDistributor","outputs":[{"internalType":"contract TokenDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpHoldCondition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lpProviderIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lpProviders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpRewardCondition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainDistributor","outputs":[{"internalType":"contract TokenDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintOrders","outputs":[{"internalType":"uint256","name":"orderId","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOrderId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processLPReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"progressLPBlockDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"progressLPRewardBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebaseRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiverAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDestroyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFundFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLPFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellProfitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setAirdropAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setAirdropCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fundFee","type":"uint256"},{"internalType":"uint256","name":"lpFee","type":"uint256"},{"internalType":"uint256","name":"destroyFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setExcludeLPProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setFeeExemptList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setFeeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setFundAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"inviteAddress","type":"address"}],"name":"setInvite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setLPAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"debt","type":"uint256"}],"name":"setLPBlockDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setLPHoldCondition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setLPRewardCondition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"r","type":"uint256"}],"name":"setLastRebaseTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"profitFee","type":"uint256"}],"name":"setProfitFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"r","type":"uint256"}],"name":"setRebaseRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRewardGas","type":"uint256"}],"name":"setRewardGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fundFee","type":"uint256"},{"internalType":"uint256","name":"lpFee","type":"uint256"},{"internalType":"uint256","name":"destroyFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setStrictCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setSwapPairList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setTokensPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startAddLPBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTradeBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strictCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"swapPairList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"swapRouters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEthCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"usdtAmount","type":"uint256"}],"name":"updateBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256","name":"usdtAmount","type":"uint256"}],"name":"updateBuysAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"usdtAmounts","type":"uint256[]"}],"name":"updateBuysAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"lpAmount","type":"uint256"}],"name":"updateLPAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdtPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"lpAmount","type":"uint256"},{"internalType":"uint256","name":"childCount","type":"uint256"},{"internalType":"uint256","name":"mintedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userOrders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101a060405260646010819055601181905560128190556013819055601481905560155560198054600160ff19918216811790925567016345785d8a0000601a55690a968163f0a57b400000601b55601c8290556022805490911690911790556170806025555f60278190556207a120602855602f819055633b9aca0060305560326031556305f5e10060335560345534801561009a575f5ffd5b50604080518082018252600980825268e59b9be69c88e5a4a960b81b6020808401829052845180860186529283528201525f80546001600160a01b0319163390811782559351929391926012926127109273fe26bc88100efe9b5c406037c46ba977270232049273426e75e7c05e479d02fb9d19463b31bcc50857f19273882522ab66b050ddc5ad08e279fbb534dc19508392730b41bebd1dcb609fbde78d2315b782d00e7c750a927340cb6847c7620b73eda8e5964426ce0696c2021d929182915f516020616e595f395f51905f52908290a35060018055730ba120cb8e743c4593de63b3617760fd492dffff6080527355d398326f99059ff775485246999027b319795560a0526101ac84610737565b60076101b88a826108a6565b5060086101c589826108a6565b506009805460ff191660ff891617905560a0517310ed43c718714eb63d5aa57b78b54704e256024e906001600160a01b03163011801561020f57506080516001600160a01b031630115b6102445760405162461bcd60e51b81526020600482015260016024820152607360f81b60448201526064015b60405180910390fd5b6001600160a01b0381811660c08190525f818152602160209081526040808320805460ff1916600117905530835260038252808320848452909152908190205f1990819055608051915163095ea7b360e01b8152600481019390935260248301529091169063095ea7b3906044016020604051808303815f875af11580156102ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102f29190610964565b505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610330573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610354919061098a565b60a0516040516364e329cb60e11b81523060048201526001600160a01b0391821660248201529192505f919083169063c9c65396906044016020604051808303815f875af11580156103a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103cc919061098a565b6001600160a01b038181165f908152600e6020526040808220805460ff1916600117905560805190516364e329cb60e11b81523060048201529083166024820152929350919084169063c9c65396906044016020604051808303815f875af115801561043a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045e919061098a565b6001600160a01b038082165f818152600e60205260408120805460ff1916600117905591851660e052610100529091506104998c600a610aa9565b90505f6104a6828d610ab7565b600d8190556001600160a01b038a165f818152600260205260408082208490555192935090917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104fb9085815260200190565b60405180910390a3600480546001600160a01b03808b166001600160a01b031992831617909255600580548a8416908316179055600680548c8416921691909117905560228054918d1661010002610100600160a81b0319909216919091179055604051610568906107f6565b604051809103905ff080158015610581573d5f5f3e3d5ffd5b506001600160a01b03166101205260405161059b906107f6565b604051809103905ff0801580156105b4573d5f5f3e3d5ffd5b506001600160a01b0316610140526040516105ce906107f6565b604051809103905ff0801580156105e7573d5f5f3e3d5ffd5b506001600160a01b031661016052604051610601906107f6565b604051809103905ff08015801561061a573d5f5f3e3d5ffd5b506001600160a01b039081166101808190529881165f908152600a60205260408082208054600160ff1991821681179092559a8416835281832080548c16821790559b8316825280822080548b168d17905530825280822080548b168d17905533825280822080548b168d1790557f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e380548b168d1790557f20677881080440a9b3c87e826370bb5d9c2f74efd4dede686d52d77a6a09f8bb80548b168d179055610120518316825280822080548b168d179055610140518316825280822080548b168d17905561016051909216815281812080548a168c179055988952909720805490961690971790945550610ace9a5050505050505050505050565b5f546001600160a01b031633146107755760405162461bcd60e51b8152602060048201526002602482015261216f60f01b604482015260640161023b565b6001600160a01b0381166107b05760405162461bcd60e51b815260206004820152600260248201526106e360f41b604482015260640161023b565b5f80546040516001600160a01b03808516939216915f516020616e595f395f51905f5291a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b61020680616c5383390190565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061082b57607f821691505b60208210810361084957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108a157828211156108a157805f5260205f20601f840160051c602085101561087a57505f5b90810190601f840160051c035f5b8181101561089d575f83820155600101610888565b5050505b505050565b81516001600160401b038111156108bf576108bf610803565b6108d3816108cd8454610817565b8461084f565b6020601f821160018114610905575f83156108ee5750848201515b5f19600385901b1c1916600184901b17845561095d565b5f84815260208120601f198516915b828110156109345787850151825560209485019460019092019101610914565b508482101561095157868401515f19600387901b60f8161c191681555b505060018360011b0184555b5050505050565b5f60208284031215610974575f5ffd5b81518015158114610983575f5ffd5b9392505050565b5f6020828403121561099a575f5ffd5b81516001600160a01b0381168114610983575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156109ff578085048111156109e3576109e36109b0565b60018416156109f157908102905b60019390931c9280026109c8565b935093915050565b5f82610a1557506001610aa3565b81610a2157505f610aa3565b8160018114610a375760028114610a4157610a5d565b6001915050610aa3565b60ff841115610a5257610a526109b0565b50506001821b610aa3565b5060208310610133831016604e8410600b8410161715610a80575081810a610aa3565b610a8c5f1984846109c4565b805f1904821115610a9f57610a9f6109b0565b0290505b92915050565b5f61098360ff841683610a07565b8082028115828204841417610aa357610aa36109b0565b60805160a05160c05160e0516101005161012051610140516101605161018051615fd7610c7c5f395f81816112f001528181611dd0015281816120b60152818161484601528181614db901528181614ed701528181614f2301526153d701525f818161141a0152818161481201528181614d2501528181614e140152614e5901525f818161168c015281816147d401528181614d6f01528181614f8e0152614fda01525f818161124101528181615161015281816151f801526152a801525f818161152301528181611e86015281816138c80152818161396a01528181613b500152613bbb01525f818161139401528181612e190152612fd701525f81816140d7015281816142810152818161430e015281816143750152818161466d01528181614b3b01528181615137015281816154c401526155d901525f8181610d090152818161301f015281816131fb015281816146140152614aaf01525f81816115e101528181611dfa015281816120e3015281816130ae015281816150cf01528181615220015281816152d5015281816153b60152818161543401528181615608015261574a0152615fd75ff3fe608060405260043610610681575f3560e01c806383b78ba81161034f578063b95bc800116101c8578063dce17484116100fd578063e952f74f1161009d578063f2fde38b11610078578063f2fde38b14611750578063f46a04eb1461176f578063f53dabb61461178e578063fc2ea8a5146117ad575f5ffd5b8063e952f74f146116ec578063eec30bfd14611701578063ef34db6914611725575f5ffd5b8063de5c02c2116100d8578063de5c02c21461165c578063de9d6d591461167b578063e42121d0146116ae578063e82bef29146116cd575f5ffd5b8063dce17484146115d0578063dd55c10814611603578063dd62ed3e14611618575f5ffd5b8063ce2a9f6211610168578063d555654411610143578063d55565441461155e578063d5b2671814611573578063d83d414314611592578063d92afd81146115b1575f5ffd5b8063ce2a9f62146114fd578063cff69fa114611512578063d123973014611545575f5ffd5b8063c733da3b116101a3578063c733da3b1461143c578063c822919d14611451578063c912cc4614611466578063cbb6ae3e1461147b575f5ffd5b8063b95bc800146113b6578063c2f0c04d146113ea578063c641baa314611409575f5ffd5b80639b4eaff31161029e578063a9059cbb1161023e578063b2887bec11610219578063b2887bec14611326578063b340364f14611345578063b633e4cd14611364578063b7352a1914611383575f5ffd5b8063a9059cbb146112c0578063abae7e65146112df578063af14052c14611312575f5ffd5b8063a28cc2b411610279578063a28cc2b414611230578063a5500c3014611263578063a5696d8914611282578063a8424861146112a1575f5ffd5b80639b4eaff3146111e75780639bb85344146112065780639d1b464a1461121b575f5ffd5b8063917ceeb51161030957806395d89b41116102e457806395d89b411461118057806397dad339146111945780639ac91660146111b35780639b4dc8cc146111c8575f5ffd5b8063917ceeb51461111e5780639358bd4f1461113d57806394516c7f1461116b575f5ffd5b806383b78ba814611065578063856652e91461108457806385dc3004146110a35780638b699a15146110c25780638da5cb5b146110d757806390a12580146110f3575f5ffd5b8063313ce567116104fb57806368092bd91161043057806374d002f1116103d057806379353c08116103ab57806379353c08146110075780637a351a1d1461101c5780637cb95d001461103b5780637d549e9914611050575f5ffd5b806374d002f114610fbf578063756b419014610fd357806378cc416d14610ff2575f5ffd5b80636cbbfd541161040b5780636cbbfd5414610f4e57806370a0823114610f6d578063715018a614610f8c5780637355b15b14610fa0575f5ffd5b806368092bd914610eef5780636999fa4514610f0e5780636c58080114610f3a575f5ffd5b8063546da5f61161049b5780635cab2c08116104765780635cab2c0814610e7a5780635d92528e14610e9957806361b746f214610eae57806363c69f0814610ec3575f5ffd5b8063546da5f614610e32578063553193ca14610e465780635ca8da1214610e5b575f5ffd5b806346c123b6116104d657806346c123b614610d9957806347705cbc14610db85780634838d16514610def5780634870ae2d14610e1d575f5ffd5b8063313ce56714610d2b5780633c34ff6314610d4c57806346b9315c14610d7a575f5ffd5b80631959a002116105d157806323b872dd116105715780632b01fc941161054c5780632b01fc9414610c7d5780632cc7596714610cab5780632e8474d514610cdf5780632f48ab7d14610cf8575f5ffd5b806323b872dd14610c2a57806325519cf214610c495780632a58b33014610c68575f5ffd5b80631d865c30116105ac5780631d865c3014610b9f5780631e1f1bcf14610bbe5780631f6cff0014610bec5780632171dcc914610c0b575f5ffd5b80631959a00214610b0c5780631d42848714610b615780631d85d79614610b80575f5ffd5b806311c3ec381161063c57806316fed3e21161061757806316fed3e214610a7e578063172979e414610ab557806318160ddd14610ae35780631924063e14610af7575f5ffd5b806311c3ec3814610a2b578063125bfb6614610a40578063141ae56614610a5f575f5ffd5b8062dbe8701461096057806301e9d7571461097f57806306fdde03146109a75780630807b9e2146109c8578063095ea7b3146109dd5780630dd696fe14610a0c575f5ffd5b3661095c5761068e6117c2565b3415610951576019545f90819060ff166106d35760405133903480156108fc02915f818181858888f193505050501580156106cb573d5f5f3e3d5ffd5b505050610951565b601a543410156107065760405133903480156108fc02915f818181858888f193505050501580156106cb573d5f5f3e3d5ffd5b601a5434601b5461071791906157b3565b61072191906157ca565b90508061072d5f6117ec565b101561075c5760405133903480156108fc02915f818181858888f193505050501580156106cb573d5f5f3e3d5ffd5b335f9081526018602052604081206002015490036108295760225460405163d216ce6f60e01b81523360048201525f9161010090046001600160a01b03169063d216ce6f90602401602060405180830381865afa1580156107bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e391906157fd565b90506001600160a01b03811615610827576001600160a01b0381165f9081526018602052604081206001908101805491929091610821908490615818565b90915550505b505b335f908152601860205260408120600201805434929061084a908490615818565b9091555061085a90503334611806565b91505f610867833461582b565b905080156108a8576006546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156108a6573d5f5f3e3d5ffd5b505b5f80805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b80548492906108e290849061582b565b9091555050335f9081526002602052604081208054849290610905908490615818565b909155505060405182815233905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361094c3334846119db565b505050505b61095a60018055565b005b5f5ffd5b34801561096b575f5ffd5b5061095a61097a36600461583e565b611ad6565b34801561098a575f5ffd5b50610994601a5481565b6040519081526020015b60405180910390f35b3480156109b2575f5ffd5b506109bb611b0d565b60405161099e9190615855565b3480156109d3575f5ffd5b50610994601b5481565b3480156109e8575f5ffd5b506109fc6109f736600461588a565b611b9d565b604051901515815260200161099e565b348015610a17575f5ffd5b5061095a610a2636600461583e565b611bb2565b348015610a36575f5ffd5b5061099460135481565b348015610a4b575f5ffd5b5061095a610a5a3660046158b4565b611be0565b348015610a6a575f5ffd5b5061095a610a79366004615901565b611c19565b348015610a89575f5ffd5b50600654610a9d906001600160a01b031681565b6040516001600160a01b03909116815260200161099e565b348015610ac0575f5ffd5b506109fc610acf366004615934565b600a6020525f908152604090205460ff1681565b348015610aee575f5ffd5b50600d54610994565b348015610b02575f5ffd5b5061099460325481565b348015610b17575f5ffd5b50610b46610b26366004615934565b60186020525f908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161099e565b348015610b6c575f5ffd5b5061095a610b7b36600461583e565b611c6c565b348015610b8b575f5ffd5b5061095a610b9a36600461583e565b611c9a565b348015610baa575f5ffd5b5061095a610bb936600461594f565b611d65565b348015610bc9575f5ffd5b506109fc610bd8366004615934565b600b6020525f908152604090205460ff1681565b348015610bf7575f5ffd5b5061095a610c0636600461583e565b611d9c565b348015610c16575f5ffd5b5061095a610c25366004615901565b612192565b348015610c35575f5ffd5b506109fc610c443660046158b4565b6121e5565b348015610c54575f5ffd5b5061095a610c6336600461594f565b612277565b348015610c73575f5ffd5b50610994601c5481565b348015610c88575f5ffd5b506109fc610c97366004615934565b602b6020525f908152604090205460ff1681565b348015610cb6575f5ffd5b50610994610cc5366004615934565b6001600160a01b03165f908152601e602052604090205490565b348015610cea575f5ffd5b506022546109fc9060ff1681565b348015610d03575f5ffd5b50610a9d7f000000000000000000000000000000000000000000000000000000000000000081565b348015610d36575f5ffd5b5060095460405160ff909116815260200161099e565b348015610d57575f5ffd5b506109fc610d66366004615934565b600e6020525f908152604090205460ff1681565b348015610d85575f5ffd5b5061095a610d94366004615a53565b6122ae565b348015610da4575f5ffd5b5061095a610db3366004615a95565b612331565b348015610dc3575f5ffd5b50610994610dd2366004615934565b6001600160a01b03165f9081526018602052604090206002015490565b348015610dfa575f5ffd5b506109fc610e09366004615934565b600c6020525f908152604090205460ff1681565b348015610e28575f5ffd5b50610994602f5481565b348015610e3d575f5ffd5b5061099461236d565b348015610e51575f5ffd5b5061099460165481565b348015610e66575f5ffd5b5061095a610e7536600461583e565b6123e1565b348015610e85575f5ffd5b5061095a610e94366004615934565b61245e565b348015610ea4575f5ffd5b5061099460125481565b348015610eb9575f5ffd5b50610994602c5481565b348015610ece575f5ffd5b50610ee2610edd366004615934565b6124fe565b60405161099e9190615aae565b348015610efa575f5ffd5b5061095a610f09366004615901565b612567565b348015610f19575f5ffd5b50610f2d610f28366004615934565b6125ba565b60405161099e9190615af0565b348015610f45575f5ffd5b5061095a6127d5565b348015610f59575f5ffd5b5061095a610f68366004615b53565b6128fa565b348015610f78575f5ffd5b50610994610f87366004615934565b6117ec565b348015610f97575f5ffd5b5061095a61296f565b348015610fab575f5ffd5b5061095a610fba366004615b53565b6129e0565b348015610fca575f5ffd5b50602954610994565b348015610fde575f5ffd5b5061095a610fed366004615a53565b612a6e565b348015610ffd575f5ffd5b5061099460285481565b348015611012575f5ffd5b5061099460305481565b348015611027575f5ffd5b5061095a611036366004615934565b612af1565b348015611046575f5ffd5b5061099460315481565b34801561105b575f5ffd5b5061099460205481565b348015611070575f5ffd5b5061095a61107f36600461583e565b612b77565b34801561108f575f5ffd5b5061099461109e36600461588a565b612ba5565b3480156110ae575f5ffd5b5061095a6110bd366004615934565b612bd0565b3480156110cd575f5ffd5b50610994602e5481565b3480156110e2575f5ffd5b505f546001600160a01b0316610a9d565b3480156110fe575f5ffd5b5061099461110d366004615934565b60266020525f908152604090205481565b348015611129575f5ffd5b5061095a61113836600461583e565b612c32565b348015611148575f5ffd5b506109fc611157366004615934565b60216020525f908152604090205460ff1681565b348015611176575f5ffd5b5061099460275481565b34801561118b575f5ffd5b506109bb612cac565b34801561119f575f5ffd5b5061095a6111ae36600461583e565b612cbb565b3480156111be575f5ffd5b5061099460105481565b3480156111d3575f5ffd5b50600554610a9d906001600160a01b031681565b3480156111f2575f5ffd5b5061095a61120136600461583e565b612ce9565b348015611211575f5ffd5b5061099460175481565b348015611226575f5ffd5b5061099460245481565b34801561123b575f5ffd5b50610a9d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561126e575f5ffd5b5061095a61127d36600461583e565b612d17565b34801561128d575f5ffd5b5061095a61129c36600461588a565b612d45565b3480156112ac575f5ffd5b5061095a6112bb366004615901565b612d91565b3480156112cb575f5ffd5b506109fc6112da36600461588a565b612de4565b3480156112ea575f5ffd5b50610a9d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561131d575f5ffd5b5061095a612df0565b348015611331575f5ffd5b5061095a611340366004615a53565b612f39565b348015611350575f5ffd5b50610b4661135f366004615934565b612fbc565b34801561136f575f5ffd5b5061095a61137e366004615934565b613121565b34801561138e575f5ffd5b50610a9d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156113c1575f5ffd5b506113d56113d0366004615934565b613180565b6040805192835260208301919091520161099e565b3480156113f5575f5ffd5b5061095a611404366004615b95565b613246565b348015611414575f5ffd5b50610a9d7f000000000000000000000000000000000000000000000000000000000000000081565b348015611447575f5ffd5b5061099460115481565b34801561145c575f5ffd5b5061099460155481565b348015611471575f5ffd5b5061099460145481565b348015611486575f5ffd5b506114cd61149536600461583e565b601d6020525f90815260409020805460018201546002830154600384015460049094015492936001600160a01b039092169290919085565b604080519586526001600160a01b039094166020860152928401919091526060830152608082015260a00161099e565b348015611508575f5ffd5b50610994601f5481565b34801561151d575f5ffd5b50610a9d7f000000000000000000000000000000000000000000000000000000000000000081565b348015611550575f5ffd5b506019546109fc9060ff1681565b348015611569575f5ffd5b5061099460255481565b34801561157e575f5ffd5b5061095a61158d36600461588a565b6132ee565b34801561159d575f5ffd5b5061095a6115ac366004615901565b613332565b3480156115bc575f5ffd5b5061095a6115cb366004615901565b613385565b3480156115db575f5ffd5b50610a9d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561160e575f5ffd5b50610994602d5481565b348015611623575f5ffd5b50610994611632366004615c53565b6001600160a01b039182165f90815260036020908152604080832093909416825291909152205490565b348015611667575f5ffd5b50610a9d61167636600461583e565b6133d8565b348015611686575f5ffd5b50610a9d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156116b9575f5ffd5b5061095a6116c8366004615b95565b613400565b3480156116d8575f5ffd5b50600454610a9d906001600160a01b031681565b3480156116f7575f5ffd5b5061099460345481565b34801561170c575f5ffd5b50602254610a9d9061010090046001600160a01b031681565b348015611730575f5ffd5b5061099461173f366004615934565b602a6020525f908152604090205481565b34801561175b575f5ffd5b5061095a61176a366004615934565b61348e565b34801561177a575f5ffd5b5061095a611789366004615a95565b61354b565b348015611799575f5ffd5b5061095a6117a836600461583e565b613587565b3480156117b8575f5ffd5b5061099460335481565b6002600154036117e557604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b6001600160a01b03165f9081526002602052604090205490565b60225460405163d216ce6f60e01b81526001600160a01b0384811660048301525f9283926101009091049091169063d216ce6f90602401602060405180830381865afa158015611858573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187c91906157fd565b90505f60015b600281116119d05760016002829003611899575060035b6001600160a01b038416158015906118cb57506001600160a01b0384165f908152601860205260409020600101548111155b15611948575f6127106118e06103e8896157b3565b6118ea91906157ca565b90506118f685826135b5565b60408051828152602081018590526001600160a01b038716917fdffeb6900509415706ebc13fa86d33bacd4baca3b43e39453b8f45a45cb5d15d910160405180910390a26119448185615818565b9350505b60225460405163d216ce6f60e01b81526001600160a01b0386811660048301526101009092049091169063d216ce6f90602401602060405180830381865afa158015611996573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ba91906157fd565b93505080806119c890615c8a565b915050611882565b509150505b92915050565b601c80545f91829190826119ee83615c8a565b909155505f818152601d60209081526040808320848155600180820180546001600160a01b0319166001600160a01b038d16908117909155600283018b9055600383018a90554260048401558552601e845291842080549283018155845291832001839055601f80549394509092879290611a6a908490615818565b925050819055508360205f828254611a829190615818565b909155505060408051868152600160208201526001600160a01b0388169184917f344ad405b0b98b29a98eb38fa0a381a285a1b7c252889a6bff15416247c03b00910160405180910390a350949350505050565b5f546001600160a01b03163314611b085760405162461bcd60e51b8152600401611aff90615ca2565b60405180910390fd5b602f55565b606060078054611b1c90615cbe565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4890615cbe565b8015611b935780601f10611b6a57610100808354040283529160200191611b93565b820191905f5260205f20905b815481529060010190602001808311611b7657829003601f168201915b5050505050905090565b5f611ba9338484613664565b50600192915050565b5f546001600160a01b03163314611bdb5760405162461bcd60e51b8152600401611aff90615ca2565b603455565b5f546001600160a01b03163314611c095760405162461bcd60e51b8152600401611aff90615ca2565b611c148383836136c5565b505050565b5f546001600160a01b03163314611c425760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b03919091165f908152602b60205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314611c955760405162461bcd60e51b8152600401611aff90615ca2565b602755565b5f546001600160a01b03163314611cc35760405162461bcd60e51b8152600401611aff90615ca2565b5f8111611d125760405162461bcd60e51b815260206004820152601b60248201527f4d696e20616d6f756e74206d75737420626520706f73697469766500000000006044820152606401611aff565b678ac7230489e80000811115611d605760405162461bcd60e51b815260206004820152601360248201527209ad2dc40c2dadeeadce840e8dede40d0d2ced606b1b6044820152606401611aff565b601a55565b5f546001600160a01b03163314611d8e5760405162461bcd60e51b8152600401611aff90615ca2565b601392909255601455601555565b43602f54602e54611dad9190615818565b1115611db65750565b602d546040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015282917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015611e41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e659190615cf0565b1015611e6f575050565b6040516370a0823160e01b815261dead60048201527f0000000000000000000000000000000000000000000000000000000000000000905f906001600160a01b038316906370a0823190602401602060405180830381865afa158015611ed7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611efb9190615cf0565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f37573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f5b9190615cf0565b611f65919061582b565b9050805f03611f745750505050565b6029545f90819081908180805a6030549091505b8b84108015611f9657508483105b156121805784602c5410611fa9575f602c555b6029602c5481548110611fbe57611fbe615d07565b5f9182526020808320909101546001600160a01b0316808352602b90915260409091205490985060ff1661213f576040516370a0823160e01b81526001600160a01b0389811660048301528b16906370a0823190602401602060405180830381865afa158015612030573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120549190615cf0565b6001600160a01b0389165f908152601860205260409020549097508781101561207b578097505b81881061213d578961208d898e6157b3565b61209791906157ca565b9650861561213d5760405163092dfdb360e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063125bfb669061210f907f0000000000000000000000000000000000000000000000000000000000000000908d908c90600401615d1b565b5f604051808303815f87803b158015612126575f5ffd5b505af1158015612138573d5f5f3e3d5ffd5b505050505b505b5a61214a908361582b565b6121549085615818565b93505a602c80549193505f61216883615c8a565b9190505550828061217890615c8a565b935050611f88565b505043602e5550505050505050505050565b5f546001600160a01b031633146121bb5760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b03919091165f908152602160205260409020805460ff1916911515919091179055565b5f6121f1848484613772565b6001600160a01b0384165f9081526003602090815260408083203384529091529020545f191461226d576001600160a01b0384165f90815260036020908152604080832033845290915290205461224990839061582b565b6001600160a01b0385165f9081526003602090815260408083203384529091529020555b5060019392505050565b5f546001600160a01b031633146122a05760405162461bcd60e51b8152600401611aff90615ca2565b601092909255601155601255565b5f546001600160a01b031633146122d75760405162461bcd60e51b8152600401611aff90615ca2565b5f5b8251811015611c145781600b5f8584815181106122f8576122f8615d07565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff19169115159190911790556001016122d9565b5f546001600160a01b0316331461235a5760405162461bcd60e51b8152600401611aff90615ca2565b6022805460ff1916911515919091179055565b5f5f612377613bb3565b90506024548110156123da576024545f90612392838261582b565b61239c905f6157b3565b6123a691906157ca565b905060058111156123c9576123bc60058261582b565b6123c6905f6157b3565b90505b60198111156119d557505f92915050565b5f91505090565b5f546001600160a01b0316331461240a5760405162461bcd60e51b8152600401611aff90615ca2565b5f81116124595760405162461bcd60e51b815260206004820181905260248201527f546f6b656e7320706572206d696e74206d75737420626520706f7369746976656044820152606401611aff565b601b55565b5f546001600160a01b031633146124875760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b0381166124d65760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420696e76697465206164647265737360501b6044820152606401611aff565b602280546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0381165f908152601e602090815260409182902080548351818402810184019094528084526060939283018282801561255b57602002820191905f5260205f20905b815481526020019060010190808311612547575b50505050509050919050565b5f546001600160a01b031633146125905760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b602254604051630f95592960e01b81526001600160a01b0383811660048301526060925f9261010090910490911690630f955929906024015f60405180830381865afa15801561260c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126339190810190615d3f565b90505f815167ffffffffffffffff81111561265057612650615978565b6040519080825280602002602001820160405280156126b157816020015b61269e60405180608001604052805f6001600160a01b031681526020015f81526020015f81526020015f81525090565b81526020019060019003908161266e5790505b5090505f5b82518110156127cd575f8382815181106126d2576126d2615d07565b6020908102919091018101516001600160a01b038082165f81815260188552604090819020815160608101835281548152600182015481880152600290910154818301528151608081018352838152602254925163d3346ff360e01b8152600481019490945294965094840192610100909104169063d3346ff390602401602060405180830381865afa15801561276b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278f9190615cf0565b81526020018260200151815260200182604001518152508484815181106127b8576127b8615d07565b602090810291909101015250506001016126b6565b509392505050565b5f546001600160a01b031633146127fe5760405162461bcd60e51b8152600401611aff90615ca2565b601654156128385760405162461bcd60e51b815260206004820152600760248201526674726164696e6760c81b6044820152606401611aff565b43601655426032555f61284a816117ec565b905080156128f7576006546001600160a01b03165f908152600260205260408120805483929061287b908490615818565b90915550505f80805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b80548392906128ba90849061582b565b909155505060405181815233905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b50565b5f546001600160a01b031633146129235760405162461bcd60e51b8152600401611aff90615ca2565b5f5b8251811015611c14578160265f85848151811061294457612944615d07565b6020908102919091018101516001600160a01b031682528101919091526040015f2055600101612925565b5f546001600160a01b031633146129985760405162461bcd60e51b8152600401611aff90615ca2565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b03163314612a095760405162461bcd60e51b8152600401611aff90615ca2565b81515f80805b83811015612a6657858181518110612a2957612a29615d07565b6020908102919091018101516001600160a01b0381165f908152601890925260409091208681559093509150612a5e83613c22565b600101612a0f565b505050505050565b5f546001600160a01b03163314612a975760405162461bcd60e51b8152600401611aff90615ca2565b5f5b8251811015611c145781600c5f858481518110612ab857612ab8615d07565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101612a99565b5f546001600160a01b03163314612b1a5760405162461bcd60e51b8152600401611aff90615ca2565b600580546001600160a01b0319166001600160a01b0383169081179091555f908152600a60205260409020805460ff19166001179055612b5c60025f196157ca565b6001600160a01b039091165f90815260186020526040902055565b5f546001600160a01b03163314612ba05760405162461bcd60e51b8152600401611aff90615ca2565b603255565b601e602052815f5260405f208181548110612bbe575f80fd5b905f5260205f20015f91509150505481565b5f546001600160a01b03163314612bf95760405162461bcd60e51b8152600401611aff90615ca2565b600480546001600160a01b039092166001600160a01b0319909216821790555f908152600a60205260409020805460ff19166001179055565b5f546001600160a01b03163314612c5b5760405162461bcd60e51b8152600401611aff90615ca2565b62030d408110158015612c715750621e84808111155b612ca75760405162461bcd60e51b815260206004820152600760248201526632302d3230307760c81b6044820152606401611aff565b602855565b606060088054611b1c90615cbe565b5f546001600160a01b03163314612ce45760405162461bcd60e51b8152600401611aff90615ca2565b603055565b5f546001600160a01b03163314612d125760405162461bcd60e51b8152600401611aff90615ca2565b603155565b5f546001600160a01b03163314612d405760405162461bcd60e51b8152600401611aff90615ca2565b603355565b5f546001600160a01b03163314612d6e5760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b0382165f908152601860205260409020818155611c1483613c22565b5f546001600160a01b03163314612dba5760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b03919091165f908152600e60205260409020805460ff1916911515919091179055565b5f611ba9338484613772565b6032545f03612dfb57565b6032544290612e0d90610e1090615818565b811015612e175750565b7f00000000000000000000000000000000000000000000000000000000000000005f612e42826117ec565b90505f610e1060325485612e56919061582b565b612e6091906157ca565b90506004811115612e6f575060045b5f8161271060315485612e8291906157b3565b612e8c91906157ca565b612e9691906157b3565b90508015612efa57612eab8461dead83613cee565b836001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612ee3575f5ffd5b505af1158015612ef5573d5f5f3e3d5ffd5b505050505b60328590556040518181527fa1c30866d8ffe3581bd782f244445925589b8b2949ab06a65e29ab03e89271ce9060200160405180910390a15050505050565b5f546001600160a01b03163314612f625760405162461bcd60e51b8152600401611aff90615ca2565b5f5b8251811015611c145781600a5f858481518110612f8357612f83615d07565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101612f64565b5f5f5f612fc884613180565b90935091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169085160361308f576040516370a0823160e01b81526001600160a01b0385811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613064573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130889190615cf0565b905061311a565b6040516370a0823160e01b81526001600160a01b0385811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156130f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131179190615cf0565b90505b9193909250565b5f546001600160a01b0316331461314a5760405162461bcd60e51b8152600401611aff90615ca2565b6040516001600160a01b038216904780156108fc02915f818181858888f1935050505015801561317c573d5f5f3e3d5ffd5b5050565b5f5f5f8390505f5f826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156131c4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131e89190615def565b506001600160701b0391821693501690507f0000000000000000000000000000000000000000000000000000000000000000306001600160a01b03821610156132365782955081945061323d565b8195508294505b50505050915091565b5f546001600160a01b0316331461326f5760405162461bcd60e51b8152600401611aff90615ca2565b81515f80805b83811015612a665785818151811061328f5761328f615d07565b6020026020010151925060185f846001600160a01b03166001600160a01b031681526020019081526020015f2091508481815181106132d0576132d0615d07565b602090810291909101015182556132e683613c22565b600101613275565b5f546001600160a01b031633146133175760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b039091165f90815260266020526040902055565b5f546001600160a01b0316331461335b5760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b5f546001600160a01b031633146133ae5760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b602981815481106133e7575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f546001600160a01b031633146134295760405162461bcd60e51b8152600401611aff90615ca2565b5f5b8251811015611c145781818151811061344657613446615d07565b602002602001015160265f85848151811061346357613463615d07565b6020908102919091018101516001600160a01b031682528101919091526040015f205560010161342b565b5f546001600160a01b031633146134b75760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b0381166134f25760405162461bcd60e51b815260206004820152600260248201526106e360f41b6044820152606401611aff565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b031633146135745760405162461bcd60e51b8152600401611aff90615ca2565b6019805460ff1916911515919091179055565b5f546001600160a01b031633146135b05760405162461bcd60e51b8152600401611aff90615ca2565b602d55565b604080515f808252602082019092526001600160a01b0384169083906040516135de9190615e3b565b5f6040518083038185875af1925050503d805f8114613618576040519150601f19603f3d011682016040523d82523d5f602084013e61361d565b606091505b5050905080611c145760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401611aff565b6001600160a01b038381165f8181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f928392908716916137209190615e3b565b5f604051808303815f865af19150503d805f8114613759576040519150601f19603f3d011682016040523d82523d5f602084013e61375e565b606091505b5091509150818015612a6657505050505050565b6001600160a01b0383165f908152600c602052604090205460ff1615806137b057506001600160a01b0383165f908152600a602052604090205460ff165b806137d257506001600160a01b0383165f908152600e602052604090205460ff165b61380a5760405162461bcd60e51b8152602060048201526009602482015268189b1858dad31a5cdd60ba1b6044820152606401611aff565b5f613814846117ec565b90508181101561384c5760405162461bcd60e51b8152602060048201526003602482015262424e4560e81b6044820152606401611aff565b613854613d34565b6001600160a01b0383165f908152600e6020526040812054329190819060ff16801561388e5750335f9081526021602052604090205460ff165b80156138ab5750866001600160a01b0316836001600160a01b0316145b15613932576138ba8686613db8565b90505f811180156138fc57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316145b15613932576001600160a01b0383165f90815260186020526040812080549093508291849161392c908490615818565b90915550505b6001600160a01b0387165f908152600e602052604081205460ff1615613a125761395c8887613e22565b90505f8111801561399e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316886001600160a01b0316145b15613a12576001600160a01b0384165f908152600a602052604090205460ff16613a12576001600160a01b0384165f908152601860205260409020548111156139e5575f5ffd5b6001600160a01b0384165f9081526018602052604081208054839290613a0c90849061582b565b90915550505b6001600160a01b0388165f908152600e602052604081205460ff1680613a4f57506001600160a01b0388165f908152600e602052604090205460ff165b15613b26576017545f03613a8e576001600160a01b0389165f908152600a602052604090205460ff168015613a845750601754155b15613a8e57436017555b6001600160a01b0389165f908152600a602052604090205460ff16158015613ace57506001600160a01b0388165f908152600a602052604090205460ff16155b15613b2657600190506016545f03613b26576017545f108015613af057505f83115b613b265760405162461bcd60e51b815260206004820152600760248201526637379037b832b760c91b6044820152606401611aff565b613b34898989848787613f29565b6001600160a01b0389163014613ba8575f83118015613b8457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316886001600160a01b0316145b15613b9757613b9289613c22565b613ba8565b8015613ba857613ba8602854611d9c565b505050505050505050565b5f5f5f613bdf7f0000000000000000000000000000000000000000000000000000000000000000612fbc565b5090925090505f613bf082846157b3565b1115613c1a5780613c0983670de0b6b3a76400006157b3565b613c1391906157ca565b9250505090565b5f9250505090565b6001600160a01b0381165f908152602a602052604081205490036128f7576029541580613c7e5750806001600160a01b031660295f81548110613c6757613c67615d07565b5f918252602090912001546001600160a01b031614155b156128f757803b8015613c8f575050565b50602980546001600160a01b0383165f818152602a60205260408120839055600183018455929092527fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181caac0180546001600160a01b031916909117905550565b6001600160a01b0383165f90815260026020526040902054613d1190829061582b565b6001600160a01b0384165f90815260026020526040902055611c14838383613ff9565b6016545f03613d3f57565b6025545f9062015180613d528242615818565b613d5c91906157ca565b613d6990620151806157b3565b613d73919061582b565b90508042106128f7575f613d8a62015180836157ca565b90505f613d95613bb3565b905060235482118015613da757505f81115b15611c145760239190915560245550565b5f5f5f5f613dc586612fbc565b9250925092505f5f84118015613dda57505f83115b15613df75782613dea85886157b3565b613df491906157ca565b90505b613e018185615818565b8210613e1857613e14878388878761406f565b5094505b5050505092915050565b5f5f5f5f613e2f86612fbc565b92509250925082811015613ecc5784613e47876117ec565b613e51919061582b565b866001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e8d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613eb19190615cf0565b613ebb90876157b3565b613ec591906157ca565b9350613f20565b60225460ff1615613f20575f5f84118015613ee657505f83115b15613e1857613ef5868461582b565b613eff85886157b3565b613f0991906157ca565b9050613f158482615818565b821015613e18575f5ffd5b50505092915050565b6001600160a01b0386165f9081526002602052604081208054869290613f5090849061582b565b909155508490505f613f62888361449c565b91508415613fdb575f5f613f798a8a8689896144f1565b91509150819250808015613f905750600f5460ff16155b15613fd8575f613fa8613fa3848761582b565b6145b9565b90508015613fc657613fba8185615818565b9350613fc68b826147ce565b613fce614874565b613fd6612df0565b505b50505b613fef8888613fea848661582b565b613ff9565b5050505050505050565b6001600160a01b0382165f9081526002602052604090205461401c908290615818565b6001600160a01b038084165f8181526002602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906136b89085815260200190565b5f5f5f876001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d29190615cf0565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614131573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061415591906157fd565b6001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015614190573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141b491906157fd565b90505f5f6001600160a01b0316826001600160a01b0316141590505f8a6001600160a01b0316637464fc3d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561420c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142309190615cf0565b90508115614423578015614423575f61425161424c898b6157b3565b6148d4565b90505f61425d836148d4565b905080821115614420575f807310ed43c718714eb63d5aa57b78b54704e256024d197f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316016142f6576142b8838561582b565b6142c290896157b3565b6142cd9060086157b3565b91506142da8360086157b3565b6142e58560116157b3565b6142ef9190615818565b90506143fe565b73d99d1c33f9fc3444f8101754abc46c52416550d0197f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03160161435d57614345838561582b565b61434f90896157b3565b9150826142e58560036157b3565b73e9d6f80028671279a28790bb4007b10b0595def0197f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316016143cf576143ac838561582b565b6143b690896157b3565b6143c19060036157b3565b9150826142e58560056157b3565b6143d9838561582b565b6143e390896157b3565b9150826143f18560056157b3565b6143fb9190615818565b90505b61440881836157ca565b9850881561441d5761441a8989615818565b97505b50505b50505b5f61442e898c61582b565b9050845f03614458576103e861444761424c8c846157b3565b614451919061582b565b965061448d565b61448a8961446687846157b3565b61447091906157ca565b8961447b888e6157b3565b61448591906157ca565b614942565b96505b50505050509550959350505050565b5f5f6034546033546144ae91906157b3565b90508083101580156144c957506001600160a01b0384163014155b156144e9576144d784614959565b6144e1818461582b565b9150506119d5565b509092915050565b5f5f5f84118061450057505f83115b1561450f57505f9050806145af565b61453660405180608001604052805f81526020015f81526020015f81526020015f81525090565b6001600160a01b0388165f908152600e602052604090205460ff16156145705761456087876149e3565b905061456b86614a8d565b6145a1565b6001600160a01b0387165f908152600e602052604090205460ff16156145a15761459a8887614c0a565b9050600191505b6145ab8882614cdd565b9250505b9550959350505050565b6040805160028082526060820183525f9232928492909160208301908036833701905050905030815f815181106145f2576145f2615d07565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061464657614646615d07565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81525f917f0000000000000000000000000000000000000000000000000000000000000000169063d06ca61f906146a49088908690600401615e94565b5f60405180830381865afa1580156146be573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526146e59190810190615eb4565b90505f81600183516146f7919061582b565b8151811061470757614707615d07565b6020908102919091018101516001600160a01b0386165f908152602690925260408220549092509081831115614796576001600160a01b0386165f90815260266020526040812055614759828461582b565b90505f83614767838b6157b3565b61477191906157ca565b90506127106027548261478491906157b3565b61478e91906157ca565b9750506147c3565b6001600160a01b0386165f90815260266020526040812080548592906147bd90849061582b565b90915550505b505050505050919050565b61480c827f0000000000000000000000000000000000000000000000000000000000000000612710614802856103e86157b3565b613fea91906157ca565b614840827f0000000000000000000000000000000000000000000000000000000000000000612710614802856105dc6157b3565b61317c827f000000000000000000000000000000000000000000000000000000000000000061271061480285611d4c6157b3565b600f805460ff191660011790555f61488a614de2565b905080608001515f0361489d57506148c8565b5f6148ab826080015161506b565b9050805f036148bb5750506148c8565b6148c58282615331565b50505b600f805460ff19169055565b5f60038211156149335750805f6148ec6002836157ca565b6148f7906001615818565b90505b8181101561492d5790508060028161491281866157ca565b61491c9190615818565b61492691906157ca565b90506148fa565b50919050565b811561493d575060015b919050565b5f8183106149505781614952565b825b9392505050565b5f5b60345481101561317c575f61496f82615463565b90506001600160a01b038116158061499157506001600160a01b03811661dead145b806149ad5750826001600160a01b0316816001600160a01b0316145b806149c157505f816001600160a01b03163b115b156149cc57506149db565b6149d98382603354613ff9565b505b60010161495b565b614a0a60405180608001604052805f81526020015f81526020015f81526020015f81525090565b61271060105483614a1b91906157b3565b614a2591906157ca565b6040808301919091526001600160a01b0384165f908152600b602052205460ff166119d55761271060125483614a5b91906157b3565b614a6591906157ca565b815260115461271090614a7890846157b3565b614a8291906157ca565b602082015292915050565b6040805160028082526060820183525f926020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110614ae057614ae0615d07565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110614b1457614b14615d07565b6001600160a01b0392831660209182029290920101526040516307c0329d60e21b81525f917f00000000000000000000000000000000000000000000000000000000000000001690631f00ca7490614b729086908690600401615e94565b5f60405180830381865afa158015614b8c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052614bb39190810190615eb4565b9050805f81518110614bc757614bc7615d07565b602002602001015160265f326001600160a01b03166001600160a01b031681526020019081526020015f205f828254614c009190615818565b9091555050505050565b614c3160405180608001604052805f81526020015f81526020015f81526020015f81525090565b61271060135483614c4291906157b3565b614c4c91906157ca565b6040808301919091526001600160a01b0384165f908152600b602052205460ff16614caf5761271060155483614c8291906157b3565b614c8c91906157ca565b815260145461271090614c9f90846157b3565b614ca991906157ca565b60208201525b5f614cb861236d565b9050612710614cc782856157b3565b614cd191906157ca565b60608301525092915050565b80515f9015614d04578151614cf29082615818565b9050614d048361dead845f0151613ff9565b602082015115614d4e576020820151614d1d9082615818565b9050614d4e837f00000000000000000000000000000000000000000000000000000000000000008460200151613ff9565b604082015115614d98576040820151614d679082615818565b9050614d98837f00000000000000000000000000000000000000000000000000000000000000008460400151613ff9565b6060820151156119d5576060820151614db19082615818565b90506119d5837f00000000000000000000000000000000000000000000000000000000000000008460600151613ff9565b614e0f6040518060a001604052805f81526020015f81526020015f81526020015f81526020015f81525090565b614e387f00000000000000000000000000000000000000000000000000000000000000006117ec565b80825215614ed257805160405163092dfdb360e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163125bfb6691614e91913091829190600401615d1b565b5f604051808303815f87803b158015614ea8575f5ffd5b505af1158015614eba573d5f5f3e3d5ffd5b50508251614ecc9250600291506157ca565b60208201525b614efb7f00000000000000000000000000000000000000000000000000000000000000006117ec565b6040820181905215614f8957604080820151905163092dfdb360e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163125bfb6691614f5b913091829190600401615d1b565b5f604051808303815f87803b158015614f72575f5ffd5b505af1158015614f84573d5f5f3e3d5ffd5b505050505b614fb27f00000000000000000000000000000000000000000000000000000000000000006117ec565b606082018190521561504057606081015160405163092dfdb360e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163125bfb6691615012913091829190600401615d1b565b5f604051808303815f87803b158015615029575f5ffd5b505af115801561503b573d5f5f3e3d5ffd5b505050505b8060600151816040015182602001516150599190615818565b6150639190615818565b608082015290565b5f815f0361507a57505f919050565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106150ad576150ad615d07565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061510157615101615d07565b60200260200101906001600160a01b031690816001600160a01b0316815250505f61512b846154c1565b90506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635c11d7958583857f000000000000000000000000000000000000000000000000000000000000000061518c4261012c615818565b6040518663ffffffff1660e01b81526004016151ac959493929190615f3b565b5f604051808303815f87803b1580156151c3575f5ffd5b505af19250505080156151d4575060015b6151e157505f9392505050565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015615265573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906152899190615cf0565b9250821561532a5760405163092dfdb360e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063125bfb6690615301907f00000000000000000000000000000000000000000000000000000000000000009030908890600401615d1b565b5f604051808303815f87803b158015615318575f5ffd5b505af11580156147c3573d5f5f3e3d5ffd5b5050919050565b80158061534057506080820151155b15615349575050565b602082015115615385575f826080015183602001518361536991906157b3565b61537391906157ca565b905061538381846020015161559f565b505b6040820151156153fe575f82608001518360400151836153a591906157b3565b6153af91906157ca565b90506153fc7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000836136c5565b505b60608201511561317c575f826080015183606001518361541e91906157b3565b61542891906157ca565b600454909150611c14907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0316836136c5565b5f424433846040516020016154a39493929190938452602084019290925260601b6bffffffffffffffffffffffff19166040830152605482015260740190565b60408051601f19818403018152919052805160209091012092915050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d06ca61f836154fa6156f5565b6040518363ffffffff1660e01b8152600401615517929190615e94565b5f60405180830381865afa92505050801561555357506040513d5f823e601f3d908101601f191682016040526155509190810190615eb4565b60015b15615598576002815110615596576127108160018151811061557757615577615d07565b602002602001015161232861558c91906157b3565b61495291906157ca565b505b505f919050565b5f6127106155af8461251c6157b3565b6155b991906157ca565b90505f6127106155cb8461251c6157b3565b6155d591906157ca565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e8e337007f0000000000000000000000000000000000000000000000000000000000000000308787878760055f9054906101000a90046001600160a01b03164261012c61564f9190615818565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303815f875af19250505080156156e6575060408051601f3d908101601f191682019092526156e391810190615f76565b60015b156156ef575050505b50505050565b604080516002808252606080830184529260208301908036833701905050905030815f8151811061572857615728615d07565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061577c5761577c615d07565b60200260200101906001600160a01b031690816001600160a01b03168152505090565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176119d5576119d561579f565b5f826157e457634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03811681146128f7575f5ffd5b5f6020828403121561580d575f5ffd5b8151614952816157e9565b808201808211156119d5576119d561579f565b818103818111156119d5576119d561579f565b5f6020828403121561584e575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f6040838503121561589b575f5ffd5b82356158a6816157e9565b946020939093013593505050565b5f5f5f606084860312156158c6575f5ffd5b83356158d1816157e9565b925060208401356158e1816157e9565b929592945050506040919091013590565b8035801515811461493d575f5ffd5b5f5f60408385031215615912575f5ffd5b823561591d816157e9565b915061592b602084016158f2565b90509250929050565b5f60208284031215615944575f5ffd5b8135614952816157e9565b5f5f5f60608486031215615961575f5ffd5b505081359360208301359350604090920135919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156159b5576159b5615978565b604052919050565b5f67ffffffffffffffff8211156159d6576159d6615978565b5060051b60200190565b5f82601f8301126159ef575f5ffd5b8135615a026159fd826159bd565b61598c565b8082825260208201915060208360051b860101925085831115615a23575f5ffd5b602085015b83811015615a49578035615a3b816157e9565b835260209283019201615a28565b5095945050505050565b5f5f60408385031215615a64575f5ffd5b823567ffffffffffffffff811115615a7a575f5ffd5b615a86858286016159e0565b92505061592b602084016158f2565b5f60208284031215615aa5575f5ffd5b614952826158f2565b602080825282518282018190525f918401906040840190835b81811015615ae5578351835260209384019390920191600101615ac7565b509095945050505050565b602080825282518282018190525f918401906040840190835b81811015615ae557835180516001600160a01b0316845260208082015181860152604080830151908601526060918201519185019190915290930192608090920191600101615b09565b5f5f60408385031215615b64575f5ffd5b823567ffffffffffffffff811115615b7a575f5ffd5b615b86858286016159e0565b95602094909401359450505050565b5f5f60408385031215615ba6575f5ffd5b823567ffffffffffffffff811115615bbc575f5ffd5b615bc8858286016159e0565b925050602083013567ffffffffffffffff811115615be4575f5ffd5b8301601f81018513615bf4575f5ffd5b8035615c026159fd826159bd565b8082825260208201915060208360051b850101925087831115615c23575f5ffd5b6020840193505b82841015615c45578335825260209384019390910190615c2a565b809450505050509250929050565b5f5f60408385031215615c64575f5ffd5b8235615c6f816157e9565b91506020830135615c7f816157e9565b809150509250929050565b5f60018201615c9b57615c9b61579f565b5060010190565b602080825260029082015261216f60f01b604082015260600190565b600181811c90821680615cd257607f821691505b60208210810361492d57634e487b7160e01b5f52602260045260245ffd5b5f60208284031215615d00575f5ffd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60208284031215615d4f575f5ffd5b815167ffffffffffffffff811115615d65575f5ffd5b8201601f81018413615d75575f5ffd5b8051615d836159fd826159bd565b8082825260208201915060208360051b850101925086831115615da4575f5ffd5b6020840193505b82841015615dcf578351615dbe816157e9565b825260209384019390910190615dab565b9695505050505050565b80516001600160701b038116811461493d575f5ffd5b5f5f5f60608486031215615e01575f5ffd5b615e0a84615dd9565b9250615e1860208501615dd9565b9150604084015163ffffffff81168114615e30575f5ffd5b809150509250925092565b5f82518060208501845e5f920191825250919050565b5f8151808452602084019350602083015f5b82811015615e8a5781516001600160a01b0316865260209586019590910190600101615e63565b5093949350505050565b828152604060208201525f615eac6040830184615e51565b949350505050565b5f60208284031215615ec4575f5ffd5b815167ffffffffffffffff811115615eda575f5ffd5b8201601f81018413615eea575f5ffd5b8051615ef86159fd826159bd565b8082825260208201915060208360051b850101925086831115615f19575f5ffd5b6020840193505b82841015615dcf578351825260209384019390910190615f20565b85815284602082015260a060408201525f615f5960a0830186615e51565b6001600160a01b0394909416606083015250608001529392505050565b5f5f5f60608486031215615f88575f5ffd5b505081516020830151604090930151909492935091905056fea2646970667358221220210e073aeba2eb0efdac110d3def03f1d73aa85eedc4498f5eeac2e523cb49f764736f6c634300082200336080604052348015600e575f5ffd5b50335f908152602081905260408082208054600160ff19918216811790925532845291832080549092161790556101bc90819061004a90395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063125bfb661461002d575b5f5ffd5b61004061003b366004610137565b610042565b005b335f9081526020819052604090205460ff161561006457610064838383610069565b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f928392908716916100c49190610170565b5f604051808303815f865af19150503d805f81146100fd576040519150601f19603f3d011682016040523d82523d5f602084013e610102565b606091505b509150915081801561011457505f8151115b505050505050565b80356001600160a01b0381168114610132575f5ffd5b919050565b5f5f5f60608486031215610149575f5ffd5b6101528461011c565b92506101606020850161011c565b9150604084013590509250925092565b5f82518060208501845e5f92019182525091905056fea264697066735822122001f0d774e2f1a005952cb4c6c5f48538b12bd5a62aa671295106fc7f33b2953064736f6c634300082200338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x608060405260043610610681575f3560e01c806383b78ba81161034f578063b95bc800116101c8578063dce17484116100fd578063e952f74f1161009d578063f2fde38b11610078578063f2fde38b14611750578063f46a04eb1461176f578063f53dabb61461178e578063fc2ea8a5146117ad575f5ffd5b8063e952f74f146116ec578063eec30bfd14611701578063ef34db6914611725575f5ffd5b8063de5c02c2116100d8578063de5c02c21461165c578063de9d6d591461167b578063e42121d0146116ae578063e82bef29146116cd575f5ffd5b8063dce17484146115d0578063dd55c10814611603578063dd62ed3e14611618575f5ffd5b8063ce2a9f6211610168578063d555654411610143578063d55565441461155e578063d5b2671814611573578063d83d414314611592578063d92afd81146115b1575f5ffd5b8063ce2a9f62146114fd578063cff69fa114611512578063d123973014611545575f5ffd5b8063c733da3b116101a3578063c733da3b1461143c578063c822919d14611451578063c912cc4614611466578063cbb6ae3e1461147b575f5ffd5b8063b95bc800146113b6578063c2f0c04d146113ea578063c641baa314611409575f5ffd5b80639b4eaff31161029e578063a9059cbb1161023e578063b2887bec11610219578063b2887bec14611326578063b340364f14611345578063b633e4cd14611364578063b7352a1914611383575f5ffd5b8063a9059cbb146112c0578063abae7e65146112df578063af14052c14611312575f5ffd5b8063a28cc2b411610279578063a28cc2b414611230578063a5500c3014611263578063a5696d8914611282578063a8424861146112a1575f5ffd5b80639b4eaff3146111e75780639bb85344146112065780639d1b464a1461121b575f5ffd5b8063917ceeb51161030957806395d89b41116102e457806395d89b411461118057806397dad339146111945780639ac91660146111b35780639b4dc8cc146111c8575f5ffd5b8063917ceeb51461111e5780639358bd4f1461113d57806394516c7f1461116b575f5ffd5b806383b78ba814611065578063856652e91461108457806385dc3004146110a35780638b699a15146110c25780638da5cb5b146110d757806390a12580146110f3575f5ffd5b8063313ce567116104fb57806368092bd91161043057806374d002f1116103d057806379353c08116103ab57806379353c08146110075780637a351a1d1461101c5780637cb95d001461103b5780637d549e9914611050575f5ffd5b806374d002f114610fbf578063756b419014610fd357806378cc416d14610ff2575f5ffd5b80636cbbfd541161040b5780636cbbfd5414610f4e57806370a0823114610f6d578063715018a614610f8c5780637355b15b14610fa0575f5ffd5b806368092bd914610eef5780636999fa4514610f0e5780636c58080114610f3a575f5ffd5b8063546da5f61161049b5780635cab2c08116104765780635cab2c0814610e7a5780635d92528e14610e9957806361b746f214610eae57806363c69f0814610ec3575f5ffd5b8063546da5f614610e32578063553193ca14610e465780635ca8da1214610e5b575f5ffd5b806346c123b6116104d657806346c123b614610d9957806347705cbc14610db85780634838d16514610def5780634870ae2d14610e1d575f5ffd5b8063313ce56714610d2b5780633c34ff6314610d4c57806346b9315c14610d7a575f5ffd5b80631959a002116105d157806323b872dd116105715780632b01fc941161054c5780632b01fc9414610c7d5780632cc7596714610cab5780632e8474d514610cdf5780632f48ab7d14610cf8575f5ffd5b806323b872dd14610c2a57806325519cf214610c495780632a58b33014610c68575f5ffd5b80631d865c30116105ac5780631d865c3014610b9f5780631e1f1bcf14610bbe5780631f6cff0014610bec5780632171dcc914610c0b575f5ffd5b80631959a00214610b0c5780631d42848714610b615780631d85d79614610b80575f5ffd5b806311c3ec381161063c57806316fed3e21161061757806316fed3e214610a7e578063172979e414610ab557806318160ddd14610ae35780631924063e14610af7575f5ffd5b806311c3ec3814610a2b578063125bfb6614610a40578063141ae56614610a5f575f5ffd5b8062dbe8701461096057806301e9d7571461097f57806306fdde03146109a75780630807b9e2146109c8578063095ea7b3146109dd5780630dd696fe14610a0c575f5ffd5b3661095c5761068e6117c2565b3415610951576019545f90819060ff166106d35760405133903480156108fc02915f818181858888f193505050501580156106cb573d5f5f3e3d5ffd5b505050610951565b601a543410156107065760405133903480156108fc02915f818181858888f193505050501580156106cb573d5f5f3e3d5ffd5b601a5434601b5461071791906157b3565b61072191906157ca565b90508061072d5f6117ec565b101561075c5760405133903480156108fc02915f818181858888f193505050501580156106cb573d5f5f3e3d5ffd5b335f9081526018602052604081206002015490036108295760225460405163d216ce6f60e01b81523360048201525f9161010090046001600160a01b03169063d216ce6f90602401602060405180830381865afa1580156107bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e391906157fd565b90506001600160a01b03811615610827576001600160a01b0381165f9081526018602052604081206001908101805491929091610821908490615818565b90915550505b505b335f908152601860205260408120600201805434929061084a908490615818565b9091555061085a90503334611806565b91505f610867833461582b565b905080156108a8576006546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156108a6573d5f5f3e3d5ffd5b505b5f80805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b80548492906108e290849061582b565b9091555050335f9081526002602052604081208054849290610905908490615818565b909155505060405182815233905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361094c3334846119db565b505050505b61095a60018055565b005b5f5ffd5b34801561096b575f5ffd5b5061095a61097a36600461583e565b611ad6565b34801561098a575f5ffd5b50610994601a5481565b6040519081526020015b60405180910390f35b3480156109b2575f5ffd5b506109bb611b0d565b60405161099e9190615855565b3480156109d3575f5ffd5b50610994601b5481565b3480156109e8575f5ffd5b506109fc6109f736600461588a565b611b9d565b604051901515815260200161099e565b348015610a17575f5ffd5b5061095a610a2636600461583e565b611bb2565b348015610a36575f5ffd5b5061099460135481565b348015610a4b575f5ffd5b5061095a610a5a3660046158b4565b611be0565b348015610a6a575f5ffd5b5061095a610a79366004615901565b611c19565b348015610a89575f5ffd5b50600654610a9d906001600160a01b031681565b6040516001600160a01b03909116815260200161099e565b348015610ac0575f5ffd5b506109fc610acf366004615934565b600a6020525f908152604090205460ff1681565b348015610aee575f5ffd5b50600d54610994565b348015610b02575f5ffd5b5061099460325481565b348015610b17575f5ffd5b50610b46610b26366004615934565b60186020525f908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161099e565b348015610b6c575f5ffd5b5061095a610b7b36600461583e565b611c6c565b348015610b8b575f5ffd5b5061095a610b9a36600461583e565b611c9a565b348015610baa575f5ffd5b5061095a610bb936600461594f565b611d65565b348015610bc9575f5ffd5b506109fc610bd8366004615934565b600b6020525f908152604090205460ff1681565b348015610bf7575f5ffd5b5061095a610c0636600461583e565b611d9c565b348015610c16575f5ffd5b5061095a610c25366004615901565b612192565b348015610c35575f5ffd5b506109fc610c443660046158b4565b6121e5565b348015610c54575f5ffd5b5061095a610c6336600461594f565b612277565b348015610c73575f5ffd5b50610994601c5481565b348015610c88575f5ffd5b506109fc610c97366004615934565b602b6020525f908152604090205460ff1681565b348015610cb6575f5ffd5b50610994610cc5366004615934565b6001600160a01b03165f908152601e602052604090205490565b348015610cea575f5ffd5b506022546109fc9060ff1681565b348015610d03575f5ffd5b50610a9d7f00000000000000000000000055d398326f99059ff775485246999027b319795581565b348015610d36575f5ffd5b5060095460405160ff909116815260200161099e565b348015610d57575f5ffd5b506109fc610d66366004615934565b600e6020525f908152604090205460ff1681565b348015610d85575f5ffd5b5061095a610d94366004615a53565b6122ae565b348015610da4575f5ffd5b5061095a610db3366004615a95565b612331565b348015610dc3575f5ffd5b50610994610dd2366004615934565b6001600160a01b03165f9081526018602052604090206002015490565b348015610dfa575f5ffd5b506109fc610e09366004615934565b600c6020525f908152604090205460ff1681565b348015610e28575f5ffd5b50610994602f5481565b348015610e3d575f5ffd5b5061099461236d565b348015610e51575f5ffd5b5061099460165481565b348015610e66575f5ffd5b5061095a610e7536600461583e565b6123e1565b348015610e85575f5ffd5b5061095a610e94366004615934565b61245e565b348015610ea4575f5ffd5b5061099460125481565b348015610eb9575f5ffd5b50610994602c5481565b348015610ece575f5ffd5b50610ee2610edd366004615934565b6124fe565b60405161099e9190615aae565b348015610efa575f5ffd5b5061095a610f09366004615901565b612567565b348015610f19575f5ffd5b50610f2d610f28366004615934565b6125ba565b60405161099e9190615af0565b348015610f45575f5ffd5b5061095a6127d5565b348015610f59575f5ffd5b5061095a610f68366004615b53565b6128fa565b348015610f78575f5ffd5b50610994610f87366004615934565b6117ec565b348015610f97575f5ffd5b5061095a61296f565b348015610fab575f5ffd5b5061095a610fba366004615b53565b6129e0565b348015610fca575f5ffd5b50602954610994565b348015610fde575f5ffd5b5061095a610fed366004615a53565b612a6e565b348015610ffd575f5ffd5b5061099460285481565b348015611012575f5ffd5b5061099460305481565b348015611027575f5ffd5b5061095a611036366004615934565b612af1565b348015611046575f5ffd5b5061099460315481565b34801561105b575f5ffd5b5061099460205481565b348015611070575f5ffd5b5061095a61107f36600461583e565b612b77565b34801561108f575f5ffd5b5061099461109e36600461588a565b612ba5565b3480156110ae575f5ffd5b5061095a6110bd366004615934565b612bd0565b3480156110cd575f5ffd5b50610994602e5481565b3480156110e2575f5ffd5b505f546001600160a01b0316610a9d565b3480156110fe575f5ffd5b5061099461110d366004615934565b60266020525f908152604090205481565b348015611129575f5ffd5b5061095a61113836600461583e565b612c32565b348015611148575f5ffd5b506109fc611157366004615934565b60216020525f908152604090205460ff1681565b348015611176575f5ffd5b5061099460275481565b34801561118b575f5ffd5b506109bb612cac565b34801561119f575f5ffd5b5061095a6111ae36600461583e565b612cbb565b3480156111be575f5ffd5b5061099460105481565b3480156111d3575f5ffd5b50600554610a9d906001600160a01b031681565b3480156111f2575f5ffd5b5061095a61120136600461583e565b612ce9565b348015611211575f5ffd5b5061099460175481565b348015611226575f5ffd5b5061099460245481565b34801561123b575f5ffd5b50610a9d7f00000000000000000000000029fa8aca0508b9f9dfdca9d22029e49fecae28b781565b34801561126e575f5ffd5b5061095a61127d36600461583e565b612d17565b34801561128d575f5ffd5b5061095a61129c36600461588a565b612d45565b3480156112ac575f5ffd5b5061095a6112bb366004615901565b612d91565b3480156112cb575f5ffd5b506109fc6112da36600461588a565b612de4565b3480156112ea575f5ffd5b50610a9d7f0000000000000000000000000ad476fb4ba2e1a25be0eca6bec63d4792ea835781565b34801561131d575f5ffd5b5061095a612df0565b348015611331575f5ffd5b5061095a611340366004615a53565b612f39565b348015611350575f5ffd5b50610b4661135f366004615934565b612fbc565b34801561136f575f5ffd5b5061095a61137e366004615934565b613121565b34801561138e575f5ffd5b50610a9d7f0000000000000000000000004bb08caed56e8ddbb4f75b93f8cd9265e43f87a881565b3480156113c1575f5ffd5b506113d56113d0366004615934565b613180565b6040805192835260208301919091520161099e565b3480156113f5575f5ffd5b5061095a611404366004615b95565b613246565b348015611414575f5ffd5b50610a9d7f0000000000000000000000002579f51635b8e646351c423490c5404f36f2df2c81565b348015611447575f5ffd5b5061099460115481565b34801561145c575f5ffd5b5061099460155481565b348015611471575f5ffd5b5061099460145481565b348015611486575f5ffd5b506114cd61149536600461583e565b601d6020525f90815260409020805460018201546002830154600384015460049094015492936001600160a01b039092169290919085565b604080519586526001600160a01b039094166020860152928401919091526060830152608082015260a00161099e565b348015611508575f5ffd5b50610994601f5481565b34801561151d575f5ffd5b50610a9d7f0000000000000000000000005b8674fc3cbcd61a09fb684c4a0ed508bb278e1481565b348015611550575f5ffd5b506019546109fc9060ff1681565b348015611569575f5ffd5b5061099460255481565b34801561157e575f5ffd5b5061095a61158d36600461588a565b6132ee565b34801561159d575f5ffd5b5061095a6115ac366004615901565b613332565b3480156115bc575f5ffd5b5061095a6115cb366004615901565b613385565b3480156115db575f5ffd5b50610a9d7f0000000000000000000000000ba120cb8e743c4593de63b3617760fd492dffff81565b34801561160e575f5ffd5b50610994602d5481565b348015611623575f5ffd5b50610994611632366004615c53565b6001600160a01b039182165f90815260036020908152604080832093909416825291909152205490565b348015611667575f5ffd5b50610a9d61167636600461583e565b6133d8565b348015611686575f5ffd5b50610a9d7f0000000000000000000000008d1fbd2ed80085542d54612610866d521f81f0cd81565b3480156116b9575f5ffd5b5061095a6116c8366004615b95565b613400565b3480156116d8575f5ffd5b50600454610a9d906001600160a01b031681565b3480156116f7575f5ffd5b5061099460345481565b34801561170c575f5ffd5b50602254610a9d9061010090046001600160a01b031681565b348015611730575f5ffd5b5061099461173f366004615934565b602a6020525f908152604090205481565b34801561175b575f5ffd5b5061095a61176a366004615934565b61348e565b34801561177a575f5ffd5b5061095a611789366004615a95565b61354b565b348015611799575f5ffd5b5061095a6117a836600461583e565b613587565b3480156117b8575f5ffd5b5061099460335481565b6002600154036117e557604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b6001600160a01b03165f9081526002602052604090205490565b60225460405163d216ce6f60e01b81526001600160a01b0384811660048301525f9283926101009091049091169063d216ce6f90602401602060405180830381865afa158015611858573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187c91906157fd565b90505f60015b600281116119d05760016002829003611899575060035b6001600160a01b038416158015906118cb57506001600160a01b0384165f908152601860205260409020600101548111155b15611948575f6127106118e06103e8896157b3565b6118ea91906157ca565b90506118f685826135b5565b60408051828152602081018590526001600160a01b038716917fdffeb6900509415706ebc13fa86d33bacd4baca3b43e39453b8f45a45cb5d15d910160405180910390a26119448185615818565b9350505b60225460405163d216ce6f60e01b81526001600160a01b0386811660048301526101009092049091169063d216ce6f90602401602060405180830381865afa158015611996573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ba91906157fd565b93505080806119c890615c8a565b915050611882565b509150505b92915050565b601c80545f91829190826119ee83615c8a565b909155505f818152601d60209081526040808320848155600180820180546001600160a01b0319166001600160a01b038d16908117909155600283018b9055600383018a90554260048401558552601e845291842080549283018155845291832001839055601f80549394509092879290611a6a908490615818565b925050819055508360205f828254611a829190615818565b909155505060408051868152600160208201526001600160a01b0388169184917f344ad405b0b98b29a98eb38fa0a381a285a1b7c252889a6bff15416247c03b00910160405180910390a350949350505050565b5f546001600160a01b03163314611b085760405162461bcd60e51b8152600401611aff90615ca2565b60405180910390fd5b602f55565b606060078054611b1c90615cbe565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4890615cbe565b8015611b935780601f10611b6a57610100808354040283529160200191611b93565b820191905f5260205f20905b815481529060010190602001808311611b7657829003601f168201915b5050505050905090565b5f611ba9338484613664565b50600192915050565b5f546001600160a01b03163314611bdb5760405162461bcd60e51b8152600401611aff90615ca2565b603455565b5f546001600160a01b03163314611c095760405162461bcd60e51b8152600401611aff90615ca2565b611c148383836136c5565b505050565b5f546001600160a01b03163314611c425760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b03919091165f908152602b60205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314611c955760405162461bcd60e51b8152600401611aff90615ca2565b602755565b5f546001600160a01b03163314611cc35760405162461bcd60e51b8152600401611aff90615ca2565b5f8111611d125760405162461bcd60e51b815260206004820152601b60248201527f4d696e20616d6f756e74206d75737420626520706f73697469766500000000006044820152606401611aff565b678ac7230489e80000811115611d605760405162461bcd60e51b815260206004820152601360248201527209ad2dc40c2dadeeadce840e8dede40d0d2ced606b1b6044820152606401611aff565b601a55565b5f546001600160a01b03163314611d8e5760405162461bcd60e51b8152600401611aff90615ca2565b601392909255601455601555565b43602f54602e54611dad9190615818565b1115611db65750565b602d546040516370a0823160e01b81526001600160a01b037f0000000000000000000000000ad476fb4ba2e1a25be0eca6bec63d4792ea83578116600483015282917f0000000000000000000000000ba120cb8e743c4593de63b3617760fd492dffff909116906370a0823190602401602060405180830381865afa158015611e41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e659190615cf0565b1015611e6f575050565b6040516370a0823160e01b815261dead60048201527f0000000000000000000000005b8674fc3cbcd61a09fb684c4a0ed508bb278e14905f906001600160a01b038316906370a0823190602401602060405180830381865afa158015611ed7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611efb9190615cf0565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f37573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f5b9190615cf0565b611f65919061582b565b9050805f03611f745750505050565b6029545f90819081908180805a6030549091505b8b84108015611f9657508483105b156121805784602c5410611fa9575f602c555b6029602c5481548110611fbe57611fbe615d07565b5f9182526020808320909101546001600160a01b0316808352602b90915260409091205490985060ff1661213f576040516370a0823160e01b81526001600160a01b0389811660048301528b16906370a0823190602401602060405180830381865afa158015612030573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120549190615cf0565b6001600160a01b0389165f908152601860205260409020549097508781101561207b578097505b81881061213d578961208d898e6157b3565b61209791906157ca565b9650861561213d5760405163092dfdb360e11b81526001600160a01b037f0000000000000000000000000ad476fb4ba2e1a25be0eca6bec63d4792ea8357169063125bfb669061210f907f0000000000000000000000000ba120cb8e743c4593de63b3617760fd492dffff908d908c90600401615d1b565b5f604051808303815f87803b158015612126575f5ffd5b505af1158015612138573d5f5f3e3d5ffd5b505050505b505b5a61214a908361582b565b6121549085615818565b93505a602c80549193505f61216883615c8a565b9190505550828061217890615c8a565b935050611f88565b505043602e5550505050505050505050565b5f546001600160a01b031633146121bb5760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b03919091165f908152602160205260409020805460ff1916911515919091179055565b5f6121f1848484613772565b6001600160a01b0384165f9081526003602090815260408083203384529091529020545f191461226d576001600160a01b0384165f90815260036020908152604080832033845290915290205461224990839061582b565b6001600160a01b0385165f9081526003602090815260408083203384529091529020555b5060019392505050565b5f546001600160a01b031633146122a05760405162461bcd60e51b8152600401611aff90615ca2565b601092909255601155601255565b5f546001600160a01b031633146122d75760405162461bcd60e51b8152600401611aff90615ca2565b5f5b8251811015611c145781600b5f8584815181106122f8576122f8615d07565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff19169115159190911790556001016122d9565b5f546001600160a01b0316331461235a5760405162461bcd60e51b8152600401611aff90615ca2565b6022805460ff1916911515919091179055565b5f5f612377613bb3565b90506024548110156123da576024545f90612392838261582b565b61239c905f6157b3565b6123a691906157ca565b905060058111156123c9576123bc60058261582b565b6123c6905f6157b3565b90505b60198111156119d557505f92915050565b5f91505090565b5f546001600160a01b0316331461240a5760405162461bcd60e51b8152600401611aff90615ca2565b5f81116124595760405162461bcd60e51b815260206004820181905260248201527f546f6b656e7320706572206d696e74206d75737420626520706f7369746976656044820152606401611aff565b601b55565b5f546001600160a01b031633146124875760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b0381166124d65760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420696e76697465206164647265737360501b6044820152606401611aff565b602280546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0381165f908152601e602090815260409182902080548351818402810184019094528084526060939283018282801561255b57602002820191905f5260205f20905b815481526020019060010190808311612547575b50505050509050919050565b5f546001600160a01b031633146125905760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b602254604051630f95592960e01b81526001600160a01b0383811660048301526060925f9261010090910490911690630f955929906024015f60405180830381865afa15801561260c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126339190810190615d3f565b90505f815167ffffffffffffffff81111561265057612650615978565b6040519080825280602002602001820160405280156126b157816020015b61269e60405180608001604052805f6001600160a01b031681526020015f81526020015f81526020015f81525090565b81526020019060019003908161266e5790505b5090505f5b82518110156127cd575f8382815181106126d2576126d2615d07565b6020908102919091018101516001600160a01b038082165f81815260188552604090819020815160608101835281548152600182015481880152600290910154818301528151608081018352838152602254925163d3346ff360e01b8152600481019490945294965094840192610100909104169063d3346ff390602401602060405180830381865afa15801561276b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278f9190615cf0565b81526020018260200151815260200182604001518152508484815181106127b8576127b8615d07565b602090810291909101015250506001016126b6565b509392505050565b5f546001600160a01b031633146127fe5760405162461bcd60e51b8152600401611aff90615ca2565b601654156128385760405162461bcd60e51b815260206004820152600760248201526674726164696e6760c81b6044820152606401611aff565b43601655426032555f61284a816117ec565b905080156128f7576006546001600160a01b03165f908152600260205260408120805483929061287b908490615818565b90915550505f80805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b80548392906128ba90849061582b565b909155505060405181815233905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b50565b5f546001600160a01b031633146129235760405162461bcd60e51b8152600401611aff90615ca2565b5f5b8251811015611c14578160265f85848151811061294457612944615d07565b6020908102919091018101516001600160a01b031682528101919091526040015f2055600101612925565b5f546001600160a01b031633146129985760405162461bcd60e51b8152600401611aff90615ca2565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b03163314612a095760405162461bcd60e51b8152600401611aff90615ca2565b81515f80805b83811015612a6657858181518110612a2957612a29615d07565b6020908102919091018101516001600160a01b0381165f908152601890925260409091208681559093509150612a5e83613c22565b600101612a0f565b505050505050565b5f546001600160a01b03163314612a975760405162461bcd60e51b8152600401611aff90615ca2565b5f5b8251811015611c145781600c5f858481518110612ab857612ab8615d07565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101612a99565b5f546001600160a01b03163314612b1a5760405162461bcd60e51b8152600401611aff90615ca2565b600580546001600160a01b0319166001600160a01b0383169081179091555f908152600a60205260409020805460ff19166001179055612b5c60025f196157ca565b6001600160a01b039091165f90815260186020526040902055565b5f546001600160a01b03163314612ba05760405162461bcd60e51b8152600401611aff90615ca2565b603255565b601e602052815f5260405f208181548110612bbe575f80fd5b905f5260205f20015f91509150505481565b5f546001600160a01b03163314612bf95760405162461bcd60e51b8152600401611aff90615ca2565b600480546001600160a01b039092166001600160a01b0319909216821790555f908152600a60205260409020805460ff19166001179055565b5f546001600160a01b03163314612c5b5760405162461bcd60e51b8152600401611aff90615ca2565b62030d408110158015612c715750621e84808111155b612ca75760405162461bcd60e51b815260206004820152600760248201526632302d3230307760c81b6044820152606401611aff565b602855565b606060088054611b1c90615cbe565b5f546001600160a01b03163314612ce45760405162461bcd60e51b8152600401611aff90615ca2565b603055565b5f546001600160a01b03163314612d125760405162461bcd60e51b8152600401611aff90615ca2565b603155565b5f546001600160a01b03163314612d405760405162461bcd60e51b8152600401611aff90615ca2565b603355565b5f546001600160a01b03163314612d6e5760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b0382165f908152601860205260409020818155611c1483613c22565b5f546001600160a01b03163314612dba5760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b03919091165f908152600e60205260409020805460ff1916911515919091179055565b5f611ba9338484613772565b6032545f03612dfb57565b6032544290612e0d90610e1090615818565b811015612e175750565b7f0000000000000000000000004bb08caed56e8ddbb4f75b93f8cd9265e43f87a85f612e42826117ec565b90505f610e1060325485612e56919061582b565b612e6091906157ca565b90506004811115612e6f575060045b5f8161271060315485612e8291906157b3565b612e8c91906157ca565b612e9691906157b3565b90508015612efa57612eab8461dead83613cee565b836001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612ee3575f5ffd5b505af1158015612ef5573d5f5f3e3d5ffd5b505050505b60328590556040518181527fa1c30866d8ffe3581bd782f244445925589b8b2949ab06a65e29ab03e89271ce9060200160405180910390a15050505050565b5f546001600160a01b03163314612f625760405162461bcd60e51b8152600401611aff90615ca2565b5f5b8251811015611c145781600a5f858481518110612f8357612f83615d07565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101612f64565b5f5f5f612fc884613180565b90935091506001600160a01b037f0000000000000000000000004bb08caed56e8ddbb4f75b93f8cd9265e43f87a881169085160361308f576040516370a0823160e01b81526001600160a01b0385811660048301527f00000000000000000000000055d398326f99059ff775485246999027b319795516906370a0823190602401602060405180830381865afa158015613064573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130889190615cf0565b905061311a565b6040516370a0823160e01b81526001600160a01b0385811660048301527f0000000000000000000000000ba120cb8e743c4593de63b3617760fd492dffff16906370a0823190602401602060405180830381865afa1580156130f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131179190615cf0565b90505b9193909250565b5f546001600160a01b0316331461314a5760405162461bcd60e51b8152600401611aff90615ca2565b6040516001600160a01b038216904780156108fc02915f818181858888f1935050505015801561317c573d5f5f3e3d5ffd5b5050565b5f5f5f8390505f5f826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156131c4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131e89190615def565b506001600160701b0391821693501690507f00000000000000000000000055d398326f99059ff775485246999027b3197955306001600160a01b03821610156132365782955081945061323d565b8195508294505b50505050915091565b5f546001600160a01b0316331461326f5760405162461bcd60e51b8152600401611aff90615ca2565b81515f80805b83811015612a665785818151811061328f5761328f615d07565b6020026020010151925060185f846001600160a01b03166001600160a01b031681526020019081526020015f2091508481815181106132d0576132d0615d07565b602090810291909101015182556132e683613c22565b600101613275565b5f546001600160a01b031633146133175760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b039091165f90815260266020526040902055565b5f546001600160a01b0316331461335b5760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b5f546001600160a01b031633146133ae5760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b602981815481106133e7575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f546001600160a01b031633146134295760405162461bcd60e51b8152600401611aff90615ca2565b5f5b8251811015611c145781818151811061344657613446615d07565b602002602001015160265f85848151811061346357613463615d07565b6020908102919091018101516001600160a01b031682528101919091526040015f205560010161342b565b5f546001600160a01b031633146134b75760405162461bcd60e51b8152600401611aff90615ca2565b6001600160a01b0381166134f25760405162461bcd60e51b815260206004820152600260248201526106e360f41b6044820152606401611aff565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b031633146135745760405162461bcd60e51b8152600401611aff90615ca2565b6019805460ff1916911515919091179055565b5f546001600160a01b031633146135b05760405162461bcd60e51b8152600401611aff90615ca2565b602d55565b604080515f808252602082019092526001600160a01b0384169083906040516135de9190615e3b565b5f6040518083038185875af1925050503d805f8114613618576040519150601f19603f3d011682016040523d82523d5f602084013e61361d565b606091505b5050905080611c145760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401611aff565b6001600160a01b038381165f8181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f928392908716916137209190615e3b565b5f604051808303815f865af19150503d805f8114613759576040519150601f19603f3d011682016040523d82523d5f602084013e61375e565b606091505b5091509150818015612a6657505050505050565b6001600160a01b0383165f908152600c602052604090205460ff1615806137b057506001600160a01b0383165f908152600a602052604090205460ff165b806137d257506001600160a01b0383165f908152600e602052604090205460ff165b61380a5760405162461bcd60e51b8152602060048201526009602482015268189b1858dad31a5cdd60ba1b6044820152606401611aff565b5f613814846117ec565b90508181101561384c5760405162461bcd60e51b8152602060048201526003602482015262424e4560e81b6044820152606401611aff565b613854613d34565b6001600160a01b0383165f908152600e6020526040812054329190819060ff16801561388e5750335f9081526021602052604090205460ff165b80156138ab5750866001600160a01b0316836001600160a01b0316145b15613932576138ba8686613db8565b90505f811180156138fc57507f0000000000000000000000005b8674fc3cbcd61a09fb684c4a0ed508bb278e146001600160a01b0316866001600160a01b0316145b15613932576001600160a01b0383165f90815260186020526040812080549093508291849161392c908490615818565b90915550505b6001600160a01b0387165f908152600e602052604081205460ff1615613a125761395c8887613e22565b90505f8111801561399e57507f0000000000000000000000005b8674fc3cbcd61a09fb684c4a0ed508bb278e146001600160a01b0316886001600160a01b0316145b15613a12576001600160a01b0384165f908152600a602052604090205460ff16613a12576001600160a01b0384165f908152601860205260409020548111156139e5575f5ffd5b6001600160a01b0384165f9081526018602052604081208054839290613a0c90849061582b565b90915550505b6001600160a01b0388165f908152600e602052604081205460ff1680613a4f57506001600160a01b0388165f908152600e602052604090205460ff165b15613b26576017545f03613a8e576001600160a01b0389165f908152600a602052604090205460ff168015613a845750601754155b15613a8e57436017555b6001600160a01b0389165f908152600a602052604090205460ff16158015613ace57506001600160a01b0388165f908152600a602052604090205460ff16155b15613b2657600190506016545f03613b26576017545f108015613af057505f83115b613b265760405162461bcd60e51b815260206004820152600760248201526637379037b832b760c91b6044820152606401611aff565b613b34898989848787613f29565b6001600160a01b0389163014613ba8575f83118015613b8457507f0000000000000000000000005b8674fc3cbcd61a09fb684c4a0ed508bb278e146001600160a01b0316886001600160a01b0316145b15613b9757613b9289613c22565b613ba8565b8015613ba857613ba8602854611d9c565b505050505050505050565b5f5f5f613bdf7f0000000000000000000000005b8674fc3cbcd61a09fb684c4a0ed508bb278e14612fbc565b5090925090505f613bf082846157b3565b1115613c1a5780613c0983670de0b6b3a76400006157b3565b613c1391906157ca565b9250505090565b5f9250505090565b6001600160a01b0381165f908152602a602052604081205490036128f7576029541580613c7e5750806001600160a01b031660295f81548110613c6757613c67615d07565b5f918252602090912001546001600160a01b031614155b156128f757803b8015613c8f575050565b50602980546001600160a01b0383165f818152602a60205260408120839055600183018455929092527fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181caac0180546001600160a01b031916909117905550565b6001600160a01b0383165f90815260026020526040902054613d1190829061582b565b6001600160a01b0384165f90815260026020526040902055611c14838383613ff9565b6016545f03613d3f57565b6025545f9062015180613d528242615818565b613d5c91906157ca565b613d6990620151806157b3565b613d73919061582b565b90508042106128f7575f613d8a62015180836157ca565b90505f613d95613bb3565b905060235482118015613da757505f81115b15611c145760239190915560245550565b5f5f5f5f613dc586612fbc565b9250925092505f5f84118015613dda57505f83115b15613df75782613dea85886157b3565b613df491906157ca565b90505b613e018185615818565b8210613e1857613e14878388878761406f565b5094505b5050505092915050565b5f5f5f5f613e2f86612fbc565b92509250925082811015613ecc5784613e47876117ec565b613e51919061582b565b866001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e8d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613eb19190615cf0565b613ebb90876157b3565b613ec591906157ca565b9350613f20565b60225460ff1615613f20575f5f84118015613ee657505f83115b15613e1857613ef5868461582b565b613eff85886157b3565b613f0991906157ca565b9050613f158482615818565b821015613e18575f5ffd5b50505092915050565b6001600160a01b0386165f9081526002602052604081208054869290613f5090849061582b565b909155508490505f613f62888361449c565b91508415613fdb575f5f613f798a8a8689896144f1565b91509150819250808015613f905750600f5460ff16155b15613fd8575f613fa8613fa3848761582b565b6145b9565b90508015613fc657613fba8185615818565b9350613fc68b826147ce565b613fce614874565b613fd6612df0565b505b50505b613fef8888613fea848661582b565b613ff9565b5050505050505050565b6001600160a01b0382165f9081526002602052604090205461401c908290615818565b6001600160a01b038084165f8181526002602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906136b89085815260200190565b5f5f5f876001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d29190615cf0565b90505f7f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614131573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061415591906157fd565b6001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015614190573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141b491906157fd565b90505f5f6001600160a01b0316826001600160a01b0316141590505f8a6001600160a01b0316637464fc3d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561420c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142309190615cf0565b90508115614423578015614423575f61425161424c898b6157b3565b6148d4565b90505f61425d836148d4565b905080821115614420575f807310ed43c718714eb63d5aa57b78b54704e256024d197f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b0316016142f6576142b8838561582b565b6142c290896157b3565b6142cd9060086157b3565b91506142da8360086157b3565b6142e58560116157b3565b6142ef9190615818565b90506143fe565b73d99d1c33f9fc3444f8101754abc46c52416550d0197f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b03160161435d57614345838561582b565b61434f90896157b3565b9150826142e58560036157b3565b73e9d6f80028671279a28790bb4007b10b0595def0197f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b0316016143cf576143ac838561582b565b6143b690896157b3565b6143c19060036157b3565b9150826142e58560056157b3565b6143d9838561582b565b6143e390896157b3565b9150826143f18560056157b3565b6143fb9190615818565b90505b61440881836157ca565b9850881561441d5761441a8989615818565b97505b50505b50505b5f61442e898c61582b565b9050845f03614458576103e861444761424c8c846157b3565b614451919061582b565b965061448d565b61448a8961446687846157b3565b61447091906157ca565b8961447b888e6157b3565b61448591906157ca565b614942565b96505b50505050509550959350505050565b5f5f6034546033546144ae91906157b3565b90508083101580156144c957506001600160a01b0384163014155b156144e9576144d784614959565b6144e1818461582b565b9150506119d5565b509092915050565b5f5f5f84118061450057505f83115b1561450f57505f9050806145af565b61453660405180608001604052805f81526020015f81526020015f81526020015f81525090565b6001600160a01b0388165f908152600e602052604090205460ff16156145705761456087876149e3565b905061456b86614a8d565b6145a1565b6001600160a01b0387165f908152600e602052604090205460ff16156145a15761459a8887614c0a565b9050600191505b6145ab8882614cdd565b9250505b9550959350505050565b6040805160028082526060820183525f9232928492909160208301908036833701905050905030815f815181106145f2576145f2615d07565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000055d398326f99059ff775485246999027b31979558160018151811061464657614646615d07565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81525f917f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e169063d06ca61f906146a49088908690600401615e94565b5f60405180830381865afa1580156146be573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526146e59190810190615eb4565b90505f81600183516146f7919061582b565b8151811061470757614707615d07565b6020908102919091018101516001600160a01b0386165f908152602690925260408220549092509081831115614796576001600160a01b0386165f90815260266020526040812055614759828461582b565b90505f83614767838b6157b3565b61477191906157ca565b90506127106027548261478491906157b3565b61478e91906157ca565b9750506147c3565b6001600160a01b0386165f90815260266020526040812080548592906147bd90849061582b565b90915550505b505050505050919050565b61480c827f0000000000000000000000008d1fbd2ed80085542d54612610866d521f81f0cd612710614802856103e86157b3565b613fea91906157ca565b614840827f0000000000000000000000002579f51635b8e646351c423490c5404f36f2df2c612710614802856105dc6157b3565b61317c827f0000000000000000000000000ad476fb4ba2e1a25be0eca6bec63d4792ea835761271061480285611d4c6157b3565b600f805460ff191660011790555f61488a614de2565b905080608001515f0361489d57506148c8565b5f6148ab826080015161506b565b9050805f036148bb5750506148c8565b6148c58282615331565b50505b600f805460ff19169055565b5f60038211156149335750805f6148ec6002836157ca565b6148f7906001615818565b90505b8181101561492d5790508060028161491281866157ca565b61491c9190615818565b61492691906157ca565b90506148fa565b50919050565b811561493d575060015b919050565b5f8183106149505781614952565b825b9392505050565b5f5b60345481101561317c575f61496f82615463565b90506001600160a01b038116158061499157506001600160a01b03811661dead145b806149ad5750826001600160a01b0316816001600160a01b0316145b806149c157505f816001600160a01b03163b115b156149cc57506149db565b6149d98382603354613ff9565b505b60010161495b565b614a0a60405180608001604052805f81526020015f81526020015f81526020015f81525090565b61271060105483614a1b91906157b3565b614a2591906157ca565b6040808301919091526001600160a01b0384165f908152600b602052205460ff166119d55761271060125483614a5b91906157b3565b614a6591906157ca565b815260115461271090614a7890846157b3565b614a8291906157ca565b602082015292915050565b6040805160028082526060820183525f926020830190803683370190505090507f00000000000000000000000055d398326f99059ff775485246999027b3197955815f81518110614ae057614ae0615d07565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110614b1457614b14615d07565b6001600160a01b0392831660209182029290920101526040516307c0329d60e21b81525f917f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e1690631f00ca7490614b729086908690600401615e94565b5f60405180830381865afa158015614b8c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052614bb39190810190615eb4565b9050805f81518110614bc757614bc7615d07565b602002602001015160265f326001600160a01b03166001600160a01b031681526020019081526020015f205f828254614c009190615818565b9091555050505050565b614c3160405180608001604052805f81526020015f81526020015f81526020015f81525090565b61271060135483614c4291906157b3565b614c4c91906157ca565b6040808301919091526001600160a01b0384165f908152600b602052205460ff16614caf5761271060155483614c8291906157b3565b614c8c91906157ca565b815260145461271090614c9f90846157b3565b614ca991906157ca565b60208201525b5f614cb861236d565b9050612710614cc782856157b3565b614cd191906157ca565b60608301525092915050565b80515f9015614d04578151614cf29082615818565b9050614d048361dead845f0151613ff9565b602082015115614d4e576020820151614d1d9082615818565b9050614d4e837f0000000000000000000000002579f51635b8e646351c423490c5404f36f2df2c8460200151613ff9565b604082015115614d98576040820151614d679082615818565b9050614d98837f0000000000000000000000008d1fbd2ed80085542d54612610866d521f81f0cd8460400151613ff9565b6060820151156119d5576060820151614db19082615818565b90506119d5837f0000000000000000000000000ad476fb4ba2e1a25be0eca6bec63d4792ea83578460600151613ff9565b614e0f6040518060a001604052805f81526020015f81526020015f81526020015f81526020015f81525090565b614e387f0000000000000000000000002579f51635b8e646351c423490c5404f36f2df2c6117ec565b80825215614ed257805160405163092dfdb360e11b81526001600160a01b037f0000000000000000000000002579f51635b8e646351c423490c5404f36f2df2c169163125bfb6691614e91913091829190600401615d1b565b5f604051808303815f87803b158015614ea8575f5ffd5b505af1158015614eba573d5f5f3e3d5ffd5b50508251614ecc9250600291506157ca565b60208201525b614efb7f0000000000000000000000000ad476fb4ba2e1a25be0eca6bec63d4792ea83576117ec565b6040820181905215614f8957604080820151905163092dfdb360e11b81526001600160a01b037f0000000000000000000000000ad476fb4ba2e1a25be0eca6bec63d4792ea8357169163125bfb6691614f5b913091829190600401615d1b565b5f604051808303815f87803b158015614f72575f5ffd5b505af1158015614f84573d5f5f3e3d5ffd5b505050505b614fb27f0000000000000000000000008d1fbd2ed80085542d54612610866d521f81f0cd6117ec565b606082018190521561504057606081015160405163092dfdb360e11b81526001600160a01b037f0000000000000000000000008d1fbd2ed80085542d54612610866d521f81f0cd169163125bfb6691615012913091829190600401615d1b565b5f604051808303815f87803b158015615029575f5ffd5b505af115801561503b573d5f5f3e3d5ffd5b505050505b8060600151816040015182602001516150599190615818565b6150639190615818565b608082015290565b5f815f0361507a57505f919050565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106150ad576150ad615d07565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000ba120cb8e743c4593de63b3617760fd492dffff8160018151811061510157615101615d07565b60200260200101906001600160a01b031690816001600160a01b0316815250505f61512b846154c1565b90506001600160a01b037f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e16635c11d7958583857f00000000000000000000000029fa8aca0508b9f9dfdca9d22029e49fecae28b761518c4261012c615818565b6040518663ffffffff1660e01b81526004016151ac959493929190615f3b565b5f604051808303815f87803b1580156151c3575f5ffd5b505af19250505080156151d4575060015b6151e157505f9392505050565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000029fa8aca0508b9f9dfdca9d22029e49fecae28b7811660048301527f0000000000000000000000000ba120cb8e743c4593de63b3617760fd492dffff16906370a0823190602401602060405180830381865afa158015615265573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906152899190615cf0565b9250821561532a5760405163092dfdb360e11b81526001600160a01b037f00000000000000000000000029fa8aca0508b9f9dfdca9d22029e49fecae28b7169063125bfb6690615301907f0000000000000000000000000ba120cb8e743c4593de63b3617760fd492dffff9030908890600401615d1b565b5f604051808303815f87803b158015615318575f5ffd5b505af11580156147c3573d5f5f3e3d5ffd5b5050919050565b80158061534057506080820151155b15615349575050565b602082015115615385575f826080015183602001518361536991906157b3565b61537391906157ca565b905061538381846020015161559f565b505b6040820151156153fe575f82608001518360400151836153a591906157b3565b6153af91906157ca565b90506153fc7f0000000000000000000000000ba120cb8e743c4593de63b3617760fd492dffff7f0000000000000000000000000ad476fb4ba2e1a25be0eca6bec63d4792ea8357836136c5565b505b60608201511561317c575f826080015183606001518361541e91906157b3565b61542891906157ca565b600454909150611c14907f0000000000000000000000000ba120cb8e743c4593de63b3617760fd492dffff906001600160a01b0316836136c5565b5f424433846040516020016154a39493929190938452602084019290925260601b6bffffffffffffffffffffffff19166040830152605482015260740190565b60408051601f19818403018152919052805160209091012092915050565b5f7f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663d06ca61f836154fa6156f5565b6040518363ffffffff1660e01b8152600401615517929190615e94565b5f60405180830381865afa92505050801561555357506040513d5f823e601f3d908101601f191682016040526155509190810190615eb4565b60015b15615598576002815110615596576127108160018151811061557757615577615d07565b602002602001015161232861558c91906157b3565b61495291906157ca565b505b505f919050565b5f6127106155af8461251c6157b3565b6155b991906157ca565b90505f6127106155cb8461251c6157b3565b6155d591906157ca565b90507f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663e8e337007f0000000000000000000000000ba120cb8e743c4593de63b3617760fd492dffff308787878760055f9054906101000a90046001600160a01b03164261012c61564f9190615818565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303815f875af19250505080156156e6575060408051601f3d908101601f191682019092526156e391810190615f76565b60015b156156ef575050505b50505050565b604080516002808252606080830184529260208301908036833701905050905030815f8151811061572857615728615d07565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000ba120cb8e743c4593de63b3617760fd492dffff8160018151811061577c5761577c615d07565b60200260200101906001600160a01b031690816001600160a01b03168152505090565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176119d5576119d561579f565b5f826157e457634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03811681146128f7575f5ffd5b5f6020828403121561580d575f5ffd5b8151614952816157e9565b808201808211156119d5576119d561579f565b818103818111156119d5576119d561579f565b5f6020828403121561584e575f5ffd5b5035919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f6040838503121561589b575f5ffd5b82356158a6816157e9565b946020939093013593505050565b5f5f5f606084860312156158c6575f5ffd5b83356158d1816157e9565b925060208401356158e1816157e9565b929592945050506040919091013590565b8035801515811461493d575f5ffd5b5f5f60408385031215615912575f5ffd5b823561591d816157e9565b915061592b602084016158f2565b90509250929050565b5f60208284031215615944575f5ffd5b8135614952816157e9565b5f5f5f60608486031215615961575f5ffd5b505081359360208301359350604090920135919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156159b5576159b5615978565b604052919050565b5f67ffffffffffffffff8211156159d6576159d6615978565b5060051b60200190565b5f82601f8301126159ef575f5ffd5b8135615a026159fd826159bd565b61598c565b8082825260208201915060208360051b860101925085831115615a23575f5ffd5b602085015b83811015615a49578035615a3b816157e9565b835260209283019201615a28565b5095945050505050565b5f5f60408385031215615a64575f5ffd5b823567ffffffffffffffff811115615a7a575f5ffd5b615a86858286016159e0565b92505061592b602084016158f2565b5f60208284031215615aa5575f5ffd5b614952826158f2565b602080825282518282018190525f918401906040840190835b81811015615ae5578351835260209384019390920191600101615ac7565b509095945050505050565b602080825282518282018190525f918401906040840190835b81811015615ae557835180516001600160a01b0316845260208082015181860152604080830151908601526060918201519185019190915290930192608090920191600101615b09565b5f5f60408385031215615b64575f5ffd5b823567ffffffffffffffff811115615b7a575f5ffd5b615b86858286016159e0565b95602094909401359450505050565b5f5f60408385031215615ba6575f5ffd5b823567ffffffffffffffff811115615bbc575f5ffd5b615bc8858286016159e0565b925050602083013567ffffffffffffffff811115615be4575f5ffd5b8301601f81018513615bf4575f5ffd5b8035615c026159fd826159bd565b8082825260208201915060208360051b850101925087831115615c23575f5ffd5b6020840193505b82841015615c45578335825260209384019390910190615c2a565b809450505050509250929050565b5f5f60408385031215615c64575f5ffd5b8235615c6f816157e9565b91506020830135615c7f816157e9565b809150509250929050565b5f60018201615c9b57615c9b61579f565b5060010190565b602080825260029082015261216f60f01b604082015260600190565b600181811c90821680615cd257607f821691505b60208210810361492d57634e487b7160e01b5f52602260045260245ffd5b5f60208284031215615d00575f5ffd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60208284031215615d4f575f5ffd5b815167ffffffffffffffff811115615d65575f5ffd5b8201601f81018413615d75575f5ffd5b8051615d836159fd826159bd565b8082825260208201915060208360051b850101925086831115615da4575f5ffd5b6020840193505b82841015615dcf578351615dbe816157e9565b825260209384019390910190615dab565b9695505050505050565b80516001600160701b038116811461493d575f5ffd5b5f5f5f60608486031215615e01575f5ffd5b615e0a84615dd9565b9250615e1860208501615dd9565b9150604084015163ffffffff81168114615e30575f5ffd5b809150509250925092565b5f82518060208501845e5f920191825250919050565b5f8151808452602084019350602083015f5b82811015615e8a5781516001600160a01b0316865260209586019590910190600101615e63565b5093949350505050565b828152604060208201525f615eac6040830184615e51565b949350505050565b5f60208284031215615ec4575f5ffd5b815167ffffffffffffffff811115615eda575f5ffd5b8201601f81018413615eea575f5ffd5b8051615ef86159fd826159bd565b8082825260208201915060208360051b850101925086831115615f19575f5ffd5b6020840193505b82841015615dcf578351825260209384019390910190615f20565b85815284602082015260a060408201525f615f5960a0830186615e51565b6001600160a01b0394909416606083015250608001529392505050565b5f5f5f60608486031215615f88575f5ffd5b505081516020830151604090930151909492935091905056fea2646970667358221220210e073aeba2eb0efdac110d3def03f1d73aa85eedc4498f5eeac2e523cb49f764736f6c63430008220033

Deployed Bytecode Sourcemap

50351:521:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5301:21;:19;:21::i;:::-;12258:9:::1;:13:::0;12254:1462:::1;;12376:11;::::0;12288:20:::1;::::0;;;12376:11:::1;;12371:117;;12408:39;::::0;12416:10:::1;::::0;12437:9:::1;12408:39:::0;::::1;;;::::0;::::1;::::0;;;12437:9;12416:10;12408:39;::::1;;;;;;;;;;;;;;;;;;;;12466:7;;;;12371:117;12532:13;;12520:9;:25;12516:130;;;12566:39;::::0;12574:10:::1;::::0;12595:9:::1;12566:39:::0;::::1;;;::::0;::::1;::::0;;;12595:9;12574:10;12566:39;::::1;;;;;;;;;;;;;;;;;;12516:130;12716:13;;12704:9;12688:13;;:25;;;;:::i;:::-;:41;;;;:::i;:::-;12674:55;;12786:11;12762:21;12780:1;12762:9;:21::i;:::-;:35;12758:140;;;12818:39;::::0;12826:10:::1;::::0;12847:9:::1;12818:39:::0;::::1;;;::::0;::::1;::::0;;;12847:9;12826:10;12818:39;::::1;;;;;;;;;;;;;;;;;;12758:140;12939:10;12930:20;::::0;;;:8:::1;:20;::::0;;;;:33:::1;;::::0;:38;;12926:205:::1;;13007:6;::::0;:29:::1;::::0;-1:-1:-1;;;13007:29:0;;13025:10:::1;13007:29;::::0;::::1;687:51:1::0;12989:15:0::1;::::0;13007:6:::1;::::0;::::1;-1:-1:-1::0;;;;;13007:6:0::1;::::0;:17:::1;::::0;660:18:1;;13007:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12989:47:::0;-1:-1:-1;;;;;;13059:21:0;::::1;::::0;13055:60:::1;;-1:-1:-1::0;;;;;13082:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;13114:1:::1;13082:28:::0;;::::1;:33:::0;;13114:1;;13082:28;;:33:::1;::::0;13114:1;;13082:33:::1;:::i;:::-;::::0;;;-1:-1:-1;;13055:60:0::1;12970:161;12926:205;13156:10;13147:20;::::0;;;:8:::1;:20;::::0;;;;:33:::1;;:46:::0;;13184:9:::1;::::0;13147:20;:46:::1;::::0;13184:9;;13147:46:::1;:::i;:::-;::::0;;;-1:-1:-1;13225:47:0::1;::::0;-1:-1:-1;13250:10:0::1;13262:9;13225:24;:47::i;:::-;13210:62:::0;-1:-1:-1;13289:20:0::1;13312:24;13210:62:::0;13312:9:::1;:24;:::i;:::-;13289:47:::0;-1:-1:-1;13355:16:0;;13351:104:::1;;13400:15;::::0;13392:47:::1;::::0;-1:-1:-1;;;;;13400:15:0;;::::1;::::0;13392:47;::::1;;;::::0;13426:12;;13400:15:::1;13392:47:::0;13400:15;13392:47;13426:12;13400:15;13392:47;::::1;;;;;;;;;;;;;;;;;;;;13351:104;13471:21;::::0;;;:9:::1;:21;::::0;;:36;;13496:11;;13471:21;:36:::1;::::0;13496:11;;13471:36:::1;:::i;:::-;::::0;;;-1:-1:-1;;13532:10:0::1;13522:21;::::0;;;:9:::1;:21;::::0;;;;:36;;13547:11;;13522:21;:36:::1;::::0;13547:11;;13522:36:::1;:::i;:::-;::::0;;;-1:-1:-1;;13578:45:0::1;::::0;1550:25:1;;;13599:10:0::1;::::0;13595:1:::1;::::0;13578:45:::1;::::0;1538:2:1;1523:18;13578:45:0::1;;;;;;;13652:52;13669:10;13681:9;13692:11;13652:16;:52::i;:::-;;12273:1443;;;12254:1462;5345:20:::0;4636:1;5887:21;;5704:212;5345:20;50351:521;;;;;47926:102;;;;;;;;;;-1:-1:-1;47926:102:0;;;;;:::i;:::-;;:::i;8832:37::-;;;;;;;;;;;;;;;;;;;1550:25:1;;;1538:2;1523:18;8832:37:0;;;;;;;;16857:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;8876:39::-;;;;;;;;;;;;;;;;17701:184;;;;;;;;;;-1:-1:-1;17701:184:0;;;;;:::i;:::-;;:::i;:::-;;;2777:14:1;;2770:22;2752:41;;2740:2;2725:18;17701:184:0;2612:187:1;49375:98:0;;;;;;;;;;-1:-1:-1;49375:98:0;;;;;:::i;:::-;;:::i;8466:32::-;;;;;;;;;;;;;;;;42517:133;;;;;;;;;;-1:-1:-1;42517:133:0;;;;;:::i;:::-;;:::i;45408:152::-;;;;;;;;;;-1:-1:-1;45408:152:0;;;;;:::i;:::-;;:::i;7836:30::-;;;;;;;;;;-1:-1:-1;7836:30:0;;;;-1:-1:-1;;;;;7836:30:0;;;;;;-1:-1:-1;;;;;705:32:1;;;687:51;;675:2;660:18;7836:30:0;541:203:1;7963:44:0;;;;;;;;;;-1:-1:-1;7963:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;17061:95;;;;;;;;;;-1:-1:-1;17141:7:0;;17061:95;;48133:29;;;;;;;;;;;;;;;;8742:44;;;;;;;;;;-1:-1:-1;8742:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4256:25:1;;;4312:2;4297:18;;4290:34;;;;4340:18;;;4333:34;4244:2;4229:18;8742:44:0;4054:319:1;38253:118:0;;;;;;;;;;-1:-1:-1;38253:118:0;;;;;:::i;:::-;;:::i;39704:221::-;;;;;;;;;;-1:-1:-1;39704:221:0;;;;;:::i;:::-;;:::i;40534:231::-;;;;;;;;;;-1:-1:-1;40534:231:0;;;;;:::i;:::-;;:::i;8014:45::-;;;;;;;;;;-1:-1:-1;8014:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45783:1903;;;;;;;;;;-1:-1:-1;45783:1903:0;;;;;:::i;:::-;;:::i;43922:114::-;;;;;;;;;;-1:-1:-1;43922:114:0;;;;;:::i;:::-;;:::i;17893:404::-;;;;;;;;;;-1:-1:-1;17893:404:0;;;;;:::i;:::-;;:::i;40299:227::-;;;;;;;;;;-1:-1:-1;40299:227:0;;;;;:::i;:::-;;:::i;8924:30::-;;;;;;;;;;;;;;;;44734:49;;;;;;;;;;-1:-1:-1;44734:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;15430:122;;;;;;;;;;-1:-1:-1;15430:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;15521:16:0;15494:7;15521:16;;;:10;:16;;;;;:23;;15430:122;9199:30;;;;;;;;;;-1:-1:-1;9199:30:0;;;;;;;;8184:29;;;;;;;;;;;;;;;16959:94;;;;;;;;;;-1:-1:-1;17036:9:0;;16959:94;;17036:9;;;;4991:36:1;;4979:2;4964:18;16959:94:0;4849:184:1;8268:44:0;;;;;;;;;;-1:-1:-1;8268:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41690:226;;;;;;;;;;-1:-1:-1;41690:226:0;;;;;:::i;:::-;;:::i;44044:95::-;;;;;;;;;;-1:-1:-1;44044:95:0;;;;;:::i;:::-;;:::i;15564:128::-;;;;;;;;;;-1:-1:-1;15564:128:0;;;;;:::i;:::-;-1:-1:-1;;;;;15657:14:0;15630:7;15657:14;;;:8;:14;;;;;:27;;;;15564:128;8066:41;;;;;;;;;;-1:-1:-1;8066:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45686:38;;;;;;;;;;;;;;;;26009:380;;;;;;;;;;;;;:::i;8586:30::-;;;;;;;;;;;;;;;;39933:165;;;;;;;;;;-1:-1:-1;39933:165:0;;;;;:::i;:::-;;:::i;40108:183::-;;;;;;;;;;-1:-1:-1;40108:183:0;;;;;:::i;:::-;;:::i;8423:34::-;;;;;;;;;;;;;;;;45568:29;;;;;;;;;;;;;;;;15704:120;;;;;;;;;;-1:-1:-1;15704:120:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41924:111::-;;;;;;;;;;-1:-1:-1;41924:111:0;;;;;:::i;:::-;;:::i;15998:745::-;;;;;;;;;;-1:-1:-1;15998:745:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40773:425::-;;;;;;;;;;;;;:::i;38545:242::-;;;;;;;;;;-1:-1:-1;38545:242:0;;;;;:::i;:::-;;:::i;17164:155::-;;;;;;;;;;-1:-1:-1;17164:155:0;;;;;:::i;:::-;;:::i;2992:148::-;;;;;;;;;;;;;:::i;42896:512::-;;;;;;;;;;-1:-1:-1;42896:512:0;;;;;:::i;:::-;;:::i;44792:105::-;;;;;;;;;;-1:-1:-1;44871:11:0;:18;44792:105;;42043:218;;;;;;;;;;-1:-1:-1;42043:218:0;;;;;:::i;:::-;;:::i;44406:33::-;;;;;;;;;;;;;;;;45731:43;;;;;;;;;;;;;;;;39421:170;;;;;;;;;;-1:-1:-1;39421:170:0;;;;;:::i;:::-;;:::i;48096:30::-;;;;;;;;;;;;;;;;9108:32;;;;;;;;;;;;;;;;48265:94;;;;;;;;;;-1:-1:-1;48265:94:0;;;;;:::i;:::-;;:::i;9015:47::-;;;;;;;;;;-1:-1:-1;9015:47:0;;;;;:::i;:::-;;:::i;39283:130::-;;;;;;;;;;-1:-1:-1;39283:130:0;;;;;:::i;:::-;;:::i;45643:36::-;;;;;;;;;;;;;;;;2810:79;;;;;;;;;;-1:-1:-1;2848:7:0;2875:6;-1:-1:-1;;;;;2875:6:0;2810:79;;37278:48;;;;;;;;;;-1:-1:-1;37278:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;44448:186;;;;;;;;;;-1:-1:-1;44448:186:0;;;;;:::i;:::-;;:::i;9149:43::-;;;;;;;;;;-1:-1:-1;9149:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37333:32;;;;;;;;;;;;;;;;16751:98;;;;;;;;;;;;;:::i;47694:106::-;;;;;;;;;;-1:-1:-1;47694:106:0;;;;;:::i;:::-;;:::i;8349:31::-;;;;;;;;;;;;;;;;7805:24;;;;;;;;;;-1:-1:-1;7805:24:0;;;;-1:-1:-1;;;;;7805:24:0;;;48171:86;;;;;;;;;;-1:-1:-1;48171:86:0;;;;;:::i;:::-;;:::i;8623:30::-;;;;;;;;;;;;;;;;25439:27;;;;;;;;;;;;;;;;9263:49;;;;;;;;;;;;;;;49265:102;;;;;;;;;;-1:-1:-1;49265:102:0;;;;;:::i;:::-;;:::i;42658:230::-;;;;;;;;;;-1:-1:-1;42658:230:0;;;;;:::i;:::-;;:::i;42269:117::-;;;;;;;;;;-1:-1:-1;42269:117:0;;;;;:::i;:::-;;:::i;17327:190::-;;;;;;;;;;-1:-1:-1;17327:190:0;;;;;:::i;:::-;;:::i;9429:55::-;;;;;;;;;;;;;;;48408:753;;;;;;;;;;;;;:::i;41331:224::-;;;;;;;;;;-1:-1:-1;41331:224:0;;;;;:::i;:::-;;:::i;24341:385::-;;;;;;;;;;-1:-1:-1;24341:385:0;;;;;:::i;:::-;;:::i;42394:115::-;;;;;;;;;;-1:-1:-1;42394:115:0;;;;;:::i;:::-;;:::i;8662:33::-;;;;;;;;;;;;;;;24734:447;;;;;;;;;;-1:-1:-1;24734:447:0;;;;;:::i;:::-;;:::i;:::-;;;;9375:25:1;;;9431:2;9416:18;;9409:34;;;;9348:18;24734:447:0;9201:248:1;43416:498:0;;;;;;;;;;-1:-1:-1;43416:498:0;;;;;:::i;:::-;;:::i;9375:47::-;;;;;;;;;;;;;;;8387:29;;;;;;;;;;;;;;;;8542:35;;;;;;;;;;;;;;;;8505:30;;;;;;;;;;;;;;;;8961:47;;;;;;;;;;-1:-1:-1;8961:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8961:47:0;;;;;;;;;;;;;10900:25:1;;;-1:-1:-1;;;;;10961:32:1;;;10956:2;10941:18;;10934:60;11010:18;;;11003:34;;;;11068:2;11053:18;;11046:34;11111:3;11096:19;;11089:35;10887:3;10872:19;8961:47:0;10641:489:1;9069:32:0;;;;;;;;;;;;;;;;8702:33;;;;;;;;;;;;;;;8795:30;;;;;;;;;;-1:-1:-1;8795:30:0;;;;;;;;25473:32;;;;;;;;;;;;;;;;38379:158;;;;;;;;;;-1:-1:-1;38379:158:0;;;;;:::i;:::-;;:::i;41206:117::-;;;;;;;;;;-1:-1:-1;41206:117:0;;;;;:::i;:::-;;:::i;41563:119::-;;;;;;;;;;-1:-1:-1;41563:119:0;;;;;:::i;:::-;;:::i;8148:29::-;;;;;;;;;;;;;;;45604:32;;;;;;;;;;;;;;;;17525:168;;;;;;;;;;-1:-1:-1;17525:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;17658:18:0;;;17631:7;17658:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17525:168;44642:28;;;;;;;;;;-1:-1:-1;44642:28:0;;;;;:::i;:::-;;:::i;9319:49::-;;;;;;;;;;;;;;;38795:257;;;;;;;;;;-1:-1:-1;38795:257:0;;;;;:::i;:::-;;:::i;7772:26::-;;;;;;;;;;-1:-1:-1;7772:26:0;;;;-1:-1:-1;;;;;7772:26:0;;;49225:31;;;;;;;;;;;;;;;;9236:20;;;;;;;;;;-1:-1:-1;9236:20:0;;;;;;;-1:-1:-1;;;;;9236:20:0;;;44677:50;;;;;;;;;;-1:-1:-1;44677:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;3148:208;;;;;;;;;;-1:-1:-1;3148:208:0;;;;;:::i;:::-;;:::i;39599:97::-;;;;;;;;;;-1:-1:-1;39599:97:0;;;;;:::i;:::-;;:::i;47808:110::-;;;;;;;;;;-1:-1:-1;47808:110:0;;;;;:::i;:::-;;:::i;49169:49::-;;;;;;;;;;;;;;;;5381:315;4679:1;5510:7;;:18;5506:88;;5552:30;;-1:-1:-1;;;5552:30:0;;;;;;;;;;;5506:88;4679:1;5671:7;:17;5381:315::o;17164:155::-;-1:-1:-1;;;;;17268:18:0;17230:7;17268:18;;;:9;:18;;;;;;;17164:155::o;13731:817::-;13857:6;;:23;;-1:-1:-1;;;13857:23:0;;-1:-1:-1;;;;;705:32:1;;;13857:23:0;;;687:51:1;13812:7:0;;;;13857:6;;;;;;;;:17;;660:18:1;;13857:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13832:48;-1:-1:-1;13891:19:0;13956:1;13935:567;13968:1;13959:5;:10;13935:567;;14016:1;14045;14036:10;;;14032:30;;-1:-1:-1;14061:1:0;14032:30;-1:-1:-1;;;;;14081:28:0;;;;;;:81;;-1:-1:-1;;;;;;14113:24:0;;;;;;:8;:24;;;;;:35;;;:49;-1:-1:-1;14113:49:0;14081:81;14077:349;;;14183:14;7282:5;14200:26;7340:4;14200:5;:26;:::i;:::-;:44;;;;:::i;:::-;14183:61;;14263:40;14280:14;14296:6;14263:16;:40::i;:::-;14327:43;;;9375:25:1;;;9431:2;9416:18;;9409:34;;;-1:-1:-1;;;;;14327:43:0;;;;;9348:18:1;14327:43:0;;;;;;;14389:21;14404:6;14389:21;;:::i;:::-;;;14164:262;14077:349;14457:6;;:33;;-1:-1:-1;;;14457:33:0;;-1:-1:-1;;;;;705:32:1;;;14457:33:0;;;687:51:1;14457:6:0;;;;;;;;:17;;660:18:1;;14457:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14440:50;;13980:522;13971:7;;;;;:::i;:::-;;;;13935:567;;;-1:-1:-1;14529:11:0;-1:-1:-1;;13731:817:0;;;;;:::o;14745:677::-;14915:11;:13;;14877:7;;;;14915:13;14877:7;14915:13;;;:::i;:::-;;;;-1:-1:-1;14949:23:0;14975:19;;;:10;:19;;;;;;;;15005:23;;;15039:10;;;;:17;;-1:-1:-1;;;;;;15039:17:0;-1:-1:-1;;;;;15039:17:0;;;;;;;;15067:15;;;:27;;;15105:17;;;:31;;;15165:15;15147;;;:33;15201:16;;:10;:16;;;;;:30;;;;;;;;;;;;;;;;15242:17;:30;;14975:19;;-1:-1:-1;14975:19:0;;15067:27;;14949:23;15242:30;;15067:27;;15242:30;:::i;:::-;;;;;;;;15304:11;15283:17;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;15341:48:0;;;12058:25:1;;;15384:4:0;12114:2:1;12099:18;;12092:50;-1:-1:-1;;;;;15341:48:0;;;15358:7;;15341:48;;12031:18:1;15341:48:0;;;;;;;-1:-1:-1;15407:7:0;14745:677;-1:-1:-1;;;;14745:677:0:o;47926:102::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;;;;;;;;;47994:19:::1;:26:::0;47926:102::o;16857:94::-;16905:13;16938:5;16931:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16857:94;:::o;17701:184::-;17801:4;17818:37;17827:10;17839:7;17848:6;17818:8;:37::i;:::-;-1:-1:-1;17873:4:0;17701:184;;;;:::o;49375:98::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;49445:12:::1;:20:::0;49375:98::o;42517:133::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;42610:32:::1;42624:5;42631:2;42635:6;42610:13;:32::i;:::-;42517:133:::0;;;:::o;45408:152::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45520:23:0;;;::::1;;::::0;;;:17:::1;:23;::::0;;;;:32;;-1:-1:-1;;45520:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;45408:152::o;38253:118::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;38338:13:::1;:25:::0;38253:118::o;39704:221::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;39790:1:::1;39781:6;:10;39773:50;;;::::0;-1:-1:-1;;;39773:50:0;;13070:2:1;39773:50:0::1;::::0;::::1;13052:21:1::0;13109:2;13089:18;;;13082:30;13148:29;13128:18;;;13121:57;13195:18;;39773:50:0::1;12868:351:1::0;39773:50:0::1;39852:8;39842:6;:18;;39834:50;;;::::0;-1:-1:-1;;;39834:50:0;;13426:2:1;39834:50:0::1;::::0;::::1;13408:21:1::0;13465:2;13445:18;;;13438:30;-1:-1:-1;;;13484:18:1;;;13477:49;13543:18;;39834:50:0::1;13224:343:1::0;39834:50:0::1;39895:13;:22:::0;39704:221::o;40534:231::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;40670:11:::1;:21:::0;;;;40702:9:::1;:17:::0;40730:14:::1;:27:::0;40534:231::o;45783:1903::-;45889:12;45867:19;;45843:21;;:43;;;;:::i;:::-;:58;45839:97;;;45783:1903;:::o;45839:97::-;45974:17;;46006:54;;-1:-1:-1;;;46006:54:0;;-1:-1:-1;;;;;46037:21:0;705:32:1;;46006:54:0;;;687:51:1;45974:17:0;;46013:4;46006:22;;;;;;660:18:1;;46006:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;46002:111;;;46095:7;45783:1903;:::o;46002:111::-;46230:36;;-1:-1:-1;;;46230:36:0;;46258:6;46230:36;;;687:51:1;46149:8:0;;46123:16;;-1:-1:-1;;;;;46230:19:0;;;;;660:18:1;;46230:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46191:9;-1:-1:-1;;;;;46191:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;;;:::i;:::-;46169:97;;46286:14;46281:1;:19;46277:58;;46317:7;;;45783:1903;:::o;46277:58::-;46461:11;:18;46347:19;;;;;;;;;46573:9;46615:15;;46555:27;;-1:-1:-1;46643:989:0;46660:3;46650:7;:13;:46;;;;;46680:16;46667:10;:29;46650:46;46643:989;;;46735:16;46717:14;;:34;46713:93;;46789:1;46772:14;:18;46713:93;46834:11;46846:14;;46834:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;46834:27:0;46881:30;;;:17;:30;;;;;;;;46834:27;;-1:-1:-1;46881:30:0;;46876:595;;46946:32;;-1:-1:-1;;;46946:32:0;;-1:-1:-1;;;;;705:32:1;;;46946::0;;;687:51:1;46946:19:0;;;;;660:18:1;;46946:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47016:21:0;;46997:16;47016:21;;;:8;:21;;;;;:30;46932:46;;-1:-1:-1;47069:22:0;;;47065:93;;;47130:8;47116:22;;47065:93;47195:11;47180;:26;47176:280;;47274:14;47241:29;47259:11;47241:15;:29;:::i;:::-;47240:48;;;;:::i;:::-;47231:57;-1:-1:-1;47315:10:0;;47311:126;;47354:59;;-1:-1:-1;;;47354:59:0;;-1:-1:-1;;;;;47354:21:0;:32;;;;:59;;47387:4;;47393:11;;47406:6;;47354:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47311:126;46913:558;46876:595;47518:9;47508:19;;:7;:19;:::i;:::-;47497:31;;:7;:31;:::i;:::-;47487:41;;47553:9;47577:14;:16;;47543:19;;-1:-1:-1;47577:14:0;:16;;;:::i;:::-;;;;;;47608:12;;;;;:::i;:::-;;;;46643:989;;;-1:-1:-1;;47666:12:0;47642:21;:36;-1:-1:-1;;;;;;;;;;45783:1903:0:o;43922:114::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44002:17:0;;;::::1;;::::0;;;:11:::1;:17;::::0;;;;:26;;-1:-1:-1;;44002:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;43922:114::o;17893:404::-;18025:4;18042:36;18052:6;18060:9;18071:6;18042:9;:36::i;:::-;-1:-1:-1;;;;;18093:19:0;;7230:1;18093:19;;;:11;:19;;;;;;;;18113:10;18093:31;;;;;;;;-1:-1:-1;;18093:38:0;18089:179;;-1:-1:-1;;;;;18199:19:0;;;;;;:11;:19;;;;;;;;18219:10;18199:31;;;;;;;;:57;;18250:6;;18199:57;:::i;:::-;-1:-1:-1;;;;;18148:19:0;;;;;;:11;:19;;;;;;;;18168:10;18148:31;;;;;;;:108;18089:179;-1:-1:-1;18285:4:0;17893:404;;;;;:::o;40299:227::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;40434:10:::1;:20:::0;;;;40465:8:::1;:16:::0;40492:13:::1;:26:::0;40299:227::o;41690:226::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;41817:6:::1;41812:97;41833:4;:11;41829:1;:15;41812:97;;;41891:6;41866:13;:22;41880:4;41885:1;41880:7;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;41866:22:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;41866:22:0;:31;;-1:-1:-1;;41866:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;41846:3:0::1;41812:97;;44044:95:::0;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;44111:11:::1;:20:::0;;-1:-1:-1;;44111:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44044:95::o;26009:380::-;26051:7;26070:16;26089:15;:13;:15::i;:::-;26070:34;;26129:12;;26118:8;:23;26115:248;;;26207:12;;26157:15;;26176:23;26191:8;26207:12;26176:23;:::i;:::-;26175:29;;26203:1;26175:29;:::i;:::-;:44;;;;:::i;:::-;26157:62;;26247:1;26237:7;:11;26234:45;;;26261:11;26271:1;26261:7;:11;:::i;:::-;26260:17;;26276:1;26260:17;:::i;:::-;26250:27;;26234:45;26306:2;26296:7;:12;26293:30;;;-1:-1:-1;26320:1:0;26344:7;26009:380;-1:-1:-1;;26009:380:0:o;26115:248::-;26380:1;26373:8;;;26009:380;:::o;39933:165::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;40019:1:::1;40010:6;:10;40002:55;;;::::0;-1:-1:-1;;;40002:55:0;;14517:2:1;40002:55:0::1;::::0;::::1;14499:21:1::0;;;14536:18;;;14529:30;14595:34;14575:18;;;14568:62;14647:18;;40002:55:0::1;14315:356:1::0;40002:55:0::1;40068:13;:22:::0;39933:165::o;40108:183::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40188:27:0;::::1;40180:62;;;::::0;-1:-1:-1;;;40180:62:0;;14878:2:1;40180:62:0::1;::::0;::::1;14860:21:1::0;14917:2;14897:18;;;14890:30;-1:-1:-1;;;14936:18:1;;;14929:52;14998:18;;40180:62:0::1;14676:346:1::0;40180:62:0::1;40253:6;:30:::0;;-1:-1:-1;;;;;40253:30:0;;::::1;;;-1:-1:-1::0;;;;;;40253:30:0;;::::1;::::0;;;::::1;::::0;;40108:183::o;15704:120::-;-1:-1:-1;;;;;15800:16:0;;;;;;:10;:16;;;;;;;;;15793:23;;;;;;;;;;;;;;;;;15764:16;;15793:23;;;15800:16;15793:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15704:120;;;:::o;41924:111::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42003:15:0;;;::::1;;::::0;;;:9:::1;:15;::::0;;;;:24;;-1:-1:-1;;42003:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41924:111::o;15998:745::-;16115:6;;:27;;-1:-1:-1;;;16115:27:0;;-1:-1:-1;;;;;705:32:1;;;16115:27:0;;;687:51:1;16056:18:0;;16087:25;;16115:6;;;;;;;;:21;;660:18:1;;16115:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16115:27:0;;;;;;;;;;;;:::i;:::-;16087:55;;16153:31;16203:8;:15;16187:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16187:32:0;;;;;;;;;;;;;;;;-1:-1:-1;16153:66:0;-1:-1:-1;16245:9:0;16240:456;16264:8;:15;16260:1;:19;16240:456;;;16301:13;16317:8;16326:1;16317:11;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;16375:15:0;;;16343:29;16375:15;;;:8;:15;;;;;;;16343:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;16439:245;;;;;;;;;;16518:6;;:31;;-1:-1:-1;;;16518:31:0;;;;;687:51:1;;;;16317:11:0;;-1:-1:-1;16343:47:0;16439:245;;;16518:6;;;;;;:24;;660:18:1;;16518:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16439:245;;;;16585:13;:24;;;16439:245;;;;16642:13;:26;;;16439:245;;;16421:12;16434:1;16421:15;;;;;;;;:::i;:::-;;;;;;;;;;:263;-1:-1:-1;;16281:3:0;;16240:456;;;-1:-1:-1;16723:12:0;15998:745;-1:-1:-1;;;15998:745:0:o;40773:425::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;40838:15:::1;::::0;40833:20;40825:40:::1;;;::::0;-1:-1:-1;;;40825:40:0;;16185:2:1;40825:40:0::1;::::0;::::1;16167:21:1::0;16224:1;16204:18;;;16197:29;-1:-1:-1;;;16242:18:1;;;16235:37;16289:18;;40825:40:0::1;15983:330:1::0;40825:40:0::1;40894:12;40876:15;:30:::0;40934:15:::1;40917:14;:32:::0;-1:-1:-1;40974:21:0::1;-1:-1:-1::0;40974:9:0::1;:21::i;:::-;40960:35:::0;-1:-1:-1;41010:10:0;;41006:185:::1;;41047:15;::::0;-1:-1:-1;;;;;41047:15:0::1;41037:26;::::0;;;:9:::1;:26;::::0;;;;:36;;41067:6;;41037:26;:36:::1;::::0;41067:6;;41037:36:::1;:::i;:::-;::::0;;;-1:-1:-1;;41088:21:0::1;::::0;;;:9:::1;:21;::::0;;:31;;41113:6;;41088:21;:31:::1;::::0;41113:6;;41088:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;41139:40:0::1;::::0;1550:25:1;;;41160:10:0::1;::::0;41156:1:::1;::::0;41139:40:::1;::::0;1538:2:1;1523:18;41139:40:0::1;;;;;;;41006:185;40814:384;40773:425::o:0;38545:242::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;38676:6:::1;38671:109;38692:8;:15;38688:1;:19;38671:109;;;38758:10;38729:13;:26;38743:8;38752:1;38743:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;38729:26:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;38729:26:0;:39;38709:3:::1;;38671:109;;2992:148:::0;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;3099:1:::1;3083:6:::0;;3062:40:::1;::::0;-1:-1:-1;;;;;3083:6:0;;::::1;::::0;3062:40:::1;::::0;3099:1;;3062:40:::1;3130:1;3113:19:::0;;-1:-1:-1;;;;;;3113:19:0::1;::::0;;2992:148::o;42896:512::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;43031:15;;43017:11:::1;::::0;;43126:275:::1;43146:3;43142:1;:7;43126:275;;;43178:8;43187:1;43178:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;43222:17:0;::::1;;::::0;;;:8:::1;:17:::0;;;;;;;43254:35;;;43178:11;;-1:-1:-1;43222:17:0;-1:-1:-1;43304:23:0::1;43178:11:::0;43304:14:::1;:23::i;:::-;43371:3;;43126:275;;;;43006:402;;;42896:512:::0;;:::o;42043:218::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;42166:6:::1;42161:93;42182:4;:11;42178:1;:15;42161:93;;;42236:6;42215:9;:18;42225:4;42230:1;42225:7;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;42215:18:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;42215:18:0;:27;;-1:-1:-1;;42215:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;42195:3:0::1;42161:93;;39421:170:::0;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;39487:9:::1;:16:::0;;-1:-1:-1;;;;;;39487:16:0::1;-1:-1:-1::0;;;;;39487:16:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;39514:18:0;;;:12:::1;:18;::::0;;;;:25;;-1:-1:-1;;39514:25:0::1;-1:-1:-1::0;39514:25:0::1;::::0;;39576:7:::1;39582:1;-1:-1:-1::0;;39576:7:0::1;:::i;:::-;-1:-1:-1::0;;;;;39550:14:0;;::::1;;::::0;;;:8:::1;:14;::::0;;;;:33;39421:170::o;48265:94::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;48333:14:::1;:18:::0;48265:94::o;9015:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39283:130::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;39351:11:::1;:18:::0;;-1:-1:-1;;;;;39351:18:0;;::::1;-1:-1:-1::0;;;;;;39351:18:0;;::::1;::::0;::::1;::::0;;:11:::1;39380:18:::0;;;:12:::1;:18;::::0;;;;:25;;-1:-1:-1;;39380:25:0::1;39351:18:::0;39380:25:::1;::::0;;39283:130::o;44448:186::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;44546:6:::1;44530:12;:22;;:49;;;;;44572:7;44556:12;:23;;44530:49;44522:69;;;::::0;-1:-1:-1;;;44522:69:0;;16520:2:1;44522:69:0::1;::::0;::::1;16502:21:1::0;16559:1;16539:18;;;16532:29;-1:-1:-1;;;16577:18:1;;;16570:37;16624:18;;44522:69:0::1;16318:330:1::0;44522:69:0::1;44602:9;:24:::0;44448:186::o;16751:98::-;16801:13;16834:7;16827:14;;;;;:::i;47694:106::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;47768:15:::1;:24:::0;47694:106::o;48171:86::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;48235:10:::1;:14:::0;48171:86::o;49265:102::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;49337:13:::1;:22:::0;49265:102::o;42658:230::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42794:17:0;::::1;42770:21;42794:17:::0;;;:8:::1;:17;::::0;;;;42822:24;;;42857:23:::1;42803:7:::0;42857:14:::1;:23::i;42269:117::-:0;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42351:18:0;;;::::1;;::::0;;;:12:::1;:18;::::0;;;;:27;;-1:-1:-1;;42351:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42269:117::o;17327:190::-;17430:4;17447:40;17457:10;17469:9;17480:6;17447:9;:40::i;48408:753::-;48453:14;;48448:1;:19;48444:58;;48408:753::o;48444:58::-;48570:14;;48530:15;;48570:32;;48079:10;;48570:32;:::i;:::-;48560:7;:42;48556:81;;;48619:7;48408:753::o;48556:81::-;48666:8;48647:16;48707:19;48666:8;48707:9;:19::i;:::-;48685:41;;48737:13;48079:10;48765:14;;48755:7;:24;;;;:::i;:::-;48754:44;;;;:::i;:::-;48737:61;;48821:1;48813:5;:9;48809:24;;;-1:-1:-1;48832:1:0;48809:24;48844:20;48916:5;7282;48883:10;;48869:11;:24;;;;:::i;:::-;48868:44;;;;:::i;:::-;48867:54;;;;:::i;:::-;48844:77;-1:-1:-1;48936:16:0;;48932:145;;48969:55;48984:8;49002:6;49011:12;48969:14;:55::i;:::-;49049:8;-1:-1:-1;;;;;49039:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48932:145;49087:14;:24;;;49127:26;;1550:25:1;;;49127:26:0;;1538:2:1;1523:18;49127:26:0;;;;;;;48433:728;;;;;48408:753::o;41331:224::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;41457:6:::1;41452:96;41473:4;:11;41469:1;:15;41452:96;;;41530:6;41506:12;:21;41519:4;41524:1;41519:7;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;41506:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;41506:21:0;:30;;-1:-1:-1;;41506:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;41486:3:0::1;41452:96;;24341:385:::0;24425:14;24441:13;24456:20;24512:19;24526:4;24512:13;:19::i;:::-;24494:37;;-1:-1:-1;24494:37:0;-1:-1:-1;;;;;;24554:8:0;24546:16;;;;;;24542:168;;24594:28;;-1:-1:-1;;;24594:28:0;;-1:-1:-1;;;;;705:32:1;;;24594:28:0;;;687:51:1;24601:4:0;24594:22;;;;660:18:1;;24594:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24579:43;;24542:168;;;24670:28;;-1:-1:-1;;;24670:28:0;;-1:-1:-1;;;;;705:32:1;;;24670:28:0;;;687:51:1;24677:4:0;24670:22;;;;660:18:1;;24670:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24655:43;;24542:168;24341:385;;;;;:::o;42394:115::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;42458:43:::1;::::0;-1:-1:-1;;;;;42458:20:0;::::1;::::0;42479:21:::1;42458:43:::0;::::1;;;::::0;::::1;::::0;;;42479:21;42458:20;:43;::::1;;;;;;;;;;;;;;;;;;;;42394:115:::0;:::o;24734:447::-;24819:14;24835:13;24866:18;24897:4;24866:36;;24914:7;24923:10;24939:8;-1:-1:-1;;;;;24939:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;24913:48:0;;;;-1:-1:-1;24913:48:0;;-1:-1:-1;24995:4:0;25035;-1:-1:-1;;;;;25014:26:0;;;25010:164;;;25066:2;25057:11;;25091:2;25083:10;;25010:164;;;25135:2;25126:11;;25160:2;25152:10;;25010:164;24855:326;;;;24734:447;;;:::o;43416:498::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;43566:15;;43552:11:::1;::::0;;43650:257:::1;43670:3;43666:1;:7;43650:257;;;43702:8;43711:1;43702:11;;;;;;;;:::i;:::-;;;;;;;43692:21;;43735:8;:17;43744:7;-1:-1:-1::0;;;;;43735:17:0::1;-1:-1:-1::0;;;;;43735:17:0::1;;;;;;;;;;;;43728:24;;43783:9;43793:1;43783:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;43767:28;;43810:23:::1;43825:7:::0;43810:14:::1;:23::i;:::-;43877:3;;43650:257;;38379:158:::0;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38494:22:0;;::::1;;::::0;;;:13:::1;:22;::::0;;;;:35;38379:158::o;41206:117::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41288:18:0;;;::::1;;::::0;;;:12:::1;:18;::::0;;;;:27;;-1:-1:-1;;41288:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41206:117::o;41563:119::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41646:19:0;;;::::1;;::::0;;;:13:::1;:19;::::0;;;;:28;;-1:-1:-1;;41646:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41563:119::o;44642:28::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44642:28:0;;-1:-1:-1;44642:28:0;:::o;38795:257::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;38937:6:::1;38932:113;38953:8;:15;38949:1;:19;38932:113;;;39019:11;39031:1;39019:14;;;;;;;;:::i;:::-;;;;;;;38990:13;:26;39004:8;39013:1;39004:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;38990:26:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;38990:26:0;:43;38970:3:::1;;38932:113;;3148:208:::0;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3237:22:0;::::1;3229:37;;;::::0;-1:-1:-1;;;3229:37:0;;17503:2:1;3229:37:0::1;::::0;::::1;17485:21:1::0;17542:1;17522:18;;;17515:29;-1:-1:-1;;;17560:18:1;;;17553:32;17602:18;;3229:37:0::1;17301:325:1::0;3229:37:0::1;3303:6;::::0;;3282:38:::1;::::0;-1:-1:-1;;;;;3282:38:0;;::::1;::::0;3303:6;::::1;::::0;3282:38:::1;::::0;::::1;3331:6;:17:::0;;-1:-1:-1;;;;;;3331:17:0::1;-1:-1:-1::0;;;;;3331:17:0;;;::::1;::::0;;;::::1;::::0;;3148:208::o;39599:97::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;39667:11:::1;:21:::0;;-1:-1:-1;;39667:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39599:97::o;47808:110::-;2937:6;;-1:-1:-1;;;;;2937:6:0;2947:10;2937:20;2929:35;;;;-1:-1:-1;;;2929:35:0;;;;;;;:::i;:::-;47884:17:::1;:26:::0;47808:110::o;14556:181::-;14666:12;;;14627;14666;;;;;;;;;-1:-1:-1;;;;;14644:7:0;;;14659:5;;14644:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14626:53;;;14698:7;14690:39;;;;-1:-1:-1;;;14690:39:0;;18139:2:1;14690:39:0;;;18121:21:1;18178:2;18158:18;;;18151:30;-1:-1:-1;;;18197:18:1;;;18190:49;18256:18;;14690:39:0;17937:343:1;18305:177:0;-1:-1:-1;;;;;18390:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18442:32;;1550:25:1;;;18442:32:0;;1523:18:1;18442:32:0;;;;;;;;18305:177;;;:::o;44147:251::-;44290:45;;;-1:-1:-1;;;;;18477:32:1;;;44290:45:0;;;18459:51:1;18526:18;;;;18519:34;;;44290:45:0;;;;;;;;;;18432:18:1;;;;44290:45:0;;;;;;;-1:-1:-1;;;;;44290:45:0;-1:-1:-1;;;44290:45:0;;;44265:81;;-1:-1:-1;;;;44265:10:0;;;;:81;;44290:45;44265:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44229:117;;;;44361:7;:26;;;;-1:-1:-1;;;;;;44147:251:0:o;18490:2068::-;-1:-1:-1;;;;;18593:15:0;;;;;;:9;:15;;;;;;;;18592:16;;:38;;-1:-1:-1;;;;;;18612:18:0;;;;;;:12;:18;;;;;;;;18592:38;:60;;;-1:-1:-1;;;;;;18634:18:0;;;;;;:12;:18;;;;;;;;18592:60;18570:119;;;;-1:-1:-1;;;18570:119:0;;18766:2:1;18570:119:0;;;18748:21:1;18805:1;18785:18;;;18778:29;-1:-1:-1;;;18823:18:1;;;18816:39;18872:18;;18570:119:0;18564:332:1;18570:119:0;18702:15;18720;18730:4;18720:9;:15::i;:::-;18702:33;;18765:6;18754:7;:17;;18746:33;;;;-1:-1:-1;;;18746:33:0;;19103:2:1;18746:33:0;;;19085:21:1;19142:1;19122:18;;;19115:29;-1:-1:-1;;;19160:18:1;;;19153:33;19203:18;;18746:33:0;18901:326:1;18746:33:0;18790:18;:16;:18::i;:::-;-1:-1:-1;;;;;18947:16:0;;18828;18947;;;:12;:16;;;;;;18847:9;;18828:16;;;18947;;:43;;;;-1:-1:-1;18979:10:0;18967:23;;;;:11;:23;;;;;;;;18947:43;:63;;;;;19006:4;-1:-1:-1;;;;;18994:16:0;:8;-1:-1:-1;;;;;18994:16:0;;18947:63;18943:328;;;19044:27;19060:2;19064:6;19044:15;:27::i;:::-;19027:44;;19107:1;19090:14;:18;:36;;;;;19118:8;-1:-1:-1;;;;;19112:14:0;:2;-1:-1:-1;;;;;19112:14:0;;19090:36;19086:174;;;-1:-1:-1;;;;;19165:18:0;;;;;;:8;:18;;;;;19202:42;;19165:18;;-1:-1:-1;19230:14:0;;19165:18;;19202:42;;19230:14;;19202:42;:::i;:::-;;;;-1:-1:-1;;19086:174:0;-1:-1:-1;;;;;19323:18:0;;19283:25;19323:18;;;:12;:18;;;;;;;;19319:398;;;19378:32;19397:4;19403:6;19378:18;:32::i;:::-;19358:52;;19449:1;19429:17;:21;:41;;;;;19462:8;-1:-1:-1;;;;;19454:16:0;:4;-1:-1:-1;;;;;19454:16:0;;19429:41;19425:281;;;-1:-1:-1;;;;;19496:22:0;;;;;;:12;:22;;;;;;;;19491:200;;-1:-1:-1;;;;;19551:18:0;;;;;;:8;:18;;;;;:27;:48;-1:-1:-1;19551:48:0;19543:57;;;;;;-1:-1:-1;;;;;19623:18:0;;;;;;:8;:18;;;;;:48;;19654:17;;19623:18;:48;;19654:17;;19623:48;:::i;:::-;;;;-1:-1:-1;;19491:200:0;-1:-1:-1;;;;;19756:18:0;;19729:12;19756:18;;;:12;:18;;;;;;;;;:38;;-1:-1:-1;;;;;;19778:16:0;;;;;;:12;:16;;;;;;;;19756:38;19752:468;;;19820:15;;19815:1;:20;19811:139;;-1:-1:-1;;;;;19860:18:0;;;;;;:12;:18;;;;;;;;:42;;;;-1:-1:-1;19882:15:0;;:20;19860:42;19856:78;;;19922:12;19904:15;:30;19856:78;-1:-1:-1;;;;;19971:18:0;;;;;;:12;:18;;;;;;;;19970:19;:40;;;;-1:-1:-1;;;;;;19994:16:0;;;;;;:12;:16;;;;;;;;19993:17;19970:40;19966:243;;;20041:4;20031:14;;20073:15;;20068:1;:20;20064:130;;20125:15;;20121:1;:19;:41;;;;;20161:1;20144:14;:18;20121:41;20113:61;;;;-1:-1:-1;;;20113:61:0;;19434:2:1;20113:61:0;;;19416:21:1;19473:1;19453:18;;;19446:29;-1:-1:-1;;;19491:18:1;;;19484:37;19538:18;;20113:61:0;19232:330:1;20113:61:0;20232:76;20247:4;20253:2;20257:6;20265:7;20274:14;20290:17;20232:14;:76::i;:::-;-1:-1:-1;;;;;20325:21:0;;20341:4;20325:21;20321:230;;20384:1;20367:14;:18;:36;;;;;20395:8;-1:-1:-1;;;;;20389:14:0;:2;-1:-1:-1;;;;;20389:14:0;;20367:36;20363:177;;;20424:20;20439:4;20424:14;:20::i;:::-;20363:177;;;20470:7;20466:74;;;20498:26;20514:9;;20498:15;:26::i;:::-;18559:1999;;;;;;18490:2068;;;:::o;25189:220::-;25236:7;25256:10;25268;25284:22;25297:8;25284:12;:22::i;:::-;-1:-1:-1;25255:51:0;;-1:-1:-1;25255:51:0;-1:-1:-1;25330:1:0;25320:7;25255:51;;25320:7;:::i;:::-;:11;25317:66;;;25369:2;25354:12;:2;25359:7;25354:12;:::i;:::-;:17;;;;:::i;:::-;25347:24;;;;25189:220;:::o;25317:66::-;25400:1;25393:8;;;;25189:220;:::o;44905:495::-;-1:-1:-1;;;;;44970:20:0;;;;;;:15;:20;;;;;;44965:25;;44961:432;;45016:11;:18;45011:23;;:48;;;45056:3;-1:-1:-1;;;;;45038:21:0;:11;45050:1;45038:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;45038:14:0;:21;;45011:48;45007:375;;;45151:16;;45208:8;;45204:63;;45241:7;44905:495;:::o;45204:63::-;-1:-1:-1;45308:11:0;:18;;-1:-1:-1;;;;;45285:20:0;;;;;;:15;:20;;;;;:41;;;45345:21;;;;;;;;;;;;;-1:-1:-1;;;;;;45345:21:0;;;;;;44905:495;:::o;26397:236::-;-1:-1:-1;;;;;26546:17:0;;;;;;:9;:17;;;;;;:27;;26566:7;;26546:27;:::i;:::-;-1:-1:-1;;;;;26526:17:0;;;;;;:9;:17;;;;;:47;26584:41;26536:6;26606:9;26617:7;26584:13;:41::i;25512:489::-;25564:15;;25583:1;25564:20;25560:33;;25512:489::o;25560:33::-;25669:6;;25603:16;;25651:6;25623:24;25669:6;25623:15;:24;:::i;:::-;25622:35;;;;:::i;:::-;:44;;25660:6;25622:44;:::i;:::-;:53;;;;:::i;:::-;25603:72;;25719:8;25700:15;:27;25696:298;;25744:18;25765:17;25776:6;25765:8;:17;:::i;:::-;25744:38;;25797:16;25816:15;:13;:15::i;:::-;25797:34;;25862:7;;25849:10;:20;:36;;;;;25884:1;25873:8;:12;25849:36;25846:137;;;25905:7;:20;;;;25944:12;:23;-1:-1:-1;25512:489:0:o;20566:500::-;20669:17;20700:14;20716:13;20731:20;20755:18;20768:4;20755:12;:18::i;:::-;20699:74;;;;;;20784:19;20827:1;20818:6;:10;:23;;;;;20840:1;20832:5;:9;20818:23;20814:95;;;20892:5;20873:15;20882:6;20873;:15;:::i;:::-;20872:25;;;;:::i;:::-;20858:39;;20814:95;20939:20;20948:11;20939:6;:20;:::i;:::-;20923:12;:36;20919:140;;20992:55;21005:4;21011:12;21025:6;21033;21041:5;20992:12;:55::i;:::-;-1:-1:-1;20976:71:0;-1:-1:-1;20919:140:0;20688:378;;;;20566:500;;;;:::o;21074:658::-;21180:17;21211:14;21227:13;21242:20;21266:18;21279:4;21266:12;:18::i;:::-;21210:74;;;;;;21314:6;21299:12;:21;21295:430;;;21445:6;21427:15;21437:4;21427:9;:15::i;:::-;:24;;;;:::i;:::-;21386:4;-1:-1:-1;;;;;21376:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21367:38;;:6;:38;:::i;:::-;21366:86;;;;:::i;:::-;21337:115;;21295:430;;;21474:11;;;;21470:255;;;21502:19;21549:1;21540:6;:10;:23;;;;;21562:1;21554:5;:9;21540:23;21536:178;;;21619:14;21627:6;21619:5;:14;:::i;:::-;21599:15;21608:6;21599;:15;:::i;:::-;21598:36;;;;:::i;:::-;21584:50;-1:-1:-1;21677:20:0;21691:6;21584:50;21677:20;:::i;:::-;21661:12;:36;;21653:45;;;;;21470:255;21199:533;;;21074:658;;;;:::o;26641:1423::-;-1:-1:-1;;;;;26862:17:0;;;;;;:9;:17;;;;;:28;;26883:7;;26862:17;:28;;26883:7;;26862:28;:::i;:::-;;;;-1:-1:-1;26936:7:0;;-1:-1:-1;26911:22:0;27059:38;27074:6;26936:7;27059:14;:38::i;:::-;27042:55;;27169:7;27165:771;;;27194:17;27213:11;27228:196;27269:6;27295:9;27324:14;27358;27392:17;27228:22;:196::i;:::-;27193:231;;;;27456:9;27439:26;;27546:6;:17;;;;-1:-1:-1;27557:6:0;;;;27556:7;27546:17;27542:383;;;27584:23;27610:47;27630:26;27647:9;27630:14;:26;:::i;:::-;27610:19;:47::i;:::-;27584:73;-1:-1:-1;27680:19:0;;27676:170;;27724:33;27742:15;27724:33;;:::i;:::-;;;27780:46;27802:6;27810:15;27780:21;:46::i;:::-;27864:18;:16;:18::i;:::-;27901:8;:6;:8::i;:::-;27565:360;27542:383;27178:758;;27165:771;27991:65;28005:6;28013:9;28024:31;28041:14;28024;:31;:::i;:::-;27991:13;:65::i;:::-;26851:1213;;26641:1423;;;;;;:::o;39060:213::-;-1:-1:-1;;;;;39197:13:0;;;;;;:9;:13;;;;;;:23;;39213:7;;39197:23;:::i;:::-;-1:-1:-1;;;;;39181:13:0;;;;;;;:9;:13;;;;;;;:39;;;;39236:29;;;;;;;;;;39257:7;1550:25:1;;1538:2;1523:18;;1404:177;21740:2593:0;21908:17;21927:22;21962:23;21998:4;-1:-1:-1;;;;;21988:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21962:55;;22028:13;22057:11;-1:-1:-1;;;;;22057:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22044:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22028:59;;22098:10;22128:1;-1:-1:-1;;;;;22111:19:0;:5;-1:-1:-1;;;;;22111:19:0;;;22098:32;;22141:14;22168:4;-1:-1:-1;;;;;22158:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22141:40;;22196:5;22192:1814;;;22222:11;;22218:1777;;22254:13;22270:18;22280:7;22285:2;22280;:7;:::i;:::-;22270:9;:18::i;:::-;22254:34;;22307:17;22327;22337:6;22327:9;:17::i;:::-;22307:37;;22375:9;22367:5;:17;22363:1617;;;22409:17;;-1:-1:-1;;22529:11:0;-1:-1:-1;;;;;22521:100:0;;22491:1327;;22743:17;22751:9;22743:5;:17;:::i;:::-;22724:37;;:15;:37;:::i;:::-;:41;;22764:1;22724:41;:::i;:::-;22712:53;-1:-1:-1;22820:13:0;:9;22832:1;22820:13;:::i;:::-;22806:10;:5;22814:2;22806:10;:::i;:::-;:28;;;;:::i;:::-;22792:42;;22491:1327;;;-1:-1:-1;;22902:11:0;-1:-1:-1;;;;;22894:100:0;;22864:954;;23123:17;23131:9;23123:5;:17;:::i;:::-;23104:37;;:15;:37;:::i;:::-;23092:49;-1:-1:-1;23194:9:0;23182;:5;23190:1;23182:9;:::i;22864:954::-;-1:-1:-1;;23271:11:0;-1:-1:-1;;;;;23263:100:0;;23233:585;;23482:17;23490:9;23482:5;:17;:::i;:::-;23463:37;;:15;:37;:::i;:::-;:41;;23503:1;23463:41;:::i;:::-;23451:53;-1:-1:-1;23557:9:0;23545;:5;23553:1;23545:9;:::i;23233:585::-;23714:17;23722:9;23714:5;:17;:::i;:::-;23695:37;;:15;:37;:::i;:::-;23683:49;-1:-1:-1;23785:9:0;23773;:5;23781:1;23773:9;:::i;:::-;:21;;;;:::i;:::-;23759:35;;23233:585;23857:23;23869:11;23857:9;:23;:::i;:::-;23840:40;-1:-1:-1;23907:18:0;;23903:57;;23927:33;23946:14;23927:33;;:::i;:::-;;;23903:57;22386:1594;;22363:1617;22235:1760;;22218:1777;24016:15;24034:13;24045:2;24034:8;:13;:::i;:::-;24016:31;;24062:15;24081:1;24062:20;24058:268;;24141:4;24111:27;24121:16;24131:6;24121:7;:16;:::i;24111:27::-;:34;;;;:::i;:::-;24099:46;;24058:268;;;24190:124;24247:2;24218:25;24228:15;24218:7;:25;:::i;:::-;24217:32;;;;:::i;:::-;24297:2;24269:24;24278:15;24269:6;:24;:::i;:::-;24268:31;;;;:::i;:::-;24190:8;:124::i;:::-;24178:136;;24058:268;21951:2382;;;;;21740:2593;;;;;;;;:::o;28076:352::-;28149:7;28169:26;28214:12;;28198:13;;:28;;;;:::i;:::-;28169:57;;28251:18;28241:6;:28;;:55;;;;-1:-1:-1;;;;;;28273:23:0;;28291:4;28273:23;;28241:55;28237:160;;;28313:23;28329:6;28313:15;:23::i;:::-;28358:27;28367:18;28358:6;:27;:::i;:::-;28351:34;;;;;28237:160;-1:-1:-1;28414:6:0;;28076:352;-1:-1:-1;;28076:352:0:o;28440:881::-;28643:16;28661:11;28706:1;28689:14;:18;:43;;;;28731:1;28711:17;:21;28689:43;28685:93;;;-1:-1:-1;28757:1:0;;-1:-1:-1;28757:1:0;28749:17;;28685:93;28798:24;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28798:24:0;-1:-1:-1;;;;;28847:20:0;;;;;;:12;:20;;;;;;;;28843:335;;;28923:36;28941:9;28952:6;28923:17;:36::i;:::-;28916:43;;28974:28;28995:6;28974:20;:28::i;:::-;28843:335;;;-1:-1:-1;;;;;29024:23:0;;;;;;:12;:23;;;;;;;;29020:158;;;29104:34;29123:6;29131;29104:18;:34::i;:::-;29097:41;;29162:4;29153:13;;29020:158;29243:24;29254:6;29262:4;29243:10;:24::i;:::-;29232:35;;29288:25;28440:881;;;;;;;;;:::o;37374:871::-;37557:16;;;37571:1;37557:16;;;;;;;;37460:23;;37513:9;;37460:23;;37557:16;;;;;;;;;;;;-1:-1:-1;37557:16:0;37533:40;;37602:4;37584;37589:1;37584:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;37584:23:0;;;-1:-1:-1;;;;;37584:23:0;;;;;37628:4;37618;37623:1;37618:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37618:14:0;;;:7;;;;;;;;;:14;37667:47;;-1:-1:-1;;;37667:47:0;;37643:21;;37667:11;:25;;;;:47;;37693:14;;37709:4;;37667:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37667:47:0;;;;;;;;;;;;:::i;:::-;37643:71;;37725:18;37746:7;37771:1;37754:7;:14;:18;;;;:::i;:::-;37746:27;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;37810:21:0;;37786;37810;;;:13;:21;;;;;;;37746:27;;-1:-1:-1;37810:21:0;37875:26;;;37871:367;;;-1:-1:-1;;;;;37918:21:0;;37942:1;37918:21;;;:13;:21;;;;;:25;37971:26;37984:13;37971:10;:26;:::i;:::-;37958:39;-1:-1:-1;38012:20:0;38067:10;38036:27;37958:39;38036:14;:27;:::i;:::-;38035:42;;;;:::i;:::-;38012:65;;7282:5;38126:13;;38111:12;:28;;;;:::i;:::-;38110:48;;;;:::i;:::-;38092:66;;37903:267;37871:367;;;-1:-1:-1;;;;;38191:21:0;;;;;;:13;:21;;;;;:35;;38216:10;;38191:21;:35;;38216:10;;38191:35;:::i;:::-;;;;-1:-1:-1;;37871:367:0;37485:760;;;;;;37374:871;;;:::o;31512:392::-;31603:89;31617:6;31633:15;7282:5;31651:22;:15;31669:4;31651:22;:::i;:::-;:40;;;;:::i;31603:89::-;31703:87;31717:6;31733:13;7282:5;31749:22;:15;31767:4;31749:22;:::i;31703:87::-;31801:95;31815:6;31831:21;7282:5;31855:22;:15;31873:4;31855:22;:::i;31912:443::-;9722:6;:13;;-1:-1:-1;;9722:13:0;9731:4;9722:13;;;:6;32000:32:::1;:30;:32::i;:::-;31971:61;;32057:7;:23;;;32084:1;32057:28:::0;32053:67:::1;;32102:7;;;32053:67;32140:20;32163:42;32181:7;:23;;;32163:17;:42::i;:::-;32140:65;;32230:12;32246:1;32230:17:::0;32226:56:::1;;32264:7;;;;32226:56;32302:45;32325:7;32334:12;32302:22;:45::i;:::-;31960:395;;9746:1;9758:6:::0;:14;;-1:-1:-1;;9758:14:0;;;31912:443::o;3487:303::-;3532:6;3559:1;3555;:5;3551:232;;;-1:-1:-1;3581:1:0;3597:6;3606:5;3610:1;3581;3606:5;:::i;:::-;:9;;3614:1;3606:9;:::i;:::-;3597:18;;3630:92;3641:1;3637;:5;3630:92;;;3667:1;-1:-1:-1;3667:1:0;3705;3667;3692:5;3667:1;3692;:5;:::i;:::-;:9;;;;:::i;:::-;3691:15;;;;:::i;:::-;3687:19;;3630:92;;;3562:171;3487:303;;;:::o;3551:232::-;3743:6;;3739:44;;-1:-1:-1;3770:1:0;3739:44;3487:303;;;:::o;3383:96::-;3435:6;3462:1;3458;:5;:13;;3470:1;3458:13;;;3466:1;3458:13;3454:17;3383:96;-1:-1:-1;;;3383:96:0:o;49759:583::-;49849:9;49844:480;49868:12;;49864:1;:16;49844:480;;;49906:18;49927:25;49950:1;49927:22;:25::i;:::-;49906:46;-1:-1:-1;;;;;;49997:24:0;;;;:78;;-1:-1:-1;;;;;;50046:29:0;;50068:6;50046:29;49997:78;:123;;;;50114:6;-1:-1:-1;;;;;50100:20:0;:10;-1:-1:-1;;;;;50100:20:0;;49997:123;:174;;;;50170:1;50145:10;-1:-1:-1;;;;;50145:22:0;;:26;49997:174;49971:271;;;50214:8;;;49971:271;50260:48;50274:6;50282:10;50294:13;;50260;:48::i;:::-;49887:437;49844:480;49882:3;;49844:480;;29484:386;29568:24;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29568:24:0;7282:5;29630:10;;29621:6;:19;;;;:::i;:::-;29620:39;;;;:::i;:::-;29605:12;;;;:54;;;;-1:-1:-1;;;;;29685:24:0;;;;;;:13;:24;;;;;;29680:183;;7282:5;29754:13;;29745:6;:22;;;;:::i;:::-;29744:42;;;;:::i;:::-;29726:60;;29824:8;;7282:5;;29815:17;;:6;:17;:::i;:::-;29814:37;;;;:::i;:::-;29801:10;;;:50;29484:386;;;;:::o;30397:304::-;30491:16;;;30505:1;30491:16;;;;;;;;30467:21;;30491:16;;;;;;;;;;-1:-1:-1;30491:16:0;30467:40;;30528:4;30518;30523:1;30518:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;30518:14:0;;;-1:-1:-1;;;;;30518:14:0;;;;;30561:4;30543;30548:1;30543:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30543:23:0;;;:7;;;;;;;;;:23;30601:43;;-1:-1:-1;;;30601:43:0;;30577:21;;30601:11;:24;;;;:43;;30626:11;;30639:4;;30601:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30601:43:0;;;;;;;;;;;;:::i;:::-;30577:67;;30683:7;30691:1;30683:10;;;;;;;;:::i;:::-;;;;;;;30655:13;:24;30669:9;-1:-1:-1;;;;;30655:24:0;-1:-1:-1;;;;;30655:24:0;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;30397:304:0:o;29882:503::-;29964:24;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29964:24:0;7282:5;30026:11;;30017:6;:20;;;;:::i;:::-;30016:40;;;;:::i;:::-;30001:12;;;;:55;;;;-1:-1:-1;;;;;30082:21:0;;;;;;:13;:21;;;;;;30077:182;;7282:5;30148:14;;30139:6;:23;;;;:::i;:::-;30138:43;;;;:::i;:::-;30120:61;;30219:9;;7282:5;;30210:18;;:6;:18;:::i;:::-;30209:38;;;;:::i;:::-;30196:10;;;:51;30077:182;30279:15;30297:12;:10;:12::i;:::-;30279:30;-1:-1:-1;7282:5:0;30342:16;30279:30;30342:6;:16;:::i;:::-;30341:36;;;;:::i;:::-;30320:18;;;:57;-1:-1:-1;30320:4:0;29882:503;-1:-1:-1;;29882:503:0:o;30713:787::-;30825:15;;30792:16;;30825:19;30821:149;;30873:15;;30861:27;;;;:::i;:::-;;;30903:55;30917:6;30933;30942:4;:15;;;30903:13;:55::i;:::-;30994:10;;;;:14;30990:141;;31037:10;;;;31025:22;;;;:::i;:::-;;;31062:57;31076:6;31092:13;31108:4;:10;;;31062:13;:57::i;:::-;31155:12;;;;:16;31151:149;;31200:12;;;;31188:24;;;;:::i;:::-;;;31227:61;31241:6;31257:15;31275:4;:12;;;31227:13;:61::i;:::-;31324:18;;;;:22;31320:173;;31375:18;;;;31363:30;;;;:::i;:::-;;;31408:73;31422:6;31438:21;31462:4;:18;;;31408:13;:73::i;32564:1069::-;32623:26;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32623:26:0;32711:33;32729:13;32711:9;:33::i;:::-;32692:52;;;32759:20;32755:217;;32851:16;;32796:72;;-1:-1:-1;;;32796:72:0;;-1:-1:-1;;;;;32796:13:0;:24;;;;:72;;32829:4;;;;32851:16;32796:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32908:16:0;;:20;;-1:-1:-1;32927:1:0;;-1:-1:-1;32908:20:0;:::i;:::-;32883:22;;;:45;32755:217;33058:41;33076:21;33058:9;:41::i;:::-;33031:24;;;:68;;;33114:28;33110:149;;33222:24;;;;;33159:88;;-1:-1:-1;;;33159:88:0;;-1:-1:-1;;;;;33159:21:0;:32;;;;:88;;33200:4;;;;33222:24;33159:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33110:149;33332:35;33350:15;33332:9;:35::i;:::-;33311:18;;;:56;;;33382:22;33378:131;;33478:18;;;;33421:76;;-1:-1:-1;;;33421:76:0;;-1:-1:-1;;;;;33421:15:0;:26;;;;:76;;33456:4;;;;33478:18;33421:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33378:131;33607:7;:18;;;33580:7;:24;;;33555:7;:22;;;:49;;;;:::i;:::-;:70;;;;:::i;:::-;33529:23;;;:96;:7;32564:1069::o;33645:1057::-;33710:20;33747:11;33762:1;33747:16;33743:30;;-1:-1:-1;33772:1:0;;33645:1057;-1:-1:-1;33645:1057:0:o;33743:30::-;33818:16;;;33832:1;33818:16;;;;;;;;33794:21;;33818:16;;;;;;;;;;-1:-1:-1;33818:16:0;33794:40;;33863:4;33845;33850:1;33845:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;33845:23:0;;;-1:-1:-1;;;;;33845:23:0;;;;;33889:4;33879;33884:1;33879:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;33879:14:0;;;-1:-1:-1;;;;;33879:14:0;;;;;33990:18;34011:30;34029:11;34011:17;:30::i;:::-;33990:51;-1:-1:-1;;;;;;34066:11:0;:65;;34146:11;33990:51;34246:4;34273:15;34304:21;:15;34322:3;34304:21;:::i;:::-;34066:292;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34062:633;;-1:-1:-1;34682:1:0;;33645:1057;-1:-1:-1;;;33645:1057:0:o;34062:633::-;34389:48;;-1:-1:-1;;;34389:48:0;;-1:-1:-1;;;;;34420:15:0;705:32:1;;34389:48:0;;;687:51:1;34396:4:0;34389:22;;;;660:18:1;;34389:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34374:63;-1:-1:-1;34456:16:0;;34452:118;;34493:61;;-1:-1:-1;;;34493:61:0;;-1:-1:-1;;;;;34493:15:0;:26;;;;:61;;34520:4;;34534;;34541:12;;34493:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34452:118;33732:970;;33645:1057;;;:::o;35389:1041::-;35498:21;;;:53;;-1:-1:-1;35523:23:0;;;;:28;35498:53;35494:66;;;35389:1041;;:::o;35494:66::-;35631:22;;;;:26;35627:231;;35674:24;35747:7;:23;;;35721:7;:22;;;35702:16;:41;;;;:::i;:::-;35701:69;;;;:::i;:::-;35674:96;;35785:61;35805:16;35823:7;:22;;;35785:19;:61::i;:::-;35659:199;35627:231;35925:24;;;;:28;35921:241;;35970:23;36044:7;:23;;;36016:7;:24;;;35997:16;:43;;;;:::i;:::-;35996:71;;;;:::i;:::-;35970:97;;36082:68;36096:4;36110:21;36134:15;36082:13;:68::i;:::-;35955:207;35921:241;36225:18;;;;:22;36221:202;;36264:19;36328:7;:23;;;36306:7;:18;;;36287:16;:37;;;;:::i;:::-;36286:65;;;;:::i;:::-;36386:11;;36264:87;;-1:-1:-1;36366:45:0;;36380:4;;-1:-1:-1;;;;;36386:11:0;36264:87;36366:13;:45::i;49481:270::-;49549:7;49638:15;49668:16;49699:10;49724:4;49607:132;;;;;;;;;;22082:19:1;;;22126:2;22117:12;;22110:28;;;;22176:2;22172:15;-1:-1:-1;;22168:53:1;22163:2;22154:12;;22147:75;22247:2;22238:12;;22231:28;22284:3;22275:13;;21869:425;49607:132:0;;;;-1:-1:-1;;49607:132:0;;;;;;;;;49597:143;;49607:132;49597:143;;;;;49481:270;-1:-1:-1;;49481:270:0:o;34714:481::-;34784:7;34808:11;-1:-1:-1;;;;;34808:25:0;;34834:11;34847:14;:12;:14::i;:::-;34808:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34808:54:0;;;;;;;;;;;;:::i;:::-;;;34804:365;;;34932:1;34914:7;:14;:19;34910:153;;7282:5;35011:7;35019:1;35011:10;;;;;;;;:::i;:::-;;;;;;;35024:4;35011:17;;;;:::i;:::-;35010:37;;;;:::i;34910:153::-;34863:211;34804:365;-1:-1:-1;35186:1:0;;34714:481;-1:-1:-1;34714:481:0:o;36442:828::-;36597:21;7282:5;36622:17;:10;36635:4;36622:17;:::i;:::-;36621:37;;;;:::i;:::-;36597:61;-1:-1:-1;36694:22:0;7282:5;36720:18;:11;36734:4;36720:18;:::i;:::-;36719:38;;;;:::i;:::-;36694:63;;36807:11;-1:-1:-1;;;;;36807:24:0;;36846:4;36873;36893:10;36918:11;36944:13;37009:14;37076:9;;;;;;;;;-1:-1:-1;;;;;37076:9:0;37100:15;37118:3;37100:21;;;;:::i;:::-;36807:347;;;;;;-1:-1:-1;;;;;;36807:347:0;;;-1:-1:-1;;;;;22660:32:1;;;36807:347:0;;;22642:51:1;22729:32;;;22709:18;;;22702:60;22778:18;;;22771:34;;;;22821:18;;;22814:34;;;;22864:19;;;22857:35;;;;22908:19;;;22901:35;22973:32;;;22952:19;;;22945:61;23022:19;;;23015:35;;;;22614:19;;36807:347:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;36807:347:0;;;;;;;;-1:-1:-1;;36807:347:0;;;;;;;;;;;;:::i;:::-;;;36803:460;;;;;;;36520:750;;36442:828;;:::o;35207:170::-;35294:16;;;35308:1;35294:16;;;35253:21;35294:16;;;;;35253:21;35294:16;;;;;;;;;;-1:-1:-1;35294:16:0;35287:23;;35339:4;35321;35326:1;35321:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;35321:23:0;;;-1:-1:-1;;;;;35321:23:0;;;;;35365:4;35355;35360:1;35355:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;35355:14:0;;;-1:-1:-1;;;;;35355:14:0;;;;;35207:170;:::o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:168;219:9;;;250;;267:15;;;261:22;;247:37;237:71;;288:18;;:::i;319:217::-;359:1;385;375:132;;429:10;424:3;420:20;417:1;410:31;464:4;461:1;454:15;492:4;489:1;482:15;375:132;-1:-1:-1;521:9:1;;319:217::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:251;955:6;1008:2;996:9;987:7;983:23;979:32;976:52;;;1024:1;1021;1014:12;976:52;1056:9;1050:16;1075:31;1100:5;1075:31;:::i;1141:125::-;1206:9;;;1227:10;;;1224:36;;;1240:18;;:::i;1271:128::-;1338:9;;;1359:11;;;1356:37;;;1373:18;;:::i;1586:226::-;1645:6;1698:2;1686:9;1677:7;1673:23;1669:32;1666:52;;;1714:1;1711;1704:12;1666:52;-1:-1:-1;1759:23:1;;1586:226;-1:-1:-1;1586:226:1:o;1817:418::-;1966:2;1955:9;1948:21;1929:4;1998:6;1992:13;2041:6;2036:2;2025:9;2021:18;2014:34;2100:6;2095:2;2087:6;2083:15;2078:2;2067:9;2063:18;2057:50;2156:1;2151:2;2142:6;2131:9;2127:22;2123:31;2116:42;2226:2;2219;2215:7;2210:2;2202:6;2198:15;2194:29;2183:9;2179:45;2175:54;2167:62;;;1817:418;;;;:::o;2240:367::-;2308:6;2316;2369:2;2357:9;2348:7;2344:23;2340:32;2337:52;;;2385:1;2382;2375:12;2337:52;2424:9;2411:23;2443:31;2468:5;2443:31;:::i;:::-;2493:5;2571:2;2556:18;;;;2543:32;;-1:-1:-1;;;2240:367:1:o;2804:508::-;2881:6;2889;2897;2950:2;2938:9;2929:7;2925:23;2921:32;2918:52;;;2966:1;2963;2956:12;2918:52;3005:9;2992:23;3024:31;3049:5;3024:31;:::i;:::-;3074:5;-1:-1:-1;3131:2:1;3116:18;;3103:32;3144:33;3103:32;3144:33;:::i;:::-;2804:508;;3196:7;;-1:-1:-1;;;3276:2:1;3261:18;;;;3248:32;;2804:508::o;3317:160::-;3382:20;;3438:13;;3431:21;3421:32;;3411:60;;3467:1;3464;3457:12;3482:315;3547:6;3555;3608:2;3596:9;3587:7;3583:23;3579:32;3576:52;;;3624:1;3621;3614:12;3576:52;3663:9;3650:23;3682:31;3707:5;3682:31;:::i;:::-;3732:5;-1:-1:-1;3756:35:1;3787:2;3772:18;;3756:35;:::i;:::-;3746:45;;3482:315;;;;;:::o;3802:247::-;3861:6;3914:2;3902:9;3893:7;3889:23;3885:32;3882:52;;;3930:1;3927;3920:12;3882:52;3969:9;3956:23;3988:31;4013:5;3988:31;:::i;4378:466::-;4455:6;4463;4471;4524:2;4512:9;4503:7;4499:23;4495:32;4492:52;;;4540:1;4537;4530:12;4492:52;-1:-1:-1;;4585:23:1;;;4705:2;4690:18;;4677:32;;-1:-1:-1;4808:2:1;4793:18;;;4780:32;;4378:466;-1:-1:-1;4378:466:1:o;5038:127::-;5099:10;5094:3;5090:20;5087:1;5080:31;5130:4;5127:1;5120:15;5154:4;5151:1;5144:15;5170:275;5241:2;5235:9;5306:2;5287:13;;-1:-1:-1;;5283:27:1;5271:40;;5341:18;5326:34;;5362:22;;;5323:62;5320:88;;;5388:18;;:::i;:::-;5424:2;5417:22;5170:275;;-1:-1:-1;5170:275:1:o;5450:183::-;5510:4;5543:18;5535:6;5532:30;5529:56;;;5565:18;;:::i;:::-;-1:-1:-1;5610:1:1;5606:14;5622:4;5602:25;;5450:183::o;5638:744::-;5692:5;5745:3;5738:4;5730:6;5726:17;5722:27;5712:55;;5763:1;5760;5753:12;5712:55;5803:6;5790:20;5830:64;5846:47;5886:6;5846:47;:::i;:::-;5830:64;:::i;:::-;5918:3;5942:6;5937:3;5930:19;5974:4;5969:3;5965:14;5958:21;;6035:4;6025:6;6022:1;6018:14;6010:6;6006:27;6002:38;5988:52;;6063:3;6055:6;6052:15;6049:35;;;6080:1;6077;6070:12;6049:35;6116:4;6108:6;6104:17;6130:221;6146:6;6141:3;6138:15;6130:221;;;6228:3;6215:17;6245:31;6270:5;6245:31;:::i;:::-;6289:18;;6336:4;6327:14;;;;6163;6130:221;;;-1:-1:-1;6369:7:1;5638:744;-1:-1:-1;;;;;5638:744:1:o;6387:416::-;6477:6;6485;6538:2;6526:9;6517:7;6513:23;6509:32;6506:52;;;6554:1;6551;6544:12;6506:52;6594:9;6581:23;6627:18;6619:6;6616:30;6613:50;;;6659:1;6656;6649:12;6613:50;6682:61;6735:7;6726:6;6715:9;6711:22;6682:61;:::i;:::-;6672:71;;;6762:35;6793:2;6782:9;6778:18;6762:35;:::i;6808:180::-;6864:6;6917:2;6905:9;6896:7;6892:23;6888:32;6885:52;;;6933:1;6930;6923:12;6885:52;6956:26;6972:9;6956:26;:::i;6993:611::-;7183:2;7195:21;;;7265:13;;7168:18;;;7287:22;;;7135:4;;7366:15;;;7340:2;7325:18;;;7135:4;7409:169;7423:6;7420:1;7417:13;7409:169;;;7484:13;;7472:26;;7527:2;7553:15;;;;7518:12;;;;7445:1;7438:9;7409:169;;;-1:-1:-1;7595:3:1;;6993:611;-1:-1:-1;;;;;6993:611:1:o;7609:888::-;7853:2;7865:21;;;7935:13;;7838:18;;;7957:22;;;7805:4;;8036:15;;;8010:2;7995:18;;;7805:4;8079:392;8093:6;8090:1;8087:13;8079:392;;;8152:13;;8194:9;;-1:-1:-1;;;;;8190:35:1;8178:48;;8274:2;8266:11;;;8260:18;8246:12;;;8239:40;8327:2;8319:11;;;8313:18;8299:12;;;8292:40;8382:4;8374:13;;;8368:20;8352:14;;;8345:44;;;;8446:15;;;;8418:4;8409:14;;;;8222:1;8108:9;8079:392;;8502:462;8595:6;8603;8656:2;8644:9;8635:7;8631:23;8627:32;8624:52;;;8672:1;8669;8662:12;8624:52;8712:9;8699:23;8745:18;8737:6;8734:30;8731:50;;;8777:1;8774;8767:12;8731:50;8800:61;8853:7;8844:6;8833:9;8829:22;8800:61;:::i;:::-;8790:71;8930:2;8915:18;;;;8902:32;;-1:-1:-1;;;;8502:462:1:o;9454:1182::-;9572:6;9580;9633:2;9621:9;9612:7;9608:23;9604:32;9601:52;;;9649:1;9646;9639:12;9601:52;9689:9;9676:23;9722:18;9714:6;9711:30;9708:50;;;9754:1;9751;9744:12;9708:50;9777:61;9830:7;9821:6;9810:9;9806:22;9777:61;:::i;:::-;9767:71;;;9891:2;9880:9;9876:18;9863:32;9920:18;9910:8;9907:32;9904:52;;;9952:1;9949;9942:12;9904:52;9975:24;;10030:4;10022:13;;10018:27;-1:-1:-1;10008:55:1;;10059:1;10056;10049:12;10008:55;10099:2;10086:16;10122:64;10138:47;10178:6;10138:47;:::i;10122:64::-;10208:3;10232:6;10227:3;10220:19;10264:2;10259:3;10255:12;10248:19;;10319:2;10309:6;10306:1;10302:14;10298:2;10294:23;10290:32;10276:46;;10345:7;10337:6;10334:19;10331:39;;;10366:1;10363;10356:12;10331:39;10398:2;10394;10390:11;10379:22;;10410:196;10426:6;10421:3;10418:15;10410:196;;;10516:17;;10546:18;;10593:2;10443:12;;;;10584;;;;10410:196;;;10625:5;10615:15;;;;;;9454:1182;;;;;:::o;11135:388::-;11203:6;11211;11264:2;11252:9;11243:7;11239:23;11235:32;11232:52;;;11280:1;11277;11270:12;11232:52;11319:9;11306:23;11338:31;11363:5;11338:31;:::i;:::-;11388:5;-1:-1:-1;11445:2:1;11430:18;;11417:32;11458:33;11417:32;11458:33;:::i;:::-;11510:7;11500:17;;;11135:388;;;;;:::o;11750:135::-;11789:3;11810:17;;;11807:43;;11830:18;;:::i;:::-;-1:-1:-1;11877:1:1;11866:13;;11750:135::o;12153:325::-;12355:2;12337:21;;;12394:1;12374:18;;;12367:29;-1:-1:-1;;;12427:2:1;12412:18;;12405:32;12469:2;12454:18;;12153:325::o;12483:380::-;12562:1;12558:12;;;;12605;;;12626:61;;12680:4;12672:6;12668:17;12658:27;;12626:61;12733:2;12725:6;12722:14;12702:18;12699:38;12696:161;;12779:10;12774:3;12770:20;12767:1;12760:31;12814:4;12811:1;12804:15;12842:4;12839:1;12832:15;13572:230;13642:6;13695:2;13683:9;13674:7;13670:23;13666:32;13663:52;;;13711:1;13708;13701:12;13663:52;-1:-1:-1;13756:16:1;;13572:230;-1:-1:-1;13572:230:1:o;13807:127::-;13868:10;13863:3;13859:20;13856:1;13849:31;13899:4;13896:1;13889:15;13923:4;13920:1;13913:15;13939:371;-1:-1:-1;;;;;14159:32:1;;;14141:51;;14228:32;;;;14223:2;14208:18;;14201:60;14292:2;14277:18;;14270:34;;;;14129:2;14114:18;;13939:371::o;15027:951::-;15122:6;15175:2;15163:9;15154:7;15150:23;15146:32;15143:52;;;15191:1;15188;15181:12;15143:52;15224:9;15218:16;15257:18;15249:6;15246:30;15243:50;;;15289:1;15286;15279:12;15243:50;15312:22;;15365:4;15357:13;;15353:27;-1:-1:-1;15343:55:1;;15394:1;15391;15384:12;15343:55;15427:2;15421:9;15450:64;15466:47;15506:6;15466:47;:::i;15450:64::-;15536:3;15560:6;15555:3;15548:19;15592:2;15587:3;15583:12;15576:19;;15647:2;15637:6;15634:1;15630:14;15626:2;15622:23;15618:32;15604:46;;15673:7;15665:6;15662:19;15659:39;;;15694:1;15691;15684:12;15659:39;15726:2;15722;15718:11;15707:22;;15738:210;15754:6;15749:3;15746:15;15738:210;;;15827:3;15821:10;15844:31;15869:5;15844:31;:::i;:::-;15888:18;;15935:2;15771:12;;;;15926;;;;15738:210;;;15967:5;15027:951;-1:-1:-1;;;;;;15027:951:1:o;16653:188::-;16732:13;;-1:-1:-1;;;;;16774:42:1;;16764:53;;16754:81;;16831:1;16828;16821:12;16846:450;16933:6;16941;16949;17002:2;16990:9;16981:7;16977:23;16973:32;16970:52;;;17018:1;17015;17008:12;16970:52;17041:40;17071:9;17041:40;:::i;:::-;17031:50;;17100:49;17145:2;17134:9;17130:18;17100:49;:::i;:::-;17090:59;;17192:2;17181:9;17177:18;17171:25;17236:10;17229:5;17225:22;17218:5;17215:33;17205:61;;17262:1;17259;17252:12;17205:61;17285:5;17275:15;;;16846:450;;;;;:::o;17631:301::-;17760:3;17798:6;17792:13;17844:6;17837:4;17829:6;17825:17;17820:3;17814:37;17906:1;17870:16;;17895:13;;;-1:-1:-1;17870:16:1;17631:301;-1:-1:-1;17631:301:1:o;19567:446::-;19620:3;19658:5;19652:12;19685:6;19680:3;19673:19;19717:4;19712:3;19708:14;19701:21;;19756:4;19749:5;19745:16;19779:1;19789:199;19803:6;19800:1;19797:13;19789:199;;;19868:13;;-1:-1:-1;;;;;19864:39:1;19852:52;;19933:4;19924:14;;;;19961:17;;;;19900:1;19818:9;19789:199;;;-1:-1:-1;20004:3:1;;19567:446;-1:-1:-1;;;;19567:446:1:o;20018:332::-;20225:6;20214:9;20207:25;20268:2;20263;20252:9;20248:18;20241:30;20188:4;20288:56;20340:2;20329:9;20325:18;20317:6;20288:56;:::i;:::-;20280:64;20018:332;-1:-1:-1;;;;20018:332:1:o;20355:930::-;20450:6;20503:2;20491:9;20482:7;20478:23;20474:32;20471:52;;;20519:1;20516;20509:12;20471:52;20552:9;20546:16;20585:18;20577:6;20574:30;20571:50;;;20617:1;20614;20607:12;20571:50;20640:22;;20693:4;20685:13;;20681:27;-1:-1:-1;20671:55:1;;20722:1;20719;20712:12;20671:55;20755:2;20749:9;20778:64;20794:47;20834:6;20794:47;:::i;20778:64::-;20864:3;20888:6;20883:3;20876:19;20920:2;20915:3;20911:12;20904:19;;20975:2;20965:6;20962:1;20958:14;20954:2;20950:23;20946:32;20932:46;;21001:7;20993:6;20990:19;20987:39;;;21022:1;21019;21012:12;20987:39;21054:2;21050;21046:11;21035:22;;21066:189;21082:6;21077:3;21074:15;21066:189;;;21172:10;;21195:18;;21242:2;21099:12;;;;21233;;;;21066:189;;21290:574;21581:6;21570:9;21563:25;21624:6;21619:2;21608:9;21604:18;21597:34;21667:3;21662:2;21651:9;21647:18;21640:31;21544:4;21688:57;21740:3;21729:9;21725:19;21717:6;21688:57;:::i;:::-;-1:-1:-1;;;;;21781:32:1;;;;21776:2;21761:18;;21754:60;-1:-1:-1;21845:3:1;21830:19;21823:35;21680:65;21290:574;-1:-1:-1;;;21290:574:1:o;23061:456::-;23149:6;23157;23165;23218:2;23206:9;23197:7;23193:23;23189:32;23186:52;;;23234:1;23231;23224:12;23186:52;-1:-1:-1;;23279:16:1;;23385:2;23370:18;;23364:25;23481:2;23466:18;;;23460:25;23279:16;;23364:25;;-1:-1:-1;23460:25:1;23061:456;-1:-1:-1;23061:456:1:o

Swarm Source

ipfs://01f0d774e2f1a005952cb4c6c5f48538b12bd5a62aa671295106fc7f33b29530

Block Transaction Gas Used Reward
view all blocks produced
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
View All Validatorset

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

Validator Index Block Amount
View All Withdrawals

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

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