ETH Price: $3,663.58 (+0.74%)
 

Overview

Max Total Supply

1,000,000 SOUTH

Holders

76

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
9,981.49473377901389725 SOUTH

Value
$0.00
0xc8e587f14B69ac307b5CBA65523d3411c373FA66
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DeepSouthAI

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-01-03
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

library Address {

    error AddressInsufficientBalance(address account);

    error AddressEmptyCode(address target);

    error FailedInnerCall();

    function functionCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResultFromTarget(target, success, returndata);
    }

    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    function _revert(bytes memory returndata) private pure {
        if (returndata.length > 0) {
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}

library SafeERC20 {

    using Address for address;

    error SafeERC20FailedOperation(address token);

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data);
        if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
            revert SafeERC20FailedOperation(address(token));
        }
    }
}

interface IRouter {

    function WETH() external pure returns (address);

    function factory() external pure returns (address);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external payable;
}

interface IFactory {

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

    function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IPair {

    function token0() external view returns (address);

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

interface IERC20 {

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);

    function totalSupply() external view returns (uint256);

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

    function transfer(address to, uint256 value) external returns (bool);

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

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

    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

interface IERC20Metadata is IERC20 {

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

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

    function decimals() external view returns (uint8);
}

interface IERC20Errors {

    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    error ERC20InvalidSender(address sender);

    error ERC20InvalidReceiver(address receiver);

    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    error ERC20InvalidApprover(address approver);

    error ERC20InvalidSpender(address spender);
}

interface ICommonError {

    error CannotUseCurrentAddress(address current);

    error CannotUseCurrentValue(uint256 current);

    error CannotUseCurrentState(bool current);

    error InvalidAddress(address invalid);

    error InvalidValue(uint256 invalid);
}

abstract contract Ownable {

    address private _owner;

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    error OwnableUnauthorizedAccount(address account);

    error OwnableInvalidOwner(address owner);

    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

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

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

    function _checkOwner() internal view virtual {
        if (owner() != msg.sender) {
            revert OwnableUnauthorizedAccount(msg.sender);
        }
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

contract DeepSouthAI is Ownable, IERC20Metadata, IERC20Errors, ICommonError {

    using SafeERC20 for IERC20;
    using Address for address;

    struct Fee {
        uint256 marketing;
        uint256 total;
    }

    Fee public buyFee = Fee(1000, 1000);
    Fee public sellFee = Fee(1000, 1000);
    Fee public transferFee = Fee(0, 0);
    Fee public collectedFee = Fee(0, 0);
    Fee public redeemedFee = Fee(0, 0);

    IRouter public router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

    string private constant NAME = "DeepSouth AI";
    string private constant SYMBOL = "SOUTH";

    uint8 private constant DECIMALS = 18;

    uint256 public constant FEEDENOMINATOR = 10_000;

    uint256 public immutable deployTime;

    uint256 private _totalSupply;

    uint256 public tradeStartTime = 0;
    uint256 public tradeStartBlock = 0;
    uint256 public minSwap = 100 ether;
    uint256 public maxWalletLimit = 100;

    address public projectOwner = 0x2C059Ce95f3Db68A05549AC6e5862091891ACBC6;
    address public marketingReceiver = 0x0d80a1ca0Ef477D12C8cBE8EF0Dd29b130589663;

    address public pair;

    bool public tradeEnabled = false;
    bool public isFeeActive = false;
    bool public isFeeLocked = false;
    bool public isReceiverLocked = false;
    bool public isFailsafeLocked = false;
    bool public isWalletLimitLocked = false;
    bool public isWalletLimitActive = false;
    bool public isSwapEnabled = false;
    bool public inSwap = false;

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

    mapping(address pair => bool) public isPairLP;
    mapping(address account => bool) public isExemptFee;
    mapping(address account => bool) public isExemptWalletLimit;

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

    modifier onlyOwnerFailsafe() {
        _checkOwnerFailsafe();
        _;
    }

    error WaitForCooldownTimer(uint256 cooldownEnd, uint256 timeLeft);

    error TradeAlreadyEnabled(bool currentState, uint256 timestamp);

    error InvalidTotalFee(uint256 current, uint256 max);

    error InvalidWalletLimit(uint256 current, uint256 min);

    error ExceedWalletLimit(uint256 current, uint256 max);

    error CannotRedeemMoreThanAllowedTreshold(uint256 current, uint256 max);

    error TradeNotYetEnabled();

    error CannotWithdrawNativeToken();

    error Locked(string lockType);

    error ReceiverCannotInitiateTransferEther();

    error OnlyWalletAddressAllowed();

    constructor() Ownable (msg.sender) {
        isExemptFee[projectOwner] = true;
        isExemptFee[address(router)] = true;
        isExemptWalletLimit[projectOwner] = true;
        isExemptWalletLimit[address(this)] = true;

        if (projectOwner != msg.sender) {
            isExemptFee[msg.sender] = true;
            isExemptWalletLimit[msg.sender] = true;
        }

        deployTime = block.timestamp;
        _mint(msg.sender, 1_000_000 * 10**DECIMALS);

        pair = IFactory(router.factory()).createPair(address(this), router.WETH());
        isPairLP[pair] = true;
        isExemptWalletLimit[pair] = true;
    }

    event AutoRedeem(uint256 marketingFeeDistribution, uint256 amountToRedeem, address caller, uint256 timestamp);

    event UpdateRouter(address oldRouter, address newRouter, address caller, uint256 timestamp);

    event SetAddressState(string addressType, address account, bool oldStatus, bool newStatus, address caller, uint256 timestamp);

    event TradeEnabled(address caller, uint256 timestamp);

    event Lock(string lockType, address caller, uint256 timestamp);

    event UpdateMinSwap(uint256 oldMinSwap, uint256 newMinSwap, address caller, uint256 timestamp);

    event UpdateState(string stateType, bool oldStatus, bool newStatus, address caller, uint256 timestamp);

    event UpdateLimit(string limitType, uint256 oldLimit, uint256 newLimit, address caller, uint256 timestamp);

    event UpdateFee(string feeType, uint256 oldMarketingFee, uint256 newMarketingFee, address caller, uint256 timestamp);

    event UpdateReceiver(string receiverType, address oldReceiver, address newReceiver, address caller, uint256 timestamp);

    receive() external payable {}

    function wTokens(address tokenAddress, uint256 amount) external {
        uint256 toTransfer = amount;
        address receiver = marketingReceiver;

        if (tokenAddress == address(this)) {
            revert CannotWithdrawNativeToken();
        } else if (tokenAddress == address(0)) {
            if (amount == 0) {
                toTransfer = address(this).balance;
            }
            if (msg.sender == receiver) {
                revert ReceiverCannotInitiateTransferEther();
            }
            payable(receiver).transfer(toTransfer);
        } else {
            if (amount == 0) {
                toTransfer = IERC20(tokenAddress).balanceOf(address(this));
            }
            IERC20(tokenAddress).safeTransfer(receiver, toTransfer);
        }
    }

    function enableTrading() external {
        if (tradeEnabled) {
            revert TradeAlreadyEnabled(tradeEnabled, tradeStartTime);
        }
        if (
            owner() != address(0) &&
            owner() != msg.sender &&
            deployTime + 30 days > block.timestamp
        ) {
            revert OwnableUnauthorizedAccount(msg.sender);
        }
        if (
            owner() == address(0) &&
            owner() != msg.sender &&
            deployTime + 15 days > block.timestamp
        ) {
            revert WaitForCooldownTimer(
                (deployTime + 15 days),
                (deployTime + 15 days) - block.timestamp
            );
        }

        if (!isWalletLimitActive) {
            isWalletLimitActive = true;
        }
        if (!isFeeActive) {
            isFeeActive = true;
        }
        if (!isSwapEnabled) {
            isSwapEnabled = true;
        }

        tradeEnabled = true;
        tradeStartTime = block.timestamp;
        tradeStartBlock = block.number;

        emit TradeEnabled(msg.sender, block.timestamp);
    }

    function circulatingSupply() public view returns (uint256) {
        return totalSupply() - balanceOf(address(0xdead)) - balanceOf(address(0));
    }

    function _checkOwnerFailsafe() internal view {
        _checkFailsafeLock();
        if (projectOwner != msg.sender && owner() != msg.sender) {
            revert OwnableUnauthorizedAccount(msg.sender);
        }
    }

    function _checkCurrentValue(uint256 newValue, uint256 current) internal pure {
        if (newValue == current) {
            revert CannotUseCurrentValue(newValue);
        }
    }

    function _checkCurrentState(bool newState, bool current) internal pure {
        if (newState == current) {
            revert CannotUseCurrentState(newState);
        }
    }

    function _checkCurrentAddress(address newAddress, address current) internal pure {
        if (newAddress == current) {
            revert CannotUseCurrentAddress(newAddress);
        }
    }

    function _checkFailsafeLock() internal view {
        if (isFailsafeLocked) {
            revert Locked("Failsafe");
        }
    }

    function _checkReceiverLock() internal view {
        if (isReceiverLocked) {
            revert Locked("Receiver");
        }
    }

    function _checkFeeLock() internal view {
        if (isFeeLocked) {
            revert Locked("Fee");
        }
    }

    function _checkWalletLimitLock() internal view {
        if (isWalletLimitLocked) {
            revert Locked("WalletLimit");
        }
    }

    function autoRedeem(uint256 amountToRedeem) public swapping {
        uint256 threshold = circulatingSupply() * 1 / FEEDENOMINATOR;
        if (amountToRedeem > threshold) {
            revert CannotRedeemMoreThanAllowedTreshold(amountToRedeem, threshold);
        }
        uint256 marketingToRedeem = collectedFee.marketing - redeemedFee.marketing;
        uint256 totalToRedeem = collectedFee.total - redeemedFee.total;

        uint256 marketingFeeDistribution = amountToRedeem * marketingToRedeem / totalToRedeem;

        redeemedFee.marketing += marketingFeeDistribution;
        redeemedFee.total += amountToRedeem;

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

        _approve(address(this), address(router), amountToRedeem);

        emit AutoRedeem(marketingFeeDistribution, amountToRedeem, msg.sender, block.timestamp);

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            marketingFeeDistribution,
            0,
            path,
            marketingReceiver,
            block.timestamp
        );
    }

    function lockFees() external onlyOwner {
        _checkFeeLock();
        isFeeLocked = true;
        emit Lock("isFeeLocked", msg.sender, block.timestamp);
    }

    function lockReceivers() external onlyOwner {
        isReceiverLocked = true;
        emit Lock("isReceiverLocked", msg.sender, block.timestamp);
    }

    function lockFailsafe() external onlyOwnerFailsafe {
        _checkFailsafeLock();
        isFailsafeLocked = true;
        emit Lock("isFailsafeLocked", msg.sender, block.timestamp);
    }

    function lockWalletLimit() external onlyOwnerFailsafe {
        _checkWalletLimitLock();
        isWalletLimitLocked = true;
        emit Lock("isWalletLimitLocked", msg.sender, block.timestamp);
    }

    function updateMinSwap(uint256 newMinSwap) external onlyOwnerFailsafe {
        if (newMinSwap > circulatingSupply() * 1 / FEEDENOMINATOR) {
            revert InvalidValue(newMinSwap);
        }
        _checkCurrentValue(newMinSwap, minSwap);
        uint256 oldMinSwap = minSwap;
        minSwap = newMinSwap;
        emit UpdateMinSwap(oldMinSwap, newMinSwap, msg.sender, block.timestamp);
    }

    function updateFeeActive(bool newStatus) external onlyOwnerFailsafe {
        _checkFeeLock();
        _checkCurrentState(newStatus, isFeeActive);
        bool oldStatus = isFeeActive;
        isFeeActive = newStatus;
        emit UpdateState("isFeeActive", oldStatus, newStatus, msg.sender, block.timestamp);
    }

    function updateWalletLimitActive(bool newStatus) external onlyOwnerFailsafe {
        _checkWalletLimitLock();
        _checkCurrentState(newStatus, isWalletLimitActive);
        bool oldStatus = isWalletLimitActive;
        isWalletLimitActive = newStatus;
        emit UpdateState("isWalletLimitActive", oldStatus, newStatus, msg.sender, block.timestamp);
    }

    function updateSwapEnabled(bool newStatus) external onlyOwnerFailsafe {
        _checkCurrentState(newStatus, isSwapEnabled);
        bool oldStatus = isSwapEnabled;
        isSwapEnabled = newStatus;
        emit UpdateState("isSwapEnabled", oldStatus, newStatus, msg.sender, block.timestamp);
    }

    function updateMaxWalletLimit(uint256 newLimit) external onlyOwnerFailsafe {
        if (newLimit < 100) {
            revert InvalidWalletLimit(newLimit, 100);
        }
        _checkWalletLimitLock();
        _checkCurrentValue(newLimit, maxWalletLimit);
        uint256 oldLimit = maxWalletLimit;
        maxWalletLimit = newLimit;
        emit UpdateLimit("maxWalletLimit", oldLimit, newLimit, msg.sender, block.timestamp);
    }

    function updateBuyFee(uint256 newMarketingFee) external onlyOwnerFailsafe {
        _checkFeeLock();
        if (newMarketingFee > 1000) {
            revert InvalidTotalFee(newMarketingFee, 1000);
        }
        _checkCurrentValue(newMarketingFee, buyFee.marketing);
        uint256 oldMarketingFee = buyFee.marketing;
        buyFee.marketing = newMarketingFee;
        buyFee.total = newMarketingFee;
        emit UpdateFee("buyFee", oldMarketingFee, newMarketingFee, msg.sender, block.timestamp);
    }

    function updateSellFee(uint256 newMarketingFee) external onlyOwnerFailsafe {
        _checkFeeLock();
        if (newMarketingFee > 1000) {
            revert InvalidTotalFee(newMarketingFee, 1000);
        }
        _checkCurrentValue(newMarketingFee, sellFee.marketing);
        uint256 oldMarketingFee = sellFee.marketing;
        sellFee.marketing = newMarketingFee;
        sellFee.total = newMarketingFee;
        emit UpdateFee("sellFee", oldMarketingFee, newMarketingFee, msg.sender, block.timestamp);
    }

    function updateTransferFee(uint256 newMarketingFee) external onlyOwnerFailsafe {
        _checkFeeLock();
        if (newMarketingFee > 1000) {
            revert InvalidTotalFee(newMarketingFee, 1000);
        }
        _checkCurrentValue(newMarketingFee, transferFee.marketing);
        uint256 oldMarketingFee = transferFee.marketing;
        transferFee.marketing = newMarketingFee;
        transferFee.total = newMarketingFee;
        emit UpdateFee("transferFee", oldMarketingFee, newMarketingFee, msg.sender, block.timestamp);
    }

    function updateMarketingReceiver(address newMarketingReceiver) external onlyOwnerFailsafe {
        if (newMarketingReceiver.code.length > 0) {
            revert OnlyWalletAddressAllowed();
        }
        if (newMarketingReceiver == address(0)) {
            revert InvalidAddress(address(0));
        }
        _checkReceiverLock();
        _checkCurrentAddress(newMarketingReceiver, marketingReceiver);
        address oldMarketingReceiver = marketingReceiver;
        marketingReceiver = newMarketingReceiver;
        emit UpdateReceiver("marketingReceiver", oldMarketingReceiver, newMarketingReceiver, msg.sender, block.timestamp);
    }

    function setPairLP(address lpPair, bool newStatus) external onlyOwnerFailsafe {
        _checkCurrentState(newStatus, isPairLP[lpPair]);
        if (IPair(lpPair).token0() != address(this) && IPair(lpPair).token1() != address(this)) {
            revert InvalidAddress(lpPair);
        }
        if (!isPairLP[pair]) {
            isExemptWalletLimit[pair] = true;
        }
        bool oldStatus = isPairLP[lpPair];
        isPairLP[lpPair] = newStatus;
        emit SetAddressState("isPairLP", lpPair, oldStatus, newStatus, msg.sender, block.timestamp);
    }

    function updateRouter(address newRouter) external onlyOwnerFailsafe {
        if (newRouter == address(0)) {
            revert InvalidAddress(newRouter);
        }
        _checkCurrentAddress(newRouter, address(router));

        address oldRouter = address(router);
        router = IRouter(newRouter);

        emit UpdateRouter(oldRouter, newRouter, msg.sender, block.timestamp);

        if (address(IFactory(router.factory()).getPair(address(this), router.WETH())) == address(0)) {
            pair = IFactory(router.factory()).createPair(address(this), router.WETH());

            if (!isExemptWalletLimit[pair]) {
                isExemptWalletLimit[pair] = true;
            }
            if (!isPairLP[pair]) {
                isPairLP[pair] = true;
            }
        }
    }

    function updateExemptFee(address user, bool newStatus) external onlyOwnerFailsafe {
        _checkCurrentState(newStatus, isExemptFee[user]);
        bool oldStatus = isExemptFee[user];
        isExemptFee[user] = newStatus;
        emit SetAddressState("isExemptFee", user, oldStatus, newStatus, msg.sender, block.timestamp);
    }

    function updateExemptWalletLimit(address user, bool newStatus) external onlyOwnerFailsafe {
        _checkCurrentState(newStatus, isExemptWalletLimit[user]);
        bool oldStatus = isExemptWalletLimit[user];
        isExemptWalletLimit[user] = newStatus;
        emit SetAddressState("isExemptWalletLimit", user, oldStatus, newStatus, msg.sender, block.timestamp);
    }

    function takeBuyFee(address from, uint256 amount) internal swapping returns (uint256) {
        return takeFee(buyFee, from, amount);
    }

    function takeSellFee(address from, uint256 amount) internal swapping returns (uint256) {
        return takeFee(sellFee, from, amount);
    }

    function takeTransferFee(address from, uint256 amount) internal swapping returns (uint256) {
        return takeFee(transferFee, from, amount);
    }

    function takeFee(Fee memory feeType, address from, uint256 amount) internal swapping returns (uint256) {
        uint256 feeTotal = feeType.marketing;
        if (block.number <= tradeStartBlock + 5) {
            feeTotal = 9900;
        }
        uint256 feeAmount = amount * feeTotal / FEEDENOMINATOR;
        uint256 newAmount = amount - feeAmount;
        if (feeAmount > 0) {
            tallyFee(feeType, from, feeAmount, feeTotal);
        }
        return newAmount;
    }

    function tallyFee(Fee memory feeType, address from, uint256 amount, uint256 fee) internal swapping {
        uint256 collectMarketing = amount * feeType.marketing / fee;
        tallyCollection(collectMarketing, amount);

        _update(from, address(this), amount);
    }

    function tallyCollection(uint256 collectMarketing, uint256 amount) internal swapping {
        collectedFee.marketing += collectMarketing;
        collectedFee.total += amount;
    }

    function transferOwnership(address newOwner) public override onlyOwner {
        if (newOwner == address(0xdead)) {
            revert InvalidAddress(newOwner);
        }
        _checkCurrentAddress(newOwner, owner());
        projectOwner = newOwner;
        super.transferOwnership(newOwner);
    }

    function name() public view virtual returns (string memory) {
        return NAME;
    }

    function symbol() public view virtual returns (string memory) {
        return SYMBOL;
    }

    function decimals() public view virtual returns (uint8) {
        return DECIMALS;
    }

    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

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

    function transfer(address to, uint256 value) public virtual returns (bool) {
        address provider = msg.sender;
        _transfer(provider, to, value);
        return true;
    }

    function allowance(address provider, address spender) public view virtual returns (uint256) {
        return _allowances[provider][spender];
    }

    function approve(address spender, uint256 value) public virtual returns (bool) {
        address provider = msg.sender;
        _approve(provider, spender, value);
        return true;
    }

    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = msg.sender;
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        if (!tradeEnabled) {
            if (!isExemptFee[from] && !isExemptFee[to]) {
                revert TradeNotYetEnabled();
            }
        }

        if (inSwap || isExemptFee[from]) {
            return _update(from, to, value);
        }
        if (from != pair && isSwapEnabled && collectedFee.total - redeemedFee.total >= minSwap && balanceOf(address(this)) >= minSwap) {
            uint256 swapAmount = minSwap;

            if (isFailsafeLocked && owner() == address(0)) {
                uint256 failsafeAmount = circulatingSupply() * 1 / FEEDENOMINATOR;
                swapAmount = failsafeAmount <= swapAmount ? failsafeAmount : swapAmount;
            }

            autoRedeem(swapAmount);
        }

        uint256 newValue = value;

        if (isFeeActive && !isExemptFee[from] && !isExemptFee[to]) {
            newValue = _beforeTokenTransfer(from, to, value);
        }

        _update(from, to, newValue);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal swapping virtual returns (uint256) {
        if (isPairLP[from] && (buyFee.marketing > 0)) {
            return takeBuyFee(from, amount);
        }
        if (isPairLP[to] && (sellFee.marketing > 0)) {
            return takeSellFee(from, amount);
        }
        if (!isPairLP[from] && !isPairLP[to] && (transferFee.marketing > 0)) {
            return takeTransferFee(from, amount);
        }
        return amount;
    }

    function _update(address from, address to, uint256 value) internal virtual {
        uint256 newBalance = balanceOf(to) + value;
        uint256 limit = circulatingSupply() * maxWalletLimit / FEEDENOMINATOR;

        if (newBalance > limit && !isExemptWalletLimit[to]) {
            revert ExceedWalletLimit(newBalance, limit);
        }

        if (from == address(0)) {
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                _totalSupply -= value;
            }
        } else {
            unchecked {
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    function _approve(address provider, address spender, uint256 value) internal {
        _approve(provider, spender, value, true);
    }

    function _approve(address provider, address spender, uint256 value, bool emitEvent) internal virtual {
        if (provider == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[provider][spender] = value;
        if (emitEvent) {
            emit Approval(provider, spender, value);
        }
    }

    function _spendAllowance(address provider, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(provider, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(provider, spender, currentAllowance - value, false);
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"CannotRedeemMoreThanAllowedTreshold","type":"error"},{"inputs":[{"internalType":"address","name":"current","type":"address"}],"name":"CannotUseCurrentAddress","type":"error"},{"inputs":[{"internalType":"bool","name":"current","type":"bool"}],"name":"CannotUseCurrentState","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"}],"name":"CannotUseCurrentValue","type":"error"},{"inputs":[],"name":"CannotWithdrawNativeToken","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ExceedWalletLimit","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"invalid","type":"address"}],"name":"InvalidAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"InvalidTotalFee","type":"error"},{"inputs":[{"internalType":"uint256","name":"invalid","type":"uint256"}],"name":"InvalidValue","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"}],"name":"InvalidWalletLimit","type":"error"},{"inputs":[{"internalType":"string","name":"lockType","type":"string"}],"name":"Locked","type":"error"},{"inputs":[],"name":"OnlyWalletAddressAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReceiverCannotInitiateTransferEther","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"bool","name":"currentState","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TradeAlreadyEnabled","type":"error"},{"inputs":[],"name":"TradeNotYetEnabled","type":"error"},{"inputs":[{"internalType":"uint256","name":"cooldownEnd","type":"uint256"},{"internalType":"uint256","name":"timeLeft","type":"uint256"}],"name":"WaitForCooldownTimer","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":"marketingFeeDistribution","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountToRedeem","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AutoRedeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"lockType","type":"string"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Lock","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":false,"internalType":"string","name":"addressType","type":"string"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"oldStatus","type":"bool"},{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SetAddressState","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TradeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"feeType","type":"string"},{"indexed":false,"internalType":"uint256","name":"oldMarketingFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMarketingFee","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"UpdateFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"limitType","type":"string"},{"indexed":false,"internalType":"uint256","name":"oldLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLimit","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"UpdateLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMinSwap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMinSwap","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"UpdateMinSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"receiverType","type":"string"},{"indexed":false,"internalType":"address","name":"oldReceiver","type":"address"},{"indexed":false,"internalType":"address","name":"newReceiver","type":"address"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"UpdateReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldRouter","type":"address"},{"indexed":false,"internalType":"address","name":"newRouter","type":"address"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"UpdateRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"stateType","type":"string"},{"indexed":false,"internalType":"bool","name":"oldStatus","type":"bool"},{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"UpdateState","type":"event"},{"inputs":[],"name":"FEEDENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToRedeem","type":"uint256"}],"name":"autoRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectedFee","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExemptFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExemptWalletLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFailsafeLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFeeActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFeeLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPairLP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isReceiverLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWalletLimitActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWalletLimitLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockFailsafe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redeemedFee","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpPair","type":"address"},{"internalType":"bool","name":"newStatus","type":"bool"}],"name":"setPairLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"uint256","name":"newMarketingFee","type":"uint256"}],"name":"updateBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"newStatus","type":"bool"}],"name":"updateExemptFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"newStatus","type":"bool"}],"name":"updateExemptWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newStatus","type":"bool"}],"name":"updateFeeActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingReceiver","type":"address"}],"name":"updateMarketingReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updateMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinSwap","type":"uint256"}],"name":"updateMinSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMarketingFee","type":"uint256"}],"name":"updateSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newStatus","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMarketingFee","type":"uint256"}],"name":"updateTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newStatus","type":"bool"}],"name":"updateWalletLimitActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405260405180604001604052806103e881526020016103e881525060016000820151816000015560208201518160010155505060405180604001604052806103e881526020016103e8815250600360008201518160000155602082015181600101555050604051806040016040528060008152602001600081525060056000820151816000015560208201518160010155505060405180604001604052806000815260200160008152506007600082015181600001556020820151816001015550506040518060400160405280600081526020016000815250600960008201518160000155602082015181600101555050737a250d5630b4cf539739df2c5dacb4c659f2488d600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d556000600e5568056bc75e2d63100000600f556064601055732c059ce95f3db68a05549ac6e5862091891acbc6601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730d80a1ca0ef477d12c8cbe8ef0dd29b130589663601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601360146101000a81548160ff0219169083151502179055506000601360156101000a81548160ff0219169083151502179055506000601360166101000a81548160ff0219169083151502179055506000601360176101000a81548160ff0219169083151502179055506000601360186101000a81548160ff0219169083151502179055506000601360196101000a81548160ff02191690831515021790555060006013601a6101000a81548160ff02191690831515021790555060006013601b6101000a81548160ff02191690831515021790555060006013601c6101000a81548160ff0219169083151502179055503480156200030e57600080fd5b5033600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620003855760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200037c919062000ee7565b60405180910390fd5b62000396816200098060201b60201c565b50600160176000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160176000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160186000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000664576001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b42608081815250506200069d336012600a6200068191906200109e565b620f4240620006919190620010ef565b62000a4460201b60201c565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200070b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000731919062001170565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620007bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007e1919062001170565b6040518363ffffffff1660e01b815260040162000800929190620011a2565b6020604051808303816000875af115801562000820573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000846919062001170565b601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160166000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160186000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062001344565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000ab95760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040162000ab0919062000ee7565b60405180910390fd5b62000acd6000838362000ad160201b60201c565b5050565b60008162000ae58462000dfb60201b60201c565b62000af19190620011cf565b9050600061271060105462000b0b62000e4460201b60201c565b62000b179190620010ef565b62000b23919062001239565b9050808211801562000b7f5750601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1562000bc65781816040517fc116064c00000000000000000000000000000000000000000000000000000000815260040162000bbd92919062001282565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160362000c1c5782600c600082825462000c0f9190620011cf565b9250508190555062000cf4565b6000601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101562000cac578581856040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040162000ca393929190620012af565b60405180910390fd5b838103601460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160362000d3f5782600c6000828254039250508190555062000d8d565b82601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405162000dec9190620012ec565b60405180910390a35050505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600062000e58600062000dfb60201b60201c565b62000e6b61dead62000dfb60201b60201c565b62000e7b62000e9860201b60201c565b62000e87919062001309565b62000e93919062001309565b905090565b6000600c54905090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000ecf8262000ea2565b9050919050565b62000ee18162000ec2565b82525050565b600060208201905062000efe600083018462000ed6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000f925780860481111562000f6a5762000f6962000f04565b5b600185161562000f7a5780820291505b808102905062000f8a8562000f33565b945062000f4a565b94509492505050565b60008262000fad576001905062001080565b8162000fbd576000905062001080565b816001811462000fd6576002811462000fe15762001017565b600191505062001080565b60ff84111562000ff65762000ff562000f04565b5b8360020a91508482111562001010576200100f62000f04565b5b5062001080565b5060208310610133831016604e8410600b8410161715620010515782820a9050838111156200104b576200104a62000f04565b5b62001080565b62001060848484600162000f40565b925090508184048111156200107a576200107962000f04565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b6000620010ab8262001087565b9150620010b88362001091565b9250620010e77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000f9b565b905092915050565b6000620010fc8262001087565b9150620011098362001087565b9250828202620011198162001087565b9150828204841483151762001133576200113262000f04565b5b5092915050565b600080fd5b6200114a8162000ec2565b81146200115657600080fd5b50565b6000815190506200116a816200113f565b92915050565b6000602082840312156200118957620011886200113a565b5b6000620011998482850162001159565b91505092915050565b6000604082019050620011b9600083018562000ed6565b620011c8602083018462000ed6565b9392505050565b6000620011dc8262001087565b9150620011e98362001087565b925082820190508082111562001204576200120362000f04565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620012468262001087565b9150620012538362001087565b9250826200126657620012656200120a565b5b828204905092915050565b6200127c8162001087565b82525050565b600060408201905062001299600083018562001271565b620012a8602083018462001271565b9392505050565b6000606082019050620012c6600083018662000ed6565b620012d5602083018562001271565b620012e4604083018462001271565b949350505050565b600060208201905062001303600083018462001271565b92915050565b6000620013168262001087565b9150620013238362001087565b92508282039050818111156200133e576200133d62000f04565b5b92915050565b608051615ee96200137c60003960008181612167015281816123c2015281816124b3015281816124e901526125190152615ee96000f3fe60806040526004361061039b5760003560e01c8063891ff84a116101dc578063acb2ad6f11610102578063dd62ed3e116100a0578063e811f50a1161006f578063e811f50a14610d0d578063f2c4220e14610d39578063f2fde38b14610d64578063f887ea4014610d8d576103a2565b8063dd62ed3e14610c4f578063e2924cd114610c8c578063e43504da14610cb7578063e79f53e614610ce2576103a2565b8063cf9769fd116100dc578063cf9769fd14610bb6578063d621e81314610bcd578063d830678614610bf8578063d941907114610c23576103a2565b8063acb2ad6f14610b36578063b908de8c14610b62578063c851cc3214610b8d576103a2565b80639ffe05331161017a578063a8aa1b3111610149578063a8aa1b3114610a8c578063a9059cbb14610ab7578063ab28a04c14610af4578063ab36629214610b1f576103a2565b80639ffe0533146109f4578063a4475ce414610a1f578063a5949bcf14610a4a578063a616162a14610a75576103a2565b8063924de9b7116101b6578063924de9b7146109385780639358928b1461096157806395d89b411461098c57806399996973146109b7576103a2565b8063891ff84a146108b95780638a8c523c146108f65780638da5cb5b1461090d576103a2565b80633d6362d6116102c157806366a88d961161025f578063779e80d51161022e578063779e80d5146108255780637a40624b1461084e5780637e2b16d1146108795780638577a6d514610890576103a2565b806366a88d961461077d57806370a08231146107a8578063715018a6146107e557806375fed3c7146107fc576103a2565b8063470624021161029b57806347062402146106d45780634b7e71b31461070057806359cd903114610729578063625dd60514610754576103a2565b80633d6362d6146106595780634324deae14610682578063467abe0a146106ab576103a2565b806323b872dd11610339578063313ce56711610308578063313ce567146105b1578063351a964d146105dc578063355496ca146106075780633bf3145414610630576103a2565b806323b872dd146104f25780632b14ca561461052f5780632c735ef81461055b5780633125796614610586576103a2565b8063095ea7b311610375578063095ea7b31461043857806318160ddd146104755780631d933a4a146104a05780631f685bac146104c9576103a2565b806301295143146103a757806306fdde03146103d057806308c43650146103fb576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103ce60048036038101906103c99190614961565b610db8565b005b3480156103dc57600080fd5b506103e5611187565b6040516103f29190614a1e565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d9190614a9e565b6111c4565b60405161042f9190614ae6565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190614b01565b6111e4565b60405161046c9190614ae6565b60405180910390f35b34801561048157600080fd5b5061048a611200565b6040516104979190614b50565b60405180910390f35b3480156104ac57600080fd5b506104c760048036038101906104c29190614961565b61120a565b005b3480156104d557600080fd5b506104f060048036038101906104eb9190614b01565b6112d3565b005b3480156104fe57600080fd5b5061051960048036038101906105149190614b6b565b61150c565b6040516105269190614ae6565b60405180910390f35b34801561053b57600080fd5b50610544611534565b604051610552929190614bbe565b60405180910390f35b34801561056757600080fd5b50610570611546565b60405161057d9190614b50565b60405180910390f35b34801561059257600080fd5b5061059b61154c565b6040516105a89190614ae6565b60405180910390f35b3480156105bd57600080fd5b506105c661155f565b6040516105d39190614c03565b60405180910390f35b3480156105e857600080fd5b506105f1611568565b6040516105fe9190614ae6565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190614c4a565b61157b565b005b34801561063c57600080fd5b5061065760048036038101906106529190614c8a565b6116c5565b005b34801561066557600080fd5b50610680600480360381019061067b9190614a9e565b61175d565b005b34801561068e57600080fd5b506106a960048036038101906106a49190614961565b611906565b005b3480156106b757600080fd5b506106d260048036038101906106cd9190614961565b6119ba565b005b3480156106e057600080fd5b506106e9611a82565b6040516106f7929190614bbe565b60405180910390f35b34801561070c57600080fd5b5061072760048036038101906107229190614c4a565b611a94565b005b34801561073557600080fd5b5061073e611bde565b60405161074b9190614b50565b60405180910390f35b34801561076057600080fd5b5061077b60048036038101906107769190614c4a565b611be4565b005b34801561078957600080fd5b50610792611fa2565b60405161079f9190614b50565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca9190614a9e565b611fa8565b6040516107dc9190614b50565b60405180910390f35b3480156107f157600080fd5b506107fa611ff1565b005b34801561080857600080fd5b50610823600480360381019061081e9190614961565b612005565b005b34801561083157600080fd5b5061084c60048036038101906108479190614c8a565b6120cd565b005b34801561085a57600080fd5b50610863612165565b6040516108709190614b50565b60405180910390f35b34801561088557600080fd5b5061088e612189565b005b34801561089c57600080fd5b506108b760048036038101906108b29190614961565b6121ef565b005b3480156108c557600080fd5b506108e060048036038101906108db9190614a9e565b6122b8565b6040516108ed9190614ae6565b60405180910390f35b34801561090257600080fd5b5061090b6122d8565b005b34801561091957600080fd5b5061092261267d565b60405161092f9190614cc6565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190614c8a565b6126a6565b005b34801561096d57600080fd5b50610976612736565b6040516109839190614b50565b60405180910390f35b34801561099857600080fd5b506109a161276e565b6040516109ae9190614a1e565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d99190614a9e565b6127ab565b6040516109eb9190614ae6565b60405180910390f35b348015610a0057600080fd5b50610a096127cb565b604051610a169190614ae6565b60405180910390f35b348015610a2b57600080fd5b50610a346127de565b604051610a419190614cc6565b60405180910390f35b348015610a5657600080fd5b50610a5f612804565b604051610a6c9190614cc6565b60405180910390f35b348015610a8157600080fd5b50610a8a61282a565b005b348015610a9857600080fd5b50610aa1612890565b604051610aae9190614cc6565b60405180910390f35b348015610ac357600080fd5b50610ade6004803603810190610ad99190614b01565b6128b6565b604051610aeb9190614ae6565b60405180910390f35b348015610b0057600080fd5b50610b096128d2565b604051610b169190614b50565b60405180910390f35b348015610b2b57600080fd5b50610b346128d8565b005b348015610b4257600080fd5b50610b4b61293e565b604051610b59929190614bbe565b60405180910390f35b348015610b6e57600080fd5b50610b77612950565b604051610b849190614ae6565b60405180910390f35b348015610b9957600080fd5b50610bb46004803603810190610baf9190614a9e565b612963565b005b348015610bc257600080fd5b50610bcb61303b565b005b348015610bd957600080fd5b50610be2613099565b604051610bef9190614ae6565b60405180910390f35b348015610c0457600080fd5b50610c0d6130ac565b604051610c1a9190614ae6565b60405180910390f35b348015610c2f57600080fd5b50610c386130bf565b604051610c46929190614bbe565b60405180910390f35b348015610c5b57600080fd5b50610c766004803603810190610c719190614ce1565b6130d1565b604051610c839190614b50565b60405180910390f35b348015610c9857600080fd5b50610ca1613158565b604051610cae9190614ae6565b60405180910390f35b348015610cc357600080fd5b50610ccc61316b565b604051610cd99190614ae6565b60405180910390f35b348015610cee57600080fd5b50610cf761317e565b604051610d049190614ae6565b60405180910390f35b348015610d1957600080fd5b50610d22613191565b604051610d30929190614bbe565b60405180910390f35b348015610d4557600080fd5b50610d4e6131a3565b604051610d5b9190614b50565b60405180910390f35b348015610d7057600080fd5b50610d8b6004803603810190610d869190614a9e565b6131a9565b005b348015610d9957600080fd5b50610da2613281565b604051610daf9190614d80565b60405180910390f35b60016013601c6101000a81548160ff02191690831515021790555060006127106001610de2612736565b610dec9190614dca565b610df69190614e3b565b905080821115610e3f5781816040517fbcda6668000000000000000000000000000000000000000000000000000000008152600401610e36929190614bbe565b60405180910390fd5b6000600960000154600760000154610e579190614e6c565b90506000600960010154600760010154610e719190614e6c565b90506000818386610e829190614dca565b610e8c9190614e3b565b90508060096000016000828254610ea39190614ea0565b925050819055508460096001016000828254610ebf9190614ea0565b925050819055506000600267ffffffffffffffff811115610ee357610ee2614ed4565b5b604051908082528060200260200182016040528015610f115781602001602082028036833780820191505090505b5090503081600081518110610f2957610f28614f03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff49190614f47565b8160018151811061100857611007614f03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061106f30600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886132a7565b7fb933c1b294702108551eddf782a9c7d1a018b57f68ecf63bc59a1247daa19c30828733426040516110a49493929190614f74565b60405180910390a1600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b81526004016111329594939291906150b2565b600060405180830381600087803b15801561114c57600080fd5b505af1158015611160573d6000803e3d6000fd5b50505050505050505060006013601c6101000a81548160ff02191690831515021790555050565b60606040518060400160405280600c81526020017f44656570536f7574682041490000000000000000000000000000000000000000815250905090565b60166020528060005260406000206000915054906101000a900460ff1681565b6000803390506111f58185856132a7565b600191505092915050565b6000600c54905090565b6112126132b9565b61121a613396565b6103e881111561126557806103e86040517f423520ee00000000000000000000000000000000000000000000000000000000815260040161125c929190615147565b60405180910390fd5b611274816003600001546133e8565b6000600360000154905081600360000181905550816003600101819055507fae95575a673d4e1b8078cc03b3ca2acaffe6d26625496c7bc59d338ff09a4a17818333426040516112c794939291906151bc565b60405180910390a15050565b60008190506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611364576040517faf531b2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361145557600083036113a4574791505b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603611409576040517fa5eb0da900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561144f573d6000803e3d6000fd5b50611506565b600083036114da578373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114969190614cc6565b602060405180830381865afa1580156114b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d79190615229565b91505b61150581838673ffffffffffffffffffffffffffffffffffffffff166134309092919063ffffffff16565b5b50505050565b60008033905061151d8582856134af565b611528858585613543565b60019150509392505050565b60038060000154908060010154905082565b600d5481565b601360199054906101000a900460ff1681565b60006012905090565b6013601b9054906101000a900460ff1681565b6115836132b9565b6115d981601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166139bd565b6000601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905081601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f59efce2bd92f91881f8f3ffb8c70709a05ae83006301d26f9fe6170f3e690aea83828433426040516116b89594939291906152a2565b60405180910390a1505050565b6116cd6132b9565b6116d5613396565b6116ee81601360159054906101000a900460ff166139bd565b6000601360159054906101000a900460ff16905081601360156101000a81548160ff0219169083151502179055507fda986e332f97963bfa4bb220bda255b40296aa680cff592b805c2deb80b1dbf3818333426040516117519493929190615354565b60405180910390a15050565b6117656132b9565b60008173ffffffffffffffffffffffffffffffffffffffff163b11156117b7576040517f259f1ec500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118295760006040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081526004016118209190614cc6565b60405180910390fd5b611831613a09565b61185d81601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613a5b565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff7df6bc5c0f9735c300a374247b60dcacf1942b6031785957e762d77977ed420818333426040516118fa94939291906153f8565b60405180910390a15050565b61190e6132b9565b6064811015611957578060646040517fab7d1fbb00000000000000000000000000000000000000000000000000000000815260040161194e92919061548b565b60405180910390fd5b61195f613acf565b61196b816010546133e8565b60006010549050816010819055507f18558967fd5a093126ad115ffea8d443544786d34a646f42dff37fa8700577f0818333426040516119ae9493929190615500565b60405180910390a15050565b6119c26132b9565b6119ca613396565b6103e8811115611a1557806103e86040517f423520ee000000000000000000000000000000000000000000000000000000008152600401611a0c929190615147565b60405180910390fd5b611a24816001600001546133e8565b60006001600001549050816001600001819055508160018001819055507fae95575a673d4e1b8078cc03b3ca2acaffe6d26625496c7bc59d338ff09a4a1781833342604051611a7694939291906155a4565b60405180910390a15050565b60018060000154908060010154905082565b611a9c6132b9565b611af281601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166139bd565b6000601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905081601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f59efce2bd92f91881f8f3ffb8c70709a05ae83006301d26f9fe6170f3e690aea8382843342604051611bd1959493929190615648565b60405180910390a1505050565b600f5481565b611bec6132b9565b611c4281601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166139bd565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ca4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc89190614f47565b73ffffffffffffffffffffffffffffffffffffffff1614158015611d8657503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d9190614f47565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611dc857816040517f8e4c8aa6000000000000000000000000000000000000000000000000000000008152600401611dbf9190614cc6565b60405180910390fd5b60166000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611eb657600160186000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6000601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905081601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f59efce2bd92f91881f8f3ffb8c70709a05ae83006301d26f9fe6170f3e690aea8382843342604051611f959594939291906156fa565b60405180910390a1505050565b60105481565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ff9613b21565b6120036000613b9a565b565b61200d6132b9565b612710600161201a612736565b6120249190614dca565b61202e9190614e3b565b81111561207257806040517f6072742c0000000000000000000000000000000000000000000000000000000081526004016120699190614b50565b60405180910390fd5b61207e81600f546133e8565b6000600f54905081600f819055507f9a9f4704ac409fe039e92a996e415370980275aaff2992936ed5b432886c55c5818333426040516120c19493929190614f74565b60405180910390a15050565b6120d56132b9565b6120dd613acf565b6120f6816013601a9054906101000a900460ff166139bd565b60006013601a9054906101000a900460ff169050816013601a6101000a81548160ff0219169083151502179055507fda986e332f97963bfa4bb220bda255b40296aa680cff592b805c2deb80b1dbf38183334260405161215994939291906157ac565b60405180910390a15050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6121916132b9565b612199613c5e565b6001601360186101000a81548160ff0219169083151502179055507f611312486a6540001c2b69bc849753e64cdefc853bbbc7a576d987821aec28b433426040516121e5929190615850565b60405180910390a1565b6121f76132b9565b6121ff613396565b6103e881111561224a57806103e86040517f423520ee000000000000000000000000000000000000000000000000000000008152600401612241929190615147565b60405180910390fd5b612259816005600001546133e8565b6000600560000154905081600560000181905550816005600101819055507fae95575a673d4e1b8078cc03b3ca2acaffe6d26625496c7bc59d338ff09a4a17818333426040516122ac94939291906158d8565b60405180910390a15050565b60176020528060005260406000206000915054906101000a900460ff1681565b601360149054906101000a900460ff161561233d57601360149054906101000a900460ff16600d546040517fe39c1e87000000000000000000000000000000000000000000000000000000008152600401612334929190615930565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1661235d61267d565b73ffffffffffffffffffffffffffffffffffffffff16141580156123b457503373ffffffffffffffffffffffffffffffffffffffff1661239b61267d565b73ffffffffffffffffffffffffffffffffffffffff1614155b80156123ed57504262278d007f00000000000000000000000000000000000000000000000000000000000000006123eb9190614ea0565b115b1561242f57336040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016124269190614cc6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1661244f61267d565b73ffffffffffffffffffffffffffffffffffffffff161480156124a557503373ffffffffffffffffffffffffffffffffffffffff1661248c61267d565b73ffffffffffffffffffffffffffffffffffffffff1614155b80156124de5750426213c6807f00000000000000000000000000000000000000000000000000000000000000006124dc9190614ea0565b115b15612589576213c6807f00000000000000000000000000000000000000000000000000000000000000006125129190614ea0565b426213c6807f00000000000000000000000000000000000000000000000000000000000000006125429190614ea0565b61254c9190614e6c565b6040517f6ddcad9f000000000000000000000000000000000000000000000000000000008152600401612580929190614bbe565b60405180910390fd5b6013601a9054906101000a900460ff166125b95760016013601a6101000a81548160ff0219169083151502179055505b601360159054906101000a900460ff166125e9576001601360156101000a81548160ff0219169083151502179055505b6013601b9054906101000a900460ff166126195760016013601b6101000a81548160ff0219169083151502179055505b6001601360146101000a81548160ff02191690831515021790555042600d8190555043600e819055507f8b70aa279b24da71d8a874fa0b0ee8f1a587c4fb32b80d87e95cdbdae01b7b4f3342604051612673929190615959565b60405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6126ae6132b9565b6126c7816013601b9054906101000a900460ff166139bd565b60006013601b9054906101000a900460ff169050816013601b6101000a81548160ff0219169083151502179055507fda986e332f97963bfa4bb220bda255b40296aa680cff592b805c2deb80b1dbf38183334260405161272a94939291906159ce565b60405180910390a15050565b60006127426000611fa8565b61274d61dead611fa8565b612755611200565b61275f9190614e6c565b6127699190614e6c565b905090565b60606040518060400160405280600581526020017f534f555448000000000000000000000000000000000000000000000000000000815250905090565b60186020528060005260406000206000915054906101000a900460ff1681565b6013601a9054906101000a900460ff1681565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6128326132b9565b61283a613acf565b6001601360196101000a81548160ff0219169083151502179055507f611312486a6540001c2b69bc849753e64cdefc853bbbc7a576d987821aec28b43342604051612886929190615a72565b60405180910390a1565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000803390506128c7818585613543565b600191505092915050565b61271081565b6128e0613b21565b6128e8613396565b6001601360166101000a81548160ff0219169083151502179055507f611312486a6540001c2b69bc849753e64cdefc853bbbc7a576d987821aec28b43342604051612934929190615afa565b60405180910390a1565b60058060000154908060010154905082565b601360169054906101000a900460ff1681565b61296b6132b9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129dc57806040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081526004016129d39190614cc6565b60405180910390fd5b612a0881600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613a5b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fe1cb783288eddc7b22c25642a832d886a558be0dd900747310a34156b9fdcbbb81833342604051612aa59493929190615b36565b60405180910390a1600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b569190614f47565b73ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c039190614f47565b6040518363ffffffff1660e01b8152600401612c20929190615b7b565b602060405180830381865afa158015612c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c619190614f47565b73ffffffffffffffffffffffffffffffffffffffff160361303757600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0d9190614f47565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dba9190614f47565b6040518363ffffffff1660e01b8152600401612dd7929190615b7b565b6020604051808303816000875af1158015612df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1a9190614f47565b601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060186000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612f4857600160186000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60166000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661303657600160166000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b5050565b613043613b21565b6001601360176101000a81548160ff0219169083151502179055507f611312486a6540001c2b69bc849753e64cdefc853bbbc7a576d987821aec28b4334260405161308f929190615bf0565b60405180910390a1565b601360149054906101000a900460ff1681565b6013601c9054906101000a900460ff1681565b60098060000154908060010154905082565b6000601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601360179054906101000a900460ff1681565b601360159054906101000a900460ff1681565b601360189054906101000a900460ff1681565b60078060000154908060010154905082565b600e5481565b6131b1613b21565b61dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361322357806040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815260040161321a9190614cc6565b60405180910390fd5b6132348161322f61267d565b613a5b565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061327e81613cb0565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6132b48383836001613d36565b505050565b6132c1613c5e565b3373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415801561335257503373ffffffffffffffffffffffffffffffffffffffff1661333961267d565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561339457336040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161338b9190614cc6565b60405180910390fd5b565b601360169054906101000a900460ff16156133e6576040517fa9e7b8a20000000000000000000000000000000000000000000000000000000081526004016133dd90615c78565b60405180910390fd5b565b80820361342c57816040517f657e16cf0000000000000000000000000000000000000000000000000000000081526004016134239190614b50565b60405180910390fd5b5050565b6134aa838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401613463929190615959565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613f0d565b505050565b60006134bb84846130d1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461353d578181101561352d578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161352493929190615c98565b60405180910390fd5b61353c84848484036000613d36565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036135b55760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016135ac9190614cc6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036136275760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161361e9190614cc6565b60405180910390fd5b601360149054906101000a900460ff1661371757601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156136df5750601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613716576040517fab9827ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6013601c9054906101000a900460ff168061377b5750601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156137905761378b838383613fa4565b6139b8565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156137fa57506013601b9054906101000a900460ff165b801561381d5750600f5460096001015460076001015461381a9190614e6c565b10155b80156138335750600f5461383030611fa8565b10155b156138d7576000600f549050601360189054906101000a900460ff16801561388e5750600073ffffffffffffffffffffffffffffffffffffffff1661387661267d565b73ffffffffffffffffffffffffffffffffffffffff16145b156138cc57600061271060016138a2612736565b6138ac9190614dca565b6138b69190614e3b565b9050818111156138c657816138c8565b805b9150505b6138d581610db8565b505b6000819050601360159054906101000a900460ff1680156139425750601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156139985750601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156139ab576139a88484846142a9565b90505b6139b6848483613fa4565b505b505050565b80151582151503613a0557816040517f0a7e72d00000000000000000000000000000000000000000000000000000000081526004016139fc9190614ae6565b60405180910390fd5b5050565b601360179054906101000a900460ff1615613a59576040517fa9e7b8a2000000000000000000000000000000000000000000000000000000008152600401613a5090615d1b565b60405180910390fd5b565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613acb57816040517fa9366369000000000000000000000000000000000000000000000000000000008152600401613ac29190614cc6565b60405180910390fd5b5050565b601360199054906101000a900460ff1615613b1f576040517fa9e7b8a2000000000000000000000000000000000000000000000000000000008152600401613b1690615d87565b60405180910390fd5b565b3373ffffffffffffffffffffffffffffffffffffffff16613b4061267d565b73ffffffffffffffffffffffffffffffffffffffff1614613b9857336040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401613b8f9190614cc6565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b601360189054906101000a900460ff1615613cae576040517fa9e7b8a2000000000000000000000000000000000000000000000000000000008152600401613ca590615df3565b60405180910390fd5b565b613cb8613b21565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613d2a5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401613d219190614cc6565b60405180910390fd5b613d3381613b9a565b50565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613da85760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401613d9f9190614cc6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613e1a5760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401613e119190614cc6565b60405180910390fd5b81601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015613f07578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051613efe9190614b50565b60405180910390a35b50505050565b6000613f38828473ffffffffffffffffffffffffffffffffffffffff1661449f90919063ffffffff16565b90506000815114158015613f5d575080806020019051810190613f5b9190615e28565b155b15613f9f57826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401613f969190614cc6565b60405180910390fd5b505050565b600081613fb084611fa8565b613fba9190614ea0565b90506000612710601054613fcc612736565b613fd69190614dca565b613fe09190614e3b565b9050808211801561403b5750601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561407f5781816040517fc116064c000000000000000000000000000000000000000000000000000000008152600401614076929190614bbe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036140d15782600c60008282546140c59190614ea0565b925050819055506141a6565b6000601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561415e578581856040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161415593929190615c98565b60405180910390fd5b838103601460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036141ef5782600c6000828254039250508190555061423d565b82601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161429a9190614b50565b60405180910390a35050505050565b600060016013601c6101000a81548160ff021916908315150217905550601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561432457506000600160000154115b1561433a5761433384836144b5565b905061447d565b601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561439857506000600360000154115b156143ae576143a78483614520565b905061447d565b601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156144525750601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561446357506000600560000154115b1561447957614472848361458b565b905061447d565b8190505b60006013601c6101000a81548160ff0219169083151502179055509392505050565b60606144ad838360006145f6565b905092915050565b600060016013601c6101000a81548160ff0219169083151502179055506144fd60016040518060400160405290816000820154815260200160018201548152505084846146c3565b905060006013601c6101000a81548160ff02191690831515021790555092915050565b600060016013601c6101000a81548160ff02191690831515021790555061456860036040518060400160405290816000820154815260200160018201548152505084846146c3565b905060006013601c6101000a81548160ff02191690831515021790555092915050565b600060016013601c6101000a81548160ff0219169083151502179055506145d360056040518060400160405290816000820154815260200160018201548152505084846146c3565b905060006013601c6101000a81548160ff02191690831515021790555092915050565b60608147101561463d57306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016146349190614cc6565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516146669190615e9c565b60006040518083038185875af1925050503d80600081146146a3576040519150601f19603f3d011682016040523d82523d6000602084013e6146a8565b606091505b50915091506146b886838361476f565b925050509392505050565b600060016013601c6101000a81548160ff0219169083151502179055506000846000015190506005600e546146f89190614ea0565b4311614704576126ac90505b600061271082856147159190614dca565b61471f9190614e3b565b90506000818561472f9190614e6c565b9050600082111561474757614746878784866147fe565b5b80935050505060006013601c6101000a81548160ff0219169083151502179055509392505050565b6060826147845761477f8261486f565b6147f6565b600082511480156147ac575060008473ffffffffffffffffffffffffffffffffffffffff163b145b156147ee57836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016147e59190614cc6565b60405180910390fd5b8190506147f7565b5b9392505050565b60016013601c6101000a81548160ff02191690831515021790555060008185600001518461482c9190614dca565b6148369190614e3b565b905061484281846148b4565b61484d843085613fa4565b5060006013601c6101000a81548160ff02191690831515021790555050505050565b6000815111156148825780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016013601c6101000a81548160ff02191690831515021790555081600760000160008282546148e49190614ea0565b9250508190555080600760010160008282546149009190614ea0565b9250508190555060006013601c6101000a81548160ff0219169083151502179055505050565b600080fd5b6000819050919050565b61493e8161492b565b811461494957600080fd5b50565b60008135905061495b81614935565b92915050565b60006020828403121561497757614976614926565b5b60006149858482850161494c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156149c85780820151818401526020810190506149ad565b60008484015250505050565b6000601f19601f8301169050919050565b60006149f08261498e565b6149fa8185614999565b9350614a0a8185602086016149aa565b614a13816149d4565b840191505092915050565b60006020820190508181036000830152614a3881846149e5565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614a6b82614a40565b9050919050565b614a7b81614a60565b8114614a8657600080fd5b50565b600081359050614a9881614a72565b92915050565b600060208284031215614ab457614ab3614926565b5b6000614ac284828501614a89565b91505092915050565b60008115159050919050565b614ae081614acb565b82525050565b6000602082019050614afb6000830184614ad7565b92915050565b60008060408385031215614b1857614b17614926565b5b6000614b2685828601614a89565b9250506020614b378582860161494c565b9150509250929050565b614b4a8161492b565b82525050565b6000602082019050614b656000830184614b41565b92915050565b600080600060608486031215614b8457614b83614926565b5b6000614b9286828701614a89565b9350506020614ba386828701614a89565b9250506040614bb48682870161494c565b9150509250925092565b6000604082019050614bd36000830185614b41565b614be06020830184614b41565b9392505050565b600060ff82169050919050565b614bfd81614be7565b82525050565b6000602082019050614c186000830184614bf4565b92915050565b614c2781614acb565b8114614c3257600080fd5b50565b600081359050614c4481614c1e565b92915050565b60008060408385031215614c6157614c60614926565b5b6000614c6f85828601614a89565b9250506020614c8085828601614c35565b9150509250929050565b600060208284031215614ca057614c9f614926565b5b6000614cae84828501614c35565b91505092915050565b614cc081614a60565b82525050565b6000602082019050614cdb6000830184614cb7565b92915050565b60008060408385031215614cf857614cf7614926565b5b6000614d0685828601614a89565b9250506020614d1785828601614a89565b9150509250929050565b6000819050919050565b6000614d46614d41614d3c84614a40565b614d21565b614a40565b9050919050565b6000614d5882614d2b565b9050919050565b6000614d6a82614d4d565b9050919050565b614d7a81614d5f565b82525050565b6000602082019050614d956000830184614d71565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614dd58261492b565b9150614de08361492b565b9250828202614dee8161492b565b91508282048414831517614e0557614e04614d9b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e468261492b565b9150614e518361492b565b925082614e6157614e60614e0c565b5b828204905092915050565b6000614e778261492b565b9150614e828361492b565b9250828203905081811115614e9a57614e99614d9b565b5b92915050565b6000614eab8261492b565b9150614eb68361492b565b9250828201905080821115614ece57614ecd614d9b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614f4181614a72565b92915050565b600060208284031215614f5d57614f5c614926565b5b6000614f6b84828501614f32565b91505092915050565b6000608082019050614f896000830187614b41565b614f966020830186614b41565b614fa36040830185614cb7565b614fb06060830184614b41565b95945050505050565b6000819050919050565b6000614fde614fd9614fd484614fb9565b614d21565b61492b565b9050919050565b614fee81614fc3565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61502981614a60565b82525050565b600061503b8383615020565b60208301905092915050565b6000602082019050919050565b600061505f82614ff4565b6150698185614fff565b935061507483615010565b8060005b838110156150a557815161508c888261502f565b975061509783615047565b925050600181019050615078565b5085935050505092915050565b600060a0820190506150c76000830188614b41565b6150d46020830187614fe5565b81810360408301526150e68186615054565b90506150f56060830185614cb7565b6151026080830184614b41565b9695505050505050565b6000819050919050565b600061513161512c6151278461510c565b614d21565b61492b565b9050919050565b61514181615116565b82525050565b600060408201905061515c6000830185614b41565b6151696020830184615138565b9392505050565b7f73656c6c46656500000000000000000000000000000000000000000000000000600082015250565b60006151a6600783614999565b91506151b182615170565b602082019050919050565b600060a08201905081810360008301526151d581615199565b90506151e46020830187614b41565b6151f16040830186614b41565b6151fe6060830185614cb7565b61520b6080830184614b41565b95945050505050565b60008151905061522381614935565b92915050565b60006020828403121561523f5761523e614926565b5b600061524d84828501615214565b91505092915050565b7f69734578656d7074466565000000000000000000000000000000000000000000600082015250565b600061528c600b83614999565b915061529782615256565b602082019050919050565b600060c08201905081810360008301526152bb8161527f565b90506152ca6020830188614cb7565b6152d76040830187614ad7565b6152e46060830186614ad7565b6152f16080830185614cb7565b6152fe60a0830184614b41565b9695505050505050565b7f6973466565416374697665000000000000000000000000000000000000000000600082015250565b600061533e600b83614999565b915061534982615308565b602082019050919050565b600060a082019050818103600083015261536d81615331565b905061537c6020830187614ad7565b6153896040830186614ad7565b6153966060830185614cb7565b6153a36080830184614b41565b95945050505050565b7f6d61726b6574696e675265636569766572000000000000000000000000000000600082015250565b60006153e2601183614999565b91506153ed826153ac565b602082019050919050565b600060a0820190508181036000830152615411816153d5565b90506154206020830187614cb7565b61542d6040830186614cb7565b61543a6060830185614cb7565b6154476080830184614b41565b95945050505050565b6000819050919050565b600061547561547061546b84615450565b614d21565b61492b565b9050919050565b6154858161545a565b82525050565b60006040820190506154a06000830185614b41565b6154ad602083018461547c565b9392505050565b7f6d617857616c6c65744c696d6974000000000000000000000000000000000000600082015250565b60006154ea600e83614999565b91506154f5826154b4565b602082019050919050565b600060a0820190508181036000830152615519816154dd565b90506155286020830187614b41565b6155356040830186614b41565b6155426060830185614cb7565b61554f6080830184614b41565b95945050505050565b7f6275794665650000000000000000000000000000000000000000000000000000600082015250565b600061558e600683614999565b915061559982615558565b602082019050919050565b600060a08201905081810360008301526155bd81615581565b90506155cc6020830187614b41565b6155d96040830186614b41565b6155e66060830185614cb7565b6155f36080830184614b41565b95945050505050565b7f69734578656d707457616c6c65744c696d697400000000000000000000000000600082015250565b6000615632601383614999565b915061563d826155fc565b602082019050919050565b600060c082019050818103600083015261566181615625565b90506156706020830188614cb7565b61567d6040830187614ad7565b61568a6060830186614ad7565b6156976080830185614cb7565b6156a460a0830184614b41565b9695505050505050565b7f6973506169724c50000000000000000000000000000000000000000000000000600082015250565b60006156e4600883614999565b91506156ef826156ae565b602082019050919050565b600060c0820190508181036000830152615713816156d7565b90506157226020830188614cb7565b61572f6040830187614ad7565b61573c6060830186614ad7565b6157496080830185614cb7565b61575660a0830184614b41565b9695505050505050565b7f697357616c6c65744c696d697441637469766500000000000000000000000000600082015250565b6000615796601383614999565b91506157a182615760565b602082019050919050565b600060a08201905081810360008301526157c581615789565b90506157d46020830187614ad7565b6157e16040830186614ad7565b6157ee6060830185614cb7565b6157fb6080830184614b41565b95945050505050565b7f69734661696c736166654c6f636b656400000000000000000000000000000000600082015250565b600061583a601083614999565b915061584582615804565b602082019050919050565b600060608201905081810360008301526158698161582d565b90506158786020830185614cb7565b6158856040830184614b41565b9392505050565b7f7472616e73666572466565000000000000000000000000000000000000000000600082015250565b60006158c2600b83614999565b91506158cd8261588c565b602082019050919050565b600060a08201905081810360008301526158f1816158b5565b90506159006020830187614b41565b61590d6040830186614b41565b61591a6060830185614cb7565b6159276080830184614b41565b95945050505050565b60006040820190506159456000830185614ad7565b6159526020830184614b41565b9392505050565b600060408201905061596e6000830185614cb7565b61597b6020830184614b41565b9392505050565b7f697353776170456e61626c656400000000000000000000000000000000000000600082015250565b60006159b8600d83614999565b91506159c382615982565b602082019050919050565b600060a08201905081810360008301526159e7816159ab565b90506159f66020830187614ad7565b615a036040830186614ad7565b615a106060830185614cb7565b615a1d6080830184614b41565b95945050505050565b7f697357616c6c65744c696d69744c6f636b656400000000000000000000000000600082015250565b6000615a5c601383614999565b9150615a6782615a26565b602082019050919050565b60006060820190508181036000830152615a8b81615a4f565b9050615a9a6020830185614cb7565b615aa76040830184614b41565b9392505050565b7f69734665654c6f636b6564000000000000000000000000000000000000000000600082015250565b6000615ae4600b83614999565b9150615aef82615aae565b602082019050919050565b60006060820190508181036000830152615b1381615ad7565b9050615b226020830185614cb7565b615b2f6040830184614b41565b9392505050565b6000608082019050615b4b6000830187614cb7565b615b586020830186614cb7565b615b656040830185614cb7565b615b726060830184614b41565b95945050505050565b6000604082019050615b906000830185614cb7565b615b9d6020830184614cb7565b9392505050565b7f697352656365697665724c6f636b656400000000000000000000000000000000600082015250565b6000615bda601083614999565b9150615be582615ba4565b602082019050919050565b60006060820190508181036000830152615c0981615bcd565b9050615c186020830185614cb7565b615c256040830184614b41565b9392505050565b7f4665650000000000000000000000000000000000000000000000000000000000600082015250565b6000615c62600383614999565b9150615c6d82615c2c565b602082019050919050565b60006020820190508181036000830152615c9181615c55565b9050919050565b6000606082019050615cad6000830186614cb7565b615cba6020830185614b41565b615cc76040830184614b41565b949350505050565b7f5265636569766572000000000000000000000000000000000000000000000000600082015250565b6000615d05600883614999565b9150615d1082615ccf565b602082019050919050565b60006020820190508181036000830152615d3481615cf8565b9050919050565b7f57616c6c65744c696d6974000000000000000000000000000000000000000000600082015250565b6000615d71600b83614999565b9150615d7c82615d3b565b602082019050919050565b60006020820190508181036000830152615da081615d64565b9050919050565b7f4661696c73616665000000000000000000000000000000000000000000000000600082015250565b6000615ddd600883614999565b9150615de882615da7565b602082019050919050565b60006020820190508181036000830152615e0c81615dd0565b9050919050565b600081519050615e2281614c1e565b92915050565b600060208284031215615e3e57615e3d614926565b5b6000615e4c84828501615e13565b91505092915050565b600081519050919050565b600081905092915050565b6000615e7682615e55565b615e808185615e60565b9350615e908185602086016149aa565b80840191505092915050565b6000615ea88284615e6b565b91508190509291505056fea264697066735822122074563d499da46341fff5764e49b4dba8bc5a9b7ce3ba8c488c539cc1abf61f0164736f6c63430008120033

