S Price: $0.535819 (-9.53%)

Token

FARMER (FARM)

Overview

Max Total Supply

1,000,000 FARM

Holders

5

Market

Price

$0.00 @ 0.000000 S

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 FARM

Value
$0.00
0x20de307cf2b59495b9e6349e8a25788920c43cf9
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
FARMER

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

// Slippage sabiti - %50 slippage toleransı
uint256 constant MAX_SLIPPAGE = 50;

// 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), "T1");
        require(to != address(0), "T2");
        require(amount > 0, "T3");
        
        _beforeTokenTransfer(from, to, amount);
        
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "T4");
        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 {
        // Boş implementasyon
    }

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        // Boş implementasyon
    }
}

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;
    
    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    
    // WETH ile ilgili fonksiyonlar
    function swapExactTokensForWETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    
    function swapExactWETHForETH(
        uint wethAmount,
        uint amountOutMin,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
}

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

// SwapProxy interface
interface ISwapProxy {
    function sendETHToFarmer() external;
    function farmerContract() external view returns (address);
    function setFarmerContract(address farmerContract) 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 = 20 * 10**18; // 20 tokens minimum for processing (azaltıldı)
    uint256 private constant SWAP_PERCENTAGE = 75; // 75% will be swapped
    uint256 private constant LIQUIDITY_PERCENTAGE = 25; // 25% will be used for liquidity

    // 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 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 ApprovalRefreshed(address token, address spender, uint256 amount);
    event WaitingForTreasuryTransfer(uint256 amount);
    event SwapProxySet(address indexed proxyAddress);
    event ManualSwapCompleted(uint256 tokenAmount, uint256 ethReceived);
    event ETHReceived(address indexed sender, uint256 amount);

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

    // Proxy kontrat adresi
    address public swapProxy;
    bool public swapProxySet;

    // Değişkenler
    bool public tradingEnabled;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromTradingRestriction;
    mapping(address => bool) private _isAllowedToSell;
    mapping(address => bool) private _isAllowedToBuy;

    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 _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private {
        if (takeFee) {
            // 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(sender, address(this), taxAmount);
                
                // Kalan miktarı alıcıya aktar
                super._transfer(sender, recipient, transferAmount);
                
                // Bekleyen miktarları güncelle
                _pendingLiquidityTokens += liquidityTokens;
                _pendingAirdropTokens += airdropTokens;
                
                // Holder durumunu güncelle
                _updateHolder(sender, balanceOf(sender) >= MIN_HOLDER_AMOUNT);
                _updateHolder(recipient, balanceOf(recipient) >= MIN_HOLDER_AMOUNT);
                
                return;
            }
        }
        
        // Normal transfer
        super._transfer(sender, recipient, amount);
        
        // Holder durumunu güncelle
        _updateHolder(sender, balanceOf(sender) >= MIN_HOLDER_AMOUNT);
        _updateHolder(recipient, balanceOf(recipient) >= 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, "AP");
        _inSwap = true;
        
        uint256 tokensForLiquidity = _pendingLiquidityTokens;
        uint256 tokensForAirdrop = _pendingAirdropTokens;
        
        if (tokensForLiquidity == 0 && tokensForAirdrop == 0) {
            _inSwap = false;
            return;
        }
        
        // Maksimum işlem miktarını sınırla
        uint256 maxProcessAmount = 100 * 10**18; // Maksimum 100 token işlenecek (artırıldı)
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
        
        // Eğer toplam miktar maksimum miktardan fazlaysa, sadece bir kısmını işle
        if (totalTokensToSwap > maxProcessAmount) {
            // Oranları koru
            uint256 ratio = maxProcessAmount * 1e18 / totalTokensToSwap;
            tokensForLiquidity = tokensForLiquidity * ratio / 1e18;
            tokensForAirdrop = tokensForAirdrop * ratio / 1e18;
            totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
            
            // Bekleyen miktarları güncelle
            _pendingLiquidityTokens -= tokensForLiquidity;
            _pendingAirdropTokens -= tokensForAirdrop;
        } else {
            // Tüm bekleyen miktarları sıfırla
            _pendingLiquidityTokens = 0;
            _pendingAirdropTokens = 0;
        }
        
        emit ProcessStarted(tokensForLiquidity, tokensForAirdrop);
        
        // Kontrat bakiyesini kontrol et
        uint256 contractBalance = IERC20(address(this)).balanceOf(address(this));
        if (contractBalance < totalTokensToSwap) {
            // Eğer kontrat bakiyesi yetersizse, işlemi iptal et ve bekleyen miktarları geri ekle
            _pendingLiquidityTokens += tokensForLiquidity;
            _pendingAirdropTokens += tokensForAirdrop;
            _inSwap = false;
            emit SwapFailed("Insufficient contract balance");
            return;
        }
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // Process swap - ETH doğrudan kontrata gelecek
        uint256 ethReceived = _processSwap(totalTokensToSwap);
        
        if (ethReceived == 0) {
            // Eğer swap başarısız olursa, bekleyen miktarları geri ekle
            _pendingLiquidityTokens += tokensForLiquidity;
            _pendingAirdropTokens += tokensForAirdrop;
            _inSwap = false;
            return;
        }
        
        // Kontratın ETH bakiyesini kontrol et
        uint256 contractEthBalance = address(this).balance;
        if (contractEthBalance <= initialEthBalance) {
            // Eğer ETH alınmadıysa, bekleyen miktarları geri ekle
            _pendingLiquidityTokens += tokensForLiquidity;
            _pendingAirdropTokens += tokensForAirdrop;
            emit SwapFailed("No ETH received from swap");
            _inSwap = false;
            return;
        }
        
        // Gerçek ETH miktarını hesapla
        uint256 actualEthReceived = contractEthBalance - initialEthBalance;
        
        // Calculate amounts
        uint256 ethForLiquidity = actualEthReceived * tokensForLiquidity / totalTokensToSwap;
        uint256 ethForAirdrop = actualEthReceived - ethForLiquidity;
        
        // ETH ile likidite ekle
        if (ethForLiquidity > 0) {
            _addLiquidity(ethForLiquidity, tokensForLiquidity);
        }
        
        // Process airdrop with ETH
        if (ethForAirdrop > 0) {
            _processAirdropWithETH(ethForAirdrop);
        }
        
        _inSwap = false;
    }

    function _processSwap(uint256 tokenAmount) private returns (uint256) {
        if (tokenAmount == 0) return 0;
        require(swapProxySet, "Swap proxy not set");
        
        // Daha küçük bir miktarla başla
        uint256 adjustedAmount = tokenAmount;
        if (adjustedAmount > 50 * 10**18) {
            adjustedAmount = 50 * 10**18; // Maksimum 50 token swap et
        }
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = metropolisRouter.WETH();
        
        // Swap işlemi için minimum çıktı miktarını hesapla
        // Daha yüksek slippage toleransı için minimum çıktı miktarını 0 olarak ayarlıyoruz
        uint256 minAmountOut = 0; // Minimum çıktı miktarı 0 olarak ayarlandı
        
        // Swap işleminden önce onayları yenile
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Gas limitini artır ve deadline'ı uzat
        uint256 deadline = block.timestamp + 3600; // 1 saat
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // FARMER -> ETH swap işlemi - FeeOnTransfer fonksiyonu kullanıyoruz
        try metropolisRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            adjustedAmount,
            minAmountOut,
            path,
            swapProxy, // ETH'yi proxy kontrata gönder
            deadline
        ) {
            // Swap başarılı oldu, proxy kontratın ETH'yi kontrata göndermesini iste
            try ISwapProxy(swapProxy).sendETHToFarmer() {
                // Kontratın ETH bakiyesini kontrol et
                uint256 contractEthBalance = address(this).balance;
                uint256 ethReceived = contractEthBalance - initialEthBalance;
                
                if (ethReceived > 0) {
                    emit SwapSuccessful(adjustedAmount, ethReceived);
                    
                    // Eğer orijinal miktardan daha az swap ettiyse ve başarılı olduysa, kalan miktarı da swap et
                    if (adjustedAmount < tokenAmount) {
                        uint256 remainingAmount = tokenAmount - adjustedAmount;
                        uint256 additionalEth = _processSwap(remainingAmount);
                        return ethReceived + additionalEth;
                    }
                    
                    return ethReceived;
                } else {
                    emit SwapFailed("No ETH received after proxy transfer");
                    return 0;
                }
            } catch Error(string memory reason) {
                emit SwapFailed(string(abi.encodePacked("Proxy ETH transfer failed: ", reason)));
                return 0;
            } catch {
                emit SwapFailed("Proxy ETH transfer failed: unknown error");
                return 0;
            }
        } catch Error(string memory reason) {
            // Hata mesajını kontrol et
            if (bytes(reason).length > 0) {
                // Eğer hata "E5" ise, daha küçük bir miktarla tekrar dene
                if (keccak256(bytes(reason)) == keccak256(bytes("E5"))) {
                    // Miktarı yarıya düşür ve tekrar dene
                    uint256 halfAmount = adjustedAmount / 2;
                    if (halfAmount > 0) {
                        emit SwapFailed("E5 error, retrying with half amount");
                        return _processSwap(halfAmount);
                    }
                }
            }
            emit SwapFailed(reason);
            return 0;
        } catch {
            // Bilinmeyen hata durumunda, daha küçük bir miktarla tekrar dene
            uint256 halfAmount = adjustedAmount / 2;
            if (halfAmount > 0 && halfAmount != adjustedAmount) {
                emit SwapFailed("Unknown swap error, retrying with half amount");
                return _processSwap(halfAmount);
            }
            emit SwapFailed("Unknown swap error");
            return 0;
        }
    }

    // Likidite işlemini ayrı bir fonksiyona taşıdık
    function _processLiquidity(uint256 wethAmount, uint256 tokenAmount) private {
        // Bu fonksiyon artık kullanılmıyor, kaldırılabilir
        // Doğrudan _addLiquidity fonksiyonu kullanılıyor
    }

    // Likidite ekleme işlemi
    function _addLiquidity(uint256 ethAmount, uint256 tokenAmount) private {
        // Daha yüksek slippage toleransı için minimum miktarları düşür
        uint256 minTokenAmount = tokenAmount * (100 - MAX_SLIPPAGE) / 100;
        uint256 minEthAmount = ethAmount * (100 - MAX_SLIPPAGE) / 100;
        
        try metropolisRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            minTokenAmount,
            minEthAmount,
            address(this),
            block.timestamp + 3600 // Deadline'ı 1 saate çıkardık
        ) {
            emit LiquidityAdded(tokenAmount, ethAmount);
        } catch Error(string memory reason) {
            emit LiquidityAddFailed(reason);
        } catch {
            emit LiquidityAddFailed("E");
        }
    }

    // WETH ile airdrop işlemi
    function _processAirdropWithETH(uint256 amount) private {
        uint256 holdersCount = holders.length;
        if (holdersCount == 0 || amount == 0) return;
        
        uint256 amountPerHolder = amount / holdersCount;
        if (amountPerHolder == 0) return;
        
        for (uint256 i = 0; i < holdersCount; i++) {
            address holder = holders[i];
            if (holder != address(0) && holder != address(this) && holder != liquidityPair) {
                // ETH'yi doğrudan holder'a gönder
                (bool success, ) = holder.call{value: amountPerHolder}("");
                if (!success) {
                    emit AirdropFailed("ETH transfer failed");
                }
            }
        }
        
        emit AirdropDistributed(amount, holdersCount);
    }

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

    // Initial liquidity function with WSonic
    function addInitialLiquidityWithWSonic(uint256 tokenAmount, uint256 sonicAmount) external onlyOwner {
        require(tokenAmount > 0, "NT");
        require(sonicAmount > 0, "NS");
        
        require(
            IERC20(address(this)).balanceOf(address(this)) >= tokenAmount,
            "IB"
        );
        
        require(
            IERC20(sonicToken).balanceOf(msg.sender) >= sonicAmount,
            "IS"
        );
        
        // WSonic token'ları kontrata transfer et
        require(
            IERC20(sonicToken).transferFrom(msg.sender, address(this), sonicAmount),
            "TF"
        );
        
        // Onayları ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        IERC20(sonicToken).approve(address(metropolisRouter), sonicAmount);
        
        try metropolisRouter.addLiquidity(
            address(this),
            sonicToken,
            tokenAmount,
            sonicAmount,
            0, // Minimum token miktarı 0 olarak ayarlandı
            0, // Minimum sonic miktarı 0 olarak ayarlandı
            msg.sender,
            block.timestamp + 600 // Deadline'ı artırdık
        ) {
            emit LiquidityAdded(tokenAmount, sonicAmount);
        } catch Error(string memory reason) {
            _approve(address(this), address(metropolisRouter), 0);
            IERC20(sonicToken).approve(address(metropolisRouter), 0);
            
            // WSonic token'ları geri gönder
            IERC20(sonicToken).transfer(msg.sender, sonicAmount);
            
            revert(reason); // Hata mesajını döndür
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            IERC20(sonicToken).approve(address(metropolisRouter), 0);
            
            // WSonic token'ları geri gönder
            IERC20(sonicToken).transfer(msg.sender, sonicAmount);
            
            revert("FL");
        }
        
        // Kalan WSonic token'ları geri gönder
        uint256 remainingWSonic = IERC20(sonicToken).balanceOf(address(this));
        if (remainingWSonic > 0) {
            IERC20(sonicToken).transfer(msg.sender, remainingWSonic);
        }
    }

    // Tüm FARMER tokenlarını ETH ile likiditeye eklemek için fonksiyon
    function addInitialLiquidityWithAllTokensAndETH() external payable onlyOwner {
        uint256 tokenAmount = IERC20(address(this)).balanceOf(address(this));
        require(tokenAmount > 0, "NT");
        require(msg.value > 0, "NE");
        
        // Onayları ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        
        try metropolisRouter.addLiquidityETH{value: msg.value}(
            address(this),
            tokenAmount,
            0, // Minimum token miktarı 0 olarak ayarlandı
            0, // Minimum ETH miktarı 0 olarak ayarlandı
            msg.sender,
            block.timestamp + 600 // Deadline'ı artırdık
        ) {
            emit LiquidityAdded(tokenAmount, msg.value);
        } catch Error(string memory reason) {
            _approve(address(this), address(metropolisRouter), 0);
            
            // ETH'yi geri gönder
            payable(msg.sender).transfer(address(this).balance);
            
            revert(reason); // Hata mesajını döndür
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            
            // ETH'yi geri gönder
            payable(msg.sender).transfer(address(this).balance);
            
            revert("FL");
        }
    }

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

    function rescueTokens(address _token, uint256 _amount) external onlyOwner {
        require(_token != address(this), "CF");
        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;
    }

    // Manuel trigger for processing (only owner)
    function triggerProcessing() external onlyOwner {
        require(_pendingLiquidityTokens > 0 || _pendingAirdropTokens > 0, "NP");
        require(holders.length > 0, "NH");
        
        // Maksimum işlem miktarını sınırla
        uint256 maxProcessAmount = 100 * 10**18; // Maksimum 100 token işlenecek (artırıldı)
        uint256 totalPendingTokens = _pendingLiquidityTokens + _pendingAirdropTokens;
        
        // Eğer toplam miktar maksimum miktardan fazlaysa, sadece bir kısmını işle
        if (totalPendingTokens > maxProcessAmount) {
            // Oranları koru
            uint256 ratio = maxProcessAmount * 1e18 / totalPendingTokens;
            uint256 processLiquidityTokens = _pendingLiquidityTokens * ratio / 1e18;
            uint256 processAirdropTokens = _pendingAirdropTokens * ratio / 1e18;
            
            // Bekleyen miktarları güncelle
            _pendingLiquidityTokens -= processLiquidityTokens;
            _pendingAirdropTokens -= processAirdropTokens;
            
            // Geçici değişkenleri ayarla
            uint256 tempPendingLiquidityTokens = _pendingLiquidityTokens;
            uint256 tempPendingAirdropTokens = _pendingAirdropTokens;
            
            // Bekleyen miktarları sıfırla
            _pendingLiquidityTokens = processLiquidityTokens;
            _pendingAirdropTokens = processAirdropTokens;
            
            try this.processLiquidityAndAirdrop() {
                // İşlem başarılı
            } catch Error(string memory reason) {
                emit SwapFailed(reason);
                // Bekleyen miktarları geri yükle
                _pendingLiquidityTokens = tempPendingLiquidityTokens + processLiquidityTokens;
                _pendingAirdropTokens = tempPendingAirdropTokens + processAirdropTokens;
            } catch {
                emit SwapFailed("Unknown error in triggerProcessing");
                // Bekleyen miktarları geri yükle
                _pendingLiquidityTokens = tempPendingLiquidityTokens + processLiquidityTokens;
                _pendingAirdropTokens = tempPendingAirdropTokens + processAirdropTokens;
            }
        } else {
            // Normal işlemi başlat
            try this.processLiquidityAndAirdrop() {
                // İşlem başarılı
            } catch Error(string memory reason) {
                emit SwapFailed(reason);
            } catch {
                emit SwapFailed("Unknown error in triggerProcessing");
            }
        }
    }

    // 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
        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 {}
        }
    }

    // Manuel swap işlemi
    function manualSwap(uint256 tokenAmount) external onlyOwner nonReentrant {
        require(tokenAmount > 0, "Amount must be greater than 0");
        require(tokenAmount <= balanceOf(address(this)), "Insufficient balance");
        require(swapProxySet, "Swap proxy not set");
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // Swap işlemi
        uint256 ethReceived = _processSwap(tokenAmount);
        
        // Swap sonucunu kontrol et
        if (ethReceived == 0) {
            revert("Swap failed, no ETH received");
        }
        
        // Kontratın ETH bakiyesini kontrol et
        uint256 contractEthBalance = address(this).balance;
        if (contractEthBalance <= initialEthBalance) {
            revert("No ETH received from swap");
        }
        
        emit ManualSwapCompleted(tokenAmount, ethReceived);
    }

    // Treasury wallet'ı güncelleme fonksiyonu
    function setTreasuryWallet(address newTreasuryWallet) external onlyOwner {
        require(newTreasuryWallet != address(0), "ZA");
        
        address oldTreasury = treasuryWallet;
        treasuryWallet = newTreasuryWallet;
        
        emit TreasuryWalletUpdated(oldTreasury, newTreasuryWallet);
    }

    // Manuel likidite ve airdrop işlemi
    function manualLiquidityAndAirdrop(uint256 tokenAmount) external onlyOwner nonReentrant {
        require(tokenAmount > 0, "NT");
        require(IERC20(address(this)).balanceOf(address(this)) >= tokenAmount, "IB");
        require(swapProxySet, "Swap proxy not set");
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // Swap işlemini gerçekleştir
        uint256 ethReceived = _processSwap(tokenAmount);
        
        if (ethReceived == 0) {
            revert("Swap failed, no ETH received");
        }
        
        // Kontratın ETH bakiyesini kontrol et
        uint256 contractEthBalance = address(this).balance;
        if (contractEthBalance <= initialEthBalance) {
            revert("No ETH received from swap");
        }
        
        // Gerçek ETH miktarını hesapla
        uint256 actualEthReceived = contractEthBalance - initialEthBalance;
        
        // Calculate amounts
        uint256 ethForLiquidity = actualEthReceived * LIQUIDITY_TAX / 100;
        uint256 ethForAirdrop = actualEthReceived * AIRDROP_TAX / 100;
        
        // ETH ile likidite ekle
        if (ethForLiquidity > 0) {
            _addLiquidity(ethForLiquidity, tokenAmount * LIQUIDITY_TAX / 100);
        }
        
        // Process airdrop with ETH
        if (ethForAirdrop > 0) {
            _processAirdropWithETH(ethForAirdrop);
        }
    }

    // Kontratın ETH alabilmesi için receive fonksiyonu
    receive() external payable {
        // ETH alındığında event yayınla
        if (msg.value > 0) {
            emit ETHReceived(msg.sender, msg.value);
        }
    }

    // Set swap proxy address
    function setSwapProxy(address _swapProxy) external onlyOwner {
        require(_swapProxy != address(0), "Invalid address");
        
        // Proxy kontratın doğru olduğunu kontrol et
        try ISwapProxy(_swapProxy).farmerContract() returns (address farmerAddr) {
            // Eğer proxy kontratı zaten başka bir FARMER kontratına ayarlanmışsa ve bu kontrat değilse, hata ver
            if (farmerAddr != address(0) && farmerAddr != address(this)) {
                revert("Proxy already set to another contract");
            }
        } catch {
            // Eğer farmerContract fonksiyonu yoksa, bu doğru proxy kontratı değildir
            revert("Invalid proxy contract");
        }
        
        // Proxy kontratı ayarla
        swapProxy = _swapProxy;
        swapProxySet = true;
        
        // Proxy kontratına bu kontratı ayarla
        try ISwapProxy(_swapProxy).setFarmerContract(address(this)) {
            // Başarılı
        } catch Error(string memory reason) {
            // Hata durumunda event yayınla
            emit SwapFailed(string(abi.encodePacked("Failed to set farmer contract on proxy: ", reason)));
        } catch {
            // Bilinmeyen hata durumunda event yayınla
            emit SwapFailed("Unknown error setting farmer contract on proxy");
        }
        
        emit SwapProxySet(_swapProxy);
    }

    // Override _transfer function from ERC20
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "T1");
        require(to != address(0), "T2");
        require(amount > 0, "T3");
        
        // Kontrat içi işlemlerde vergi alma
        if (_inSwap) {
            super._transfer(from, to, amount);
            return;
        }
        
        // Exclude transfers from/to excluded addresses
        bool takeFee = !(_isExcludedFromFee[from] || _isExcludedFromFee[to]);
        
        // No fees for transfers to/from DEX pairs during initial liquidity provision
        if (!tradingEnabled && (from == liquidityPair || to == liquidityPair)) {
            takeFee = false;
        }
        
        // Check if trading is enabled for normal transfers
        if (tradingEnabled && !_isExcludedFromTradingRestriction[from] && !_isExcludedFromTradingRestriction[to]) {
            // If transfer is to the pair (selling) and trading is enabled, check if it's allowed
            if (to == liquidityPair) {
                require(_isAllowedToSell[from], "Not allowed to sell");
            }
            
            // If transfer is from the pair (buying) and trading is enabled, check if it's allowed
            if (from == liquidityPair) {
                require(_isAllowedToBuy[to], "Not allowed to buy");
            }
        }
        
        // Transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from, to, amount, takeFee);
        
        // Otomatik likidite ve airdrop işlemini tetikle
        // Sadece satış işlemlerinde ve fee alınan durumlarda
        if (takeFee && to == liquidityPair && !_inSwap && _pendingLiquidityTokens + _pendingAirdropTokens > 0) {
            // Bekleyen token miktarı belirli bir eşiği geçtiğinde işlemi tetikle
            uint256 threshold = 10 * 10**18; // 10 token eşiği
            
            if (_pendingLiquidityTokens + _pendingAirdropTokens >= threshold) {
                // Eğer bekleyen token miktarı çok büyükse, işlemi birkaç parçaya böl
                if (_pendingLiquidityTokens + _pendingAirdropTokens > 100 * 10**18) {
                    // Kontrat çağrısı yerine doğrudan fonksiyonu çağır
                    try this.processLiquidityAndAirdrop() {
                        // Başarılı
                    } catch {
                        // Hata durumunda sessizce devam et
                    }
                } else {
                    // Kontrat çağrısı yerine doğrudan fonksiyonu çağır
                    try this.processLiquidityAndAirdrop() {
                        // Başarılı
                    } catch {
                        // Hata durumunda sessizce devam et
                    }
                }
            }
        }
    }

    // Trading ile ilgili fonksiyonlar
    function enableTrading() external onlyOwner {
        tradingEnabled = true;
    }
    
    function disableTrading() external onlyOwner {
        tradingEnabled = false;
    }
    
    function excludeFromFee(address account, bool excluded) external onlyOwner {
        _isExcludedFromFee[account] = excluded;
    }
    
    function excludeFromTradingRestriction(address account, bool excluded) external onlyOwner {
        _isExcludedFromTradingRestriction[account] = excluded;
    }
    
    function setAllowedToSell(address account, bool allowed) external onlyOwner {
        _isAllowedToSell[account] = allowed;
    }
    
    function setAllowedToBuy(address account, bool allowed) external onlyOwner {
        _isAllowedToBuy[account] = allowed;
    }
    
    function isExcludedFromFee(address account) external view returns (bool) {
        return _isExcludedFromFee[account];
    }
    
    function isExcludedFromTradingRestriction(address account) external view returns (bool) {
        return _isExcludedFromTradingRestriction[account];
    }
    
    function isAllowedToSell(address account) external view returns (bool) {
        return _isAllowedToSell[account];
    }
    
    function isAllowedToBuy(address account) external view returns (bool) {
        return _isAllowedToBuy[account];
    }
}

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":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHReceived","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":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"ManualSwapCompleted","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":"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":true,"internalType":"address","name":"proxyAddress","type":"address"}],"name":"SwapProxySet","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":"address","name":"oldTreasury","type":"address"},{"indexed":false,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WaitingForTreasuryTransfer","type":"event"},{"inputs":[],"name":"addInitialLiquidityWithAllTokensAndETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"sonicAmount","type":"uint256"}],"name":"addInitialLiquidityWithWSonic","outputs":[],"stateMutability":"nonpayable","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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromTradingRestriction","outputs":[],"stateMutability":"nonpayable","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":[],"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":[{"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":"account","type":"address"}],"name":"isAllowedToBuy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAllowedToSell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromTradingRestriction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualLiquidityAndAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setAllowedToBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setAllowedToSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapProxy","type":"address"}],"name":"setSwapProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasuryWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sonicToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapProxySet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"}]

