ETH Price: $3,394.97 (+2.42%)

Token

Black Dog (BLACKDOG)
 

Overview

Max Total Supply

1,000,000,000 BLACKDOG

Holders

33

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
arnonymous.eth
Balance
10,475,784.330996365883593903 BLACKDOG

Value
$0.00
0x47584f11a998c19dda33d8ca4002fbe892ac899b
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BLACKDOG

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-06
*/

/**

___.   .__                 __       .___             
\_ |__ |  | _____    ____ |  | __ __| _/____   ____  
 | __ \|  | \__  \ _/ ___\|  |/ // __ |/  _ \ / ___\ 
 | \_\ \  |__/ __ \\  \___|    </ /_/ (  <_> ) /_/  >
 |___  /____(____  /\___  >__|_ \____ |\____/\___  / 
     \/          \/     \/     \/    \/     /_____/  


https://blackdogtoken.xyz


*/

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

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    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 override returns (string memory) {
        return _name;
    }

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

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

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

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

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _createInitialSupply(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface ILpPair {
    function sync() external;
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(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 swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
    function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
    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 getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}

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

contract TokenHandler is Ownable {
    function sendTokenToOwner(address token) external onlyOwner {
        if(IERC20(token).balanceOf(address(this)) > 0){
            IERC20(token).transfer(owner(), IERC20(token).balanceOf(address(this)));
        }
    }
}

contract BLACKDOG is ERC20, Ownable {

    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWalletAmount;

    IDexRouter public immutable dexRouter;
    address public immutable lpPair;

    TokenHandler public immutable tokenHandler;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address public operationsAddress;
    address public marketingAddress;

    uint256 public tradingActiveBlock = 0; // 0 means trading is not active

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;
    
     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    IERC20 public constant USDC = IERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); // Testnet: 0xeb8f08a975Ab53E34D8a0330E0D34de942C95926  //Mainnet: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48

    uint256 public buyTotalFees;
    uint256 public buyOperationsFee;
    uint256 public buyLiquidityFee;
    uint256 public buyMarketingFee;

    uint256 public sellTotalFees;
    uint256 public sellOperationsFee;
    uint256 public sellLiquidityFee;
    uint256 public sellMarketingFee;

    uint256 public tokensForOperations;
    uint256 public tokensForLiquidity;
    uint256 public tokensForMarketing;

    uint256 public lpWithdrawRequestTimestamp;
    uint256 public lpWithdrawRequestDuration = 3 days;
    bool public lpWithdrawRequestPending;
    uint256 public lpPercToWithDraw;
    
    /******************/

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event EnabledTrading();
    event RemovedLimits();

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event UpdatedMaxBuyAmount(uint256 newAmount);

    event UpdatedMaxSellAmount(uint256 newAmount);

    event UpdatedMaxWalletAmount(uint256 newAmount);

    event UpdatedOperationsAddress(address indexed newWallet);

    event UpdatedMarketingAddress(address indexed newWallet);

    event MaxTransactionExclusion(address _address, bool excluded);

    event RequestedLPWithdraw();

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    event TransferForeignToken(address token, uint256 amount);

    constructor() ERC20("Black Dog", "BLACKDOG") {
        
        address newOwner = msg.sender; // can leave alone if owner is deployer.
        
        IDexRouter _dexRouter = IDexRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        _excludeFromMaxTransaction(address(_dexRouter), true);
        dexRouter = _dexRouter;
        
        lpPair = IDexFactory(_dexRouter.factory()).createPair(address(this), address(USDC));
        _setAutomatedMarketMakerPair(address(lpPair), true);

        tokenHandler = new TokenHandler();
 
        uint256 totalSupply = 1 * 1e9 * 1e18;
        
        maxBuyAmount = totalSupply * 10 / 1000;
        maxSellAmount = totalSupply * 5 / 1000;
        maxWalletAmount = totalSupply * 15 / 1000;
        swapTokensAtAmount = totalSupply * 25 / 100000; // 0.025% swap amount

        buyOperationsFee = 8;
        buyLiquidityFee = 5;
        buyMarketingFee = 0;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyMarketingFee;

        sellOperationsFee = 8;
        sellLiquidityFee = 5;
        sellMarketingFee = 0;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellMarketingFee;

        _excludeFromMaxTransaction(newOwner, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(0xdead), true);

        excludeFromFees(newOwner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        operationsAddress = address(newOwner);
        marketingAddress = address(newOwner);
        
        _createInitialSupply(newOwner, totalSupply);
        transferOwnership(newOwner);
    }

    receive() external payable {}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        require(!tradingActive, "Cannot reenable trading");
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
        emit EnabledTrading();
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        transferDelayEnabled = false;
        emit RemovedLimits();
    }
    
   
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner {
        transferDelayEnabled = false;
    }
    
    function updateMaxBuyAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max buy amount lower than 0.1%");
        maxBuyAmount = newNum * (10**18);
        emit UpdatedMaxBuyAmount(maxBuyAmount);
    }
    
    function updateMaxSellAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max sell amount lower than 0.1%");
        maxSellAmount = newNum * (10**18);
        emit UpdatedMaxSellAmount(maxSellAmount);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 3 / 1000)/1e18, "Cannot set max wallet amount lower than 0.3%");
        maxWalletAmount = newNum * (10**18);
        emit UpdatedMaxWalletAmount(maxWalletAmount);
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 1 / 1000, "Swap amount cannot be higher than 0.1% total supply.");
  	    swapTokensAtAmount = newAmount;
  	}
    
    function _excludeFromMaxTransaction(address updAds, bool isExcluded) private {
        _isExcludedMaxTransactionAmount[updAds] = isExcluded;
        emit MaxTransactionExclusion(updAds, isExcluded);
    }

    function airdropToWallets(address[] memory wallets, uint256[] memory amountsInTokens) external onlyOwner {
        require(wallets.length == amountsInTokens.length, "arrays must be the same length");
        require(wallets.length < 200, "Can only airdrop 200 wallets per txn due to gas limits"); // allows for airdrop + launch at the same exact time, reducing delays and reducing sniper input.
        for(uint256 i = 0; i < wallets.length; i++){
            address wallet = wallets[i];
            uint256 amount = amountsInTokens[i]*1e18;
            _transfer(msg.sender, wallet, amount);
        }
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) external onlyOwner {
        if(!isEx){
            require(updAds != lpPair, "Cannot remove uniswap pair from max txn");
        }
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != lpPair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;
        
        _excludeFromMaxTransaction(pair, value);

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateBuyFees(uint256 _operationsFee, uint256 _liquidityFee, uint256 _marketingFee) external onlyOwner {
        buyOperationsFee = _operationsFee;
        buyLiquidityFee = _liquidityFee;
        buyMarketingFee = _marketingFee;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyMarketingFee;
        require(buyTotalFees <= 30, "Must keep fees at 30% or less");
    }

    function updateSellFees(uint256 _operationsFee, uint256 _liquidityFee, uint256 _marketingFee) external onlyOwner {
        sellOperationsFee = _operationsFee;
        sellLiquidityFee = _liquidityFee;
        sellMarketingFee = _marketingFee;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellMarketingFee;
        require(sellTotalFees <= 50, "Must keep fees at 50% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function _transfer(address from, address to, uint256 amount) internal override {

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "amount must be greater than 0");
        
        
        if(limitsInEffect){
            if (from != owner() && to != owner() && to != address(0) && to != address(0xdead)){
                if(!tradingActive){
                    require(_isExcludedMaxTransactionAmount[from] || _isExcludedMaxTransactionAmount[to], "Trading is not active.");
                }
                
                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != address(dexRouter) && to != address(lpPair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number - 4 && _holderLastTransferTimestamp[to] < block.number - 4, "_transfer:: Transfer Delay enabled.  Try again later.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                        _holderLastTransferTimestamp[to] = block.number;
                    }
                }
                 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxBuyAmount, "Buy transfer amount exceeds the max buy.");
                        require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                } 
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxSellAmount, "Sell transfer amount exceeds the max sell.");
                } 
                else if (!_isExcludedMaxTransactionAmount[to] && !_isExcludedMaxTransactionAmount[from]){
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if(canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = true;
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        uint256 penaltyAmount = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // bot/sniper penalty.  Tokens get transferred to marketing wallet to allow potential refund.
            if(tradingActiveBlock + 1 >= block.number && automatedMarketMakerPairs[from]){
                penaltyAmount = amount * 99 / 100;
                super._transfer(from, operationsAddress, penaltyAmount);
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount * sellTotalFees /100;
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForOperations += fees * sellOperationsFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount * buyTotalFees / 100;
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForOperations += fees * buyOperationsFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
            }
            
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees + penaltyAmount;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

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

        // make the swap
        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 usdcAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(dexRouter), tokenAmount);
        USDC.approve(address(dexRouter), usdcAmount);

        // add the liquidity
        dexRouter.addLiquidity(address(this), address(USDC), tokenAmount, usdcAmount, 0,  0,  address(this), block.timestamp);
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForOperations + tokensForMarketing;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmount * 10){
            contractBalance = swapTokensAtAmount * 10;
        }
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        
        swapTokensForUSDC(contractBalance - liquidityTokens); 

        tokenHandler.sendTokenToOwner(address(USDC));
        
        uint256 usdcBalance = USDC.balanceOf(address(this));
        uint256 usdcForLiquidity = usdcBalance;

        uint256 usdcForOperations = usdcBalance * tokensForOperations / (totalTokensToSwap - (tokensForLiquidity/2));
        uint256 usdcForMarketing = usdcBalance * tokensForMarketing / (totalTokensToSwap - (tokensForLiquidity/2));

        usdcForLiquidity -= usdcForOperations + usdcForMarketing;
            
        tokensForLiquidity = 0;
        tokensForOperations = 0;
        tokensForMarketing = 0;
        
        if(liquidityTokens > 0 && usdcForLiquidity > 0){
            addLiquidity(liquidityTokens, usdcForLiquidity);
        }

        if(usdcForMarketing > 0){
            USDC.transfer(marketingAddress, usdcForMarketing);
        }

        if(USDC.balanceOf(address(this)) > 0){
            USDC.transfer(operationsAddress, USDC.balanceOf(address(this)));
        }
    }

    function transferForeignToken(address _token, address _to) external onlyOwner returns (bool _sent) {
        require(_token != address(0), "_token address cannot be 0");
        require(_token != address(this), "Can't withdraw native tokens");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
        emit TransferForeignToken(_token, _contractBalance);
    }

    function swapTokensForUSDC(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = address(USDC);

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

        // make the swap
        dexRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(tokenHandler),
            block.timestamp
        );
    }

    // withdraw ETH if stuck or someone sends to the address
    function withdrawStuckETH() external onlyOwner {
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

    function setOperationsAddress(address _operationsAddress) external onlyOwner {
        require(_operationsAddress != address(0), "_operationsAddress address cannot be 0");
        operationsAddress = payable(_operationsAddress);
        emit UpdatedOperationsAddress(_operationsAddress);
    }

    function setMarketingAddress(address _marketingAddress) external onlyOwner {
        require(_marketingAddress != address(0), "_marketingAddress address cannot be 0");
        marketingAddress = payable(_marketingAddress);
        emit UpdatedMarketingAddress(_marketingAddress);
    }

    function requestToWithdrawLP(uint256 percToWithdraw) external onlyOwner {
        require(!lpWithdrawRequestPending, "Cannot request again until first request is over.");
        require(percToWithdraw <= 100 && percToWithdraw > 0, "Need to set between 1-100%");
        lpWithdrawRequestTimestamp = block.timestamp;
        lpWithdrawRequestPending = true;
        lpPercToWithDraw = percToWithdraw;
        emit RequestedLPWithdraw();
    }

    function nextAvailableLpWithdrawDate() public view returns (uint256){
        if(lpWithdrawRequestPending){
            return lpWithdrawRequestTimestamp + lpWithdrawRequestDuration;
        }
        else {
            return 0;  // 0 means no open requests
        }
    }

    function withdrawRequestedLP() external onlyOwner {
        require(block.timestamp >= nextAvailableLpWithdrawDate() && nextAvailableLpWithdrawDate() > 0, "Must request and wait.");
        lpWithdrawRequestTimestamp = 0;
        lpWithdrawRequestPending = false;

        uint256 amtToWithdraw = IERC20(address(lpPair)).balanceOf(address(this)) * lpPercToWithDraw / 100;
        
        lpPercToWithDraw = 0;

        IERC20(lpPair).transfer(msg.sender, amtToWithdraw);
    }

    function cancelLPWithdrawRequest() external onlyOwner {
        lpWithdrawRequestPending = false;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledTrading","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"MaxTransactionExclusion","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":[],"name":"RemovedLimits","type":"event"},{"anonymous":false,"inputs":[],"name":"RequestedLPWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","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":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferForeignToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedMarketingAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxBuyAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxSellAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxWalletAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedOperationsAddress","type":"event"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amountsInTokens","type":"uint256[]"}],"name":"airdropToWallets","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyOperationsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelLPWithdrawRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","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":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPercToWithDraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestPending","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextAvailableLpWithdrawDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percToWithdraw","type":"uint256"}],"name":"requestToWithdrawLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellOperationsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operationsAddress","type":"address"}],"name":"setOperationsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenHandler","outputs":[{"internalType":"contract TokenHandler","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRequestedLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040526000600d55600e805462ffffff191660019081179091556010805460ff191690911790556203f480601d553480156200003c57600080fd5b506040805180820182526009815268426c61636b20446f6760b81b602080830191825283518085019094526008845267424c41434b444f4760c01b9084015281519192916200008e9160039162000750565b508051620000a490600490602084019062000750565b5050506000620000b9620003ef60201b60201c565b600580546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062004a3a833981519152908290a35033737a250d5630b4cf539739df2c5dacb4c659f2488d62000119816001620003f3565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000164573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200018a919062000804565b6040516364e329cb60e11b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860248201526001600160a01b03919091169063c9c65396906044016020604051808303816000875af1158015620001ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000213919062000804565b6001600160a01b031660a08190526200022e90600162000456565b6040516200023c90620007df565b604051809103906000f08015801562000259573d6000803e3d6000fd5b506001600160a01b031660c0526b033b2e3c9fd0803ce80000006103e86200028382600a6200084c565b6200028f91906200086e565b6006556103e8620002a28260056200084c565b620002ae91906200086e565b6007556103e8620002c182600f6200084c565b620002cd91906200086e565b600855620186a0620002e18260196200084c565b620002ed91906200086e565b600a556008601281905560056013819055600060148190559162000312919062000891565b6200031e919062000891565b6011556008601681905560056017819055600060188190559162000343919062000891565b6200034f919062000891565b6015556200035f836001620003f3565b6200036c306001620003f3565b6200037b61dead6001620003f3565b62000388836001620004c2565b62000395306001620004c2565b620003a461dead6001620004c2565b600b80546001600160a01b0385166001600160a01b03199182168117909255600c80549091169091179055620003db83826200056e565b620003e68362000653565b505050620008e8565b3390565b6001600160a01b038216600081815260216020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382166000908152602260205260409020805460ff1916821515179055620004868282620003f3565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314620005115760405162461bcd60e51b8152602060048201819052602482015260008051602062004a1a83398151915260448201526064015b60405180910390fd5b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620005c65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000508565b8060026000828254620005da919062000891565b90915550506001600160a01b038216600090815260208190526040812080548392906200060990849062000891565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b031633146200069e5760405162461bcd60e51b8152602060048201819052602482015260008051602062004a1a833981519152604482015260640162000508565b6001600160a01b038116620007055760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000508565b6005546040516001600160a01b0380841692169060008051602062004a3a83398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b8280546200075e90620008ac565b90600052602060002090601f016020900481019282620007825760008555620007cd565b82601f106200079d57805160ff1916838001178555620007cd565b82800160010185558215620007cd579182015b82811115620007cd578251825591602001919060010190620007b0565b50620007db929150620007ed565b5090565b6104d6806200454483390190565b5b80821115620007db5760008155600101620007ee565b6000602082840312156200081757600080fd5b81516001600160a01b03811681146200082f57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000869576200086962000836565b500290565b6000826200088c57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115620008a757620008a762000836565b500190565b600181811c90821680620008c157607f821691505b602082108103620008e257634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c051613bd1620009736000396000818161052801528181612d6001526133c60152600081816106100152818161120f015281816113830152818161142e01528181611928015261250a015260008181610451015281816124cd01528181613356015281816133920152818161342c01528181613468015261354e0152613bd16000f3fe6080604052600436106103e85760003560e01c806389a3027111610208578063c7c61e2c11610118578063ea4cfe12116100ab578063f2fde38b1161007a578063f2fde38b14610b73578063f5648a4f14610b93578063f637434214610ba8578063fb002c9714610bbe578063fd361d0e14610bd457600080fd5b8063ea4cfe1214610b11578063ee40166e14610b31578063ee44b44e14610b47578063f11a24d314610b5d57600080fd5b8063dc3f0d0f116100e7578063dc3f0d0f14610a80578063dd62ed3e14610aa0578063e2f4560514610ae6578063e884f26014610afc57600080fd5b8063c7c61e2c14610a1b578063c876d0b914610a30578063d257b34f14610a4a578063d85ba06314610a6a57600080fd5b8063a5ece9411161019b578063bbc0c7421161016a578063bbc0c7421461097c578063befd2fac1461099b578063c0246668146109bb578063c17b5b8c146109db578063c18bc195146109fb57600080fd5b8063a5ece941146108f6578063a9059cbb14610916578063aa4bde2814610936578063b62496f51461094c57600080fd5b806392136913116101d7578063921369131461088b57806395d89b41146108a15780639a7a23d6146108b6578063a457c2d7146108d657600080fd5b806389a30271146108105780638a8c523c146108385780638da5cb5b1461084d578063906e9dd01461086b57600080fd5b80634a62bb6511610303578063715018a611610296578063783102eb11610265578063783102eb1461078e5780637bce5a04146107a45780638095d564146107ba5780638366e79a146107da57806388e765ff146107fa57600080fd5b8063715018a61461072f578063751039fc146107445780637571336a14610759578063763cef491461077957600080fd5b80636a486a8e116102d25780636a486a8e146106ae5780636ddd1713146106c457806370a08231146106e4578063712c29851461071a57600080fd5b80634a62bb65146106525780634f77f6c01461066c5780635a139dd41461068257806366d602ae1461069857600080fd5b80631f3fed8f1161037b578063313ce5671161034a578063313ce567146105c257806339509351146105de578063452ed4f1146105fe578063499b83941461063257600080fd5b80631f3fed8f1461054a5780632307b4411461056057806323b872dd146105825780632be32b61146105a257600080fd5b806310d5de53116103b757806310d5de53146104bb57806318160ddd146104eb5780631a8145bb146105005780631b3d6e871461051657600080fd5b8063058054c9146103f457806306fdde031461041d5780630758d9241461043f578063095ea7b31461048b57600080fd5b366103ef57005b600080fd5b34801561040057600080fd5b5061040a601c5481565b6040519081526020015b60405180910390f35b34801561042957600080fd5b50610432610bee565b60405161041491906135cb565b34801561044b57600080fd5b506104737f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610414565b34801561049757600080fd5b506104ab6104a636600461363c565b610c80565b6040519015158152602001610414565b3480156104c757600080fd5b506104ab6104d6366004613666565b60216020526000908152604090205460ff1681565b3480156104f757600080fd5b5060025461040a565b34801561050c57600080fd5b5061040a601a5481565b34801561052257600080fd5b506104737f000000000000000000000000000000000000000000000000000000000000000081565b34801561055657600080fd5b5061040a601b5481565b34801561056c57600080fd5b5061058061057b36600461375e565b610c96565b005b34801561058e57600080fd5b506104ab61059d36600461381e565b610e0a565b3480156105ae57600080fd5b506105806105bd36600461385a565b610eb4565b3480156105ce57600080fd5b5060405160128152602001610414565b3480156105ea57600080fd5b506104ab6105f936600461363c565b610fc1565b34801561060a57600080fd5b506104737f000000000000000000000000000000000000000000000000000000000000000081565b34801561063e57600080fd5b5061058061064d366004613666565b610ffd565b34801561065e57600080fd5b50600e546104ab9060ff1681565b34801561067857600080fd5b5061040a60165481565b34801561068e57600080fd5b5061040a60125481565b3480156106a457600080fd5b5061040a60075481565b3480156106ba57600080fd5b5061040a60155481565b3480156106d057600080fd5b50600e546104ab9062010000900460ff1681565b3480156106f057600080fd5b5061040a6106ff366004613666565b6001600160a01b031660009081526020819052604090205490565b34801561072657600080fd5b5061040a6110d6565b34801561073b57600080fd5b506105806110ff565b34801561075057600080fd5b50610580611173565b34801561076557600080fd5b50610580610774366004613884565b6111de565b34801561078557600080fd5b506105806112c9565b34801561079a57600080fd5b5061040a601f5481565b3480156107b057600080fd5b5061040a60145481565b3480156107c657600080fd5b506105806107d53660046138bb565b6114a7565b3480156107e657600080fd5b506104ab6107f53660046138e7565b61154a565b34801561080657600080fd5b5061040a60065481565b34801561081c57600080fd5b5061047373a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b34801561084457600080fd5b50610580611753565b34801561085957600080fd5b506005546001600160a01b0316610473565b34801561087757600080fd5b50610580610886366004613666565b611815565b34801561089757600080fd5b5061040a60185481565b3480156108ad57600080fd5b506104326118ed565b3480156108c257600080fd5b506105806108d1366004613884565b6118fc565b3480156108e257600080fd5b506104ab6108f136600461363c565b6119d7565b34801561090257600080fd5b50600c54610473906001600160a01b031681565b34801561092257600080fd5b506104ab61093136600461363c565b611a70565b34801561094257600080fd5b5061040a60085481565b34801561095857600080fd5b506104ab610967366004613666565b60226020526000908152604090205460ff1681565b34801561098857600080fd5b50600e546104ab90610100900460ff1681565b3480156109a757600080fd5b506105806109b636600461385a565b611a7d565b3480156109c757600080fd5b506105806109d6366004613884565b611bb3565b3480156109e757600080fd5b506105806109f63660046138bb565b611c3a565b348015610a0757600080fd5b50610580610a1636600461385a565b611cdd565b348015610a2757600080fd5b50610580611de6565b348015610a3c57600080fd5b506010546104ab9060ff1681565b348015610a5657600080fd5b50610580610a6536600461385a565b611e1c565b348015610a7657600080fd5b5061040a60115481565b348015610a8c57600080fd5b50610580610a9b36600461385a565b611f67565b348015610aac57600080fd5b5061040a610abb3660046138e7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610af257600080fd5b5061040a600a5481565b348015610b0857600080fd5b5061058061206e565b348015610b1d57600080fd5b50600b54610473906001600160a01b031681565b348015610b3d57600080fd5b5061040a600d5481565b348015610b5357600080fd5b5061040a601d5481565b348015610b6957600080fd5b5061040a60135481565b348015610b7f57600080fd5b50610580610b8e366004613666565b6120a4565b348015610b9f57600080fd5b5061058061218f565b348015610bb457600080fd5b5061040a60175481565b348015610bca57600080fd5b5061040a60195481565b348015610be057600080fd5b50601e546104ab9060ff1681565b606060038054610bfd9061391a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c299061391a565b8015610c765780601f10610c4b57610100808354040283529160200191610c76565b820191906000526020600020905b815481529060010190602001808311610c5957829003601f168201915b5050505050905090565b6000610c8d338484612206565b50600192915050565b6005546001600160a01b03163314610cc95760405162461bcd60e51b8152600401610cc090613954565b60405180910390fd5b8051825114610d1a5760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610cc0565b60c8825110610d8a5760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203230302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610cc0565b60005b8251811015610e05576000838281518110610daa57610daa613989565b602002602001015190506000838381518110610dc857610dc8613989565b6020026020010151670de0b6b3a7640000610de391906139b5565b9050610df033838361232a565b50508080610dfd906139d4565b915050610d8d565b505050565b6000610e1784848461232a565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610e9c5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610cc0565b610ea98533858403612206565b506001949350505050565b6005546001600160a01b03163314610ede5760405162461bcd60e51b8152600401610cc090613954565b670de0b6b3a76400006103e8610ef360025490565b610efe9060016139b5565b610f0891906139ed565b610f1291906139ed565b811015610f735760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e312560b81b6064820152608401610cc0565b610f8581670de0b6b3a76400006139b5565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c8d918590610ff8908690613a0f565b612206565b6005546001600160a01b031633146110275760405162461bcd60e51b8152600401610cc090613954565b6001600160a01b03811661108c5760405162461bcd60e51b815260206004820152602660248201527f5f6f7065726174696f6e734164647265737320616464726573732063616e6e6f60448201526507420626520360d41b6064820152608401610cc0565b600b80546001600160a01b0319166001600160a01b0383169081179091556040517f4efa56652237561d0f1fd31311aeaaa41f3b754a461545ed3cf6ced5876d298290600090a250565b601e5460009060ff16156110f957601d54601c546110f49190613a0f565b905090565b50600090565b6005546001600160a01b031633146111295760405162461bcd60e51b8152600401610cc090613954565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461119d5760405162461bcd60e51b8152600401610cc090613954565b600e805460ff199081169091556010805490911690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146112085760405162461bcd60e51b8152600401610cc090613954565b8061129e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361129e5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610cc0565b6001600160a01b03919091166000908152602160205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146112f35760405162461bcd60e51b8152600401610cc090613954565b6112fb6110d6565b42101580156113115750600061130f6110d6565b115b6113565760405162461bcd60e51b815260206004820152601660248201527526bab9ba103932b8bab2b9ba1030b732103bb0b4ba1760511b6044820152606401610cc0565b6000601c819055601e805460ff19169055601f546040516370a0823160e01b8152306004820152606491907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156113d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f69190613a27565b61140091906139b5565b61140a91906139ed565b6000601f5560405163a9059cbb60e01b8152336004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af115801561147f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a39190613a40565b5050565b6005546001600160a01b031633146114d15760405162461bcd60e51b8152600401610cc090613954565b601283905560138290556014819055806114eb8385613a0f565b6114f59190613a0f565b6011819055601e1015610e055760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401610cc0565b6005546000906001600160a01b031633146115775760405162461bcd60e51b8152600401610cc090613954565b6001600160a01b0383166115cd5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610cc0565b306001600160a01b038416036116255760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610cc0565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa15801561166c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116909190613a27565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af11580156116e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117079190613a40565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b0316331461177d5760405162461bcd60e51b8152600401610cc090613954565b600e54610100900460ff16156117d55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610cc0565b600e805462ffff0019166201010017905543600d556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a1565b6005546001600160a01b0316331461183f5760405162461bcd60e51b8152600401610cc090613954565b6001600160a01b0381166118a35760405162461bcd60e51b815260206004820152602560248201527f5f6d61726b6574696e674164647265737320616464726573732063616e6e6f74604482015264020626520360dc1b6064820152608401610cc0565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517fd1e7d6a3390dd5008bd1c57798817b9f806e4c417264e7d3d67e42e784dc24a990600090a250565b606060048054610bfd9061391a565b6005546001600160a01b031633146119265760405162461bcd60e51b8152600401610cc090613954565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036119cd5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610cc0565b6114a38282612c27565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611a595760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610cc0565b611a663385858403612206565b5060019392505050565b6000610c8d33848461232a565b6005546001600160a01b03163314611aa75760405162461bcd60e51b8152600401610cc090613954565b601e5460ff1615611b145760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f74207265717565737420616761696e20756e74696c206669727374604482015270103932b8bab2b9ba1034b99037bb32b91760791b6064820152608401610cc0565b60648111158015611b255750600081115b611b715760405162461bcd60e51b815260206004820152601a60248201527f4e65656420746f20736574206265747765656e20312d313030250000000000006044820152606401610cc0565b42601c55601e805460ff19166001179055601f8190556040517fd99a77b2f3951cd076e75814e44db497e6abc203dd251329da0b62c288f9f48b90600090a150565b6005546001600160a01b03163314611bdd5760405162461bcd60e51b8152600401610cc090613954565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611c645760405162461bcd60e51b8152600401610cc090613954565b60168390556017829055601881905580611c7e8385613a0f565b611c889190613a0f565b601581905560321015610e055760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420353025206f72206c6573730000006044820152606401610cc0565b6005546001600160a01b03163314611d075760405162461bcd60e51b8152600401610cc090613954565b670de0b6b3a76400006103e8611d1c60025490565b611d279060036139b5565b611d3191906139ed565b611d3b91906139ed565b811015611d9f5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610cc0565b611db181670de0b6b3a76400006139b5565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610fb6565b6005546001600160a01b03163314611e105760405162461bcd60e51b8152600401610cc090613954565b601e805460ff19169055565b6005546001600160a01b03163314611e465760405162461bcd60e51b8152600401610cc090613954565b620186a0611e5360025490565b611e5e9060016139b5565b611e6891906139ed565b811015611ed55760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610cc0565b6103e8611ee160025490565b611eec9060016139b5565b611ef691906139ed565b811115611f625760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610cc0565b600a55565b6005546001600160a01b03163314611f915760405162461bcd60e51b8152600401610cc090613954565b670de0b6b3a76400006103e8611fa660025490565b611fb19060016139b5565b611fbb91906139ed565b611fc591906139ed565b8110156120275760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e312560b01b6064820152608401610cc0565b61203981670de0b6b3a76400006139b5565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610fb6565b6005546001600160a01b031633146120985760405162461bcd60e51b8152600401610cc090613954565b6010805460ff19169055565b6005546001600160a01b031633146120ce5760405162461bcd60e51b8152600401610cc090613954565b6001600160a01b0381166121335760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cc0565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146121b95760405162461bcd60e51b8152600401610cc090613954565b604051600090339047908381818185875af1925050503d80600081146121fb576040519150601f19603f3d011682016040523d82523d6000602084013e612200565b606091505b50505050565b6001600160a01b0383166122685760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cc0565b6001600160a01b0382166122c95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cc0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166123505760405162461bcd60e51b8152600401610cc090613a5d565b6001600160a01b0382166123765760405162461bcd60e51b8152600401610cc090613aa2565b600081116123c65760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610cc0565b600e5460ff161561289a576005546001600160a01b038481169116148015906123fd57506005546001600160a01b03838116911614155b801561241157506001600160a01b03821615155b801561242857506001600160a01b03821661dead14155b1561289a57600e54610100900460ff166124c0576001600160a01b03831660009081526021602052604090205460ff168061247b57506001600160a01b03821660009081526021602052604090205460ff165b6124c05760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610cc0565b60105460ff161561261c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415801561253f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b1561261c5761254f600443613ae5565b326000908152600f602052604090205410801561258d5750612572600443613ae5565b6001600160a01b0383166000908152600f6020526040902054105b6125f75760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610cc0565b326000908152600f602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526022602052604090205460ff16801561265d57506001600160a01b03821660009081526021602052604090205460ff16155b15612739576006548111156126c55760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610cc0565b6008546001600160a01b0383166000908152602081905260409020546126eb9083613a0f565b11156127345760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610cc0565b61289a565b6001600160a01b03821660009081526022602052604090205460ff16801561277a57506001600160a01b03831660009081526021602052604090205460ff16155b156127e4576007548111156127345760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610cc0565b6001600160a01b03821660009081526021602052604090205460ff1615801561282657506001600160a01b03831660009081526021602052604090205460ff16155b1561289a576008546001600160a01b0383166000908152602081905260409020546128519083613a0f565b111561289a5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610cc0565b30600090815260208190526040902054600a54811080159081906128c65750600e5462010000900460ff165b80156128d5575060095460ff16155b80156128fa57506001600160a01b03851660009081526022602052604090205460ff16155b801561291e57506001600160a01b038516600090815260208052604090205460ff16155b801561294257506001600160a01b038416600090815260208052604090205460ff16155b15612967576009805460ff1916600117905561295c612c91565b6009805460ff191690555b6001600160a01b038516600090815260208052604090205460019060ff16806129a757506001600160a01b038516600090815260208052604090205460ff165b156129b0575060005b6000808215612c125743600d5460016129c99190613a0f565b101580156129ef57506001600160a01b03881660009081526022602052604090205460ff165b15612a2b576064612a018760636139b5565b612a0b91906139ed565b600b54909150612a269089906001600160a01b0316836130fb565b612bea565b6001600160a01b03871660009081526022602052604090205460ff168015612a5557506000601554115b15612b0d57606460155487612a6a91906139b5565b612a7491906139ed565b915060155460175483612a8791906139b5565b612a9191906139ed565b601a6000828254612aa29190613a0f565b9091555050601554601654612ab790846139b5565b612ac191906139ed565b60196000828254612ad29190613a0f565b9091555050601554601854612ae790846139b5565b612af191906139ed565b601b6000828254612b029190613a0f565b90915550612bea9050565b6001600160a01b03881660009081526022602052604090205460ff168015612b3757506000601154115b15612bea57606460115487612b4c91906139b5565b612b5691906139ed565b915060115460135483612b6991906139b5565b612b7391906139ed565b601a6000828254612b849190613a0f565b9091555050601154601254612b9990846139b5565b612ba391906139ed565b60196000828254612bb49190613a0f565b9091555050601154601454612bc990846139b5565b612bd391906139ed565b601b6000828254612be49190613a0f565b90915550505b8115612bfb57612bfb8830846130fb565b612c058183613a0f565b612c0f9087613ae5565b95505b612c1d8888886130fb565b5050505050505050565b6001600160a01b0382166000908152602260205260409020805460ff1916821515179055612c558282613250565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3060009081526020819052604081205490506000601b54601954601a54612cb89190613a0f565b612cc29190613a0f565b9050811580612ccf575080155b15612cd8575050565b600a8054612ce5916139b5565b821115612cfc57600a8054612cf9916139b5565b91505b6000600282601a5485612d0f91906139b5565b612d1991906139ed565b612d2391906139ed565b9050612d37612d328285613ae5565b6132b3565b6040516304fa881160e21b815273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906313ea204490602401600060405180830381600087803b158015612dac57600080fd5b505af1158015612dc0573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526000925073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4891506370a0823190602401602060405180830381865afa158015612e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3a9190613a27565b9050600081905060006002601a54612e5291906139ed565b612e5c9086613ae5565b601954612e6990856139b5565b612e7391906139ed565b905060006002601a54612e8691906139ed565b612e909087613ae5565b601b54612e9d90866139b5565b612ea791906139ed565b9050612eb38183613a0f565b612ebd9084613ae5565b6000601a8190556019819055601b5592508415801590612edd5750600083115b15612eec57612eec8584613426565b8015612f7d57600c5460405163a9059cbb60e01b81526001600160a01b0390911660048201526024810182905273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063a9059cbb906044016020604051808303816000875af1158015612f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7b9190613a40565b505b6040516370a0823160e01b815230600482015260009073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906370a0823190602401602060405180830381865afa158015612fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff39190613a27565b11156130f257600b546040516370a0823160e01b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489163a9059cbb916001600160a01b039091169083906370a0823190602401602060405180830381865afa15801561305f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130839190613a27565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156130ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c1d9190613a40565b50505050505050565b6001600160a01b0383166131215760405162461bcd60e51b8152600401610cc090613a5d565b6001600160a01b0382166131475760405162461bcd60e51b8152600401610cc090613aa2565b6001600160a01b038316600090815260208190526040902054818110156131bf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610cc0565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906131f6908490613a0f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161324291815260200190565b60405180910390a350505050565b6001600160a01b038216600081815260216020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106132e8576132e8613989565b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160018151811061333057613330613989565b60200260200101906001600160a01b031690816001600160a01b03168152505061337b307f000000000000000000000000000000000000000000000000000000000000000084612206565b604051635c11d79560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635c11d795906133f090859060009086907f0000000000000000000000000000000000000000000000000000000000000000904290600401613afc565b600060405180830381600087803b15801561340a57600080fd5b505af115801561341e573d6000803e3d6000fd5b505050505050565b613451307f000000000000000000000000000000000000000000000000000000000000000084612206565b60405163095ea7b360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660048201526024810182905273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063095ea7b3906044016020604051808303816000875af11580156134d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134f69190613a40565b5060405162e8e33760e81b8152306004820181905273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486024830152604482018490526064820183905260006084830181905260a483015260c48201524260e48201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e8e3370090610104016060604051808303816000875af11580156135a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135c49190613b6d565b5050505050565b600060208083528351808285015260005b818110156135f8578581018301518582016040015282016135dc565b8181111561360a576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461363757600080fd5b919050565b6000806040838503121561364f57600080fd5b61365883613620565b946020939093013593505050565b60006020828403121561367857600080fd5b61368182613620565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156136c7576136c7613688565b604052919050565b600067ffffffffffffffff8211156136e9576136e9613688565b5060051b60200190565b600082601f83011261370457600080fd5b81356020613719613714836136cf565b61369e565b82815260059290921b8401810191818101908684111561373857600080fd5b8286015b84811015613753578035835291830191830161373c565b509695505050505050565b6000806040838503121561377157600080fd5b823567ffffffffffffffff8082111561378957600080fd5b818501915085601f83011261379d57600080fd5b813560206137ad613714836136cf565b82815260059290921b840181019181810190898411156137cc57600080fd5b948201945b838610156137f1576137e286613620565b825294820194908201906137d1565b9650508601359250508082111561380757600080fd5b50613814858286016136f3565b9150509250929050565b60008060006060848603121561383357600080fd5b61383c84613620565b925061384a60208501613620565b9150604084013590509250925092565b60006020828403121561386c57600080fd5b5035919050565b801515811461388157600080fd5b50565b6000806040838503121561389757600080fd5b6138a083613620565b915060208301356138b081613873565b809150509250929050565b6000806000606084860312156138d057600080fd5b505081359360208301359350604090920135919050565b600080604083850312156138fa57600080fd5b61390383613620565b915061391160208401613620565b90509250929050565b600181811c9082168061392e57607f821691505b60208210810361394e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156139cf576139cf61399f565b500290565b6000600182016139e6576139e661399f565b5060010190565b600082613a0a57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613a2257613a2261399f565b500190565b600060208284031215613a3957600080fd5b5051919050565b600060208284031215613a5257600080fd5b815161368181613873565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015613af757613af761399f565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b4c5784516001600160a01b031683529383019391830191600101613b27565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613b8257600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122028d228bbf8e0dbca078c47bc0706a04e7c4862f80f08184509b91226f09ea7a564736f6c634300080d0033608060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350610475806100616000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806313ea204414610051578063715018a6146100665780638da5cb5b1461006e578063f2fde38b1461008d575b600080fd5b61006461005f36600461039f565b6100a0565b005b610064610241565b600054604080516001600160a01b039092168252519081900360200190f35b61006461009b36600461039f565b6102b5565b6000546001600160a01b031633146100d35760405162461bcd60e51b81526004016100ca906103cf565b60405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561011a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061013e9190610404565b111561023e57806001600160a01b031663a9059cbb6101656000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa1580156101a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101cd9190610404565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061023c919061041d565b505b50565b6000546001600160a01b0316331461026b5760405162461bcd60e51b81526004016100ca906103cf565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146102df5760405162461bcd60e51b81526004016100ca906103cf565b6001600160a01b0381166103445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100ca565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000602082840312156103b157600080fd5b81356001600160a01b03811681146103c857600080fd5b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561041657600080fd5b5051919050565b60006020828403121561042f57600080fd5b815180151581146103c857600080fdfea2646970667358221220b2c584a13c39cbbf70edeec88d883dc5f9e51fe7b27b81c6a3b805e6631878fe64736f6c634300080d00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x6080604052600436106103e85760003560e01c806389a3027111610208578063c7c61e2c11610118578063ea4cfe12116100ab578063f2fde38b1161007a578063f2fde38b14610b73578063f5648a4f14610b93578063f637434214610ba8578063fb002c9714610bbe578063fd361d0e14610bd457600080fd5b8063ea4cfe1214610b11578063ee40166e14610b31578063ee44b44e14610b47578063f11a24d314610b5d57600080fd5b8063dc3f0d0f116100e7578063dc3f0d0f14610a80578063dd62ed3e14610aa0578063e2f4560514610ae6578063e884f26014610afc57600080fd5b8063c7c61e2c14610a1b578063c876d0b914610a30578063d257b34f14610a4a578063d85ba06314610a6a57600080fd5b8063a5ece9411161019b578063bbc0c7421161016a578063bbc0c7421461097c578063befd2fac1461099b578063c0246668146109bb578063c17b5b8c146109db578063c18bc195146109fb57600080fd5b8063a5ece941146108f6578063a9059cbb14610916578063aa4bde2814610936578063b62496f51461094c57600080fd5b806392136913116101d7578063921369131461088b57806395d89b41146108a15780639a7a23d6146108b6578063a457c2d7146108d657600080fd5b806389a30271146108105780638a8c523c146108385780638da5cb5b1461084d578063906e9dd01461086b57600080fd5b80634a62bb6511610303578063715018a611610296578063783102eb11610265578063783102eb1461078e5780637bce5a04146107a45780638095d564146107ba5780638366e79a146107da57806388e765ff146107fa57600080fd5b8063715018a61461072f578063751039fc146107445780637571336a14610759578063763cef491461077957600080fd5b80636a486a8e116102d25780636a486a8e146106ae5780636ddd1713146106c457806370a08231146106e4578063712c29851461071a57600080fd5b80634a62bb65146106525780634f77f6c01461066c5780635a139dd41461068257806366d602ae1461069857600080fd5b80631f3fed8f1161037b578063313ce5671161034a578063313ce567146105c257806339509351146105de578063452ed4f1146105fe578063499b83941461063257600080fd5b80631f3fed8f1461054a5780632307b4411461056057806323b872dd146105825780632be32b61146105a257600080fd5b806310d5de53116103b757806310d5de53146104bb57806318160ddd146104eb5780631a8145bb146105005780631b3d6e871461051657600080fd5b8063058054c9146103f457806306fdde031461041d5780630758d9241461043f578063095ea7b31461048b57600080fd5b366103ef57005b600080fd5b34801561040057600080fd5b5061040a601c5481565b6040519081526020015b60405180910390f35b34801561042957600080fd5b50610432610bee565b60405161041491906135cb565b34801561044b57600080fd5b506104737f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610414565b34801561049757600080fd5b506104ab6104a636600461363c565b610c80565b6040519015158152602001610414565b3480156104c757600080fd5b506104ab6104d6366004613666565b60216020526000908152604090205460ff1681565b3480156104f757600080fd5b5060025461040a565b34801561050c57600080fd5b5061040a601a5481565b34801561052257600080fd5b506104737f000000000000000000000000c21db579c3891f89cfb04a74829278610ea8ac5481565b34801561055657600080fd5b5061040a601b5481565b34801561056c57600080fd5b5061058061057b36600461375e565b610c96565b005b34801561058e57600080fd5b506104ab61059d36600461381e565b610e0a565b3480156105ae57600080fd5b506105806105bd36600461385a565b610eb4565b3480156105ce57600080fd5b5060405160128152602001610414565b3480156105ea57600080fd5b506104ab6105f936600461363c565b610fc1565b34801561060a57600080fd5b506104737f00000000000000000000000066316eded18723a3bd87e7a22346658e863adcaa81565b34801561063e57600080fd5b5061058061064d366004613666565b610ffd565b34801561065e57600080fd5b50600e546104ab9060ff1681565b34801561067857600080fd5b5061040a60165481565b34801561068e57600080fd5b5061040a60125481565b3480156106a457600080fd5b5061040a60075481565b3480156106ba57600080fd5b5061040a60155481565b3480156106d057600080fd5b50600e546104ab9062010000900460ff1681565b3480156106f057600080fd5b5061040a6106ff366004613666565b6001600160a01b031660009081526020819052604090205490565b34801561072657600080fd5b5061040a6110d6565b34801561073b57600080fd5b506105806110ff565b34801561075057600080fd5b50610580611173565b34801561076557600080fd5b50610580610774366004613884565b6111de565b34801561078557600080fd5b506105806112c9565b34801561079a57600080fd5b5061040a601f5481565b3480156107b057600080fd5b5061040a60145481565b3480156107c657600080fd5b506105806107d53660046138bb565b6114a7565b3480156107e657600080fd5b506104ab6107f53660046138e7565b61154a565b34801561080657600080fd5b5061040a60065481565b34801561081c57600080fd5b5061047373a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b34801561084457600080fd5b50610580611753565b34801561085957600080fd5b506005546001600160a01b0316610473565b34801561087757600080fd5b50610580610886366004613666565b611815565b34801561089757600080fd5b5061040a60185481565b3480156108ad57600080fd5b506104326118ed565b3480156108c257600080fd5b506105806108d1366004613884565b6118fc565b3480156108e257600080fd5b506104ab6108f136600461363c565b6119d7565b34801561090257600080fd5b50600c54610473906001600160a01b031681565b34801561092257600080fd5b506104ab61093136600461363c565b611a70565b34801561094257600080fd5b5061040a60085481565b34801561095857600080fd5b506104ab610967366004613666565b60226020526000908152604090205460ff1681565b34801561098857600080fd5b50600e546104ab90610100900460ff1681565b3480156109a757600080fd5b506105806109b636600461385a565b611a7d565b3480156109c757600080fd5b506105806109d6366004613884565b611bb3565b3480156109e757600080fd5b506105806109f63660046138bb565b611c3a565b348015610a0757600080fd5b50610580610a1636600461385a565b611cdd565b348015610a2757600080fd5b50610580611de6565b348015610a3c57600080fd5b506010546104ab9060ff1681565b348015610a5657600080fd5b50610580610a6536600461385a565b611e1c565b348015610a7657600080fd5b5061040a60115481565b348015610a8c57600080fd5b50610580610a9b36600461385a565b611f67565b348015610aac57600080fd5b5061040a610abb3660046138e7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610af257600080fd5b5061040a600a5481565b348015610b0857600080fd5b5061058061206e565b348015610b1d57600080fd5b50600b54610473906001600160a01b031681565b348015610b3d57600080fd5b5061040a600d5481565b348015610b5357600080fd5b5061040a601d5481565b348015610b6957600080fd5b5061040a60135481565b348015610b7f57600080fd5b50610580610b8e366004613666565b6120a4565b348015610b9f57600080fd5b5061058061218f565b348015610bb457600080fd5b5061040a60175481565b348015610bca57600080fd5b5061040a60195481565b348015610be057600080fd5b50601e546104ab9060ff1681565b606060038054610bfd9061391a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c299061391a565b8015610c765780601f10610c4b57610100808354040283529160200191610c76565b820191906000526020600020905b815481529060010190602001808311610c5957829003601f168201915b5050505050905090565b6000610c8d338484612206565b50600192915050565b6005546001600160a01b03163314610cc95760405162461bcd60e51b8152600401610cc090613954565b60405180910390fd5b8051825114610d1a5760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610cc0565b60c8825110610d8a5760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203230302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610cc0565b60005b8251811015610e05576000838281518110610daa57610daa613989565b602002602001015190506000838381518110610dc857610dc8613989565b6020026020010151670de0b6b3a7640000610de391906139b5565b9050610df033838361232a565b50508080610dfd906139d4565b915050610d8d565b505050565b6000610e1784848461232a565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610e9c5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610cc0565b610ea98533858403612206565b506001949350505050565b6005546001600160a01b03163314610ede5760405162461bcd60e51b8152600401610cc090613954565b670de0b6b3a76400006103e8610ef360025490565b610efe9060016139b5565b610f0891906139ed565b610f1291906139ed565b811015610f735760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e312560b81b6064820152608401610cc0565b610f8581670de0b6b3a76400006139b5565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c8d918590610ff8908690613a0f565b612206565b6005546001600160a01b031633146110275760405162461bcd60e51b8152600401610cc090613954565b6001600160a01b03811661108c5760405162461bcd60e51b815260206004820152602660248201527f5f6f7065726174696f6e734164647265737320616464726573732063616e6e6f60448201526507420626520360d41b6064820152608401610cc0565b600b80546001600160a01b0319166001600160a01b0383169081179091556040517f4efa56652237561d0f1fd31311aeaaa41f3b754a461545ed3cf6ced5876d298290600090a250565b601e5460009060ff16156110f957601d54601c546110f49190613a0f565b905090565b50600090565b6005546001600160a01b031633146111295760405162461bcd60e51b8152600401610cc090613954565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461119d5760405162461bcd60e51b8152600401610cc090613954565b600e805460ff199081169091556010805490911690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146112085760405162461bcd60e51b8152600401610cc090613954565b8061129e577f00000000000000000000000066316eded18723a3bd87e7a22346658e863adcaa6001600160a01b0316826001600160a01b03160361129e5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610cc0565b6001600160a01b03919091166000908152602160205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146112f35760405162461bcd60e51b8152600401610cc090613954565b6112fb6110d6565b42101580156113115750600061130f6110d6565b115b6113565760405162461bcd60e51b815260206004820152601660248201527526bab9ba103932b8bab2b9ba1030b732103bb0b4ba1760511b6044820152606401610cc0565b6000601c819055601e805460ff19169055601f546040516370a0823160e01b8152306004820152606491907f00000000000000000000000066316eded18723a3bd87e7a22346658e863adcaa6001600160a01b0316906370a0823190602401602060405180830381865afa1580156113d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f69190613a27565b61140091906139b5565b61140a91906139ed565b6000601f5560405163a9059cbb60e01b8152336004820152602481018290529091507f00000000000000000000000066316eded18723a3bd87e7a22346658e863adcaa6001600160a01b03169063a9059cbb906044016020604051808303816000875af115801561147f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a39190613a40565b5050565b6005546001600160a01b031633146114d15760405162461bcd60e51b8152600401610cc090613954565b601283905560138290556014819055806114eb8385613a0f565b6114f59190613a0f565b6011819055601e1015610e055760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401610cc0565b6005546000906001600160a01b031633146115775760405162461bcd60e51b8152600401610cc090613954565b6001600160a01b0383166115cd5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610cc0565b306001600160a01b038416036116255760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610cc0565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa15801561166c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116909190613a27565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af11580156116e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117079190613a40565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b0316331461177d5760405162461bcd60e51b8152600401610cc090613954565b600e54610100900460ff16156117d55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610cc0565b600e805462ffff0019166201010017905543600d556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a1565b6005546001600160a01b0316331461183f5760405162461bcd60e51b8152600401610cc090613954565b6001600160a01b0381166118a35760405162461bcd60e51b815260206004820152602560248201527f5f6d61726b6574696e674164647265737320616464726573732063616e6e6f74604482015264020626520360dc1b6064820152608401610cc0565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517fd1e7d6a3390dd5008bd1c57798817b9f806e4c417264e7d3d67e42e784dc24a990600090a250565b606060048054610bfd9061391a565b6005546001600160a01b031633146119265760405162461bcd60e51b8152600401610cc090613954565b7f00000000000000000000000066316eded18723a3bd87e7a22346658e863adcaa6001600160a01b0316826001600160a01b0316036119cd5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610cc0565b6114a38282612c27565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611a595760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610cc0565b611a663385858403612206565b5060019392505050565b6000610c8d33848461232a565b6005546001600160a01b03163314611aa75760405162461bcd60e51b8152600401610cc090613954565b601e5460ff1615611b145760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f74207265717565737420616761696e20756e74696c206669727374604482015270103932b8bab2b9ba1034b99037bb32b91760791b6064820152608401610cc0565b60648111158015611b255750600081115b611b715760405162461bcd60e51b815260206004820152601a60248201527f4e65656420746f20736574206265747765656e20312d313030250000000000006044820152606401610cc0565b42601c55601e805460ff19166001179055601f8190556040517fd99a77b2f3951cd076e75814e44db497e6abc203dd251329da0b62c288f9f48b90600090a150565b6005546001600160a01b03163314611bdd5760405162461bcd60e51b8152600401610cc090613954565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611c645760405162461bcd60e51b8152600401610cc090613954565b60168390556017829055601881905580611c7e8385613a0f565b611c889190613a0f565b601581905560321015610e055760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420353025206f72206c6573730000006044820152606401610cc0565b6005546001600160a01b03163314611d075760405162461bcd60e51b8152600401610cc090613954565b670de0b6b3a76400006103e8611d1c60025490565b611d279060036139b5565b611d3191906139ed565b611d3b91906139ed565b811015611d9f5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610cc0565b611db181670de0b6b3a76400006139b5565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610fb6565b6005546001600160a01b03163314611e105760405162461bcd60e51b8152600401610cc090613954565b601e805460ff19169055565b6005546001600160a01b03163314611e465760405162461bcd60e51b8152600401610cc090613954565b620186a0611e5360025490565b611e5e9060016139b5565b611e6891906139ed565b811015611ed55760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610cc0565b6103e8611ee160025490565b611eec9060016139b5565b611ef691906139ed565b811115611f625760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610cc0565b600a55565b6005546001600160a01b03163314611f915760405162461bcd60e51b8152600401610cc090613954565b670de0b6b3a76400006103e8611fa660025490565b611fb19060016139b5565b611fbb91906139ed565b611fc591906139ed565b8110156120275760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e312560b01b6064820152608401610cc0565b61203981670de0b6b3a76400006139b5565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610fb6565b6005546001600160a01b031633146120985760405162461bcd60e51b8152600401610cc090613954565b6010805460ff19169055565b6005546001600160a01b031633146120ce5760405162461bcd60e51b8152600401610cc090613954565b6001600160a01b0381166121335760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cc0565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146121b95760405162461bcd60e51b8152600401610cc090613954565b604051600090339047908381818185875af1925050503d80600081146121fb576040519150601f19603f3d011682016040523d82523d6000602084013e612200565b606091505b50505050565b6001600160a01b0383166122685760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cc0565b6001600160a01b0382166122c95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cc0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166123505760405162461bcd60e51b8152600401610cc090613a5d565b6001600160a01b0382166123765760405162461bcd60e51b8152600401610cc090613aa2565b600081116123c65760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610cc0565b600e5460ff161561289a576005546001600160a01b038481169116148015906123fd57506005546001600160a01b03838116911614155b801561241157506001600160a01b03821615155b801561242857506001600160a01b03821661dead14155b1561289a57600e54610100900460ff166124c0576001600160a01b03831660009081526021602052604090205460ff168061247b57506001600160a01b03821660009081526021602052604090205460ff165b6124c05760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610cc0565b60105460ff161561261c577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b03161415801561253f57507f00000000000000000000000066316eded18723a3bd87e7a22346658e863adcaa6001600160a01b0316826001600160a01b031614155b1561261c5761254f600443613ae5565b326000908152600f602052604090205410801561258d5750612572600443613ae5565b6001600160a01b0383166000908152600f6020526040902054105b6125f75760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610cc0565b326000908152600f602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526022602052604090205460ff16801561265d57506001600160a01b03821660009081526021602052604090205460ff16155b15612739576006548111156126c55760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610cc0565b6008546001600160a01b0383166000908152602081905260409020546126eb9083613a0f565b11156127345760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610cc0565b61289a565b6001600160a01b03821660009081526022602052604090205460ff16801561277a57506001600160a01b03831660009081526021602052604090205460ff16155b156127e4576007548111156127345760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610cc0565b6001600160a01b03821660009081526021602052604090205460ff1615801561282657506001600160a01b03831660009081526021602052604090205460ff16155b1561289a576008546001600160a01b0383166000908152602081905260409020546128519083613a0f565b111561289a5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610cc0565b30600090815260208190526040902054600a54811080159081906128c65750600e5462010000900460ff165b80156128d5575060095460ff16155b80156128fa57506001600160a01b03851660009081526022602052604090205460ff16155b801561291e57506001600160a01b038516600090815260208052604090205460ff16155b801561294257506001600160a01b038416600090815260208052604090205460ff16155b15612967576009805460ff1916600117905561295c612c91565b6009805460ff191690555b6001600160a01b038516600090815260208052604090205460019060ff16806129a757506001600160a01b038516600090815260208052604090205460ff165b156129b0575060005b6000808215612c125743600d5460016129c99190613a0f565b101580156129ef57506001600160a01b03881660009081526022602052604090205460ff165b15612a2b576064612a018760636139b5565b612a0b91906139ed565b600b54909150612a269089906001600160a01b0316836130fb565b612bea565b6001600160a01b03871660009081526022602052604090205460ff168015612a5557506000601554115b15612b0d57606460155487612a6a91906139b5565b612a7491906139ed565b915060155460175483612a8791906139b5565b612a9191906139ed565b601a6000828254612aa29190613a0f565b9091555050601554601654612ab790846139b5565b612ac191906139ed565b60196000828254612ad29190613a0f565b9091555050601554601854612ae790846139b5565b612af191906139ed565b601b6000828254612b029190613a0f565b90915550612bea9050565b6001600160a01b03881660009081526022602052604090205460ff168015612b3757506000601154115b15612bea57606460115487612b4c91906139b5565b612b5691906139ed565b915060115460135483612b6991906139b5565b612b7391906139ed565b601a6000828254612b849190613a0f565b9091555050601154601254612b9990846139b5565b612ba391906139ed565b60196000828254612bb49190613a0f565b9091555050601154601454612bc990846139b5565b612bd391906139ed565b601b6000828254612be49190613a0f565b90915550505b8115612bfb57612bfb8830846130fb565b612c058183613a0f565b612c0f9087613ae5565b95505b612c1d8888886130fb565b5050505050505050565b6001600160a01b0382166000908152602260205260409020805460ff1916821515179055612c558282613250565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3060009081526020819052604081205490506000601b54601954601a54612cb89190613a0f565b612cc29190613a0f565b9050811580612ccf575080155b15612cd8575050565b600a8054612ce5916139b5565b821115612cfc57600a8054612cf9916139b5565b91505b6000600282601a5485612d0f91906139b5565b612d1991906139ed565b612d2391906139ed565b9050612d37612d328285613ae5565b6132b3565b6040516304fa881160e21b815273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860048201527f000000000000000000000000c21db579c3891f89cfb04a74829278610ea8ac546001600160a01b0316906313ea204490602401600060405180830381600087803b158015612dac57600080fd5b505af1158015612dc0573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526000925073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4891506370a0823190602401602060405180830381865afa158015612e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3a9190613a27565b9050600081905060006002601a54612e5291906139ed565b612e5c9086613ae5565b601954612e6990856139b5565b612e7391906139ed565b905060006002601a54612e8691906139ed565b612e909087613ae5565b601b54612e9d90866139b5565b612ea791906139ed565b9050612eb38183613a0f565b612ebd9084613ae5565b6000601a8190556019819055601b5592508415801590612edd5750600083115b15612eec57612eec8584613426565b8015612f7d57600c5460405163a9059cbb60e01b81526001600160a01b0390911660048201526024810182905273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063a9059cbb906044016020604051808303816000875af1158015612f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7b9190613a40565b505b6040516370a0823160e01b815230600482015260009073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906370a0823190602401602060405180830381865afa158015612fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff39190613a27565b11156130f257600b546040516370a0823160e01b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489163a9059cbb916001600160a01b039091169083906370a0823190602401602060405180830381865afa15801561305f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130839190613a27565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156130ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c1d9190613a40565b50505050505050565b6001600160a01b0383166131215760405162461bcd60e51b8152600401610cc090613a5d565b6001600160a01b0382166131475760405162461bcd60e51b8152600401610cc090613aa2565b6001600160a01b038316600090815260208190526040902054818110156131bf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610cc0565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906131f6908490613a0f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161324291815260200190565b60405180910390a350505050565b6001600160a01b038216600081815260216020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106132e8576132e8613989565b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160018151811061333057613330613989565b60200260200101906001600160a01b031690816001600160a01b03168152505061337b307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612206565b604051635c11d79560e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1690635c11d795906133f090859060009086907f000000000000000000000000c21db579c3891f89cfb04a74829278610ea8ac54904290600401613afc565b600060405180830381600087803b15801561340a57600080fd5b505af115801561341e573d6000803e3d6000fd5b505050505050565b613451307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612206565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1660048201526024810182905273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063095ea7b3906044016020604051808303816000875af11580156134d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134f69190613a40565b5060405162e8e33760e81b8152306004820181905273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486024830152604482018490526064820183905260006084830181905260a483015260c48201524260e48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03169063e8e3370090610104016060604051808303816000875af11580156135a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135c49190613b6d565b5050505050565b600060208083528351808285015260005b818110156135f8578581018301518582016040015282016135dc565b8181111561360a576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461363757600080fd5b919050565b6000806040838503121561364f57600080fd5b61365883613620565b946020939093013593505050565b60006020828403121561367857600080fd5b61368182613620565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156136c7576136c7613688565b604052919050565b600067ffffffffffffffff8211156136e9576136e9613688565b5060051b60200190565b600082601f83011261370457600080fd5b81356020613719613714836136cf565b61369e565b82815260059290921b8401810191818101908684111561373857600080fd5b8286015b84811015613753578035835291830191830161373c565b509695505050505050565b6000806040838503121561377157600080fd5b823567ffffffffffffffff8082111561378957600080fd5b818501915085601f83011261379d57600080fd5b813560206137ad613714836136cf565b82815260059290921b840181019181810190898411156137cc57600080fd5b948201945b838610156137f1576137e286613620565b825294820194908201906137d1565b9650508601359250508082111561380757600080fd5b50613814858286016136f3565b9150509250929050565b60008060006060848603121561383357600080fd5b61383c84613620565b925061384a60208501613620565b9150604084013590509250925092565b60006020828403121561386c57600080fd5b5035919050565b801515811461388157600080fd5b50565b6000806040838503121561389757600080fd5b6138a083613620565b915060208301356138b081613873565b809150509250929050565b6000806000606084860312156138d057600080fd5b505081359360208301359350604090920135919050565b600080604083850312156138fa57600080fd5b61390383613620565b915061391160208401613620565b90509250929050565b600181811c9082168061392e57607f821691505b60208210810361394e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156139cf576139cf61399f565b500290565b6000600182016139e6576139e661399f565b5060010190565b600082613a0a57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613a2257613a2261399f565b500190565b600060208284031215613a3957600080fd5b5051919050565b600060208284031215613a5257600080fd5b815161368181613873565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015613af757613af761399f565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b4c5784516001600160a01b031683529383019391830191600101613b27565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613b8257600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122028d228bbf8e0dbca078c47bc0706a04e7c4862f80f08184509b91226f09ea7a564736f6c634300080d0033

