S Price: $0.550895 (-7.72%)

Contract

0x699e596A1fA86E105Ccd77Fd04CAc75443f442C3

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Initial Liqu...114600702025-03-03 19:24:1923 hrs ago1741029859IN
0x699e596A...443f442C3
0.0777665 S0.0119995755
Process Liquidit...114596892025-03-03 19:22:1023 hrs ago1741029730IN
0x699e596A...443f442C3
0 S0.0059688255
Approve114592402025-03-03 19:19:3723 hrs ago1741029577IN
0x699e596A...443f442C3
0 S0.0030069361
Approve114590292025-03-03 19:18:2523 hrs ago1741029505IN
0x699e596A...443f442C3
0 S0.0029599260
Approve114586512025-03-03 19:16:1523 hrs ago1741029375IN
0x699e596A...443f442C3
0 S0.0027109455.01
Transfer114585452025-03-03 19:15:4023 hrs ago1741029340IN
0x699e596A...443f442C3
1 S0.0013248759.93
Add Initial Liqu...114583042025-03-03 19:14:2223 hrs ago1741029262IN
0x699e596A...443f442C3
60 S0.0154299755
Refresh Pair App...114582352025-03-03 19:13:5923 hrs ago1741029239IN
0x699e596A...443f442C3
0 S0.0025787855
Refresh All Appr...114582132025-03-03 19:13:5223 hrs ago1741029232IN
0x699e596A...443f442C3
0 S0.0023564255
Initialize114581882025-03-03 19:13:4423 hrs ago1741029224IN
0x699e596A...443f442C3
0 S0.1295754355

Latest 3 internal transactions

Parent Transaction Hash Block From To
114600702025-03-03 19:24:1923 hrs ago1741029859
0x699e596A...443f442C3
1 S
114600702025-03-03 19:24:1923 hrs ago1741029859
0x699e596A...443f442C3
0.0777665 S
114583042025-03-03 19:14:2223 hrs ago1741029262
0x699e596A...443f442C3
60 S
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FARMER

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at SonicScan.org on 2025-03-03
*/

/**
 *Submitted for verification at SonicScan.org on 2025-03-02
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

// OpenZeppelin Contracts v5.0.1

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 */
abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "R1");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism
 */
abstract contract Ownable {
    address private _owner;

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

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

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

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

    function _checkOwner() internal view virtual {
        require(owner() == msg.sender, "O2");
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "O1");
        _transferOwnership(newOwner);
    }

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

/**
 * @dev Implementation of the {IERC20} interface.
 */
contract ERC20 is IERC20 {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    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 amount) public virtual returns (bool) {
        address owner = msg.sender;
        _transfer(owner, to, amount);
        return true;
    }

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

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

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

    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0) && to != address(0), "E1");
        _beforeTokenTransfer(from, to, amount);
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "E2");
        unchecked {
            _balances[from] = fromBalance - amount;
            _balances[to] += amount;
        }
        emit Transfer(from, to, amount);
        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "E3");
        _beforeTokenTransfer(address(0), account, amount);
        _totalSupply += amount;
        unchecked {
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
        _afterTokenTransfer(address(0), account, amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0) && spender != address(0), "E4");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= amount, "E5");
        unchecked {
            _approve(owner, spender, currentAllowance - amount);
        }
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

interface IMetropolisRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    
    // Mevcut fonksiyonlar
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

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

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

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

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

// Pair interface'ini de ekleyelim
interface IMetropolisPair {
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
}