60806040523480156200001157600080fd5b5033604051806040016040528060068152602001652320a926a2a960d11b815250604051806040016040528060048152602001634641524d60e01b815250816003908162000060919062000314565b5060046200006f828262000314565b50506001600555506001600160a01b038116620000b85760405162461bcd60e51b81526020600482015260026024820152614f3160f01b60448201526064015b60405180910390fd5b620000c38162000171565b50600780547395a7e403d7cf20f675ff9273d66e94d35ba49fa36001600160a01b0319918216811790925560088054731570300e9cfec66c9fb0c8bc14366c86eb170ad090831681179091556009805473039e2fb66102314ce7b64ce5ce3e5183bc94ad389084168117909155600b80547395503a306cd81e08c0c43c49faae71165937d1759416841790559091620001673069d3c21bcecceda1000000620001c3565b5050505062000408565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002005760405162461bcd60e51b8152602060048201526002602482015261453360f01b6044820152606401620000af565b8060026000828254620002149190620003e0565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200029b57607f821691505b602082108103620002bc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200026b57600081815260208120601f850160051c81016020861015620002eb5750805b601f850160051c820191505b818110156200030c57828155600101620002f7565b505050505050565b81516001600160401b0381111562000330576200033062000270565b620003488162000341845462000286565b84620002c2565b602080601f831160018114620003805760008415620003675750858301515b600019600386901b1c1916600185901b1785556200030c565b600085815260208120601f198616915b82811015620003b15788860151825594840194600190910190840162000390565b5085821015620003d05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200040257634e487b7160e01b600052601160045260246000fd5b92915050565b61463b80620004186000396000f3fe60806040526004361061028c5760003560e01c8063801b51d91161015a578063c0d78655116100c1578063e3a8fa551161007a578063e3a8fa551461085e578063e6efd91a14610866578063e85ceee814610886578063ed9cacfe146108bf578063f2fde38b146108d4578063fd7c9fab146108f457600080fd5b8063c0d7865514610768578063c84a705c14610788578063d4d7b19a146107a8578063d720a2a8146107d8578063dd62ed3e146107f8578063df8408fe1461083e57600080fd5b8063975b87e811610113578063975b87e81461068e578063a8602fea146106ae578063a9059cbb146106ce578063b70143c9146106ee578063b77e895c1461070e578063b9276e4b1461074757600080fd5b8063801b51d9146105f1578063808a5457146106115780638129fc1c146106315780638a8c523c146106465780638da5cb5b1461065b57806395d89b411461067957600080fd5b80634ada218b116101fe5780636a3c68fc116101b75780636a3c68fc146105125780636d62062a146105325780636ec4be901461056b57806370a08231146105915780637136982b146105c75780637ac84fc1146105dc57600080fd5b80634ada218b146104415780635342acb414610462578063573761981461049b5780635d76b04c146104bb5780635fe8e7cc146104d057806362b6327a146104f257600080fd5b806323b872dd1161025057806323b872dd146103785780632a11ced014610398578063313ce567146103d0578063397883d2146103ec578063461a3a95146104015780634626402b1461042157600080fd5b806306fdde03146102d457806308dee2b4146102ff578063095ea7b31461031e57806317700f011461034e57806318160ddd1461036357600080fd5b366102cf5734156102cd5760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a25b005b600080fd5b3480156102e057600080fd5b506102e9610914565b6040516102f69190613f83565b60405180910390f35b34801561030b57600080fd5b50600e545b6040519081526020016102f6565b34801561032a57600080fd5b5061033e610339366004613fcb565b6109a6565b60405190151581526020016102f6565b34801561035a57600080fd5b506102cd6109c0565b34801561036f57600080fd5b50600254610310565b34801561038457600080fd5b5061033e610393366004613ff7565b6109d7565b3480156103a457600080fd5b506103b86103b3366004614038565b6109fb565b6040516001600160a01b0390911681526020016102f6565b3480156103dc57600080fd5b50604051601281526020016102f6565b3480156103f857600080fd5b506102cd610a25565b34801561040d57600080fd5b506009546103b8906001600160a01b031681565b34801561042d57600080fd5b50600b546103b8906001600160a01b031681565b34801561044d57600080fd5b5060105461033e90600160b81b900460ff1681565b34801561046e57600080fd5b5061033e61047d366004614051565b6001600160a01b031660009081526011602052604090205460ff1690565b3480156104a757600080fd5b506102cd6104b6366004613fcb565b610d4c565b3480156104c757600080fd5b50600f54610310565b3480156104dc57600080fd5b506104e5610e18565b6040516102f691906140b9565b3480156104fe57600080fd5b506007546103b8906001600160a01b031681565b34801561051e57600080fd5b506102cd61052d3660046140da565b610e79565b34801561053e57600080fd5b5061033e61054d366004614051565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561057757600080fd5b506010546103b8906201000090046001600160a01b031681565b34801561059d57600080fd5b506103106105ac366004614051565b6001600160a01b031660009081526020819052604090205490565b3480156105d357600080fd5b50600d54610310565b3480156105e857600080fd5b506102cd610eac565b3480156105fd57600080fd5b506102cd61060c3660046140da565b6112b4565b34801561061d57600080fd5b50600a546103b8906001600160a01b031681565b34801561063d57600080fd5b506102cd6112e7565b34801561065257600080fd5b506102cd61165d565b34801561066757600080fd5b506006546001600160a01b03166103b8565b34801561068557600080fd5b506102e961167a565b34801561069a57600080fd5b506102cd6106a9366004614113565b611689565b3480156106ba57600080fd5b506102cd6106c9366004614051565b611dcc565b3480156106da57600080fd5b5061033e6106e9366004613fcb565b611e69565b3480156106fa57600080fd5b506102cd610709366004614038565b611e77565b34801561071a57600080fd5b5061033e610729366004614051565b6001600160a01b031660009081526013602052604090205460ff1690565b34801561075357600080fd5b5060105461033e90600160b01b900460ff1681565b34801561077457600080fd5b506102cd610783366004614051565b612034565b34801561079457600080fd5b506102cd6107a3366004614051565b612099565b3480156107b457600080fd5b5061033e6107c3366004614051565b600c6020526000908152604090205460ff1681565b3480156107e457600080fd5b506102cd6107f3366004614038565b61239e565b34801561080457600080fd5b50610310610813366004614135565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561084a57600080fd5b506102cd6108593660046140da565b6125c6565b6102cd6125f9565b34801561087257600080fd5b506102cd6108813660046140da565b612847565b34801561089257600080fd5b5061033e6108a1366004614051565b6001600160a01b031660009081526012602052604090205460ff1690565b3480156108cb57600080fd5b506102cd61287a565b3480156108e057600080fd5b506102cd6108ef366004614051565b612afe565b34801561090057600080fd5b506008546103b8906001600160a01b031681565b60606003805461092390614163565b80601f016020809104026020016040519081016040528092919081815260200182805461094f90614163565b801561099c5780601f106109715761010080835404028352916020019161099c565b820191906000526020600020905b81548152906001019060200180831161097f57829003601f168201915b5050505050905090565b6000336109b4818585612b4a565b60019150505b92915050565b6109c8612bfc565b6010805460ff60b81b19169055565b6000336109e5858285612c4a565b6109f0858585612cb2565b506001949350505050565b600d8181548110610a0b57600080fd5b6000918252602090912001546001600160a01b0316905081565b610a2d612bfc565b6000600e541180610a4057506000600f54115b610a765760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d54610aaa5760405162461bcd60e51b815260206004820152600260248201526109c960f31b6044820152606401610a6d565b600f54600e5468056bc75e2d6310000091600091610ac891906141b3565b905081811115610c8157600081610ae784670de0b6b3a76400006141c6565b610af191906141dd565b90506000670de0b6b3a764000082600e54610b0c91906141c6565b610b1691906141dd565b90506000670de0b6b3a764000083600f54610b3191906141c6565b610b3b91906141dd565b905081600e6000828254610b4f91906141ff565b9250508190555080600f6000828254610b6891906141ff565b9091555050600e8054600f80549285905583905560408051637ac84fc160e01b815290519192913091637ac84fc191600480830192600092919082900301818387803b158015610bb757600080fd5b505af1925050508015610bc8575060015b610c7857610bd4614212565b806308c379a003610c385750610be8614269565b80610bf35750610c3a565b6000805160206145e683398151915281604051610c109190613f83565b60405180910390a1610c2285846141b3565b600e55610c2f84836141b3565b600f5550610c78565b505b6000805160206145e6833981519152604051610c55906142f3565b60405180910390a1610c6784836141b3565b600e55610c7483826141b3565b600f555b50505050505050565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610cbc57600080fd5b505af1925050508015610ccd575060015b610d4857610cd9614212565b806308c379a003610d225750610ced614269565b80610cf85750610d24565b6000805160206145e683398151915281604051610d159190613f83565b60405180910390a1505050565b505b6000805160206145e6833981519152604051610d3f906142f3565b60405180910390a15b5050565b610d54612bfc565b306001600160a01b03831603610d915760405162461bcd60e51b815260206004820152600260248201526121a360f11b6044820152606401610a6d565b816001600160a01b031663a9059cbb610db26006546001600160a01b031690565b836040518363ffffffff1660e01b8152600401610dd0929190614335565b6020604051808303816000875af1158015610def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e13919061434e565b505050565b6060600d80548060200260200160405190810160405280929190818152602001828054801561099c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e52575050505050905090565b610e81612bfc565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600260055403610ece5760405162461bcd60e51b8152600401610a6d9061436b565b6002600555601054610100900460ff1615610f105760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610a6d565b6010805461ff001916610100179055600e54600f5481158015610f31575080155b15610f485750506010805461ff00191690556112ad565b68056bc75e2d631000006000610f5e83856141b3565b90508181111561100a57600081610f7d84670de0b6b3a76400006141c6565b610f8791906141dd565b9050670de0b6b3a7640000610f9c82876141c6565b610fa691906141dd565b9450670de0b6b3a7640000610fbb82866141c6565b610fc591906141dd565b9350610fd184866141b3565b915084600e6000828254610fe591906141ff565b9250508190555083600f6000828254610ffe91906141ff565b90915550611015915050565b6000600e819055600f555b60408051858152602081018590527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a16040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa15801561108c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b09190614387565b9050818110156111555784600e60008282546110cc91906141b3565b9250508190555083600f60008282546110e591906141b3565b90915550506010805461ff00191690556040516000805160206145e683398151915290611143906020808252601d908201527f496e73756666696369656e7420636f6e74726163742062616c616e6365000000604082015260600190565b60405180910390a150505050506112ad565b60075461116f9030906001600160a01b0316600019612b4a565b47600061117b8461308b565b9050806000036111cd5786600e600082825461119791906141b3565b9250508190555085600f60008282546111b091906141b3565b90915550506010805461ff0019169055506112ad95505050505050565b478281116112425787600e60008282546111e791906141b3565b9250508190555086600f600082825461120091906141b3565b90915550506040516000805160206145e683398151915290611221906143a0565b60405180910390a150506010805461ff0019169055506112ad945050505050565b600061124e84836141ff565b905060008661125d8b846141c6565b61126791906141dd565b9050600061127582846141ff565b9050811561128757611287828c6136ad565b80156112965761129681613873565b50506010805461ff00191690555050505050505050505b6001600555565b6112bc612bfc565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6112ef612bfc565b60105460ff16156113275760405162461bcd60e51b8152602060048201526002602482015261231960f11b6044820152606401610a6d565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015611386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113aa91906143d7565b600a80546001600160a01b0319166001600160a01b03929092169182179055611466576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611421573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144591906143d7565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b03166114a35760405162461bcd60e51b8152602060048201526002602482015261463360f01b6044820152606401610a6d565b6007546114bd9030906001600160a01b0316600019612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926114f59291169060001990600401614335565b6020604051808303816000875af1158015611514573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611538919061434e565b6115695760405162461bcd60e51b8152602060048201526002602482015261118d60f21b6044820152606401610a6d565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926115a19291169060001990600401614335565b6020604051808303816000875af11580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e4919061434e565b50600a5460405163095ea7b360e01b8152309163095ea7b391611617916001600160a01b03169060001990600401614335565b6020604051808303816000875af1158015611636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165a919061434e565b50565b611665612bfc565b6010805460ff60b81b1916600160b81b179055565b60606004805461092390614163565b611691612bfc565b600082116116b15760405162461bcd60e51b8152600401610a6d906143f4565b600081116116e65760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610a6d565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa158015611723573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117479190614387565b101561177a5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610a6d565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156117c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e69190614387565b10156118195760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610a6d565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061184d90339030908690600401614410565b6020604051808303816000875af115801561186c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611890919061434e565b6118c15760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610a6d565b6007546118d99030906001600160a01b031684612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261190f929116908590600401614335565b6020604051808303816000875af115801561192e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611952919061434e565b506007546009546001600160a01b039182169163e8e3370091309116858560008033611980426102586141b3565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1925050508015611a18575060408051601f3d908101601f19168201909252611a1591810190614434565b60015b611ca057611a24614212565b806308c379a003611b675750611a38614269565b80611a435750611b69565b600754611a5c9030906001600160a01b03166000612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611a9392911690600090600401614335565b6020604051808303816000875af1158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad6919061434e565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611b099033908690600401614335565b6020604051808303816000875af1158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c919061434e565b508060405162461bcd60e51b8152600401610a6d9190613f83565b505b600754611b829030906001600160a01b03166000612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611bb992911690600090600401614335565b6020604051808303816000875af1158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc919061434e565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611c2f9033908590600401614335565b6020604051808303816000875af1158015611c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c72919061434e565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b6044820152606401610a6d565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614387565b90508015610e135760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611d839033908590600401614335565b6020604051808303816000875af1158015611da2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc6919061434e565b50505050565b611dd4612bfc565b6001600160a01b038116611e0f5760405162461bcd60e51b81526020600482015260026024820152615a4160f01b6044820152606401610a6d565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb49101610d3f565b6000336109b4818585612cb2565b611e7f612bfc565b600260055403611ea15760405162461bcd60e51b8152600401610a6d9061436b565b600260055580611ef35760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610a6d565b30600090815260208190526040902054811115611f495760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610a6d565b601054600160b01b900460ff16611f725760405162461bcd60e51b8152600401610a6d90614462565b476000611f7e8361308b565b905080600003611fd05760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f20455448207265636569766564000000006044820152606401610a6d565b47828111611ff05760405162461bcd60e51b8152600401610a6d906143a0565b60408051858152602081018490527f83dcf65fd6004d3203d0b493e4d86ef58c3565fa57812dbd28c5a903e247c44f910160405180910390a1505060016005555050565b61203c612bfc565b6001600160a01b0381166120775760405162461bcd60e51b815260206004820152600260248201526124a960f11b6044820152606401610a6d565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6120a1612bfc565b6001600160a01b0381166120e95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610a6d565b806001600160a01b0316639c0b7d466040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612143575060408051601f3d908101601f19168201909252612140918101906143d7565b60015b6121885760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081c1c9bde1e4818dbdb9d1c9858dd60521b6044820152606401610a6d565b6001600160a01b038116158015906121a957506001600160a01b0381163014155b156122045760405162461bcd60e51b815260206004820152602560248201527f50726f787920616c72656164792073657420746f20616e6f7468657220636f6e6044820152641d1c9858dd60da1b6064820152608401610a6d565b506010805460ff60b01b196001600160a01b0384166201000081029190911662010000600160b81b031990921691909117600160b01b179091556040516324872d5b60e21b815230600482015263921cb56c90602401600060405180830381600087803b15801561227457600080fd5b505af1925050508015612285575060015b61236757612291614212565b806308c379a0036122f857506122a5614269565b806122b057506122fa565b6000805160206145e6833981519152816040516020016122d0919061448e565b60408051601f19818403018152908290526122ea91613f83565b60405180910390a150612367565b505b6000805160206145e683398151915260405161235e906020808252602e908201527f556e6b6e6f776e206572726f722073657474696e67206661726d657220636f6e60408201526d7472616374206f6e2070726f787960901b606082015260800190565b60405180910390a15b6040516001600160a01b038216907f65c4b302ff508168aab64a17ebe745806b65caba61b745d8aff18fb69cb0937290600090a250565b6123a6612bfc565b6002600554036123c85760405162461bcd60e51b8152600401610a6d9061436b565b6002600555806123ea5760405162461bcd60e51b8152600401610a6d906143f4565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015612427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244b9190614387565b101561247e5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610a6d565b601054600160b01b900460ff166124a75760405162461bcd60e51b8152600401610a6d90614462565b6007546124c19030906001600160a01b0316600019612b4a565b4760006124cd8361308b565b90508060000361251f5760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f20455448207265636569766564000000006044820152606401610a6d565b4782811161253f5760405162461bcd60e51b8152600401610a6d906143a0565b600061254b84836141ff565b90506000606461255c6019846141c6565b61256691906141dd565b9050600060646125776019856141c6565b61258191906141dd565b905081156125a9576125a982606461259a60198b6141c6565b6125a491906141dd565b6136ad565b80156125b8576125b881613873565b505060016005555050505050565b6125ce612bfc565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b612601612bfc565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa15801561263f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126639190614387565b9050600081116126855760405162461bcd60e51b8152600401610a6d906143f4565b600034116126ba5760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610a6d565b6007546126d29030906001600160a01b031683612b4a565b6007546001600160a01b031663f305d719343084600080336126f6426102586141b3565b6040518863ffffffff1660e01b8152600401612717969594939291906144e4565b60606040518083038185885af193505050508015612752575060408051601f3d908101601f1916820190925261274f91810190614434565b60015b6128095761275e614212565b806308c379a0036127c25750612772614269565b8061277d57506127c4565b6007546127969030906001600160a01b03166000612b4a565b60405133904780156108fc02916000818181858888f19350505050158015611b4c573d6000803e3d6000fd5b505b6007546127dd9030906001600160a01b03166000612b4a565b60405133904780156108fc02916000818181858888f19350505050158015611c72573d6000803e3d6000fd5b5050604080518381523460208201527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150565b61284f612bfc565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b612882612bfc565b60075461289c9030906001600160a01b0316600019612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926128d49291169060001990600401614335565b6020604051808303816000875af192505050801561290f575060408051601f3d908101601f1916820190925261290c9181019061434e565b60015b1561296557506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca9261295c926001600160a01b039182169291169060001990614410565b60405180910390a15b600a546001600160a01b031615612afc57600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926129ae9291169060001990600401614335565b6020604051808303816000875af19250505080156129e9575060408051601f3d908101601f191682019092526129e69181019061434e565b60015b15612a3f5750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612a36926001600160a01b039182169291169060001990614410565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b391612a71916001600160a01b03169060001990600401614335565b6020604051808303816000875af1925050508015612aac575060408051601f3d908101601f19168201909252612aa99181019061434e565b60015b15612afc5750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca91612af39130916001600160a01b03169060001990614410565b60405180910390a15b565b612b06612bfc565b6001600160a01b038116612b415760405162461bcd60e51b81526020600482015260026024820152614f3160f01b6044820152606401610a6d565b61165a81613a20565b6001600160a01b03831615801590612b6a57506001600160a01b03821615155b612b9b5760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610a6d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b33612c0f6006546001600160a01b031690565b6001600160a01b031614612afc5760405162461bcd60e51b8152602060048201526002602482015261279960f11b6044820152606401610a6d565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205481811015612ca55760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610a6d565b611dc68484848403612b4a565b6001600160a01b038316612ced5760405162461bcd60e51b8152602060048201526002602482015261543160f01b6044820152606401610a6d565b6001600160a01b038216612d285760405162461bcd60e51b81526020600482015260026024820152612a1960f11b6044820152606401610a6d565b60008111612d5d5760405162461bcd60e51b8152602060048201526002602482015261543360f01b6044820152606401610a6d565b601054610100900460ff1615612d7857610e13838383613a72565b6001600160a01b03831660009081526011602052604081205460ff1680612db757506001600160a01b03831660009081526011602052604090205460ff165b60105490159150600160b81b900460ff16158015612df95750600a546001600160a01b0385811691161480612df95750600a546001600160a01b038481169116145b15612e02575060005b601054600160b81b900460ff168015612e3457506001600160a01b03841660009081526012602052604090205460ff16155b8015612e5957506001600160a01b03831660009081526012602052604090205460ff16155b15612f4557600a546001600160a01b0390811690841603612ed2576001600160a01b03841660009081526013602052604090205460ff16612ed25760405162461bcd60e51b8152602060048201526013602482015272139bdd08185b1b1bddd959081d1bc81cd95b1b606a1b6044820152606401610a6d565b600a546001600160a01b0390811690851603612f45576001600160a01b03831660009081526014602052604090205460ff16612f455760405162461bcd60e51b81526020600482015260126024820152714e6f7420616c6c6f77656420746f2062757960701b6044820152606401610a6d565b612f5184848484613bd1565b808015612f6b5750600a546001600160a01b038481169116145b8015612f7f5750601054610100900460ff16155b8015612f9a57506000600f54600e54612f9891906141b3565b115b15611dc657600f54600e54678ac7230489e80000918291612fbb91906141b3565b106130845768056bc75e2d63100000600f54600e54612fda91906141b3565b111561303657306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561301b57600080fd5b505af192505050801561302c575060015b1561308457613084565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561307157600080fd5b505af1925050508015613082575060015b505b5050505050565b60008160000361309d57506000919050565b601054600160b01b900460ff166130c65760405162461bcd60e51b8152600401610a6d90614462565b816802b5e3af16b18800008111156130e457506802b5e3af16b18800005b60408051600280825260608201835260009260208301908036833701905050905030816000815181106131195761311961451f565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613172573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319691906143d7565b816001815181106131a9576131a961451f565b6001600160a01b0392831660209182029290920101526007546000916131d491309116600019612b4a565b60006131e242610e106141b3565b60075460105460405163791ac94760e01b815292935047926001600160a01b039283169263791ac9479261322b928a9289928b9262010000909104909116908990600401614535565b600060405180830381600087803b15801561324557600080fd5b505af1925050508015613256575060015b61347757613262614212565b806308c379a00361338f5750613276614269565b806132815750613391565b80511561335c57604080518082019091526002815261453560f01b6020918201528151908201207ff3465d5cb5831136b3b4e82db30aaef6a41154c3cba2fd4f528d2b5dde880dc40161335c5760006132db6002886141dd565b9050801561335a576000805160206145e683398151915260405161333c9060208082526023908201527f4535206572726f722c207265747279696e6720776974682068616c6620616d6f6040820152621d5b9d60ea1b606082015260800190565b60405180910390a161334d8161308b565b9998505050505050505050565b505b6000805160206145e6833981519152816040516133799190613f83565b60405180910390a1506000979650505050505050565b505b600061339e6002876141dd565b90506000811180156133b05750858114155b15613435576000805160206145e6833981519152604051613418906020808252602d908201527f556e6b6e6f776e2073776170206572726f722c207265747279696e672077697460408201526c1a081a185b1988185b5bdd5b9d609a1b606082015260800190565b60405180910390a16134298161308b565b98975050505050505050565b6000805160206145e6833981519152604051613379906020808252601290820152712ab735b737bbb71039bbb0b81032b93937b960711b604082015260600190565b601060029054906101000a90046001600160a01b03166001600160a01b0316636ab2fe586040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156134c757600080fd5b505af19250505080156134d8575060015b6135b2576134e4614212565b806308c379a00361353d57506134f8614269565b80613503575061353f565b6000805160206145e6833981519152816040516020016135239190614571565b60408051601f198184030181529082905261337991613f83565b505b6000805160206145e683398151915260405161359d9060208082526028908201527f50726f787920455448207472616e73666572206661696c65643a20756e6b6e6f6040820152673bb71032b93937b960c11b606082015260800190565b60405180910390a15060009695505050505050565b4760006135bf83836141ff565b9050801561363c5760408051888152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a188871015613429576000613614888b6141ff565b905060006136218261308b565b905061362d81846141b3565b9b9a5050505050505050505050565b6000805160206145e68339815191526040516136969060208082526024908201527f4e6f204554482072656365697665642061667465722070726f7879207472616e60408201526339b332b960e11b606082015260800190565b60405180910390a150600098975050505050505050565b600060646136bc6032826141ff565b6136c690846141c6565b6136d091906141dd565b9050600060646136e16032826141ff565b6136eb90866141c6565b6136f591906141dd565b6007549091506001600160a01b031663f305d71985308686868361371b42610e106141b3565b6040518863ffffffff1660e01b815260040161373c969594939291906144e4565b60606040518083038185885af193505050508015613777575060408051601f3d908101601f1916820190925261377491810190614434565b60015b61383157613783614212565b806308c379a0036137df5750613797614269565b806137a257506137e1565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad816040516137d19190613f83565b60405180910390a150611dc6565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051613824906020808252600190820152604560f81b604082015260600190565b60405180910390a1611dc6565b505060408051858152602081018790527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150505050565b600d54801580613881575081155b1561388a575050565b600061389682846141dd565b9050806000036138a557505050565b60005b828110156139e1576000600d82815481106138c5576138c561451f565b6000918252602090912001546001600160a01b0316905080158015906138f457506001600160a01b0381163014155b801561390e5750600a546001600160a01b03828116911614155b156139ce576000816001600160a01b03168460405160006040518083038185875af1925050503d8060008114613960576040519150601f19603f3d011682016040523d82523d6000602084013e613965565b606091505b50509050806139cc577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b116146040516139c390602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60405180910390a15b505b50806139d9816145b6565b9150506138a8565b5060408051848152602081018490527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c217910160405180910390a1505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316613aad5760405162461bcd60e51b8152602060048201526002602482015261543160f01b6044820152606401610a6d565b6001600160a01b038216613ae85760405162461bcd60e51b81526020600482015260026024820152612a1960f11b6044820152606401610a6d565b60008111613b1d5760405162461bcd60e51b8152602060048201526002602482015261543360f01b6044820152606401610a6d565b6001600160a01b03831660009081526020819052604090205481811015613b6b5760405162461bcd60e51b8152602060048201526002602482015261150d60f21b6044820152606401610a6d565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611dc6565b8015613ced5760006064613be66005856141c6565b613bf091906141dd565b90508015613ceb5760006064613c076019846141c6565b613c1191906141dd565b905060006064613c226019856141c6565b613c2c91906141dd565b90506000613c3a84876141ff565b9050613c47883086613a72565b613c52888883613a72565b82600e6000828254613c6491906141b3565b9250508190555081600f6000828254613c7d91906141b3565b90915550613cb6905088678ac7230489e80000613caf826001600160a01b031660009081526020819052604090205490565b1015613d50565b613ce287678ac7230489e80000613caf8a6001600160a01b031660009081526020819052604090205490565b50505050611dc6565b505b613cf8848484613a72565b613d2484678ac7230489e80000613caf876001600160a01b031660009081526020819052604090205490565b611dc683678ac7230489e80000613caf866001600160a01b031660009081526020819052604090205490565b600a546001600160a01b03838116911614801590613d7757506001600160a01b0382163014155b15610d4857808015613da257506001600160a01b0382166000908152600c602052604090205460ff16155b15613e0e57506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b80158015613e3457506001600160a01b0382166000908152600c602052604090205460ff165b15610d48576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d54811015610e1357826001600160a01b0316600d8281548110613e8157613e8161451f565b6000918252602090912001546001600160a01b031603613f4d57600d8054613eab906001906141ff565b81548110613ebb57613ebb61451f565b600091825260209091200154600d80546001600160a01b039092169183908110613ee757613ee761451f565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d805480613f2657613f266145cf565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b80613f57816145b6565b915050613e5a565b60005b83811015613f7a578181015183820152602001613f62565b50506000910152565b6020815260008251806020840152613fa2816040850160208701613f5f565b601f01601f19169190910160400192915050565b6001600160a01b038116811461165a57600080fd5b60008060408385031215613fde57600080fd5b8235613fe981613fb6565b946020939093013593505050565b60008060006060848603121561400c57600080fd5b833561401781613fb6565b9250602084013561402781613fb6565b929592945050506040919091013590565b60006020828403121561404a57600080fd5b5035919050565b60006020828403121561406357600080fd5b813561406e81613fb6565b9392505050565b600081518084526020808501945080840160005b838110156140ae5781516001600160a01b031687529582019590820190600101614089565b509495945050505050565b60208152600061406e6020830184614075565b801515811461165a57600080fd5b600080604083850312156140ed57600080fd5b82356140f881613fb6565b91506020830135614108816140cc565b809150509250929050565b6000806040838503121561412657600080fd5b50508035926020909101359150565b6000806040838503121561414857600080fd5b823561415381613fb6565b9150602083013561410881613fb6565b600181811c9082168061417757607f821691505b60208210810361419757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156109ba576109ba61419d565b80820281158282048414176109ba576109ba61419d565b6000826141fa57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156109ba576109ba61419d565b600060033d111561422b5760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff8111828210171561426257634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156142775790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156142a757505050505090565b82850191508151818111156142bf5750505050505090565b843d87010160208285010111156142d95750505050505090565b6142e86020828601018761422e565b509095945050505050565b60208082526022908201527f556e6b6e6f776e206572726f7220696e207472696767657250726f63657373696040820152616e6760f01b606082015260800190565b6001600160a01b03929092168252602082015260400190565b60006020828403121561436057600080fd5b815161406e816140cc565b602080825260029082015261523160f01b604082015260600190565b60006020828403121561439957600080fd5b5051919050565b60208082526019908201527f4e6f204554482072656365697665642066726f6d207377617000000000000000604082015260600190565b6000602082840312156143e957600080fd5b815161406e81613fb6565b602080825260029082015261139560f21b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008060006060848603121561444957600080fd5b8351925060208401519150604084015190509250925092565b60208082526012908201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b604082015260600190565b7f4661696c656420746f20736574206661726d657220636f6e7472616374206f6e815267010383937bc3c9d160c51b6020820152600082516144d7816028850160208701613f5f565b9190910160280192915050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a06040820152600061455460a0830186614075565b6001600160a01b0394909416606083015250608001529392505050565b7f50726f787920455448207472616e73666572206661696c65643a2000000000008152600082516145a981601b850160208701613f5f565b91909101601b0192915050565b6000600182016145c8576145c861419d565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec0723a264697066735822122006af8156c9a091de0f92d96ef3197cb2aeb142c8fb267846b05232599af3011864736f6c63430008110033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c8063801b51d91161015a578063c0d78655116100c1578063e3a8fa551161007a578063e3a8fa551461085e578063e6efd91a14610866578063e85ceee814610886578063ed9cacfe146108bf578063f2fde38b146108d4578063fd7c9fab146108f457600080fd5b8063c0d7865514610768578063c84a705c14610788578063d4d7b19a146107a8578063d720a2a8146107d8578063dd62ed3e146107f8578063df8408fe1461083e57600080fd5b8063975b87e811610113578063975b87e81461068e578063a8602fea146106ae578063a9059cbb146106ce578063b70143c9146106ee578063b77e895c1461070e578063b9276e4b1461074757600080fd5b8063801b51d9146105f1578063808a5457146106115780638129fc1c146106315780638a8c523c146106465780638da5cb5b1461065b57806395d89b411461067957600080fd5b80634ada218b116101fe5780636a3c68fc116101b75780636a3c68fc146105125780636d62062a146105325780636ec4be901461056b57806370a08231146105915780637136982b146105c75780637ac84fc1146105dc57600080fd5b80634ada218b146104415780635342acb414610462578063573761981461049b5780635d76b04c146104bb5780635fe8e7cc146104d057806362b6327a146104f257600080fd5b806323b872dd1161025057806323b872dd146103785780632a11ced014610398578063313ce567146103d0578063397883d2146103ec578063461a3a95146104015780634626402b1461042157600080fd5b806306fdde03146102d457806308dee2b4146102ff578063095ea7b31461031e57806317700f011461034e57806318160ddd1461036357600080fd5b366102cf5734156102cd5760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a25b005b600080fd5b3480156102e057600080fd5b506102e9610914565b6040516102f69190613f83565b60405180910390f35b34801561030b57600080fd5b50600e545b6040519081526020016102f6565b34801561032a57600080fd5b5061033e610339366004613fcb565b6109a6565b60405190151581526020016102f6565b34801561035a57600080fd5b506102cd6109c0565b34801561036f57600080fd5b50600254610310565b34801561038457600080fd5b5061033e610393366004613ff7565b6109d7565b3480156103a457600080fd5b506103b86103b3366004614038565b6109fb565b6040516001600160a01b0390911681526020016102f6565b3480156103dc57600080fd5b50604051601281526020016102f6565b3480156103f857600080fd5b506102cd610a25565b34801561040d57600080fd5b506009546103b8906001600160a01b031681565b34801561042d57600080fd5b50600b546103b8906001600160a01b031681565b34801561044d57600080fd5b5060105461033e90600160b81b900460ff1681565b34801561046e57600080fd5b5061033e61047d366004614051565b6001600160a01b031660009081526011602052604090205460ff1690565b3480156104a757600080fd5b506102cd6104b6366004613fcb565b610d4c565b3480156104c757600080fd5b50600f54610310565b3480156104dc57600080fd5b506104e5610e18565b6040516102f691906140b9565b3480156104fe57600080fd5b506007546103b8906001600160a01b031681565b34801561051e57600080fd5b506102cd61052d3660046140da565b610e79565b34801561053e57600080fd5b5061033e61054d366004614051565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561057757600080fd5b506010546103b8906201000090046001600160a01b031681565b34801561059d57600080fd5b506103106105ac366004614051565b6001600160a01b031660009081526020819052604090205490565b3480156105d357600080fd5b50600d54610310565b3480156105e857600080fd5b506102cd610eac565b3480156105fd57600080fd5b506102cd61060c3660046140da565b6112b4565b34801561061d57600080fd5b50600a546103b8906001600160a01b031681565b34801561063d57600080fd5b506102cd6112e7565b34801561065257600080fd5b506102cd61165d565b34801561066757600080fd5b506006546001600160a01b03166103b8565b34801561068557600080fd5b506102e961167a565b34801561069a57600080fd5b506102cd6106a9366004614113565b611689565b3480156106ba57600080fd5b506102cd6106c9366004614051565b611dcc565b3480156106da57600080fd5b5061033e6106e9366004613fcb565b611e69565b3480156106fa57600080fd5b506102cd610709366004614038565b611e77565b34801561071a57600080fd5b5061033e610729366004614051565b6001600160a01b031660009081526013602052604090205460ff1690565b34801561075357600080fd5b5060105461033e90600160b01b900460ff1681565b34801561077457600080fd5b506102cd610783366004614051565b612034565b34801561079457600080fd5b506102cd6107a3366004614051565b612099565b3480156107b457600080fd5b5061033e6107c3366004614051565b600c6020526000908152604090205460ff1681565b3480156107e457600080fd5b506102cd6107f3366004614038565b61239e565b34801561080457600080fd5b50610310610813366004614135565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561084a57600080fd5b506102cd6108593660046140da565b6125c6565b6102cd6125f9565b34801561087257600080fd5b506102cd6108813660046140da565b612847565b34801561089257600080fd5b5061033e6108a1366004614051565b6001600160a01b031660009081526012602052604090205460ff1690565b3480156108cb57600080fd5b506102cd61287a565b3480156108e057600080fd5b506102cd6108ef366004614051565b612afe565b34801561090057600080fd5b506008546103b8906001600160a01b031681565b60606003805461092390614163565b80601f016020809104026020016040519081016040528092919081815260200182805461094f90614163565b801561099c5780601f106109715761010080835404028352916020019161099c565b820191906000526020600020905b81548152906001019060200180831161097f57829003601f168201915b5050505050905090565b6000336109b4818585612b4a565b60019150505b92915050565b6109c8612bfc565b6010805460ff60b81b19169055565b6000336109e5858285612c4a565b6109f0858585612cb2565b506001949350505050565b600d8181548110610a0b57600080fd5b6000918252602090912001546001600160a01b0316905081565b610a2d612bfc565b6000600e541180610a4057506000600f54115b610a765760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d54610aaa5760405162461bcd60e51b815260206004820152600260248201526109c960f31b6044820152606401610a6d565b600f54600e5468056bc75e2d6310000091600091610ac891906141b3565b905081811115610c8157600081610ae784670de0b6b3a76400006141c6565b610af191906141dd565b90506000670de0b6b3a764000082600e54610b0c91906141c6565b610b1691906141dd565b90506000670de0b6b3a764000083600f54610b3191906141c6565b610b3b91906141dd565b905081600e6000828254610b4f91906141ff565b9250508190555080600f6000828254610b6891906141ff565b9091555050600e8054600f80549285905583905560408051637ac84fc160e01b815290519192913091637ac84fc191600480830192600092919082900301818387803b158015610bb757600080fd5b505af1925050508015610bc8575060015b610c7857610bd4614212565b806308c379a003610c385750610be8614269565b80610bf35750610c3a565b6000805160206145e683398151915281604051610c109190613f83565b60405180910390a1610c2285846141b3565b600e55610c2f84836141b3565b600f5550610c78565b505b6000805160206145e6833981519152604051610c55906142f3565b60405180910390a1610c6784836141b3565b600e55610c7483826141b3565b600f555b50505050505050565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610cbc57600080fd5b505af1925050508015610ccd575060015b610d4857610cd9614212565b806308c379a003610d225750610ced614269565b80610cf85750610d24565b6000805160206145e683398151915281604051610d159190613f83565b60405180910390a1505050565b505b6000805160206145e6833981519152604051610d3f906142f3565b60405180910390a15b5050565b610d54612bfc565b306001600160a01b03831603610d915760405162461bcd60e51b815260206004820152600260248201526121a360f11b6044820152606401610a6d565b816001600160a01b031663a9059cbb610db26006546001600160a01b031690565b836040518363ffffffff1660e01b8152600401610dd0929190614335565b6020604051808303816000875af1158015610def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e13919061434e565b505050565b6060600d80548060200260200160405190810160405280929190818152602001828054801561099c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e52575050505050905090565b610e81612bfc565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600260055403610ece5760405162461bcd60e51b8152600401610a6d9061436b565b6002600555601054610100900460ff1615610f105760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610a6d565b6010805461ff001916610100179055600e54600f5481158015610f31575080155b15610f485750506010805461ff00191690556112ad565b68056bc75e2d631000006000610f5e83856141b3565b90508181111561100a57600081610f7d84670de0b6b3a76400006141c6565b610f8791906141dd565b9050670de0b6b3a7640000610f9c82876141c6565b610fa691906141dd565b9450670de0b6b3a7640000610fbb82866141c6565b610fc591906141dd565b9350610fd184866141b3565b915084600e6000828254610fe591906141ff565b9250508190555083600f6000828254610ffe91906141ff565b90915550611015915050565b6000600e819055600f555b60408051858152602081018590527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a16040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa15801561108c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b09190614387565b9050818110156111555784600e60008282546110cc91906141b3565b9250508190555083600f60008282546110e591906141b3565b90915550506010805461ff00191690556040516000805160206145e683398151915290611143906020808252601d908201527f496e73756666696369656e7420636f6e74726163742062616c616e6365000000604082015260600190565b60405180910390a150505050506112ad565b60075461116f9030906001600160a01b0316600019612b4a565b47600061117b8461308b565b9050806000036111cd5786600e600082825461119791906141b3565b9250508190555085600f60008282546111b091906141b3565b90915550506010805461ff0019169055506112ad95505050505050565b478281116112425787600e60008282546111e791906141b3565b9250508190555086600f600082825461120091906141b3565b90915550506040516000805160206145e683398151915290611221906143a0565b60405180910390a150506010805461ff0019169055506112ad945050505050565b600061124e84836141ff565b905060008661125d8b846141c6565b61126791906141dd565b9050600061127582846141ff565b9050811561128757611287828c6136ad565b80156112965761129681613873565b50506010805461ff00191690555050505050505050505b6001600555565b6112bc612bfc565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6112ef612bfc565b60105460ff16156113275760405162461bcd60e51b8152602060048201526002602482015261231960f11b6044820152606401610a6d565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015611386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113aa91906143d7565b600a80546001600160a01b0319166001600160a01b03929092169182179055611466576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611421573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144591906143d7565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b03166114a35760405162461bcd60e51b8152602060048201526002602482015261463360f01b6044820152606401610a6d565b6007546114bd9030906001600160a01b0316600019612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926114f59291169060001990600401614335565b6020604051808303816000875af1158015611514573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611538919061434e565b6115695760405162461bcd60e51b8152602060048201526002602482015261118d60f21b6044820152606401610a6d565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926115a19291169060001990600401614335565b6020604051808303816000875af11580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e4919061434e565b50600a5460405163095ea7b360e01b8152309163095ea7b391611617916001600160a01b03169060001990600401614335565b6020604051808303816000875af1158015611636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165a919061434e565b50565b611665612bfc565b6010805460ff60b81b1916600160b81b179055565b60606004805461092390614163565b611691612bfc565b600082116116b15760405162461bcd60e51b8152600401610a6d906143f4565b600081116116e65760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610a6d565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa158015611723573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117479190614387565b101561177a5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610a6d565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156117c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e69190614387565b10156118195760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610a6d565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061184d90339030908690600401614410565b6020604051808303816000875af115801561186c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611890919061434e565b6118c15760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610a6d565b6007546118d99030906001600160a01b031684612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261190f929116908590600401614335565b6020604051808303816000875af115801561192e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611952919061434e565b506007546009546001600160a01b039182169163e8e3370091309116858560008033611980426102586141b3565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1925050508015611a18575060408051601f3d908101601f19168201909252611a1591810190614434565b60015b611ca057611a24614212565b806308c379a003611b675750611a38614269565b80611a435750611b69565b600754611a5c9030906001600160a01b03166000612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611a9392911690600090600401614335565b6020604051808303816000875af1158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad6919061434e565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611b099033908690600401614335565b6020604051808303816000875af1158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c919061434e565b508060405162461bcd60e51b8152600401610a6d9190613f83565b505b600754611b829030906001600160a01b03166000612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611bb992911690600090600401614335565b6020604051808303816000875af1158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc919061434e565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611c2f9033908590600401614335565b6020604051808303816000875af1158015611c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c72919061434e565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b6044820152606401610a6d565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614387565b90508015610e135760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611d839033908590600401614335565b6020604051808303816000875af1158015611da2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc6919061434e565b50505050565b611dd4612bfc565b6001600160a01b038116611e0f5760405162461bcd60e51b81526020600482015260026024820152615a4160f01b6044820152606401610a6d565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb49101610d3f565b6000336109b4818585612cb2565b611e7f612bfc565b600260055403611ea15760405162461bcd60e51b8152600401610a6d9061436b565b600260055580611ef35760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610a6d565b30600090815260208190526040902054811115611f495760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610a6d565b601054600160b01b900460ff16611f725760405162461bcd60e51b8152600401610a6d90614462565b476000611f7e8361308b565b905080600003611fd05760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f20455448207265636569766564000000006044820152606401610a6d565b47828111611ff05760405162461bcd60e51b8152600401610a6d906143a0565b60408051858152602081018490527f83dcf65fd6004d3203d0b493e4d86ef58c3565fa57812dbd28c5a903e247c44f910160405180910390a1505060016005555050565b61203c612bfc565b6001600160a01b0381166120775760405162461bcd60e51b815260206004820152600260248201526124a960f11b6044820152606401610a6d565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6120a1612bfc565b6001600160a01b0381166120e95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610a6d565b806001600160a01b0316639c0b7d466040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612143575060408051601f3d908101601f19168201909252612140918101906143d7565b60015b6121885760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081c1c9bde1e4818dbdb9d1c9858dd60521b6044820152606401610a6d565b6001600160a01b038116158015906121a957506001600160a01b0381163014155b156122045760405162461bcd60e51b815260206004820152602560248201527f50726f787920616c72656164792073657420746f20616e6f7468657220636f6e6044820152641d1c9858dd60da1b6064820152608401610a6d565b506010805460ff60b01b196001600160a01b0384166201000081029190911662010000600160b81b031990921691909117600160b01b179091556040516324872d5b60e21b815230600482015263921cb56c90602401600060405180830381600087803b15801561227457600080fd5b505af1925050508015612285575060015b61236757612291614212565b806308c379a0036122f857506122a5614269565b806122b057506122fa565b6000805160206145e6833981519152816040516020016122d0919061448e565b60408051601f19818403018152908290526122ea91613f83565b60405180910390a150612367565b505b6000805160206145e683398151915260405161235e906020808252602e908201527f556e6b6e6f776e206572726f722073657474696e67206661726d657220636f6e60408201526d7472616374206f6e2070726f787960901b606082015260800190565b60405180910390a15b6040516001600160a01b038216907f65c4b302ff508168aab64a17ebe745806b65caba61b745d8aff18fb69cb0937290600090a250565b6123a6612bfc565b6002600554036123c85760405162461bcd60e51b8152600401610a6d9061436b565b6002600555806123ea5760405162461bcd60e51b8152600401610a6d906143f4565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015612427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244b9190614387565b101561247e5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610a6d565b601054600160b01b900460ff166124a75760405162461bcd60e51b8152600401610a6d90614462565b6007546124c19030906001600160a01b0316600019612b4a565b4760006124cd8361308b565b90508060000361251f5760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f20455448207265636569766564000000006044820152606401610a6d565b4782811161253f5760405162461bcd60e51b8152600401610a6d906143a0565b600061254b84836141ff565b90506000606461255c6019846141c6565b61256691906141dd565b9050600060646125776019856141c6565b61258191906141dd565b905081156125a9576125a982606461259a60198b6141c6565b6125a491906141dd565b6136ad565b80156125b8576125b881613873565b505060016005555050505050565b6125ce612bfc565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b612601612bfc565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa15801561263f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126639190614387565b9050600081116126855760405162461bcd60e51b8152600401610a6d906143f4565b600034116126ba5760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610a6d565b6007546126d29030906001600160a01b031683612b4a565b6007546001600160a01b031663f305d719343084600080336126f6426102586141b3565b6040518863ffffffff1660e01b8152600401612717969594939291906144e4565b60606040518083038185885af193505050508015612752575060408051601f3d908101601f1916820190925261274f91810190614434565b60015b6128095761275e614212565b806308c379a0036127c25750612772614269565b8061277d57506127c4565b6007546127969030906001600160a01b03166000612b4a565b60405133904780156108fc02916000818181858888f19350505050158015611b4c573d6000803e3d6000fd5b505b6007546127dd9030906001600160a01b03166000612b4a565b60405133904780156108fc02916000818181858888f19350505050158015611c72573d6000803e3d6000fd5b5050604080518381523460208201527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150565b61284f612bfc565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b612882612bfc565b60075461289c9030906001600160a01b0316600019612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926128d49291169060001990600401614335565b6020604051808303816000875af192505050801561290f575060408051601f3d908101601f1916820190925261290c9181019061434e565b60015b1561296557506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca9261295c926001600160a01b039182169291169060001990614410565b60405180910390a15b600a546001600160a01b031615612afc57600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926129ae9291169060001990600401614335565b6020604051808303816000875af19250505080156129e9575060408051601f3d908101601f191682019092526129e69181019061434e565b60015b15612a3f5750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612a36926001600160a01b039182169291169060001990614410565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b391612a71916001600160a01b03169060001990600401614335565b6020604051808303816000875af1925050508015612aac575060408051601f3d908101601f19168201909252612aa99181019061434e565b60015b15612afc5750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca91612af39130916001600160a01b03169060001990614410565b60405180910390a15b565b612b06612bfc565b6001600160a01b038116612b415760405162461bcd60e51b81526020600482015260026024820152614f3160f01b6044820152606401610a6d565b61165a81613a20565b6001600160a01b03831615801590612b6a57506001600160a01b03821615155b612b9b5760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610a6d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b33612c0f6006546001600160a01b031690565b6001600160a01b031614612afc5760405162461bcd60e51b8152602060048201526002602482015261279960f11b6044820152606401610a6d565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205481811015612ca55760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610a6d565b611dc68484848403612b4a565b6001600160a01b038316612ced5760405162461bcd60e51b8152602060048201526002602482015261543160f01b6044820152606401610a6d565b6001600160a01b038216612d285760405162461bcd60e51b81526020600482015260026024820152612a1960f11b6044820152606401610a6d565b60008111612d5d5760405162461bcd60e51b8152602060048201526002602482015261543360f01b6044820152606401610a6d565b601054610100900460ff1615612d7857610e13838383613a72565b6001600160a01b03831660009081526011602052604081205460ff1680612db757506001600160a01b03831660009081526011602052604090205460ff165b60105490159150600160b81b900460ff16158015612df95750600a546001600160a01b0385811691161480612df95750600a546001600160a01b038481169116145b15612e02575060005b601054600160b81b900460ff168015612e3457506001600160a01b03841660009081526012602052604090205460ff16155b8015612e5957506001600160a01b03831660009081526012602052604090205460ff16155b15612f4557600a546001600160a01b0390811690841603612ed2576001600160a01b03841660009081526013602052604090205460ff16612ed25760405162461bcd60e51b8152602060048201526013602482015272139bdd08185b1b1bddd959081d1bc81cd95b1b606a1b6044820152606401610a6d565b600a546001600160a01b0390811690851603612f45576001600160a01b03831660009081526014602052604090205460ff16612f455760405162461bcd60e51b81526020600482015260126024820152714e6f7420616c6c6f77656420746f2062757960701b6044820152606401610a6d565b612f5184848484613bd1565b808015612f6b5750600a546001600160a01b038481169116145b8015612f7f5750601054610100900460ff16155b8015612f9a57506000600f54600e54612f9891906141b3565b115b15611dc657600f54600e54678ac7230489e80000918291612fbb91906141b3565b106130845768056bc75e2d63100000600f54600e54612fda91906141b3565b111561303657306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561301b57600080fd5b505af192505050801561302c575060015b1561308457613084565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561307157600080fd5b505af1925050508015613082575060015b505b5050505050565b60008160000361309d57506000919050565b601054600160b01b900460ff166130c65760405162461bcd60e51b8152600401610a6d90614462565b816802b5e3af16b18800008111156130e457506802b5e3af16b18800005b60408051600280825260608201835260009260208301908036833701905050905030816000815181106131195761311961451f565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613172573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319691906143d7565b816001815181106131a9576131a961451f565b6001600160a01b0392831660209182029290920101526007546000916131d491309116600019612b4a565b60006131e242610e106141b3565b60075460105460405163791ac94760e01b815292935047926001600160a01b039283169263791ac9479261322b928a9289928b9262010000909104909116908990600401614535565b600060405180830381600087803b15801561324557600080fd5b505af1925050508015613256575060015b61347757613262614212565b806308c379a00361338f5750613276614269565b806132815750613391565b80511561335c57604080518082019091526002815261453560f01b6020918201528151908201207ff3465d5cb5831136b3b4e82db30aaef6a41154c3cba2fd4f528d2b5dde880dc40161335c5760006132db6002886141dd565b9050801561335a576000805160206145e683398151915260405161333c9060208082526023908201527f4535206572726f722c207265747279696e6720776974682068616c6620616d6f6040820152621d5b9d60ea1b606082015260800190565b60405180910390a161334d8161308b565b9998505050505050505050565b505b6000805160206145e6833981519152816040516133799190613f83565b60405180910390a1506000979650505050505050565b505b600061339e6002876141dd565b90506000811180156133b05750858114155b15613435576000805160206145e6833981519152604051613418906020808252602d908201527f556e6b6e6f776e2073776170206572726f722c207265747279696e672077697460408201526c1a081a185b1988185b5bdd5b9d609a1b606082015260800190565b60405180910390a16134298161308b565b98975050505050505050565b6000805160206145e6833981519152604051613379906020808252601290820152712ab735b737bbb71039bbb0b81032b93937b960711b604082015260600190565b601060029054906101000a90046001600160a01b03166001600160a01b0316636ab2fe586040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156134c757600080fd5b505af19250505080156134d8575060015b6135b2576134e4614212565b806308c379a00361353d57506134f8614269565b80613503575061353f565b6000805160206145e6833981519152816040516020016135239190614571565b60408051601f198184030181529082905261337991613f83565b505b6000805160206145e683398151915260405161359d9060208082526028908201527f50726f787920455448207472616e73666572206661696c65643a20756e6b6e6f6040820152673bb71032b93937b960c11b606082015260800190565b60405180910390a15060009695505050505050565b4760006135bf83836141ff565b9050801561363c5760408051888152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a188871015613429576000613614888b6141ff565b905060006136218261308b565b905061362d81846141b3565b9b9a5050505050505050505050565b6000805160206145e68339815191526040516136969060208082526024908201527f4e6f204554482072656365697665642061667465722070726f7879207472616e60408201526339b332b960e11b606082015260800190565b60405180910390a150600098975050505050505050565b600060646136bc6032826141ff565b6136c690846141c6565b6136d091906141dd565b9050600060646136e16032826141ff565b6136eb90866141c6565b6136f591906141dd565b6007549091506001600160a01b031663f305d71985308686868361371b42610e106141b3565b6040518863ffffffff1660e01b815260040161373c969594939291906144e4565b60606040518083038185885af193505050508015613777575060408051601f3d908101601f1916820190925261377491810190614434565b60015b61383157613783614212565b806308c379a0036137df5750613797614269565b806137a257506137e1565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad816040516137d19190613f83565b60405180910390a150611dc6565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051613824906020808252600190820152604560f81b604082015260600190565b60405180910390a1611dc6565b505060408051858152602081018790527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150505050565b600d54801580613881575081155b1561388a575050565b600061389682846141dd565b9050806000036138a557505050565b60005b828110156139e1576000600d82815481106138c5576138c561451f565b6000918252602090912001546001600160a01b0316905080158015906138f457506001600160a01b0381163014155b801561390e5750600a546001600160a01b03828116911614155b156139ce576000816001600160a01b03168460405160006040518083038185875af1925050503d8060008114613960576040519150601f19603f3d011682016040523d82523d6000602084013e613965565b606091505b50509050806139cc577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b116146040516139c390602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60405180910390a15b505b50806139d9816145b6565b9150506138a8565b5060408051848152602081018490527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c217910160405180910390a1505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316613aad5760405162461bcd60e51b8152602060048201526002602482015261543160f01b6044820152606401610a6d565b6001600160a01b038216613ae85760405162461bcd60e51b81526020600482015260026024820152612a1960f11b6044820152606401610a6d565b60008111613b1d5760405162461bcd60e51b8152602060048201526002602482015261543360f01b6044820152606401610a6d565b6001600160a01b03831660009081526020819052604090205481811015613b6b5760405162461bcd60e51b8152602060048201526002602482015261150d60f21b6044820152606401610a6d565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611dc6565b8015613ced5760006064613be66005856141c6565b613bf091906141dd565b90508015613ceb5760006064613c076019846141c6565b613c1191906141dd565b905060006064613c226019856141c6565b613c2c91906141dd565b90506000613c3a84876141ff565b9050613c47883086613a72565b613c52888883613a72565b82600e6000828254613c6491906141b3565b9250508190555081600f6000828254613c7d91906141b3565b90915550613cb6905088678ac7230489e80000613caf826001600160a01b031660009081526020819052604090205490565b1015613d50565b613ce287678ac7230489e80000613caf8a6001600160a01b031660009081526020819052604090205490565b50505050611dc6565b505b613cf8848484613a72565b613d2484678ac7230489e80000613caf876001600160a01b031660009081526020819052604090205490565b611dc683678ac7230489e80000613caf866001600160a01b031660009081526020819052604090205490565b600a546001600160a01b03838116911614801590613d7757506001600160a01b0382163014155b15610d4857808015613da257506001600160a01b0382166000908152600c602052604090205460ff16155b15613e0e57506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b80158015613e3457506001600160a01b0382166000908152600c602052604090205460ff165b15610d48576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d54811015610e1357826001600160a01b0316600d8281548110613e8157613e8161451f565b6000918252602090912001546001600160a01b031603613f4d57600d8054613eab906001906141ff565b81548110613ebb57613ebb61451f565b600091825260209091200154600d80546001600160a01b039092169183908110613ee757613ee761451f565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d805480613f2657613f266145cf565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b80613f57816145b6565b915050613e5a565b60005b83811015613f7a578181015183820152602001613f62565b50506000910152565b6020815260008251806020840152613fa2816040850160208701613f5f565b601f01601f19169190910160400192915050565b6001600160a01b038116811461165a57600080fd5b60008060408385031215613fde57600080fd5b8235613fe981613fb6565b946020939093013593505050565b60008060006060848603121561400c57600080fd5b833561401781613fb6565b9250602084013561402781613fb6565b929592945050506040919091013590565b60006020828403121561404a57600080fd5b5035919050565b60006020828403121561406357600080fd5b813561406e81613fb6565b9392505050565b600081518084526020808501945080840160005b838110156140ae5781516001600160a01b031687529582019590820190600101614089565b509495945050505050565b60208152600061406e6020830184614075565b801515811461165a57600080fd5b600080604083850312156140ed57600080fd5b82356140f881613fb6565b91506020830135614108816140cc565b809150509250929050565b6000806040838503121561412657600080fd5b50508035926020909101359150565b6000806040838503121561414857600080fd5b823561415381613fb6565b9150602083013561410881613fb6565b600181811c9082168061417757607f821691505b60208210810361419757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156109ba576109ba61419d565b80820281158282048414176109ba576109ba61419d565b6000826141fa57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156109ba576109ba61419d565b600060033d111561422b5760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff8111828210171561426257634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156142775790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156142a757505050505090565b82850191508151818111156142bf5750505050505090565b843d87010160208285010111156142d95750505050505090565b6142e86020828601018761422e565b509095945050505050565b60208082526022908201527f556e6b6e6f776e206572726f7220696e207472696767657250726f63657373696040820152616e6760f01b606082015260800190565b6001600160a01b03929092168252602082015260400190565b60006020828403121561436057600080fd5b815161406e816140cc565b602080825260029082015261523160f01b604082015260600190565b60006020828403121561439957600080fd5b5051919050565b60208082526019908201527f4e6f204554482072656365697665642066726f6d207377617000000000000000604082015260600190565b6000602082840312156143e957600080fd5b815161406e81613fb6565b602080825260029082015261139560f21b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008060006060848603121561444957600080fd5b8351925060208401519150604084015190509250925092565b60208082526012908201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b604082015260600190565b7f4661696c656420746f20736574206661726d657220636f6e7472616374206f6e815267010383937bc3c9d160c51b6020820152600082516144d7816028850160208701613f5f565b9190910160280192915050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a06040820152600061455460a0830186614075565b6001600160a01b0394909416606083015250608001529392505050565b7f50726f787920455448207472616e73666572206661696c65643a2000000000008152600082516145a981601b850160208701613f5f565b91909101601b0192915050565b6000600182016145c8576145c861419d565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec0723a264697066735822122006af8156c9a091de0f92d96ef3197cb2aeb142c8fb267846b05232599af3011864736f6c63430008110033