Deployed Bytecode Sourcemap

10585:19518:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12074:41;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;12074:41:0;;;;;;;;4455:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10738:37::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;980:32:1;;;962:51;;950:2;935:18;10738:37:0;798:221:1;5369:169:0;;;;;;;;;;-1:-1:-1;5369:169:0;;;;;:::i;:::-;;:::i;:::-;;;1626:14:1;;1619:22;1601:41;;1589:2;1574:18;5369:169:0;1461:187:1;12406:64:0;;;;;;;;;;-1:-1:-1;12406:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;4776:108;;;;;;;;;;-1:-1:-1;4864:12:0;;4776:108;;11992:33;;;;;;;;;;;;;;;;10822:42;;;;;;;;;;;;;;;12032:33;;;;;;;;;;;;;;;;17437:617;;;;;;;;;;-1:-1:-1;17437:617:0;;;;;:::i;:::-;;:::i;:::-;;5546:492;;;;;;;;;;-1:-1:-1;5546:492:0;;;;;:::i;:::-;;:::i;15947:269::-;;;;;;;;;;-1:-1:-1;15947:269:0;;;;;:::i;:::-;;:::i;4675:93::-;;;;;;;;;;-1:-1:-1;4675:93:0;;4758:2;5150:36:1;;5138:2;5123:18;4675:93:0;5008:184:1;6046:215:0;;;;;;;;;;-1:-1:-1;6046:215:0;;;;;:::i;:::-;;:::i;10782:31::-;;;;;;;;;;;;;;;28152:297;;;;;;;;;;-1:-1:-1;28152:297:0;;;;;:::i;:::-;;:::i;11101:33::-;;;;;;;;;;-1:-1:-1;11101:33:0;;;;;;;;11834:32;;;;;;;;;;;;;;;;11685:31;;;;;;;;;;;;;;;;10664:28;;;;;;;;;;;;;;;;11799;;;;;;;;;;;;;;;;11181:31;;;;;;;;;;-1:-1:-1;11181:31:0;;;;;;;;;;;4892:127;;;;;;;;;;-1:-1:-1;4892:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;4993:18:0;4966:7;4993:18;;;;;;;;;;;;4892:127;29211:281;;;;;;;;;;;;;:::i;8536:150::-;;;;;;;;;;;;;:::i;15613:154::-;;;;;;;;;;;;;:::i;18066:260::-;;;;;;;;;;-1:-1:-1;18066:260:0;;;;;:::i;:::-;;:::i;29500:487::-;;;;;;;;;;;;;:::i;12221:31::-;;;;;;;;;;;;;;;;11760:30;;;;;;;;;;;;;;;;18837:397;;;;;;;;;;-1:-1:-1;18837:397:0;;;;;:::i;:::-;;:::i;26868:456::-;;;;;;;;;;-1:-1:-1;26868:456:0;;;;;:::i;:::-;;:::i;10630:27::-;;;;;;;;;;;;;;;;11452:80;;;;;;;;;;;;11489:42;11452:80;;15308:249;;;;;;;;;;;;;:::i;8322:79::-;;;;;;;;;;-1:-1:-1;8387:6:0;;-1:-1:-1;;;;;8387:6:0;8322:79;;28457:289;;;;;;;;;;-1:-1:-1;28457:289:0;;;;;:::i;:::-;;:::i;11911:31::-;;;;;;;;;;;;;;;;4563:104;;;;;;;;;;;;;:::i;18334:239::-;;;;;;;;;;-1:-1:-1;18334:239:0;;;;;:::i;:::-;;:::i;6269:413::-;;;;;;;;;;-1:-1:-1;6269:413:0;;;;;:::i;:::-;;:::i;10982:31::-;;;;;;;;;;-1:-1:-1;10982:31:0;;;;-1:-1:-1;;;;;10982:31:0;;;5027:175;;;;;;;;;;-1:-1:-1;5027:175:0;;;;;:::i;:::-;;:::i;10699:30::-;;;;;;;;;;;;;;;;12628:58;;;;;;;;;;-1:-1:-1;12628:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;11141:33;;;;;;;;;;-1:-1:-1;11141:33:0;;;;;;;;;;;28754:449;;;;;;;;;;-1:-1:-1;28754:449:0;;;;;:::i;:::-;;:::i;19656:182::-;;;;;;;;;;-1:-1:-1;19656:182:0;;;;;:::i;:::-;;:::i;19242:406::-;;;;;;;;;;-1:-1:-1;19242:406:0;;;;;:::i;:::-;;:::i;16510:284::-;;;;;;;;;;-1:-1:-1;16510:284:0;;;;;:::i;:::-;;:::i;29995:105::-;;;;;;;;;;;;;:::i;11404:39::-;;;;;;;;;;-1:-1:-1;11404:39:0;;;;;;;;16864:346;;;;;;;;;;-1:-1:-1;16864:346:0;;;;;:::i;:::-;;:::i;11651:27::-;;;;;;;;;;;;;;;;16228:274;;;;;;;;;;-1:-1:-1;16228:274:0;;;;;:::i;:::-;;:::i;5210:151::-;;;;;;;;;;-1:-1:-1;5210:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;5326:18:0;;;5299:7;5326:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;5210:151;10901:33;;;;;;;;;;;;;;;;15837:98;;;;;;;;;;;;;:::i;10943:32::-;;;;;;;;;;-1:-1:-1;10943:32:0;;;;-1:-1:-1;;;;;10943:32:0;;;11022:37;;;;;;;;;;;;;;;;12122:49;;;;;;;;;;;;;;;;11723:30;;;;;;;;;;;;;;;;8694:244;;;;;;;;;;-1:-1:-1;8694:244:0;;;;;:::i;:::-;;:::i;27984:160::-;;;;;;;;;;;;;:::i;11873:31::-;;;;;;;;;;;;;;;;11951:34;;;;;;;;;;;;;;;;12178:36;;;;;;;;;;-1:-1:-1;12178:36:0;;;;;;;;4455:100;4509:13;4542:5;4535:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4455:100;:::o;5369:169::-;5452:4;5469:39;684:10;5492:7;5501:6;5469:8;:39::i;:::-;-1:-1:-1;5526:4:0;5369:169;;;;:::o;17437:617::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;;;;;;;;;17579:15:::1;:22;17561:7;:14;:40;17553:83;;;::::0;-1:-1:-1;;;17553:83:0;;7603:2:1;17553:83:0::1;::::0;::::1;7585:21:1::0;7642:2;7622:18;;;7615:30;7681:32;7661:18;;;7654:60;7731:18;;17553:83:0::1;7401:354:1::0;17553:83:0::1;17672:3;17655:7;:14;:20;17647:87;;;::::0;-1:-1:-1;;;17647:87:0;;7962:2:1;17647:87:0::1;::::0;::::1;7944:21:1::0;8001:2;7981:18;;;7974:30;8040:34;8020:18;;;8013:62;-1:-1:-1;;;8091:18:1;;;8084:52;8153:19;;17647:87:0::1;7760:418:1::0;17647:87:0::1;17847:9;17843:204;17866:7;:14;17862:1;:18;17843:204;;;17901:14;17918:7;17926:1;17918:10;;;;;;;;:::i;:::-;;;;;;;17901:27;;17943:14;17960:15;17976:1;17960:18;;;;;;;;:::i;:::-;;;;;;;17979:4;17960:23;;;;:::i;:::-;17943:40;;17998:37;18008:10;18020:6;18028;17998:9;:37::i;:::-;17886:161;;17882:3;;;;;:::i;:::-;;;;17843:204;;;;17437:617:::0;;:::o;5546:492::-;5686:4;5703:36;5713:6;5721:9;5732:6;5703:9;:36::i;:::-;-1:-1:-1;;;;;5779:19:0;;5752:24;5779:19;;;:11;:19;;;;;;;;684:10;5779:33;;;;;;;;5831:26;;;;5823:79;;;;-1:-1:-1;;;5823:79:0;;8962:2:1;5823:79:0;;;8944:21:1;9001:2;8981:18;;;8974:30;9040:34;9020:18;;;9013:62;-1:-1:-1;;;9091:18:1;;;9084:38;9139:19;;5823:79:0;8760:404:1;5823:79:0;5938:57;5947:6;684:10;5988:6;5969:16;:25;5938:8;:57::i;:::-;-1:-1:-1;6026:4:0;;5546:492;-1:-1:-1;;;;5546:492:0:o;15947:269::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;16066:4:::1;16060;16040:13;4864:12:::0;;;4776:108;16040:13:::1;:17;::::0;16056:1:::1;16040:17;:::i;:::-;:24;;;;:::i;:::-;16039:31;;;;:::i;:::-;16029:6;:41;;16021:95;;;::::0;-1:-1:-1;;;16021:95:0;;9593:2:1;16021:95:0::1;::::0;::::1;9575:21:1::0;9632:2;9612:18;;;9605:30;9671:34;9651:18;;;9644:62;-1:-1:-1;;;9722:18:1;;;9715:39;9771:19;;16021:95:0::1;9391:405:1::0;16021:95:0::1;16142:17;:6:::0;16152::::1;16142:17;:::i;:::-;16127:12;:32:::0;;;16175:33:::1;::::0;160:25:1;;;16175:33:0::1;::::0;148:2:1;133:18;16175:33:0::1;;;;;;;;15947:269:::0;:::o;6046:215::-;684:10;6134:4;6183:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6183:34:0;;;;;;;;;;6134:4;;6151:80;;6174:7;;6183:47;;6220:10;;6183:47;:::i;:::-;6151:8;:80::i;28152:297::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28248:32:0;::::1;28240:83;;;::::0;-1:-1:-1;;;28240:83:0;;10136:2:1;28240:83:0::1;::::0;::::1;10118:21:1::0;10175:2;10155:18;;;10148:30;10214:34;10194:18;;;10187:62;-1:-1:-1;;;10265:18:1;;;10258:36;10311:19;;28240:83:0::1;9934:402:1::0;28240:83:0::1;28334:17;:47:::0;;-1:-1:-1;;;;;;28334:47:0::1;-1:-1:-1::0;;;;;28334:47:0;::::1;::::0;;::::1;::::0;;;28397:44:::1;::::0;::::1;::::0;-1:-1:-1;;28397:44:0::1;28152:297:::0;:::o;29211:281::-;29293:24;;29271:7;;29293:24;;29290:195;;;29369:25;;29340:26;;:54;;;;:::i;:::-;29333:61;;29211:281;:::o;29290:195::-;-1:-1:-1;29443:1:0;;29211:281::o;8536:150::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;8629:6:::1;::::0;8608:40:::1;::::0;8645:1:::1;::::0;-1:-1:-1;;;;;8629:6:0::1;::::0;8608:40:::1;::::0;8645:1;;8608:40:::1;8659:6;:19:::0;;-1:-1:-1;;;;;;8659:19:0::1;::::0;;8536:150::o;15613:154::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;15667:14:::1;:22:::0;;-1:-1:-1;;15667:22:0;;::::1;::::0;;;15700:20:::1;:28:::0;;;;::::1;::::0;;15744:15:::1;::::0;::::1;::::0;15684:5:::1;::::0;15744:15:::1;15613:154::o:0;18066:260::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;18162:4:::1;18158:104;;18200:6;-1:-1:-1::0;;;;;18190:16:0::1;:6;-1:-1:-1::0;;;;;18190:16:0::1;::::0;18182:68:::1;;;::::0;-1:-1:-1;;;18182:68:0;;10543:2:1;18182:68:0::1;::::0;::::1;10525:21:1::0;10582:2;10562:18;;;10555:30;10621:34;10601:18;;;10594:62;-1:-1:-1;;;10672:18:1;;;10665:37;10719:19;;18182:68:0::1;10341:403:1::0;18182:68:0::1;-1:-1:-1::0;;;;;18272:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;18272:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;18066:260::o;29500:487::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;29588:29:::1;:27;:29::i;:::-;29569:15;:48;;:85;;;;;29653:1;29621:29;:27;:29::i;:::-;:33;29569:85;29561:120;;;::::0;-1:-1:-1;;;29561:120:0;;10951:2:1;29561:120:0::1;::::0;::::1;10933:21:1::0;10990:2;10970:18;;;10963:30;-1:-1:-1;;;11009:18:1;;;11002:52;11071:18;;29561:120:0::1;10749:346:1::0;29561:120:0::1;29721:1;29692:26;:30:::0;;;29733:24:::1;:32:::0;;-1:-1:-1;;29733:32:0::1;::::0;;29853:16:::1;::::0;29802:48:::1;::::0;-1:-1:-1;;;29802:48:0;;29844:4:::1;29802:48;::::0;::::1;962:51:1::0;29872:3:0::1;::::0;29853:16;29817:6:::1;-1:-1:-1::0;;;;;29802:33:0::1;::::0;::::1;::::0;935:18:1;;29802:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;;:::i;:::-;:73;;;;:::i;:::-;29915:1;29896:16;:20:::0;29929:50:::1;::::0;-1:-1:-1;;;29929:50:0;;29953:10:::1;29929:50;::::0;::::1;11463:51:1::0;11530:18;;;11523:34;;;29778:97:0;;-1:-1:-1;29936:6:0::1;-1:-1:-1::0;;;;;29929:23:0::1;::::0;::::1;::::0;11436:18:1;;29929:50:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29550:437;29500:487::o:0;18837:397::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;18960:16:::1;:33:::0;;;19004:15:::1;:31:::0;;;19046:15:::1;:31:::0;;;19064:13;19103:34:::1;19022:13:::0;18979:14;19103:34:::1;:::i;:::-;:52;;;;:::i;:::-;19088:12;:67:::0;;;19190:2:::1;-1:-1:-1::0;19174:18:0::1;19166:60;;;::::0;-1:-1:-1;;;19166:60:0;;12020:2:1;19166:60:0::1;::::0;::::1;12002:21:1::0;12059:2;12039:18;;;12032:30;12098:31;12078:18;;;12071:59;12147:18;;19166:60:0::1;11818:353:1::0;26868:456:0;8449:6;;26955:10;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26986:20:0;::::1;26978:59;;;::::0;-1:-1:-1;;;26978:59:0;;12378:2:1;26978:59:0::1;::::0;::::1;12360:21:1::0;12417:2;12397:18;;;12390:30;12456:28;12436:18;;;12429:56;12502:18;;26978:59:0::1;12176:350:1::0;26978:59:0::1;27074:4;-1:-1:-1::0;;;;;27056:23:0;::::1;::::0;27048:64:::1;;;::::0;-1:-1:-1;;;27048:64:0;;12733:2:1;27048:64:0::1;::::0;::::1;12715:21:1::0;12772:2;12752:18;;;12745:30;12811;12791:18;;;12784:58;12859:18;;27048:64:0::1;12531:352:1::0;27048:64:0::1;27150:39;::::0;-1:-1:-1;;;27150:39:0;;27183:4:::1;27150:39;::::0;::::1;962:51:1::0;27123:24:0::1;::::0;-1:-1:-1;;;;;27150:24:0;::::1;::::0;::::1;::::0;935:18:1;;27150:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27208:46;::::0;-1:-1:-1;;;27208:46:0;;-1:-1:-1;;;;;11481:32:1;;;27208:46:0::1;::::0;::::1;11463:51:1::0;11530:18;;;11523:34;;;27123:66:0;;-1:-1:-1;27208:23:0;;::::1;::::0;::::1;::::0;11436:18:1;;27208:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27270;::::0;;-1:-1:-1;;;;;11481:32:1;;11463:51;;11545:2;11530:18;;11523:34;;;27200:54:0;;-1:-1:-1;27270:46:0::1;::::0;11436:18:1;27270:46:0::1;;;;;;;26967:357;26868:456:::0;;;;:::o;15308:249::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;15372:13:::1;::::0;::::1;::::0;::::1;;;15371:14;15363:50;;;::::0;-1:-1:-1;;;15363:50:0;;13090:2:1;15363:50:0::1;::::0;::::1;13072:21:1::0;13129:2;13109:18;;;13102:30;13168:25;13148:18;;;13141:53;13211:18;;15363:50:0::1;12888:347:1::0;15363:50:0::1;15424:13;:20:::0;;-1:-1:-1;;15455:18:0;;;;;15505:12:::1;15484:18;:33:::0;15533:16:::1;::::0;::::1;::::0;-1:-1:-1;;15533:16:0::1;15308:249::o:0;28457:289::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28551:31:0;::::1;28543:81;;;::::0;-1:-1:-1;;;28543:81:0;;13442:2:1;28543:81:0::1;::::0;::::1;13424:21:1::0;13481:2;13461:18;;;13454:30;13520:34;13500:18;;;13493:62;-1:-1:-1;;;13571:18:1;;;13564:35;13616:19;;28543:81:0::1;13240:401:1::0;28543:81:0::1;28635:16;:45:::0;;-1:-1:-1;;;;;;28635:45:0::1;-1:-1:-1::0;;;;;28635:45:0;::::1;::::0;;::::1;::::0;;;28696:42:::1;::::0;::::1;::::0;-1:-1:-1;;28696:42:0::1;28457:289:::0;:::o;4563:104::-;4619:13;4652:7;4645:14;;;;;:::i;18334:239::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;18443:6:::1;-1:-1:-1::0;;;;;18435:14:0::1;:4;-1:-1:-1::0;;;;;18435:14:0::1;::::0;18427:84:::1;;;::::0;-1:-1:-1;;;18427:84:0;;13848:2:1;18427:84:0::1;::::0;::::1;13830:21:1::0;13887:2;13867:18;;;13860:30;13926:34;13906:18;;;13899:62;13997:27;13977:18;;;13970:55;14042:19;;18427:84:0::1;13646:421:1::0;18427:84:0::1;18524:41;18553:4;18559:5;18524:28;:41::i;6269:413::-:0;684:10;6362:4;6406:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6406:34:0;;;;;;;;;;6459:35;;;;6451:85;;;;-1:-1:-1;;;6451:85:0;;14274:2:1;6451:85:0;;;14256:21:1;14313:2;14293:18;;;14286:30;14352:34;14332:18;;;14325:62;-1:-1:-1;;;14403:18:1;;;14396:35;14448:19;;6451:85:0;14072:401:1;6451:85:0;6572:67;684:10;6595:7;6623:15;6604:16;:34;6572:8;:67::i;:::-;-1:-1:-1;6670:4:0;;6269:413;-1:-1:-1;;;6269:413:0:o;5027:175::-;5113:4;5130:42;684:10;5154:9;5165:6;5130:9;:42::i;28754:449::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;28846:24:::1;::::0;::::1;;28845:25;28837:87;;;::::0;-1:-1:-1;;;28837:87:0;;14680:2:1;28837:87:0::1;::::0;::::1;14662:21:1::0;14719:2;14699:18;;;14692:30;14758:34;14738:18;;;14731:62;-1:-1:-1;;;14809:18:1;;;14802:47;14866:19;;28837:87:0::1;14478:413:1::0;28837:87:0::1;28961:3;28943:14;:21;;:43;;;;;28985:1;28968:14;:18;28943:43;28935:82;;;::::0;-1:-1:-1;;;28935:82:0;;15098:2:1;28935:82:0::1;::::0;::::1;15080:21:1::0;15137:2;15117:18;;;15110:30;15176:28;15156:18;;;15149:56;15222:18;;28935:82:0::1;14896:350:1::0;28935:82:0::1;29057:15;29028:26;:44:::0;29083:24:::1;:31:::0;;-1:-1:-1;;29083:31:0::1;29110:4;29083:31;::::0;;29125:16:::1;:33:::0;;;29174:21:::1;::::0;::::1;::::0;29083:24:::1;::::0;29174:21:::1;28754:449:::0;:::o;19656:182::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19741:28:0;::::1;;::::0;;;:19:::1;:28:::0;;;;;;;;:39;;-1:-1:-1;;19741:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;19796:34;;1601:41:1;;;19796:34:0::1;::::0;1574:18:1;19796:34:0::1;;;;;;;19656:182:::0;;:::o;19242:406::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;19366:17:::1;:34:::0;;;19411:16:::1;:32:::0;;;19454:16:::1;:32:::0;;;19473:13;19513:36:::1;19430:13:::0;19386:14;19513:36:::1;:::i;:::-;:55;;;;:::i;:::-;19497:13;:71:::0;;;19604:2:::1;-1:-1:-1::0;19587:19:0::1;19579:61;;;::::0;-1:-1:-1;;;19579:61:0;;15453:2:1;19579:61:0::1;::::0;::::1;15435:21:1::0;15492:2;15472:18;;;15465:30;15531:31;15511:18;;;15504:59;15580:18;;19579:61:0::1;15251:353:1::0;16510:284:0;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;16632:4:::1;16626;16606:13;4864:12:::0;;;4776:108;16606:13:::1;:17;::::0;16622:1:::1;16606:17;:::i;:::-;:24;;;;:::i;:::-;16605:31;;;;:::i;:::-;16595:6;:41;;16587:98;;;::::0;-1:-1:-1;;;16587:98:0;;15811:2:1;16587:98:0::1;::::0;::::1;15793:21:1::0;15850:2;15830:18;;;15823:30;15889:34;15869:18;;;15862:62;-1:-1:-1;;;15940:18:1;;;15933:42;15992:19;;16587:98:0::1;15609:408:1::0;16587:98:0::1;16714:17;:6:::0;16724::::1;16714:17;:::i;:::-;16696:15;:35:::0;;;16747:39:::1;::::0;160:25:1;;;16747:39:0::1;::::0;148:2:1;133:18;16747:39:0::1;14:177:1::0;29995:105:0;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;30060:24:::1;:32:::0;;-1:-1:-1;;30060:32:0::1;::::0;;29995:105::o;16864:346::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;16987:6:::1;16967:13;4864:12:::0;;;4776:108;16967:13:::1;:17;::::0;16983:1:::1;16967:17;:::i;:::-;:26;;;;:::i;:::-;16954:9;:39;;16946:105;;;::::0;-1:-1:-1;;;16946:105:0;;16224:2:1;16946:105:0::1;::::0;::::1;16206:21:1::0;16263:2;16243:18;;;16236:30;16302:34;16282:18;;;16275:62;-1:-1:-1;;;16353:18:1;;;16346:51;16414:19;;16946:105:0::1;16022:417:1::0;16946:105:0::1;17102:4;17082:13;4864:12:::0;;;4776:108;17082:13:::1;:17;::::0;17098:1:::1;17082:17;:::i;:::-;:24;;;;:::i;:::-;17069:9;:37;;17061:102;;;::::0;-1:-1:-1;;;17061:102:0;;16646:2:1;17061:102:0::1;::::0;::::1;16628:21:1::0;16685:2;16665:18;;;16658:30;16724:34;16704:18;;;16697:62;-1:-1:-1;;;16775:18:1;;;16768:50;16835:19;;17061:102:0::1;16444:416:1::0;17061:102:0::1;17173:18;:30:::0;16864:346::o;16228:274::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;16348:4:::1;16342;16322:13;4864:12:::0;;;4776:108;16322:13:::1;:17;::::0;16338:1:::1;16322:17;:::i;:::-;:24;;;;:::i;:::-;16321:31;;;;:::i;:::-;16311:6;:41;;16303:96;;;::::0;-1:-1:-1;;;16303:96:0;;17067:2:1;16303:96:0::1;::::0;::::1;17049:21:1::0;17106:2;17086:18;;;17079:30;17145:34;17125:18;;;17118:62;-1:-1:-1;;;17196:18:1;;;17189:40;17246:19;;16303:96:0::1;16865:406:1::0;16303:96:0::1;16426:17;:6:::0;16436::::1;16426:17;:::i;:::-;16410:13;:33:::0;;;16459:35:::1;::::0;160:25:1;;;16459:35:0::1;::::0;148:2:1;133:18;16459:35:0::1;14:177:1::0;15837:98:0;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;15899:20:::1;:28:::0;;-1:-1:-1;;15899:28:0::1;::::0;;15837:98::o;8694:244::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8783:22:0;::::1;8775:73;;;::::0;-1:-1:-1;;;8775:73:0;;17478:2:1;8775:73:0::1;::::0;::::1;17460:21:1::0;17517:2;17497:18;;;17490:30;17556:34;17536:18;;;17529:62;-1:-1:-1;;;17607:18:1;;;17600:36;17653:19;;8775:73:0::1;17276:402:1::0;8775:73:0::1;8885:6;::::0;8864:38:::1;::::0;-1:-1:-1;;;;;8864:38:0;;::::1;::::0;8885:6:::1;::::0;8864:38:::1;::::0;8885:6:::1;::::0;8864:38:::1;8913:6;:17:::0;;-1:-1:-1;;;;;;8913:17:0::1;-1:-1:-1::0;;;;;8913:17:0;;;::::1;::::0;;;::::1;::::0;;8694:244::o;27984:160::-;8449:6;;-1:-1:-1;;;;;8449:6:0;684:10;8449:22;8441:67;;;;-1:-1:-1;;;8441:67:0;;;;;;;:::i;:::-;28078:58:::1;::::0;28042:12:::1;::::0;28086:10:::1;::::0;28110:21:::1;::::0;28042:12;28078:58;28042:12;28078:58;28110:21;28086:10;28078:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;27984:160:0:o;7611:380::-;-1:-1:-1;;;;;7747:19:0;;7739:68;;;;-1:-1:-1;;;7739:68:0;;18095:2:1;7739:68:0;;;18077:21:1;18134:2;18114:18;;;18107:30;18173:34;18153:18;;;18146:62;-1:-1:-1;;;18224:18:1;;;18217:34;18268:19;;7739:68:0;17893:400:1;7739:68:0;-1:-1:-1;;;;;7826:21:0;;7818:68;;;;-1:-1:-1;;;7818:68:0;;18500:2:1;7818:68:0;;;18482:21:1;18539:2;18519:18;;;18512:30;18578:34;18558:18;;;18551:62;-1:-1:-1;;;18629:18:1;;;18622:32;18671:19;;7818:68:0;18298:398:1;7818:68:0;-1:-1:-1;;;;;7899:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;7951:32;;160:25:1;;;7951:32:0;;133:18:1;7951:32:0;;;;;;;7611:380;;;:::o;19846:4362::-;-1:-1:-1;;;;;19946:18:0;;19938:68;;;;-1:-1:-1;;;19938:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20025:16:0;;20017:64;;;;-1:-1:-1;;;20017:64:0;;;;;;;:::i;:::-;20109:1;20100:6;:10;20092:52;;;;-1:-1:-1;;;20092:52:0;;19713:2:1;20092:52:0;;;19695:21:1;19752:2;19732:18;;;19725:30;19791:31;19771:18;;;19764:59;19840:18;;20092:52:0;19511:353:1;20092:52:0;20178:14;;;;20175:1860;;;8387:6;;-1:-1:-1;;;;;20212:15:0;;;8387:6;;20212:15;;;;:32;;-1:-1:-1;8387:6:0;;-1:-1:-1;;;;;20231:13:0;;;8387:6;;20231:13;;20212:32;:52;;;;-1:-1:-1;;;;;;20248:16:0;;;;20212:52;:77;;;;-1:-1:-1;;;;;;20268:21:0;;20282:6;20268:21;;20212:77;20208:1816;;;20313:13;;;;;;;20309:172;;-1:-1:-1;;;;;20358:37:0;;;;;;:31;:37;;;;;;;;;:76;;-1:-1:-1;;;;;;20399:35:0;;;;;;:31;:35;;;;;;;;20358:76;20350:111;;;;-1:-1:-1;;;20350:111:0;;20071:2:1;20350:111:0;;;20053:21:1;20110:2;20090:18;;;20083:30;-1:-1:-1;;;20129:18:1;;;20122:52;20191:18;;20350:111:0;19869:346:1;20350:111:0;20655:20;;;;20651:506;;;20717:9;-1:-1:-1;;;;;20703:24:0;:2;-1:-1:-1;;;;;20703:24:0;;;:49;;;;;20745:6;-1:-1:-1;;;;;20731:21:0;:2;-1:-1:-1;;;;;20731:21:0;;;20703:49;20699:439;;;20830:16;20845:1;20830:12;:16;:::i;:::-;20817:9;20788:39;;;;:28;:39;;;;;;:58;:113;;;;-1:-1:-1;20885:16:0;20900:1;20885:12;:16;:::i;:::-;-1:-1:-1;;;;;20850:32:0;;;;;;:28;:32;;;;;;:51;20788:113;20780:179;;;;-1:-1:-1;;;20780:179:0;;20552:2:1;20780:179:0;;;20534:21:1;20591:2;20571:18;;;20564:30;20630:34;20610:18;;;20603:62;-1:-1:-1;;;20681:18:1;;;20674:51;20742:19;;20780:179:0;20350:417:1;20780:179:0;21015:9;20986:39;;;;:28;:39;;;;;;21028:12;20986:54;;;;-1:-1:-1;;;;;21067:32:0;;;;;;:47;20699:439;-1:-1:-1;;;;;21226:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;21262:35:0;;;;;;:31;:35;;;;;;;;21261:36;21226:71;21222:787;;;21344:12;;21334:6;:22;;21326:75;;;;-1:-1:-1;;;21326:75:0;;20974:2:1;21326:75:0;;;20956:21:1;21013:2;20993:18;;;20986:30;21052:34;21032:18;;;21025:62;-1:-1:-1;;;21103:18:1;;;21096:38;21151:19;;21326:75:0;20772:404:1;21326:75:0;21462:15;;-1:-1:-1;;;;;4993:18:0;;4966:7;4993:18;;;;;;;;;;;21436:22;;:6;:22;:::i;:::-;:41;;21428:78;;;;-1:-1:-1;;;21428:78:0;;21383:2:1;21428:78:0;;;21365:21:1;21422:2;21402:18;;;21395:30;-1:-1:-1;;;21441:18:1;;;21434:54;21505:18;;21428:78:0;21181:348:1;21428:78:0;21222:787;;;-1:-1:-1;;;;;21583:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;21617:37:0;;;;;;:31;:37;;;;;;;;21616:38;21583:71;21579:430;;;21701:13;;21691:6;:23;;21683:78;;;;-1:-1:-1;;;21683:78:0;;21736:2:1;21683:78:0;;;21718:21:1;21775:2;21755:18;;;21748:30;21814:34;21794:18;;;21787:62;-1:-1:-1;;;21865:18:1;;;21858:40;21915:19;;21683:78:0;21534:406:1;21579:430:0;-1:-1:-1;;;;;21810:35:0;;;;;;:31;:35;;;;;;;;21809:36;:78;;;;-1:-1:-1;;;;;;21850:37:0;;;;;;:31;:37;;;;;;;;21849:38;21809:78;21805:204;;;21945:15;;-1:-1:-1;;;;;4993:18:0;;4966:7;4993:18;;;;;;;;;;;21919:22;;:6;:22;:::i;:::-;:41;;21911:78;;;;-1:-1:-1;;;21911:78:0;;21383:2:1;21911:78:0;;;21365:21:1;21422:2;21402:18;;;21395:30;-1:-1:-1;;;21441:18:1;;;21434:54;21505:18;;21911:78:0;21181:348:1;21911:78:0;22096:4;22047:28;4993:18;;;;;;;;;;;22162;;22138:42;;;;;;;22196:22;;-1:-1:-1;22207:11:0;;;;;;;22196:22;:35;;;;-1:-1:-1;22223:8:0;;;;22222:9;22196:35;:71;;;;-1:-1:-1;;;;;;22236:31:0;;;;;;:25;:31;;;;;;;;22235:32;22196:71;:101;;;;-1:-1:-1;;;;;;22272:25:0;;;;;;:19;:25;;;;;;;;22271:26;22196:101;:129;;;;-1:-1:-1;;;;;;22302:23:0;;;;;;:19;:23;;;;;;;;22301:24;22196:129;22193:236;;;22342:8;:15;;-1:-1:-1;;22342:15:0;22353:4;22342:15;;;22374:10;:8;:10::i;:::-;22401:8;:16;;-1:-1:-1;;22401:16:0;;;22193:236;-1:-1:-1;;;;;22559:25:0;;22441:12;22559:25;;;:19;:25;;;;;;22456:4;;22559:25;;;:52;;-1:-1:-1;;;;;;22588:23:0;;;;;;:19;:23;;;;;;;;22559:52;22556:99;;;-1:-1:-1;22638:5:0;22556:99;22675:12;22702:21;22815:7;22812:1343;;;22974:12;22948:18;;22969:1;22948:22;;;;:::i;:::-;:38;;:73;;;;-1:-1:-1;;;;;;22990:31:0;;;;;;:25;:31;;;;;;;;22948:73;22945:1025;;;23071:3;23057:11;:6;23066:2;23057:11;:::i;:::-;:17;;;;:::i;:::-;23115;;23041:33;;-1:-1:-1;23093:55:0;;23109:4;;-1:-1:-1;;;;;23115:17:0;23041:33;23093:15;:55::i;:::-;22945:1025;;;-1:-1:-1;;;;;23211:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;23260:1;23244:13;;:17;23211:50;23207:763;;;23312:3;23297:13;;23288:6;:22;;;;:::i;:::-;:27;;;;:::i;:::-;23281:34;;23382:13;;23363:16;;23356:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;23334:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;23464:13:0;;23444:17;;23437:24;;:4;:24;:::i;:::-;:40;;;;:::i;:::-;23414:19;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;23544:13:0;;23525:16;;23518:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;23496:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;23207:763:0;;-1:-1:-1;23207:763:0;;-1:-1:-1;;;;;23618:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;23668:1;23653:12;;:16;23618:51;23615:355;;;23718:3;23703:12;;23694:6;:21;;;;:::i;:::-;:27;;;;:::i;:::-;23687:34;;23784:12;;23766:15;;23759:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;23737:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;23864:12:0;;23845:16;;23838:23;;:4;:23;:::i;:::-;:38;;;;:::i;:::-;23815:19;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;23942:12:0;;23924:15;;23917:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;23895:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;23615:355:0;24001:8;;23998:93;;24033:42;24049:4;24063;24070;24033:15;:42::i;:::-;24123:20;24130:13;24123:4;:20;:::i;:::-;24113:30;;;;:::i;:::-;;;22812:1343;24167:33;24183:4;24189:2;24193:6;24167:15;:33::i;:::-;19925:4283;;;;;19846:4362;;;:::o;18581:248::-;-1:-1:-1;;;;;18664:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;18664:39:0;;;;;;;18724;18664:31;:39;18724:26;:39::i;:::-;18781:40;;;;;;-1:-1:-1;;;;;18781:40:0;;;;;;;;18581:248;;:::o;25237:1623::-;25320:4;25276:23;4993:18;;;;;;;;;;;25276:50;;25337:25;25408:18;;25386:19;;25365:18;;:40;;;;:::i;:::-;:61;;;;:::i;:::-;25337:89;-1:-1:-1;25450:20:0;;;:46;;-1:-1:-1;25474:22:0;;25450:46;25447:60;;;25499:7;;25237:1623::o;25447:60::-;25540:18;;;:23;;;:::i;:::-;25522:15;:41;25519:113;;;25597:18;;;:23;;;:::i;:::-;25579:41;;25519:113;25701:23;25786:1;25766:17;25745:18;;25727:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;25701:86;-1:-1:-1;25808:52:0;25826:33;25701:86;25826:15;:33;:::i;:::-;25808:17;:52::i;:::-;25874:44;;-1:-1:-1;;;25874:44:0;;11489:42;25874:44;;;962:51:1;25874:12:0;-1:-1:-1;;;;;25874:29:0;;;;935:18:1;;25874:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25961:29:0;;-1:-1:-1;;;25961:29:0;;25984:4;25961:29;;;962:51:1;25939:19:0;;-1:-1:-1;11489:42:0;;-1:-1:-1;25961:14:0;;935:18:1;;25961:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25939:51;;26001:24;26028:11;26001:38;;26052:25;26157:1;26138:18;;:20;;;;:::i;:::-;26117:42;;:17;:42;:::i;:::-;26094:19;;26080:33;;:11;:33;:::i;:::-;:80;;;;:::i;:::-;26052:108;;26171:24;26274:1;26255:18;;:20;;;;:::i;:::-;26234:42;;:17;:42;:::i;:::-;26212:18;;26198:32;;:11;:32;:::i;:::-;:79;;;;:::i;:::-;26171:106;-1:-1:-1;26310:36:0;26171:106;26310:17;:36;:::i;:::-;26290:56;;;;:::i;:::-;26392:1;26371:18;:22;;;26404:19;:23;;;26438:18;:22;26290:56;-1:-1:-1;26484:19:0;;;;;:43;;;26526:1;26507:16;:20;26484:43;26481:121;;;26543:47;26556:15;26573:16;26543:12;:47::i;:::-;26617:20;;26614:100;;26667:16;;26653:49;;-1:-1:-1;;;26653:49:0;;-1:-1:-1;;;;;26667:16:0;;;26653:49;;;11463:51:1;11530:18;;;11523:34;;;11489:42:0;;26653:13;;11436:18:1;;26653:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26614:100;26729:29;;-1:-1:-1;;;26729:29:0;;26752:4;26729:29;;;962:51:1;26761:1:0;;11489:42;;26729:14;;935:18:1;;26729:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;26726:127;;;26792:17;;26811:29;;-1:-1:-1;;;26811:29:0;;26834:4;26811:29;;;962:51:1;11489:42:0;;26778:13;;-1:-1:-1;;;;;26792:17:0;;;;11489:42;;26811:14;;935:18:1;;26811:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26778:63;;-1:-1:-1;;;;;;26778:63:0;;;;;;;-1:-1:-1;;;;;11481:32:1;;;26778:63:0;;;11463:51:1;11530:18;;;11523:34;11436:18;;26778:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26726:127::-;25265:1595;;;;;;;25237:1623::o;6690:614::-;-1:-1:-1;;;;;6830:20:0;;6822:70;;;;-1:-1:-1;;;6822:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6911:23:0;;6903:71;;;;-1:-1:-1;;;6903:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7011:17:0;;6987:21;7011:17;;;;;;;;;;;7047:23;;;;7039:74;;;;-1:-1:-1;;;7039:74:0;;22147:2:1;7039:74:0;;;22129:21:1;22186:2;22166:18;;;22159:30;22225:34;22205:18;;;22198:62;-1:-1:-1;;;22276:18:1;;;22269:36;22322:19;;7039:74:0;21945:402:1;7039:74:0;-1:-1:-1;;;;;7149:17:0;;;:9;:17;;;;;;;;;;;7169:22;;;7149:42;;7213:20;;;;;;;;:30;;7185:6;;7149:9;7213:30;;7185:6;;7213:30;:::i;:::-;;;;;;;;7278:9;-1:-1:-1;;;;;7261:35:0;7270:6;-1:-1:-1;;;;;7261:35:0;;7289:6;7261:35;;;;160:25:1;;148:2;133:18;;14:177;7261:35:0;;;;;;;;6811:493;6690:614;;;:::o;17222:207::-;-1:-1:-1;;;;;17310:39:0;;;;;;:31;:39;;;;;;;;;:52;;-1:-1:-1;;17310:52:0;;;;;;;;;;17378:43;;22520:51:1;;;22587:18;;;22580:50;17378:43:0;;22493:18:1;17378:43:0;;;;;;;17222:207;;:::o;27332:582::-;27485:16;;;27499:1;27485:16;;;;;;;;27461:21;;27485:16;;;;;;;;;;-1:-1:-1;27485:16:0;27461:40;;27530:4;27512;27517:1;27512:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;27512:23:0;;;-1:-1:-1;;;;;27512:23:0;;;;;11489:42;27546:4;27551:1;27546:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;27546:23:0;;;-1:-1:-1;;;;;27546:23:0;;;;;27582:56;27599:4;27614:9;27626:11;27582:8;:56::i;:::-;27677:229;;-1:-1:-1;;;27677:229:0;;-1:-1:-1;;;;;27677:9:0;:63;;;;:229;;27755:11;;27781:1;;27825:4;;27852:12;;27880:15;;27677:229;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27388:526;27332:582;:::o;24801:428::-;24950:56;24967:4;24982:9;24994:11;24950:8;:56::i;:::-;25017:44;;-1:-1:-1;;;25017:44:0;;-1:-1:-1;;;;;25038:9:0;11481:32:1;25017:44:0;;;11463:51:1;11530:18;;;11523:34;;;11489:42:0;;25017:12;;11436:18:1;;25017:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25104:117:0;;-1:-1:-1;;;25104:117:0;;25135:4;25104:117;;;24023:34:1;;;11489:42:0;24073:18:1;;;24066:43;24125:18;;;24118:34;;;24168:18;;;24161:34;;;25182:1:0;24211:19:1;;;24204:35;;;24255:19;;;24248:35;24299:19;;;24292:44;25205:15:0;24352:19:1;;;24345:35;25104:9:0;-1:-1:-1;;;;;25104:22:0;;;;23957:19:1;;25104:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;24801:428;;:::o;196:597:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;634:6;631:1;628:13;625:91;;;704:1;699:2;690:6;679:9;675:22;671:31;664:42;625:91;-1:-1:-1;777:2:1;756:15;-1:-1:-1;;752:29:1;737:45;;;;784:2;733:54;;196:597;-1:-1:-1;;;196:597:1:o;1024:173::-;1092:20;;-1:-1:-1;;;;;1141:31:1;;1131:42;;1121:70;;1187:1;1184;1177:12;1121:70;1024:173;;;:::o;1202:254::-;1270:6;1278;1331:2;1319:9;1310:7;1306:23;1302:32;1299:52;;;1347:1;1344;1337:12;1299:52;1370:29;1389:9;1370:29;:::i;:::-;1360:39;1446:2;1431:18;;;;1418:32;;-1:-1:-1;;;1202:254:1:o;1653:186::-;1712:6;1765:2;1753:9;1744:7;1740:23;1736:32;1733:52;;;1781:1;1778;1771:12;1733:52;1804:29;1823:9;1804:29;:::i;:::-;1794:39;1653:186;-1:-1:-1;;;1653:186:1:o;2072:127::-;2133:10;2128:3;2124:20;2121:1;2114:31;2164:4;2161:1;2154:15;2188:4;2185:1;2178:15;2204:275;2275:2;2269:9;2340:2;2321:13;;-1:-1:-1;;2317:27:1;2305:40;;2375:18;2360:34;;2396:22;;;2357:62;2354:88;;;2422:18;;:::i;:::-;2458:2;2451:22;2204:275;;-1:-1:-1;2204:275:1:o;2484:183::-;2544:4;2577:18;2569:6;2566:30;2563:56;;;2599:18;;:::i;:::-;-1:-1:-1;2644:1:1;2640:14;2656:4;2636:25;;2484:183::o;2672:662::-;2726:5;2779:3;2772:4;2764:6;2760:17;2756:27;2746:55;;2797:1;2794;2787:12;2746:55;2833:6;2820:20;2859:4;2883:60;2899:43;2939:2;2899:43;:::i;:::-;2883:60;:::i;:::-;2977:15;;;3063:1;3059:10;;;;3047:23;;3043:32;;;3008:12;;;;3087:15;;;3084:35;;;3115:1;3112;3105:12;3084:35;3151:2;3143:6;3139:15;3163:142;3179:6;3174:3;3171:15;3163:142;;;3245:17;;3233:30;;3283:12;;;;3196;;3163:142;;;-1:-1:-1;3323:5:1;2672:662;-1:-1:-1;;;;;;2672:662:1:o;3339:1146::-;3457:6;3465;3518:2;3506:9;3497:7;3493:23;3489:32;3486:52;;;3534:1;3531;3524:12;3486:52;3574:9;3561:23;3603:18;3644:2;3636:6;3633:14;3630:34;;;3660:1;3657;3650:12;3630:34;3698:6;3687:9;3683:22;3673:32;;3743:7;3736:4;3732:2;3728:13;3724:27;3714:55;;3765:1;3762;3755:12;3714:55;3801:2;3788:16;3823:4;3847:60;3863:43;3903:2;3863:43;:::i;3847:60::-;3941:15;;;4023:1;4019:10;;;;4011:19;;4007:28;;;3972:12;;;;4047:19;;;4044:39;;;4079:1;4076;4069:12;4044:39;4103:11;;;;4123:148;4139:6;4134:3;4131:15;4123:148;;;4205:23;4224:3;4205:23;:::i;:::-;4193:36;;4156:12;;;;4249;;;;4123:148;;;4290:5;-1:-1:-1;;4333:18:1;;4320:32;;-1:-1:-1;;4364:16:1;;;4361:36;;;4393:1;4390;4383:12;4361:36;;4416:63;4471:7;4460:8;4449:9;4445:24;4416:63;:::i;:::-;4406:73;;;3339:1146;;;;;:::o;4490:328::-;4567:6;4575;4583;4636:2;4624:9;4615:7;4611:23;4607:32;4604:52;;;4652:1;4649;4642:12;4604:52;4675:29;4694:9;4675:29;:::i;:::-;4665:39;;4723:38;4757:2;4746:9;4742:18;4723:38;:::i;:::-;4713:48;;4808:2;4797:9;4793:18;4780:32;4770:42;;4490:328;;;;;:::o;4823:180::-;4882:6;4935:2;4923:9;4914:7;4910:23;4906:32;4903:52;;;4951:1;4948;4941:12;4903:52;-1:-1:-1;4974:23:1;;4823:180;-1:-1:-1;4823:180:1:o;5405:118::-;5491:5;5484:13;5477:21;5470:5;5467:32;5457:60;;5513:1;5510;5503:12;5457:60;5405:118;:::o;5528:315::-;5593:6;5601;5654:2;5642:9;5633:7;5629:23;5625:32;5622:52;;;5670:1;5667;5660:12;5622:52;5693:29;5712:9;5693:29;:::i;:::-;5683:39;;5772:2;5761:9;5757:18;5744:32;5785:28;5807:5;5785:28;:::i;:::-;5832:5;5822:15;;;5528:315;;;;;:::o;5848:316::-;5925:6;5933;5941;5994:2;5982:9;5973:7;5969:23;5965:32;5962:52;;;6010:1;6007;6000:12;5962:52;-1:-1:-1;;6033:23:1;;;6103:2;6088:18;;6075:32;;-1:-1:-1;6154:2:1;6139:18;;;6126:32;;5848:316;-1:-1:-1;5848:316:1:o;6169:260::-;6237:6;6245;6298:2;6286:9;6277:7;6273:23;6269:32;6266:52;;;6314:1;6311;6304:12;6266:52;6337:29;6356:9;6337:29;:::i;:::-;6327:39;;6385:38;6419:2;6408:9;6404:18;6385:38;:::i;:::-;6375:48;;6169:260;;;;;:::o;6655:380::-;6734:1;6730:12;;;;6777;;;6798:61;;6852:4;6844:6;6840:17;6830:27;;6798:61;6905:2;6897:6;6894:14;6874:18;6871:38;6868:161;;6951:10;6946:3;6942:20;6939:1;6932:31;6986:4;6983:1;6976:15;7014:4;7011:1;7004:15;6868:161;;6655:380;;;:::o;7040:356::-;7242:2;7224:21;;;7261:18;;;7254:30;7320:34;7315:2;7300:18;;7293:62;7387:2;7372:18;;7040:356::o;8183:127::-;8244:10;8239:3;8235:20;8232:1;8225:31;8275:4;8272:1;8265:15;8299:4;8296:1;8289:15;8315:127;8376:10;8371:3;8367:20;8364:1;8357:31;8407:4;8404:1;8397:15;8431:4;8428:1;8421:15;8447:168;8487:7;8553:1;8549;8545:6;8541:14;8538:1;8535:21;8530:1;8523:9;8516:17;8512:45;8509:71;;;8560:18;;:::i;:::-;-1:-1:-1;8600:9:1;;8447:168::o;8620:135::-;8659:3;8680:17;;;8677:43;;8700:18;;:::i;:::-;-1:-1:-1;8747:1:1;8736:13;;8620:135::o;9169:217::-;9209:1;9235;9225:132;;9279:10;9274:3;9270:20;9267:1;9260:31;9314:4;9311:1;9304:15;9342:4;9339:1;9332:15;9225:132;-1:-1:-1;9371:9:1;;9169:217::o;9801:128::-;9841:3;9872:1;9868:6;9865:1;9862:13;9859:39;;;9878:18;;:::i;:::-;-1:-1:-1;9914:9:1;;9801:128::o;11100:184::-;11170:6;11223:2;11211:9;11202:7;11198:23;11194:32;11191:52;;;11239:1;11236;11229:12;11191:52;-1:-1:-1;11262:16:1;;11100:184;-1:-1:-1;11100:184:1:o;11568:245::-;11635:6;11688:2;11676:9;11667:7;11663:23;11659:32;11656:52;;;11704:1;11701;11694:12;11656:52;11736:9;11730:16;11755:28;11777:5;11755:28;:::i;18701:401::-;18903:2;18885:21;;;18942:2;18922:18;;;18915:30;18981:34;18976:2;18961:18;;18954:62;-1:-1:-1;;;19047:2:1;19032:18;;19025:35;19092:3;19077:19;;18701:401::o;19107:399::-;19309:2;19291:21;;;19348:2;19328:18;;;19321:30;19387:34;19382:2;19367:18;;19360:62;-1:-1:-1;;;19453:2:1;19438:18;;19431:33;19496:3;19481:19;;19107:399::o;20220:125::-;20260:4;20288:1;20285;20282:8;20279:34;;;20293:18;;:::i;:::-;-1:-1:-1;20330:9:1;;20220:125::o;22641:980::-;22903:4;22951:3;22940:9;22936:19;22982:6;22971:9;22964:25;23008:2;23046:6;23041:2;23030:9;23026:18;23019:34;23089:3;23084:2;23073:9;23069:18;23062:31;23113:6;23148;23142:13;23179:6;23171;23164:22;23217:3;23206:9;23202:19;23195:26;;23256:2;23248:6;23244:15;23230:29;;23277:1;23287:195;23301:6;23298:1;23295:13;23287:195;;;23366:13;;-1:-1:-1;;;;;23362:39:1;23350:52;;23457:15;;;;23422:12;;;;23398:1;23316:9;23287:195;;;-1:-1:-1;;;;;;;23538:32:1;;;;23533:2;23518:18;;23511:60;-1:-1:-1;;;23602:3:1;23587:19;23580:35;23499:3;22641:980;-1:-1:-1;;;22641:980:1:o;24391:306::-;24479:6;24487;24495;24548:2;24536:9;24527:7;24523:23;24519:32;24516:52;;;24564:1;24561;24554:12;24516:52;24593:9;24587:16;24577:26;;24643:2;24632:9;24628:18;24622:25;24612:35;;24687:2;24676:9;24672:18;24666:25;24656:35;;24391:306;;;;;:::o

Swarm Source

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

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