Deployed Bytecode

0x60806040526004361061039b5760003560e01c8063891ff84a116101dc578063acb2ad6f11610102578063dd62ed3e116100a0578063e811f50a1161006f578063e811f50a14610d0d578063f2c4220e14610d39578063f2fde38b14610d64578063f887ea4014610d8d576103a2565b8063dd62ed3e14610c4f578063e2924cd114610c8c578063e43504da14610cb7578063e79f53e614610ce2576103a2565b8063cf9769fd116100dc578063cf9769fd14610bb6578063d621e81314610bcd578063d830678614610bf8578063d941907114610c23576103a2565b8063acb2ad6f14610b36578063b908de8c14610b62578063c851cc3214610b8d576103a2565b80639ffe05331161017a578063a8aa1b3111610149578063a8aa1b3114610a8c578063a9059cbb14610ab7578063ab28a04c14610af4578063ab36629214610b1f576103a2565b80639ffe0533146109f4578063a4475ce414610a1f578063a5949bcf14610a4a578063a616162a14610a75576103a2565b8063924de9b7116101b6578063924de9b7146109385780639358928b1461096157806395d89b411461098c57806399996973146109b7576103a2565b8063891ff84a146108b95780638a8c523c146108f65780638da5cb5b1461090d576103a2565b80633d6362d6116102c157806366a88d961161025f578063779e80d51161022e578063779e80d5146108255780637a40624b1461084e5780637e2b16d1146108795780638577a6d514610890576103a2565b806366a88d961461077d57806370a08231146107a8578063715018a6146107e557806375fed3c7146107fc576103a2565b8063470624021161029b57806347062402146106d45780634b7e71b31461070057806359cd903114610729578063625dd60514610754576103a2565b80633d6362d6146106595780634324deae14610682578063467abe0a146106ab576103a2565b806323b872dd11610339578063313ce56711610308578063313ce567146105b1578063351a964d146105dc578063355496ca146106075780633bf3145414610630576103a2565b806323b872dd146104f25780632b14ca561461052f5780632c735ef81461055b5780633125796614610586576103a2565b8063095ea7b311610375578063095ea7b31461043857806318160ddd146104755780631d933a4a146104a05780631f685bac146104c9576103a2565b806301295143146103a757806306fdde03146103d057806308c43650146103fb576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103ce60048036038101906103c99190614961565b610db8565b005b3480156103dc57600080fd5b506103e5611187565b6040516103f29190614a1e565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d9190614a9e565b6111c4565b60405161042f9190614ae6565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190614b01565b6111e4565b60405161046c9190614ae6565b60405180910390f35b34801561048157600080fd5b5061048a611200565b6040516104979190614b50565b60405180910390f35b3480156104ac57600080fd5b506104c760048036038101906104c29190614961565b61120a565b005b3480156104d557600080fd5b506104f060048036038101906104eb9190614b01565b6112d3565b005b3480156104fe57600080fd5b5061051960048036038101906105149190614b6b565b61150c565b6040516105269190614ae6565b60405180910390f35b34801561053b57600080fd5b50610544611534565b604051610552929190614bbe565b60405180910390f35b34801561056757600080fd5b50610570611546565b60405161057d9190614b50565b60405180910390f35b34801561059257600080fd5b5061059b61154c565b6040516105a89190614ae6565b60405180910390f35b3480156105bd57600080fd5b506105c661155f565b6040516105d39190614c03565b60405180910390f35b3480156105e857600080fd5b506105f1611568565b6040516105fe9190614ae6565b60405180910390f35b34801561061357600080fd5b5061062e60048036038101906106299190614c4a565b61157b565b005b34801561063c57600080fd5b5061065760048036038101906106529190614c8a565b6116c5565b005b34801561066557600080fd5b50610680600480360381019061067b9190614a9e565b61175d565b005b34801561068e57600080fd5b506106a960048036038101906106a49190614961565b611906565b005b3480156106b757600080fd5b506106d260048036038101906106cd9190614961565b6119ba565b005b3480156106e057600080fd5b506106e9611a82565b6040516106f7929190614bbe565b60405180910390f35b34801561070c57600080fd5b5061072760048036038101906107229190614c4a565b611a94565b005b34801561073557600080fd5b5061073e611bde565b60405161074b9190614b50565b60405180910390f35b34801561076057600080fd5b5061077b60048036038101906107769190614c4a565b611be4565b005b34801561078957600080fd5b50610792611fa2565b60405161079f9190614b50565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca9190614a9e565b611fa8565b6040516107dc9190614b50565b60405180910390f35b3480156107f157600080fd5b506107fa611ff1565b005b34801561080857600080fd5b50610823600480360381019061081e9190614961565b612005565b005b34801561083157600080fd5b5061084c60048036038101906108479190614c8a565b6120cd565b005b34801561085a57600080fd5b50610863612165565b6040516108709190614b50565b60405180910390f35b34801561088557600080fd5b5061088e612189565b005b34801561089c57600080fd5b506108b760048036038101906108b29190614961565b6121ef565b005b3480156108c557600080fd5b506108e060048036038101906108db9190614a9e565b6122b8565b6040516108ed9190614ae6565b60405180910390f35b34801561090257600080fd5b5061090b6122d8565b005b34801561091957600080fd5b5061092261267d565b60405161092f9190614cc6565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190614c8a565b6126a6565b005b34801561096d57600080fd5b50610976612736565b6040516109839190614b50565b60405180910390f35b34801561099857600080fd5b506109a161276e565b6040516109ae9190614a1e565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d99190614a9e565b6127ab565b6040516109eb9190614ae6565b60405180910390f35b348015610a0057600080fd5b50610a096127cb565b604051610a169190614ae6565b60405180910390f35b348015610a2b57600080fd5b50610a346127de565b604051610a419190614cc6565b60405180910390f35b348015610a5657600080fd5b50610a5f612804565b604051610a6c9190614cc6565b60405180910390f35b348015610a8157600080fd5b50610a8a61282a565b005b348015610a9857600080fd5b50610aa1612890565b604051610aae9190614cc6565b60405180910390f35b348015610ac357600080fd5b50610ade6004803603810190610ad99190614b01565b6128b6565b604051610aeb9190614ae6565b60405180910390f35b348015610b0057600080fd5b50610b096128d2565b604051610b169190614b50565b60405180910390f35b348015610b2b57600080fd5b50610b346128d8565b005b348015610b4257600080fd5b50610b4b61293e565b604051610b59929190614bbe565b60405180910390f35b348015610b6e57600080fd5b50610b77612950565b604051610b849190614ae6565b60405180910390f35b348015610b9957600080fd5b50610bb46004803603810190610baf9190614a9e565b612963565b005b348015610bc257600080fd5b50610bcb61303b565b005b348015610bd957600080fd5b50610be2613099565b604051610bef9190614ae6565b60405180910390f35b348015610c0457600080fd5b50610c0d6130ac565b604051610c1a9190614ae6565b60405180910390f35b348015610c2f57600080fd5b50610c386130bf565b604051610c46929190614bbe565b60405180910390f35b348015610c5b57600080fd5b50610c766004803603810190610c719190614ce1565b6130d1565b604051610c839190614b50565b60405180910390f35b348015610c9857600080fd5b50610ca1613158565b604051610cae9190614ae6565b60405180910390f35b348015610cc357600080fd5b50610ccc61316b565b604051610cd99190614ae6565b60405180910390f35b348015610cee57600080fd5b50610cf761317e565b604051610d049190614ae6565b60405180910390f35b348015610d1957600080fd5b50610d22613191565b604051610d30929190614bbe565b60405180910390f35b348015610d4557600080fd5b50610d4e6131a3565b604051610d5b9190614b50565b60405180910390f35b348015610d7057600080fd5b50610d8b6004803603810190610d869190614a9e565b6131a9565b005b348015610d9957600080fd5b50610da2613281565b604051610daf9190614d80565b60405180910390f35b60016013601c6101000a81548160ff02191690831515021790555060006127106001610de2612736565b610dec9190614dca565b610df69190614e3b565b905080821115610e3f5781816040517fbcda6668000000000000000000000000000000000000000000000000000000008152600401610e36929190614bbe565b60405180910390fd5b6000600960000154600760000154610e579190614e6c565b90506000600960010154600760010154610e719190614e6c565b90506000818386610e829190614dca565b610e8c9190614e3b565b90508060096000016000828254610ea39190614ea0565b925050819055508460096001016000828254610ebf9190614ea0565b925050819055506000600267ffffffffffffffff811115610ee357610ee2614ed4565b5b604051908082528060200260200182016040528015610f115781602001602082028036833780820191505090505b5090503081600081518110610f2957610f28614f03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff49190614f47565b8160018151811061100857611007614f03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061106f30600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886132a7565b7fb933c1b294702108551eddf782a9c7d1a018b57f68ecf63bc59a1247daa19c30828733426040516110a49493929190614f74565b60405180910390a1600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b81526004016111329594939291906150b2565b600060405180830381600087803b15801561114c57600080fd5b505af1158015611160573d6000803e3d6000fd5b50505050505050505060006013601c6101000a81548160ff02191690831515021790555050565b60606040518060400160405280600c81526020017f44656570536f7574682041490000000000000000000000000000000000000000815250905090565b60166020528060005260406000206000915054906101000a900460ff1681565b6000803390506111f58185856132a7565b600191505092915050565b6000600c54905090565b6112126132b9565b61121a613396565b6103e881111561126557806103e86040517f423520ee00000000000000000000000000000000000000000000000000000000815260040161125c929190615147565b60405180910390fd5b611274816003600001546133e8565b6000600360000154905081600360000181905550816003600101819055507fae95575a673d4e1b8078cc03b3ca2acaffe6d26625496c7bc59d338ff09a4a17818333426040516112c794939291906151bc565b60405180910390a15050565b60008190506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611364576040517faf531b2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361145557600083036113a4574791505b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603611409576040517fa5eb0da900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561144f573d6000803e3d6000fd5b50611506565b600083036114da578373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114969190614cc6565b602060405180830381865afa1580156114b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d79190615229565b91505b61150581838673ffffffffffffffffffffffffffffffffffffffff166134309092919063ffffffff16565b5b50505050565b60008033905061151d8582856134af565b611528858585613543565b60019150509392505050565b60038060000154908060010154905082565b600d5481565b601360199054906101000a900460ff1681565b60006012905090565b6013601b9054906101000a900460ff1681565b6115836132b9565b6115d981601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166139bd565b6000601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905081601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f59efce2bd92f91881f8f3ffb8c70709a05ae83006301d26f9fe6170f3e690aea83828433426040516116b89594939291906152a2565b60405180910390a1505050565b6116cd6132b9565b6116d5613396565b6116ee81601360159054906101000a900460ff166139bd565b6000601360159054906101000a900460ff16905081601360156101000a81548160ff0219169083151502179055507fda986e332f97963bfa4bb220bda255b40296aa680cff592b805c2deb80b1dbf3818333426040516117519493929190615354565b60405180910390a15050565b6117656132b9565b60008173ffffffffffffffffffffffffffffffffffffffff163b11156117b7576040517f259f1ec500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118295760006040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081526004016118209190614cc6565b60405180910390fd5b611831613a09565b61185d81601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613a5b565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff7df6bc5c0f9735c300a374247b60dcacf1942b6031785957e762d77977ed420818333426040516118fa94939291906153f8565b60405180910390a15050565b61190e6132b9565b6064811015611957578060646040517fab7d1fbb00000000000000000000000000000000000000000000000000000000815260040161194e92919061548b565b60405180910390fd5b61195f613acf565b61196b816010546133e8565b60006010549050816010819055507f18558967fd5a093126ad115ffea8d443544786d34a646f42dff37fa8700577f0818333426040516119ae9493929190615500565b60405180910390a15050565b6119c26132b9565b6119ca613396565b6103e8811115611a1557806103e86040517f423520ee000000000000000000000000000000000000000000000000000000008152600401611a0c929190615147565b60405180910390fd5b611a24816001600001546133e8565b60006001600001549050816001600001819055508160018001819055507fae95575a673d4e1b8078cc03b3ca2acaffe6d26625496c7bc59d338ff09a4a1781833342604051611a7694939291906155a4565b60405180910390a15050565b60018060000154908060010154905082565b611a9c6132b9565b611af281601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166139bd565b6000601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905081601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f59efce2bd92f91881f8f3ffb8c70709a05ae83006301d26f9fe6170f3e690aea8382843342604051611bd1959493929190615648565b60405180910390a1505050565b600f5481565b611bec6132b9565b611c4281601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166139bd565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ca4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc89190614f47565b73ffffffffffffffffffffffffffffffffffffffff1614158015611d8657503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d9190614f47565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611dc857816040517f8e4c8aa6000000000000000000000000000000000000000000000000000000008152600401611dbf9190614cc6565b60405180910390fd5b60166000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611eb657600160186000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6000601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905081601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f59efce2bd92f91881f8f3ffb8c70709a05ae83006301d26f9fe6170f3e690aea8382843342604051611f959594939291906156fa565b60405180910390a1505050565b60105481565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ff9613b21565b6120036000613b9a565b565b61200d6132b9565b612710600161201a612736565b6120249190614dca565b61202e9190614e3b565b81111561207257806040517f6072742c0000000000000000000000000000000000000000000000000000000081526004016120699190614b50565b60405180910390fd5b61207e81600f546133e8565b6000600f54905081600f819055507f9a9f4704ac409fe039e92a996e415370980275aaff2992936ed5b432886c55c5818333426040516120c19493929190614f74565b60405180910390a15050565b6120d56132b9565b6120dd613acf565b6120f6816013601a9054906101000a900460ff166139bd565b60006013601a9054906101000a900460ff169050816013601a6101000a81548160ff0219169083151502179055507fda986e332f97963bfa4bb220bda255b40296aa680cff592b805c2deb80b1dbf38183334260405161215994939291906157ac565b60405180910390a15050565b7f000000000000000000000000000000000000000000000000000000006595366781565b6121916132b9565b612199613c5e565b6001601360186101000a81548160ff0219169083151502179055507f611312486a6540001c2b69bc849753e64cdefc853bbbc7a576d987821aec28b433426040516121e5929190615850565b60405180910390a1565b6121f76132b9565b6121ff613396565b6103e881111561224a57806103e86040517f423520ee000000000000000000000000000000000000000000000000000000008152600401612241929190615147565b60405180910390fd5b612259816005600001546133e8565b6000600560000154905081600560000181905550816005600101819055507fae95575a673d4e1b8078cc03b3ca2acaffe6d26625496c7bc59d338ff09a4a17818333426040516122ac94939291906158d8565b60405180910390a15050565b60176020528060005260406000206000915054906101000a900460ff1681565b601360149054906101000a900460ff161561233d57601360149054906101000a900460ff16600d546040517fe39c1e87000000000000000000000000000000000000000000000000000000008152600401612334929190615930565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1661235d61267d565b73ffffffffffffffffffffffffffffffffffffffff16141580156123b457503373ffffffffffffffffffffffffffffffffffffffff1661239b61267d565b73ffffffffffffffffffffffffffffffffffffffff1614155b80156123ed57504262278d007f00000000000000000000000000000000000000000000000000000000659536676123eb9190614ea0565b115b1561242f57336040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016124269190614cc6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1661244f61267d565b73ffffffffffffffffffffffffffffffffffffffff161480156124a557503373ffffffffffffffffffffffffffffffffffffffff1661248c61267d565b73ffffffffffffffffffffffffffffffffffffffff1614155b80156124de5750426213c6807f00000000000000000000000000000000000000000000000000000000659536676124dc9190614ea0565b115b15612589576213c6807f00000000000000000000000000000000000000000000000000000000659536676125129190614ea0565b426213c6807f00000000000000000000000000000000000000000000000000000000659536676125429190614ea0565b61254c9190614e6c565b6040517f6ddcad9f000000000000000000000000000000000000000000000000000000008152600401612580929190614bbe565b60405180910390fd5b6013601a9054906101000a900460ff166125b95760016013601a6101000a81548160ff0219169083151502179055505b601360159054906101000a900460ff166125e9576001601360156101000a81548160ff0219169083151502179055505b6013601b9054906101000a900460ff166126195760016013601b6101000a81548160ff0219169083151502179055505b6001601360146101000a81548160ff02191690831515021790555042600d8190555043600e819055507f8b70aa279b24da71d8a874fa0b0ee8f1a587c4fb32b80d87e95cdbdae01b7b4f3342604051612673929190615959565b60405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6126ae6132b9565b6126c7816013601b9054906101000a900460ff166139bd565b60006013601b9054906101000a900460ff169050816013601b6101000a81548160ff0219169083151502179055507fda986e332f97963bfa4bb220bda255b40296aa680cff592b805c2deb80b1dbf38183334260405161272a94939291906159ce565b60405180910390a15050565b60006127426000611fa8565b61274d61dead611fa8565b612755611200565b61275f9190614e6c565b6127699190614e6c565b905090565b60606040518060400160405280600581526020017f534f555448000000000000000000000000000000000000000000000000000000815250905090565b60186020528060005260406000206000915054906101000a900460ff1681565b6013601a9054906101000a900460ff1681565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6128326132b9565b61283a613acf565b6001601360196101000a81548160ff0219169083151502179055507f611312486a6540001c2b69bc849753e64cdefc853bbbc7a576d987821aec28b43342604051612886929190615a72565b60405180910390a1565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000803390506128c7818585613543565b600191505092915050565b61271081565b6128e0613b21565b6128e8613396565b6001601360166101000a81548160ff0219169083151502179055507f611312486a6540001c2b69bc849753e64cdefc853bbbc7a576d987821aec28b43342604051612934929190615afa565b60405180910390a1565b60058060000154908060010154905082565b601360169054906101000a900460ff1681565b61296b6132b9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129dc57806040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081526004016129d39190614cc6565b60405180910390fd5b612a0881600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613a5b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fe1cb783288eddc7b22c25642a832d886a558be0dd900747310a34156b9fdcbbb81833342604051612aa59493929190615b36565b60405180910390a1600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b569190614f47565b73ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c039190614f47565b6040518363ffffffff1660e01b8152600401612c20929190615b7b565b602060405180830381865afa158015612c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c619190614f47565b73ffffffffffffffffffffffffffffffffffffffff160361303757600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0d9190614f47565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dba9190614f47565b6040518363ffffffff1660e01b8152600401612dd7929190615b7b565b6020604051808303816000875af1158015612df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1a9190614f47565b601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060186000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612f4857600160186000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60166000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661303657600160166000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b5050565b613043613b21565b6001601360176101000a81548160ff0219169083151502179055507f611312486a6540001c2b69bc849753e64cdefc853bbbc7a576d987821aec28b4334260405161308f929190615bf0565b60405180910390a1565b601360149054906101000a900460ff1681565b6013601c9054906101000a900460ff1681565b60098060000154908060010154905082565b6000601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601360179054906101000a900460ff1681565b601360159054906101000a900460ff1681565b601360189054906101000a900460ff1681565b60078060000154908060010154905082565b600e5481565b6131b1613b21565b61dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361322357806040517f8e4c8aa600000000000000000000000000000000000000000000000000000000815260040161321a9190614cc6565b60405180910390fd5b6132348161322f61267d565b613a5b565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061327e81613cb0565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6132b48383836001613d36565b505050565b6132c1613c5e565b3373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415801561335257503373ffffffffffffffffffffffffffffffffffffffff1661333961267d565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561339457336040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161338b9190614cc6565b60405180910390fd5b565b601360169054906101000a900460ff16156133e6576040517fa9e7b8a20000000000000000000000000000000000000000000000000000000081526004016133dd90615c78565b60405180910390fd5b565b80820361342c57816040517f657e16cf0000000000000000000000000000000000000000000000000000000081526004016134239190614b50565b60405180910390fd5b5050565b6134aa838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401613463929190615959565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613f0d565b505050565b60006134bb84846130d1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461353d578181101561352d578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161352493929190615c98565b60405180910390fd5b61353c84848484036000613d36565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036135b55760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016135ac9190614cc6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036136275760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161361e9190614cc6565b60405180910390fd5b601360149054906101000a900460ff1661371757601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156136df5750601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613716576040517fab9827ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6013601c9054906101000a900460ff168061377b5750601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156137905761378b838383613fa4565b6139b8565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156137fa57506013601b9054906101000a900460ff165b801561381d5750600f5460096001015460076001015461381a9190614e6c565b10155b80156138335750600f5461383030611fa8565b10155b156138d7576000600f549050601360189054906101000a900460ff16801561388e5750600073ffffffffffffffffffffffffffffffffffffffff1661387661267d565b73ffffffffffffffffffffffffffffffffffffffff16145b156138cc57600061271060016138a2612736565b6138ac9190614dca565b6138b69190614e3b565b9050818111156138c657816138c8565b805b9150505b6138d581610db8565b505b6000819050601360159054906101000a900460ff1680156139425750601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156139985750601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156139ab576139a88484846142a9565b90505b6139b6848483613fa4565b505b505050565b80151582151503613a0557816040517f0a7e72d00000000000000000000000000000000000000000000000000000000081526004016139fc9190614ae6565b60405180910390fd5b5050565b601360179054906101000a900460ff1615613a59576040517fa9e7b8a2000000000000000000000000000000000000000000000000000000008152600401613a5090615d1b565b60405180910390fd5b565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613acb57816040517fa9366369000000000000000000000000000000000000000000000000000000008152600401613ac29190614cc6565b60405180910390fd5b5050565b601360199054906101000a900460ff1615613b1f576040517fa9e7b8a2000000000000000000000000000000000000000000000000000000008152600401613b1690615d87565b60405180910390fd5b565b3373ffffffffffffffffffffffffffffffffffffffff16613b4061267d565b73ffffffffffffffffffffffffffffffffffffffff1614613b9857336040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401613b8f9190614cc6565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b601360189054906101000a900460ff1615613cae576040517fa9e7b8a2000000000000000000000000000000000000000000000000000000008152600401613ca590615df3565b60405180910390fd5b565b613cb8613b21565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613d2a5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401613d219190614cc6565b60405180910390fd5b613d3381613b9a565b50565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613da85760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401613d9f9190614cc6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613e1a5760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401613e119190614cc6565b60405180910390fd5b81601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015613f07578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051613efe9190614b50565b60405180910390a35b50505050565b6000613f38828473ffffffffffffffffffffffffffffffffffffffff1661449f90919063ffffffff16565b90506000815114158015613f5d575080806020019051810190613f5b9190615e28565b155b15613f9f57826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401613f969190614cc6565b60405180910390fd5b505050565b600081613fb084611fa8565b613fba9190614ea0565b90506000612710601054613fcc612736565b613fd69190614dca565b613fe09190614e3b565b9050808211801561403b5750601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561407f5781816040517fc116064c000000000000000000000000000000000000000000000000000000008152600401614076929190614bbe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036140d15782600c60008282546140c59190614ea0565b925050819055506141a6565b6000601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561415e578581856040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161415593929190615c98565b60405180910390fd5b838103601460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036141ef5782600c6000828254039250508190555061423d565b82601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161429a9190614b50565b60405180910390a35050505050565b600060016013601c6101000a81548160ff021916908315150217905550601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561432457506000600160000154115b1561433a5761433384836144b5565b905061447d565b601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561439857506000600360000154115b156143ae576143a78483614520565b905061447d565b601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156144525750601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561446357506000600560000154115b1561447957614472848361458b565b905061447d565b8190505b60006013601c6101000a81548160ff0219169083151502179055509392505050565b60606144ad838360006145f6565b905092915050565b600060016013601c6101000a81548160ff0219169083151502179055506144fd60016040518060400160405290816000820154815260200160018201548152505084846146c3565b905060006013601c6101000a81548160ff02191690831515021790555092915050565b600060016013601c6101000a81548160ff02191690831515021790555061456860036040518060400160405290816000820154815260200160018201548152505084846146c3565b905060006013601c6101000a81548160ff02191690831515021790555092915050565b600060016013601c6101000a81548160ff0219169083151502179055506145d360056040518060400160405290816000820154815260200160018201548152505084846146c3565b905060006013601c6101000a81548160ff02191690831515021790555092915050565b60608147101561463d57306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016146349190614cc6565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516146669190615e9c565b60006040518083038185875af1925050503d80600081146146a3576040519150601f19603f3d011682016040523d82523d6000602084013e6146a8565b606091505b50915091506146b886838361476f565b925050509392505050565b600060016013601c6101000a81548160ff0219169083151502179055506000846000015190506005600e546146f89190614ea0565b4311614704576126ac90505b600061271082856147159190614dca565b61471f9190614e3b565b90506000818561472f9190614e6c565b9050600082111561474757614746878784866147fe565b5b80935050505060006013601c6101000a81548160ff0219169083151502179055509392505050565b6060826147845761477f8261486f565b6147f6565b600082511480156147ac575060008473ffffffffffffffffffffffffffffffffffffffff163b145b156147ee57836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016147e59190614cc6565b60405180910390fd5b8190506147f7565b5b9392505050565b60016013601c6101000a81548160ff02191690831515021790555060008185600001518461482c9190614dca565b6148369190614e3b565b905061484281846148b4565b61484d843085613fa4565b5060006013601c6101000a81548160ff02191690831515021790555050505050565b6000815111156148825780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016013601c6101000a81548160ff02191690831515021790555081600760000160008282546148e49190614ea0565b9250508190555080600760010160008282546149009190614ea0565b9250508190555060006013601c6101000a81548160ff0219169083151502179055505050565b600080fd5b6000819050919050565b61493e8161492b565b811461494957600080fd5b50565b60008135905061495b81614935565b92915050565b60006020828403121561497757614976614926565b5b60006149858482850161494c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156149c85780820151818401526020810190506149ad565b60008484015250505050565b6000601f19601f8301169050919050565b60006149f08261498e565b6149fa8185614999565b9350614a0a8185602086016149aa565b614a13816149d4565b840191505092915050565b60006020820190508181036000830152614a3881846149e5565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614a6b82614a40565b9050919050565b614a7b81614a60565b8114614a8657600080fd5b50565b600081359050614a9881614a72565b92915050565b600060208284031215614ab457614ab3614926565b5b6000614ac284828501614a89565b91505092915050565b60008115159050919050565b614ae081614acb565b82525050565b6000602082019050614afb6000830184614ad7565b92915050565b60008060408385031215614b1857614b17614926565b5b6000614b2685828601614a89565b9250506020614b378582860161494c565b9150509250929050565b614b4a8161492b565b82525050565b6000602082019050614b656000830184614b41565b92915050565b600080600060608486031215614b8457614b83614926565b5b6000614b9286828701614a89565b9350506020614ba386828701614a89565b9250506040614bb48682870161494c565b9150509250925092565b6000604082019050614bd36000830185614b41565b614be06020830184614b41565b9392505050565b600060ff82169050919050565b614bfd81614be7565b82525050565b6000602082019050614c186000830184614bf4565b92915050565b614c2781614acb565b8114614c3257600080fd5b50565b600081359050614c4481614c1e565b92915050565b60008060408385031215614c6157614c60614926565b5b6000614c6f85828601614a89565b9250506020614c8085828601614c35565b9150509250929050565b600060208284031215614ca057614c9f614926565b5b6000614cae84828501614c35565b91505092915050565b614cc081614a60565b82525050565b6000602082019050614cdb6000830184614cb7565b92915050565b60008060408385031215614cf857614cf7614926565b5b6000614d0685828601614a89565b9250506020614d1785828601614a89565b9150509250929050565b6000819050919050565b6000614d46614d41614d3c84614a40565b614d21565b614a40565b9050919050565b6000614d5882614d2b565b9050919050565b6000614d6a82614d4d565b9050919050565b614d7a81614d5f565b82525050565b6000602082019050614d956000830184614d71565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614dd58261492b565b9150614de08361492b565b9250828202614dee8161492b565b91508282048414831517614e0557614e04614d9b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e468261492b565b9150614e518361492b565b925082614e6157614e60614e0c565b5b828204905092915050565b6000614e778261492b565b9150614e828361492b565b9250828203905081811115614e9a57614e99614d9b565b5b92915050565b6000614eab8261492b565b9150614eb68361492b565b9250828201905080821115614ece57614ecd614d9b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614f4181614a72565b92915050565b600060208284031215614f5d57614f5c614926565b5b6000614f6b84828501614f32565b91505092915050565b6000608082019050614f896000830187614b41565b614f966020830186614b41565b614fa36040830185614cb7565b614fb06060830184614b41565b95945050505050565b6000819050919050565b6000614fde614fd9614fd484614fb9565b614d21565b61492b565b9050919050565b614fee81614fc3565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61502981614a60565b82525050565b600061503b8383615020565b60208301905092915050565b6000602082019050919050565b600061505f82614ff4565b6150698185614fff565b935061507483615010565b8060005b838110156150a557815161508c888261502f565b975061509783615047565b925050600181019050615078565b5085935050505092915050565b600060a0820190506150c76000830188614b41565b6150d46020830187614fe5565b81810360408301526150e68186615054565b90506150f56060830185614cb7565b6151026080830184614b41565b9695505050505050565b6000819050919050565b600061513161512c6151278461510c565b614d21565b61492b565b9050919050565b61514181615116565b82525050565b600060408201905061515c6000830185614b41565b6151696020830184615138565b9392505050565b7f73656c6c46656500000000000000000000000000000000000000000000000000600082015250565b60006151a6600783614999565b91506151b182615170565b602082019050919050565b600060a08201905081810360008301526151d581615199565b90506151e46020830187614b41565b6151f16040830186614b41565b6151fe6060830185614cb7565b61520b6080830184614b41565b95945050505050565b60008151905061522381614935565b92915050565b60006020828403121561523f5761523e614926565b5b600061524d84828501615214565b91505092915050565b7f69734578656d7074466565000000000000000000000000000000000000000000600082015250565b600061528c600b83614999565b915061529782615256565b602082019050919050565b600060c08201905081810360008301526152bb8161527f565b90506152ca6020830188614cb7565b6152d76040830187614ad7565b6152e46060830186614ad7565b6152f16080830185614cb7565b6152fe60a0830184614b41565b9695505050505050565b7f6973466565416374697665000000000000000000000000000000000000000000600082015250565b600061533e600b83614999565b915061534982615308565b602082019050919050565b600060a082019050818103600083015261536d81615331565b905061537c6020830187614ad7565b6153896040830186614ad7565b6153966060830185614cb7565b6153a36080830184614b41565b95945050505050565b7f6d61726b6574696e675265636569766572000000000000000000000000000000600082015250565b60006153e2601183614999565b91506153ed826153ac565b602082019050919050565b600060a0820190508181036000830152615411816153d5565b90506154206020830187614cb7565b61542d6040830186614cb7565b61543a6060830185614cb7565b6154476080830184614b41565b95945050505050565b6000819050919050565b600061547561547061546b84615450565b614d21565b61492b565b9050919050565b6154858161545a565b82525050565b60006040820190506154a06000830185614b41565b6154ad602083018461547c565b9392505050565b7f6d617857616c6c65744c696d6974000000000000000000000000000000000000600082015250565b60006154ea600e83614999565b91506154f5826154b4565b602082019050919050565b600060a0820190508181036000830152615519816154dd565b90506155286020830187614b41565b6155356040830186614b41565b6155426060830185614cb7565b61554f6080830184614b41565b95945050505050565b7f6275794665650000000000000000000000000000000000000000000000000000600082015250565b600061558e600683614999565b915061559982615558565b602082019050919050565b600060a08201905081810360008301526155bd81615581565b90506155cc6020830187614b41565b6155d96040830186614b41565b6155e66060830185614cb7565b6155f36080830184614b41565b95945050505050565b7f69734578656d707457616c6c65744c696d697400000000000000000000000000600082015250565b6000615632601383614999565b915061563d826155fc565b602082019050919050565b600060c082019050818103600083015261566181615625565b90506156706020830188614cb7565b61567d6040830187614ad7565b61568a6060830186614ad7565b6156976080830185614cb7565b6156a460a0830184614b41565b9695505050505050565b7f6973506169724c50000000000000000000000000000000000000000000000000600082015250565b60006156e4600883614999565b91506156ef826156ae565b602082019050919050565b600060c0820190508181036000830152615713816156d7565b90506157226020830188614cb7565b61572f6040830187614ad7565b61573c6060830186614ad7565b6157496080830185614cb7565b61575660a0830184614b41565b9695505050505050565b7f697357616c6c65744c696d697441637469766500000000000000000000000000600082015250565b6000615796601383614999565b91506157a182615760565b602082019050919050565b600060a08201905081810360008301526157c581615789565b90506157d46020830187614ad7565b6157e16040830186614ad7565b6157ee6060830185614cb7565b6157fb6080830184614b41565b95945050505050565b7f69734661696c736166654c6f636b656400000000000000000000000000000000600082015250565b600061583a601083614999565b915061584582615804565b602082019050919050565b600060608201905081810360008301526158698161582d565b90506158786020830185614cb7565b6158856040830184614b41565b9392505050565b7f7472616e73666572466565000000000000000000000000000000000000000000600082015250565b60006158c2600b83614999565b91506158cd8261588c565b602082019050919050565b600060a08201905081810360008301526158f1816158b5565b90506159006020830187614b41565b61590d6040830186614b41565b61591a6060830185614cb7565b6159276080830184614b41565b95945050505050565b60006040820190506159456000830185614ad7565b6159526020830184614b41565b9392505050565b600060408201905061596e6000830185614cb7565b61597b6020830184614b41565b9392505050565b7f697353776170456e61626c656400000000000000000000000000000000000000600082015250565b60006159b8600d83614999565b91506159c382615982565b602082019050919050565b600060a08201905081810360008301526159e7816159ab565b90506159f66020830187614ad7565b615a036040830186614ad7565b615a106060830185614cb7565b615a1d6080830184614b41565b95945050505050565b7f697357616c6c65744c696d69744c6f636b656400000000000000000000000000600082015250565b6000615a5c601383614999565b9150615a6782615a26565b602082019050919050565b60006060820190508181036000830152615a8b81615a4f565b9050615a9a6020830185614cb7565b615aa76040830184614b41565b9392505050565b7f69734665654c6f636b6564000000000000000000000000000000000000000000600082015250565b6000615ae4600b83614999565b9150615aef82615aae565b602082019050919050565b60006060820190508181036000830152615b1381615ad7565b9050615b226020830185614cb7565b615b2f6040830184614b41565b9392505050565b6000608082019050615b4b6000830187614cb7565b615b586020830186614cb7565b615b656040830185614cb7565b615b726060830184614b41565b95945050505050565b6000604082019050615b906000830185614cb7565b615b9d6020830184614cb7565b9392505050565b7f697352656365697665724c6f636b656400000000000000000000000000000000600082015250565b6000615bda601083614999565b9150615be582615ba4565b602082019050919050565b60006060820190508181036000830152615c0981615bcd565b9050615c186020830185614cb7565b615c256040830184614b41565b9392505050565b7f4665650000000000000000000000000000000000000000000000000000000000600082015250565b6000615c62600383614999565b9150615c6d82615c2c565b602082019050919050565b60006020820190508181036000830152615c9181615c55565b9050919050565b6000606082019050615cad6000830186614cb7565b615cba6020830185614b41565b615cc76040830184614b41565b949350505050565b7f5265636569766572000000000000000000000000000000000000000000000000600082015250565b6000615d05600883614999565b9150615d1082615ccf565b602082019050919050565b60006020820190508181036000830152615d3481615cf8565b9050919050565b7f57616c6c65744c696d6974000000000000000000000000000000000000000000600082015250565b6000615d71600b83614999565b9150615d7c82615d3b565b602082019050919050565b60006020820190508181036000830152615da081615d64565b9050919050565b7f4661696c73616665000000000000000000000000000000000000000000000000600082015250565b6000615ddd600883614999565b9150615de882615da7565b602082019050919050565b60006020820190508181036000830152615e0c81615dd0565b9050919050565b600081519050615e2281614c1e565b92915050565b600060208284031215615e3e57615e3d614926565b5b6000615e4c84828501615e13565b91505092915050565b600081519050919050565b600081905092915050565b6000615e7682615e55565b615e808185615e60565b9350615e908185602086016149aa565b80840191505092915050565b6000615ea88284615e6b565b91508190509291505056fea264697066735822122074563d499da46341fff5764e49b4dba8bc5a9b7ce3ba8c488c539cc1abf61f0164736f6c63430008120033