Deployed Bytecode Sourcemap

9589:33945:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37618:9;:13;37614:85;;37653:34;;37677:9;160:25:1;;37665:10:0;;37653:34;;148:2:1;133:18;37653:34:0;;;;;;;37614:85;9589:33945;;;;;2958:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30564:118;;;;;;;;;;-1:-1:-1;30651:23:0;;30564:118;;;160:25:1;;;148:2;133:18;30564:118:0;14:177:1;3825:190:0;;;;;;;;;;-1:-1:-1;3825:190:0;;;;;:::i;:::-;;:::i;:::-;;;1473:14:1;;1466:22;1448:41;;1436:2;1421:18;3825:190:0;1308:187:1;42273:86:0;;;;;;;;;;;;;:::i;3252:99::-;;;;;;;;;;-1:-1:-1;3331:12:0;;3252:99;;4023:250;;;;;;;;;;-1:-1:-1;4023:250:0;;;;;:::i;:::-;;:::i;10589:24::-;;;;;;;;;;-1:-1:-1;10589:24:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2310:32:1;;;2292:51;;2280:2;2265:18;10589:24:0;2146:203:1;3160:84:0;;;;;;;;;;-1:-1:-1;3160:84:0;;3234:2;2496:36:1;;2484:2;2469:18;3160:84:0;2354:184:1;30863:2580:0;;;;;;;;;;;;;:::i;10413:25::-;;;;;;;;;;-1:-1:-1;10413:25:0;;;;-1:-1:-1;;;;;10413:25:0;;;10480:29;;;;;;;;;;-1:-1:-1;10480:29:0;;;;-1:-1:-1;;;;;10480:29:0;;;11723:26;;;;;;;;;;-1:-1:-1;11723:26:0;;;;-1:-1:-1;;;11723:26:0;;;;;;42971:126;;;;;;;;;;-1:-1:-1;42971:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;43062:27:0;43038:4;43062:27;;;:18;:27;;;;;;;;;42971:126;30330:183;;;;;;;;;;-1:-1:-1;30330:183:0;;;;;:::i;:::-;;:::i;30690:114::-;;;;;;;;;;-1:-1:-1;30775:21:0;;30690:114;;26333:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10315:41::-;;;;;;;;;;-1:-1:-1;10315:41:0;;;;-1:-1:-1;;;;;10315:41:0;;;42831:128;;;;;;;;;;-1:-1:-1;42831:128:0;;;;;:::i;:::-;;:::i;43411:120::-;;;;;;;;;;-1:-1:-1;43411:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;43499:24:0;43475:4;43499:24;;;:15;:24;;;;;;;;;43411:120;11637:24;;;;;;;;;;-1:-1:-1;11637:24:0;;;;;;;-1:-1:-1;;;;;11637:24:0;;;3359:118;;;;;;;;;;-1:-1:-1;3359:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;26223:98;;;;;;;;;;-1:-1:-1;26299:7:0;:14;26223:98;;16145:3867;;;;;;;;;;;;;:::i;42515:162::-;;;;;;;;;;-1:-1:-1;42515:162:0;;;;;:::i;:::-;;:::i;10445:28::-;;;;;;;;;;-1:-1:-1;10445:28:0;;;;-1:-1:-1;;;;;10445:28:0;;;12810:836;;;;;;;;;;;;;:::i;42177:84::-;;;;;;;;;;;;;:::i;1946:87::-;;;;;;;;;;-1:-1:-1;2019:6:0;;-1:-1:-1;;;;;2019:6:0;1946:87;;3057:95;;;;;;;;;;;;;:::i;26484:2260::-;;;;;;;;;;-1:-1:-1;26484:2260:0;;;;;:::i;:::-;;:::i;35489:319::-;;;;;;;;;;-1:-1:-1;35489:319:0;;;;;:::i;:::-;;:::i;3485:182::-;;;;;;;;;;-1:-1:-1;3485:182:0;;;;;:::i;:::-;;:::i;34483:948::-;;;;;;;;;;-1:-1:-1;34483:948:0;;;;;:::i;:::-;;:::i;43277:122::-;;;;;;;;;;-1:-1:-1;43277:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;43366:25:0;43342:4;43366:25;;;:16;:25;;;;;;;;;43277:122;11668:24;;;;;;;;;;-1:-1:-1;11668:24:0;;;;-1:-1:-1;;;11668:24:0;;;;;;30156:166;;;;;;;;;;-1:-1:-1;30156:166:0;;;;;:::i;:::-;;:::i;37745:1415::-;;;;;;;;;;-1:-1:-1;37745:1415:0;;;;;:::i;:::-;;:::i;10542:40::-;;;;;;;;;;-1:-1:-1;10542:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;35859:1603;;;;;;;;;;-1:-1:-1;35859:1603:0;;;;;:::i;:::-;;:::i;3675:142::-;;;;;;;;;;-1:-1:-1;3675:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;3782:18:0;;;3755:7;3782:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3675:142;42371:132;;;;;;;;;;-1:-1:-1;42371:132:0;;;;;:::i;:::-;;:::i;28829:1319::-;;;:::i;42689:130::-;;;;;;;;;;-1:-1:-1;42689:130:0;;;;;:::i;:::-;;:::i;43109:156::-;;;;;;;;;;-1:-1:-1;43109:156:0;;;;;:::i;:::-;-1:-1:-1;;;;;43215:42:0;43191:4;43215:42;;;:33;:42;;;;;;;;;43109:156;33489:958;;;;;;;;;;;;;:::i;2149:165::-;;;;;;;;;;-1:-1:-1;2149:165:0;;;;;:::i;:::-;;:::i;10363:43::-;;;;;;;;;;-1:-1:-1;10363:43:0;;;;-1:-1:-1;;;;;10363:43:0;;;2958:91;3003:13;3036:5;3029:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2958:91;:::o;3825:190::-;3899:4;3932:10;3953:32;3932:10;3969:7;3978:6;3953:8;:32::i;:::-;4003:4;3996:11;;;3825:190;;;;;:::o;42273:86::-;1905:13;:11;:13::i;:::-;42329:14:::1;:22:::0;;-1:-1:-1;;;;42329:22:0::1;::::0;;42273:86::o;4023:250::-;4111:4;4146:10;4167:38;4183:4;4146:10;4198:6;4167:15;:38::i;:::-;4216:27;4226:4;4232:2;4236:6;4216:9;:27::i;:::-;-1:-1:-1;4261:4:0;;4023:250;-1:-1:-1;;;;4023:250:0:o;10589:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10589:24:0;;-1:-1:-1;10589:24:0;:::o;30863:2580::-;1905:13;:11;:13::i;:::-;30956:1:::1;30930:23;;:27;:56;;;;30985:1;30961:21;;:25;30930:56;30922:71;;;::::0;-1:-1:-1;;;30922:71:0;;5737:2:1;30922:71:0::1;::::0;::::1;5719:21:1::0;5776:1;5756:18;;;5749:29;-1:-1:-1;;;5794:18:1;;;5787:32;5836:18;;30922:71:0::1;;;;;;;;;31012:7;:14:::0;31004:33:::1;;;::::0;-1:-1:-1;;;31004:33:0;;6067:2:1;31004:33:0::1;::::0;::::1;6049:21:1::0;6106:1;6086:18;;;6079:29;-1:-1:-1;;;6124:18:1;;;6117:32;6166:18;;31004:33:0::1;5865:325:1::0;31004:33:0::1;31261:21;::::0;31235:23:::1;::::0;31135:12:::1;::::0;31108:24:::1;::::0;31235:47:::1;::::0;31261:21;31235:47:::1;:::i;:::-;31206:76;;31417:16;31396:18;:37;31392:2044;;;31481:13;31523:18:::0;31497:23:::1;:16:::0;31516:4:::1;31497:23;:::i;:::-;:44;;;;:::i;:::-;31481:60;;31556:30;31623:4;31615:5;31589:23;;:31;;;;:::i;:::-;:38;;;;:::i;:::-;31556:71;;31642:28;31705:4;31697:5;31673:21;;:29;;;;:::i;:::-;:36;;;;:::i;:::-;31642:67;;31812:22;31785:23;;:49;;;;;;;:::i;:::-;;;;;;;;31874:20;31849:21;;:45;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;32006:23:0::1;::::0;;32079:21:::1;::::0;;32176:48;;;;32239:44;;;32316:33:::1;::::0;;-1:-1:-1;;;32316:33:0;;;;32006:23;;32079:21;32316:4:::1;::::0;:31:::1;::::0;:33:::1;::::0;;::::1;::::0;31969:34:::1;::::0;32316:33;;;;;;;31969:34;32316:4;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;32312:760;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;32476:6:0::1;32465:18;;;;;;:::i;:::-;;;;;;;;32581:51;32610:22:::0;32581:26;:51:::1;:::i;:::-;32555:23;:77:::0;32675:47:::1;32702:20:::0;32675:24;:47:::1;:::i;:::-;32651:21;:71:::0;-1:-1:-1;32312:760:0::1;;;;;-1:-1:-1::0;;;;;;;;;;;32769:48:0::1;;;;;:::i;:::-;;;;;;;;32915:51;32944:22:::0;32915:26;:51:::1;:::i;:::-;32889:23;:77:::0;33009:47:::1;33036:20:::0;33009:24;:47:::1;:::i;:::-;32985:21;:71:::0;32312:760:::1;31435:1648;;;;;30911:2532;;30863:2580::o:0;31392:2044::-:1;33147:4;-1:-1:-1::0;;;;;33147:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;33143:282;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;33307:6:0::1;33296:18;;;;;;:::i;:::-;;;;;;;;33238:92;30911:2532;;30863:2580::o:0;33143:282::-:1;;;-1:-1:-1::0;;;;;;;;;;;33361:48:0::1;;;;;:::i;:::-;;;;;;;;33143:282;30911:2532;;30863:2580::o:0;30330:183::-;1905:13;:11;:13::i;:::-;30441:4:::1;-1:-1:-1::0;;;;;30423:23:0;::::1;::::0;30415:38:::1;;;::::0;-1:-1:-1;;;30415:38:0;;8933:2:1;30415:38:0::1;::::0;::::1;8915:21:1::0;8972:1;8952:18;;;8945:29;-1:-1:-1;;;8990:18:1;;;8983:32;9032:18;;30415:38:0::1;8731:325:1::0;30415:38:0::1;30471:6;-1:-1:-1::0;;;;;30464:23:0::1;;30488:7;2019:6:::0;;-1:-1:-1;;;;;2019:6:0;;1946:87;30488:7:::1;30497;30464:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30330:183:::0;;:::o;26333:96::-;26378:16;26414:7;26407:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26407:14:0;;;;;;;;;;;;;;;;;;;;;;26333:96;:::o;42831:128::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;42917:24:0;;;::::1;;::::0;;;:15:::1;:24;::::0;;;;:34;;-1:-1:-1;;42917:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42831:128::o;16145:3867::-;1199:1;1345:7;;:19;1337:34;;;;-1:-1:-1;;;1337:34:0;;;;;;;:::i;:::-;1199:1;1382:7;:18;16225:7:::1;::::0;::::1;::::0;::::1;;;16224:8;16216:23;;;::::0;-1:-1:-1;;;16216:23:0;;10122:2:1;16216:23:0::1;::::0;::::1;10104:21:1::0;10161:1;10141:18;;;10134:29;-1:-1:-1;;;10179:18:1;;;10172:32;10221:18;;16216:23:0::1;9920:325:1::0;16216:23:0::1;16250:7;:14:::0;;-1:-1:-1;;16250:14:0::1;;;::::0;;16314:23:::1;::::0;16375:21:::1;::::0;16421:23;;:48;::::1;;;-1:-1:-1::0;16448:21:0;;16421:48:::1;16417:117;;;-1:-1:-1::0;;16486:7:0::1;:15:::0;;-1:-1:-1;;16486:15:0::1;::::0;;16516:7:::1;;16417:117;16631:12;16604:24;16730:37;16751:16:::0;16730:18;:37:::1;:::i;:::-;16702:65;;16901:16;16881:17;:36;16877:694;;;16965:13;17007:17:::0;16981:23:::1;:16:::0;17000:4:::1;16981:23;:::i;:::-;:43;;;;:::i;:::-;16965:59:::0;-1:-1:-1;17089:4:0::1;17060:26;16965:59:::0;17060:18;:26:::1;:::i;:::-;:33;;;;:::i;:::-;17039:54:::0;-1:-1:-1;17154:4:0::1;17127:24;17146:5:::0;17127:16;:24:::1;:::i;:::-;:31;;;;:::i;:::-;17108:50:::0;-1:-1:-1;17193:37:0::1;17108:50:::0;17193:18;:37:::1;:::i;:::-;17173:57;;17333:18;17306:23;;:45;;;;;;;:::i;:::-;;;;;;;;17391:16;17366:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;16877:694:0::1;::::0;-1:-1:-1;;16877:694:0::1;;17518:1;17492:23;:27:::0;;;17534:21:::1;:25:::0;16877:694:::1;17596:52;::::0;;10424:25:1;;;10480:2;10465:18;;10458:34;;;17596:52:0::1;::::0;10397:18:1;17596:52:0::1;;;;;;;17737:46;::::0;-1:-1:-1;;;17737:46:0;;17752:4:::1;17737:46;::::0;::::1;2292:51:1::0;;;17711:23:0::1;::::0;17737:31:::1;::::0;2265:18:1;;17737:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17711:72;;17816:17;17798:15;:35;17794:385;;;17979:18;17952:23;;:45;;;;;;;:::i;:::-;;;;;;;;18037:16;18012:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;18068:7:0::1;:15:::0;;-1:-1:-1;;18068:15:0::1;::::0;;18103:43:::1;::::0;-1:-1:-1;;;;;;;;;;;18103:43:0;::::1;::::0;10894:2:1;10876:21;;;10933:2;10913:18;;;10906:30;10972:31;10967:2;10952:18;;10945:59;11036:2;11021:18;;10692:353;18103:43:0::1;;;;;;;;18161:7;;;;;;;17794:385;18261:16;::::0;18229:69:::1;::::0;18246:4:::1;::::0;-1:-1:-1;;;;;18261:16:0::1;-1:-1:-1::0;;18229:8:0::1;:69::i;:::-;18394:21;18366:25;18516:31;18529:17:::0;18516:12:::1;:31::i;:::-;18494:53;;18572:11;18587:1;18572:16:::0;18568:280:::1;;18711:18;18684:23;;:45;;;;;;;:::i;:::-;;;;;;;;18769:16;18744:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;18800:7:0::1;:15:::0;;-1:-1:-1;;18800:15:0::1;::::0;;-1:-1:-1;18830:7:0::1;::::0;-1:-1:-1;;;;;;18830:7:0::1;18568:280;18946:21;18982:39:::0;;::::1;18978:355;;19137:18;19110:23;;:45;;;;;;;:::i;:::-;;;;;;;;19195:16;19170:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;19231:39:0::1;::::0;-1:-1:-1;;;;;;;;;;;19231:39:0;::::1;::::0;::::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;19285:7:0::1;:15:::0;;-1:-1:-1;;19285:15:0::1;::::0;;-1:-1:-1;19315:7:0::1;::::0;-1:-1:-1;;;;;19315:7:0::1;18978:355;19397:25;19425:38;19446:17:::0;19425:18;:38:::1;:::i;:::-;19397:66:::0;-1:-1:-1;19514:23:0::1;19581:17:::0;19540:38:::1;19560:18:::0;19397:66;19540:38:::1;:::i;:::-;:58;;;;:::i;:::-;19514:84:::0;-1:-1:-1;19609:21:0::1;19633:35;19514:84:::0;19633:17;:35:::1;:::i;:::-;19609:59:::0;-1:-1:-1;19727:19:0;;19723:102:::1;;19763:50;19777:15;19794:18;19763:13;:50::i;:::-;19886:17:::0;;19882:87:::1;;19920:37;19943:13;19920:22;:37::i;:::-;-1:-1:-1::0;;19989:7:0::1;:15:::0;;-1:-1:-1;;19989:15:0::1;::::0;;-1:-1:-1;;;;;;;;;1411:1:0::1;1155::::0;1423:7;:22;16145:3867::o;42515:162::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;42616:42:0;;;::::1;;::::0;;;:33:::1;:42;::::0;;;;:53;;-1:-1:-1;;42616:53:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42515:162::o;12810:836::-;1905:13;:11;:13::i;:::-;12871:12:::1;::::0;::::1;;12870:13;12862:28;;;::::0;-1:-1:-1;;;12862:28:0;;11606:2:1;12862:28:0::1;::::0;::::1;11588:21:1::0;11645:1;11625:18;;;11618:29;-1:-1:-1;;;11663:18:1;;;11656:32;11705:18;;12862:28:0::1;11404:325:1::0;12862:28:0::1;12901:12;:19:::0;;-1:-1:-1;;12901:19:0::1;12916:4;12901:19;::::0;;12992:17:::1;::::0;13033:10:::1;::::0;12992:52:::1;::::0;-1:-1:-1;;;12992:52:0;;13026:4:::1;12992:52;::::0;::::1;11946:34:1::0;-1:-1:-1;;;;;13033:10:0;;::::1;11996:18:1::0;;;11989:43;12992:17:0;::::1;::::0;:25:::1;::::0;11881:18:1;;12992:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12976:13;:68:::0;;-1:-1:-1;;;;;;12976:68:0::1;-1:-1:-1::0;;;;;12976:68:0;;;::::1;::::0;;::::1;::::0;;13110:131:::1;;13174:17;::::0;13218:10:::1;::::0;13174:55:::1;::::0;-1:-1:-1;;;13174:55:0;;13211:4:::1;13174:55;::::0;::::1;11946:34:1::0;-1:-1:-1;;;;;13218:10:0;;::::1;11996:18:1::0;;;11989:43;13174:17:0;::::1;::::0;:28:::1;::::0;11881:18:1;;13174:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13158:13;:71:::0;;-1:-1:-1;;;;;;13158:71:0::1;-1:-1:-1::0;;;;;13158:71:0;;;::::1;::::0;;;::::1;::::0;;13110:131:::1;13269:13;::::0;-1:-1:-1;;;;;13269:13:0::1;13261:42;;;::::0;-1:-1:-1;;;13261:42:0;;12501:2:1;13261:42:0::1;::::0;::::1;12483:21:1::0;12540:1;12520:18;;;12513:29;-1:-1:-1;;;12558:18:1;;;12551:32;12600:18;;13261:42:0::1;12299:325:1::0;13261:42:0::1;13348:16;::::0;13316:69:::1;::::0;13333:4:::1;::::0;-1:-1:-1;;;;;13348:16:0::1;-1:-1:-1::0;;13316:8:0::1;:69::i;:::-;13421:10;::::0;13449:16:::1;::::0;13414:72:::1;::::0;-1:-1:-1;;;13414:72:0;;-1:-1:-1;;;;;13421:10:0;;::::1;::::0;13414:26:::1;::::0;:72:::1;::::0;13449:16;::::1;::::0;-1:-1:-1;;13468:17:0;13414:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13406:87;;;::::0;-1:-1:-1;;;13406:87:0;;12831:2:1;13406:87:0::1;::::0;::::1;12813:21:1::0;12870:1;12850:18;;;12843:29;-1:-1:-1;;;12888:18:1;;;12881:32;12930:18;;13406:87:0::1;12629:325:1::0;13406:87:0::1;13511:10;::::0;13531:13:::1;::::0;13504:60:::1;::::0;-1:-1:-1;;;13504:60:0;;-1:-1:-1;;;;;13511:10:0;;::::1;::::0;13504:26:::1;::::0;:60:::1;::::0;13531:13;::::1;::::0;-1:-1:-1;;13546:17:0;13504:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;13605:13:0::1;::::0;13575:63:::1;::::0;-1:-1:-1;;;13575:63:0;;13590:4:::1;::::0;13575:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;13605:13:0::1;::::0;-1:-1:-1;;13620:17:0;13575:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12810:836::o:0;42177:84::-;1905:13;:11;:13::i;:::-;42232:14:::1;:21:::0;;-1:-1:-1;;;;42232:21:0::1;-1:-1:-1::0;;;42232:21:0::1;::::0;;42177:84::o;3057:95::-;3104:13;3137:7;3130:14;;;;;:::i;26484:2260::-;1905:13;:11;:13::i;:::-;26617:1:::1;26603:11;:15;26595:30;;;;-1:-1:-1::0;;;26595:30:0::1;;;;;;;:::i;:::-;26658:1;26644:11;:15;26636:30;;;::::0;-1:-1:-1;;;26636:30:0;;13491:2:1;26636:30:0::1;::::0;::::1;13473:21:1::0;13530:1;13510:18;;;13503:29;-1:-1:-1;;;13548:18:1;;;13541:32;13590:18;;26636:30:0::1;13289:325:1::0;26636:30:0::1;26709:46;::::0;-1:-1:-1;;;26709:46:0;;26724:4:::1;26709:46;::::0;::::1;2292:51:1::0;;;26759:11:0;;26709:31:::1;::::0;2265:18:1;;26709:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;26687:113;;;::::0;-1:-1:-1;;;26687:113:0;;13821:2:1;26687:113:0::1;::::0;::::1;13803:21:1::0;13860:1;13840:18;;;13833:29;-1:-1:-1;;;13878:18:1;;;13871:32;13920:18;;26687:113:0::1;13619:325:1::0;26687:113:0::1;26850:10;::::0;26843:40:::1;::::0;-1:-1:-1;;;26843:40:0;;26872:10:::1;26843:40;::::0;::::1;2292:51:1::0;26887:11:0;;-1:-1:-1;;;;;26850:10:0::1;::::0;26843:28:::1;::::0;2265:18:1;;26843:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;26821:107;;;::::0;-1:-1:-1;;;26821:107:0;;14151:2:1;26821:107:0::1;::::0;::::1;14133:21:1::0;14190:1;14170:18;;;14163:29;-1:-1:-1;;;14208:18:1;;;14201:32;14250:18;;26821:107:0::1;13949:325:1::0;26821:107:0::1;27030:10;::::0;27023:71:::1;::::0;-1:-1:-1;;;27023:71:0;;-1:-1:-1;;;;;27030:10:0;;::::1;::::0;27023:31:::1;::::0;:71:::1;::::0;27055:10:::1;::::0;27075:4:::1;::::0;27082:11;;27023:71:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27001:123;;;::::0;-1:-1:-1;;;27001:123:0;;14861:2:1;27001:123:0::1;::::0;::::1;14843:21:1::0;14900:1;14880:18;;;14873:29;-1:-1:-1;;;14918:18:1;;;14911:32;14960:18;;27001:123:0::1;14659:325:1::0;27001:123:0::1;27203:16;::::0;27171:63:::1;::::0;27188:4:::1;::::0;-1:-1:-1;;;;;27203:16:0::1;27222:11:::0;27171:8:::1;:63::i;:::-;27252:10;::::0;27280:16:::1;::::0;27245:66:::1;::::0;-1:-1:-1;;;27245:66:0;;-1:-1:-1;;;;;27252:10:0;;::::1;::::0;27245:26:::1;::::0;:66:::1;::::0;27280:16;::::1;::::0;27299:11;;27245:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;27336:16:0::1;::::0;27408:10:::1;::::0;-1:-1:-1;;;;;27336:16:0;;::::1;::::0;:29:::1;::::0;27388:4:::1;::::0;27408:10:::1;27433:11:::0;27459;27336:16:::1;::::0;27609:10:::1;27634:21;:15;27652:3;27634:21;:::i;:::-;27336:356;::::0;::::1;::::0;;;-1:-1:-1;;;;;;27336:356:0;;;-1:-1:-1;;;;;15404:15:1;;;27336:356:0::1;::::0;::::1;15386:34:1::0;15456:15;;;15436:18;;;15429:43;15488:18;;;15481:34;;;;15531:18;;;15524:34;;;;15574:19;;;15567:35;;;;15618:19;;;15611:35;15683:15;;;15662:19;;;15655:44;15715:19;;;15708:35;;;;15320:19;;27336:356:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;27336:356:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;27336:356:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;27332:1147;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;27847:16;::::0;27815:53:::1;::::0;27832:4:::1;::::0;-1:-1:-1;;;;;27847:16:0::1;;27815:8;:53::i;:::-;27890:10;::::0;27918:16:::1;::::0;27883:56:::1;::::0;-1:-1:-1;;;27883:56:0;;-1:-1:-1;;;;;27890:10:0;;::::1;::::0;27883:26:::1;::::0;:56:::1;::::0;27918:16;::::1;::::0;27890:10:::1;::::0;27883:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28023:10:0::1;::::0;28016:52:::1;::::0;-1:-1:-1;;;28016:52:0;;-1:-1:-1;;;;;28023:10:0;;::::1;::::0;28016:27:::1;::::0;:52:::1;::::0;28044:10:::1;::::0;28056:11;;28016:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28104:6;28097:14;;-1:-1:-1::0;;;28097:14:0::1;;;;;;;;:::i;27332:1147::-;;;28205:16;::::0;28173:53:::1;::::0;28190:4:::1;::::0;-1:-1:-1;;;;;28205:16:0::1;;28173:8;:53::i;:::-;28248:10;::::0;28276:16:::1;::::0;28241:56:::1;::::0;-1:-1:-1;;;28241:56:0;;-1:-1:-1;;;;;28248:10:0;;::::1;::::0;28241:26:::1;::::0;:56:::1;::::0;28276:16;::::1;::::0;28248:10:::1;::::0;28241:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28381:10:0::1;::::0;28374:52:::1;::::0;-1:-1:-1;;;28374:52:0;;-1:-1:-1;;;;;28381:10:0;;::::1;::::0;28374:27:::1;::::0;:52:::1;::::0;28402:10:::1;::::0;28414:11;;28374:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28455:12:0::1;::::0;-1:-1:-1;;;28455:12:0;;16554:2:1;28455:12:0::1;::::0;::::1;16536:21:1::0;16593:1;16573:18;;;16566:29;-1:-1:-1;;;16611:18:1;;;16604:32;16653:18;;28455:12:0::1;16352:325:1::0;27332:1147:0::1;-1:-1:-1::0;;27713:40:0::1;::::0;;10424:25:1;;;10480:2;10465:18;;10458:34;;;27713:40:0::1;::::0;-1:-1:-1;10397:18:1;27713:40:0::1;;;;;;;28582:10;::::0;28575:43:::1;::::0;-1:-1:-1;;;28575:43:0;;28612:4:::1;28575:43;::::0;::::1;2292:51:1::0;28549:23:0::1;::::0;-1:-1:-1;;;;;28582:10:0::1;::::0;28575:28:::1;::::0;2265:18:1;;28575:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28549:69:::0;-1:-1:-1;28633:19:0;;28629:108:::1;;28676:10;::::0;28669:56:::1;::::0;-1:-1:-1;;;28669:56:0;;-1:-1:-1;;;;;28676:10:0;;::::1;::::0;28669:27:::1;::::0;:56:::1;::::0;28697:10:::1;::::0;28709:15;;28669:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26584:2160;26484:2260:::0;;:::o;35489:319::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;35581:31:0;::::1;35573:46;;;::::0;-1:-1:-1;;;35573:46:0;;16884:2:1;35573:46:0::1;::::0;::::1;16866:21:1::0;16923:1;16903:18;;;16896:29;-1:-1:-1;;;16941:18:1;;;16934:32;16983:18;;35573:46:0::1;16682:325:1::0;35573:46:0::1;35662:14;::::0;;-1:-1:-1;;;;;35687:34:0;;::::1;-1:-1:-1::0;;;;;;35687:34:0;::::1;::::0;::::1;::::0;;;35747:53:::1;::::0;;35662:14;;;::::1;11946:34:1::0;;;12011:2;11996:18;;11989:43;;;;35747:53:0::1;::::0;11881:18:1;35747:53:0::1;11734:304:1::0;3485:182:0;3555:4;3588:10;3609:28;3588:10;3626:2;3630:6;3609:9;:28::i;34483:948::-;1905:13;:11;:13::i;:::-;1199:1:::1;1345:7;;:19:::0;1337:34:::1;;;;-1:-1:-1::0;;;1337:34:0::1;;;;;;;:::i;:::-;1199:1;1382:7;:18:::0;34575:15;34567:57:::2;;;::::0;-1:-1:-1;;;34567:57:0;;17214:2:1;34567:57:0::2;::::0;::::2;17196:21:1::0;17253:2;17233:18;;;17226:30;17292:31;17272:18;;;17265:59;17341:18;;34567:57:0::2;17012:353:1::0;34567:57:0::2;34676:4;3424:7:::0;3451:18;;;;;;;;;;;34643:11:::2;:39;;34635:72;;;::::0;-1:-1:-1;;;34635:72:0;;17572:2:1;34635:72:0::2;::::0;::::2;17554:21:1::0;17611:2;17591:18;;;17584:30;-1:-1:-1;;;17630:18:1;;;17623:50;17690:18;;34635:72:0::2;17370:344:1::0;34635:72:0::2;34726:12;::::0;-1:-1:-1;;;34726:12:0;::::2;;;34718:43;;;;-1:-1:-1::0;;;34718:43:0::2;;;;;;;:::i;:::-;34857:21;34829:25;34946;34959:11:::0;34946:12:::2;:25::i;:::-;34924:47;;35033:11;35048:1;35033:16:::0;35029:87:::2;;35066:38;::::0;-1:-1:-1;;;35066:38:0;;18268:2:1;35066:38:0::2;::::0;::::2;18250:21:1::0;18307:2;18287:18;;;18280:30;18346;18326:18;;;18319:58;18394:18;;35066:38:0::2;18066:352:1::0;35029:87:0::2;35214:21;35250:39:::0;;::::2;35246:107;;35306:35;;-1:-1:-1::0;;;35306:35:0::2;;;;;;;:::i;35246:107::-;35378:45;::::0;;10424:25:1;;;10480:2;10465:18;;10458:34;;;35378:45:0::2;::::0;10397:18:1;35378:45:0::2;;;;;;;-1:-1:-1::0;;1155:1:0::1;1423:7;:22:::0;-1:-1:-1;;34483:948:0:o;30156:166::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;30230:21:0;::::1;30222:36;;;::::0;-1:-1:-1;;;30222:36:0;;18625:2:1;30222:36:0::1;::::0;::::1;18607:21:1::0;18664:1;18644:18;;;18637:29;-1:-1:-1;;;18682:18:1;;;18675:32;18724:18;;30222:36:0::1;18423:325:1::0;30222:36:0::1;30269:16;:45:::0;;-1:-1:-1;;;;;;30269:45:0::1;-1:-1:-1::0;;;;;30269:45:0;;;::::1;::::0;;;::::1;::::0;;30156:166::o;37745:1415::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;37825:24:0;::::1;37817:52;;;::::0;-1:-1:-1;;;37817:52:0;;18955:2:1;37817:52:0::1;::::0;::::1;18937:21:1::0;18994:2;18974:18;;;18967:30;-1:-1:-1;;;19013:18:1;;;19006:45;19068:18;;37817:52:0::1;18753:339:1::0;37817:52:0::1;37962:10;-1:-1:-1::0;;;;;37951:37:0::1;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;37951:39:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;37951:39:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;37947:521;;38424:32;::::0;-1:-1:-1;;;38424:32:0;;19299:2:1;38424:32:0::1;::::0;::::1;19281:21:1::0;19338:2;19318:18;;;19311:30;-1:-1:-1;;;19357:18:1;;;19350:52;19419:18;;38424:32:0::1;19097:346:1::0;37947:521:0::1;-1:-1:-1::0;;;;;38161:24:0;::::1;::::0;;::::1;::::0;:55:::1;;-1:-1:-1::0;;;;;;38189:27:0;::::1;38211:4;38189:27;;38161:55;38157:143;;;38237:47;::::0;-1:-1:-1;;;38237:47:0;;19650:2:1;38237:47:0::1;::::0;::::1;19632:21:1::0;19689:2;19669:18;;;19662:30;19728:34;19708:18;;;19701:62;-1:-1:-1;;;19779:18:1;;;19772:35;19824:19;;38237:47:0::1;19448:401:1::0;38157:143:0::1;-1:-1:-1::0;38523:9:0::1;:22:::0;;-1:-1:-1;;;;;;;;;38523:22:0;::::1;::::0;;::::1;38556:19:::0;;;;-1:-1:-1;;;;;;38556:19:0;;;;;;;-1:-1:-1;;;38556:19:0::1;::::0;;;38650:55:::1;::::0;-1:-1:-1;;;38650:55:0;;38699:4:::1;38650:55;::::0;::::1;2292:51:1::0;38650:40:0::1;::::0;2265:18:1;;38650:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;38646:457;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;38926:6:0::1;38865:68;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;38865:68:0;;::::1;::::0;;;;;;;38847:88:::1;::::0;::::1;:::i;:::-;;;;;;;;38747:200;38646:457;;;;;-1:-1:-1::0;;;;;;;;;;;39031:60:0::1;;;;20564:2:1::0;20546:21;;;20603:2;20583:18;;;20576:30;20642:34;20637:2;20622:18;;20615:62;-1:-1:-1;;;20708:2:1;20693:18;;20686:44;20762:3;20747:19;;20362:410;39031:60:0::1;;;;;;;;38646:457;39128:24;::::0;-1:-1:-1;;;;;39128:24:0;::::1;::::0;::::1;::::0;;;::::1;37745:1415:::0;:::o;35859:1603::-;1905:13;:11;:13::i;:::-;1199:1:::1;1345:7;;:19:::0;1337:34:::1;;;;-1:-1:-1::0;;;1337:34:0::1;;;;;;;:::i;:::-;1199:1;1382:7;:18:::0;35966:15;35958:30:::2;;;;-1:-1:-1::0;;;35958:30:0::2;;;;;;;:::i;:::-;36007:46;::::0;-1:-1:-1;;;36007:46:0;;36022:4:::2;36007:46;::::0;::::2;2292:51:1::0;;;36057:11:0;;36007:31:::2;::::0;2265:18:1;;36007:46:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;35999:76;;;::::0;-1:-1:-1;;;35999:76:0;;13821:2:1;35999:76:0::2;::::0;::::2;13803:21:1::0;13860:1;13840:18;;;13833:29;-1:-1:-1;;;13878:18:1;;;13871:32;13920:18;;35999:76:0::2;13619:325:1::0;35999:76:0::2;36094:12;::::0;-1:-1:-1;;;36094:12:0;::::2;;;36086:43;;;;-1:-1:-1::0;;;36086:43:0::2;;;;;;;:::i;:::-;36212:16;::::0;36180:69:::2;::::0;36197:4:::2;::::0;-1:-1:-1;;;;;36212:16:0::2;-1:-1:-1::0;;36180:8:0::2;:69::i;:::-;36345:21;36317:25;36451;36464:11:::0;36451:12:::2;:25::i;:::-;36429:47;;36501:11;36516:1;36501:16:::0;36497:87:::2;;36534:38;::::0;-1:-1:-1;;;36534:38:0;;18268:2:1;36534:38:0::2;::::0;::::2;18250:21:1::0;18307:2;18287:18;;;18280:30;18346;18326:18;;;18319:58;18394:18;;36534:38:0::2;18066:352:1::0;36497:87:0::2;36682:21;36718:39:::0;;::::2;36714:107;;36774:35;;-1:-1:-1::0;;;36774:35:0::2;;;;;;;:::i;36714:107::-;36885:25;36913:38;36934:17:::0;36913:18;:38:::2;:::i;:::-;36885:66:::0;-1:-1:-1;37002:23:0::2;37064:3;37028:33;9821:2;36885:66:::0;37028:33:::2;:::i;:::-;:39;;;;:::i;:::-;37002:65:::0;-1:-1:-1;37078:21:0::2;37136:3;37102:31;9877:2;37102:17:::0;:31:::2;:::i;:::-;:37;;;;:::i;:::-;37078:61:::0;-1:-1:-1;37198:19:0;;37194:117:::2;;37234:65;37248:15:::0;37295:3:::2;37265:27;9821:2;37265:11:::0;:27:::2;:::i;:::-;:33;;;;:::i;:::-;37234:13;:65::i;:::-;37372:17:::0;;37368:87:::2;;37406:37;37429:13;37406:22;:37::i;:::-;-1:-1:-1::0;;1155:1:0::1;1423:7;:22:::0;-1:-1:-1;;;;;35859:1603:0:o;42371:132::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;42457:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:38;;-1:-1:-1;;42457:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42371:132::o;28829:1319::-;1905:13;:11;:13::i;:::-;28939:46:::1;::::0;-1:-1:-1;;;28939:46:0;;28954:4:::1;28939:46;::::0;::::1;2292:51:1::0;;;28917:19:0::1;::::0;28939:31:::1;::::0;2265:18:1;;28939:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28917:68;;29018:1;29004:11;:15;28996:30;;;;-1:-1:-1::0;;;28996:30:0::1;;;;;;;:::i;:::-;29057:1;29045:9;:13;29037:28;;;::::0;-1:-1:-1;;;29037:28:0;;20979:2:1;29037:28:0::1;::::0;::::1;20961:21:1::0;21018:1;20998:18;;;20991:29;-1:-1:-1;;;21036:18:1;;;21029:32;21078:18;;29037:28:0::1;20777:325:1::0;29037:28:0::1;29144:16;::::0;29112:63:::1;::::0;29129:4:::1;::::0;-1:-1:-1;;;;;29144:16:0::1;29163:11:::0;29112:8:::1;:63::i;:::-;29200:16;::::0;-1:-1:-1;;;;;29200:16:0::1;:32;29240:9;29273:4;29293:11:::0;29200:16:::1;::::0;29441:10:::1;29466:21;:15;29484:3;29466:21;:::i;:::-;29200:324;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;29200:324:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;29200:324:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;29196:945;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;29677:16;::::0;29645:53:::1;::::0;29662:4:::1;::::0;-1:-1:-1;;;;;29677:16:0::1;;29645:8;:53::i;:::-;29763:51;::::0;29771:10:::1;::::0;29792:21:::1;29763:51:::0;::::1;;;::::0;::::1;::::0;;;29792:21;29771:10;29763:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;29196:945;;;29951:16;::::0;29919:53:::1;::::0;29936:4:::1;::::0;-1:-1:-1;;;;;29951:16:0::1;;29919:8;:53::i;:::-;30037:51;::::0;30045:10:::1;::::0;30066:21:::1;30037:51:::0;::::1;;;::::0;::::1;::::0;;;30066:21;30045:10;30037:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;29196:945;-1:-1:-1::0;;29545:38:0::1;::::0;;10424:25:1;;;29573:9:0::1;10480:2:1::0;10465:18;;10458:34;29545:38:0::1;::::0;-1:-1:-1;10397:18:1;29545:38:0::1;;;;;;;28906:1242;28829:1319::o:0;42689:130::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;42776:25:0;;;::::1;;::::0;;;:16:::1;:25;::::0;;;;:35;;-1:-1:-1;;42776:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42689:130::o;33489:958::-;1905:13;:11;:13::i;:::-;33624:16:::1;::::0;33592:69:::1;::::0;33609:4:::1;::::0;-1:-1:-1;;;;;33624:16:0::1;-1:-1:-1::0;;33592:8:0::1;:69::i;:::-;33740:10;::::0;33768:16:::1;::::0;33733:72:::1;::::0;-1:-1:-1;;;33733:72:0;;-1:-1:-1;;;;;33740:10:0;;::::1;::::0;33733:26:::1;::::0;:72:::1;::::0;33768:16;::::1;::::0;-1:-1:-1;;33787:17:0;33733:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;33733:72:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;33733:72:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;33729:193:::0;::::1;;-1:-1:-1::0;33844:10:0::1;::::0;33864:16:::1;::::0;33826:75:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;33844:10:0;;::::1;::::0;33864:16;::::1;::::0;-1:-1:-1;;33883:17:0;33826:75:::1;:::i;:::-;;;;;;;;33729:193;33997:13;::::0;-1:-1:-1;;;;;33997:13:0::1;:27:::0;33993:447:::1;;34052:10;::::0;34072:13:::1;::::0;34045:60:::1;::::0;-1:-1:-1;;;34045:60:0;;-1:-1:-1;;;;;34052:10:0;;::::1;::::0;34045:26:::1;::::0;:60:::1;::::0;34072:13;::::1;::::0;-1:-1:-1;;34087:17:0;34045:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;34045:60:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;34045:60:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;34041:177:::0;::::1;;-1:-1:-1::0;34148:10:0::1;::::0;34160:13:::1;::::0;34130:63:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;34148:10:0;;::::1;::::0;34160:13;::::1;::::0;-1:-1:-1;;34175:17:0;34130:63:::1;:::i;:::-;;;;;;;;34041:177;34280:13;::::0;34250:63:::1;::::0;-1:-1:-1;;;34250:63:0;;34265:4:::1;::::0;34250:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;34280:13:0::1;::::0;-1:-1:-1;;34295:17:0;34250:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;34250:63:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;34250:63:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;34246:183:::0;::::1;;-1:-1:-1::0;34371:13:0::1;::::0;34338:66:::1;::::0;::::1;::::0;::::1;::::0;34364:4:::1;::::0;-1:-1:-1;;;;;34371:13:0::1;::::0;-1:-1:-1;;34386:17:0;34338:66:::1;:::i;:::-;;;;;;;;34246:183;33489:958::o:0;2149:165::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;2238:22:0;::::1;2230:37;;;::::0;-1:-1:-1;;;2230:37:0;;21921:2:1;2230:37:0::1;::::0;::::1;21903:21:1::0;21960:1;21940:18;;;21933:29;-1:-1:-1;;;21978:18:1;;;21971:32;22020:18;;2230:37:0::1;21719:325:1::0;2230:37:0::1;2278:28;2297:8;2278:18;:28::i;5336:256::-:0;-1:-1:-1;;;;;5438:19:0;;;;;;:44;;-1:-1:-1;;;;;;5461:21:0;;;;5438:44;5430:59;;;;-1:-1:-1;;;5430:59:0;;22251:2:1;5430:59:0;;;22233:21:1;22290:1;22270:18;;;22263:29;-1:-1:-1;;;22308:18:1;;;22301:32;22350:18;;5430:59:0;22049:325:1;5430:59:0;-1:-1:-1;;;;;5500:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;5552:32;;160:25:1;;;5552:32:0;;133:18:1;5552:32:0;;;;;;;5336:256;;;:::o;2041:100::-;2116:10;2105:7;2019:6;;-1:-1:-1;;;;;2019:6:0;;1946:87;2105:7;-1:-1:-1;;;;;2105:21:0;;2097:36;;;;-1:-1:-1;;;2097:36:0;;22581:2:1;2097:36:0;;;22563:21:1;22620:1;22600:18;;;22593:29;-1:-1:-1;;;22638:18:1;;;22631:32;22680:18;;2097:36:0;22379:325:1;5600:311:0;-1:-1:-1;;;;;3782:18:0;;;5701:24;3782:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;5772:26;;;;5764:41;;;;-1:-1:-1;;;5764:41:0;;22911:2:1;5764:41:0;;;22893:21:1;22950:1;22930:18;;;22923:29;-1:-1:-1;;;22968:18:1;;;22961:32;23010:18;;5764:41:0;22709:325:1;5764:41:0;5841:51;5850:5;5857:7;5885:6;5866:16;:25;5841:8;:51::i;39215:2914::-;-1:-1:-1;;;;;39347:18:0;;39339:33;;;;-1:-1:-1;;;39339:33:0;;23241:2:1;39339:33:0;;;23223:21:1;23280:1;23260:18;;;23253:29;-1:-1:-1;;;23298:18:1;;;23291:32;23340:18;;39339:33:0;23039:325:1;39339:33:0;-1:-1:-1;;;;;39391:16:0;;39383:31;;;;-1:-1:-1;;;39383:31:0;;23571:2:1;39383:31:0;;;23553:21:1;23610:1;23590:18;;;23583:29;-1:-1:-1;;;23628:18:1;;;23621:32;23670:18;;39383:31:0;23369:325:1;39383:31:0;39442:1;39433:6;:10;39425:25;;;;-1:-1:-1;;;39425:25:0;;23901:2:1;39425:25:0;;;23883:21:1;23940:1;23920:18;;;23913:29;-1:-1:-1;;;23958:18:1;;;23951:32;24000:18;;39425:25:0;23699:325:1;39425:25:0;39523:7;;;;;;;39519:94;;;39547:33;39563:4;39569:2;39573:6;39547:15;:33::i;39519:94::-;-1:-1:-1;;;;;39707:24:0;;39690:12;39707:24;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;39735:22:0;;;;;;:18;:22;;;;;;;;39707:50;39871:14;;39705:53;;;-1:-1:-1;;;;39871:14:0;;;;39870:15;:65;;;;-1:-1:-1;39898:13:0;;-1:-1:-1;;;;;39890:21:0;;;39898:13;;39890:21;;:44;;-1:-1:-1;39921:13:0;;-1:-1:-1;;;;;39915:19:0;;;39921:13;;39915:19;39890:44;39866:113;;;-1:-1:-1;39962:5:0;39866:113;40064:14;;-1:-1:-1;;;40064:14:0;;;;:58;;;;-1:-1:-1;;;;;;40083:39:0;;;;;;:33;:39;;;;;;;;40082:40;40064:58;:100;;;;-1:-1:-1;;;;;;40127:37:0;;;;;;:33;:37;;;;;;;;40126:38;40064:100;40060:585;;;40290:13;;-1:-1:-1;;;;;40290:13:0;;;40284:19;;;;40280:114;;-1:-1:-1;;;;;40332:22:0;;;;;;:16;:22;;;;;;;;40324:54;;;;-1:-1:-1;;;40324:54:0;;24231:2:1;40324:54:0;;;24213:21:1;24270:2;24250:18;;;24243:30;-1:-1:-1;;;24289:18:1;;;24282:49;24348:18;;40324:54:0;24029:343:1;40324:54:0;40534:13;;-1:-1:-1;;;;;40534:13:0;;;40526:21;;;;40522:112;;-1:-1:-1;;;;;40576:19:0;;;;;;:15;:19;;;;;;;;40568:50;;;;-1:-1:-1;;;40568:50:0;;24579:2:1;40568:50:0;;;24561:21:1;24618:2;24598:18;;;24591:30;-1:-1:-1;;;24637:18:1;;;24630:48;24695:18;;40568:50:0;24377:342:1;40568:50:0;40732:41;40747:4;40753:2;40757:6;40765:7;40732:14;:41::i;:::-;40924:7;:30;;;;-1:-1:-1;40941:13:0;;-1:-1:-1;;;;;40935:19:0;;;40941:13;;40935:19;40924:30;:42;;;;-1:-1:-1;40959:7:0;;;;;;;40958:8;40924:42;:97;;;;;41020:1;40996:21;;40970:23;;:47;;;;:::i;:::-;:51;40924:97;40920:1202;;;41237:21;;41211:23;;41147:11;;;;41211:47;;41237:21;41211:47;:::i;:::-;:60;41207:904;;41442:12;41418:21;;41392:23;;:47;;;;:::i;:::-;:62;41388:708;;;41564:4;-1:-1:-1;;;;;41564:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41560:194;41388:708;41560:194;41388:708;;;41887:4;-1:-1:-1;;;;;41887:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41883:194;;41023:1099;39328:2801;39215:2914;;;:::o;20020:4166::-;20080:7;20104:11;20119:1;20104:16;20100:30;;-1:-1:-1;20129:1:0;;20020:4166;-1:-1:-1;20020:4166:0:o;20100:30::-;20149:12;;-1:-1:-1;;;20149:12:0;;;;20141:43;;;;-1:-1:-1;;;20141:43:0;;;;;;;:::i;:::-;20276:11;20319;20302:28;;20298:118;;;-1:-1:-1;20364:11:0;20298:118;20460:16;;;20474:1;20460:16;;;;;;;;20436:21;;20460:16;;;;;;;;;;-1:-1:-1;20460:16:0;20436:40;;20505:4;20487;20492:1;20487:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20487:23:0;;;:7;;;;;;;;;;:23;;;;20531:16;;:23;;;-1:-1:-1;;;20531:23:0;;;;:16;;;;;:21;;:23;;;;;20487:7;;20531:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20521:4;20526:1;20521:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20521:33:0;;;:7;;;;;;;;;:33;20923:16;;20745:20;;20891:69;;20908:4;;20923:16;-1:-1:-1;;20891:8:0;:69::i;:::-;21033:16;21052:22;:15;21070:4;21052:22;:::i;:::-;21306:16;;21463:9;;21306:233;;-1:-1:-1;;;21306:233:0;;21033:41;;-1:-1:-1;21180:21:0;;-1:-1:-1;;;;;21306:16:0;;;;:67;;:233;;21388:14;;21417:12;;21444:4;;21463:9;;;;;;;;21033:41;;21306:233;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21302:2877;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;23114:20;;:24;23110:552;;23281:11;;;;;;;;;;;;-1:-1:-1;;;23281:11:0;;;;;23243:24;;;;;;:50;;23239:408;;23383:18;23404;23421:1;23404:14;:18;:::i;:::-;23383:39;-1:-1:-1;23449:14:0;;23445:183;;-1:-1:-1;;;;;;;;;;;23497:49:0;;;;25637:2:1;25619:21;;;25676:2;25656:18;;;25649:30;25715:34;25710:2;25695:18;;25688:62;-1:-1:-1;;;25781:2:1;25766:18;;25759:33;25824:3;25809:19;;25435:399;23497:49:0;;;;;;;;23580:24;23593:10;23580:12;:24::i;:::-;23573:31;20020:4166;-1:-1:-1;;;;;;;;;20020:4166:0:o;23445:183::-;23295:352;23239:408;-1:-1:-1;;;;;;;;;;;23692:6:0;23681:18;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;23721:1:0;;20020:4166;-1:-1:-1;;;;;;;20020:4166:0:o;21302:2877::-;;;23838:18;23859;23876:1;23859:14;:18;:::i;:::-;23838:39;;23909:1;23896:10;:14;:46;;;;;23928:14;23914:10;:28;;23896:46;23892:201;;;-1:-1:-1;;;;;;;;;;;23968:59:0;;;;26041:2:1;26023:21;;;26080:2;26060:18;;;26053:30;26119:34;26114:2;26099:18;;26092:62;-1:-1:-1;;;26185:2:1;26170:18;;26163:43;26238:3;26223:19;;25839:409;23968:59:0;;;;;;;;24053:24;24066:10;24053:12;:24::i;:::-;24046:31;20020:4166;-1:-1:-1;;;;;;;;20020:4166:0:o;23892:201::-;-1:-1:-1;;;;;;;;;;;24112:32:0;;;;26455:2:1;26437:21;;;26494:2;26474:18;;;26467:30;-1:-1:-1;;;26528:2:1;26513:18;;26506:48;26586:2;26571:18;;26253:342;21302:2877:0;21661:9;;;;;;;;;-1:-1:-1;;;;;21661:9:0;-1:-1:-1;;;;;21650:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21646:1360;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;22826:6:0;22778:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22778:55:0;;;;;;;;;;22760:75;;;:::i;21646:1360::-;;;-1:-1:-1;;;;;;;;;;;22909:54:0;;;;27266:2:1;27248:21;;;27305:2;27285:18;;;27278:30;27344:34;27339:2;27324:18;;27317:62;-1:-1:-1;;;27410:2:1;27395:18;;27388:38;27458:3;27443:19;;27064:404;22909:54:0;;;;;;;;-1:-1:-1;22989:1:0;;20020:4166;-1:-1:-1;;;;;;20020:4166:0:o;21646:1360::-;21795:21;21766:26;21857:38;21878:17;21795:21;21857:38;:::i;:::-;21835:60;-1:-1:-1;21936:15:0;;21932:754;;21981:43;;;10424:25:1;;;10480:2;10465:18;;10458:34;;;21981:43:0;;10397:18:1;21981:43:0;;;;;;;22210:11;22193:14;:28;22189:280;;;22250:23;22276:28;22290:14;22276:11;:28;:::i;:::-;22250:54;;22331:21;22355:29;22368:15;22355:12;:29::i;:::-;22331:53;-1:-1:-1;22418:27:0;22331:53;22418:11;:27;:::i;:::-;22411:34;20020:4166;-1:-1:-1;;;;;;;;;;;20020:4166:0:o;21932:754::-;-1:-1:-1;;;;;;;;;;;22585:50:0;;;;27675:2:1;27657:21;;;27714:2;27694:18;;;27687:30;27753:34;27748:2;27733:18;;27726:62;-1:-1:-1;;;27819:2:1;27804:18;;27797:34;27863:3;27848:19;;27473:400;22585:50:0;;;;;;;;-1:-1:-1;22665:1:0;;20020:4166;-1:-1:-1;;;;;;;;20020:4166:0:o;24505:828::-;24667:22;24729:3;24707:18;211:2;24729:3;24707:18;:::i;:::-;24692:34;;:11;:34;:::i;:::-;:40;;;;:::i;:::-;24667:65;-1:-1:-1;24743:20:0;24801:3;24779:18;211:2;24801:3;24779:18;:::i;:::-;24766:32;;:9;:32;:::i;:::-;:38;;;;:::i;:::-;24829:16;;24743:61;;-1:-1:-1;;;;;;24829:16:0;:32;24869:9;24902:4;24922:11;24948:14;24743:61;24902:4;25032:22;:15;25050:4;25032:22;:::i;:::-;24829:271;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24829:271:0;;;;;;;;-1:-1:-1;;24829:271:0;;;;;;;;;;;;:::i;:::-;;;24825:501;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;25226:26;25245:6;25226:26;;;;;;:::i;:::-;;;;;;;;25172:92;24825:501;;;;;25291:23;;;;;28676:2:1;28658:21;;;28715:1;28695:18;;;28688:29;-1:-1:-1;;;28748:2:1;28733:18;;28726:31;28789:2;28774:18;;28474:324;25291:23:0;;;;;;;;24825:501;;;-1:-1:-1;;25121:38:0;;;10424:25:1;;;10480:2;10465:18;;10458:34;;;25121:38:0;;-1:-1:-1;10397:18:1;25121:38:0;;;;;;;24576:757;;24505:828;;:::o;25374:818::-;25464:7;:14;25493:17;;;:32;;-1:-1:-1;25514:11:0;;25493:32;25489:45;;;25527:7;25374:818;:::o;25489:45::-;25554:23;25580:21;25589:12;25580:6;:21;:::i;:::-;25554:47;;25616:15;25635:1;25616:20;25612:33;;25638:7;;25374:818;:::o;25612:33::-;25670:9;25665:454;25689:12;25685:1;:16;25665:454;;;25723:14;25740:7;25748:1;25740:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;25740:10:0;;-1:-1:-1;25769:20:0;;;;;:47;;-1:-1:-1;;;;;;25793:23:0;;25811:4;25793:23;;25769:47;:74;;;;-1:-1:-1;25830:13:0;;-1:-1:-1;;;;;25820:23:0;;;25830:13;;25820:23;;25769:74;25765:343;;;25919:12;25937:6;-1:-1:-1;;;;;25937:11:0;25956:15;25937:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25918:58;;;26000:7;25995:98;;26037:36;;;;;29215:2:1;29197:21;;;29254:2;29234:18;;;29227:30;-1:-1:-1;;;29288:2:1;29273:18;;29266:49;29347:2;29332:18;;29013:343;26037:36:0;;;;;;;;25995:98;25845:263;25765:343;-1:-1:-1;25703:3:0;;;;:::i;:::-;;;;25665:454;;;-1:-1:-1;26144:40:0;;;10424:25:1;;;10480:2;10465:18;;10458:34;;;26144:40:0;;10397:18:1;26144:40:0;;;;;;;25430:762;;25374:818;:::o;2322:191::-;2415:6;;;-1:-1:-1;;;;;2432:17:0;;;-1:-1:-1;;;;;;2432:17:0;;;;;;;2465:40;;2415:6;;;2432:17;2415:6;;2465:40;;2396:16;;2465:40;2385:128;2322:191;:::o;4281:639::-;-1:-1:-1;;;;;4412:18:0;;4404:33;;;;-1:-1:-1;;;4404:33:0;;23241:2:1;4404:33:0;;;23223:21:1;23280:1;23260:18;;;23253:29;-1:-1:-1;;;23298:18:1;;;23291:32;23340:18;;4404:33:0;23039:325:1;4404:33:0;-1:-1:-1;;;;;4456:16:0;;4448:31;;;;-1:-1:-1;;;4448:31:0;;23571:2:1;4448:31:0;;;23553:21:1;23610:1;23590:18;;;23583:29;-1:-1:-1;;;23628:18:1;;;23621:32;23670:18;;4448:31:0;23369:325:1;4448:31:0;4507:1;4498:6;:10;4490:25;;;;-1:-1:-1;;;4490:25:0;;23901:2:1;4490:25:0;;;23883:21:1;23940:1;23920:18;;;23913:29;-1:-1:-1;;;23958:18:1;;;23951:32;24000:18;;4490:25:0;23699:325:1;4490:25:0;-1:-1:-1;;;;;4617:15:0;;4595:19;4617:15;;;;;;;;;;;4651:21;;;;4643:36;;;;-1:-1:-1;;;4643:36:0;;29703:2:1;4643:36:0;;;29685:21:1;29742:1;29722:18;;;29715:29;-1:-1:-1;;;29760:18:1;;;29753:32;29802:18;;4643:36:0;29501:325:1;4643:36:0;-1:-1:-1;;;;;4715:15:0;;;:9;:15;;;;;;;;;;;4733:20;;;4715:38;;4768:13;;;;;;;;;;:23;;;;;;4828:26;;160:25:1;;;4768:13:0;;4828:26;;133:18:1;4828:26:0;;;;;;;4875:37;30330:183;13654:1696;13809:7;13805:1249;;;13863:17;13903:3;13883:17;9766:1;13883:6;:17;:::i;:::-;:23;;;;:::i;:::-;13863:43;-1:-1:-1;13939:13:0;;13935:1108;;14033:23;14087:3;14059:25;9821:2;14059:9;:25;:::i;:::-;:31;;;;:::i;:::-;14033:57;-1:-1:-1;14109:21:0;14159:3;14133:23;9877:2;14133:9;:23;:::i;:::-;:29;;;;:::i;:::-;14109:53;-1:-1:-1;14257:22:0;14282:18;14291:9;14282:6;:18;:::i;:::-;14257:43;;14380:49;14396:6;14412:4;14419:9;14380:15;:49::i;:::-;14517:50;14533:6;14541:9;14552:14;14517:15;:50::i;:::-;14682:15;14655:23;;:42;;;;;;;:::i;:::-;;;;;;;;14741:13;14716:21;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;14837:61:0;;-1:-1:-1;14851:6:0;9939:11;14859:17;14851:6;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;14859:17;:38;;14837:13;:61::i;:::-;14917:67;14931:9;9939:11;14942:20;14952:9;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;14917:67;15021:7;;;;;;13935:1108;13818:1236;13805:1249;15102:42;15118:6;15126:9;15137:6;15102:15;:42::i;:::-;15203:61;15217:6;9939:11;15225:17;15235:6;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;15203:61;15275:67;15289:9;9939:11;15300:20;15310:9;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;15358:779;15453:13;;-1:-1:-1;;;;;15442:24:0;;;15453:13;;15442:24;;;;:52;;-1:-1:-1;;;;;;15470:24:0;;15489:4;15470:24;;15442:52;15438:692;;;15515:14;:36;;;;-1:-1:-1;;;;;;15534:17:0;;;;;;:8;:17;;;;;;;;15533:18;15515:36;15511:608;;;-1:-1:-1;;;;;;15572:17:0;;;;;:8;:17;;;;;:24;;-1:-1:-1;;15572:24:0;15592:4;15572:24;;;;;;15615:7;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;15615:21:0;;;;;;30863:2580::o;15511:608::-;15663:14;15662:15;:36;;;;-1:-1:-1;;;;;;15681:17:0;;;;;;:8;:17;;;;;;;;15662:36;15658:461;;;-1:-1:-1;;;;;15719:17:0;;15739:5;15719:17;;;:8;:17;;;;;:25;;-1:-1:-1;;15719:25:0;;;15827:277;15851:7;:14;15847:18;;15827:277;;;15913:7;-1:-1:-1;;;;;15899:21:0;:7;15907:1;15899:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;15899:10:0;:21;15895:190;;15962:7;15970:14;;:18;;15987:1;;15970:18;:::i;:::-;15962:27;;;;;;;;:::i;:::-;;;;;;;;;;;15949:7;:10;;-1:-1:-1;;;;;15962:27:0;;;;15957:1;;15949:10;;;;;;:::i;:::-;;;;;;;;;:40;;;;;-1:-1:-1;;;;;15949:40:0;;;;;-1:-1:-1;;;;;15949:40:0;;;;;;16016:7;:13;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;16016:13:0;;;;;-1:-1:-1;;;;;;16016:13:0;;;;;;30464:41:::1;30330:183:::0;;:::o;15895:190::-;15867:3;;;;:::i;:::-;;;;15827:277;;196:250:1;281:1;291:113;305:6;302:1;299:13;291:113;;;381:11;;;375:18;362:11;;;355:39;327:2;320:10;291:113;;;-1:-1:-1;;438:1:1;420:16;;413:27;196:250::o;451:396::-;600:2;589:9;582:21;563:4;632:6;626:13;675:6;670:2;659:9;655:18;648:34;691:79;763:6;758:2;747:9;743:18;738:2;730:6;726:15;691:79;:::i;:::-;831:2;810:15;-1:-1:-1;;806:29:1;791:45;;;;838:2;787:54;;451:396;-1:-1:-1;;451:396:1:o;852:131::-;-1:-1:-1;;;;;927:31:1;;917:42;;907:70;;973:1;970;963:12;988:315;1056:6;1064;1117:2;1105:9;1096:7;1092:23;1088:32;1085:52;;;1133:1;1130;1123:12;1085:52;1172:9;1159:23;1191:31;1216:5;1191:31;:::i;:::-;1241:5;1293:2;1278:18;;;;1265:32;;-1:-1:-1;;;988:315:1:o;1500:456::-;1577:6;1585;1593;1646:2;1634:9;1625:7;1621:23;1617:32;1614:52;;;1662:1;1659;1652:12;1614:52;1701:9;1688:23;1720:31;1745:5;1720:31;:::i;:::-;1770:5;-1:-1:-1;1827:2:1;1812:18;;1799:32;1840:33;1799:32;1840:33;:::i;:::-;1500:456;;1892:7;;-1:-1:-1;;;1946:2:1;1931:18;;;;1918:32;;1500:456::o;1961:180::-;2020:6;2073:2;2061:9;2052:7;2048:23;2044:32;2041:52;;;2089:1;2086;2079:12;2041:52;-1:-1:-1;2112:23:1;;1961:180;-1:-1:-1;1961:180:1:o;2543:247::-;2602:6;2655:2;2643:9;2634:7;2630:23;2626:32;2623:52;;;2671:1;2668;2661:12;2623:52;2710:9;2697:23;2729:31;2754:5;2729:31;:::i;:::-;2779:5;2543:247;-1:-1:-1;;;2543:247:1:o;2795:461::-;2848:3;2886:5;2880:12;2913:6;2908:3;2901:19;2939:4;2968:2;2963:3;2959:12;2952:19;;3005:2;2998:5;2994:14;3026:1;3036:195;3050:6;3047:1;3044:13;3036:195;;;3115:13;;-1:-1:-1;;;;;3111:39:1;3099:52;;3171:12;;;;3206:15;;;;3147:1;3065:9;3036:195;;;-1:-1:-1;3247:3:1;;2795:461;-1:-1:-1;;;;;2795:461:1:o;3261:261::-;3440:2;3429:9;3422:21;3403:4;3460:56;3512:2;3501:9;3497:18;3489:6;3460:56;:::i;3760:118::-;3846:5;3839:13;3832:21;3825:5;3822:32;3812:60;;3868:1;3865;3858:12;3883:382;3948:6;3956;4009:2;3997:9;3988:7;3984:23;3980:32;3977:52;;;4025:1;4022;4015:12;3977:52;4064:9;4051:23;4083:31;4108:5;4083:31;:::i;:::-;4133:5;-1:-1:-1;4190:2:1;4175:18;;4162:32;4203:30;4162:32;4203:30;:::i;:::-;4252:7;4242:17;;;3883:382;;;;;:::o;4270:248::-;4338:6;4346;4399:2;4387:9;4378:7;4374:23;4370:32;4367:52;;;4415:1;4412;4405:12;4367:52;-1:-1:-1;;4438:23:1;;;4508:2;4493:18;;;4480:32;;-1:-1:-1;4270:248:1:o;4523:388::-;4591:6;4599;4652:2;4640:9;4631:7;4627:23;4623:32;4620:52;;;4668:1;4665;4658:12;4620:52;4707:9;4694:23;4726:31;4751:5;4726:31;:::i;:::-;4776:5;-1:-1:-1;4833:2:1;4818:18;;4805:32;4846:33;4805:32;4846:33;:::i;5150:380::-;5229:1;5225:12;;;;5272;;;5293:61;;5347:4;5339:6;5335:17;5325:27;;5293:61;5400:2;5392:6;5389:14;5369:18;5366:38;5363:161;;5446:10;5441:3;5437:20;5434:1;5427:31;5481:4;5478:1;5471:15;5509:4;5506:1;5499:15;5363:161;;5150:380;;;:::o;6195:127::-;6256:10;6251:3;6247:20;6244:1;6237:31;6287:4;6284:1;6277:15;6311:4;6308:1;6301:15;6327:125;6392:9;;;6413:10;;;6410:36;;;6426:18;;:::i;6457:168::-;6530:9;;;6561;;6578:15;;;6572:22;;6558:37;6548:71;;6599:18;;:::i;6630:217::-;6670:1;6696;6686:132;;6740:10;6735:3;6731:20;6728:1;6721:31;6775:4;6772:1;6765:15;6803:4;6800:1;6793:15;6686:132;-1:-1:-1;6832:9:1;;6630:217::o;6852:128::-;6919:9;;;6940:11;;;6937:37;;;6954:18;;:::i;6985:179::-;7020:3;7062:1;7044:16;7041:23;7038:120;;;7108:1;7105;7102;7087:23;-1:-1:-1;7145:1:1;7139:8;7134:3;7130:18;7038:120;6985:179;:::o;7301:346::-;7411:2;7392:13;;-1:-1:-1;;7388:27:1;7376:40;;7446:18;7431:34;;7467:22;;;7428:62;7425:185;;;7532:10;7527:3;7523:20;7520:1;7513:31;7567:4;7564:1;7557:15;7595:4;7592:1;7585:15;7425:185;7626:2;7619:22;-1:-1:-1;;7301:346:1:o;7652:671::-;7691:3;7733:4;7715:16;7712:26;7709:39;;;7652:671;:::o;7709:39::-;7775:2;7769:9;-1:-1:-1;;7840:16:1;7836:25;;7833:1;7769:9;7812:50;7891:4;7885:11;7915:16;7950:18;8021:2;8014:4;8006:6;8002:17;7999:25;7994:2;7986:6;7983:14;7980:45;7977:58;;;8028:5;;;;;7652:671;:::o;7977:58::-;8065:6;8059:4;8055:17;8044:28;;8101:3;8095:10;8128:2;8120:6;8117:14;8114:27;;;8134:5;;;;;;7652:671;:::o;8114:27::-;8218:2;8199:16;8193:4;8189:27;8185:36;8178:4;8169:6;8164:3;8160:16;8156:27;8153:69;8150:82;;;8225:5;;;;;;7652:671;:::o;8150:82::-;8241:57;8292:4;8283:6;8275;8271:19;8267:30;8261:4;8241:57;:::i;:::-;-1:-1:-1;8314:3:1;;7652:671;-1:-1:-1;;;;;7652:671:1:o;8328:398::-;8530:2;8512:21;;;8569:2;8549:18;;;8542:30;8608:34;8603:2;8588:18;;8581:62;-1:-1:-1;;;8674:2:1;8659:18;;8652:32;8716:3;8701:19;;8328:398::o;9061:274::-;-1:-1:-1;;;;;9253:32:1;;;;9235:51;;9317:2;9302:18;;9295:34;9223:2;9208:18;;9061:274::o;9340:245::-;9407:6;9460:2;9448:9;9439:7;9435:23;9431:32;9428:52;;;9476:1;9473;9466:12;9428:52;9508:9;9502:16;9527:28;9549:5;9527:28;:::i;9590:325::-;9792:2;9774:21;;;9831:1;9811:18;;;9804:29;-1:-1:-1;;;9864:2:1;9849:18;;9842:32;9906:2;9891:18;;9590:325::o;10503:184::-;10573:6;10626:2;10614:9;10605:7;10601:23;10597:32;10594:52;;;10642:1;10639;10632:12;10594:52;-1:-1:-1;10665:16:1;;10503:184;-1:-1:-1;10503:184:1:o;11050:349::-;11252:2;11234:21;;;11291:2;11271:18;;;11264:30;11330:27;11325:2;11310:18;;11303:55;11390:2;11375:18;;11050:349::o;12043:251::-;12113:6;12166:2;12154:9;12145:7;12141:23;12137:32;12134:52;;;12182:1;12179;12172:12;12134:52;12214:9;12208:16;12233:31;12258:5;12233:31;:::i;12959:325::-;13161:2;13143:21;;;13200:1;13180:18;;;13173:29;-1:-1:-1;;;13233:2:1;13218:18;;13211:32;13275:2;13260:18;;12959:325::o;14279:375::-;-1:-1:-1;;;;;14537:15:1;;;14519:34;;14589:15;;;;14584:2;14569:18;;14562:43;14636:2;14621:18;;14614:34;;;;14469:2;14454:18;;14279:375::o;15754:306::-;15842:6;15850;15858;15911:2;15899:9;15890:7;15886:23;15882:32;15879:52;;;15927:1;15924;15917:12;15879:52;15956:9;15950:16;15940:26;;16006:2;15995:9;15991:18;15985:25;15975:35;;16050:2;16039:9;16035:18;16029:25;16019:35;;15754:306;;;;;:::o;17719:342::-;17921:2;17903:21;;;17960:2;17940:18;;;17933:30;-1:-1:-1;;;17994:2:1;17979:18;;17972:48;18052:2;18037:18;;17719:342::o;19854:503::-;20116:34;20111:3;20104:47;-1:-1:-1;;;20176:2:1;20171:3;20167:12;20160:32;20086:3;20221:6;20215:13;20237:73;20303:6;20298:2;20293:3;20289:12;20284:2;20276:6;20272:15;20237:73;:::i;:::-;20330:16;;;;20348:2;20326:25;;19854:503;-1:-1:-1;;19854:503:1:o;21107:607::-;-1:-1:-1;;;;;21466:15:1;;;21448:34;;21513:2;21498:18;;21491:34;;;;21556:2;21541:18;;21534:34;;;;21599:2;21584:18;;21577:34;;;;21648:15;;;21642:3;21627:19;;21620:44;21428:3;21680:19;;21673:35;;;;21397:3;21382:19;;21107:607::o;24724:127::-;24785:10;24780:3;24776:20;24773:1;24766:31;24816:4;24813:1;24806:15;24840:4;24837:1;24830:15;24856:574;25147:6;25136:9;25129:25;25190:6;25185:2;25174:9;25170:18;25163:34;25233:3;25228:2;25217:9;25213:18;25206:31;25110:4;25254:57;25306:3;25295:9;25291:19;25283:6;25254:57;:::i;:::-;-1:-1:-1;;;;;25347:32:1;;;;25342:2;25327:18;;25320:60;-1:-1:-1;25411:3:1;25396:19;25389:35;25246:65;24856:574;-1:-1:-1;;;24856:574:1:o;26600:459::-;26862:29;26857:3;26850:42;26832:3;26921:6;26915:13;26937:75;27005:6;27000:2;26995:3;26991:12;26984:4;26976:6;26972:17;26937:75;:::i;:::-;27032:16;;;;27050:2;27028:25;;26600:459;-1:-1:-1;;26600:459:1:o;29361:135::-;29400:3;29421:17;;;29418:43;;29441:18;;:::i;:::-;-1:-1:-1;29488:1:1;29477:13;;29361:135::o;29831:127::-;29892:10;29887:3;29883:20;29880:1;29873:31;29923:4;29920:1;29913:15;29947:4;29944:1;29937:15

Swarm Source

ipfs://06af8156c9a091de0f92d96ef3197cb2aeb142c8fb267846b05232599af30118
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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