// FARMER Token Contract
contract FARMER is ERC20, ReentrancyGuard, Ownable {
    // Constants
    uint256 private constant TOTAL_SUPPLY = 1_000_000 * 10**18;
    uint256 private constant TAX_RATE = 5; // 5%
    uint256 private constant LIQUIDITY_TAX = 25; // 2.5%
    uint256 private constant AIRDROP_TAX = 25; // 2.5%
    uint256 private constant MIN_HOLDER_AMOUNT = 10 * 10**18; // 10 tokens minimum for holder status
    uint256 private constant MIN_TOKENS_FOR_PROCESS = 100 * 10**18; // 100 tokens minimum for processing
    uint256 private constant SWAP_PERCENTAGE = 75; // 75% will be swapped
    uint256 private constant LIQUIDITY_PERCENTAGE = 25; // 25% will be used for liquidity
    uint256 private constant MAX_SLIPPAGE = 30; // 30% slippage tolerance
    uint256 private constant TREASURY_PERCENTAGE = 25; // 25% of Sonic tokens to treasury
    uint256 private constant HOLDERS_PERCENTAGE = 75; // 75% of Sonic tokens to holders

    // Metropolis DEX addresses
    IMetropolisRouter public metropolisRouter;
    IMetropolisFactory public metropolisFactory;
    address public sonicToken;
    address public liquidityPair;
    address public treasuryWallet;

    // Holder tracking
    mapping(address => bool) public isHolder;
    address[] public holders;

    // Events
    event LiquidityAdded(uint256 tokenAmount, uint256 sonicAmount);
    event AirdropDistributed(uint256 amount, uint256 holdersCount);
    event TreasuryTransfer(uint256 amount);
    event SwapFailed(string reason);
    event ProcessStarted(uint256 tokensForLiquidity, uint256 tokensForAirdrop);
    event SwapSuccessful(uint256 tokensSwapped, uint256 wethReceived);
    event TreasuryWalletUpdated(address oldTreasury, address newTreasury);
    event LiquidityAddFailed(string reason);
    event AirdropFailed(string reason);
    event PairReservesUpdated(uint256 farmReserve, uint256 wethReserve);
    event ApprovalRefreshed(address token, address spender, uint256 amount);

    uint256 private _pendingLiquidityTokens;
    uint256 private _pendingAirdropTokens;
    bool private _initialized;
    bool private _inSwap;

    constructor() ERC20("FARMER", "FARM") Ownable(msg.sender) {
        address _metropolisRouter = 0x95a7e403d7cF20F675fF9273D66e94d35ba49fA3;
        address _metropolisFactory = 0x1570300e9cFEC66c9Fb0C8bc14366C86EB170Ad0;
        address _sonicToken = 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38;
        address _treasuryWallet = 0x95503A306cD81e08c0c43C49FAae71165937d175;

        require(_metropolisRouter != address(0) && _metropolisFactory != address(0) && _sonicToken != address(0) && _treasuryWallet != address(0), "F1");

        metropolisRouter = IMetropolisRouter(_metropolisRouter);
        metropolisFactory = IMetropolisFactory(_metropolisFactory);
        sonicToken = _sonicToken;
        treasuryWallet = _treasuryWallet;

        _mint(address(this), TOTAL_SUPPLY);
    }

    function initialize() external onlyOwner {
        require(!_initialized, "F2");
        _initialized = true;

        // Try to get existing pair first
        liquidityPair = metropolisFactory.getPair(address(this), sonicToken);
        
        // If pair doesn't exist, create it
        if (liquidityPair == address(0)) {
            liquidityPair = metropolisFactory.createPair(address(this), sonicToken);
        }
        
        require(liquidityPair != address(0), "F3");

        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        require(IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max), "F4");
        IERC20(sonicToken).approve(liquidityPair, type(uint256).max);
        IERC20(address(this)).approve(liquidityPair, type(uint256).max);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);
    }

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._afterTokenTransfer(from, to, amount);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        // Vergi işleme mantığı
        if (
            !_inSwap && 
            from != owner() && 
            to != owner() && 
            from != address(this) && 
            to == liquidityPair
        ) {
            // Vergi hesapla
            uint256 taxAmount = amount * TAX_RATE / 100;
            
            if (taxAmount > 0) {
                // Vergiyi likidite ve airdrop için ayır
                uint256 liquidityTokens = taxAmount * LIQUIDITY_TAX / 100;
                uint256 airdropTokens = taxAmount * AIRDROP_TAX / 100;
                
                // Vergi miktarını ana miktardan düş
                uint256 transferAmount = amount - taxAmount;
                
                // Vergiyi kontrata aktar
                super._transfer(from, address(this), taxAmount);
                
                // Kalan miktarı alıcıya aktar
                super._transfer(from, to, transferAmount);
                
                // Bekleyen miktarları güncelle
                _pendingLiquidityTokens += liquidityTokens;
                _pendingAirdropTokens += airdropTokens;
                
                // Eğer yeterli miktarda token biriktiysek işlemi başlat
                if (_pendingLiquidityTokens + _pendingAirdropTokens >= MIN_TOKENS_FOR_PROCESS) {
                    try this.processLiquidityAndAirdrop() {} catch {}
                }
                
                // Holder durumunu güncelle
                _updateHolder(from, balanceOf(from) >= MIN_HOLDER_AMOUNT);
                _updateHolder(to, balanceOf(to) >= MIN_HOLDER_AMOUNT);
                
                return;
            }
        }
        
        // Normal transfer
        super._transfer(from, to, amount);
        
        // Holder durumunu güncelle
        _updateHolder(from, balanceOf(from) >= MIN_HOLDER_AMOUNT);
        _updateHolder(to, balanceOf(to) >= MIN_HOLDER_AMOUNT);
    }

    function _updateHolder(address account, bool isHolderStatus) private {
        if (account != liquidityPair && account != address(this)) {
            if (isHolderStatus && !isHolder[account]) {
                isHolder[account] = true;
                holders.push(account);
            } else if (!isHolderStatus && isHolder[account]) {
                isHolder[account] = false;
                
                // Remove from holders array
                for (uint256 i = 0; i < holders.length; i++) {
                    if (holders[i] == account) {
                        holders[i] = holders[holders.length - 1];
                        holders.pop();
                        break;
                    }
                }
            }
        }
    }

    function processLiquidityAndAirdrop() external nonReentrant {
        require(!_inSwap, "Already processing");
        _inSwap = true;
        
        uint256 tokensForLiquidity = _pendingLiquidityTokens;
        uint256 tokensForAirdrop = _pendingAirdropTokens;
        
        if (tokensForLiquidity == 0 && tokensForAirdrop == 0) {
            _inSwap = false;
            return;
        }
        
        emit ProcessStarted(tokensForLiquidity, tokensForAirdrop);
        
        // Reset pending amounts
        _pendingLiquidityTokens = 0;
        _pendingAirdropTokens = 0;
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max);
        
        // Process swap
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
        uint256 sonicReceived = _processSwap(totalTokensToSwap);
        
        if (sonicReceived == 0) {
            _inSwap = false;
            return;
        }
        
        // Calculate amounts
        uint256 sonicForLiquidity = sonicReceived * tokensForLiquidity / totalTokensToSwap;
        uint256 sonicForAirdrop = sonicReceived - sonicForLiquidity;
        
        // Process liquidity
        if (sonicForLiquidity > 0) {
            _processLiquidity(tokensForLiquidity, sonicForLiquidity);
        }
        
        // Process airdrop
        if (sonicForAirdrop > 0) {
            uint256 sonicForTreasury = sonicForAirdrop * TREASURY_PERCENTAGE / 100;
            uint256 sonicForHolders = sonicForAirdrop - sonicForTreasury;
            
            _processTreasuryTransfer(sonicForTreasury);
            _processAirdrop(sonicForHolders);
        }
        
        _inSwap = false;
    }

    function _processSwap(uint256 tokensToSwap) private returns (uint256) {
        if (tokensToSwap == 0) return 0;

        _approve(address(this), address(metropolisRouter), tokensToSwap);

        // Swap için path oluştur
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = sonicToken;

        uint256 sonicBefore = IERC20(sonicToken).balanceOf(address(this));

        try metropolisRouter.swapExactTokensForTokens(
            tokensToSwap,
            0,
            path,
            address(this),
            block.timestamp + 300
        ) {
            uint256 sonicAfter = IERC20(sonicToken).balanceOf(address(this));
            uint256 sonicReceived = sonicAfter - sonicBefore;
            emit SwapSuccessful(tokensToSwap, sonicReceived);
            return sonicReceived;
        } catch Error(string memory reason) {
            emit SwapFailed(reason);
            return 0;
        } catch {
            emit SwapFailed("Hata");
            return 0;
        }
    }

    function _processLiquidity(uint256 tokensForLiquidity, uint256 sonicForLiquidity) private {
        if (tokensForLiquidity == 0 || sonicForLiquidity == 0) {
            return;
        }

        // Approve Sonic token for router
        IERC20(sonicToken).approve(address(metropolisRouter), sonicForLiquidity);
        // Approve this token for router
        _approve(address(this), address(metropolisRouter), tokensForLiquidity);

        try metropolisRouter.addLiquidity(
            address(this),
            sonicToken,
            tokensForLiquidity,
            sonicForLiquidity,
            tokensForLiquidity * (100 - MAX_SLIPPAGE) / 100,
            sonicForLiquidity * (100 - MAX_SLIPPAGE) / 100,
            address(this),
            block.timestamp + 300
        ) {
            emit LiquidityAdded(tokensForLiquidity, sonicForLiquidity);
        } catch Error(string memory reason) {
            emit LiquidityAddFailed(reason);
        } catch {
            emit LiquidityAddFailed("Hata");
        }
    }

    function _processTreasuryTransfer(uint256 sonicAmount) private {
        if (sonicAmount == 0 || treasuryWallet == address(0)) return;
        
        try IERC20(sonicToken).transfer(treasuryWallet, sonicAmount) {
            emit TreasuryTransfer(sonicAmount);
        } catch {
            emit AirdropFailed("Treasury transfer failed");
        }
    }

    function _processAirdrop(uint256 sonicAmount) private {
        if (sonicAmount == 0 || holders.length == 0) {
            return;
        }

        uint256 sonicPerHolder = sonicAmount / holders.length;
        
        for (uint256 i = 0; i < holders.length; i++) {
            if (holders[i] != address(0) && holders[i] != address(this) && holders[i] != liquidityPair) {
                try IERC20(sonicToken).transfer(holders[i], sonicPerHolder) {
                    // Transfer başarılı
                } catch Error(string memory reason) {
                    emit AirdropFailed(reason);
                } catch {
                    emit AirdropFailed("Hata");
                }
            }
        }
    }

    // View functions
    function getHolderCount() external view returns (uint256) {
        return holders.length;
    }
    
    function getHolders() external view returns (address[] memory) {
        return holders;
    }

    // Initial liquidity function (must be called by owner with ETH)
    function addInitialLiquidity(uint256 tokenAmount) external payable onlyOwner {
        require(msg.value > 0, "Must provide ETH for initial liquidity");
        require(tokenAmount > 0, "Must provide token amount for initial liquidity");
        
        require(
            IERC20(address(this)).balanceOf(address(this)) >= tokenAmount,
            "Insufficient token balance in contract"
        );

        _approve(address(this), address(metropolisRouter), tokenAmount);

        try metropolisRouter.addLiquidityETH{value: msg.value}(
            address(this),
            tokenAmount,
            0,
            0,
            msg.sender,
            block.timestamp
        ) {
            emit LiquidityAdded(tokenAmount, msg.value);
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            revert("Failed to add liquidity");
        }

        uint256 remainingETH = address(this).balance;
        if (remainingETH > 0) {
            payable(msg.sender).transfer(remainingETH);
        }
    }

    function setRouter(address _router) external onlyOwner {
        require(_router != address(0), "Invalid router address");
        metropolisRouter = IMetropolisRouter(_router);
    }

    function rescueTokens(address _token, uint256 _amount) external onlyOwner {
        require(_token != address(this), "Cannot rescue FARMER tokens");
        IERC20(_token).transfer(owner(), _amount);
    }

    // View functions for pending amounts
    function getPendingLiquidityTokens() external view returns (uint256) {
        return _pendingLiquidityTokens;
    }

    function getPendingAirdropTokens() external view returns (uint256) {
        return _pendingAirdropTokens;
    }

    // Manual trigger for processing (only owner)
    function triggerProcessing() external onlyOwner {
        require(_pendingLiquidityTokens > 0 || _pendingAirdropTokens > 0, "No pending tokens");
        require(holders.length > 0, "No holders");
        try this.processLiquidityAndAirdrop() {
            // Process successful
        } catch {
            emit ProcessStarted(_pendingLiquidityTokens, _pendingAirdropTokens);
        }
    }

    function checkAndRefreshAllowances() external onlyOwner {
        uint256 farmAllowance = IERC20(address(this)).allowance(address(this), address(metropolisRouter));
        if (farmAllowance < TOTAL_SUPPLY) {
            _approve(address(this), address(metropolisRouter), TOTAL_SUPPLY);
        }

        uint256 wethBalance = IERC20(sonicToken).balanceOf(address(this));
        if (wethBalance > 0) {
            uint256 wethAllowance = IERC20(sonicToken).allowance(address(this), address(metropolisRouter));
            if (wethAllowance < wethBalance) {
                IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max);
            }
        }
    }

    // Debug function
    function getSwapInfo() external view returns (
        uint256 contractBalance,
        uint256 routerAllowance,
        bool pairExists,
        address pair,
        uint256 pendingLiq,
        uint256 pendingAirdrop
    ) {
        contractBalance = IERC20(address(this)).balanceOf(address(this));
        routerAllowance = IERC20(address(this)).allowance(address(this), address(metropolisRouter));
        pair = IMetropolisFactory(metropolisRouter.factory()).getPair(address(this), sonicToken);
        pairExists = pair != address(0);
        pendingLiq = _pendingLiquidityTokens;
        pendingAirdrop = _pendingAirdropTokens;
    }

    // Pair rezervlerini kontrol et
    function getPairReserves() public view returns (uint256 farmReserve, uint256 wethReserve) {
        (uint112 reserve0, uint112 reserve1,) = IMetropolisPair(liquidityPair).getReserves();
        address token0 = IMetropolisPair(liquidityPair).token0();
        if (token0 == address(this)) {
            return (uint256(reserve0), uint256(reserve1));
        }
        return (uint256(reserve1), uint256(reserve0));
    }

    // Swap için minimum çıktı miktarını hesapla
    function getMinimumOutput(uint256 amountIn) public view returns (uint256) {
        (uint256 farmReserve, uint256 wethReserve) = getPairReserves();
        if (farmReserve == 0 || wethReserve == 0) return 0;
        
        uint256 amountInWithFee = amountIn * 997; // %0.3 işlem ücreti
        uint256 numerator = amountInWithFee * wethReserve;
        uint256 denominator = (farmReserve * 1000) + amountInWithFee;
        return numerator / denominator;
    }

    // Router için onayları yenile
    function refreshAllApprovals() external onlyOwner {
        // Router için onayları yenile
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Sonic token için onayları yenile
        try IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max) {
            emit ApprovalRefreshed(sonicToken, address(metropolisRouter), type(uint256).max);
        } catch {}
    }
    
    // Likidite çifti için onayları yenile (ayrı bir fonksiyon olarak)
    function refreshPairApprovals() external onlyOwner {
        if (liquidityPair != address(0)) {
            try IERC20(sonicToken).approve(liquidityPair, type(uint256).max) {
                emit ApprovalRefreshed(sonicToken, liquidityPair, type(uint256).max);
            } catch {}
            
            try IERC20(address(this)).approve(liquidityPair, type(uint256).max) {
                emit ApprovalRefreshed(address(this), liquidityPair, type(uint256).max);
            } catch {}
        }
    }

    // Set treasury wallet (only owner)
    function setTreasuryWallet(address _treasuryWallet) external onlyOwner {
        require(_treasuryWallet != address(0), "Invalid treasury address");
        address oldTreasury = treasuryWallet;
        treasuryWallet = _treasuryWallet;
        emit TreasuryWalletUpdated(oldTreasury, _treasuryWallet);
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"holdersCount","type":"uint256"}],"name":"AirdropDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"AirdropFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ApprovalRefreshed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"LiquidityAddFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sonicAmount","type":"uint256"}],"name":"LiquidityAdded","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":"uint256","name":"farmReserve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wethReserve","type":"uint256"}],"name":"PairReservesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensForLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensForAirdrop","type":"uint256"}],"name":"ProcessStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"SwapFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wethReceived","type":"uint256"}],"name":"SwapSuccessful","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":"uint256","name":"amount","type":"uint256"}],"name":"TreasuryTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldTreasury","type":"address"},{"indexed":false,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryWalletUpdated","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"addInitialLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkAndRefreshAllowances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHolderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHolders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"getMinimumOutput","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPairReserves","outputs":[{"internalType":"uint256","name":"farmReserve","type":"uint256"},{"internalType":"uint256","name":"wethReserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingAirdropTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingLiquidityTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwapInfo","outputs":[{"internalType":"uint256","name":"contractBalance","type":"uint256"},{"internalType":"uint256","name":"routerAllowance","type":"uint256"},{"internalType":"bool","name":"pairExists","type":"bool"},{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"pendingLiq","type":"uint256"},{"internalType":"uint256","name":"pendingAirdrop","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"holders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metropolisFactory","outputs":[{"internalType":"contract IMetropolisFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metropolisRouter","outputs":[{"internalType":"contract IMetropolisRouter","name":"","type":"address"}],"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":"processLiquidityAndAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshAllApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshPairApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sonicToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"triggerProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b50336040518060400160405280600681526020017f4641524d455200000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4641524d000000000000000000000000000000000000000000000000000000008152508160039081620000909190620008d1565b508060049081620000a29190620008d1565b5050506001600581905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200011f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001169062000a19565b60405180910390fd5b6200013081620003e060201b60201c565b5060007395a7e403d7cf20f675ff9273d66e94d35ba49fa390506000731570300e9cfec66c9fb0c8bc14366c86eb170ad09050600073039e2fb66102314ce7b64ce5ce3e5183bc94ad38905060007395503a306cd81e08c0c43c49faae71165937d1759050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015620002005750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156200023a5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015620002745750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b620002b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002ad9062000a8b565b60405180910390fd5b83600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003d63069d3c21bcecceda1000000620004a660201b60201c565b5050505062000bb7565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000518576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200050f9062000afd565b60405180910390fd5b6200052c600083836200061360201b60201c565b806002600082825462000540919062000b4e565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620005f3919062000b9a565b60405180910390a36200060f600083836200063060201b60201c565b5050565b6200062b8383836200064d60201b62002b251760201c565b505050565b620006488383836200065260201b62002b2a1760201c565b505050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006d957607f821691505b602082108103620006ef57620006ee62000691565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007597fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200071a565b6200076586836200071a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620007b2620007ac620007a6846200077d565b62000787565b6200077d565b9050919050565b6000819050919050565b620007ce8362000791565b620007e6620007dd82620007b9565b84845462000727565b825550505050565b600090565b620007fd620007ee565b6200080a818484620007c3565b505050565b5b81811015620008325762000826600082620007f3565b60018101905062000810565b5050565b601f82111562000881576200084b81620006f5565b62000856846200070a565b8101602085101562000866578190505b6200087e62000875856200070a565b8301826200080f565b50505b505050565b600082821c905092915050565b6000620008a66000198460080262000886565b1980831691505092915050565b6000620008c1838362000893565b9150826002028217905092915050565b620008dc8262000657565b67ffffffffffffffff811115620008f857620008f762000662565b5b620009048254620006c0565b6200091182828562000836565b600060209050601f83116001811462000949576000841562000934578287015190505b620009408582620008b3565b865550620009b0565b601f1984166200095986620006f5565b60005b8281101562000983578489015182556001820191506020850194506020810190506200095c565b86831015620009a357848901516200099f601f89168262000893565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f31000000000000000000000000000000000000000000000000000000000000600082015250565b600062000a01600283620009b8565b915062000a0e82620009c9565b602082019050919050565b6000602082019050818103600083015262000a3481620009f2565b9050919050565b7f4631000000000000000000000000000000000000000000000000000000000000600082015250565b600062000a73600283620009b8565b915062000a808262000a3b565b602082019050919050565b6000602082019050818103600083015262000aa68162000a64565b9050919050565b7f4533000000000000000000000000000000000000000000000000000000000000600082015250565b600062000ae5600283620009b8565b915062000af28262000aad565b602082019050919050565b6000602082019050818103600083015262000b188162000ad6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b5b826200077d565b915062000b68836200077d565b925082820190508082111562000b835762000b8262000b1f565b5b92915050565b62000b94816200077d565b82525050565b600060208201905062000bb1600083018462000b89565b92915050565b615bc28062000bc76000396000f3fe6080604052600436106102085760003560e01c806362b6327a11610118578063a8602fea116100a0578063d4d7b19a1161006f578063d4d7b19a14610717578063dd62ed3e14610754578063ed9cacfe14610791578063f2fde38b146107a8578063fd7c9fab146107d15761020f565b8063a8602fea14610671578063a9059cbb1461069a578063c026d93a146106d7578063c0d78655146106ee5761020f565b8063808a5457116100e7578063808a5457146105ad5780638129fc1c146105d85780638da5cb5b146105ef57806395d89b411461061a5780639df93f6c146106455761020f565b806362b6327a1461050357806370a082311461052e5780637136982b1461056b5780637ac84fc1146105965761020f565b8063313ce5671161019b578063461a3a951161016a578063461a3a951461042e5780634626402b1461045957806357376198146104845780635d76b04c146104ad5780635fe8e7cc146104d85761020f565b8063313ce567146103b957806338945efc146103e4578063397883d2146103fb57806341a22cc2146104125761020f565b80631b26c80d116101d75780631b26c80d146102d257806323b872dd14610302578063298926cb1461033f5780632a11ced01461037c5761020f565b806306fdde031461021457806308dee2b41461023f578063095ea7b31461026a57806318160ddd146102a75761020f565b3661020f57005b600080fd5b34801561022057600080fd5b506102296107fc565b6040516102369190614469565b60405180910390f35b34801561024b57600080fd5b5061025461088e565b60405161026191906144a4565b60405180910390f35b34801561027657600080fd5b50610291600480360381019061028c919061455d565b610898565b60405161029e91906145b8565b60405180910390f35b3480156102b357600080fd5b506102bc6108b4565b6040516102c991906144a4565b60405180910390f35b3480156102de57600080fd5b506102e76108be565b6040516102f9969594939291906145e2565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190614643565b610b58565b60405161033691906145b8565b60405180910390f35b34801561034b57600080fd5b5061036660048036038101906103619190614696565b610b80565b60405161037391906144a4565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e9190614696565b610c08565b6040516103b091906146c3565b60405180910390f35b3480156103c557600080fd5b506103ce610c47565b6040516103db91906146fa565b60405180910390f35b3480156103f057600080fd5b506103f9610c50565b005b34801561040757600080fd5b50610410610f6f565b005b61042c60048036038101906104279190614696565b6110b3565b005b34801561043a57600080fd5b506104436113d0565b60405161045091906146c3565b60405180910390f35b34801561046557600080fd5b5061046e6113f6565b60405161047b91906146c3565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a6919061455d565b61141c565b005b3480156104b957600080fd5b506104c261151c565b6040516104cf91906144a4565b60405180910390f35b3480156104e457600080fd5b506104ed611526565b6040516104fa91906147d3565b60405180910390f35b34801561050f57600080fd5b506105186115b4565b6040516105259190614854565b60405180910390f35b34801561053a57600080fd5b506105556004803603810190610550919061486f565b6115da565b60405161056291906144a4565b60405180910390f35b34801561057757600080fd5b50610580611622565b60405161058d91906144a4565b60405180910390f35b3480156105a257600080fd5b506105ab61162f565b005b3480156105b957600080fd5b506105c26119a4565b6040516105cf91906146c3565b60405180910390f35b3480156105e457600080fd5b506105ed6119ca565b005b3480156105fb57600080fd5b5061060461203b565b60405161061191906146c3565b60405180910390f35b34801561062657600080fd5b5061062f612065565b60405161063c9190614469565b60405180910390f35b34801561065157600080fd5b5061065a6120f7565b60405161066892919061489c565b60405180910390f35b34801561067d57600080fd5b506106986004803603810190610693919061486f565b6122b7565b005b3480156106a657600080fd5b506106c160048036038101906106bc919061455d565b6123d3565b6040516106ce91906145b8565b60405180910390f35b3480156106e357600080fd5b506106ec6123ef565b005b3480156106fa57600080fd5b506107156004803603810190610710919061486f565b612742565b005b34801561072357600080fd5b5061073e6004803603810190610739919061486f565b6127fd565b60405161074b91906145b8565b60405180910390f35b34801561076057600080fd5b5061077b600480360381019061077691906148c5565b61281d565b60405161078891906144a4565b60405180910390f35b34801561079d57600080fd5b506107a66128a4565b005b3480156107b457600080fd5b506107cf60048036038101906107ca919061486f565b612a7c565b005b3480156107dd57600080fd5b506107e6612aff565b6040516107f39190614926565b60405180910390f35b60606003805461080b90614970565b80601f016020809104026020016040519081016040528092919081815260200182805461083790614970565b80156108845780601f1061085957610100808354040283529160200191610884565b820191906000526020600020905b81548152906001019060200180831161086757829003601f168201915b5050505050905090565b6000600e54905090565b6000803390506108a9818585612b2f565b600191505092915050565b6000600254905090565b6000806000806000803073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161090091906146c3565b602060405180830381865afa15801561091d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094191906149b6565b95503073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016109a09291906149e3565b602060405180830381865afa1580156109bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e191906149b6565b9450600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a749190614a21565b73ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610ad09291906149e3565b602060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b119190614a21565b9250600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614159350600e549150600f549050909192939495565b600080339050610b69858285612cc3565b610b74858585612d27565b60019150509392505050565b6000806000610b8d6120f7565b915091506000821480610ba05750600081145b15610bb057600092505050610c03565b60006103e585610bc09190614a7d565b905060008282610bd09190614a7d565b90506000826103e886610be39190614a7d565b610bed9190614abf565b90508082610bfb9190614b22565b955050505050505b919050565b600d8181548110610c1857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006012905090565b610c5861300e565b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f6d57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610d4d929190614b53565b6020604051808303816000875af1925050508015610d8957506040513d601f19601f82011682018060405250810190610d869190614ba8565b60015b15610e2f57507fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051610e2693929190614bd5565b60405180910390a15b3073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610eac929190614b53565b6020604051808303816000875af1925050508015610ee857506040513d601f19601f82011682018060405250810190610ee59190614ba8565b60015b15610f6c57507fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca30600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051610f6393929190614bd5565b60405180910390a15b5b565b610f7761300e565b6000600e541180610f8a57506000600f54115b610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc090614c58565b60405180910390fd5b6000600d8054905011611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100890614cc4565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561105957600080fd5b505af192505050801561106a575060015b6110b0577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f546040516110a392919061489c565b60405180910390a16110b1565b5b565b6110bb61300e565b600034116110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f590614d56565b60405180910390fd5b60008111611141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113890614de8565b60405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161117b91906146c3565b602060405180830381865afa158015611198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bc91906149b6565b10156111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f490614e7a565b60405180910390fd5b61122a30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612b2f565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71934308460008033426040518863ffffffff1660e01b815260040161129196959493929190614ed5565b60606040518083038185885af1935050505080156112cd57506040513d601f19601f820116820180604052508101906112ca9190614f36565b60015b61133a576112ff30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000612b2f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190614fd5565b60405180910390fd5b5050507f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b813460405161136e92919061489c565b60405180910390a1600047905060008111156113cc573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156113ca573d6000803e3d6000fd5b505b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61142461300e565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148990615041565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6114b661203b565b836040518363ffffffff1660e01b81526004016114d4929190614b53565b6020604051808303816000875af11580156114f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115179190614ba8565b505050565b6000600f54905090565b6060600d8054806020026020016040519081016040528092919081815260200182805480156115aa57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611560575b5050505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600d80549050905090565b600260055403611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b906150ad565b60405180910390fd5b6002600581905550601060019054906101000a900460ff16156116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390615119565b60405180910390fd5b6001601060016101000a81548160ff0219169083151502179055506000600e5490506000600f5490506000821480156117055750600081145b1561172c576000601060016101000a81548160ff021916908315150217905550505061199a565b7f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd828260405161175d92919061489c565b60405180910390a16000600e819055506000600f819055506117c230600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612b2f565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611861929190614b53565b6020604051808303816000875af1158015611880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a49190614ba8565b50600081836118b39190614abf565b905060006118c082613085565b9050600081036118ee576000601060016101000a81548160ff0219169083151502179055505050505061199a565b60008285836118fd9190614a7d565b6119079190614b22565b9050600081836119179190615139565b9050600082111561192d5761192c86836134cb565b5b600081111561197857600060646019836119479190614a7d565b6119519190614b22565b9050600081836119619190615139565b905061196c826137d1565b61197581613968565b50505b6000601060016101000a81548160ff0219169083151502179055505050505050505b6001600581905550565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6119d261300e565b601060009054906101000a900460ff1615611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a19906151b9565b60405180910390fd5b6001601060006101000a81548160ff021916908315150217905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611abc9291906149e3565b602060405180830381865afa158015611ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afd9190614a21565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c9657600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611c129291906149e3565b6020604051808303816000875af1158015611c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c559190614a21565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e90615225565b60405180910390fd5b611d7430600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612b2f565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611e13929190614b53565b6020604051808303816000875af1158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e569190614ba8565b611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90615291565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611f34929190614b53565b6020604051808303816000875af1158015611f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f779190614ba8565b503073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611ff5929190614b53565b6020604051808303816000875af1158015612014573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120389190614ba8565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461207490614970565b80601f01602080910402602001604051908101604052809291908181526020018280546120a090614970565b80156120ed5780601f106120c2576101008083540402835291602001916120ed565b820191906000526020600020905b8154815290600101906020018083116120d057829003601f168201915b5050505050905090565b600080600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561216a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218e9190615333565b50915091506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122269190614a21565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361228957826dffffffffffffffffffffffffffff16826dffffffffffffffffffffffffffff16945094505050506122b3565b816dffffffffffffffffffffffffffff16836dffffffffffffffffffffffffffff16945094505050505b9091565b6122bf61300e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361232e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612325906153d2565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb481836040516123c79291906149e3565b60405180910390a15050565b6000803390506123e4818585612d27565b600191505092915050565b6123f761300e565b60003073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016124569291906149e3565b602060405180830381865afa158015612473573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249791906149b6565b905069d3c21bcecceda10000008110156124e3576124e230600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1669d3c21bcecceda1000000612b2f565b5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161254091906146c3565b602060405180830381865afa15801561255d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061258191906149b6565b9050600081111561273e576000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161260d9291906149e3565b602060405180830381865afa15801561262a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264e91906149b6565b90508181101561273c57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016126f7929190614b53565b6020604051808303816000875af1158015612716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273a9190614ba8565b505b505b5050565b61274a61300e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b09061543e565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6128ac61300e565b6128f930600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612b2f565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612998929190614b53565b6020604051808303816000875af19250505080156129d457506040513d601f19601f820116820180604052508101906129d19190614ba8565b60015b15612a7a57507fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051612a7193929190614bd5565b60405180910390a15b565b612a8461300e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aea906154aa565b60405180910390fd5b612afc81613cbf565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612b995750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b612bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcf90615516565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612cb691906144a4565b60405180910390a3505050565b6000612ccf848461281d565b905081811015612d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0b90615582565b60405180910390fd5b612d218484848403612b2f565b50505050565b601060019054906101000a900460ff16158015612d775750612d4761203b565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612db65750612d8661203b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612dee57503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612e475750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15612fc35760006064600583612e5d9190614a7d565b612e679190614b22565b90506000811115612fc15760006064601983612e839190614a7d565b612e8d9190614b22565b905060006064601984612ea09190614a7d565b612eaa9190614b22565b905060008385612eba9190615139565b9050612ec7873086613d85565b612ed2878783613d85565b82600e6000828254612ee49190614abf565b9250508190555081600f6000828254612efd9190614abf565b9250508190555068056bc75e2d63100000600f54600e54612f1e9190614abf565b10612f7e573073ffffffffffffffffffffffffffffffffffffffff16637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f6b57600080fd5b505af1925050508015612f7c575060015b505b612f9b87678ac7230489e80000612f948a6115da565b1015613fc6565b612fb886678ac7230489e80000612fb1896115da565b1015613fc6565b50505050613009565b505b612fce838383613d85565b612feb83678ac7230489e80000612fe4866115da565b1015613fc6565b61300882678ac7230489e80000613001856115da565b1015613fc6565b5b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661302d61203b565b73ffffffffffffffffffffffffffffffffffffffff1614613083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307a906155ee565b60405180910390fd5b565b600080820361309757600090506134c6565b6130c430600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612b2f565b6000600267ffffffffffffffff8111156130e1576130e061560e565b5b60405190808252806020026020018201604052801561310f5781602001602082028036833780820191505090505b50905030816000815181106131275761312661563d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106131985761319761563d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161322f91906146c3565b602060405180830381865afa15801561324c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327091906149b6565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed1739856000853061012c426132c39190614abf565b6040518663ffffffff1660e01b81526004016132e395949392919061566c565b6000604051808303816000875af192505050801561332457506040513d6000823e3d601f19601f8201168201806040525081019061332191906157df565b60015b6133d457613330615835565b806308c379a0036133925750613344615857565b8061334f5750613394565b7f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec07238160405161337e9190614469565b60405180910390a1600093505050506134c6565b505b7f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec07236040516133c190615933565b60405180910390a16000925050506134c6565b506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161343291906146c3565b602060405180830381865afa15801561344f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061347391906149b6565b9050600082826134839190615139565b90507fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc0186826040516134b692919061489c565b60405180910390a1809450505050505b919050565b60008214806134da5750600081145b6137cd57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161355d929190614b53565b6020604051808303816000875af115801561357c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a09190614ba8565b506135ce30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612b2f565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e3370030600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685856064601e60646136429190615139565b8961364d9190614a7d565b6136579190614b22565b6064601e60646136679190615139565b896136729190614a7d565b61367c9190614b22565b3061012c4261368b9190614abf565b6040518963ffffffff1660e01b81526004016136ae989796959493929190615953565b6060604051808303816000875af19250505080156136ea57506040513d601f19601f820116820180604052508101906136e79190614f36565b60015b61378f576136f6615835565b806308c379a003613752575061370a615857565b806137155750613754565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad816040516137449190614469565b60405180910390a15061378a565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad60405161378190615933565b60405180910390a15b6137cc565b5050507f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b82826040516137c392919061489c565b60405180910390a15b5b5050565b600081148061382e5750600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61396557600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016138b1929190614b53565b6020604051808303816000875af19250505080156138ed57506040513d601f19601f820116820180604052508101906138ea9190614ba8565b60015b61392b577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161460405161391e90615a1d565b60405180910390a1613964565b507f81f40cfa7691027044b117aa50764b33eaa2223ca9f761d5ff1c316a33d65ad28160405161395b91906144a4565b60405180910390a15b5b50565b600081148061397c57506000600d80549050145b613cbc576000600d80549050826139939190614b22565b905060005b600d80549050811015613cb957600073ffffffffffffffffffffffffffffffffffffffff16600d82815481106139d1576139d061563d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015613a8a57503073ffffffffffffffffffffffffffffffffffffffff16600d8281548110613a4657613a4561563d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015613b225750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600d8281548110613ade57613add61563d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15613ca657600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600d8381548110613b7957613b7861563d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401613bc2929190614b53565b6020604051808303816000875af1925050508015613bfe57506040513d601f19601f82011682018060405250810190613bfb9190614ba8565b60015b613ca357613c0a615835565b806308c379a003613c665750613c1e615857565b80613c295750613c68565b7fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161481604051613c589190614469565b60405180910390a150613c9e565b505b7fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b11614604051613c9590615933565b60405180910390a15b613ca5565b505b5b8080613cb190615a3d565b915050613998565b50505b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613def5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e2590615ad1565b60405180910390fd5b613e398383836143b9565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eb690615b3d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613fad91906144a4565b60405180910390a3613fc08484846143c9565b50505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561405057503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156143b5578080156140ac5750600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15614171576001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506143b4565b801580156141c85750600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156143b3576000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b600d805490508110156143b1578273ffffffffffffffffffffffffffffffffffffffff16600d82815481106142605761425f61563d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361439e57600d6001600d805490506142ba9190615139565b815481106142cb576142ca61563d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d828154811061430a5761430961563d565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d80548061436457614363615b5d565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556143b1565b80806143a990615a3d565b915050614228565b505b5b5b5050565b6143c4838383612b25565b505050565b6143d4838383612b2a565b505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156144135780820151818401526020810190506143f8565b60008484015250505050565b6000601f19601f8301169050919050565b600061443b826143d9565b61444581856143e4565b93506144558185602086016143f5565b61445e8161441f565b840191505092915050565b600060208201905081810360008301526144838184614430565b905092915050565b6000819050919050565b61449e8161448b565b82525050565b60006020820190506144b96000830184614495565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006144fe826144d3565b9050919050565b61450e816144f3565b811461451957600080fd5b50565b60008135905061452b81614505565b92915050565b61453a8161448b565b811461454557600080fd5b50565b60008135905061455781614531565b92915050565b60008060408385031215614574576145736144c9565b5b60006145828582860161451c565b925050602061459385828601614548565b9150509250929050565b60008115159050919050565b6145b28161459d565b82525050565b60006020820190506145cd60008301846145a9565b92915050565b6145dc816144f3565b82525050565b600060c0820190506145f76000830189614495565b6146046020830188614495565b61461160408301876145a9565b61461e60608301866145d3565b61462b6080830185614495565b61463860a0830184614495565b979650505050505050565b60008060006060848603121561465c5761465b6144c9565b5b600061466a8682870161451c565b935050602061467b8682870161451c565b925050604061468c86828701614548565b9150509250925092565b6000602082840312156146ac576146ab6144c9565b5b60006146ba84828501614548565b91505092915050565b60006020820190506146d860008301846145d3565b92915050565b600060ff82169050919050565b6146f4816146de565b82525050565b600060208201905061470f60008301846146eb565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61474a816144f3565b82525050565b600061475c8383614741565b60208301905092915050565b6000602082019050919050565b600061478082614715565b61478a8185614720565b935061479583614731565b8060005b838110156147c65781516147ad8882614750565b97506147b883614768565b925050600181019050614799565b5085935050505092915050565b600060208201905081810360008301526147ed8184614775565b905092915050565b6000819050919050565b600061481a614815614810846144d3565b6147f5565b6144d3565b9050919050565b600061482c826147ff565b9050919050565b600061483e82614821565b9050919050565b61484e81614833565b82525050565b60006020820190506148696000830184614845565b92915050565b600060208284031215614885576148846144c9565b5b60006148938482850161451c565b91505092915050565b60006040820190506148b16000830185614495565b6148be6020830184614495565b9392505050565b600080604083850312156148dc576148db6144c9565b5b60006148ea8582860161451c565b92505060206148fb8582860161451c565b9150509250929050565b600061491082614821565b9050919050565b61492081614905565b82525050565b600060208201905061493b6000830184614917565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061498857607f821691505b60208210810361499b5761499a614941565b5b50919050565b6000815190506149b081614531565b92915050565b6000602082840312156149cc576149cb6144c9565b5b60006149da848285016149a1565b91505092915050565b60006040820190506149f860008301856145d3565b614a0560208301846145d3565b9392505050565b600081519050614a1b81614505565b92915050565b600060208284031215614a3757614a366144c9565b5b6000614a4584828501614a0c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a888261448b565b9150614a938361448b565b9250828202614aa18161448b565b91508282048414831517614ab857614ab7614a4e565b5b5092915050565b6000614aca8261448b565b9150614ad58361448b565b9250828201905080821115614aed57614aec614a4e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b2d8261448b565b9150614b388361448b565b925082614b4857614b47614af3565b5b828204905092915050565b6000604082019050614b6860008301856145d3565b614b756020830184614495565b9392505050565b614b858161459d565b8114614b9057600080fd5b50565b600081519050614ba281614b7c565b92915050565b600060208284031215614bbe57614bbd6144c9565b5b6000614bcc84828501614b93565b91505092915050565b6000606082019050614bea60008301866145d3565b614bf760208301856145d3565b614c046040830184614495565b949350505050565b7f4e6f2070656e64696e6720746f6b656e73000000000000000000000000000000600082015250565b6000614c426011836143e4565b9150614c4d82614c0c565b602082019050919050565b60006020820190508181036000830152614c7181614c35565b9050919050565b7f4e6f20686f6c6465727300000000000000000000000000000000000000000000600082015250565b6000614cae600a836143e4565b9150614cb982614c78565b602082019050919050565b60006020820190508181036000830152614cdd81614ca1565b9050919050565b7f4d7573742070726f766964652045544820666f7220696e697469616c206c697160008201527f7569646974790000000000000000000000000000000000000000000000000000602082015250565b6000614d406026836143e4565b9150614d4b82614ce4565b604082019050919050565b60006020820190508181036000830152614d6f81614d33565b9050919050565b7f4d7573742070726f7669646520746f6b656e20616d6f756e7420666f7220696e60008201527f697469616c206c69717569646974790000000000000000000000000000000000602082015250565b6000614dd2602f836143e4565b9150614ddd82614d76565b604082019050919050565b60006020820190508181036000830152614e0181614dc5565b9050919050565b7f496e73756666696369656e7420746f6b656e2062616c616e636520696e20636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b6000614e646026836143e4565b9150614e6f82614e08565b604082019050919050565b60006020820190508181036000830152614e9381614e57565b9050919050565b6000819050919050565b6000614ebf614eba614eb584614e9a565b6147f5565b61448b565b9050919050565b614ecf81614ea4565b82525050565b600060c082019050614eea60008301896145d3565b614ef76020830188614495565b614f046040830187614ec6565b614f116060830186614ec6565b614f1e60808301856145d3565b614f2b60a0830184614495565b979650505050505050565b600080600060608486031215614f4f57614f4e6144c9565b5b6000614f5d868287016149a1565b9350506020614f6e868287016149a1565b9250506040614f7f868287016149a1565b9150509250925092565b7f4661696c656420746f20616464206c6971756964697479000000000000000000600082015250565b6000614fbf6017836143e4565b9150614fca82614f89565b602082019050919050565b60006020820190508181036000830152614fee81614fb2565b9050919050565b7f43616e6e6f7420726573637565204641524d455220746f6b656e730000000000600082015250565b600061502b601b836143e4565b915061503682614ff5565b602082019050919050565b6000602082019050818103600083015261505a8161501e565b9050919050565b7f5231000000000000000000000000000000000000000000000000000000000000600082015250565b60006150976002836143e4565b91506150a282615061565b602082019050919050565b600060208201905081810360008301526150c68161508a565b9050919050565b7f416c72656164792070726f63657373696e670000000000000000000000000000600082015250565b60006151036012836143e4565b915061510e826150cd565b602082019050919050565b60006020820190508181036000830152615132816150f6565b9050919050565b60006151448261448b565b915061514f8361448b565b925082820390508181111561516757615166614a4e565b5b92915050565b7f4632000000000000000000000000000000000000000000000000000000000000600082015250565b60006151a36002836143e4565b91506151ae8261516d565b602082019050919050565b600060208201905081810360008301526151d281615196565b9050919050565b7f4633000000000000000000000000000000000000000000000000000000000000600082015250565b600061520f6002836143e4565b915061521a826151d9565b602082019050919050565b6000602082019050818103600083015261523e81615202565b9050919050565b7f4634000000000000000000000000000000000000000000000000000000000000600082015250565b600061527b6002836143e4565b915061528682615245565b602082019050919050565b600060208201905081810360008301526152aa8161526e565b9050919050565b60006dffffffffffffffffffffffffffff82169050919050565b6152d4816152b1565b81146152df57600080fd5b50565b6000815190506152f1816152cb565b92915050565b600063ffffffff82169050919050565b615310816152f7565b811461531b57600080fd5b50565b60008151905061532d81615307565b92915050565b60008060006060848603121561534c5761534b6144c9565b5b600061535a868287016152e2565b935050602061536b868287016152e2565b925050604061537c8682870161531e565b9150509250925092565b7f496e76616c696420747265617375727920616464726573730000000000000000600082015250565b60006153bc6018836143e4565b91506153c782615386565b602082019050919050565b600060208201905081810360008301526153eb816153af565b9050919050565b7f496e76616c696420726f75746572206164647265737300000000000000000000600082015250565b60006154286016836143e4565b9150615433826153f2565b602082019050919050565b600060208201905081810360008301526154578161541b565b9050919050565b7f4f31000000000000000000000000000000000000000000000000000000000000600082015250565b60006154946002836143e4565b915061549f8261545e565b602082019050919050565b600060208201905081810360008301526154c381615487565b9050919050565b7f4534000000000000000000000000000000000000000000000000000000000000600082015250565b60006155006002836143e4565b915061550b826154ca565b602082019050919050565b6000602082019050818103600083015261552f816154f3565b9050919050565b7f4535000000000000000000000000000000000000000000000000000000000000600082015250565b600061556c6002836143e4565b915061557782615536565b602082019050919050565b6000602082019050818103600083015261559b8161555f565b9050919050565b7f4f32000000000000000000000000000000000000000000000000000000000000600082015250565b60006155d86002836143e4565b91506155e3826155a2565b602082019050919050565b60006020820190508181036000830152615607816155cb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a0820190506156816000830188614495565b61568e6020830187614ec6565b81810360408301526156a08186614775565b90506156af60608301856145d3565b6156bc6080830184614495565b9695505050505050565b600080fd5b6156d48261441f565b810181811067ffffffffffffffff821117156156f3576156f261560e565b5b80604052505050565b60006157066144bf565b905061571282826156cb565b919050565b600067ffffffffffffffff8211156157325761573161560e565b5b602082029050602081019050919050565b600080fd5b600061575b61575684615717565b6156fc565b9050808382526020820190506020840283018581111561577e5761577d615743565b5b835b818110156157a7578061579388826149a1565b845260208401935050602081019050615780565b5050509392505050565b600082601f8301126157c6576157c56156c6565b5b81516157d6848260208601615748565b91505092915050565b6000602082840312156157f5576157f46144c9565b5b600082015167ffffffffffffffff811115615813576158126144ce565b5b61581f848285016157b1565b91505092915050565b60008160e01c9050919050565b600060033d11156158545760046000803e615851600051615828565b90505b90565b600060443d106158e4576158696144bf565b60043d036004823e80513d602482011167ffffffffffffffff821117156158915750506158e4565b808201805167ffffffffffffffff8111156158af57505050506158e4565b80602083010160043d0385018111156158cc5750505050506158e4565b6158db826020018501866156cb565b82955050505050505b90565b7f4861746100000000000000000000000000000000000000000000000000000000600082015250565b600061591d6004836143e4565b9150615928826158e7565b602082019050919050565b6000602082019050818103600083015261594c81615910565b9050919050565b600061010082019050615969600083018b6145d3565b615976602083018a6145d3565b6159836040830189614495565b6159906060830188614495565b61599d6080830187614495565b6159aa60a0830186614495565b6159b760c08301856145d3565b6159c460e0830184614495565b9998505050505050505050565b7f5472656173757279207472616e73666572206661696c65640000000000000000600082015250565b6000615a076018836143e4565b9150615a12826159d1565b602082019050919050565b60006020820190508181036000830152615a36816159fa565b9050919050565b6000615a488261448b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a7a57615a79614a4e565b5b600182019050919050565b7f4531000000000000000000000000000000000000000000000000000000000000600082015250565b6000615abb6002836143e4565b9150615ac682615a85565b602082019050919050565b60006020820190508181036000830152615aea81615aae565b9050919050565b7f4532000000000000000000000000000000000000000000000000000000000000600082015250565b6000615b276002836143e4565b9150615b3282615af1565b602082019050919050565b60006020820190508181036000830152615b5681615b1a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220810fc80407ec27467a626bca77fdcbbf42729e4c91a666ed516dab1fac75d7c464736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102085760003560e01c806362b6327a11610118578063a8602fea116100a0578063d4d7b19a1161006f578063d4d7b19a14610717578063dd62ed3e14610754578063ed9cacfe14610791578063f2fde38b146107a8578063fd7c9fab146107d15761020f565b8063a8602fea14610671578063a9059cbb1461069a578063c026d93a146106d7578063c0d78655146106ee5761020f565b8063808a5457116100e7578063808a5457146105ad5780638129fc1c146105d85780638da5cb5b146105ef57806395d89b411461061a5780639df93f6c146106455761020f565b806362b6327a1461050357806370a082311461052e5780637136982b1461056b5780637ac84fc1146105965761020f565b8063313ce5671161019b578063461a3a951161016a578063461a3a951461042e5780634626402b1461045957806357376198146104845780635d76b04c146104ad5780635fe8e7cc146104d85761020f565b8063313ce567146103b957806338945efc146103e4578063397883d2146103fb57806341a22cc2146104125761020f565b80631b26c80d116101d75780631b26c80d146102d257806323b872dd14610302578063298926cb1461033f5780632a11ced01461037c5761020f565b806306fdde031461021457806308dee2b41461023f578063095ea7b31461026a57806318160ddd146102a75761020f565b3661020f57005b600080fd5b34801561022057600080fd5b506102296107fc565b6040516102369190614469565b60405180910390f35b34801561024b57600080fd5b5061025461088e565b60405161026191906144a4565b60405180910390f35b34801561027657600080fd5b50610291600480360381019061028c919061455d565b610898565b60405161029e91906145b8565b60405180910390f35b3480156102b357600080fd5b506102bc6108b4565b6040516102c991906144a4565b60405180910390f35b3480156102de57600080fd5b506102e76108be565b6040516102f9969594939291906145e2565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190614643565b610b58565b60405161033691906145b8565b60405180910390f35b34801561034b57600080fd5b5061036660048036038101906103619190614696565b610b80565b60405161037391906144a4565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e9190614696565b610c08565b6040516103b091906146c3565b60405180910390f35b3480156103c557600080fd5b506103ce610c47565b6040516103db91906146fa565b60405180910390f35b3480156103f057600080fd5b506103f9610c50565b005b34801561040757600080fd5b50610410610f6f565b005b61042c60048036038101906104279190614696565b6110b3565b005b34801561043a57600080fd5b506104436113d0565b60405161045091906146c3565b60405180910390f35b34801561046557600080fd5b5061046e6113f6565b60405161047b91906146c3565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a6919061455d565b61141c565b005b3480156104b957600080fd5b506104c261151c565b6040516104cf91906144a4565b60405180910390f35b3480156104e457600080fd5b506104ed611526565b6040516104fa91906147d3565b60405180910390f35b34801561050f57600080fd5b506105186115b4565b6040516105259190614854565b60405180910390f35b34801561053a57600080fd5b506105556004803603810190610550919061486f565b6115da565b60405161056291906144a4565b60405180910390f35b34801561057757600080fd5b50610580611622565b60405161058d91906144a4565b60405180910390f35b3480156105a257600080fd5b506105ab61162f565b005b3480156105b957600080fd5b506105c26119a4565b6040516105cf91906146c3565b60405180910390f35b3480156105e457600080fd5b506105ed6119ca565b005b3480156105fb57600080fd5b5061060461203b565b60405161061191906146c3565b60405180910390f35b34801561062657600080fd5b5061062f612065565b60405161063c9190614469565b60405180910390f35b34801561065157600080fd5b5061065a6120f7565b60405161066892919061489c565b60405180910390f35b34801561067d57600080fd5b506106986004803603810190610693919061486f565b6122b7565b005b3480156106a657600080fd5b506106c160048036038101906106bc919061455d565b6123d3565b6040516106ce91906145b8565b60405180910390f35b3480156106e357600080fd5b506106ec6123ef565b005b3480156106fa57600080fd5b506107156004803603810190610710919061486f565b612742565b005b34801561072357600080fd5b5061073e6004803603810190610739919061486f565b6127fd565b60405161074b91906145b8565b60405180910390f35b34801561076057600080fd5b5061077b600480360381019061077691906148c5565b61281d565b60405161078891906144a4565b60405180910390f35b34801561079d57600080fd5b506107a66128a4565b005b3480156107b457600080fd5b506107cf60048036038101906107ca919061486f565b612a7c565b005b3480156107dd57600080fd5b506107e6612aff565b6040516107f39190614926565b60405180910390f35b60606003805461080b90614970565b80601f016020809104026020016040519081016040528092919081815260200182805461083790614970565b80156108845780601f1061085957610100808354040283529160200191610884565b820191906000526020600020905b81548152906001019060200180831161086757829003601f168201915b5050505050905090565b6000600e54905090565b6000803390506108a9818585612b2f565b600191505092915050565b6000600254905090565b6000806000806000803073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161090091906146c3565b602060405180830381865afa15801561091d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094191906149b6565b95503073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016109a09291906149e3565b602060405180830381865afa1580156109bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e191906149b6565b9450600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a749190614a21565b73ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610ad09291906149e3565b602060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b119190614a21565b9250600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614159350600e549150600f549050909192939495565b600080339050610b69858285612cc3565b610b74858585612d27565b60019150509392505050565b6000806000610b8d6120f7565b915091506000821480610ba05750600081145b15610bb057600092505050610c03565b60006103e585610bc09190614a7d565b905060008282610bd09190614a7d565b90506000826103e886610be39190614a7d565b610bed9190614abf565b90508082610bfb9190614b22565b955050505050505b919050565b600d8181548110610c1857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006012905090565b610c5861300e565b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f6d57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610d4d929190614b53565b6020604051808303816000875af1925050508015610d8957506040513d601f19601f82011682018060405250810190610d869190614ba8565b60015b15610e2f57507fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051610e2693929190614bd5565b60405180910390a15b3073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610eac929190614b53565b6020604051808303816000875af1925050508015610ee857506040513d601f19601f82011682018060405250810190610ee59190614ba8565b60015b15610f6c57507fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca30600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051610f6393929190614bd5565b60405180910390a15b5b565b610f7761300e565b6000600e541180610f8a57506000600f54115b610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc090614c58565b60405180910390fd5b6000600d8054905011611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100890614cc4565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561105957600080fd5b505af192505050801561106a575060015b6110b0577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f546040516110a392919061489c565b60405180910390a16110b1565b5b565b6110bb61300e565b600034116110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f590614d56565b60405180910390fd5b60008111611141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113890614de8565b60405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161117b91906146c3565b602060405180830381865afa158015611198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bc91906149b6565b10156111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f490614e7a565b60405180910390fd5b61122a30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612b2f565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71934308460008033426040518863ffffffff1660e01b815260040161129196959493929190614ed5565b60606040518083038185885af1935050505080156112cd57506040513d601f19601f820116820180604052508101906112ca9190614f36565b60015b61133a576112ff30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000612b2f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190614fd5565b60405180910390fd5b5050507f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b813460405161136e92919061489c565b60405180910390a1600047905060008111156113cc573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156113ca573d6000803e3d6000fd5b505b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61142461300e565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148990615041565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6114b661203b565b836040518363ffffffff1660e01b81526004016114d4929190614b53565b6020604051808303816000875af11580156114f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115179190614ba8565b505050565b6000600f54905090565b6060600d8054806020026020016040519081016040528092919081815260200182805480156115aa57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611560575b5050505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600d80549050905090565b600260055403611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b906150ad565b60405180910390fd5b6002600581905550601060019054906101000a900460ff16156116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390615119565b60405180910390fd5b6001601060016101000a81548160ff0219169083151502179055506000600e5490506000600f5490506000821480156117055750600081145b1561172c576000601060016101000a81548160ff021916908315150217905550505061199a565b7f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd828260405161175d92919061489c565b60405180910390a16000600e819055506000600f819055506117c230600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612b2f565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611861929190614b53565b6020604051808303816000875af1158015611880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a49190614ba8565b50600081836118b39190614abf565b905060006118c082613085565b9050600081036118ee576000601060016101000a81548160ff0219169083151502179055505050505061199a565b60008285836118fd9190614a7d565b6119079190614b22565b9050600081836119179190615139565b9050600082111561192d5761192c86836134cb565b5b600081111561197857600060646019836119479190614a7d565b6119519190614b22565b9050600081836119619190615139565b905061196c826137d1565b61197581613968565b50505b6000601060016101000a81548160ff0219169083151502179055505050505050505b6001600581905550565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6119d261300e565b601060009054906101000a900460ff1615611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a19906151b9565b60405180910390fd5b6001601060006101000a81548160ff021916908315150217905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611abc9291906149e3565b602060405180830381865afa158015611ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afd9190614a21565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c9657600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611c129291906149e3565b6020604051808303816000875af1158015611c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c559190614a21565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e90615225565b60405180910390fd5b611d7430600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612b2f565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611e13929190614b53565b6020604051808303816000875af1158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e569190614ba8565b611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90615291565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611f34929190614b53565b6020604051808303816000875af1158015611f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f779190614ba8565b503073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611ff5929190614b53565b6020604051808303816000875af1158015612014573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120389190614ba8565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461207490614970565b80601f01602080910402602001604051908101604052809291908181526020018280546120a090614970565b80156120ed5780601f106120c2576101008083540402835291602001916120ed565b820191906000526020600020905b8154815290600101906020018083116120d057829003601f168201915b5050505050905090565b600080600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561216a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218e9190615333565b50915091506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122269190614a21565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361228957826dffffffffffffffffffffffffffff16826dffffffffffffffffffffffffffff16945094505050506122b3565b816dffffffffffffffffffffffffffff16836dffffffffffffffffffffffffffff16945094505050505b9091565b6122bf61300e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361232e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612325906153d2565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb481836040516123c79291906149e3565b60405180910390a15050565b6000803390506123e4818585612d27565b600191505092915050565b6123f761300e565b60003073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016124569291906149e3565b602060405180830381865afa158015612473573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249791906149b6565b905069d3c21bcecceda10000008110156124e3576124e230600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1669d3c21bcecceda1000000612b2f565b5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161254091906146c3565b602060405180830381865afa15801561255d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061258191906149b6565b9050600081111561273e576000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161260d9291906149e3565b602060405180830381865afa15801561262a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264e91906149b6565b90508181101561273c57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016126f7929190614b53565b6020604051808303816000875af1158015612716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273a9190614ba8565b505b505b5050565b61274a61300e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b09061543e565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6128ac61300e565b6128f930600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612b2f565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612998929190614b53565b6020604051808303816000875af19250505080156129d457506040513d601f19601f820116820180604052508101906129d19190614ba8565b60015b15612a7a57507fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051612a7193929190614bd5565b60405180910390a15b565b612a8461300e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aea906154aa565b60405180910390fd5b612afc81613cbf565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612b995750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b612bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcf90615516565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612cb691906144a4565b60405180910390a3505050565b6000612ccf848461281d565b905081811015612d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0b90615582565b60405180910390fd5b612d218484848403612b2f565b50505050565b601060019054906101000a900460ff16158015612d775750612d4761203b565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612db65750612d8661203b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612dee57503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612e475750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15612fc35760006064600583612e5d9190614a7d565b612e679190614b22565b90506000811115612fc15760006064601983612e839190614a7d565b612e8d9190614b22565b905060006064601984612ea09190614a7d565b612eaa9190614b22565b905060008385612eba9190615139565b9050612ec7873086613d85565b612ed2878783613d85565b82600e6000828254612ee49190614abf565b9250508190555081600f6000828254612efd9190614abf565b9250508190555068056bc75e2d63100000600f54600e54612f1e9190614abf565b10612f7e573073ffffffffffffffffffffffffffffffffffffffff16637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f6b57600080fd5b505af1925050508015612f7c575060015b505b612f9b87678ac7230489e80000612f948a6115da565b1015613fc6565b612fb886678ac7230489e80000612fb1896115da565b1015613fc6565b50505050613009565b505b612fce838383613d85565b612feb83678ac7230489e80000612fe4866115da565b1015613fc6565b61300882678ac7230489e80000613001856115da565b1015613fc6565b5b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661302d61203b565b73ffffffffffffffffffffffffffffffffffffffff1614613083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307a906155ee565b60405180910390fd5b565b600080820361309757600090506134c6565b6130c430600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612b2f565b6000600267ffffffffffffffff8111156130e1576130e061560e565b5b60405190808252806020026020018201604052801561310f5781602001602082028036833780820191505090505b50905030816000815181106131275761312661563d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106131985761319761563d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161322f91906146c3565b602060405180830381865afa15801561324c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327091906149b6565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed1739856000853061012c426132c39190614abf565b6040518663ffffffff1660e01b81526004016132e395949392919061566c565b6000604051808303816000875af192505050801561332457506040513d6000823e3d601f19601f8201168201806040525081019061332191906157df565b60015b6133d457613330615835565b806308c379a0036133925750613344615857565b8061334f5750613394565b7f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec07238160405161337e9190614469565b60405180910390a1600093505050506134c6565b505b7f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec07236040516133c190615933565b60405180910390a16000925050506134c6565b506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161343291906146c3565b602060405180830381865afa15801561344f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061347391906149b6565b9050600082826134839190615139565b90507fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc0186826040516134b692919061489c565b60405180910390a1809450505050505b919050565b60008214806134da5750600081145b6137cd57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161355d929190614b53565b6020604051808303816000875af115801561357c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a09190614ba8565b506135ce30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612b2f565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e3370030600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685856064601e60646136429190615139565b8961364d9190614a7d565b6136579190614b22565b6064601e60646136679190615139565b896136729190614a7d565b61367c9190614b22565b3061012c4261368b9190614abf565b6040518963ffffffff1660e01b81526004016136ae989796959493929190615953565b6060604051808303816000875af19250505080156136ea57506040513d601f19601f820116820180604052508101906136e79190614f36565b60015b61378f576136f6615835565b806308c379a003613752575061370a615857565b806137155750613754565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad816040516137449190614469565b60405180910390a15061378a565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad60405161378190615933565b60405180910390a15b6137cc565b5050507f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b82826040516137c392919061489c565b60405180910390a15b5b5050565b600081148061382e5750600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61396557600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016138b1929190614b53565b6020604051808303816000875af19250505080156138ed57506040513d601f19601f820116820180604052508101906138ea9190614ba8565b60015b61392b577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161460405161391e90615a1d565b60405180910390a1613964565b507f81f40cfa7691027044b117aa50764b33eaa2223ca9f761d5ff1c316a33d65ad28160405161395b91906144a4565b60405180910390a15b5b50565b600081148061397c57506000600d80549050145b613cbc576000600d80549050826139939190614b22565b905060005b600d80549050811015613cb957600073ffffffffffffffffffffffffffffffffffffffff16600d82815481106139d1576139d061563d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015613a8a57503073ffffffffffffffffffffffffffffffffffffffff16600d8281548110613a4657613a4561563d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015613b225750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600d8281548110613ade57613add61563d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15613ca657600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600d8381548110613b7957613b7861563d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401613bc2929190614b53565b6020604051808303816000875af1925050508015613bfe57506040513d601f19601f82011682018060405250810190613bfb9190614ba8565b60015b613ca357613c0a615835565b806308c379a003613c665750613c1e615857565b80613c295750613c68565b7fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161481604051613c589190614469565b60405180910390a150613c9e565b505b7fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b11614604051613c9590615933565b60405180910390a15b613ca5565b505b5b8080613cb190615a3d565b915050613998565b50505b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613def5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e2590615ad1565b60405180910390fd5b613e398383836143b9565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eb690615b3d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613fad91906144a4565b60405180910390a3613fc08484846143c9565b50505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561405057503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156143b5578080156140ac5750600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15614171576001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506143b4565b801580156141c85750600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156143b3576000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b600d805490508110156143b1578273ffffffffffffffffffffffffffffffffffffffff16600d82815481106142605761425f61563d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361439e57600d6001600d805490506142ba9190615139565b815481106142cb576142ca61563d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d828154811061430a5761430961563d565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d80548061436457614363615b5d565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556143b1565b80806143a990615a3d565b915050614228565b505b5b5b5050565b6143c4838383612b25565b505050565b6143d4838383612b2a565b505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156144135780820151818401526020810190506143f8565b60008484015250505050565b6000601f19601f8301169050919050565b600061443b826143d9565b61444581856143e4565b93506144558185602086016143f5565b61445e8161441f565b840191505092915050565b600060208201905081810360008301526144838184614430565b905092915050565b6000819050919050565b61449e8161448b565b82525050565b60006020820190506144b96000830184614495565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006144fe826144d3565b9050919050565b61450e816144f3565b811461451957600080fd5b50565b60008135905061452b81614505565b92915050565b61453a8161448b565b811461454557600080fd5b50565b60008135905061455781614531565b92915050565b60008060408385031215614574576145736144c9565b5b60006145828582860161451c565b925050602061459385828601614548565b9150509250929050565b60008115159050919050565b6145b28161459d565b82525050565b60006020820190506145cd60008301846145a9565b92915050565b6145dc816144f3565b82525050565b600060c0820190506145f76000830189614495565b6146046020830188614495565b61461160408301876145a9565b61461e60608301866145d3565b61462b6080830185614495565b61463860a0830184614495565b979650505050505050565b60008060006060848603121561465c5761465b6144c9565b5b600061466a8682870161451c565b935050602061467b8682870161451c565b925050604061468c86828701614548565b9150509250925092565b6000602082840312156146ac576146ab6144c9565b5b60006146ba84828501614548565b91505092915050565b60006020820190506146d860008301846145d3565b92915050565b600060ff82169050919050565b6146f4816146de565b82525050565b600060208201905061470f60008301846146eb565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61474a816144f3565b82525050565b600061475c8383614741565b60208301905092915050565b6000602082019050919050565b600061478082614715565b61478a8185614720565b935061479583614731565b8060005b838110156147c65781516147ad8882614750565b97506147b883614768565b925050600181019050614799565b5085935050505092915050565b600060208201905081810360008301526147ed8184614775565b905092915050565b6000819050919050565b600061481a614815614810846144d3565b6147f5565b6144d3565b9050919050565b600061482c826147ff565b9050919050565b600061483e82614821565b9050919050565b61484e81614833565b82525050565b60006020820190506148696000830184614845565b92915050565b600060208284031215614885576148846144c9565b5b60006148938482850161451c565b91505092915050565b60006040820190506148b16000830185614495565b6148be6020830184614495565b9392505050565b600080604083850312156148dc576148db6144c9565b5b60006148ea8582860161451c565b92505060206148fb8582860161451c565b9150509250929050565b600061491082614821565b9050919050565b61492081614905565b82525050565b600060208201905061493b6000830184614917565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061498857607f821691505b60208210810361499b5761499a614941565b5b50919050565b6000815190506149b081614531565b92915050565b6000602082840312156149cc576149cb6144c9565b5b60006149da848285016149a1565b91505092915050565b60006040820190506149f860008301856145d3565b614a0560208301846145d3565b9392505050565b600081519050614a1b81614505565b92915050565b600060208284031215614a3757614a366144c9565b5b6000614a4584828501614a0c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a888261448b565b9150614a938361448b565b9250828202614aa18161448b565b91508282048414831517614ab857614ab7614a4e565b5b5092915050565b6000614aca8261448b565b9150614ad58361448b565b9250828201905080821115614aed57614aec614a4e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b2d8261448b565b9150614b388361448b565b925082614b4857614b47614af3565b5b828204905092915050565b6000604082019050614b6860008301856145d3565b614b756020830184614495565b9392505050565b614b858161459d565b8114614b9057600080fd5b50565b600081519050614ba281614b7c565b92915050565b600060208284031215614bbe57614bbd6144c9565b5b6000614bcc84828501614b93565b91505092915050565b6000606082019050614bea60008301866145d3565b614bf760208301856145d3565b614c046040830184614495565b949350505050565b7f4e6f2070656e64696e6720746f6b656e73000000000000000000000000000000600082015250565b6000614c426011836143e4565b9150614c4d82614c0c565b602082019050919050565b60006020820190508181036000830152614c7181614c35565b9050919050565b7f4e6f20686f6c6465727300000000000000000000000000000000000000000000600082015250565b6000614cae600a836143e4565b9150614cb982614c78565b602082019050919050565b60006020820190508181036000830152614cdd81614ca1565b9050919050565b7f4d7573742070726f766964652045544820666f7220696e697469616c206c697160008201527f7569646974790000000000000000000000000000000000000000000000000000602082015250565b6000614d406026836143e4565b9150614d4b82614ce4565b604082019050919050565b60006020820190508181036000830152614d6f81614d33565b9050919050565b7f4d7573742070726f7669646520746f6b656e20616d6f756e7420666f7220696e60008201527f697469616c206c69717569646974790000000000000000000000000000000000602082015250565b6000614dd2602f836143e4565b9150614ddd82614d76565b604082019050919050565b60006020820190508181036000830152614e0181614dc5565b9050919050565b7f496e73756666696369656e7420746f6b656e2062616c616e636520696e20636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b6000614e646026836143e4565b9150614e6f82614e08565b604082019050919050565b60006020820190508181036000830152614e9381614e57565b9050919050565b6000819050919050565b6000614ebf614eba614eb584614e9a565b6147f5565b61448b565b9050919050565b614ecf81614ea4565b82525050565b600060c082019050614eea60008301896145d3565b614ef76020830188614495565b614f046040830187614ec6565b614f116060830186614ec6565b614f1e60808301856145d3565b614f2b60a0830184614495565b979650505050505050565b600080600060608486031215614f4f57614f4e6144c9565b5b6000614f5d868287016149a1565b9350506020614f6e868287016149a1565b9250506040614f7f868287016149a1565b9150509250925092565b7f4661696c656420746f20616464206c6971756964697479000000000000000000600082015250565b6000614fbf6017836143e4565b9150614fca82614f89565b602082019050919050565b60006020820190508181036000830152614fee81614fb2565b9050919050565b7f43616e6e6f7420726573637565204641524d455220746f6b656e730000000000600082015250565b600061502b601b836143e4565b915061503682614ff5565b602082019050919050565b6000602082019050818103600083015261505a8161501e565b9050919050565b7f5231000000000000000000000000000000000000000000000000000000000000600082015250565b60006150976002836143e4565b91506150a282615061565b602082019050919050565b600060208201905081810360008301526150c68161508a565b9050919050565b7f416c72656164792070726f63657373696e670000000000000000000000000000600082015250565b60006151036012836143e4565b915061510e826150cd565b602082019050919050565b60006020820190508181036000830152615132816150f6565b9050919050565b60006151448261448b565b915061514f8361448b565b925082820390508181111561516757615166614a4e565b5b92915050565b7f4632000000000000000000000000000000000000000000000000000000000000600082015250565b60006151a36002836143e4565b91506151ae8261516d565b602082019050919050565b600060208201905081810360008301526151d281615196565b9050919050565b7f4633000000000000000000000000000000000000000000000000000000000000600082015250565b600061520f6002836143e4565b915061521a826151d9565b602082019050919050565b6000602082019050818103600083015261523e81615202565b9050919050565b7f4634000000000000000000000000000000000000000000000000000000000000600082015250565b600061527b6002836143e4565b915061528682615245565b602082019050919050565b600060208201905081810360008301526152aa8161526e565b9050919050565b60006dffffffffffffffffffffffffffff82169050919050565b6152d4816152b1565b81146152df57600080fd5b50565b6000815190506152f1816152cb565b92915050565b600063ffffffff82169050919050565b615310816152f7565b811461531b57600080fd5b50565b60008151905061532d81615307565b92915050565b60008060006060848603121561534c5761534b6144c9565b5b600061535a868287016152e2565b935050602061536b868287016152e2565b925050604061537c8682870161531e565b9150509250925092565b7f496e76616c696420747265617375727920616464726573730000000000000000600082015250565b60006153bc6018836143e4565b91506153c782615386565b602082019050919050565b600060208201905081810360008301526153eb816153af565b9050919050565b7f496e76616c696420726f75746572206164647265737300000000000000000000600082015250565b60006154286016836143e4565b9150615433826153f2565b602082019050919050565b600060208201905081810360008301526154578161541b565b9050919050565b7f4f31000000000000000000000000000000000000000000000000000000000000600082015250565b60006154946002836143e4565b915061549f8261545e565b602082019050919050565b600060208201905081810360008301526154c381615487565b9050919050565b7f4534000000000000000000000000000000000000000000000000000000000000600082015250565b60006155006002836143e4565b915061550b826154ca565b602082019050919050565b6000602082019050818103600083015261552f816154f3565b9050919050565b7f4535000000000000000000000000000000000000000000000000000000000000600082015250565b600061556c6002836143e4565b915061557782615536565b602082019050919050565b6000602082019050818103600083015261559b8161555f565b9050919050565b7f4f32000000000000000000000000000000000000000000000000000000000000600082015250565b60006155d86002836143e4565b91506155e3826155a2565b602082019050919050565b60006020820190508181036000830152615607816155cb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a0820190506156816000830188614495565b61568e6020830187614ec6565b81810360408301526156a08186614775565b90506156af60608301856145d3565b6156bc6080830184614495565b9695505050505050565b600080fd5b6156d48261441f565b810181811067ffffffffffffffff821117156156f3576156f261560e565b5b80604052505050565b60006157066144bf565b905061571282826156cb565b919050565b600067ffffffffffffffff8211156157325761573161560e565b5b602082029050602081019050919050565b600080fd5b600061575b61575684615717565b6156fc565b9050808382526020820190506020840283018581111561577e5761577d615743565b5b835b818110156157a7578061579388826149a1565b845260208401935050602081019050615780565b5050509392505050565b600082601f8301126157c6576157c56156c6565b5b81516157d6848260208601615748565b91505092915050565b6000602082840312156157f5576157f46144c9565b5b600082015167ffffffffffffffff811115615813576158126144ce565b5b61581f848285016157b1565b91505092915050565b60008160e01c9050919050565b600060033d11156158545760046000803e615851600051615828565b90505b90565b600060443d106158e4576158696144bf565b60043d036004823e80513d602482011167ffffffffffffffff821117156158915750506158e4565b808201805167ffffffffffffffff8111156158af57505050506158e4565b80602083010160043d0385018111156158cc5750505050506158e4565b6158db826020018501866156cb565b82955050505050505b90565b7f4861746100000000000000000000000000000000000000000000000000000000600082015250565b600061591d6004836143e4565b9150615928826158e7565b602082019050919050565b6000602082019050818103600083015261594c81615910565b9050919050565b600061010082019050615969600083018b6145d3565b615976602083018a6145d3565b6159836040830189614495565b6159906060830188614495565b61599d6080830187614495565b6159aa60a0830186614495565b6159b760c08301856145d3565b6159c460e0830184614495565b9998505050505050505050565b7f5472656173757279207472616e73666572206661696c65640000000000000000600082015250565b6000615a076018836143e4565b9150615a12826159d1565b602082019050919050565b60006020820190508181036000830152615a36816159fa565b9050919050565b6000615a488261448b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a7a57615a79614a4e565b5b600182019050919050565b7f4531000000000000000000000000000000000000000000000000000000000000600082015250565b6000615abb6002836143e4565b9150615ac682615a85565b602082019050919050565b60006020820190508181036000830152615aea81615aae565b9050919050565b7f4532000000000000000000000000000000000000000000000000000000000000600082015250565b6000615b276002836143e4565b9150615b3282615af1565b602082019050919050565b60006020820190508181036000830152615b5681615b1a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220810fc80407ec27467a626bca77fdcbbf42729e4c91a666ed516dab1fac75d7c464736f6c63430008110033

Deployed Bytecode Sourcemap

8333:18634:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2873:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22383:118;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3740:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3167:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23813:654;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;3938:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25003:472;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9576:24;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3075:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26049:516;;;;;;;;;;;;;:::i;:::-;;22682:401;;;;;;;;;;;;;:::i;:::-;;20848:1074;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9400:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9467:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22124:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22509:114;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20674:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9302:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3274:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20564:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15425:1857;;;;;;;;;;;;;:::i;:::-;;9432:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11276:836;;;;;;;;;;;;;:::i;:::-;;1861:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2972:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24512:427;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;26614:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3400:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23091:691;;;;;;;;;;;;;:::i;:::-;;21930:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9529:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3590:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25521:440;;;;;;;;;;;;;:::i;:::-;;2064:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9350:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2873:91;2918:13;2951:5;2944:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2873:91;:::o;22383:118::-;22443:7;22470:23;;22463:30;;22383:118;:::o;3740:190::-;3814:4;3831:13;3847:10;3831:26;;3868:32;3877:5;3884:7;3893:6;3868:8;:32::i;:::-;3918:4;3911:11;;;3740:190;;;;:::o;3167:99::-;3219:7;3246:12;;3239:19;;3167:99;:::o;23813:654::-;23869:23;23903;23937:15;23963:12;23986:18;24015:22;24089:4;24074:31;;;24114:4;24074:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24056:64;;24164:4;24149:31;;;24189:4;24204:16;;;;;;;;;;;24149:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24131:91;;24259:16;;;;;;;;;;;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24240:54;;;24303:4;24310:10;;;;;;;;;;;24240:81;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24233:88;;24361:1;24345:18;;:4;:18;;;;24332:31;;24387:23;;24374:36;;24438:21;;24421:38;;23813:654;;;;;;:::o;3938:250::-;4026:4;4043:15;4061:10;4043:28;;4082:38;4098:4;4104:7;4113:6;4082:15;:38::i;:::-;4131:27;4141:4;4147:2;4151:6;4131:9;:27::i;:::-;4176:4;4169:11;;;3938:250;;;;;:::o;25003:472::-;25068:7;25089:19;25110;25133:17;:15;:17::i;:::-;25088:62;;;;25180:1;25165:11;:16;:36;;;;25200:1;25185:11;:16;25165:36;25161:50;;;25210:1;25203:8;;;;;;25161:50;25232:23;25269:3;25258:8;:14;;;;:::i;:::-;25232:40;;25306:17;25344:11;25326:15;:29;;;;:::i;:::-;25306:49;;25366:19;25411:15;25403:4;25389:11;:18;;;;:::i;:::-;25388:38;;;;:::i;:::-;25366:60;;25456:11;25444:9;:23;;;;:::i;:::-;25437:30;;;;;;;25003:472;;;;:::o;9576:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3075:84::-;3124:5;3149:2;3142:9;;3075:84;:::o;26049:516::-;1820:13;:11;:13::i;:::-;26140:1:::1;26115:27;;:13;;;;;;;;;;;:27;;;26111:447;;26170:10;;;;;;;;;;;26163:26;;;26190:13;;;;;;;;;;;26205:17;26163:60;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26159:177:::0;::::1;;;26248:63;26266:10;;;;;;;;;;;26278:13;;;;;;;;;;;26293:17;26248:63;;;;;;;;:::i;:::-;;;;;;;;26159:177;26383:4;26368:29;;;26398:13;;;;;;;;;;;26413:17;26368:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26364:183:::0;::::1;;;26456:66;26482:4;26489:13;;;;;;;;;;;26504:17;26456:66;;;;;;;;:::i;:::-;;;;;;;;26364:183;26111:447;26049:516::o:0;22682:401::-;1820:13;:11;:13::i;:::-;22775:1:::1;22749:23;;:27;:56;;;;22804:1;22780:21;;:25;22749:56;22741:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;22863:1;22846:7;:14;;;;:18;22838:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;22894:4;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;22890:186;;23002:62;23017:23;;23042:21;;23002:62;;;;;;;:::i;:::-;;;;;;;;22890:186;;;;22682:401::o:0;20848:1074::-;1820:13;:11;:13::i;:::-;20956:1:::1;20944:9;:13;20936:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;21033:1;21019:11;:15;21011:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;21179:11;21144:4;21129:31;;;21169:4;21129:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;21107:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;21269:63;21286:4;21301:16;;;;;;;;;;;21320:11;21269:8;:63::i;:::-;21349:16;;;;;;;;;;;:32;;;21389:9;21422:4;21442:11;21468:1;21484::::0;21500:10:::1;21525:15;21349:202;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;21345:412;;21644:53;21661:4;21676:16;;;;;;;;;;;21695:1;21644:8;:53::i;:::-;21712:33;;;;;;;;;;:::i;:::-;;;;;;;;21345:412;;;;21572:38;21587:11;21600:9;21572:38;;;;;;;:::i;:::-;;;;;;;;21769:20;21792:21;21769:44;;21843:1;21828:12;:16;21824:91;;;21869:10;21861:28;;:42;21890:12;21861:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;21824:91;20925:997;20848:1074:::0;:::o;9400:25::-;;;;;;;;;;;;;:::o;9467:29::-;;;;;;;;;;;;;:::o;22124:208::-;1820:13;:11;:13::i;:::-;22235:4:::1;22217:23;;:6;:23;;::::0;22209:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22290:6;22283:23;;;22307:7;:5;:7::i;:::-;22316;22283:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22124:208:::0;;:::o;22509:114::-;22567:7;22594:21;;22587:28;;22509:114;:::o;20674:96::-;20719:16;20755:7;20748:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20674:96;:::o;9302:41::-;;;;;;;;;;;;;:::o;3274:118::-;3339:7;3366:9;:18;3376:7;3366:18;;;;;;;;;;;;;;;;3359:25;;3274:118;;;:::o;20564:98::-;20613:7;20640;:14;;;;20633:21;;20564:98;:::o;15425:1857::-;1114:1;1260:7;;:19;1252:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;1114:1;1297:7;:18;;;;15505:7:::1;;;;;;;;;;;15504:8;15496:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;15556:4;15546:7;;:14;;;;;;;;;;;;;;;;;;15581:26;15610:23;;15581:52;;15644:24;15671:21;;15644:48;;15739:1;15717:18;:23;:48;;;;;15764:1;15744:16;:21;15717:48;15713:117;;;15792:5;15782:7;;:15;;;;;;;;;;;;;;;;;;15812:7;;;;15713:117;15855:52;15870:18;15890:16;15855:52;;;;;;;:::i;:::-;;;;;;;;15988:1;15962:23;:27;;;;16024:1;16000:21;:25;;;;16076:69;16093:4;16108:16;;;;;;;;;;;16127:17;16076:8;:69::i;:::-;16163:10;;;;;;;;;;;16156:26;;;16191:16;;;;;;;;;;;16210:17;16156:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16274:25;16323:16;16302:18;:37;;;;:::i;:::-;16274:65;;16350:21;16374:31;16387:17;16374:12;:31::i;:::-;16350:55;;16447:1;16430:13;:18:::0;16426:87:::1;;16475:5;16465:7;;:15;;;;;;;;;;;;;;;;;;16495:7;;;;;;16426:87;16563:25;16628:17;16607:18;16591:13;:34;;;;:::i;:::-;:54;;;;:::i;:::-;16563:82;;16656:23;16698:17;16682:13;:33;;;;:::i;:::-;16656:59;;16790:1;16770:17;:21;16766:110;;;16808:56;16826:18;16846:17;16808;:56::i;:::-;16766:110;16946:1;16928:15;:19;16924:315;;;16964:24;17031:3;9134:2;16991:15;:37;;;;:::i;:::-;:43;;;;:::i;:::-;16964:70;;17049:23;17093:16;17075:15;:34;;;;:::i;:::-;17049:60;;17138:42;17163:16;17138:24;:42::i;:::-;17195:32;17211:15;17195;:32::i;:::-;16949:290;;16924:315;17269:5;17259:7;;:15;;;;;;;;;;;;;;;;;;15485:1797;;;;;;1326:1;1070::::0;1338:7;:22;;;;15425:1857::o;9432:28::-;;;;;;;;;;;;;:::o;11276:836::-;1820:13;:11;:13::i;:::-;11337:12:::1;;;;;;;;;;;11336:13;11328:28;;;;;;;;;;;;:::i;:::-;;;;;;;;;11382:4;11367:12;;:19;;;;;;;;;;;;;;;;;;11458:17;;;;;;;;;;;:25;;;11492:4;11499:10;;;;;;;;;;;11458:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11442:13;;:68;;;;;;;;;;;;;;;;;;11605:1;11580:27;;:13;;;;;;;;;;;:27;;::::0;11576:131:::1;;11640:17;;;;;;;;;;;:28;;;11677:4;11684:10;;;;;;;;;;;11640:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11624:13;;:71;;;;;;;;;;;;;;;;;;11576:131;11760:1;11735:27;;:13;;;;;;;;;;;:27;;::::0;11727:42:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;11782:69;11799:4;11814:16;;;;;;;;;;;11833:17;11782:8;:69::i;:::-;11887:10;;;;;;;;;;;11880:26;;;11915:16;;;;;;;;;;;11934:17;11880:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11872:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;11977:10;;;;;;;;;;;11970:26;;;11997:13;;;;;;;;;;;12012:17;11970:60;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12056:4;12041:29;;;12071:13;;;;;;;;;;;12086:17;12041:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11276:836::o:0;1861:87::-;1907:7;1934:6;;;;;;;;;;;1927:13;;1861:87;:::o;2972:95::-;3019:13;3052:7;3045:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2972:95;:::o;24512:427::-;24560:19;24581;24614:16;24632;24669:13;;;;;;;;;;;24653:42;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24613:84;;;;;24708:14;24741:13;;;;;;;;;;;24725:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24708:56;;24797:4;24779:23;;:6;:23;;;24775:101;;24835:8;24827:17;;24854:8;24846:17;;24819:45;;;;;;;;;24775:101;24902:8;24894:17;;24921:8;24913:17;;24886:45;;;;;;;24512:427;;;:::o;26614:313::-;1820:13;:11;:13::i;:::-;26731:1:::1;26704:29;;:15;:29;;::::0;26696:66:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;26773:19;26795:14;;;;;;;;;;;26773:36;;26837:15;26820:14;;:32;;;;;;;;;;;;;;;;;;26868:51;26890:11;26903:15;26868:51;;;;;;;:::i;:::-;;;;;;;;26685:242;26614:313:::0;:::o;3400:182::-;3470:4;3487:13;3503:10;3487:26;;3524:28;3534:5;3541:2;3545:6;3524:9;:28::i;:::-;3570:4;3563:11;;;3400:182;;;;:::o;23091:691::-;1820:13;:11;:13::i;:::-;23158:21:::1;23197:4;23182:31;;;23222:4;23237:16;;;;;;;;;;;23182:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23158:97;;8449:18;23270:13;:28;23266:125;;;23315:64;23332:4;23347:16;;;;;;;;;;;8449:18;23315:8;:64::i;:::-;23266:125;23403:19;23432:10;;;;;;;;;;;23425:28;;;23462:4;23425:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23403:65;;23497:1;23483:11;:15;23479:296;;;23515:21;23546:10;;;;;;;;;;;23539:28;;;23576:4;23591:16;;;;;;;;;;;23539:70;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23515:94;;23644:11;23628:13;:27;23624:140;;;23683:10;;;;;;;;;;;23676:26;;;23711:16;;;;;;;;;;;23730:17;23676:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23624:140;23500:275;23479:296;23147:635;;23091:691::o:0;21930:186::-;1820:13;:11;:13::i;:::-;22023:1:::1;22004:21;;:7;:21;;::::0;21996:56:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22100:7;22063:16;;:45;;;;;;;;;;;;;;;;;;21930:186:::0;:::o;9529:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;3590:142::-;3670:7;3697:11;:18;3709:5;3697:18;;;;;;;;;;;;;;;:27;3716:7;3697:27;;;;;;;;;;;;;;;;3690:34;;3590:142;;;;:::o;25521:440::-;1820:13;:11;:13::i;:::-;25624:69:::1;25641:4;25656:16;;;;;;;;;;;25675:17;25624:8;:69::i;:::-;25772:10;;;;;;;;;;;25765:26;;;25800:16;;;;;;;;;;;25819:17;25765:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;25761:193:::0;::::1;;;25858:75;25876:10;;;;;;;;;;;25896:16;;;;;;;;;;;25915:17;25858:75;;;;;;;;:::i;:::-;;;;;;;;25761:193;25521:440::o:0;2064:165::-;1820:13;:11;:13::i;:::-;2173:1:::1;2153:22;;:8;:22;;::::0;2145:37:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2193:28;2212:8;2193:18;:28::i;:::-;2064:165:::0;:::o;9350:43::-;;;;;;;;;;;;;:::o;5702:91::-;;;;:::o;5801:90::-;;;;:::o;5119:256::-;5238:1;5221:19;;:5;:19;;;;:44;;;;;5263:1;5244:21;;:7;:21;;;;5221:44;5213:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;5313:6;5283:11;:18;5295:5;5283:18;;;;;;;;;;;;;;;:27;5302:7;5283:27;;;;;;;;;;;;;;;:36;;;;5351:7;5335:32;;5344:5;5335:32;;;5360:6;5335:32;;;;;;:::i;:::-;;;;;;;;5119:256;;;:::o;5383:311::-;5484:24;5511:25;5521:5;5528:7;5511:9;:25::i;:::-;5484:52;;5575:6;5555:16;:26;;5547:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;5624:51;5633:5;5640:7;5668:6;5649:16;:25;5624:8;:51::i;:::-;5473:221;5383:311;;;:::o;12524:2106::-;12712:7;;;;;;;;;;;12711:8;:41;;;;;12745:7;:5;:7::i;:::-;12737:15;;:4;:15;;;;12711:41;:72;;;;;12776:7;:5;:7::i;:::-;12770:13;;:2;:13;;;;12711:72;:111;;;;;12817:4;12801:21;;:4;:21;;;;12711:111;:148;;;;;12846:13;;;;;;;;;;;12840:19;;:2;:19;;;12711:148;12693:1668;;;12916:17;12956:3;8510:1;12936:6;:17;;;;:::i;:::-;:23;;;;:::i;:::-;12916:43;;13004:1;12992:9;:13;12988:1362;;;13086:23;13140:3;8565:2;13112:9;:25;;;;:::i;:::-;:31;;;;:::i;:::-;13086:57;;13162:21;13212:3;8621:2;13186:9;:23;;;;:::i;:::-;:29;;;;:::i;:::-;13162:53;;13310:22;13344:9;13335:6;:18;;;;:::i;:::-;13310:43;;13433:47;13449:4;13463;13470:9;13433:15;:47::i;:::-;13568:41;13584:4;13590:2;13594:14;13568:15;:41::i;:::-;13724:15;13697:23;;:42;;;;;;;:::i;:::-;;;;;;;;13783:13;13758:21;;:38;;;;;;;:::i;:::-;;;;;;;;8790:12;13940:21;;13914:23;;:47;;;;:::i;:::-;:73;13910:170;;14016:4;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14012:49;13910:170;14162:57;14176:4;8683:11;14182:15;14192:4;14182:9;:15::i;:::-;:36;;14162:13;:57::i;:::-;14238:53;14252:2;8683:11;14256:13;14266:2;14256:9;:13::i;:::-;:34;;14238:13;:53::i;:::-;14328:7;;;;;;12988:1362;12871:1490;12693:1668;14409:33;14425:4;14431:2;14435:6;14409:15;:33::i;:::-;14501:57;14515:4;8683:11;14521:15;14531:4;14521:9;:15::i;:::-;:36;;14501:13;:57::i;:::-;14569:53;14583:2;8683:11;14587:13;14597:2;14587:9;:13::i;:::-;:34;;14569:13;:53::i;:::-;12524:2106;;;;:::o;1956:100::-;2031:10;2020:21;;:7;:5;:7::i;:::-;:21;;;2012:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;1956:100::o;17290:1065::-;17351:7;17391:1;17375:12;:17;17371:31;;17401:1;17394:8;;;;17371:31;17415:64;17432:4;17447:16;;;;;;;;;;;17466:12;17415:8;:64::i;:::-;17529:21;17567:1;17553:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17529:40;;17598:4;17580;17585:1;17580:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;17624:10;;;;;;;;;;;17614:4;17619:1;17614:7;;;;;;;;:::i;:::-;;;;;;;:20;;;;;;;;;;;17647:19;17676:10;;;;;;;;;;;17669:28;;;17706:4;17669:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17647:65;;17729:16;;;;;;;;;;;:41;;;17785:12;17812:1;17828:4;17855;17893:3;17875:15;:21;;;;:::i;:::-;17729:178;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;17725:623;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;18215:18;18226:6;18215:18;;;;;;:::i;:::-;;;;;;;;18255:1;18248:8;;;;;;;17725:623;;;18295:18;;;;;;:::i;:::-;;;;;;;;18335:1;18328:8;;;;;;17725:623;;17923:18;17951:10;;;;;;;;;;;17944:28;;;17981:4;17944:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17923:64;;18002:21;18039:11;18026:10;:24;;;;:::i;:::-;18002:48;;18070:43;18085:12;18099:13;18070:43;;;;;;;:::i;:::-;;;;;;;;18135:13;18128:20;;;;;;17290:1065;;;;:::o;18363:1052::-;18490:1;18468:18;:23;:49;;;;18516:1;18495:17;:22;18468:49;18534:7;18464:88;18614:10;;;;;;;;;;;18607:26;;;18642:16;;;;;;;;;;;18661:17;18607:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18732:70;18749:4;18764:16;;;;;;;;;;;18783:18;18732:8;:70::i;:::-;18819:16;;;;;;;;;;;:29;;;18871:4;18891:10;;;;;;;;;;;18916:18;18949:17;19025:3;9052:2;19003:3;:18;;;;:::i;:::-;18981;:41;;;;:::i;:::-;:47;;;;:::i;:::-;19086:3;9052:2;19064:3;:18;;;;:::i;:::-;19043:17;:40;;;;:::i;:::-;:46;;;;:::i;:::-;19112:4;19150:3;19132:15;:21;;;;:::i;:::-;18819:345;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;18815:593;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;19305:26;19324:6;19305:26;;;;;;:::i;:::-;;;;;;;;19251:92;18815:593;;;;;19370:26;;;;;;:::i;:::-;;;;;;;;18815:593;;;;;;;19185:53;19200:18;19220:17;19185:53;;;;;;;:::i;:::-;;;;;;;;18815:593;18363:1052;;;:::o;19423:364::-;19516:1;19501:11;:16;:48;;;;19547:1;19521:28;;:14;;;;;;;;;;;:28;;;19501:48;19551:7;19497:61;19589:10;;;;;;;;;;;19582:27;;;19610:14;;;;;;;;;;;19626:11;19582:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;19578:202;;19727:41;;;;;;:::i;:::-;;;;;;;;19578:202;;;;19659:29;19676:11;19659:29;;;;;;:::i;:::-;;;;;;;;19578:202;19423:364;;:::o;19795:738::-;19879:1;19864:11;:16;:39;;;;19902:1;19884:7;:14;;;;:19;19864:39;19920:7;19860:78;19950:22;19989:7;:14;;;;19975:11;:28;;;;:::i;:::-;19950:53;;20029:9;20024:502;20048:7;:14;;;;20044:1;:18;20024:502;;;20110:1;20088:24;;:7;20096:1;20088:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:24;;;;:55;;;;;20138:4;20116:27;;:7;20124:1;20116:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:27;;;;20088:55;:86;;;;;20161:13;;;;;;;;;;;20147:27;;:7;20155:1;20147:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:27;;;;20088:86;20084:431;;;20206:10;;;;;;;;;;;20199:27;;;20227:7;20235:1;20227:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20239:14;20199:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;20195:305;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;20383:21;20397:6;20383:21;;;;;;:::i;:::-;;;;;;;;20321:103;20195:305;;;;;20459:21;;;;;;:::i;:::-;;;;;;;;20195:305;;;;;;20084:431;20064:3;;;;;:::i;:::-;;;;20024:502;;;;19849:684;19795:738;;:::o;2237:191::-;2311:16;2330:6;;;;;;;;;;;2311:25;;2356:8;2347:6;;:17;;;;;;;;;;;;;;;;;;2411:8;2380:40;;2401:8;2380:40;;;;;;;;;;;;2300:128;2237:191;:::o;4196:507::-;4309:1;4293:18;;:4;:18;;;;:38;;;;;4329:1;4315:16;;:2;:16;;;;4293:38;4285:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;4349:38;4370:4;4376:2;4380:6;4349:20;:38::i;:::-;4398:19;4420:9;:15;4430:4;4420:15;;;;;;;;;;;;;;;;4398:37;;4469:6;4454:11;:21;;4446:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;4550:6;4536:11;:20;4518:9;:15;4528:4;4518:15;;;;;;;;;;;;;;;:38;;;;4588:6;4571:9;:13;4581:2;4571:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;4636:2;4621:26;;4630:4;4621:26;;;4640:6;4621:26;;;;;;:::i;:::-;;;;;;;;4658:37;4678:4;4684:2;4688:6;4658:19;:37::i;:::-;4274:429;4196:507;;;:::o;14638:779::-;14733:13;;;;;;;;;;;14722:24;;:7;:24;;;;:52;;;;;14769:4;14750:24;;:7;:24;;;;14722:52;14718:692;;;14795:14;:36;;;;;14814:8;:17;14823:7;14814:17;;;;;;;;;;;;;;;;;;;;;;;;;14813:18;14795:36;14791:608;;;14872:4;14852:8;:17;14861:7;14852:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;14895:7;14908;14895:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14791:608;;;14943:14;14942:15;:36;;;;;14961:8;:17;14970:7;14961:17;;;;;;;;;;;;;;;;;;;;;;;;;14942:36;14938:461;;;15019:5;14999:8;:17;15008:7;14999:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;15112:9;15107:277;15131:7;:14;;;;15127:1;:18;15107:277;;;15193:7;15179:21;;:7;15187:1;15179:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:21;;;15175:190;;15242:7;15267:1;15250:7;:14;;;;:18;;;;:::i;:::-;15242:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15229:7;15237:1;15229:10;;;;;;;;:::i;:::-;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;15296:7;:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;15336:5;;15175:190;15147:3;;;;;:::i;:::-;;;;15107:277;;;;14938:461;14791:608;14718:692;14638:779;;:::o;12120:195::-;12263:44;12290:4;12296:2;12300:6;12263:26;:44::i;:::-;12120:195;;;:::o;12323:193::-;12465:43;12491:4;12497:2;12501:6;12465:25;:43::i;:::-;12323:193;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:77::-;1386:7;1415:5;1404:16;;1349:77;;;:::o;1432:118::-;1519:24;1537:5;1519:24;:::i;:::-;1514:3;1507:37;1432:118;;:::o;1556:222::-;1649:4;1687:2;1676:9;1672:18;1664:26;;1700:71;1768:1;1757:9;1753:17;1744:6;1700:71;:::i;:::-;1556:222;;;;:::o;1784:75::-;1817:6;1850:2;1844:9;1834:19;;1784:75;:::o;1865:117::-;1974:1;1971;1964:12;1988:117;2097:1;2094;2087:12;2111:126;2148:7;2188:42;2181:5;2177:54;2166:65;;2111:126;;;:::o;2243:96::-;2280:7;2309:24;2327:5;2309:24;:::i;:::-;2298:35;;2243:96;;;:::o;2345:122::-;2418:24;2436:5;2418:24;:::i;:::-;2411:5;2408:35;2398:63;;2457:1;2454;2447:12;2398:63;2345:122;:::o;2473:139::-;2519:5;2557:6;2544:20;2535:29;;2573:33;2600:5;2573:33;:::i;:::-;2473:139;;;;:::o;2618:122::-;2691:24;2709:5;2691:24;:::i;:::-;2684:5;2681:35;2671:63;;2730:1;2727;2720:12;2671:63;2618:122;:::o;2746:139::-;2792:5;2830:6;2817:20;2808:29;;2846:33;2873:5;2846:33;:::i;:::-;2746:139;;;;:::o;2891:474::-;2959:6;2967;3016:2;3004:9;2995:7;2991:23;2987:32;2984:119;;;3022:79;;:::i;:::-;2984:119;3142:1;3167:53;3212:7;3203:6;3192:9;3188:22;3167:53;:::i;:::-;3157:63;;3113:117;3269:2;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3240:118;2891:474;;;;;:::o;3371:90::-;3405:7;3448:5;3441:13;3434:21;3423:32;;3371:90;;;:::o;3467:109::-;3548:21;3563:5;3548:21;:::i;:::-;3543:3;3536:34;3467:109;;:::o;3582:210::-;3669:4;3707:2;3696:9;3692:18;3684:26;;3720:65;3782:1;3771:9;3767:17;3758:6;3720:65;:::i;:::-;3582:210;;;;:::o;3798:118::-;3885:24;3903:5;3885:24;:::i;:::-;3880:3;3873:37;3798:118;;:::o;3922:763::-;4149:4;4187:3;4176:9;4172:19;4164:27;;4201:71;4269:1;4258:9;4254:17;4245:6;4201:71;:::i;:::-;4282:72;4350:2;4339:9;4335:18;4326:6;4282:72;:::i;:::-;4364:66;4426:2;4415:9;4411:18;4402:6;4364:66;:::i;:::-;4440:72;4508:2;4497:9;4493:18;4484:6;4440:72;:::i;:::-;4522:73;4590:3;4579:9;4575:19;4566:6;4522:73;:::i;:::-;4605;4673:3;4662:9;4658:19;4649:6;4605:73;:::i;:::-;3922:763;;;;;;;;;:::o;4691:619::-;4768:6;4776;4784;4833:2;4821:9;4812:7;4808:23;4804:32;4801:119;;;4839:79;;:::i;:::-;4801:119;4959:1;4984:53;5029:7;5020:6;5009:9;5005:22;4984:53;:::i;:::-;4974:63;;4930:117;5086:2;5112:53;5157:7;5148:6;5137:9;5133:22;5112:53;:::i;:::-;5102:63;;5057:118;5214:2;5240:53;5285:7;5276:6;5265:9;5261:22;5240:53;:::i;:::-;5230:63;;5185:118;4691:619;;;;;:::o;5316:329::-;5375:6;5424:2;5412:9;5403:7;5399:23;5395:32;5392:119;;;5430:79;;:::i;:::-;5392:119;5550:1;5575:53;5620:7;5611:6;5600:9;5596:22;5575:53;:::i;:::-;5565:63;;5521:117;5316:329;;;;:::o;5651:222::-;5744:4;5782:2;5771:9;5767:18;5759:26;;5795:71;5863:1;5852:9;5848:17;5839:6;5795:71;:::i;:::-;5651:222;;;;:::o;5879:86::-;5914:7;5954:4;5947:5;5943:16;5932:27;;5879:86;;;:::o;5971:112::-;6054:22;6070:5;6054:22;:::i;:::-;6049:3;6042:35;5971:112;;:::o;6089:214::-;6178:4;6216:2;6205:9;6201:18;6193:26;;6229:67;6293:1;6282:9;6278:17;6269:6;6229:67;:::i;:::-;6089:214;;;;:::o;6309:114::-;6376:6;6410:5;6404:12;6394:22;;6309:114;;;:::o;6429:184::-;6528:11;6562:6;6557:3;6550:19;6602:4;6597:3;6593:14;6578:29;;6429:184;;;;:::o;6619:132::-;6686:4;6709:3;6701:11;;6739:4;6734:3;6730:14;6722:22;;6619:132;;;:::o;6757:108::-;6834:24;6852:5;6834:24;:::i;:::-;6829:3;6822:37;6757:108;;:::o;6871:179::-;6940:10;6961:46;7003:3;6995:6;6961:46;:::i;:::-;7039:4;7034:3;7030:14;7016:28;;6871:179;;;;:::o;7056:113::-;7126:4;7158;7153:3;7149:14;7141:22;;7056:113;;;:::o;7205:732::-;7324:3;7353:54;7401:5;7353:54;:::i;:::-;7423:86;7502:6;7497:3;7423:86;:::i;:::-;7416:93;;7533:56;7583:5;7533:56;:::i;:::-;7612:7;7643:1;7628:284;7653:6;7650:1;7647:13;7628:284;;;7729:6;7723:13;7756:63;7815:3;7800:13;7756:63;:::i;:::-;7749:70;;7842:60;7895:6;7842:60;:::i;:::-;7832:70;;7688:224;7675:1;7672;7668:9;7663:14;;7628:284;;;7632:14;7928:3;7921:10;;7329:608;;;7205:732;;;;:::o;7943:373::-;8086:4;8124:2;8113:9;8109:18;8101:26;;8173:9;8167:4;8163:20;8159:1;8148:9;8144:17;8137:47;8201:108;8304:4;8295:6;8201:108;:::i;:::-;8193:116;;7943:373;;;;:::o;8322:60::-;8350:3;8371:5;8364:12;;8322:60;;;:::o;8388:142::-;8438:9;8471:53;8489:34;8498:24;8516:5;8498:24;:::i;:::-;8489:34;:::i;:::-;8471:53;:::i;:::-;8458:66;;8388:142;;;:::o;8536:126::-;8586:9;8619:37;8650:5;8619:37;:::i;:::-;8606:50;;8536:126;;;:::o;8668:151::-;8743:9;8776:37;8807:5;8776:37;:::i;:::-;8763:50;;8668:151;;;:::o;8825:181::-;8937:62;8993:5;8937:62;:::i;:::-;8932:3;8925:75;8825:181;;:::o;9012:272::-;9130:4;9168:2;9157:9;9153:18;9145:26;;9181:96;9274:1;9263:9;9259:17;9250:6;9181:96;:::i;:::-;9012:272;;;;:::o;9290:329::-;9349:6;9398:2;9386:9;9377:7;9373:23;9369:32;9366:119;;;9404:79;;:::i;:::-;9366:119;9524:1;9549:53;9594:7;9585:6;9574:9;9570:22;9549:53;:::i;:::-;9539:63;;9495:117;9290:329;;;;:::o;9625:332::-;9746:4;9784:2;9773:9;9769:18;9761:26;;9797:71;9865:1;9854:9;9850:17;9841:6;9797:71;:::i;:::-;9878:72;9946:2;9935:9;9931:18;9922:6;9878:72;:::i;:::-;9625:332;;;;;:::o;9963:474::-;10031:6;10039;10088:2;10076:9;10067:7;10063:23;10059:32;10056:119;;;10094:79;;:::i;:::-;10056:119;10214:1;10239:53;10284:7;10275:6;10264:9;10260:22;10239:53;:::i;:::-;10229:63;;10185:117;10341:2;10367:53;10412:7;10403:6;10392:9;10388:22;10367:53;:::i;:::-;10357:63;;10312:118;9963:474;;;;;:::o;10443:152::-;10519:9;10552:37;10583:5;10552:37;:::i;:::-;10539:50;;10443:152;;;:::o;10601:183::-;10714:63;10771:5;10714:63;:::i;:::-;10709:3;10702:76;10601:183;;:::o;10790:274::-;10909:4;10947:2;10936:9;10932:18;10924:26;;10960:97;11054:1;11043:9;11039:17;11030:6;10960:97;:::i;:::-;10790:274;;;;:::o;11070:180::-;11118:77;11115:1;11108:88;11215:4;11212:1;11205:15;11239:4;11236:1;11229:15;11256:320;11300:6;11337:1;11331:4;11327:12;11317:22;;11384:1;11378:4;11374:12;11405:18;11395:81;;11461:4;11453:6;11449:17;11439:27;;11395:81;11523:2;11515:6;11512:14;11492:18;11489:38;11486:84;;11542:18;;:::i;:::-;11486:84;11307:269;11256:320;;;:::o;11582:143::-;11639:5;11670:6;11664:13;11655:22;;11686:33;11713:5;11686:33;:::i;:::-;11582:143;;;;:::o;11731:351::-;11801:6;11850:2;11838:9;11829:7;11825:23;11821:32;11818:119;;;11856:79;;:::i;:::-;11818:119;11976:1;12001:64;12057:7;12048:6;12037:9;12033:22;12001:64;:::i;:::-;11991:74;;11947:128;11731:351;;;;:::o;12088:332::-;12209:4;12247:2;12236:9;12232:18;12224:26;;12260:71;12328:1;12317:9;12313:17;12304:6;12260:71;:::i;:::-;12341:72;12409:2;12398:9;12394:18;12385:6;12341:72;:::i;:::-;12088:332;;;;;:::o;12426:143::-;12483:5;12514:6;12508:13;12499:22;;12530:33;12557:5;12530:33;:::i;:::-;12426:143;;;;:::o;12575:351::-;12645:6;12694:2;12682:9;12673:7;12669:23;12665:32;12662:119;;;12700:79;;:::i;:::-;12662:119;12820:1;12845:64;12901:7;12892:6;12881:9;12877:22;12845:64;:::i;:::-;12835:74;;12791:128;12575:351;;;;:::o;12932:180::-;12980:77;12977:1;12970:88;13077:4;13074:1;13067:15;13101:4;13098:1;13091:15;13118:410;13158:7;13181:20;13199:1;13181:20;:::i;:::-;13176:25;;13215:20;13233:1;13215:20;:::i;:::-;13210:25;;13270:1;13267;13263:9;13292:30;13310:11;13292:30;:::i;:::-;13281:41;;13471:1;13462:7;13458:15;13455:1;13452:22;13432:1;13425:9;13405:83;13382:139;;13501:18;;:::i;:::-;13382:139;13166:362;13118:410;;;;:::o;13534:191::-;13574:3;13593:20;13611:1;13593:20;:::i;:::-;13588:25;;13627:20;13645:1;13627:20;:::i;:::-;13622:25;;13670:1;13667;13663:9;13656:16;;13691:3;13688:1;13685:10;13682:36;;;13698:18;;:::i;:::-;13682:36;13534:191;;;;:::o;13731:180::-;13779:77;13776:1;13769:88;13876:4;13873:1;13866:15;13900:4;13897:1;13890:15;13917:185;13957:1;13974:20;13992:1;13974:20;:::i;:::-;13969:25;;14008:20;14026:1;14008:20;:::i;:::-;14003:25;;14047:1;14037:35;;14052:18;;:::i;:::-;14037:35;14094:1;14091;14087:9;14082:14;;13917:185;;;;:::o;14108:332::-;14229:4;14267:2;14256:9;14252:18;14244:26;;14280:71;14348:1;14337:9;14333:17;14324:6;14280:71;:::i;:::-;14361:72;14429:2;14418:9;14414:18;14405:6;14361:72;:::i;:::-;14108:332;;;;;:::o;14446:116::-;14516:21;14531:5;14516:21;:::i;:::-;14509:5;14506:32;14496:60;;14552:1;14549;14542:12;14496:60;14446:116;:::o;14568:137::-;14622:5;14653:6;14647:13;14638:22;;14669:30;14693:5;14669:30;:::i;:::-;14568:137;;;;:::o;14711:345::-;14778:6;14827:2;14815:9;14806:7;14802:23;14798:32;14795:119;;;14833:79;;:::i;:::-;14795:119;14953:1;14978:61;15031:7;15022:6;15011:9;15007:22;14978:61;:::i;:::-;14968:71;;14924:125;14711:345;;;;:::o;15062:442::-;15211:4;15249:2;15238:9;15234:18;15226:26;;15262:71;15330:1;15319:9;15315:17;15306:6;15262:71;:::i;:::-;15343:72;15411:2;15400:9;15396:18;15387:6;15343:72;:::i;:::-;15425;15493:2;15482:9;15478:18;15469:6;15425:72;:::i;:::-;15062:442;;;;;;:::o;15510:167::-;15650:19;15646:1;15638:6;15634:14;15627:43;15510:167;:::o;15683:366::-;15825:3;15846:67;15910:2;15905:3;15846:67;:::i;:::-;15839:74;;15922:93;16011:3;15922:93;:::i;:::-;16040:2;16035:3;16031:12;16024:19;;15683:366;;;:::o;16055:419::-;16221:4;16259:2;16248:9;16244:18;16236:26;;16308:9;16302:4;16298:20;16294:1;16283:9;16279:17;16272:47;16336:131;16462:4;16336:131;:::i;:::-;16328:139;;16055:419;;;:::o;16480:160::-;16620:12;16616:1;16608:6;16604:14;16597:36;16480:160;:::o;16646:366::-;16788:3;16809:67;16873:2;16868:3;16809:67;:::i;:::-;16802:74;;16885:93;16974:3;16885:93;:::i;:::-;17003:2;16998:3;16994:12;16987:19;;16646:366;;;:::o;17018:419::-;17184:4;17222:2;17211:9;17207:18;17199:26;;17271:9;17265:4;17261:20;17257:1;17246:9;17242:17;17235:47;17299:131;17425:4;17299:131;:::i;:::-;17291:139;;17018:419;;;:::o;17443:225::-;17583:34;17579:1;17571:6;17567:14;17560:58;17652:8;17647:2;17639:6;17635:15;17628:33;17443:225;:::o;17674:366::-;17816:3;17837:67;17901:2;17896:3;17837:67;:::i;:::-;17830:74;;17913:93;18002:3;17913:93;:::i;:::-;18031:2;18026:3;18022:12;18015:19;;17674:366;;;:::o;18046:419::-;18212:4;18250:2;18239:9;18235:18;18227:26;;18299:9;18293:4;18289:20;18285:1;18274:9;18270:17;18263:47;18327:131;18453:4;18327:131;:::i;:::-;18319:139;;18046:419;;;:::o;18471:234::-;18611:34;18607:1;18599:6;18595:14;18588:58;18680:17;18675:2;18667:6;18663:15;18656:42;18471:234;:::o;18711:366::-;18853:3;18874:67;18938:2;18933:3;18874:67;:::i;:::-;18867:74;;18950:93;19039:3;18950:93;:::i;:::-;19068:2;19063:3;19059:12;19052:19;;18711:366;;;:::o;19083:419::-;19249:4;19287:2;19276:9;19272:18;19264:26;;19336:9;19330:4;19326:20;19322:1;19311:9;19307:17;19300:47;19364:131;19490:4;19364:131;:::i;:::-;19356:139;;19083:419;;;:::o;19508:225::-;19648:34;19644:1;19636:6;19632:14;19625:58;19717:8;19712:2;19704:6;19700:15;19693:33;19508:225;:::o;19739:366::-;19881:3;19902:67;19966:2;19961:3;19902:67;:::i;:::-;19895:74;;19978:93;20067:3;19978:93;:::i;:::-;20096:2;20091:3;20087:12;20080:19;;19739:366;;;:::o;20111:419::-;20277:4;20315:2;20304:9;20300:18;20292:26;;20364:9;20358:4;20354:20;20350:1;20339:9;20335:17;20328:47;20392:131;20518:4;20392:131;:::i;:::-;20384:139;;20111:419;;;:::o;20536:85::-;20581:7;20610:5;20599:16;;20536:85;;;:::o;20627:158::-;20685:9;20718:61;20736:42;20745:32;20771:5;20745:32;:::i;:::-;20736:42;:::i;:::-;20718:61;:::i;:::-;20705:74;;20627:158;;;:::o;20791:147::-;20886:45;20925:5;20886:45;:::i;:::-;20881:3;20874:58;20791:147;;:::o;20944:807::-;21193:4;21231:3;21220:9;21216:19;21208:27;;21245:71;21313:1;21302:9;21298:17;21289:6;21245:71;:::i;:::-;21326:72;21394:2;21383:9;21379:18;21370:6;21326:72;:::i;:::-;21408:80;21484:2;21473:9;21469:18;21460:6;21408:80;:::i;:::-;21498;21574:2;21563:9;21559:18;21550:6;21498:80;:::i;:::-;21588:73;21656:3;21645:9;21641:19;21632:6;21588:73;:::i;:::-;21671;21739:3;21728:9;21724:19;21715:6;21671:73;:::i;:::-;20944:807;;;;;;;;;:::o;21757:663::-;21845:6;21853;21861;21910:2;21898:9;21889:7;21885:23;21881:32;21878:119;;;21916:79;;:::i;:::-;21878:119;22036:1;22061:64;22117:7;22108:6;22097:9;22093:22;22061:64;:::i;:::-;22051:74;;22007:128;22174:2;22200:64;22256:7;22247:6;22236:9;22232:22;22200:64;:::i;:::-;22190:74;;22145:129;22313:2;22339:64;22395:7;22386:6;22375:9;22371:22;22339:64;:::i;:::-;22329:74;;22284:129;21757:663;;;;;:::o;22426:173::-;22566:25;22562:1;22554:6;22550:14;22543:49;22426:173;:::o;22605:366::-;22747:3;22768:67;22832:2;22827:3;22768:67;:::i;:::-;22761:74;;22844:93;22933:3;22844:93;:::i;:::-;22962:2;22957:3;22953:12;22946:19;;22605:366;;;:::o;22977:419::-;23143:4;23181:2;23170:9;23166:18;23158:26;;23230:9;23224:4;23220:20;23216:1;23205:9;23201:17;23194:47;23258:131;23384:4;23258:131;:::i;:::-;23250:139;;22977:419;;;:::o;23402:177::-;23542:29;23538:1;23530:6;23526:14;23519:53;23402:177;:::o;23585:366::-;23727:3;23748:67;23812:2;23807:3;23748:67;:::i;:::-;23741:74;;23824:93;23913:3;23824:93;:::i;:::-;23942:2;23937:3;23933:12;23926:19;;23585:366;;;:::o;23957:419::-;24123:4;24161:2;24150:9;24146:18;24138:26;;24210:9;24204:4;24200:20;24196:1;24185:9;24181:17;24174:47;24238:131;24364:4;24238:131;:::i;:::-;24230:139;;23957:419;;;:::o;24382:152::-;24522:4;24518:1;24510:6;24506:14;24499:28;24382:152;:::o;24540:365::-;24682:3;24703:66;24767:1;24762:3;24703:66;:::i;:::-;24696:73;;24778:93;24867:3;24778:93;:::i;:::-;24896:2;24891:3;24887:12;24880:19;;24540:365;;;:::o;24911:419::-;25077:4;25115:2;25104:9;25100:18;25092:26;;25164:9;25158:4;25154:20;25150:1;25139:9;25135:17;25128:47;25192:131;25318:4;25192:131;:::i;:::-;25184:139;;24911:419;;;:::o;25336:168::-;25476:20;25472:1;25464:6;25460:14;25453:44;25336:168;:::o;25510:366::-;25652:3;25673:67;25737:2;25732:3;25673:67;:::i;:::-;25666:74;;25749:93;25838:3;25749:93;:::i;:::-;25867:2;25862:3;25858:12;25851:19;;25510:366;;;:::o;25882:419::-;26048:4;26086:2;26075:9;26071:18;26063:26;;26135:9;26129:4;26125:20;26121:1;26110:9;26106:17;26099:47;26163:131;26289:4;26163:131;:::i;:::-;26155:139;;25882:419;;;:::o;26307:194::-;26347:4;26367:20;26385:1;26367:20;:::i;:::-;26362:25;;26401:20;26419:1;26401:20;:::i;:::-;26396:25;;26445:1;26442;26438:9;26430:17;;26469:1;26463:4;26460:11;26457:37;;;26474:18;;:::i;:::-;26457:37;26307:194;;;;:::o;26507:152::-;26647:4;26643:1;26635:6;26631:14;26624:28;26507:152;:::o;26665:365::-;26807:3;26828:66;26892:1;26887:3;26828:66;:::i;:::-;26821:73;;26903:93;26992:3;26903:93;:::i;:::-;27021:2;27016:3;27012:12;27005:19;;26665:365;;;:::o;27036:419::-;27202:4;27240:2;27229:9;27225:18;27217:26;;27289:9;27283:4;27279:20;27275:1;27264:9;27260:17;27253:47;27317:131;27443:4;27317:131;:::i;:::-;27309:139;;27036:419;;;:::o;27461:152::-;27601:4;27597:1;27589:6;27585:14;27578:28;27461:152;:::o;27619:365::-;27761:3;27782:66;27846:1;27841:3;27782:66;:::i;:::-;27775:73;;27857:93;27946:3;27857:93;:::i;:::-;27975:2;27970:3;27966:12;27959:19;;27619:365;;;:::o;27990:419::-;28156:4;28194:2;28183:9;28179:18;28171:26;;28243:9;28237:4;28233:20;28229:1;28218:9;28214:17;28207:47;28271:131;28397:4;28271:131;:::i;:::-;28263:139;;27990:419;;;:::o;28415:152::-;28555:4;28551:1;28543:6;28539:14;28532:28;28415:152;:::o;28573:365::-;28715:3;28736:66;28800:1;28795:3;28736:66;:::i;:::-;28729:73;;28811:93;28900:3;28811:93;:::i;:::-;28929:2;28924:3;28920:12;28913:19;;28573:365;;;:::o;28944:419::-;29110:4;29148:2;29137:9;29133:18;29125:26;;29197:9;29191:4;29187:20;29183:1;29172:9;29168:17;29161:47;29225:131;29351:4;29225:131;:::i;:::-;29217:139;;28944:419;;;:::o;29369:114::-;29406:7;29446:30;29439:5;29435:42;29424:53;;29369:114;;;:::o;29489:122::-;29562:24;29580:5;29562:24;:::i;:::-;29555:5;29552:35;29542:63;;29601:1;29598;29591:12;29542:63;29489:122;:::o;29617:143::-;29674:5;29705:6;29699:13;29690:22;;29721:33;29748:5;29721:33;:::i;:::-;29617:143;;;;:::o;29766:93::-;29802:7;29842:10;29835:5;29831:22;29820:33;;29766:93;;;:::o;29865:120::-;29937:23;29954:5;29937:23;:::i;:::-;29930:5;29927:34;29917:62;;29975:1;29972;29965:12;29917:62;29865:120;:::o;29991:141::-;30047:5;30078:6;30072:13;30063:22;;30094:32;30120:5;30094:32;:::i;:::-;29991:141;;;;:::o;30138:661::-;30225:6;30233;30241;30290:2;30278:9;30269:7;30265:23;30261:32;30258:119;;;30296:79;;:::i;:::-;30258:119;30416:1;30441:64;30497:7;30488:6;30477:9;30473:22;30441:64;:::i;:::-;30431:74;;30387:128;30554:2;30580:64;30636:7;30627:6;30616:9;30612:22;30580:64;:::i;:::-;30570:74;;30525:129;30693:2;30719:63;30774:7;30765:6;30754:9;30750:22;30719:63;:::i;:::-;30709:73;;30664:128;30138:661;;;;;:::o;30805:174::-;30945:26;30941:1;30933:6;30929:14;30922:50;30805:174;:::o;30985:366::-;31127:3;31148:67;31212:2;31207:3;31148:67;:::i;:::-;31141:74;;31224:93;31313:3;31224:93;:::i;:::-;31342:2;31337:3;31333:12;31326:19;;30985:366;;;:::o;31357:419::-;31523:4;31561:2;31550:9;31546:18;31538:26;;31610:9;31604:4;31600:20;31596:1;31585:9;31581:17;31574:47;31638:131;31764:4;31638:131;:::i;:::-;31630:139;;31357:419;;;:::o;31782:172::-;31922:24;31918:1;31910:6;31906:14;31899:48;31782:172;:::o;31960:366::-;32102:3;32123:67;32187:2;32182:3;32123:67;:::i;:::-;32116:74;;32199:93;32288:3;32199:93;:::i;:::-;32317:2;32312:3;32308:12;32301:19;;31960:366;;;:::o;32332:419::-;32498:4;32536:2;32525:9;32521:18;32513:26;;32585:9;32579:4;32575:20;32571:1;32560:9;32556:17;32549:47;32613:131;32739:4;32613:131;:::i;:::-;32605:139;;32332:419;;;:::o;32757:152::-;32897:4;32893:1;32885:6;32881:14;32874:28;32757:152;:::o;32915:365::-;33057:3;33078:66;33142:1;33137:3;33078:66;:::i;:::-;33071:73;;33153:93;33242:3;33153:93;:::i;:::-;33271:2;33266:3;33262:12;33255:19;;32915:365;;;:::o;33286:419::-;33452:4;33490:2;33479:9;33475:18;33467:26;;33539:9;33533:4;33529:20;33525:1;33514:9;33510:17;33503:47;33567:131;33693:4;33567:131;:::i;:::-;33559:139;;33286:419;;;:::o;33711:152::-;33851:4;33847:1;33839:6;33835:14;33828:28;33711:152;:::o;33869:365::-;34011:3;34032:66;34096:1;34091:3;34032:66;:::i;:::-;34025:73;;34107:93;34196:3;34107:93;:::i;:::-;34225:2;34220:3;34216:12;34209:19;;33869:365;;;:::o;34240:419::-;34406:4;34444:2;34433:9;34429:18;34421:26;;34493:9;34487:4;34483:20;34479:1;34468:9;34464:17;34457:47;34521:131;34647:4;34521:131;:::i;:::-;34513:139;;34240:419;;;:::o;34665:152::-;34805:4;34801:1;34793:6;34789:14;34782:28;34665:152;:::o;34823:365::-;34965:3;34986:66;35050:1;35045:3;34986:66;:::i;:::-;34979:73;;35061:93;35150:3;35061:93;:::i;:::-;35179:2;35174:3;35170:12;35163:19;;34823:365;;;:::o;35194:419::-;35360:4;35398:2;35387:9;35383:18;35375:26;;35447:9;35441:4;35437:20;35433:1;35422:9;35418:17;35411:47;35475:131;35601:4;35475:131;:::i;:::-;35467:139;;35194:419;;;:::o;35619:152::-;35759:4;35755:1;35747:6;35743:14;35736:28;35619:152;:::o;35777:365::-;35919:3;35940:66;36004:1;35999:3;35940:66;:::i;:::-;35933:73;;36015:93;36104:3;36015:93;:::i;:::-;36133:2;36128:3;36124:12;36117:19;;35777:365;;;:::o;36148:419::-;36314:4;36352:2;36341:9;36337:18;36329:26;;36401:9;36395:4;36391:20;36387:1;36376:9;36372:17;36365:47;36429:131;36555:4;36429:131;:::i;:::-;36421:139;;36148:419;;;:::o;36573:180::-;36621:77;36618:1;36611:88;36718:4;36715:1;36708:15;36742:4;36739:1;36732:15;36759:180;36807:77;36804:1;36797:88;36904:4;36901:1;36894:15;36928:4;36925:1;36918:15;36945:831;37208:4;37246:3;37235:9;37231:19;37223:27;;37260:71;37328:1;37317:9;37313:17;37304:6;37260:71;:::i;:::-;37341:80;37417:2;37406:9;37402:18;37393:6;37341:80;:::i;:::-;37468:9;37462:4;37458:20;37453:2;37442:9;37438:18;37431:48;37496:108;37599:4;37590:6;37496:108;:::i;:::-;37488:116;;37614:72;37682:2;37671:9;37667:18;37658:6;37614:72;:::i;:::-;37696:73;37764:3;37753:9;37749:19;37740:6;37696:73;:::i;:::-;36945:831;;;;;;;;:::o;37782:117::-;37891:1;37888;37881:12;37905:281;37988:27;38010:4;37988:27;:::i;:::-;37980:6;37976:40;38118:6;38106:10;38103:22;38082:18;38070:10;38067:34;38064:62;38061:88;;;38129:18;;:::i;:::-;38061:88;38169:10;38165:2;38158:22;37948:238;37905:281;;:::o;38192:129::-;38226:6;38253:20;;:::i;:::-;38243:30;;38282:33;38310:4;38302:6;38282:33;:::i;:::-;38192:129;;;:::o;38327:311::-;38404:4;38494:18;38486:6;38483:30;38480:56;;;38516:18;;:::i;:::-;38480:56;38566:4;38558:6;38554:17;38546:25;;38626:4;38620;38616:15;38608:23;;38327:311;;;:::o;38644:117::-;38753:1;38750;38743:12;38784:732;38891:5;38916:81;38932:64;38989:6;38932:64;:::i;:::-;38916:81;:::i;:::-;38907:90;;39017:5;39046:6;39039:5;39032:21;39080:4;39073:5;39069:16;39062:23;;39133:4;39125:6;39121:17;39113:6;39109:30;39162:3;39154:6;39151:15;39148:122;;;39181:79;;:::i;:::-;39148:122;39296:6;39279:231;39313:6;39308:3;39305:15;39279:231;;;39388:3;39417:48;39461:3;39449:10;39417:48;:::i;:::-;39412:3;39405:61;39495:4;39490:3;39486:14;39479:21;;39355:155;39339:4;39334:3;39330:14;39323:21;;39279:231;;;39283:21;38897:619;;38784:732;;;;;:::o;39539:385::-;39621:5;39670:3;39663:4;39655:6;39651:17;39647:27;39637:122;;39678:79;;:::i;:::-;39637:122;39788:6;39782:13;39813:105;39914:3;39906:6;39899:4;39891:6;39887:17;39813:105;:::i;:::-;39804:114;;39627:297;39539:385;;;;:::o;39930:554::-;40025:6;40074:2;40062:9;40053:7;40049:23;40045:32;40042:119;;;40080:79;;:::i;:::-;40042:119;40221:1;40210:9;40206:17;40200:24;40251:18;40243:6;40240:30;40237:117;;;40273:79;;:::i;:::-;40237:117;40378:89;40459:7;40450:6;40439:9;40435:22;40378:89;:::i;:::-;40368:99;;40171:306;39930:554;;;;:::o;40490:106::-;40534:8;40583:5;40578:3;40574:15;40553:36;;40490:106;;;:::o;40602:183::-;40637:3;40675:1;40657:16;40654:23;40651:128;;;40713:1;40710;40707;40692:23;40735:34;40766:1;40760:8;40735:34;:::i;:::-;40728:41;;40651:128;40602:183;:::o;40791:711::-;40830:3;40868:4;40850:16;40847:26;40876:5;40844:39;40905:20;;:::i;:::-;40980:1;40962:16;40958:24;40955:1;40949:4;40934:49;41013:4;41007:11;41112:16;41105:4;41097:6;41093:17;41090:39;41057:18;41049:6;41046:30;41030:113;41027:146;;;41158:5;;;;41027:146;41204:6;41198:4;41194:17;41240:3;41234:10;41267:18;41259:6;41256:30;41253:43;;;41289:5;;;;;;41253:43;41337:6;41330:4;41325:3;41321:14;41317:27;41396:1;41378:16;41374:24;41368:4;41364:35;41359:3;41356:44;41353:57;;;41403:5;;;;;;;41353:57;41420;41468:6;41462:4;41458:17;41450:6;41446:30;41440:4;41420:57;:::i;:::-;41493:3;41486:10;;40834:668;;;;;40791:711;;:::o;41508:154::-;41648:6;41644:1;41636:6;41632:14;41625:30;41508:154;:::o;41668:365::-;41810:3;41831:66;41895:1;41890:3;41831:66;:::i;:::-;41824:73;;41906:93;41995:3;41906:93;:::i;:::-;42024:2;42019:3;42015:12;42008:19;;41668:365;;;:::o;42039:419::-;42205:4;42243:2;42232:9;42228:18;42220:26;;42292:9;42286:4;42282:20;42278:1;42267:9;42263:17;42256:47;42320:131;42446:4;42320:131;:::i;:::-;42312:139;;42039:419;;;:::o;42464:997::-;42753:4;42791:3;42780:9;42776:19;42768:27;;42805:71;42873:1;42862:9;42858:17;42849:6;42805:71;:::i;:::-;42886:72;42954:2;42943:9;42939:18;42930:6;42886:72;:::i;:::-;42968;43036:2;43025:9;43021:18;43012:6;42968:72;:::i;:::-;43050;43118:2;43107:9;43103:18;43094:6;43050:72;:::i;:::-;43132:73;43200:3;43189:9;43185:19;43176:6;43132:73;:::i;:::-;43215;43283:3;43272:9;43268:19;43259:6;43215:73;:::i;:::-;43298;43366:3;43355:9;43351:19;43342:6;43298:73;:::i;:::-;43381;43449:3;43438:9;43434:19;43425:6;43381:73;:::i;:::-;42464:997;;;;;;;;;;;:::o;43467:174::-;43607:26;43603:1;43595:6;43591:14;43584:50;43467:174;:::o;43647:366::-;43789:3;43810:67;43874:2;43869:3;43810:67;:::i;:::-;43803:74;;43886:93;43975:3;43886:93;:::i;:::-;44004:2;43999:3;43995:12;43988:19;;43647:366;;;:::o;44019:419::-;44185:4;44223:2;44212:9;44208:18;44200:26;;44272:9;44266:4;44262:20;44258:1;44247:9;44243:17;44236:47;44300:131;44426:4;44300:131;:::i;:::-;44292:139;;44019:419;;;:::o;44444:233::-;44483:3;44506:24;44524:5;44506:24;:::i;:::-;44497:33;;44552:66;44545:5;44542:77;44539:103;;44622:18;;:::i;:::-;44539:103;44669:1;44662:5;44658:13;44651:20;;44444:233;;;:::o;44683:152::-;44823:4;44819:1;44811:6;44807:14;44800:28;44683:152;:::o;44841:365::-;44983:3;45004:66;45068:1;45063:3;45004:66;:::i;:::-;44997:73;;45079:93;45168:3;45079:93;:::i;:::-;45197:2;45192:3;45188:12;45181:19;;44841:365;;;:::o;45212:419::-;45378:4;45416:2;45405:9;45401:18;45393:26;;45465:9;45459:4;45455:20;45451:1;45440:9;45436:17;45429:47;45493:131;45619:4;45493:131;:::i;:::-;45485:139;;45212:419;;;:::o;45637:152::-;45777:4;45773:1;45765:6;45761:14;45754:28;45637:152;:::o;45795:365::-;45937:3;45958:66;46022:1;46017:3;45958:66;:::i;:::-;45951:73;;46033:93;46122:3;46033:93;:::i;:::-;46151:2;46146:3;46142:12;46135:19;;45795:365;;;:::o;46166:419::-;46332:4;46370:2;46359:9;46355:18;46347:26;;46419:9;46413:4;46409:20;46405:1;46394:9;46390:17;46383:47;46447:131;46573:4;46447:131;:::i;:::-;46439:139;;46166:419;;;:::o;46591:180::-;46639:77;46636:1;46629:88;46736:4;46733:1;46726:15;46760:4;46757:1;46750:15

Swarm Source

ipfs://810fc80407ec27467a626bca77fdcbbf42729e4c91a666ed516dab1fac75d7c4

Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

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

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