Deployed Bytecode Sourcemap

5993:23314:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13899:1147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23857:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7681:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24738:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24155:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18217:525;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10421:801;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24940:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6266:36;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;6802:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7362:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24057:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7454:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21373:337;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16220:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19307:657;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17239:443;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17690:519;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6224:35;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;21718:377;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6883:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19972:573;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6924:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24262:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5456:103;;;;;;;;;;;;;:::i;:::-;;15805:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16549:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6721:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15391:193;;;;;;;;;;;;;:::i;:::-;;18750:549;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7733:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11230:1118;;;;;;;;;;;;;:::i;:::-;;5191:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16926:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12356:151;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23955:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7791:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7408:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6968:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7047:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15592:205;;;;;;;;;;;;;:::i;:::-;;7133:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24388:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6665:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15054:166;;;;;;;;;;;;;:::i;:::-;;6309:34;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;7238:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20553:812;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15228:155;;;;;;;;;;;;;:::i;:::-;;7161:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7494:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6392:34;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;24582:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7276:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7200:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7319:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6350:35;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;6842:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23541:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6435:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13899:1147;7899:4;7890:6;;:13;;;;;;;;;;;;;;;;;;13970:17:::1;6706:6;14012:1;13990:19;:17;:19::i;:::-;:23;;;;:::i;:::-;:40;;;;:::i;:::-;13970:60;;14062:9;14045:14;:26;14041:128;;;14131:14;14147:9;14095:62;;;;;;;;;;;;:::i;:::-;;;;;;;;14041:128;14179:25;14232:11;:21;;;14207:12;:22;;;:46;;;;:::i;:::-;14179:74;;14264:21;14309:11;:17;;;14288:12;:18;;;:38;;;;:::i;:::-;14264:62;;14339:32;14411:13;14391:17;14374:14;:34;;;;:::i;:::-;:50;;;;:::i;:::-;14339:85;;14462:24;14437:11;:21;;;:49;;;;;;;:::i;:::-;;;;;;;;14518:14;14497:11;:17;;;:35;;;;;;;:::i;:::-;;;;;;;;14545:21;14583:1;14569:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14545:40;;14614:4;14596;14601:1;14596:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;14640:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14630:4;14635:1;14630:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;14666:56;14683:4;14698:6;;;;;;;;;;;14707:14;14666:8;:56::i;:::-;14740:81;14751:24;14777:14;14793:10;14805:15;14740:81;;;;;;;;;:::i;:::-;;;;;;;;14834:6;;;;;;;;;;;:57;;;14906:24;14945:1;14961:4;14980:17;;;;;;;;;;;15012:15;14834:204;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;13959:1087;;;;;7935:5:::0;7926:6;;:14;;;;;;;;;;;;;;;;;;13899:1147;:::o;23857:90::-;23902:13;23935:4;;;;;;;;;;;;;;;;;23928:11;;23857:90;:::o;7681:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;24738:194::-;24811:4;24828:16;24847:10;24828:29;;24868:34;24877:8;24887:7;24896:5;24868:8;:34::i;:::-;24920:4;24913:11;;;24738:194;;;;:::o;24155:99::-;24207:7;24234:12;;24227:19;;24155:99;:::o;18217:525::-;7996:21;:19;:21::i;:::-;18303:15:::1;:13;:15::i;:::-;18351:4;18333:15;:22;18329:100;;;18395:15;18412:4;18379:38;;;;;;;;;;;;:::i;:::-;;;;;;;;18329:100;18439:54;18458:15;18475:7;:17;;;18439:18;:54::i;:::-;18504:23;18530:7;:17;;;18504:43;;18578:15;18558:7;:17;;:35;;;;18620:15;18604:7;:13;;:31;;;;18651:83;18672:15;18689;18706:10;18718:15;18651:83;;;;;;;;;:::i;:::-;;;;;;;;18292:450;18217:525:::0;:::o;10421:801::-;10496:18;10517:6;10496:27;;10534:16;10553:17;;;;;;;;;;;10534:36;;10611:4;10587:29;;:12;:29;;;10583:632;;10640:27;;;;;;;;;;;;;;10583:632;10713:1;10689:26;;:12;:26;;;10685:530;;10746:1;10736:6;:11;10732:86;;10781:21;10768:34;;10732:86;10850:8;10836:22;;:10;:22;;;10832:107;;10886:37;;;;;;;;;;;;;;10832:107;10961:8;10953:26;;:38;10980:10;10953:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10685:530;;;11038:1;11028:6;:11;11024:110;;11080:12;11073:30;;;11112:4;11073:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11060:58;;11024:110;11148:55;11182:8;11192:10;11155:12;11148:33;;;;:55;;;;;:::i;:::-;10685:530;10485:737;;10421:801;;:::o;24940:247::-;25027:4;25044:15;25062:10;25044:28;;25083:37;25099:4;25105:7;25114:5;25083:15;:37::i;:::-;25131:26;25141:4;25147:2;25151:5;25131:9;:26::i;:::-;25175:4;25168:11;;;24940:247;;;;;:::o;6266:36::-;;;;;;;;;;;;;;:::o;6802:33::-;;;;:::o;7362:39::-;;;;;;;;;;;;;:::o;24057:90::-;24106:5;6654:2;24124:15;;24057:90;:::o;7454:33::-;;;;;;;;;;;;;:::o;21373:337::-;7996:21;:19;:21::i;:::-;21466:48:::1;21485:9;21496:11;:17;21508:4;21496:17;;;;;;;;;;;;;;;;;;;;;;;;;21466:18;:48::i;:::-;21525:14;21542:11;:17;21554:4;21542:17;;;;;;;;;;;;;;;;;;;;;;;;;21525:34;;21590:9;21570:11;:17;21582:4;21570:17;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;21615:87;21646:4;21652:9;21663;21674:10;21686:15;21615:87;;;;;;;;;;:::i;:::-;;;;;;;;21455:255;21373:337:::0;;:::o;16220:321::-;7996:21;:19;:21::i;:::-;16299:15:::1;:13;:15::i;:::-;16325:42;16344:9;16355:11;;;;;;;;;;;16325:18;:42::i;:::-;16378:14;16395:11;;;;;;;;;;;16378:28;;16431:9;16417:11;;:23;;;;;;;;;;;;;;;;;;16456:77;16483:9;16494;16505:10;16517:15;16456:77;;;;;;;;;:::i;:::-;;;;;;;;16288:253;16220:321:::0;:::o;19307:657::-;7996:21;:19;:21::i;:::-;19447:1:::1;19412:20;:32;;;:36;19408:102;;;19472:26;;;;;;;;;;;;;;19408:102;19556:1;19524:34;;:20;:34;;::::0;19520:100:::1;;19605:1;19582:26;;;;;;;;;;;:::i;:::-;;;;;;;;19520:100;19630:20;:18;:20::i;:::-;19661:61;19682:20;19704:17;;;;;;;;;;;19661:20;:61::i;:::-;19733:28;19764:17;;;;;;;;;;;19733:48;;19812:20;19792:17;;:40;;;;;;;;;;;;;;;;;;19848:108;19884:20;19906;19928:10;19940:15;19848:108;;;;;;;;;:::i;:::-;;;;;;;;19397:567;19307:657:::0;:::o;17239:443::-;7996:21;:19;:21::i;:::-;17340:3:::1;17329:8;:14;17325:87;;;17386:8;17396:3;17367:33;;;;;;;;;;;;:::i;:::-;;;;;;;;17325:87;17422:23;:21;:23::i;:::-;17456:44;17475:8;17485:14;;17456:18;:44::i;:::-;17511:16;17530:14;;17511:33;;17572:8;17555:14;:25;;;;17596:78;17626:8;17636;17646:10;17658:15;17596:78;;;;;;;;;:::i;:::-;;;;;;;;17314:368;17239:443:::0;:::o;17690:519::-;7996:21;:19;:21::i;:::-;17775:15:::1;:13;:15::i;:::-;17823:4;17805:15;:22;17801:100;;;17867:15;17884:4;17851:38;;;;;;;;;;;;:::i;:::-;;;;;;;;17801:100;17911:53;17930:15;17947:6;:16;;;17911:18;:53::i;:::-;17975:23;18001:6;:16;;;17975:42;;18047:15;18028:6;:16;;:34;;;;18088:15;18073:6;:12:::0;::::1;:30;;;;18119:82;18139:15;18156;18173:10;18185:15;18119:82;;;;;;;;;:::i;:::-;;;;;;;;17764:445;17690:519:::0;:::o;6224:35::-;;;;;;;;;;;;;;:::o;21718:377::-;7996:21;:19;:21::i;:::-;21819:56:::1;21838:9;21849:19;:25;21869:4;21849:25;;;;;;;;;;;;;;;;;;;;;;;;;21819:18;:56::i;:::-;21886:14;21903:19;:25;21923:4;21903:25;;;;;;;;;;;;;;;;;;;;;;;;;21886:42;;21967:9;21939:19;:25;21959:4;21939:25;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;21992:95;22031:4;22037:9;22048;22059:10;22071:15;21992:95;;;;;;;;;;:::i;:::-;;;;;;;;21808:287;21718:377:::0;;:::o;6883:34::-;;;;:::o;19972:573::-;7996:21;:19;:21::i;:::-;20061:47:::1;20080:9;20091:8;:16;20100:6;20091:16;;;;;;;;;;;;;;;;;;;;;;;;;20061:18;:47::i;:::-;20157:4;20123:39;;20129:6;20123:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;;:82;;;;;20200:4;20166:39;;20172:6;20166:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;;20123:82;20119:144;;;20244:6;20229:22;;;;;;;;;;;:::i;:::-;;;;;;;;20119:144;20278:8;:14;20287:4;;;;;;;;;;;20278:14;;;;;;;;;;;;;;;;;;;;;;;;;20273:80;;20337:4;20309:19;:25;20329:4;;;;;;;;;;;20309:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;20273:80;20363:14;20380:8;:16;20389:6;20380:16;;;;;;;;;;;;;;;;;;;;;;;;;20363:33;;20426:9;20407:8;:16;20416:6;20407:16;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;20451:86;20479:6;20487:9;20498;20509:10;20521:15;20451:86;;;;;;;;;;:::i;:::-;;;;;;;;20050:495;19972:573:::0;;:::o;6924:35::-;;;;:::o;24262:118::-;24327:7;24354:9;:18;24364:7;24354:18;;;;;;;;;;;;;;;;24347:25;;24262:118;;;:::o;5456:103::-;4751:13;:11;:13::i;:::-;5521:30:::1;5548:1;5521:18;:30::i;:::-;5456:103::o:0;15805:407::-;7996:21;:19;:21::i;:::-;6706:6:::1;15925:1;15903:19;:17;:19::i;:::-;:23;;;;:::i;:::-;:40;;;;:::i;:::-;15890:10;:53;15886:117;;;15980:10;15967:24;;;;;;;;;;;:::i;:::-;;;;;;;;15886:117;16013:39;16032:10;16044:7;;16013:18;:39::i;:::-;16063:18;16084:7;;16063:28;;16112:10;16102:7;:20;;;;16138:66;16152:10;16164;16176;16188:15;16138:66;;;;;;;;;:::i;:::-;;;;;;;;15875:337;15805:407:::0;:::o;16549:369::-;7996:21;:19;:21::i;:::-;16636:23:::1;:21;:23::i;:::-;16670:50;16689:9;16700:19;;;;;;;;;;;16670:18;:50::i;:::-;16731:14;16748:19;;;;;;;;;;;16731:36;;16800:9;16778:19;;:31;;;;;;;;;;;;;;;;;;16825:85;16860:9;16871;16882:10;16894:15;16825:85;;;;;;;;;:::i;:::-;;;;;;;;16625:293;16549:369:::0;:::o;6721:35::-;;;:::o;15391:193::-;7996:21;:19;:21::i;:::-;15453:20:::1;:18;:20::i;:::-;15503:4;15484:16;;:23;;;;;;;;;;;;;;;;;;15523:53;15548:10;15560:15;15523:53;;;;;;;:::i;:::-;;;;;;;;15391:193::o:0;18750:549::-;7996:21;:19;:21::i;:::-;18840:15:::1;:13;:15::i;:::-;18888:4;18870:15;:22;18866:100;;;18932:15;18949:4;18916:38;;;;;;;;;;;;:::i;:::-;;;;;;;;18866:100;18976:58;18995:15;19012:11;:21;;;18976:18;:58::i;:::-;19045:23;19071:11;:21;;;19045:47;;19127:15;19103:11;:21;;:39;;;;19173:15;19153:11;:17;;:35;;;;19204:87;19229:15;19246;19263:10;19275:15;19204:87;;;;;;;;;:::i;:::-;;;;;;;;18829:470;18750:549:::0;:::o;7733:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;11230:1118::-;11279:12;;;;;;;;;;;11275:101;;;11335:12;;;;;;;;;;;11349:14;;11315:49;;;;;;;;;;;;:::i;:::-;;;;;;;;11275:101;11423:1;11404:21;;:7;:5;:7::i;:::-;:21;;;;:59;;;;;11453:10;11442:21;;:7;:5;:7::i;:::-;:21;;;;11404:59;:114;;;;;11503:15;11493:7;11480:10;:20;;;;:::i;:::-;:38;11404:114;11386:216;;;11579:10;11552:38;;;;;;;;;;;:::i;:::-;;;;;;;;11386:216;11649:1;11630:21;;:7;:5;:7::i;:::-;:21;;;:59;;;;;11679:10;11668:21;;:7;:5;:7::i;:::-;:21;;;;11630:59;:114;;;;;11729:15;11719:7;11706:10;:20;;;;:::i;:::-;:38;11630:114;11612:313;;;11831:7;11818:10;:20;;;;:::i;:::-;11883:15;11872:7;11859:10;:20;;;;:::i;:::-;11858:40;;;;:::i;:::-;11778:135;;;;;;;;;;;;:::i;:::-;;;;;;;;11612:313;11942:19;;;;;;;;;;;11937:79;;12000:4;11978:19;;:26;;;;;;;;;;;;;;;;;;11937:79;12031:11;;;;;;;;;;;12026:63;;12073:4;12059:11;;:18;;;;;;;;;;;;;;;;;;12026:63;12104:13;;;;;;;;;;;12099:67;;12150:4;12134:13;;:20;;;;;;;;;;;;;;;;;;12099:67;12193:4;12178:12;;:19;;;;;;;;;;;;;;;;;;12225:15;12208:14;:32;;;;12269:12;12251:15;:30;;;;12299:41;12312:10;12324:15;12299:41;;;;;;;:::i;:::-;;;;;;;;11230:1118::o;5191:87::-;5237:7;5264:6;;;;;;;;;;;5257:13;;5191:87;:::o;16926:305::-;7996:21;:19;:21::i;:::-;17007:44:::1;17026:9;17037:13;;;;;;;;;;;17007:18;:44::i;:::-;17062:14;17079:13;;;;;;;;;;;17062:30;;17119:9;17103:13;;:25;;;;;;;;;;;;;;;;;;17144:79;17173:9;17184;17195:10;17207:15;17144:79;;;;;;;;;:::i;:::-;;;;;;;;16996:235;16926:305:::0;:::o;12356:151::-;12406:7;12478:21;12496:1;12478:9;:21::i;:::-;12449:26;12467:6;12449:9;:26::i;:::-;12433:13;:11;:13::i;:::-;:42;;;;:::i;:::-;:66;;;;:::i;:::-;12426:73;;12356:151;:::o;23955:94::-;24002:13;24035:6;;;;;;;;;;;;;;;;;24028:13;;23955:94;:::o;7791:59::-;;;;;;;;;;;;;;;;;;;;;;:::o;7408:39::-;;;;;;;;;;;;;:::o;6968:72::-;;;;;;;;;;;;;:::o;7047:77::-;;;;;;;;;;;;;:::o;15592:205::-;7996:21;:19;:21::i;:::-;15657:23:::1;:21;:23::i;:::-;15713:4;15691:19;;:26;;;;;;;;;;;;;;;;;;15733:56;15761:10;15773:15;15733:56;;;;;;;:::i;:::-;;;;;;;;15592:205::o:0;7133:19::-;;;;;;;;;;;;;:::o;24388:186::-;24457:4;24474:16;24493:10;24474:29;;24514:30;24524:8;24534:2;24538:5;24514:9;:30::i;:::-;24562:4;24555:11;;;24388:186;;;;:::o;6665:47::-;6706:6;6665:47;:::o;15054:166::-;4751:13;:11;:13::i;:::-;15104:15:::1;:13;:15::i;:::-;15144:4;15130:11;;:18;;;;;;;;;;;;;;;;;;15164:48;15184:10;15196:15;15164:48;;;;;;;:::i;:::-;;;;;;;;15054:166::o:0;6309:34::-;;;;;;;;;;;;;;:::o;7238:31::-;;;;;;;;;;;;;:::o;20553:812::-;7996:21;:19;:21::i;:::-;20657:1:::1;20636:23;;:9;:23;;::::0;20632:88:::1;;20698:9;20683:25;;;;;;;;;;;:::i;:::-;;;;;;;;20632:88;20730:48;20751:9;20770:6;;;;;;;;;;;20730:20;:48::i;:::-;20791:17;20819:6;;;;;;;;;;;20791:35;;20854:9;20837:6;;:27;;;;;;;;;;;;;;;;;;20882:63;20895:9;20906;20917:10;20929:15;20882:63;;;;;;;;;:::i;:::-;;;;;;;;21047:1;20962:87;;20979:6;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20970:34;;;21013:4;21020:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20970:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20962:87;;::::0;20958:400:::1;;21082:6;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21073:37;;;21119:4;21126:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21073:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21066:4;;:74;;;;;;;;;;;;;;;;;;21162:19;:25;21182:4;;;;;;;;;;;21162:25;;;;;;;;;;;;;;;;;;;;;;;;;21157:99;;21236:4;21208:19;:25;21228:4;;;;;;;;;;;21208:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;21157:99;21275:8;:14;21284:4;;;;;;;;;;;21275:14;;;;;;;;;;;;;;;;;;;;;;;;;21270:77;;21327:4;21310:8;:14;21319:4;;;;;;;;;;;21310:14;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;21270:77;20958:400;20621:744;20553:812:::0;:::o;15228:155::-;4751:13;:11;:13::i;:::-;15302:4:::1;15283:16;;:23;;;;;;;;;;;;;;;;;;15322:53;15347:10;15359:15;15322:53;;;;;;;:::i;:::-;;;;;;;;15228:155::o:0;7161:32::-;;;;;;;;;;;;;:::o;7494:26::-;;;;;;;;;;;;;:::o;6392:34::-;;;;;;;;;;;;;;:::o;24582:148::-;24665:7;24692:11;:21;24704:8;24692:21;;;;;;;;;;;;;;;:30;24714:7;24692:30;;;;;;;;;;;;;;;;24685:37;;24582:148;;;;:::o;7276:36::-;;;;;;;;;;;;;:::o;7200:31::-;;;;;;;;;;;;;:::o;7319:36::-;;;;;;;;;;;;;:::o;6350:35::-;;;;;;;;;;;;;;:::o;6842:34::-;;;;:::o;23541:308::-;4751:13;:11;:13::i;:::-;23647:6:::1;23627:27;;:8;:27;;::::0;23623:91:::1;;23693:8;23678:24;;;;;;;;;;;:::i;:::-;;;;;;;;23623:91;23724:39;23745:8;23755:7;:5;:7::i;:::-;23724:20;:39::i;:::-;23789:8;23774:12;;:23;;;;;;;;;;;;;;;;;;23808:33;23832:8;23808:23;:33::i;:::-;23541:308:::0;:::o;6435:75::-;;;;;;;;;;;;;:::o;28201:136::-;28289:40;28298:8;28308:7;28317:5;28324:4;28289:8;:40::i;:::-;28201:136;;;:::o;12515:223::-;12571:20;:18;:20::i;:::-;12622:10;12606:26;;:12;;;;;;;;;;;:26;;;;:51;;;;;12647:10;12636:21;;:7;:5;:7::i;:::-;:21;;;;12606:51;12602:129;;;12708:10;12681:38;;;;;;;;;;;:::i;:::-;;;;;;;;12602:129;12515:223::o;13617:121::-;13671:11;;;;;;;;;;;13667:64;;;13706:13;;;;;;;;;;:::i;:::-;;;;;;;;13667:64;13617:121::o;12746:185::-;12850:7;12838:8;:19;12834:90;;12903:8;12881:31;;;;;;;;;;;:::i;:::-;;;;;;;;12834:90;12746:185;;:::o;1755:162::-;1838:71;1858:5;1880;:14;;;1897:2;1901:5;1865:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1838:19;:71::i;:::-;1755:162;;;:::o;28808:496::-;28911:24;28938:28;28948:8;28958:7;28938:9;:28::i;:::-;28911:55;;29001:17;28981:16;:37;28977:320;;29058:5;29039:16;:24;29035:132;;;29118:7;29127:16;29145:5;29091:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;29035:132;29210:60;29219:8;29229:7;29257:5;29238:16;:24;29264:5;29210:8;:60::i;:::-;28977:320;28900:404;28808:496;;;:::o;25195:1244::-;25295:1;25279:18;;:4;:18;;;25275:88;;25348:1;25321:30;;;;;;;;;;;:::i;:::-;;;;;;;;25275:88;25391:1;25377:16;;:2;:16;;;25373:88;;25446:1;25417:32;;;;;;;;;;;:::i;:::-;;;;;;;;25373:88;25476:12;;;;;;;;;;;25471:151;;25510:11;:17;25522:4;25510:17;;;;;;;;;;;;;;;;;;;;;;;;;25509:18;:38;;;;;25532:11;:15;25544:2;25532:15;;;;;;;;;;;;;;;;;;;;;;;;;25531:16;25509:38;25505:106;;;25575:20;;;;;;;;;;;;;;25505:106;25471:151;25638:6;;;;;;;;;;;:27;;;;25648:11;:17;25660:4;25648:17;;;;;;;;;;;;;;;;;;;;;;;;;25638:27;25634:91;;;25689:24;25697:4;25703:2;25707:5;25689:7;:24::i;:::-;25682:31;;25634:91;25747:4;;;;;;;;;;;25739:12;;:4;:12;;;;:29;;;;;25755:13;;;;;;;;;;;25739:29;:82;;;;;25814:7;;25793:11;:17;;;25772:12;:18;;;:38;;;;:::i;:::-;:49;;25739:82;:121;;;;;25853:7;;25825:24;25843:4;25825:9;:24::i;:::-;:35;;25739:121;25735:474;;;25877:18;25898:7;;25877:28;;25926:16;;;;;;;;;;;:41;;;;;25965:1;25946:21;;:7;:5;:7::i;:::-;:21;;;25926:41;25922:237;;;25988:22;6706:6;26035:1;26013:19;:17;:19::i;:::-;:23;;;;:::i;:::-;:40;;;;:::i;:::-;25988:65;;26103:10;26085:14;:28;;:58;;26133:10;26085:58;;;26116:14;26085:58;26072:71;;25969:190;25922:237;26175:22;26186:10;26175;:22::i;:::-;25862:347;25735:474;26221:16;26240:5;26221:24;;26262:11;;;;;;;;;;;:33;;;;;26278:11;:17;26290:4;26278:17;;;;;;;;;;;;;;;;;;;;;;;;;26277:18;26262:33;:53;;;;;26300:11;:15;26312:2;26300:15;;;;;;;;;;;;;;;;;;;;;;;;;26299:16;26262:53;26258:134;;;26343:37;26364:4;26370:2;26374:5;26343:20;:37::i;:::-;26332:48;;26258:134;26404:27;26412:4;26418:2;26422:8;26404:7;:27::i;:::-;25264:1175;25195:1244;;;;:::o;12939:179::-;13037:7;13025:19;;:8;:19;;;13021:90;;13090:8;13068:31;;;;;;;;;;;:::i;:::-;;;;;;;;13021:90;12939:179;;:::o;13473:136::-;13532:16;;;;;;;;;;;13528:74;;;13572:18;;;;;;;;;;:::i;:::-;;;;;;;;13528:74;13473:136::o;13126:195::-;13236:7;13222:21;;:10;:21;;;13218:96;;13291:10;13267:35;;;;;;;;;;;:::i;:::-;;;;;;;;13218:96;13126:195;;:::o;13746:145::-;13808:19;;;;;;;;;;;13804:80;;;13851:21;;;;;;;;;;:::i;:::-;;;;;;;;13804:80;13746:145::o;5286:162::-;5357:10;5346:21;;:7;:5;:7::i;:::-;:21;;;5342:99;;5418:10;5391:38;;;;;;;;;;;:::i;:::-;;;;;;;;5342:99;5286:162::o;5795:191::-;5869:16;5888:6;;;;;;;;;;;5869:25;;5914:8;5905:6;;:17;;;;;;;;;;;;;;;;;;5969:8;5938:40;;5959:8;5938:40;;;;;;;;;;;;5858:128;5795:191;:::o;13329:136::-;13388:16;;;;;;;;;;;13384:74;;;13428:18;;;;;;;;;;:::i;:::-;;;;;;;;13384:74;13329:136::o;5567:220::-;4751:13;:11;:13::i;:::-;5672:1:::1;5652:22;;:8;:22;;::::0;5648:93:::1;;5726:1;5698:31;;;;;;;;;;;:::i;:::-;;;;;;;;5648:93;5751:28;5770:8;5751:18;:28::i;:::-;5567:220:::0;:::o;28345:455::-;28481:1;28461:22;;:8;:22;;;28457:94;;28536:1;28507:32;;;;;;;;;;;:::i;:::-;;;;;;;;28457:94;28584:1;28565:21;;:7;:21;;;28561:92;;28638:1;28610:31;;;;;;;;;;;:::i;:::-;;;;;;;;28561:92;28696:5;28663:11;:21;28675:8;28663:21;;;;;;;;;;;;;;;:30;28685:7;28663:30;;;;;;;;;;;;;;;:38;;;;28716:9;28712:81;;;28766:7;28747:34;;28756:8;28747:34;;;28775:5;28747:34;;;;;;:::i;:::-;;;;;;;;28712:81;28345:455;;;;:::o;1925:295::-;2006:23;2032:33;2060:4;2040:5;2032:27;;;;:33;;;;:::i;:::-;2006:59;;2101:1;2080:10;:17;:22;;:57;;;;;2118:10;2107:30;;;;;;;;;;;;:::i;:::-;2106:31;2080:57;2076:137;;;2194:5;2161:40;;;;;;;;;;;:::i;:::-;;;;;;;;2076:137;1995:225;1925:295;;:::o;26973:999::-;27059:18;27096:5;27080:13;27090:2;27080:9;:13::i;:::-;:21;;;;:::i;:::-;27059:42;;27112:13;6706:6;27150:14;;27128:19;:17;:19::i;:::-;:36;;;;:::i;:::-;:53;;;;:::i;:::-;27112:69;;27211:5;27198:10;:18;:46;;;;;27221:19;:23;27241:2;27221:23;;;;;;;;;;;;;;;;;;;;;;;;;27220:24;27198:46;27194:122;;;27286:10;27298:5;27268:36;;;;;;;;;;;;:::i;:::-;;;;;;;;27194:122;27348:1;27332:18;;:4;:18;;;27328:369;;27383:5;27367:12;;:21;;;;;;;:::i;:::-;;;;;;;;27328:369;;;27421:19;27443:9;:15;27453:4;27443:15;;;;;;;;;;;;;;;;27421:37;;27491:5;27477:11;:19;27473:117;;;27549:4;27555:11;27568:5;27524:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;27473:117;27665:5;27651:11;:19;27633:9;:15;27643:4;27633:15;;;;;;;;;;;;;;;:37;;;;27406:291;27328:369;27727:1;27713:16;;:2;:16;;;27709:213;;27791:5;27775:12;;:21;;;;;;;;;;;27709:213;;;27890:5;27873:9;:13;27883:2;27873:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;27709:213;27954:2;27939:25;;27948:4;27939:25;;;27958:5;27939:25;;;;;;:::i;:::-;;;;;;;;27048:924;;26973:999;;;:::o;26447:518::-;26554:7;7899:4;7890:6;;:13;;;;;;;;;;;;;;;;;;26578:8:::1;:14;26587:4;26578:14;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;;26616:1;26597:6;:16;;;:20;26578:40;26574:104;;;26642:24;26653:4;26659:6;26642:10;:24::i;:::-;26635:31;;;;26574:104;26692:8;:12;26701:2;26692:12;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;;;26729:1;26709:7;:17;;;:21;26692:39;26688:104;;;26755:25;26767:4;26773:6;26755:11;:25::i;:::-;26748:32;;;;26688:104;26807:8;:14;26816:4;26807:14;;;;;;;;;;;;;;;;;;;;;;;;;26806:15;:32;;;;;26826:8;:12;26835:2;26826:12;;;;;;;;;;;;;;;;;;;;;;;;;26825:13;26806:32;:63;;;;;26867:1;26843:11;:21;;;:25;26806:63;26802:132;;;26893:29;26909:4;26915:6;26893:15;:29::i;:::-;26886:36;;;;26802:132;26951:6;26944:13;;7914:1;7935:5:::0;7926:6;;:14;;;;;;;;;;;;;;;;;;26447:518;;;;;:::o;222:178::-;322:12;354:38;376:6;384:4;390:1;354:21;:38::i;:::-;347:45;;222:178;;;;:::o;22103:141::-;22180:7;7899:4;7890:6;;:13;;;;;;;;;;;;;;;;;;22207:29:::1;22215:6;22207:29;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;22223:4;22229:6;22207:7;:29::i;:::-;22200:36;;7935:5:::0;7926:6;;:14;;;;;;;;;;;;;;;;;;22103:141;;;;:::o;22252:143::-;22330:7;7899:4;7890:6;;:13;;;;;;;;;;;;;;;;;;22357:30:::1;22365:7;22357:30;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;22374:4;22380:6;22357:7;:30::i;:::-;22350:37;;7935:5:::0;7926:6;;:14;;;;;;;;;;;;;;;;;;22252:143;;;;:::o;22403:151::-;22485:7;7899:4;7890:6;;:13;;;;;;;;;;;;;;;;;;22512:34:::1;22520:11;22512:34;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;22533:4;22539:6;22512:7;:34::i;:::-;22505:41;;7935:5:::0;7926:6;;:14;;;;;;;;;;;;;;;;;;22403:151;;;;:::o;408:456::-;541:12;594:5;570:21;:29;566:110;;;658:4;623:41;;;;;;;;;;;:::i;:::-;;;;;;;;566:110;687:12;701:23;728:6;:11;;747:5;768:4;728:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;686:97;;;;801:55;828:6;836:7;845:10;801:26;:55::i;:::-;794:62;;;;408:456;;;;;:::o;22562:492::-;22656:7;7899:4;7890:6;;:13;;;;;;;;;;;;;;;;;;22676:16:::1;22695:7;:17;;;22676:36;;22761:1;22743:15;;:19;;;;:::i;:::-;22727:12;:35;22723:83;;22790:4;22779:15;;22723:83;22816:17;6706:6;22845:8;22836:6;:17;;;;:::i;:::-;:34;;;;:::i;:::-;22816:54;;22881:17;22910:9;22901:6;:18;;;;:::i;:::-;22881:38;;22946:1;22934:9;:13;22930:90;;;22964:44;22973:7;22982:4;22988:9;22999:8;22964;:44::i;:::-;22930:90;23037:9;23030:16;;;;;7935:5:::0;7926:6;;:14;;;;;;;;;;;;;;;;;;22562:492;;;;;:::o;872:425::-;1020:12;1050:7;1045:245;;1074:19;1082:10;1074:7;:19::i;:::-;1045:245;;;1151:1;1130:10;:17;:22;:49;;;;;1178:1;1156:6;:18;;;:23;1130:49;1126:121;;;1224:6;1207:24;;;;;;;;;;;:::i;:::-;;;;;;;;1126:121;1268:10;1261:17;;;;1045:245;872:425;;;;;;:::o;23062:278::-;7899:4;7890:6;;:13;;;;;;;;;;;;;;;;;;23172:24:::1;23228:3;23208:7;:17;;;23199:6;:26;;;;:::i;:::-;:32;;;;:::i;:::-;23172:59;;23242:41;23258:16;23276:6;23242:15;:41::i;:::-;23296:36;23304:4;23318;23325:6;23296:7;:36::i;:::-;23161:179;7935:5:::0;7926:6;;:14;;;;;;;;;;;;;;;;;;23062:278;;;;:::o;1305:328::-;1395:1;1375:10;:17;:21;1371:255;;;1470:10;1464:17;1527:15;1514:10;1510:2;1506:19;1499:44;1371:255;1597:17;;;;;;;;;;;;;;23348:185;7899:4;7890:6;;:13;;;;;;;;;;;;;;;;;;23470:16:::1;23444:12;:22;;;:42;;;;;;;:::i;:::-;;;;;;;;23519:6;23497:12;:18;;;:28;;;;;;;:::i;:::-;;;;;;;;7935:5:::0;7926:6;;:14;;;;;;;;;;;;;;;;;;23348:185;;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:99::-;1077:6;1111:5;1105:12;1095:22;;1025:99;;;:::o;1130:169::-;1214:11;1248:6;1243:3;1236:19;1288:4;1283:3;1279:14;1264:29;;1130:169;;;;:::o;1305:246::-;1386:1;1396:113;1410:6;1407:1;1404:13;1396:113;;;1495:1;1490:3;1486:11;1480:18;1476:1;1471:3;1467:11;1460:39;1432:2;1429:1;1425:10;1420:15;;1396:113;;;1543:1;1534:6;1529:3;1525:16;1518:27;1367:184;1305:246;;;:::o;1557:102::-;1598:6;1649:2;1645:7;1640:2;1633:5;1629:14;1625:28;1615:38;;1557:102;;;:::o;1665:377::-;1753:3;1781:39;1814:5;1781:39;:::i;:::-;1836:71;1900:6;1895:3;1836:71;:::i;:::-;1829:78;;1916:65;1974:6;1969:3;1962:4;1955:5;1951:16;1916:65;:::i;:::-;2006:29;2028:6;2006:29;:::i;:::-;2001:3;1997:39;1990:46;;1757:285;1665:377;;;;:::o;2048:313::-;2161:4;2199:2;2188:9;2184:18;2176:26;;2248:9;2242:4;2238:20;2234:1;2223:9;2219:17;2212:47;2276:78;2349:4;2340:6;2276:78;:::i;:::-;2268:86;;2048:313;;;;:::o;2367:126::-;2404:7;2444:42;2437:5;2433:54;2422:65;;2367:126;;;:::o;2499:96::-;2536:7;2565:24;2583:5;2565:24;:::i;:::-;2554:35;;2499:96;;;:::o;2601:122::-;2674:24;2692:5;2674:24;:::i;:::-;2667:5;2664:35;2654:63;;2713:1;2710;2703:12;2654:63;2601:122;:::o;2729:139::-;2775:5;2813:6;2800:20;2791:29;;2829:33;2856:5;2829:33;:::i;:::-;2729:139;;;;:::o;2874:329::-;2933:6;2982:2;2970:9;2961:7;2957:23;2953:32;2950:119;;;2988:79;;:::i;:::-;2950:119;3108:1;3133:53;3178:7;3169:6;3158:9;3154:22;3133:53;:::i;:::-;3123:63;;3079:117;2874:329;;;;:::o;3209:90::-;3243:7;3286:5;3279:13;3272:21;3261:32;;3209:90;;;:::o;3305:109::-;3386:21;3401:5;3386:21;:::i;:::-;3381:3;3374:34;3305:109;;:::o;3420:210::-;3507:4;3545:2;3534:9;3530:18;3522:26;;3558:65;3620:1;3609:9;3605:17;3596:6;3558:65;:::i;:::-;3420:210;;;;:::o;3636:474::-;3704:6;3712;3761:2;3749:9;3740:7;3736:23;3732:32;3729:119;;;3767:79;;:::i;:::-;3729:119;3887:1;3912:53;3957:7;3948:6;3937:9;3933:22;3912:53;:::i;:::-;3902:63;;3858:117;4014:2;4040:53;4085:7;4076:6;4065:9;4061:22;4040:53;:::i;:::-;4030:63;;3985:118;3636:474;;;;;:::o;4116:118::-;4203:24;4221:5;4203:24;:::i;:::-;4198:3;4191:37;4116:118;;:::o;4240:222::-;4333:4;4371:2;4360:9;4356:18;4348:26;;4384:71;4452:1;4441:9;4437:17;4428:6;4384:71;:::i;:::-;4240:222;;;;:::o;4468:619::-;4545:6;4553;4561;4610:2;4598:9;4589:7;4585:23;4581:32;4578:119;;;4616:79;;:::i;:::-;4578:119;4736:1;4761:53;4806:7;4797:6;4786:9;4782:22;4761:53;:::i;:::-;4751:63;;4707:117;4863:2;4889:53;4934:7;4925:6;4914:9;4910:22;4889:53;:::i;:::-;4879:63;;4834:118;4991:2;5017:53;5062:7;5053:6;5042:9;5038:22;5017:53;:::i;:::-;5007:63;;4962:118;4468:619;;;;;:::o;5093:332::-;5214:4;5252:2;5241:9;5237:18;5229:26;;5265:71;5333:1;5322:9;5318:17;5309:6;5265:71;:::i;:::-;5346:72;5414:2;5403:9;5399:18;5390:6;5346:72;:::i;:::-;5093:332;;;;;:::o;5431:86::-;5466:7;5506:4;5499:5;5495:16;5484:27;;5431:86;;;:::o;5523:112::-;5606:22;5622:5;5606:22;:::i;:::-;5601:3;5594:35;5523:112;;:::o;5641:214::-;5730:4;5768:2;5757:9;5753:18;5745:26;;5781:67;5845:1;5834:9;5830:17;5821:6;5781:67;:::i;:::-;5641:214;;;;:::o;5861:116::-;5931:21;5946:5;5931:21;:::i;:::-;5924:5;5921:32;5911:60;;5967:1;5964;5957:12;5911:60;5861:116;:::o;5983:133::-;6026:5;6064:6;6051:20;6042:29;;6080:30;6104:5;6080:30;:::i;:::-;5983:133;;;;:::o;6122:468::-;6187:6;6195;6244:2;6232:9;6223:7;6219:23;6215:32;6212:119;;;6250:79;;:::i;:::-;6212:119;6370:1;6395:53;6440:7;6431:6;6420:9;6416:22;6395:53;:::i;:::-;6385:63;;6341:117;6497:2;6523:50;6565:7;6556:6;6545:9;6541:22;6523:50;:::i;:::-;6513:60;;6468:115;6122:468;;;;;:::o;6596:323::-;6652:6;6701:2;6689:9;6680:7;6676:23;6672:32;6669:119;;;6707:79;;:::i;:::-;6669:119;6827:1;6852:50;6894:7;6885:6;6874:9;6870:22;6852:50;:::i;:::-;6842:60;;6798:114;6596:323;;;;:::o;6925:118::-;7012:24;7030:5;7012:24;:::i;:::-;7007:3;7000:37;6925:118;;:::o;7049:222::-;7142:4;7180:2;7169:9;7165:18;7157:26;;7193:71;7261:1;7250:9;7246:17;7237:6;7193:71;:::i;:::-;7049:222;;;;:::o;7277:474::-;7345:6;7353;7402:2;7390:9;7381:7;7377:23;7373:32;7370:119;;;7408:79;;:::i;:::-;7370:119;7528:1;7553:53;7598:7;7589:6;7578:9;7574:22;7553:53;:::i;:::-;7543:63;;7499:117;7655:2;7681:53;7726:7;7717:6;7706:9;7702:22;7681:53;:::i;:::-;7671:63;;7626:118;7277:474;;;;;:::o;7757:60::-;7785:3;7806:5;7799:12;;7757:60;;;:::o;7823:142::-;7873:9;7906:53;7924:34;7933:24;7951:5;7933:24;:::i;:::-;7924:34;:::i;:::-;7906:53;:::i;:::-;7893:66;;7823:142;;;:::o;7971:126::-;8021:9;8054:37;8085:5;8054:37;:::i;:::-;8041:50;;7971:126;;;:::o;8103:141::-;8168:9;8201:37;8232:5;8201:37;:::i;:::-;8188:50;;8103:141;;;:::o;8250:161::-;8352:52;8398:5;8352:52;:::i;:::-;8347:3;8340:65;8250:161;;:::o;8417:252::-;8525:4;8563:2;8552:9;8548:18;8540:26;;8576:86;8659:1;8648:9;8644:17;8635:6;8576:86;:::i;:::-;8417:252;;;;:::o;8675:180::-;8723:77;8720:1;8713:88;8820:4;8817:1;8810:15;8844:4;8841:1;8834:15;8861:410;8901:7;8924:20;8942:1;8924:20;:::i;:::-;8919:25;;8958:20;8976:1;8958:20;:::i;:::-;8953:25;;9013:1;9010;9006:9;9035:30;9053:11;9035:30;:::i;:::-;9024:41;;9214:1;9205:7;9201:15;9198:1;9195:22;9175:1;9168:9;9148:83;9125:139;;9244:18;;:::i;:::-;9125:139;8909:362;8861:410;;;;:::o;9277:180::-;9325:77;9322:1;9315:88;9422:4;9419:1;9412:15;9446:4;9443:1;9436:15;9463:185;9503:1;9520:20;9538:1;9520:20;:::i;:::-;9515:25;;9554:20;9572:1;9554:20;:::i;:::-;9549:25;;9593:1;9583:35;;9598:18;;:::i;:::-;9583:35;9640:1;9637;9633:9;9628:14;;9463:185;;;;:::o;9654:194::-;9694:4;9714:20;9732:1;9714:20;:::i;:::-;9709:25;;9748:20;9766:1;9748:20;:::i;:::-;9743:25;;9792:1;9789;9785:9;9777:17;;9816:1;9810:4;9807:11;9804:37;;;9821:18;;:::i;:::-;9804:37;9654:194;;;;:::o;9854:191::-;9894:3;9913:20;9931:1;9913:20;:::i;:::-;9908:25;;9947:20;9965:1;9947:20;:::i;:::-;9942:25;;9990:1;9987;9983:9;9976:16;;10011:3;10008:1;10005:10;10002:36;;;10018:18;;:::i;:::-;10002:36;9854:191;;;;:::o;10051:180::-;10099:77;10096:1;10089:88;10196:4;10193:1;10186:15;10220:4;10217:1;10210:15;10237:180;10285:77;10282:1;10275:88;10382:4;10379:1;10372:15;10406:4;10403:1;10396:15;10423:143;10480:5;10511:6;10505:13;10496:22;;10527:33;10554:5;10527:33;:::i;:::-;10423:143;;;;:::o;10572:351::-;10642:6;10691:2;10679:9;10670:7;10666:23;10662:32;10659:119;;;10697:79;;:::i;:::-;10659:119;10817:1;10842:64;10898:7;10889:6;10878:9;10874:22;10842:64;:::i;:::-;10832:74;;10788:128;10572:351;;;;:::o;10929:553::-;11106:4;11144:3;11133:9;11129:19;11121:27;;11158:71;11226:1;11215:9;11211:17;11202:6;11158:71;:::i;:::-;11239:72;11307:2;11296:9;11292:18;11283:6;11239:72;:::i;:::-;11321;11389:2;11378:9;11374:18;11365:6;11321:72;:::i;:::-;11403;11471:2;11460:9;11456:18;11447:6;11403:72;:::i;:::-;10929:553;;;;;;;:::o;11488:85::-;11533:7;11562:5;11551:16;;11488:85;;;:::o;11579:158::-;11637:9;11670:61;11688:42;11697:32;11723:5;11697:32;:::i;:::-;11688:42;:::i;:::-;11670:61;:::i;:::-;11657:74;;11579:158;;;:::o;11743:147::-;11838:45;11877:5;11838:45;:::i;:::-;11833:3;11826:58;11743:147;;:::o;11896:114::-;11963:6;11997:5;11991:12;11981:22;;11896:114;;;:::o;12016:184::-;12115:11;12149:6;12144:3;12137:19;12189:4;12184:3;12180:14;12165:29;;12016:184;;;;:::o;12206:132::-;12273:4;12296:3;12288:11;;12326:4;12321:3;12317:14;12309:22;;12206:132;;;:::o;12344:108::-;12421:24;12439:5;12421:24;:::i;:::-;12416:3;12409:37;12344:108;;:::o;12458:179::-;12527:10;12548:46;12590:3;12582:6;12548:46;:::i;:::-;12626:4;12621:3;12617:14;12603:28;;12458:179;;;;:::o;12643:113::-;12713:4;12745;12740:3;12736:14;12728:22;;12643:113;;;:::o;12792:732::-;12911:3;12940:54;12988:5;12940:54;:::i;:::-;13010:86;13089:6;13084:3;13010:86;:::i;:::-;13003:93;;13120:56;13170:5;13120:56;:::i;:::-;13199:7;13230:1;13215:284;13240:6;13237:1;13234:13;13215:284;;;13316:6;13310:13;13343:63;13402:3;13387:13;13343:63;:::i;:::-;13336:70;;13429:60;13482:6;13429:60;:::i;:::-;13419:70;;13275:224;13262:1;13259;13255:9;13250:14;;13215:284;;;13219:14;13515:3;13508:10;;12916:608;;;12792:732;;;;:::o;13530:831::-;13793:4;13831:3;13820:9;13816:19;13808:27;;13845:71;13913:1;13902:9;13898:17;13889:6;13845:71;:::i;:::-;13926:80;14002:2;13991:9;13987:18;13978:6;13926:80;:::i;:::-;14053:9;14047:4;14043:20;14038:2;14027:9;14023:18;14016:48;14081:108;14184:4;14175:6;14081:108;:::i;:::-;14073:116;;14199:72;14267:2;14256:9;14252:18;14243:6;14199:72;:::i;:::-;14281:73;14349:3;14338:9;14334:19;14325:6;14281:73;:::i;:::-;13530:831;;;;;;;;:::o;14367:88::-;14415:7;14444:5;14433:16;;14367:88;;;:::o;14461:164::-;14522:9;14555:64;14573:45;14582:35;14611:5;14582:35;:::i;:::-;14573:45;:::i;:::-;14555:64;:::i;:::-;14542:77;;14461:164;;;:::o;14631:153::-;14729:48;14771:5;14729:48;:::i;:::-;14724:3;14717:61;14631:153;;:::o;14790:354::-;14922:4;14960:2;14949:9;14945:18;14937:26;;14973:71;15041:1;15030:9;15026:17;15017:6;14973:71;:::i;:::-;15054:83;15133:2;15122:9;15118:18;15109:6;15054:83;:::i;:::-;14790:354;;;;;:::o;15150:157::-;15290:9;15286:1;15278:6;15274:14;15267:33;15150:157;:::o;15313:365::-;15455:3;15476:66;15540:1;15535:3;15476:66;:::i;:::-;15469:73;;15551:93;15640:3;15551:93;:::i;:::-;15669:2;15664:3;15660:12;15653:19;;15313:365;;;:::o;15684:861::-;15962:4;16000:3;15989:9;15985:19;15977:27;;16050:9;16044:4;16040:20;16036:1;16025:9;16021:17;16014:47;16078:131;16204:4;16078:131;:::i;:::-;16070:139;;16219:72;16287:2;16276:9;16272:18;16263:6;16219:72;:::i;:::-;16301;16369:2;16358:9;16354:18;16345:6;16301:72;:::i;:::-;16383;16451:2;16440:9;16436:18;16427:6;16383:72;:::i;:::-;16465:73;16533:3;16522:9;16518:19;16509:6;16465:73;:::i;:::-;15684:861;;;;;;;:::o;16551:143::-;16608:5;16639:6;16633:13;16624:22;;16655:33;16682:5;16655:33;:::i;:::-;16551:143;;;;:::o;16700:351::-;16770:6;16819:2;16807:9;16798:7;16794:23;16790:32;16787:119;;;16825:79;;:::i;:::-;16787:119;16945:1;16970:64;17026:7;17017:6;17006:9;17002:22;16970:64;:::i;:::-;16960:74;;16916:128;16700:351;;;;:::o;17057:161::-;17197:13;17193:1;17185:6;17181:14;17174:37;17057:161;:::o;17224:366::-;17366:3;17387:67;17451:2;17446:3;17387:67;:::i;:::-;17380:74;;17463:93;17552:3;17463:93;:::i;:::-;17581:2;17576:3;17572:12;17565:19;;17224:366;;;:::o;17596:948::-;17890:4;17928:3;17917:9;17913:19;17905:27;;17978:9;17972:4;17968:20;17964:1;17953:9;17949:17;17942:47;18006:131;18132:4;18006:131;:::i;:::-;17998:139;;18147:72;18215:2;18204:9;18200:18;18191:6;18147:72;:::i;:::-;18229:66;18291:2;18280:9;18276:18;18267:6;18229:66;:::i;:::-;18305;18367:2;18356:9;18352:18;18343:6;18305:66;:::i;:::-;18381:73;18449:3;18438:9;18434:19;18425:6;18381:73;:::i;:::-;18464;18532:3;18521:9;18517:19;18508:6;18464:73;:::i;:::-;17596:948;;;;;;;;:::o;18550:161::-;18690:13;18686:1;18678:6;18674:14;18667:37;18550:161;:::o;18717:366::-;18859:3;18880:67;18944:2;18939:3;18880:67;:::i;:::-;18873:74;;18956:93;19045:3;18956:93;:::i;:::-;19074:2;19069:3;19065:12;19058:19;;18717:366;;;:::o;19089:837::-;19355:4;19393:3;19382:9;19378:19;19370:27;;19443:9;19437:4;19433:20;19429:1;19418:9;19414:17;19407:47;19471:131;19597:4;19471:131;:::i;:::-;19463:139;;19612:66;19674:2;19663:9;19659:18;19650:6;19612:66;:::i;:::-;19688;19750:2;19739:9;19735:18;19726:6;19688:66;:::i;:::-;19764:72;19832:2;19821:9;19817:18;19808:6;19764:72;:::i;:::-;19846:73;19914:3;19903:9;19899:19;19890:6;19846:73;:::i;:::-;19089:837;;;;;;;:::o;19932:167::-;20072:19;20068:1;20060:6;20056:14;20049:43;19932:167;:::o;20105:366::-;20247:3;20268:67;20332:2;20327:3;20268:67;:::i;:::-;20261:74;;20344:93;20433:3;20344:93;:::i;:::-;20462:2;20457:3;20453:12;20446:19;;20105:366;;;:::o;20477:861::-;20755:4;20793:3;20782:9;20778:19;20770:27;;20843:9;20837:4;20833:20;20829:1;20818:9;20814:17;20807:47;20871:131;20997:4;20871:131;:::i;:::-;20863:139;;21012:72;21080:2;21069:9;21065:18;21056:6;21012:72;:::i;:::-;21094;21162:2;21151:9;21147:18;21138:6;21094:72;:::i;:::-;21176;21244:2;21233:9;21229:18;21220:6;21176:72;:::i;:::-;21258:73;21326:3;21315:9;21311:19;21302:6;21258:73;:::i;:::-;20477:861;;;;;;;:::o;21344:87::-;21391:7;21420:5;21409:16;;21344:87;;;:::o;21437:162::-;21497:9;21530:63;21548:44;21557:34;21585:5;21557:34;:::i;:::-;21548:44;:::i;:::-;21530:63;:::i;:::-;21517:76;;21437:162;;;:::o;21605:151::-;21702:47;21743:5;21702:47;:::i;:::-;21697:3;21690:60;21605:151;;:::o;21762:352::-;21893:4;21931:2;21920:9;21916:18;21908:26;;21944:71;22012:1;22001:9;21997:17;21988:6;21944:71;:::i;:::-;22025:82;22103:2;22092:9;22088:18;22079:6;22025:82;:::i;:::-;21762:352;;;;;:::o;22120:164::-;22260:16;22256:1;22248:6;22244:14;22237:40;22120:164;:::o;22290:366::-;22432:3;22453:67;22517:2;22512:3;22453:67;:::i;:::-;22446:74;;22529:93;22618:3;22529:93;:::i;:::-;22647:2;22642:3;22638:12;22631:19;;22290:366;;;:::o;22662:861::-;22940:4;22978:3;22967:9;22963:19;22955:27;;23028:9;23022:4;23018:20;23014:1;23003:9;22999:17;22992:47;23056:131;23182:4;23056:131;:::i;:::-;23048:139;;23197:72;23265:2;23254:9;23250:18;23241:6;23197:72;:::i;:::-;23279;23347:2;23336:9;23332:18;23323:6;23279:72;:::i;:::-;23361;23429:2;23418:9;23414:18;23405:6;23361:72;:::i;:::-;23443:73;23511:3;23500:9;23496:19;23487:6;23443:73;:::i;:::-;22662:861;;;;;;;:::o;23529:156::-;23669:8;23665:1;23657:6;23653:14;23646:32;23529:156;:::o;23691:365::-;23833:3;23854:66;23918:1;23913:3;23854:66;:::i;:::-;23847:73;;23929:93;24018:3;23929:93;:::i;:::-;24047:2;24042:3;24038:12;24031:19;;23691:365;;;:::o;24062:861::-;24340:4;24378:3;24367:9;24363:19;24355:27;;24428:9;24422:4;24418:20;24414:1;24403:9;24399:17;24392:47;24456:131;24582:4;24456:131;:::i;:::-;24448:139;;24597:72;24665:2;24654:9;24650:18;24641:6;24597:72;:::i;:::-;24679;24747:2;24736:9;24732:18;24723:6;24679:72;:::i;:::-;24761;24829:2;24818:9;24814:18;24805:6;24761:72;:::i;:::-;24843:73;24911:3;24900:9;24896:19;24887:6;24843:73;:::i;:::-;24062:861;;;;;;;:::o;24929:169::-;25069:21;25065:1;25057:6;25053:14;25046:45;24929:169;:::o;25104:366::-;25246:3;25267:67;25331:2;25326:3;25267:67;:::i;:::-;25260:74;;25343:93;25432:3;25343:93;:::i;:::-;25461:2;25456:3;25452:12;25445:19;;25104:366;;;:::o;25476:948::-;25770:4;25808:3;25797:9;25793:19;25785:27;;25858:9;25852:4;25848:20;25844:1;25833:9;25829:17;25822:47;25886:131;26012:4;25886:131;:::i;:::-;25878:139;;26027:72;26095:2;26084:9;26080:18;26071:6;26027:72;:::i;:::-;26109:66;26171:2;26160:9;26156:18;26147:6;26109:66;:::i;:::-;26185;26247:2;26236:9;26232:18;26223:6;26185:66;:::i;:::-;26261:73;26329:3;26318:9;26314:19;26305:6;26261:73;:::i;:::-;26344;26412:3;26401:9;26397:19;26388:6;26344:73;:::i;:::-;25476:948;;;;;;;;:::o;26430:158::-;26570:10;26566:1;26558:6;26554:14;26547:34;26430:158;:::o;26594:365::-;26736:3;26757:66;26821:1;26816:3;26757:66;:::i;:::-;26750:73;;26832:93;26921:3;26832:93;:::i;:::-;26950:2;26945:3;26941:12;26934:19;;26594:365;;;:::o;26965:948::-;27259:4;27297:3;27286:9;27282:19;27274:27;;27347:9;27341:4;27337:20;27333:1;27322:9;27318:17;27311:47;27375:131;27501:4;27375:131;:::i;:::-;27367:139;;27516:72;27584:2;27573:9;27569:18;27560:6;27516:72;:::i;:::-;27598:66;27660:2;27649:9;27645:18;27636:6;27598:66;:::i;:::-;27674;27736:2;27725:9;27721:18;27712:6;27674:66;:::i;:::-;27750:73;27818:3;27807:9;27803:19;27794:6;27750:73;:::i;:::-;27833;27901:3;27890:9;27886:19;27877:6;27833:73;:::i;:::-;26965:948;;;;;;;;:::o;27919:169::-;28059:21;28055:1;28047:6;28043:14;28036:45;27919:169;:::o;28094:366::-;28236:3;28257:67;28321:2;28316:3;28257:67;:::i;:::-;28250:74;;28333:93;28422:3;28333:93;:::i;:::-;28451:2;28446:3;28442:12;28435:19;;28094:366;;;:::o;28466:837::-;28732:4;28770:3;28759:9;28755:19;28747:27;;28820:9;28814:4;28810:20;28806:1;28795:9;28791:17;28784:47;28848:131;28974:4;28848:131;:::i;:::-;28840:139;;28989:66;29051:2;29040:9;29036:18;29027:6;28989:66;:::i;:::-;29065;29127:2;29116:9;29112:18;29103:6;29065:66;:::i;:::-;29141:72;29209:2;29198:9;29194:18;29185:6;29141:72;:::i;:::-;29223:73;29291:3;29280:9;29276:19;29267:6;29223:73;:::i;:::-;28466:837;;;;;;;:::o;29309:166::-;29449:18;29445:1;29437:6;29433:14;29426:42;29309:166;:::o;29481:366::-;29623:3;29644:67;29708:2;29703:3;29644:67;:::i;:::-;29637:74;;29720:93;29809:3;29720:93;:::i;:::-;29838:2;29833:3;29829:12;29822:19;;29481:366;;;:::o;29853:639::-;30075:4;30113:2;30102:9;30098:18;30090:26;;30162:9;30156:4;30152:20;30148:1;30137:9;30133:17;30126:47;30190:131;30316:4;30190:131;:::i;:::-;30182:139;;30331:72;30399:2;30388:9;30384:18;30375:6;30331:72;:::i;:::-;30413;30481:2;30470:9;30466:18;30457:6;30413:72;:::i;:::-;29853:639;;;;;:::o;30498:161::-;30638:13;30634:1;30626:6;30622:14;30615:37;30498:161;:::o;30665:366::-;30807:3;30828:67;30892:2;30887:3;30828:67;:::i;:::-;30821:74;;30904:93;30993:3;30904:93;:::i;:::-;31022:2;31017:3;31013:12;31006:19;;30665:366;;;:::o;31037:861::-;31315:4;31353:3;31342:9;31338:19;31330:27;;31403:9;31397:4;31393:20;31389:1;31378:9;31374:17;31367:47;31431:131;31557:4;31431:131;:::i;:::-;31423:139;;31572:72;31640:2;31629:9;31625:18;31616:6;31572:72;:::i;:::-;31654;31722:2;31711:9;31707:18;31698:6;31654:72;:::i;:::-;31736;31804:2;31793:9;31789:18;31780:6;31736:72;:::i;:::-;31818:73;31886:3;31875:9;31871:19;31862:6;31818:73;:::i;:::-;31037:861;;;;;;;:::o;31904:320::-;32019:4;32057:2;32046:9;32042:18;32034:26;;32070:65;32132:1;32121:9;32117:17;32108:6;32070:65;:::i;:::-;32145:72;32213:2;32202:9;32198:18;32189:6;32145:72;:::i;:::-;31904:320;;;;;:::o;32230:332::-;32351:4;32389:2;32378:9;32374:18;32366:26;;32402:71;32470:1;32459:9;32455:17;32446:6;32402:71;:::i;:::-;32483:72;32551:2;32540:9;32536:18;32527:6;32483:72;:::i;:::-;32230:332;;;;;:::o;32568:163::-;32708:15;32704:1;32696:6;32692:14;32685:39;32568:163;:::o;32737:366::-;32879:3;32900:67;32964:2;32959:3;32900:67;:::i;:::-;32893:74;;32976:93;33065:3;32976:93;:::i;:::-;33094:2;33089:3;33085:12;33078:19;;32737:366;;;:::o;33109:837::-;33375:4;33413:3;33402:9;33398:19;33390:27;;33463:9;33457:4;33453:20;33449:1;33438:9;33434:17;33427:47;33491:131;33617:4;33491:131;:::i;:::-;33483:139;;33632:66;33694:2;33683:9;33679:18;33670:6;33632:66;:::i;:::-;33708;33770:2;33759:9;33755:18;33746:6;33708:66;:::i;:::-;33784:72;33852:2;33841:9;33837:18;33828:6;33784:72;:::i;:::-;33866:73;33934:3;33923:9;33919:19;33910:6;33866:73;:::i;:::-;33109:837;;;;;;;:::o;33952:169::-;34092:21;34088:1;34080:6;34076:14;34069:45;33952:169;:::o;34127:366::-;34269:3;34290:67;34354:2;34349:3;34290:67;:::i;:::-;34283:74;;34366:93;34455:3;34366:93;:::i;:::-;34484:2;34479:3;34475:12;34468:19;;34127:366;;;:::o;34499:639::-;34721:4;34759:2;34748:9;34744:18;34736:26;;34808:9;34802:4;34798:20;34794:1;34783:9;34779:17;34772:47;34836:131;34962:4;34836:131;:::i;:::-;34828:139;;34977:72;35045:2;35034:9;35030:18;35021:6;34977:72;:::i;:::-;35059;35127:2;35116:9;35112:18;35103:6;35059:72;:::i;:::-;34499:639;;;;;:::o;35144:161::-;35284:13;35280:1;35272:6;35268:14;35261:37;35144:161;:::o;35311:366::-;35453:3;35474:67;35538:2;35533:3;35474:67;:::i;:::-;35467:74;;35550:93;35639:3;35550:93;:::i;:::-;35668:2;35663:3;35659:12;35652:19;;35311:366;;;:::o;35683:639::-;35905:4;35943:2;35932:9;35928:18;35920:26;;35992:9;35986:4;35982:20;35978:1;35967:9;35963:17;35956:47;36020:131;36146:4;36020:131;:::i;:::-;36012:139;;36161:72;36229:2;36218:9;36214:18;36205:6;36161:72;:::i;:::-;36243;36311:2;36300:9;36296:18;36287:6;36243:72;:::i;:::-;35683:639;;;;;:::o;36328:553::-;36505:4;36543:3;36532:9;36528:19;36520:27;;36557:71;36625:1;36614:9;36610:17;36601:6;36557:71;:::i;:::-;36638:72;36706:2;36695:9;36691:18;36682:6;36638:72;:::i;:::-;36720;36788:2;36777:9;36773:18;36764:6;36720:72;:::i;:::-;36802;36870:2;36859:9;36855:18;36846:6;36802:72;:::i;:::-;36328:553;;;;;;;:::o;36887:332::-;37008:4;37046:2;37035:9;37031:18;37023:26;;37059:71;37127:1;37116:9;37112:17;37103:6;37059:71;:::i;:::-;37140:72;37208:2;37197:9;37193:18;37184:6;37140:72;:::i;:::-;36887:332;;;;;:::o;37225:166::-;37365:18;37361:1;37353:6;37349:14;37342:42;37225:166;:::o;37397:366::-;37539:3;37560:67;37624:2;37619:3;37560:67;:::i;:::-;37553:74;;37636:93;37725:3;37636:93;:::i;:::-;37754:2;37749:3;37745:12;37738:19;;37397:366;;;:::o;37769:639::-;37991:4;38029:2;38018:9;38014:18;38006:26;;38078:9;38072:4;38068:20;38064:1;38053:9;38049:17;38042:47;38106:131;38232:4;38106:131;:::i;:::-;38098:139;;38247:72;38315:2;38304:9;38300:18;38291:6;38247:72;:::i;:::-;38329;38397:2;38386:9;38382:18;38373:6;38329:72;:::i;:::-;37769:639;;;;;:::o;38414:153::-;38554:5;38550:1;38542:6;38538:14;38531:29;38414:153;:::o;38573:365::-;38715:3;38736:66;38800:1;38795:3;38736:66;:::i;:::-;38729:73;;38811:93;38900:3;38811:93;:::i;:::-;38929:2;38924:3;38920:12;38913:19;;38573:365;;;:::o;38944:419::-;39110:4;39148:2;39137:9;39133:18;39125:26;;39197:9;39191:4;39187:20;39183:1;39172:9;39168:17;39161:47;39225:131;39351:4;39225:131;:::i;:::-;39217:139;;38944:419;;;:::o;39369:442::-;39518:4;39556:2;39545:9;39541:18;39533:26;;39569:71;39637:1;39626:9;39622:17;39613:6;39569:71;:::i;:::-;39650:72;39718:2;39707:9;39703:18;39694:6;39650:72;:::i;:::-;39732;39800:2;39789:9;39785:18;39776:6;39732:72;:::i;:::-;39369:442;;;;;;:::o;39817:158::-;39957:10;39953:1;39945:6;39941:14;39934:34;39817:158;:::o;39981:365::-;40123:3;40144:66;40208:1;40203:3;40144:66;:::i;:::-;40137:73;;40219:93;40308:3;40219:93;:::i;:::-;40337:2;40332:3;40328:12;40321:19;;39981:365;;;:::o;40352:419::-;40518:4;40556:2;40545:9;40541:18;40533:26;;40605:9;40599:4;40595:20;40591:1;40580:9;40576:17;40569:47;40633:131;40759:4;40633:131;:::i;:::-;40625:139;;40352:419;;;:::o;40777:161::-;40917:13;40913:1;40905:6;40901:14;40894:37;40777:161;:::o;40944:366::-;41086:3;41107:67;41171:2;41166:3;41107:67;:::i;:::-;41100:74;;41183:93;41272:3;41183:93;:::i;:::-;41301:2;41296:3;41292:12;41285:19;;40944:366;;;:::o;41316:419::-;41482:4;41520:2;41509:9;41505:18;41497:26;;41569:9;41563:4;41559:20;41555:1;41544:9;41540:17;41533:47;41597:131;41723:4;41597:131;:::i;:::-;41589:139;;41316:419;;;:::o;41741:158::-;41881:10;41877:1;41869:6;41865:14;41858:34;41741:158;:::o;41905:365::-;42047:3;42068:66;42132:1;42127:3;42068:66;:::i;:::-;42061:73;;42143:93;42232:3;42143:93;:::i;:::-;42261:2;42256:3;42252:12;42245:19;;41905:365;;;:::o;42276:419::-;42442:4;42480:2;42469:9;42465:18;42457:26;;42529:9;42523:4;42519:20;42515:1;42504:9;42500:17;42493:47;42557:131;42683:4;42557:131;:::i;:::-;42549:139;;42276:419;;;:::o;42701:137::-;42755:5;42786:6;42780:13;42771:22;;42802:30;42826:5;42802:30;:::i;:::-;42701:137;;;;:::o;42844:345::-;42911:6;42960:2;42948:9;42939:7;42935:23;42931:32;42928:119;;;42966:79;;:::i;:::-;42928:119;43086:1;43111:61;43164:7;43155:6;43144:9;43140:22;43111:61;:::i;:::-;43101:71;;43057:125;42844:345;;;;:::o;43195:98::-;43246:6;43280:5;43274:12;43264:22;;43195:98;;;:::o;43299:147::-;43400:11;43437:3;43422:18;;43299:147;;;;:::o;43452:386::-;43556:3;43584:38;43616:5;43584:38;:::i;:::-;43638:88;43719:6;43714:3;43638:88;:::i;:::-;43631:95;;43735:65;43793:6;43788:3;43781:4;43774:5;43770:16;43735:65;:::i;:::-;43825:6;43820:3;43816:16;43809:23;;43560:278;43452:386;;;;:::o;43844:271::-;43974:3;43996:93;44085:3;44076:6;43996:93;:::i;:::-;43989:100;;44106:3;44099:10;;43844:271;;;;:::o

Swarm Source

ipfs://74563d499da46341fff5764e49b4dba8bc5a9b7ce3ba8c488c539cc1abf61f01
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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