ETH Price: $2,506.98 (-0.71%)

Token

Proof of Safu (PoS)
 

Overview

Max Total Supply

1,000,000,000 PoS

Holders

81

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
493,242.153006689677406851 PoS

Value
$0.00
0x1fC58E176bC835d1AD7F97cfF3E05287E00F6C77
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:
ProofOfSafu

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-23
*/

// SPDX-License-Identifier: MIT
/**
 *
 * https://twitter.com/proofofsafu
 *
 * https://t.me/ProofofSafu
 */
pragma solidity 0.8.16;

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 _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), 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 IDexRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

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

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

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

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

contract ProofOfSafu is ERC20, Ownable {
    uint256 public maxTxnAmount;
    uint256 public maxWallet;

    IDexRouter public dexRouter;
    address public lpPair;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address operationsAddress;

    uint256 public tradingActiveBlock = 0; // 0 means trading is not active
    uint256 public blockForPenaltyEnd;
    mapping(address => bool) public boughtEarly;
    uint256 public botsCaught;

    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;

    uint256 public buyTotalFees;
    uint256 public buyOperationsFee;
    uint256 public buyLiquidityFee;
    uint256 public buyBurnFee;

    uint256 public sellTotalFees;
    uint256 public sellOperationsFee;
    uint256 public sellLiquidityFee;
    uint256 public sellBurnFee;

    uint256 public constant FEE_DIVISOR = 10000;

    // Investor sell limit variables
    mapping(address => uint256) public nextInvestorSellDate;
    uint256 public timeBetweenSells = 60 minutes;
    uint256 public maxInvestorSell = .25 ether;
    bool public investorLimitsEnabled = true;
    bool public sellingEnabled = false; // Bot protection

    /******************/

    // 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 UpdatedMaxTxnAmount(uint256 newAmount);
    event UpdatedMaxWallet(uint256 newAmount);

    event UpdatedOperationsAddress(address indexed newWallet);

    event MaxTransactionExclusion(address _address, bool excluded);

    event OwnerForcedSwapBack(uint256 timestamp);

    event CaughtEarlyBuyer(address sniper);

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

    event TransferForeignToken(address token, uint256 amount);

    event UpdatedInvestorMaxSell(uint256 amount);

    event EnabledSelling();

    constructor() payable ERC20("Proof of Safu", "PoS") {
        address newOwner = msg.sender; // can leave alone if owner is deployer.

        address _dexRouter;

        if (block.chainid == 1) {
            _dexRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // ETH: Uniswap V2
        } else if (block.chainid == 5) {
            _dexRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // ETH: Goerli
        } else {
            revert("Chain not configured");
        }

        // initialize router
        dexRouter = IDexRouter(_dexRouter);

        // create pair
        lpPair = IDexFactory(dexRouter.factory()).createPair(
            address(this),
            dexRouter.WETH()
        );
        _excludeFromMaxTransaction(address(lpPair), true);
        _setAutomatedMarketMakerPair(address(lpPair), true);

        uint256 totalSupply = 1 * 1e9 * 1e18;

        maxTxnAmount = (totalSupply * 1) / 100; // 1%
        maxWallet = (totalSupply * 2) / 100; // 2%
        swapTokensAtAmount = (totalSupply * 1) / 10000; // 0.01%

        buyOperationsFee = 700;
        buyLiquidityFee = 300;
        buyBurnFee = 0;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyBurnFee;

        sellOperationsFee = 700;
        sellLiquidityFee = 300;
        sellBurnFee = 0;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellBurnFee;

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

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

        operationsAddress = address(0x2D426A09fF15c57DAA0E2dAD34CE8d01005779B1);

        _createInitialSupply(address(this), totalSupply);
        transferOwnership(newOwner);
    }

    receive() external payable {}

    function enableTrading(uint256 deadBlocks) external onlyOwner {
        require(!tradingActive, "Cannot reenable trading");
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
        blockForPenaltyEnd = tradingActiveBlock + deadBlocks;
        emit EnabledTrading();
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        transferDelayEnabled = false;
        emit RemovedLimits();
    }

    function restoreLimits() external onlyOwner {
        limitsInEffect = true;
    }

    function manageBoughtEarly(address wallet, bool flag) external onlyOwner {
        boughtEarly[wallet] = flag;
    }

    function massManageBoughtEarly(address[] calldata wallets, bool flag)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < wallets.length; i++) {
            boughtEarly[wallets[i]] = flag;
        }
    }

    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner {
        transferDelayEnabled = false;
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 2) / 1000) / (10**decimals()),
            "Cannot set max buy amount lower than 0.2%"
        );
        maxTxnAmount = newNum * (10**decimals());
        emit UpdatedMaxTxnAmount(maxTxnAmount);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 100) / (10**decimals()),
            "Cannot set max buy amount lower than 0.2%"
        );
        maxWallet = newNum * (10**decimals());
        emit UpdatedMaxWallet(maxWallet);
    }

    // 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 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);
        emit 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 _burnFee
    ) external onlyOwner {
        buyOperationsFee = _operationsFee;
        buyLiquidityFee = _liquidityFee;
        buyBurnFee = _burnFee;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyBurnFee;
        require(buyTotalFees <= 800, "Must keep fees at 8% or less");
    }

    function updateSellFees(
        uint256 _operationsFee,
        uint256 _liquidityFee,
        uint256 _burnFee
    ) external onlyOwner {
        sellOperationsFee = _operationsFee;
        sellLiquidityFee = _liquidityFee;
        sellBurnFee = _burnFee;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellBurnFee;
        require(sellTotalFees <= 800, "Must keep fees at 8% 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 (!tradingActive) {
            require(
                _isExcludedFromFees[from] || _isExcludedFromFees[to],
                "Trading is not active."
            );
        }

        if (blockForPenaltyEnd > 0) {
            require(
                !boughtEarly[from] || to == owner() || to == address(0xdead),
                "Bots cannot transfer tokens in or out except to owner or dead address."
            );
        }

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !_isExcludedFromFees[from] &&
                !_isExcludedFromFees[to]
            ) {
                // 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 - 2 &&
                                _holderLastTransferTimestamp[to] <
                                block.number - 2,
                            "_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 <= maxTxnAmount,
                        "Buy transfer amount exceeds the max txn."
                    );
                    require(
                        balanceOf(to) + amount <= maxWallet,
                        "Max Wallet Exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(sellingEnabled, "Selling disabled");

                    require(
                        amount <= maxTxnAmount,
                        "Sell transfer amount exceeds the max txn."
                    );

                    if (investorLimitsEnabled) {
                        require(
                            nextInvestorSellDate[from] <= block.timestamp,
                            "Cannot sell yet"
                        );

                        require(
                            amount <= getInvestorMaxSell(),
                            "Attempting to sell over max sell amount.  Check max."
                        );

                        nextInvestorSellDate[from] =
                            block.timestamp +
                            timeBetweenSells;
                    }
                } else if (
                    !_isExcludedMaxTransactionAmount[to] &&
                    !_isExcludedFromFees[to]
                ) {
                    if (investorLimitsEnabled) {
                        revert(
                            "Investors cannot transfer and must sell only or transfer to a whitelisted address."
                        );
                    } else {
                        require(
                            balanceOf(to) + amount <= maxWallet,
                            "Max Wallet Exceeded"
                        );
                    }
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

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

            if (contractTokenBalance > swapTokensAtAmount * 20) {
                contractTokenBalance = swapTokensAtAmount * 20;
            }

            swapTokensForEthAndSend(contractTokenBalance);

            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 burnTokens = 0;
        uint256 liquidityTokens = 0;
        address currentLiquidityAddress;
        // only take fees on buys/sells, do not take on wallet transfers

        if (takeFee) {
            // bot/sniper penalty.
            if (
                earlyBuyPenaltyInEffect() &&
                automatedMarketMakerPairs[from] &&
                !automatedMarketMakerPairs[to] &&
                buyTotalFees > 0
            ) {
                if (!boughtEarly[to]) {
                    boughtEarly[to] = true;
                    botsCaught += 1;
                    emit CaughtEarlyBuyer(to);
                }
                currentLiquidityAddress = from;
                fees = (amount * 99) / 100;
                liquidityTokens = (fees * buyLiquidityFee) / buyTotalFees;
                burnTokens = (fees * buyBurnFee) / buyTotalFees;
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                currentLiquidityAddress = to;
                fees = (amount * sellTotalFees) / FEE_DIVISOR;
                liquidityTokens = (fees * sellLiquidityFee) / sellTotalFees;
                burnTokens = (fees * sellBurnFee) / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                currentLiquidityAddress = from;
                fees = (amount * buyTotalFees) / FEE_DIVISOR;
                liquidityTokens = (fees * buyLiquidityFee) / buyTotalFees;
                burnTokens = (fees * buyBurnFee) / buyTotalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
                if (burnTokens > 0) {
                    _burn(address(this), burnTokens);
                }
                if (liquidityTokens > 0) {
                    super._transfer(
                        address(this),
                        currentLiquidityAddress,
                        liquidityTokens
                    );
                }
            }
            amount -= fees;
        }

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

    function earlyBuyPenaltyInEffect() public view returns (bool) {
        return block.number < blockForPenaltyEnd;
    }

    function swapTokensForEthAndSend(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(operationsAddress),
            block.timestamp
        );
    }

    function updateTimeBetweenSells(uint256 timeInMinutes) external onlyOwner {
        require(timeInMinutes > 0 && timeInMinutes <= 1440);
        timeBetweenSells = timeInMinutes * 1 minutes;
    }

    function setSellingEnabled(bool confirmSellingEnabled) external onlyOwner {
        require(confirmSellingEnabled, "Confirm selling enabled!");
        require(!sellingEnabled, "Selling already enabled!");

        sellingEnabled = true;
        emit EnabledSelling();
    }

    function setInvestorMaxSell(uint256 amount) external onlyOwner {
        require(
            amount >= 25 && amount <= 2500,
            "Must set between 0.25 and 25 ETH"
        );
        maxInvestorSell = amount * 1e16;
        emit UpdatedInvestorMaxSell(amount);
    }

    function getInvestorMaxSell() public view returns (uint256) {
        address[] memory path = new address[](2);
        path[0] = dexRouter.WETH();
        path[1] = address(this);

        uint256[] memory amounts = new uint256[](2);
        amounts = dexRouter.getAmountsOut(maxInvestorSell, path);
        return
            amounts[1] +
            (amounts[1] *
                (sellOperationsFee + sellLiquidityFee + sellBurnFee)) /
            FEE_DIVISOR;
    }

    function emergencyTogglePrivateSaleLimits(bool _enabled) public onlyOwner {
        investorLimitsEnabled = _enabled;
    }

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

    function setPhase2() external onlyOwner {
        buyOperationsFee = 500;
        buyLiquidityFee = 100;
        buyBurnFee = 0;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyBurnFee;

        sellOperationsFee = 500;
        sellLiquidityFee = 100;
        sellBurnFee = 0;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellBurnFee;

        maxInvestorSell = .5 ether;
        timeBetweenSells = 2 hours;
    }

    function setPhase3() external onlyOwner {
        buyOperationsFee = 300;
        buyLiquidityFee = 0;
        buyBurnFee = 0;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyBurnFee;

        sellOperationsFee = 300;
        sellLiquidityFee = 0;
        sellBurnFee = 0;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellBurnFee;

        maxInvestorSell = .75 ether;
        timeBetweenSells = 2 hours;
    }

    function setPhase4() external onlyOwner {
        buyOperationsFee = 300;
        buyLiquidityFee = 0;
        buyBurnFee = 0;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyBurnFee;

        sellOperationsFee = 300;
        sellLiquidityFee = 0;
        sellBurnFee = 0;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellBurnFee;

        maxInvestorSell = 1 ether;
        timeBetweenSells = 2 hours;
    }

    function addLP(bool confirmAddLp) external onlyOwner {
        require(confirmAddLp, "Please confirm adding of the LP");
        require(!tradingActive, "Trading is already active, cannot relaunch.");

        // add the liquidity
        require(
            address(this).balance > 0,
            "Must have ETH on contract to launch"
        );
        require(
            balanceOf(address(this)) > 0,
            "Must have Tokens on contract to launch"
        );

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

        dexRouter.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(this),
            block.timestamp
        );
    }

    function removeLP(uint256 percent) external onlyOwner {
        uint256 lpBalance = IERC20(lpPair).balanceOf(address(this));

        require(lpBalance > 0, "No LP tokens in contract");

        uint256 lpAmount = (lpBalance * percent) / 10000;

        // approve token transfer to cover all possible scenarios
        IERC20(lpPair).approve(address(dexRouter), lpAmount);

        // remove the liquidity
        dexRouter.removeLiquidityETH(
            address(this),
            lpAmount,
            1, // slippage is unavoidable
            1, // slippage is unavoidable
            msg.sender,
            block.timestamp
        );
    }

    function launch(uint256 blocksForPenalty) external onlyOwner {
        require(!tradingActive, "Trading is already active, cannot relaunch.");
        require(
            blocksForPenalty < 10,
            "Cannot make penalty blocks more than 10"
        );

        //standard enable trading
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
        blockForPenaltyEnd = tradingActiveBlock + blocksForPenalty;
        emit EnabledTrading();

        // add the liquidity

        require(
            address(this).balance > 0,
            "Must have ETH on contract to launch"
        );

        require(
            balanceOf(address(this)) > 0,
            "Must have Tokens on contract to launch"
        );

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

        dexRouter.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(this),
            block.timestamp
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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":[{"indexed":false,"internalType":"address","name":"sniper","type":"address"}],"name":"CaughtEarlyBuyer","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledSelling","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":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnerForcedSwapBack","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":[{"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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdatedInvestorMaxSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxTxnAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedOperationsAddress","type":"event"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"confirmAddLp","type":"bool"}],"name":"addLP","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":"blockForPenaltyEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botsCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boughtEarly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBurnFee","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":"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":"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":"earlyBuyPenaltyInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"emergencyTogglePrivateSaleLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"deadBlocks","type":"uint256"}],"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":[],"name":"getInvestorMaxSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"investorLimitsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocksForPenalty","type":"uint256"}],"name":"launch","outputs":[],"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":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"manageBoughtEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"massManageBoughtEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxInvestorSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nextInvestorSellDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"removeLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restoreLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","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":[],"name":"sellingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"amount","type":"uint256"}],"name":"setInvestorMaxSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operationsAddress","type":"address"}],"name":"setOperationsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPhase2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPhase3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPhase4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"confirmSellingEnabled","type":"bool"}],"name":"setSellingEnabled","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":"timeBetweenSells","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":"_burnFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","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":"_burnFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeInMinutes","type":"uint256"}],"name":"updateTimeBetweenSells","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6000600c556010805462ffffff191660019081179091556012805460ff191682179055610e10601c556703782dace9d90000601d55601e805461ffff19169091179055600d60809081526c50726f6f66206f66205361667560981b60a052610100604052600360c081815262506f5360e81b60e05290620000818382620008d8565b506004620000908282620008d8565b5050506000620000a5620004d660201b60201c565b600580546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062004c16833981519152908290a350336000466001036200010a5750737a250d5630b4cf539739df2c5dacb4c659f2488d6200017c565b466005036200012f5750737a250d5630b4cf539739df2c5dacb4c659f2488d6200017c565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620001d6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fc9190620009a4565b6001600160a01b031663c9c6539630600860009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200025f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002859190620009a4565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002d3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f99190620009a4565b600980546001600160a01b0319166001600160a01b0392909216918217905562000325906001620004da565b6009546200033e906001600160a01b031660016200053b565b6b033b2e3c9fd0803ce800000060646200035a826001620009ec565b62000366919062000a0e565b600655606462000378826002620009ec565b62000384919062000a0e565b60075561271062000397826001620009ec565b620003a3919062000a0e565b600a556102bc601481905561012c60158190556000601681905591620003ca919062000a31565b620003d6919062000a31565b6013556102bc601881905561012c60198190556000601a81905591620003fd919062000a31565b62000409919062000a31565b60175562000419836001620004da565b62000426306001620004da565b6200043561dead6001620004da565b6008546200044e906001600160a01b03166001620004da565b6200045b836001620005a7565b62000468306001620005a7565b6200047761dead6001620005a7565b60085462000490906001600160a01b03166001620005a7565b600b80546001600160a01b031916732d426a09ff15c57daa0e2dad34ce8d01005779b1179055620004c2308262000651565b620004cd8362000736565b50505062000a4d565b3390565b6001600160a01b03821660008181526020808052604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382166000908152602160205260409020805460ff19168215151790556200056b8282620004da565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314620005f25760405162461bcd60e51b8152602060048201819052602482015260008051602062004bf6833981519152604482015260640162000173565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006a95760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000173565b8060026000828254620006bd919062000a31565b90915550506001600160a01b03821660009081526020819052604081208054839290620006ec90849062000a31565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620007815760405162461bcd60e51b8152602060048201819052602482015260008051602062004bf6833981519152604482015260640162000173565b6001600160a01b038116620007e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000173565b6005546040516001600160a01b0380841692169060008051602062004c1683398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200085e57607f821691505b6020821081036200087f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620008d357600081815260208120601f850160051c81016020861015620008ae5750805b601f850160051c820191505b81811015620008cf57828155600101620008ba565b5050505b505050565b81516001600160401b03811115620008f457620008f462000833565b6200090c8162000905845462000849565b8462000885565b602080601f8311600181146200094457600084156200092b5750858301515b600019600386901b1c1916600185901b178555620008cf565b600085815260208120601f198616915b82811015620009755788860151825594840194600190910190840162000954565b5085821015620009945787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620009b757600080fd5b81516001600160a01b0381168114620009cf57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000a095762000a09620009d6565b500290565b60008262000a2c57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000a475762000a47620009d6565b92915050565b6141998062000a5d6000396000f3fe60806040526004361061041f5760003560e01c806395d89b411161021e578063cf46f24c11610123578063e884f260116100ab578063f2fde38b1161007a578063f2fde38b14610c06578063f5648a4f14610c26578063f637434214610c3b578063f771cb6514610c51578063f8b45b0514610c7057600080fd5b8063e884f26014610ba5578063ee40166e14610bba578063efda116514610bd0578063f11a24d314610bf057600080fd5b8063d85ba063116100f2578063d85ba06314610afd578063dd62ed3e14610b13578063e2f4560514610b59578063e71dc3f514610b6f578063e800dff714610b8557600080fd5b8063cf46f24c14610a84578063d0d52b5d14610a9a578063d257b34f14610ac7578063d7afe8bc14610ae757600080fd5b8063adb873bd116101a6578063bbc0c74211610175578063bbc0c742146109eb578063c024666814610a0a578063c17b5b8c14610a2a578063c18bc19514610a4a578063c876d0b914610a6a57600080fd5b8063adb873bd14610965578063b16d78cf1461097b578063b62496f51461099b578063b9875539146109cb57600080fd5b8063a28e86d3116101ed578063a28e86d3146108e0578063a457c2d7146108f5578063a62068ce14610915578063a9059cbb1461092b578063aacd0d5a1461094b57600080fd5b806395d89b41146108755780639a7a23d61461088a5780639e034c77146108aa5780639e93ad8e146108ca57600080fd5b806356dda58711610324578063751039fc116102ac57806382aa7c681161027b57806382aa7c68146107c75780638366e79a146107e757806385b12c7c1461080757806385ecfd28146108275780638da5cb5b1461085757600080fd5b8063751039fc1461075c5780637571336a1461077157806375bd5e96146107915780638095d564146107a757600080fd5b80636a486a8e116102f35780636a486a8e146106db5780636b0a894c146106f15780636ddd17131461070757806370a0823114610727578063715018a61461074757600080fd5b806356dda5871461067957806358a6d5311461068e5780635a139dd4146106a557806365fa2ee5146106bb57600080fd5b80632a7e65a2116103a75780633c854e14116103765780633c854e14146105f4578063452ed4f114610609578063499b8394146106295780634a62bb65146106495780634f77f6c01461066357600080fd5b80632a7e65a2146105835780632f0df2af146105a3578063313ce567146105b857806339509351146105d457600080fd5b8063130a2c3c116103ee578063130a2c3c146104ed57806318160ddd1461050f5780631a97edea1461052e578063203e727e1461054357806323b872dd1461056357600080fd5b806306fdde031461042b5780630758d92414610456578063095ea7b31461048e57806310d5de53146104be57600080fd5b3661042657005b600080fd5b34801561043757600080fd5b50610440610c86565b60405161044d919061394d565b60405180910390f35b34801561046257600080fd5b50600854610476906001600160a01b031681565b6040516001600160a01b03909116815260200161044d565b34801561049a57600080fd5b506104ae6104a93660046139b3565b610d18565b604051901515815260200161044d565b3480156104ca57600080fd5b506104ae6104d93660046139df565b602080526000908152604090205460ff1681565b3480156104f957600080fd5b5061050d610508366004613a11565b610d2f565b005b34801561051b57600080fd5b506002545b60405190815260200161044d565b34801561053a57600080fd5b5061050d610dd9565b34801561054f57600080fd5b5061050d61055e366004613a97565b610e71565b34801561056f57600080fd5b506104ae61057e366004613ab0565b610f43565b34801561058f57600080fd5b5061050d61059e366004613af1565b610fed565b3480156105af57600080fd5b5061052061102a565b3480156105c457600080fd5b506040516012815260200161044d565b3480156105e057600080fd5b506104ae6105ef3660046139b3565b611234565b34801561060057600080fd5b5061050d611270565b34801561061557600080fd5b50600954610476906001600160a01b031681565b34801561063557600080fd5b5061050d6106443660046139df565b611308565b34801561065557600080fd5b506010546104ae9060ff1681565b34801561066f57600080fd5b5061052060185481565b34801561068557600080fd5b5061050d6113b9565b34801561069a57600080fd5b50600d5443106104ae565b3480156106b157600080fd5b5061052060145481565b3480156106c757600080fd5b5061050d6106d6366004613a97565b611453565b3480156106e757600080fd5b5061052060175481565b3480156106fd57600080fd5b50610520600f5481565b34801561071357600080fd5b506010546104ae9062010000900460ff1681565b34801561073357600080fd5b506105206107423660046139df565b611520565b34801561075357600080fd5b5061050d61153b565b34801561076857600080fd5b5061050d6115af565b34801561077d57600080fd5b5061050d61078c366004613b0e565b61161a565b34801561079d57600080fd5b50610520601d5481565b3480156107b357600080fd5b5061050d6107c2366004613b47565b6116e1565b3480156107d357600080fd5b5061050d6107e2366004613a97565b61178a565b3480156107f357600080fd5b506104ae610802366004613b73565b61185d565b34801561081357600080fd5b5061050d610822366004613a97565b611a66565b34801561083357600080fd5b506104ae6108423660046139df565b600e6020526000908152604090205460ff1681565b34801561086357600080fd5b506005546001600160a01b0316610476565b34801561088157600080fd5b50610440611c8d565b34801561089657600080fd5b5061050d6108a5366004613b0e565b611c9c565b3480156108b657600080fd5b5061050d6108c5366004613a97565b611d90565b3480156108d657600080fd5b5061052061271081565b3480156108ec57600080fd5b5061050d611de6565b34801561090157600080fd5b506104ae6109103660046139b3565b611e1f565b34801561092157600080fd5b50610520600d5481565b34801561093757600080fd5b506104ae6109463660046139b3565b611eb8565b34801561095757600080fd5b50601e546104ae9060ff1681565b34801561097157600080fd5b50610520601a5481565b34801561098757600080fd5b5061050d610996366004613af1565b611ec5565b3480156109a757600080fd5b506104ae6109b63660046139df565b60216020526000908152604090205460ff1681565b3480156109d757600080fd5b5061050d6109e6366004613af1565b611fcf565b3480156109f757600080fd5b506010546104ae90610100900460ff1681565b348015610a1657600080fd5b5061050d610a25366004613b0e565b61208e565b348015610a3657600080fd5b5061050d610a45366004613b47565b612117565b348015610a5657600080fd5b5061050d610a65366004613a97565b6121bb565b348015610a7657600080fd5b506012546104ae9060ff1681565b348015610a9057600080fd5b5061052060065481565b348015610aa657600080fd5b50610520610ab53660046139df565b601b6020526000908152604090205481565b348015610ad357600080fd5b5061050d610ae2366004613a97565b612285565b348015610af357600080fd5b50610520601c5481565b348015610b0957600080fd5b5061052060135481565b348015610b1f57600080fd5b50610520610b2e366004613b73565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b6557600080fd5b50610520600a5481565b348015610b7b57600080fd5b5061052060165481565b348015610b9157600080fd5b5061050d610ba0366004613b0e565b6123d0565b348015610bb157600080fd5b5061050d612425565b348015610bc657600080fd5b50610520600c5481565b348015610bdc57600080fd5b5061050d610beb366004613a97565b61245b565b348015610bfc57600080fd5b5061052060155481565b348015610c1257600080fd5b5061050d610c213660046139df565b61265c565b348015610c3257600080fd5b5061050d612747565b348015610c4757600080fd5b5061052060195481565b348015610c5d57600080fd5b50601e546104ae90610100900460ff1681565b348015610c7c57600080fd5b5061052060075481565b606060038054610c9590613ba1565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc190613ba1565b8015610d0e5780601f10610ce357610100808354040283529160200191610d0e565b820191906000526020600020905b815481529060010190602001808311610cf157829003601f168201915b5050505050905090565b6000610d253384846127b3565b5060015b92915050565b6005546001600160a01b03163314610d625760405162461bcd60e51b8152600401610d5990613bdb565b60405180910390fd5b60005b82811015610dd35781600e6000868685818110610d8457610d84613c10565b9050602002016020810190610d9991906139df565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610dcb81613c3c565b915050610d65565b50505050565b6005546001600160a01b03163314610e035760405162461bcd60e51b8152600401610d5990613bdb565b61012c601481905560006015819055601681905590610e23908290613c55565b610e2d9190613c55565b60135561012c601881905560006019819055601a81905590610e50908290613c55565b610e5a9190613c55565b601755670de0b6b3a7640000601d55611c20601c55565b6005546001600160a01b03163314610e9b5760405162461bcd60e51b8152600401610d5990613bdb565b610ea76012600a613d4c565b6103e8610eb360025490565b610ebe906002613d5b565b610ec89190613d7a565b610ed29190613d7a565b811015610ef15760405162461bcd60e51b8152600401610d5990613d9c565b610efd6012600a613d4c565b610f079082613d5b565b60068190556040519081527f89c099a4e6d77f9ed9839689924c080dcc270b4bc837e2d8979544f19df27d78906020015b60405180910390a150565b6000610f508484846128d8565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610fd55760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610d59565b610fe285338584036127b3565b506001949350505050565b6005546001600160a01b031633146110175760405162461bcd60e51b8152600401610d5990613bdb565b601e805460ff1916911515919091179055565b604080516002808252606082018352600092839291906020830190803683375050600854604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bc9190613dfb565b816000815181106110cf576110cf613c10565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061110357611103613c10565b6001600160a01b0392909216602092830291909101820152604080516002808252606082018352600093919290918301908036833701905050600854601d5460405163d06ca61f60e01b81529293506001600160a01b039091169163d06ca61f91611172918690600401613e5c565b600060405180830381865afa15801561118f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111b79190810190613e7d565b9050612710601a546019546018546111cf9190613c55565b6111d99190613c55565b826001815181106111ec576111ec613c10565b60200260200101516111fe9190613d5b565b6112089190613d7a565b8160018151811061121b5761121b613c10565b602002602001015161122d9190613c55565b9250505090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d2591859061126b908690613c55565b6127b3565b6005546001600160a01b0316331461129a5760405162461bcd60e51b8152600401610d5990613bdb565b61012c6014819055600060158190556016819055906112ba908290613c55565b6112c49190613c55565b60135561012c601881905560006019819055601a819055906112e7908290613c55565b6112f19190613c55565b601755670a688906bd8b0000601d55611c20601c55565b6005546001600160a01b031633146113325760405162461bcd60e51b8152600401610d5990613bdb565b6001600160a01b0381166113975760405162461bcd60e51b815260206004820152602660248201527f5f6f7065726174696f6e734164647265737320616464726573732063616e6e6f60448201526507420626520360d41b6064820152608401610d59565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146113e35760405162461bcd60e51b8152600401610d5990613bdb565b6101f460148190556064601581905560006016819055916114049190613c55565b61140e9190613c55565b6013556101f46018819055606460198190556000601a819055916114329190613c55565b61143c9190613c55565b6017556706f05b59d3b20000601d55611c20601c55565b6005546001600160a01b0316331461147d5760405162461bcd60e51b8152600401610d5990613bdb565b6019811015801561149057506109c48111155b6114dc5760405162461bcd60e51b815260206004820181905260248201527f4d75737420736574206265747765656e20302e323520616e64203235204554486044820152606401610d59565b6114ed81662386f26fc10000613d5b565b601d556040518181527fce91d2f8a31cab688c8ec911efdf0e526d13a800d38aeff93e22b5e3dc693fd190602001610f38565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146115655760405162461bcd60e51b8152600401610d5990613bdb565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146115d95760405162461bcd60e51b8152600401610d5990613bdb565b6010805460ff199081169091556012805490911690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146116445760405162461bcd60e51b8152600401610d5990613bdb565b806116b7576009546001600160a01b03908116908316036116b75760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610d59565b6001600160a01b039190911660009081526020805260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461170b5760405162461bcd60e51b8152600401610d5990613bdb565b601483905560158290556016819055806117258385613c55565b61172f9190613c55565b601381905561032010156117855760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203825206f72206c657373000000006044820152606401610d59565b505050565b6005546001600160a01b031633146117b45760405162461bcd60e51b8152600401610d5990613bdb565b601054610100900460ff161561180c5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610d59565b6010805462ffff0019166201010017905543600c81905561182e908290613c55565b600d556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a150565b6005546000906001600160a01b0316331461188a5760405162461bcd60e51b8152600401610d5990613bdb565b6001600160a01b0383166118e05760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610d59565b306001600160a01b038416036119385760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610d59565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa15801561197f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a39190613f3b565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af11580156119f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1a9190613f54565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b03163314611a905760405162461bcd60e51b8152600401610d5990613bdb565b601054610100900460ff1615611ab85760405162461bcd60e51b8152600401610d5990613f71565b600a8110611b185760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f74206d616b652070656e616c747920626c6f636b73206d6f72652060448201526607468616e2031360cc1b6064820152608401610d59565b6010805462ffff0019166201010017905543600c819055611b3a908290613c55565b600d556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a160004711611b865760405162461bcd60e51b8152600401610d5990613fbc565b6000611b9130611520565b11611bed5760405162461bcd60e51b815260206004820152602660248201527f4d757374206861766520546f6b656e73206f6e20636f6e747261637420746f206044820152650d8c2eadcc6d60d31b6064820152608401610d59565b600854611c089030906001600160a01b031661126b82611520565b6008546001600160a01b031663f305d7194730611c2481611520565b60008030426040518863ffffffff1660e01b8152600401611c4a96959493929190613fff565b60606040518083038185885af1158015611c68573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610dd3919061403a565b606060048054610c9590613ba1565b6005546001600160a01b03163314611cc65760405162461bcd60e51b8152600401610d5990613bdb565b6009546001600160a01b0390811690831603611d4a5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610d59565b611d5482826134e1565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314611dba5760405162461bcd60e51b8152600401610d5990613bdb565b600081118015611dcc57506105a08111155b611dd557600080fd5b611de081603c613d5b565b601c5550565b6005546001600160a01b03163314611e105760405162461bcd60e51b8152600401610d5990613bdb565b6010805460ff19166001179055565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611ea15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d59565b611eae33858584036127b3565b5060019392505050565b6000610d253384846128d8565b6005546001600160a01b03163314611eef5760405162461bcd60e51b8152600401610d5990613bdb565b80611f3c5760405162461bcd60e51b815260206004820152601860248201527f436f6e6669726d2073656c6c696e6720656e61626c65642100000000000000006044820152606401610d59565b601e54610100900460ff1615611f945760405162461bcd60e51b815260206004820152601860248201527f53656c6c696e6720616c726561647920656e61626c65642100000000000000006044820152606401610d59565b601e805461ff0019166101001790556040517f7fdc9c6ba047bed382d2ae7be131e601f2fead137f249278e33c13a6928b080890600090a150565b6005546001600160a01b03163314611ff95760405162461bcd60e51b8152600401610d5990613bdb565b806120465760405162461bcd60e51b815260206004820152601f60248201527f506c6561736520636f6e6669726d20616464696e67206f6620746865204c50006044820152606401610d59565b601054610100900460ff161561206e5760405162461bcd60e51b8152600401610d5990613f71565b60004711611b865760405162461bcd60e51b8152600401610d5990613fbc565b6005546001600160a01b031633146120b85760405162461bcd60e51b8152600401610d5990613bdb565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146121415760405162461bcd60e51b8152600401610d5990613bdb565b60188390556019829055601a8190558061215b8385613c55565b6121659190613c55565b601781905561032010156117855760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203825206f72206c657373000000006044820152606401610d59565b6005546001600160a01b031633146121e55760405162461bcd60e51b8152600401610d5990613bdb565b6121f16012600a613d4c565b60646121fc60025490565b612207906001613d5b565b6122119190613d7a565b61221b9190613d7a565b81101561223a5760405162461bcd60e51b8152600401610d5990613d9c565b6122466012600a613d4c565b6122509082613d5b565b60078190556040519081527f3046ad62de8b70d396246aaed19ff2559ff20df8706520cbde58320766c4276290602001610f38565b6005546001600160a01b031633146122af5760405162461bcd60e51b8152600401610d5990613bdb565b620186a06122bc60025490565b6122c7906001613d5b565b6122d19190613d7a565b81101561233e5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610d59565b6103e861234a60025490565b612355906001613d5b565b61235f9190613d7a565b8111156123cb5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610d59565b600a55565b6005546001600160a01b031633146123fa5760405162461bcd60e51b8152600401610d5990613bdb565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461244f5760405162461bcd60e51b8152600401610d5990613bdb565b6012805460ff19169055565b6005546001600160a01b031633146124855760405162461bcd60e51b8152600401610d5990613bdb565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156124ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f29190613f3b565b9050600081116125445760405162461bcd60e51b815260206004820152601860248201527f4e6f204c5020746f6b656e7320696e20636f6e747261637400000000000000006044820152606401610d59565b60006127106125538484613d5b565b61255d9190613d7a565b60095460085460405163095ea7b360e01b81526001600160a01b03918216600482015260248101849052929350169063095ea7b3906044016020604051808303816000875af11580156125b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d89190613f54565b50600854604051629d473b60e21b81526001600160a01b03909116906302751cec906126139030908590600190819033904290600401613fff565b60408051808303816000875af1158015612631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126559190614068565b5050505050565b6005546001600160a01b031633146126865760405162461bcd60e51b8152600401610d5990613bdb565b6001600160a01b0381166126eb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d59565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146127715760405162461bcd60e51b8152600401610d5990613bdb565b604051600090339047908381818185875af1925050503d8060008114610dd3576040519150601f19603f3d011682016040523d82523d6000602084013e610dd3565b6001600160a01b0383166128155760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d59565b6001600160a01b0382166128765760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d59565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166128fe5760405162461bcd60e51b8152600401610d599061408c565b6001600160a01b0382166129245760405162461bcd60e51b8152600401610d59906140d1565b600081116129745760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610d59565b601054610100900460ff16612a07576001600160a01b0383166000908152601f602052604090205460ff16806129c257506001600160a01b0382166000908152601f602052604090205460ff165b612a075760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d59565b600d5415612ada576001600160a01b0383166000908152600e602052604090205460ff161580612a4457506005546001600160a01b038381169116145b80612a5957506001600160a01b03821661dead145b612ada5760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610d59565b60105460ff16156130d3576005546001600160a01b03848116911614801590612b1157506005546001600160a01b03838116911614155b8015612b2557506001600160a01b03821615155b8015612b3c57506001600160a01b03821661dead14155b8015612b6157506001600160a01b0383166000908152601f602052604090205460ff16155b8015612b8657506001600160a01b0382166000908152601f602052604090205460ff16155b156130d35760125460ff1615612c9f576008546001600160a01b03838116911614801590612bc257506009546001600160a01b03838116911614155b15612c9f57612bd2600243614114565b32600090815260116020526040902054108015612c105750612bf5600243614114565b6001600160a01b038316600090815260116020526040902054105b612c7a5760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610d59565b3260009081526011602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526021602052604090205460ff168015612cdf57506001600160a01b038216600090815260208052604090205460ff16155b15612da757600654811115612d475760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc103a3c371760c11b6064820152608401610d59565b60075481612d5484611520565b612d5e9190613c55565b1115612da25760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d59565b6130d3565b6001600160a01b03821660009081526021602052604090205460ff168015612de757506001600160a01b038316600090815260208052604090205460ff16155b15612f9e57601e54610100900460ff16612e365760405162461bcd60e51b815260206004820152601060248201526f14d95b1b1a5b99c8191a5cd8589b195960821b6044820152606401610d59565b600654811115612e9a5760405162461bcd60e51b815260206004820152602960248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152681036b0bc103a3c371760b91b6064820152608401610d59565b601e5460ff1615612da2576001600160a01b0383166000908152601b6020526040902054421015612eff5760405162461bcd60e51b815260206004820152600f60248201526e10d85b9b9bdd081cd95b1b081e595d608a1b6044820152606401610d59565b612f0761102a565b811115612f735760405162461bcd60e51b815260206004820152603460248201527f417474656d7074696e6720746f2073656c6c206f766572206d61782073656c6c6044820152731030b6b7bab73a17101021b432b1b59036b0bc1760611b6064820152608401610d59565b601c54612f809042613c55565b6001600160a01b0384166000908152601b60205260409020556130d3565b6001600160a01b038216600090815260208052604090205460ff16158015612fdf57506001600160a01b0382166000908152601f602052604090205460ff16155b156130d357601e5460ff16156130785760405162461bcd60e51b815260206004820152605260248201527f496e766573746f72732063616e6e6f74207472616e7366657220616e64206d7560448201527f73742073656c6c206f6e6c79206f72207472616e7366657220746f206120776860648201527134ba32b634b9ba32b21030b2323932b9b99760711b608482015260a401610d59565b6007548161308584611520565b61308f9190613c55565b11156130d35760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d59565b60006130de30611520565b600a54909150811080159081906130fd575060105462010000900460ff165b80156131135750600954600160a01b900460ff16155b801561313857506001600160a01b03851660009081526021602052604090205460ff16155b801561315d57506001600160a01b0385166000908152601f602052604090205460ff16155b801561318257506001600160a01b0384166000908152601f602052604090205460ff16155b156131d7576009805460ff60a01b1916600160a01b179055600a546131a8906014613d5b565b8211156131c057600a546131bd906014613d5b565b91505b6131c98261350f565b6009805460ff60a01b191690555b6001600160a01b0385166000908152601f602052604090205460019060ff168061321957506001600160a01b0385166000908152601f602052604090205460ff165b15613222575060005b60008060008084156134ca57600d544310801561325757506001600160a01b038a1660009081526021602052604090205460ff165b801561327c57506001600160a01b03891660009081526021602052604090205460ff16155b801561328a57506000601354115b15613384576001600160a01b0389166000908152600e602052604090205460ff1661332a576001600160a01b0389166000908152600e60205260408120805460ff19166001908117909155600f8054919290916132e8908490613c55565b90915550506040516001600160a01b038a1681527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b50886064613339896063613d5b565b6133439190613d7a565b9350601354601554856133569190613d5b565b6133609190613d7a565b9150601354601654856133739190613d5b565b61337d9190613d7a565b925061348b565b6001600160a01b03891660009081526021602052604090205460ff1680156133ae57506000601754115b1561340157889050612710601754896133c79190613d5b565b6133d19190613d7a565b9350601754601954856133e49190613d5b565b6133ee9190613d7a565b9150601754601a54856133739190613d5b565b6001600160a01b038a1660009081526021602052604090205460ff16801561342b57506000601354115b1561348b57899050612710601354896134449190613d5b565b61344e9190613d7a565b9350601354601554856134619190613d5b565b61346b9190613d7a565b91506013546016548561347e9190613d5b565b6134889190613d7a565b92505b83156134bd5761349c8a308661366d565b82156134ac576134ac30846137c2565b81156134bd576134bd30828461366d565b6134c78489614114565b97505b6134d58a8a8a61366d565b50505050505050505050565b6001600160a01b0382166000908152602160205260409020805460ff1916821515179055611d5482826138ec565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061354457613544613c10565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561359d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135c19190613dfb565b816001815181106135d4576135d4613c10565b6001600160a01b0392831660209182029290920101526008546135fa91309116846127b3565b600854600b5460405163791ac94760e01b81526001600160a01b039283169263791ac9479261363792879260009288929116904290600401614127565b600060405180830381600087803b15801561365157600080fd5b505af1158015613665573d6000803e3d6000fd5b505050505050565b6001600160a01b0383166136935760405162461bcd60e51b8152600401610d599061408c565b6001600160a01b0382166136b95760405162461bcd60e51b8152600401610d59906140d1565b6001600160a01b038316600090815260208190526040902054818110156137315760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d59565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290613768908490613c55565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516137b491815260200190565b60405180910390a350505050565b6001600160a01b0382166138225760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d59565b6001600160a01b038216600090815260208190526040902054818110156138965760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d59565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016128cb565b6001600160a01b03821660008181526020808052604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b600060208083528351808285015260005b8181101561397a5785810183015185820160400152820161395e565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146139b057600080fd5b50565b600080604083850312156139c657600080fd5b82356139d18161399b565b946020939093013593505050565b6000602082840312156139f157600080fd5b81356139fc8161399b565b9392505050565b80151581146139b057600080fd5b600080600060408486031215613a2657600080fd5b833567ffffffffffffffff80821115613a3e57600080fd5b818601915086601f830112613a5257600080fd5b813581811115613a6157600080fd5b8760208260051b8501011115613a7657600080fd5b60209283019550935050840135613a8c81613a03565b809150509250925092565b600060208284031215613aa957600080fd5b5035919050565b600080600060608486031215613ac557600080fd5b8335613ad08161399b565b92506020840135613ae08161399b565b929592945050506040919091013590565b600060208284031215613b0357600080fd5b81356139fc81613a03565b60008060408385031215613b2157600080fd5b8235613b2c8161399b565b91506020830135613b3c81613a03565b809150509250929050565b600080600060608486031215613b5c57600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613b8657600080fd5b8235613b918161399b565b91506020830135613b3c8161399b565b600181811c90821680613bb557607f821691505b602082108103613bd557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613c4e57613c4e613c26565b5060010190565b80820180821115610d2957610d29613c26565b600181815b80851115613ca3578160001904821115613c8957613c89613c26565b80851615613c9657918102915b93841c9390800290613c6d565b509250929050565b600082613cba57506001610d29565b81613cc757506000610d29565b8160018114613cdd5760028114613ce757613d03565b6001915050610d29565b60ff841115613cf857613cf8613c26565b50506001821b610d29565b5060208310610133831016604e8410600b8410161715613d26575081810a610d29565b613d308383613c68565b8060001904821115613d4457613d44613c26565b029392505050565b60006139fc60ff841683613cab565b6000816000190483118215151615613d7557613d75613c26565b500290565b600082613d9757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526029908201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206040820152687468616e20302e322560b81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b600060208284031215613e0d57600080fd5b81516139fc8161399b565b600081518084526020808501945080840160005b83811015613e515781516001600160a01b031687529582019590820190600101613e2c565b509495945050505050565b828152604060208201526000613e756040830184613e18565b949350505050565b60006020808385031215613e9057600080fd5b825167ffffffffffffffff80821115613ea857600080fd5b818501915085601f830112613ebc57600080fd5b815181811115613ece57613ece613de5565b8060051b604051601f19603f83011681018181108582111715613ef357613ef3613de5565b604052918252848201925083810185019188831115613f1157600080fd5b938501935b82851015613f2f57845184529385019392850192613f16565b98975050505050505050565b600060208284031215613f4d57600080fd5b5051919050565b600060208284031215613f6657600080fd5b81516139fc81613a03565b6020808252602b908201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60408201526a3a103932b630bab731b41760a91b606082015260800190565b60208082526023908201527f4d757374206861766520455448206f6e20636f6e747261637420746f206c61756040820152620dcc6d60eb1b606082015260800190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008060006060848603121561404f57600080fd5b8351925060208401519150604084015190509250925092565b6000806040838503121561407b57600080fd5b505080516020909101519092909150565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610d2957610d29613c26565b85815284602082015260a06040820152600061414660a0830186613e18565b6001600160a01b039490941660608301525060800152939250505056fea2646970667358221220911f871548f6d310f0c1cc3ef0ab166d7b4110c7023ea8141420c20429ad667764736f6c634300081000334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x60806040526004361061041f5760003560e01c806395d89b411161021e578063cf46f24c11610123578063e884f260116100ab578063f2fde38b1161007a578063f2fde38b14610c06578063f5648a4f14610c26578063f637434214610c3b578063f771cb6514610c51578063f8b45b0514610c7057600080fd5b8063e884f26014610ba5578063ee40166e14610bba578063efda116514610bd0578063f11a24d314610bf057600080fd5b8063d85ba063116100f2578063d85ba06314610afd578063dd62ed3e14610b13578063e2f4560514610b59578063e71dc3f514610b6f578063e800dff714610b8557600080fd5b8063cf46f24c14610a84578063d0d52b5d14610a9a578063d257b34f14610ac7578063d7afe8bc14610ae757600080fd5b8063adb873bd116101a6578063bbc0c74211610175578063bbc0c742146109eb578063c024666814610a0a578063c17b5b8c14610a2a578063c18bc19514610a4a578063c876d0b914610a6a57600080fd5b8063adb873bd14610965578063b16d78cf1461097b578063b62496f51461099b578063b9875539146109cb57600080fd5b8063a28e86d3116101ed578063a28e86d3146108e0578063a457c2d7146108f5578063a62068ce14610915578063a9059cbb1461092b578063aacd0d5a1461094b57600080fd5b806395d89b41146108755780639a7a23d61461088a5780639e034c77146108aa5780639e93ad8e146108ca57600080fd5b806356dda58711610324578063751039fc116102ac57806382aa7c681161027b57806382aa7c68146107c75780638366e79a146107e757806385b12c7c1461080757806385ecfd28146108275780638da5cb5b1461085757600080fd5b8063751039fc1461075c5780637571336a1461077157806375bd5e96146107915780638095d564146107a757600080fd5b80636a486a8e116102f35780636a486a8e146106db5780636b0a894c146106f15780636ddd17131461070757806370a0823114610727578063715018a61461074757600080fd5b806356dda5871461067957806358a6d5311461068e5780635a139dd4146106a557806365fa2ee5146106bb57600080fd5b80632a7e65a2116103a75780633c854e14116103765780633c854e14146105f4578063452ed4f114610609578063499b8394146106295780634a62bb65146106495780634f77f6c01461066357600080fd5b80632a7e65a2146105835780632f0df2af146105a3578063313ce567146105b857806339509351146105d457600080fd5b8063130a2c3c116103ee578063130a2c3c146104ed57806318160ddd1461050f5780631a97edea1461052e578063203e727e1461054357806323b872dd1461056357600080fd5b806306fdde031461042b5780630758d92414610456578063095ea7b31461048e57806310d5de53146104be57600080fd5b3661042657005b600080fd5b34801561043757600080fd5b50610440610c86565b60405161044d919061394d565b60405180910390f35b34801561046257600080fd5b50600854610476906001600160a01b031681565b6040516001600160a01b03909116815260200161044d565b34801561049a57600080fd5b506104ae6104a93660046139b3565b610d18565b604051901515815260200161044d565b3480156104ca57600080fd5b506104ae6104d93660046139df565b602080526000908152604090205460ff1681565b3480156104f957600080fd5b5061050d610508366004613a11565b610d2f565b005b34801561051b57600080fd5b506002545b60405190815260200161044d565b34801561053a57600080fd5b5061050d610dd9565b34801561054f57600080fd5b5061050d61055e366004613a97565b610e71565b34801561056f57600080fd5b506104ae61057e366004613ab0565b610f43565b34801561058f57600080fd5b5061050d61059e366004613af1565b610fed565b3480156105af57600080fd5b5061052061102a565b3480156105c457600080fd5b506040516012815260200161044d565b3480156105e057600080fd5b506104ae6105ef3660046139b3565b611234565b34801561060057600080fd5b5061050d611270565b34801561061557600080fd5b50600954610476906001600160a01b031681565b34801561063557600080fd5b5061050d6106443660046139df565b611308565b34801561065557600080fd5b506010546104ae9060ff1681565b34801561066f57600080fd5b5061052060185481565b34801561068557600080fd5b5061050d6113b9565b34801561069a57600080fd5b50600d5443106104ae565b3480156106b157600080fd5b5061052060145481565b3480156106c757600080fd5b5061050d6106d6366004613a97565b611453565b3480156106e757600080fd5b5061052060175481565b3480156106fd57600080fd5b50610520600f5481565b34801561071357600080fd5b506010546104ae9062010000900460ff1681565b34801561073357600080fd5b506105206107423660046139df565b611520565b34801561075357600080fd5b5061050d61153b565b34801561076857600080fd5b5061050d6115af565b34801561077d57600080fd5b5061050d61078c366004613b0e565b61161a565b34801561079d57600080fd5b50610520601d5481565b3480156107b357600080fd5b5061050d6107c2366004613b47565b6116e1565b3480156107d357600080fd5b5061050d6107e2366004613a97565b61178a565b3480156107f357600080fd5b506104ae610802366004613b73565b61185d565b34801561081357600080fd5b5061050d610822366004613a97565b611a66565b34801561083357600080fd5b506104ae6108423660046139df565b600e6020526000908152604090205460ff1681565b34801561086357600080fd5b506005546001600160a01b0316610476565b34801561088157600080fd5b50610440611c8d565b34801561089657600080fd5b5061050d6108a5366004613b0e565b611c9c565b3480156108b657600080fd5b5061050d6108c5366004613a97565b611d90565b3480156108d657600080fd5b5061052061271081565b3480156108ec57600080fd5b5061050d611de6565b34801561090157600080fd5b506104ae6109103660046139b3565b611e1f565b34801561092157600080fd5b50610520600d5481565b34801561093757600080fd5b506104ae6109463660046139b3565b611eb8565b34801561095757600080fd5b50601e546104ae9060ff1681565b34801561097157600080fd5b50610520601a5481565b34801561098757600080fd5b5061050d610996366004613af1565b611ec5565b3480156109a757600080fd5b506104ae6109b63660046139df565b60216020526000908152604090205460ff1681565b3480156109d757600080fd5b5061050d6109e6366004613af1565b611fcf565b3480156109f757600080fd5b506010546104ae90610100900460ff1681565b348015610a1657600080fd5b5061050d610a25366004613b0e565b61208e565b348015610a3657600080fd5b5061050d610a45366004613b47565b612117565b348015610a5657600080fd5b5061050d610a65366004613a97565b6121bb565b348015610a7657600080fd5b506012546104ae9060ff1681565b348015610a9057600080fd5b5061052060065481565b348015610aa657600080fd5b50610520610ab53660046139df565b601b6020526000908152604090205481565b348015610ad357600080fd5b5061050d610ae2366004613a97565b612285565b348015610af357600080fd5b50610520601c5481565b348015610b0957600080fd5b5061052060135481565b348015610b1f57600080fd5b50610520610b2e366004613b73565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b6557600080fd5b50610520600a5481565b348015610b7b57600080fd5b5061052060165481565b348015610b9157600080fd5b5061050d610ba0366004613b0e565b6123d0565b348015610bb157600080fd5b5061050d612425565b348015610bc657600080fd5b50610520600c5481565b348015610bdc57600080fd5b5061050d610beb366004613a97565b61245b565b348015610bfc57600080fd5b5061052060155481565b348015610c1257600080fd5b5061050d610c213660046139df565b61265c565b348015610c3257600080fd5b5061050d612747565b348015610c4757600080fd5b5061052060195481565b348015610c5d57600080fd5b50601e546104ae90610100900460ff1681565b348015610c7c57600080fd5b5061052060075481565b606060038054610c9590613ba1565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc190613ba1565b8015610d0e5780601f10610ce357610100808354040283529160200191610d0e565b820191906000526020600020905b815481529060010190602001808311610cf157829003601f168201915b5050505050905090565b6000610d253384846127b3565b5060015b92915050565b6005546001600160a01b03163314610d625760405162461bcd60e51b8152600401610d5990613bdb565b60405180910390fd5b60005b82811015610dd35781600e6000868685818110610d8457610d84613c10565b9050602002016020810190610d9991906139df565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610dcb81613c3c565b915050610d65565b50505050565b6005546001600160a01b03163314610e035760405162461bcd60e51b8152600401610d5990613bdb565b61012c601481905560006015819055601681905590610e23908290613c55565b610e2d9190613c55565b60135561012c601881905560006019819055601a81905590610e50908290613c55565b610e5a9190613c55565b601755670de0b6b3a7640000601d55611c20601c55565b6005546001600160a01b03163314610e9b5760405162461bcd60e51b8152600401610d5990613bdb565b610ea76012600a613d4c565b6103e8610eb360025490565b610ebe906002613d5b565b610ec89190613d7a565b610ed29190613d7a565b811015610ef15760405162461bcd60e51b8152600401610d5990613d9c565b610efd6012600a613d4c565b610f079082613d5b565b60068190556040519081527f89c099a4e6d77f9ed9839689924c080dcc270b4bc837e2d8979544f19df27d78906020015b60405180910390a150565b6000610f508484846128d8565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610fd55760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610d59565b610fe285338584036127b3565b506001949350505050565b6005546001600160a01b031633146110175760405162461bcd60e51b8152600401610d5990613bdb565b601e805460ff1916911515919091179055565b604080516002808252606082018352600092839291906020830190803683375050600854604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bc9190613dfb565b816000815181106110cf576110cf613c10565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061110357611103613c10565b6001600160a01b0392909216602092830291909101820152604080516002808252606082018352600093919290918301908036833701905050600854601d5460405163d06ca61f60e01b81529293506001600160a01b039091169163d06ca61f91611172918690600401613e5c565b600060405180830381865afa15801561118f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111b79190810190613e7d565b9050612710601a546019546018546111cf9190613c55565b6111d99190613c55565b826001815181106111ec576111ec613c10565b60200260200101516111fe9190613d5b565b6112089190613d7a565b8160018151811061121b5761121b613c10565b602002602001015161122d9190613c55565b9250505090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d2591859061126b908690613c55565b6127b3565b6005546001600160a01b0316331461129a5760405162461bcd60e51b8152600401610d5990613bdb565b61012c6014819055600060158190556016819055906112ba908290613c55565b6112c49190613c55565b60135561012c601881905560006019819055601a819055906112e7908290613c55565b6112f19190613c55565b601755670a688906bd8b0000601d55611c20601c55565b6005546001600160a01b031633146113325760405162461bcd60e51b8152600401610d5990613bdb565b6001600160a01b0381166113975760405162461bcd60e51b815260206004820152602660248201527f5f6f7065726174696f6e734164647265737320616464726573732063616e6e6f60448201526507420626520360d41b6064820152608401610d59565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146113e35760405162461bcd60e51b8152600401610d5990613bdb565b6101f460148190556064601581905560006016819055916114049190613c55565b61140e9190613c55565b6013556101f46018819055606460198190556000601a819055916114329190613c55565b61143c9190613c55565b6017556706f05b59d3b20000601d55611c20601c55565b6005546001600160a01b0316331461147d5760405162461bcd60e51b8152600401610d5990613bdb565b6019811015801561149057506109c48111155b6114dc5760405162461bcd60e51b815260206004820181905260248201527f4d75737420736574206265747765656e20302e323520616e64203235204554486044820152606401610d59565b6114ed81662386f26fc10000613d5b565b601d556040518181527fce91d2f8a31cab688c8ec911efdf0e526d13a800d38aeff93e22b5e3dc693fd190602001610f38565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146115655760405162461bcd60e51b8152600401610d5990613bdb565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146115d95760405162461bcd60e51b8152600401610d5990613bdb565b6010805460ff199081169091556012805490911690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146116445760405162461bcd60e51b8152600401610d5990613bdb565b806116b7576009546001600160a01b03908116908316036116b75760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610d59565b6001600160a01b039190911660009081526020805260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461170b5760405162461bcd60e51b8152600401610d5990613bdb565b601483905560158290556016819055806117258385613c55565b61172f9190613c55565b601381905561032010156117855760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203825206f72206c657373000000006044820152606401610d59565b505050565b6005546001600160a01b031633146117b45760405162461bcd60e51b8152600401610d5990613bdb565b601054610100900460ff161561180c5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610d59565b6010805462ffff0019166201010017905543600c81905561182e908290613c55565b600d556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a150565b6005546000906001600160a01b0316331461188a5760405162461bcd60e51b8152600401610d5990613bdb565b6001600160a01b0383166118e05760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610d59565b306001600160a01b038416036119385760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610d59565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa15801561197f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a39190613f3b565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af11580156119f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1a9190613f54565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b03163314611a905760405162461bcd60e51b8152600401610d5990613bdb565b601054610100900460ff1615611ab85760405162461bcd60e51b8152600401610d5990613f71565b600a8110611b185760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f74206d616b652070656e616c747920626c6f636b73206d6f72652060448201526607468616e2031360cc1b6064820152608401610d59565b6010805462ffff0019166201010017905543600c819055611b3a908290613c55565b600d556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a160004711611b865760405162461bcd60e51b8152600401610d5990613fbc565b6000611b9130611520565b11611bed5760405162461bcd60e51b815260206004820152602660248201527f4d757374206861766520546f6b656e73206f6e20636f6e747261637420746f206044820152650d8c2eadcc6d60d31b6064820152608401610d59565b600854611c089030906001600160a01b031661126b82611520565b6008546001600160a01b031663f305d7194730611c2481611520565b60008030426040518863ffffffff1660e01b8152600401611c4a96959493929190613fff565b60606040518083038185885af1158015611c68573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610dd3919061403a565b606060048054610c9590613ba1565b6005546001600160a01b03163314611cc65760405162461bcd60e51b8152600401610d5990613bdb565b6009546001600160a01b0390811690831603611d4a5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610d59565b611d5482826134e1565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314611dba5760405162461bcd60e51b8152600401610d5990613bdb565b600081118015611dcc57506105a08111155b611dd557600080fd5b611de081603c613d5b565b601c5550565b6005546001600160a01b03163314611e105760405162461bcd60e51b8152600401610d5990613bdb565b6010805460ff19166001179055565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611ea15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d59565b611eae33858584036127b3565b5060019392505050565b6000610d253384846128d8565b6005546001600160a01b03163314611eef5760405162461bcd60e51b8152600401610d5990613bdb565b80611f3c5760405162461bcd60e51b815260206004820152601860248201527f436f6e6669726d2073656c6c696e6720656e61626c65642100000000000000006044820152606401610d59565b601e54610100900460ff1615611f945760405162461bcd60e51b815260206004820152601860248201527f53656c6c696e6720616c726561647920656e61626c65642100000000000000006044820152606401610d59565b601e805461ff0019166101001790556040517f7fdc9c6ba047bed382d2ae7be131e601f2fead137f249278e33c13a6928b080890600090a150565b6005546001600160a01b03163314611ff95760405162461bcd60e51b8152600401610d5990613bdb565b806120465760405162461bcd60e51b815260206004820152601f60248201527f506c6561736520636f6e6669726d20616464696e67206f6620746865204c50006044820152606401610d59565b601054610100900460ff161561206e5760405162461bcd60e51b8152600401610d5990613f71565b60004711611b865760405162461bcd60e51b8152600401610d5990613fbc565b6005546001600160a01b031633146120b85760405162461bcd60e51b8152600401610d5990613bdb565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146121415760405162461bcd60e51b8152600401610d5990613bdb565b60188390556019829055601a8190558061215b8385613c55565b6121659190613c55565b601781905561032010156117855760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203825206f72206c657373000000006044820152606401610d59565b6005546001600160a01b031633146121e55760405162461bcd60e51b8152600401610d5990613bdb565b6121f16012600a613d4c565b60646121fc60025490565b612207906001613d5b565b6122119190613d7a565b61221b9190613d7a565b81101561223a5760405162461bcd60e51b8152600401610d5990613d9c565b6122466012600a613d4c565b6122509082613d5b565b60078190556040519081527f3046ad62de8b70d396246aaed19ff2559ff20df8706520cbde58320766c4276290602001610f38565b6005546001600160a01b031633146122af5760405162461bcd60e51b8152600401610d5990613bdb565b620186a06122bc60025490565b6122c7906001613d5b565b6122d19190613d7a565b81101561233e5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610d59565b6103e861234a60025490565b612355906001613d5b565b61235f9190613d7a565b8111156123cb5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610d59565b600a55565b6005546001600160a01b031633146123fa5760405162461bcd60e51b8152600401610d5990613bdb565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461244f5760405162461bcd60e51b8152600401610d5990613bdb565b6012805460ff19169055565b6005546001600160a01b031633146124855760405162461bcd60e51b8152600401610d5990613bdb565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156124ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f29190613f3b565b9050600081116125445760405162461bcd60e51b815260206004820152601860248201527f4e6f204c5020746f6b656e7320696e20636f6e747261637400000000000000006044820152606401610d59565b60006127106125538484613d5b565b61255d9190613d7a565b60095460085460405163095ea7b360e01b81526001600160a01b03918216600482015260248101849052929350169063095ea7b3906044016020604051808303816000875af11580156125b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d89190613f54565b50600854604051629d473b60e21b81526001600160a01b03909116906302751cec906126139030908590600190819033904290600401613fff565b60408051808303816000875af1158015612631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126559190614068565b5050505050565b6005546001600160a01b031633146126865760405162461bcd60e51b8152600401610d5990613bdb565b6001600160a01b0381166126eb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d59565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146127715760405162461bcd60e51b8152600401610d5990613bdb565b604051600090339047908381818185875af1925050503d8060008114610dd3576040519150601f19603f3d011682016040523d82523d6000602084013e610dd3565b6001600160a01b0383166128155760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d59565b6001600160a01b0382166128765760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d59565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166128fe5760405162461bcd60e51b8152600401610d599061408c565b6001600160a01b0382166129245760405162461bcd60e51b8152600401610d59906140d1565b600081116129745760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610d59565b601054610100900460ff16612a07576001600160a01b0383166000908152601f602052604090205460ff16806129c257506001600160a01b0382166000908152601f602052604090205460ff165b612a075760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d59565b600d5415612ada576001600160a01b0383166000908152600e602052604090205460ff161580612a4457506005546001600160a01b038381169116145b80612a5957506001600160a01b03821661dead145b612ada5760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610d59565b60105460ff16156130d3576005546001600160a01b03848116911614801590612b1157506005546001600160a01b03838116911614155b8015612b2557506001600160a01b03821615155b8015612b3c57506001600160a01b03821661dead14155b8015612b6157506001600160a01b0383166000908152601f602052604090205460ff16155b8015612b8657506001600160a01b0382166000908152601f602052604090205460ff16155b156130d35760125460ff1615612c9f576008546001600160a01b03838116911614801590612bc257506009546001600160a01b03838116911614155b15612c9f57612bd2600243614114565b32600090815260116020526040902054108015612c105750612bf5600243614114565b6001600160a01b038316600090815260116020526040902054105b612c7a5760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610d59565b3260009081526011602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526021602052604090205460ff168015612cdf57506001600160a01b038216600090815260208052604090205460ff16155b15612da757600654811115612d475760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc103a3c371760c11b6064820152608401610d59565b60075481612d5484611520565b612d5e9190613c55565b1115612da25760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d59565b6130d3565b6001600160a01b03821660009081526021602052604090205460ff168015612de757506001600160a01b038316600090815260208052604090205460ff16155b15612f9e57601e54610100900460ff16612e365760405162461bcd60e51b815260206004820152601060248201526f14d95b1b1a5b99c8191a5cd8589b195960821b6044820152606401610d59565b600654811115612e9a5760405162461bcd60e51b815260206004820152602960248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152681036b0bc103a3c371760b91b6064820152608401610d59565b601e5460ff1615612da2576001600160a01b0383166000908152601b6020526040902054421015612eff5760405162461bcd60e51b815260206004820152600f60248201526e10d85b9b9bdd081cd95b1b081e595d608a1b6044820152606401610d59565b612f0761102a565b811115612f735760405162461bcd60e51b815260206004820152603460248201527f417474656d7074696e6720746f2073656c6c206f766572206d61782073656c6c6044820152731030b6b7bab73a17101021b432b1b59036b0bc1760611b6064820152608401610d59565b601c54612f809042613c55565b6001600160a01b0384166000908152601b60205260409020556130d3565b6001600160a01b038216600090815260208052604090205460ff16158015612fdf57506001600160a01b0382166000908152601f602052604090205460ff16155b156130d357601e5460ff16156130785760405162461bcd60e51b815260206004820152605260248201527f496e766573746f72732063616e6e6f74207472616e7366657220616e64206d7560448201527f73742073656c6c206f6e6c79206f72207472616e7366657220746f206120776860648201527134ba32b634b9ba32b21030b2323932b9b99760711b608482015260a401610d59565b6007548161308584611520565b61308f9190613c55565b11156130d35760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d59565b60006130de30611520565b600a54909150811080159081906130fd575060105462010000900460ff165b80156131135750600954600160a01b900460ff16155b801561313857506001600160a01b03851660009081526021602052604090205460ff16155b801561315d57506001600160a01b0385166000908152601f602052604090205460ff16155b801561318257506001600160a01b0384166000908152601f602052604090205460ff16155b156131d7576009805460ff60a01b1916600160a01b179055600a546131a8906014613d5b565b8211156131c057600a546131bd906014613d5b565b91505b6131c98261350f565b6009805460ff60a01b191690555b6001600160a01b0385166000908152601f602052604090205460019060ff168061321957506001600160a01b0385166000908152601f602052604090205460ff165b15613222575060005b60008060008084156134ca57600d544310801561325757506001600160a01b038a1660009081526021602052604090205460ff165b801561327c57506001600160a01b03891660009081526021602052604090205460ff16155b801561328a57506000601354115b15613384576001600160a01b0389166000908152600e602052604090205460ff1661332a576001600160a01b0389166000908152600e60205260408120805460ff19166001908117909155600f8054919290916132e8908490613c55565b90915550506040516001600160a01b038a1681527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b50886064613339896063613d5b565b6133439190613d7a565b9350601354601554856133569190613d5b565b6133609190613d7a565b9150601354601654856133739190613d5b565b61337d9190613d7a565b925061348b565b6001600160a01b03891660009081526021602052604090205460ff1680156133ae57506000601754115b1561340157889050612710601754896133c79190613d5b565b6133d19190613d7a565b9350601754601954856133e49190613d5b565b6133ee9190613d7a565b9150601754601a54856133739190613d5b565b6001600160a01b038a1660009081526021602052604090205460ff16801561342b57506000601354115b1561348b57899050612710601354896134449190613d5b565b61344e9190613d7a565b9350601354601554856134619190613d5b565b61346b9190613d7a565b91506013546016548561347e9190613d5b565b6134889190613d7a565b92505b83156134bd5761349c8a308661366d565b82156134ac576134ac30846137c2565b81156134bd576134bd30828461366d565b6134c78489614114565b97505b6134d58a8a8a61366d565b50505050505050505050565b6001600160a01b0382166000908152602160205260409020805460ff1916821515179055611d5482826138ec565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061354457613544613c10565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561359d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135c19190613dfb565b816001815181106135d4576135d4613c10565b6001600160a01b0392831660209182029290920101526008546135fa91309116846127b3565b600854600b5460405163791ac94760e01b81526001600160a01b039283169263791ac9479261363792879260009288929116904290600401614127565b600060405180830381600087803b15801561365157600080fd5b505af1158015613665573d6000803e3d6000fd5b505050505050565b6001600160a01b0383166136935760405162461bcd60e51b8152600401610d599061408c565b6001600160a01b0382166136b95760405162461bcd60e51b8152600401610d59906140d1565b6001600160a01b038316600090815260208190526040902054818110156137315760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d59565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290613768908490613c55565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516137b491815260200190565b60405180910390a350505050565b6001600160a01b0382166138225760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d59565b6001600160a01b038216600090815260208190526040902054818110156138965760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d59565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016128cb565b6001600160a01b03821660008181526020808052604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b600060208083528351808285015260005b8181101561397a5785810183015185820160400152820161395e565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146139b057600080fd5b50565b600080604083850312156139c657600080fd5b82356139d18161399b565b946020939093013593505050565b6000602082840312156139f157600080fd5b81356139fc8161399b565b9392505050565b80151581146139b057600080fd5b600080600060408486031215613a2657600080fd5b833567ffffffffffffffff80821115613a3e57600080fd5b818601915086601f830112613a5257600080fd5b813581811115613a6157600080fd5b8760208260051b8501011115613a7657600080fd5b60209283019550935050840135613a8c81613a03565b809150509250925092565b600060208284031215613aa957600080fd5b5035919050565b600080600060608486031215613ac557600080fd5b8335613ad08161399b565b92506020840135613ae08161399b565b929592945050506040919091013590565b600060208284031215613b0357600080fd5b81356139fc81613a03565b60008060408385031215613b2157600080fd5b8235613b2c8161399b565b91506020830135613b3c81613a03565b809150509250929050565b600080600060608486031215613b5c57600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613b8657600080fd5b8235613b918161399b565b91506020830135613b3c8161399b565b600181811c90821680613bb557607f821691505b602082108103613bd557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613c4e57613c4e613c26565b5060010190565b80820180821115610d2957610d29613c26565b600181815b80851115613ca3578160001904821115613c8957613c89613c26565b80851615613c9657918102915b93841c9390800290613c6d565b509250929050565b600082613cba57506001610d29565b81613cc757506000610d29565b8160018114613cdd5760028114613ce757613d03565b6001915050610d29565b60ff841115613cf857613cf8613c26565b50506001821b610d29565b5060208310610133831016604e8410600b8410161715613d26575081810a610d29565b613d308383613c68565b8060001904821115613d4457613d44613c26565b029392505050565b60006139fc60ff841683613cab565b6000816000190483118215151615613d7557613d75613c26565b500290565b600082613d9757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526029908201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206040820152687468616e20302e322560b81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b600060208284031215613e0d57600080fd5b81516139fc8161399b565b600081518084526020808501945080840160005b83811015613e515781516001600160a01b031687529582019590820190600101613e2c565b509495945050505050565b828152604060208201526000613e756040830184613e18565b949350505050565b60006020808385031215613e9057600080fd5b825167ffffffffffffffff80821115613ea857600080fd5b818501915085601f830112613ebc57600080fd5b815181811115613ece57613ece613de5565b8060051b604051601f19603f83011681018181108582111715613ef357613ef3613de5565b604052918252848201925083810185019188831115613f1157600080fd5b938501935b82851015613f2f57845184529385019392850192613f16565b98975050505050505050565b600060208284031215613f4d57600080fd5b5051919050565b600060208284031215613f6657600080fd5b81516139fc81613a03565b6020808252602b908201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60408201526a3a103932b630bab731b41760a91b606082015260800190565b60208082526023908201527f4d757374206861766520455448206f6e20636f6e747261637420746f206c61756040820152620dcc6d60eb1b606082015260800190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008060006060848603121561404f57600080fd5b8351925060208401519150604084015190509250925092565b6000806040838503121561407b57600080fd5b505080516020909101519092909150565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610d2957610d29613c26565b85815284602082015260a06040820152600061414660a0830186613e18565b6001600160a01b039490941660608301525060800152939250505056fea2646970667358221220911f871548f6d310f0c1cc3ef0ab166d7b4110c7023ea8141420c20429ad667764736f6c63430008100033

Deployed Bytecode Sourcemap

11140:23928:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4106:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11253:27;;;;;;;;;;-1:-1:-1;11253:27:0;;;;-1:-1:-1;;;;;11253:27:0;;;;;;-1:-1:-1;;;;;749:32:1;;;731:51;;719:2;704:18;11253:27:0;567:221:1;5161:210:0;;;;;;;;;;-1:-1:-1;5161:210:0;;;;;:::i;:::-;;:::i;:::-;;;1414:14:1;;1407:22;1389:41;;1377:2;1362:18;5161:210:0;1249:187:1;12758:63:0;;;;;;;;;;-1:-1:-1;12758:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;16722:232;;;;;;;;;;-1:-1:-1;16722:232:0;;;;;:::i;:::-;;:::i;:::-;;4427:108;;;;;;;;;;-1:-1:-1;4515:12:0;;4427:108;;;2717:25:1;;;2705:2;2690:18;4427:108:0;2571:177:1;31892:454:0;;;;;;;;;;;;;:::i;17121:330::-;;;;;;;;;;-1:-1:-1;17121:330:0;;;;;:::i;:::-;;:::i;5379:529::-;;;;;;;;;;-1:-1:-1;5379:529:0;;;;;:::i;:::-;;:::i;29834:125::-;;;;;;;;;;-1:-1:-1;29834:125:0;;;;;:::i;:::-;;:::i;29345:481::-;;;;;;;;;;;;;:::i;4326:93::-;;;;;;;;;;-1:-1:-1;4326:93:0;;4409:2;3787:36:1;;3775:2;3760:18;4326:93:0;3645:184:1;5916:297:0;;;;;;;;;;-1:-1:-1;5916:297:0;;;;;:::i;:::-;;:::i;31428:456::-;;;;;;;;;;;;;:::i;11287:21::-;;;;;;;;;;-1:-1:-1;11287:21:0;;;;-1:-1:-1;;;;;11287:21:0;;;30656:297;;;;;;;;;;-1:-1:-1;30656:297:0;;;;;:::i;:::-;;:::i;11622:33::-;;;;;;;;;;-1:-1:-1;11622:33:0;;;;;;;;12146:32;;;;;;;;;;;;;;;;30961:459;;;;;;;;;;;;;:::i;27832:121::-;;;;;;;;;;-1:-1:-1;27927:18:0;;27912:12;:33;27832:121;;12002:31;;;;;;;;;;;;;;;;29055:282;;;;;;;;;;-1:-1:-1;29055:282:0;;;;;:::i;:::-;;:::i;12111:28::-;;;;;;;;;;;;;;;;11588:25;;;;;;;;;;;;;;;;11702:31;;;;;;;;;;-1:-1:-1;11702:31:0;;;;;;;;;;;4543:177;;;;;;;;;;-1:-1:-1;4543:177:0;;;;;:::i;:::-;;:::i;9195:150::-;;;;;;;;;;;;;:::i;16342:154::-;;;;;;;;;;;;;:::i;18517:334::-;;;;;;;;;;-1:-1:-1;18517:334:0;;;;;:::i;:::-;;:::i;12461:42::-;;;;;;;;;;;;;;;;19470:411;;;;;;;;;;-1:-1:-1;19470:411:0;;;;;:::i;:::-;;:::i;15960:330::-;;;;;;;;;;-1:-1:-1;15960:330:0;;;;;:::i;:::-;;:::i;29967:488::-;;;;;;;;;;-1:-1:-1;29967:488:0;;;;;:::i;:::-;;:::i;33896:1169::-;;;;;;;;;;-1:-1:-1;33896:1169:0;;;;;:::i;:::-;;:::i;11538:43::-;;;;;;;;;;-1:-1:-1;11538:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;8981:79;;;;;;;;;;-1:-1:-1;9046:6:0;;-1:-1:-1;;;;;9046:6:0;8981:79;;4214:104;;;;;;;;;;;;;:::i;18859:355::-;;;;;;;;;;-1:-1:-1;18859:355:0;;;;;:::i;:::-;;:::i;28560:199::-;;;;;;;;;;-1:-1:-1;28560:199:0;;;;;:::i;:::-;;:::i;12258:43::-;;;;;;;;;;;;12296:5;12258:43;;16504:84;;;;;;;;;;;;;:::i;6221:482::-;;;;;;;;;;-1:-1:-1;6221:482:0;;;;;:::i;:::-;;:::i;11498:33::-;;;;;;;;;;;;;;;;4728:216;;;;;;;;;;-1:-1:-1;4728:216:0;;;;;:::i;:::-;;:::i;12510:40::-;;;;;;;;;;-1:-1:-1;12510:40:0;;;;;;;;12223:26;;;;;;;;;;;;;;;;28767:280;;;;;;;;;;-1:-1:-1;28767:280:0;;;;;:::i;:::-;;:::i;12979:57::-;;;;;;;;;;-1:-1:-1;12979:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;32354:861;;;;;;;;;;-1:-1:-1;32354:861:0;;;;;:::i;:::-;;:::i;11662:33::-;;;;;;;;;;-1:-1:-1;11662:33:0;;;;;;;;;;;20317:182;;;;;;;;;;-1:-1:-1;20317:182:0;;;;;:::i;:::-;;:::i;19889:420::-;;;;;;;;;;-1:-1:-1;19889:420:0;;;;;:::i;:::-;;:::i;17459:323::-;;;;;;;;;;-1:-1:-1;17459:323:0;;;;;:::i;:::-;;:::i;11920:39::-;;;;;;;;;;-1:-1:-1;11920:39:0;;;;;;;;11186:27;;;;;;;;;;;;;;;;12348:55;;;;;;;;;;-1:-1:-1;12348:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;17852:428;;;;;;;;;;-1:-1:-1;17852:428:0;;;;;:::i;:::-;;:::i;12410:44::-;;;;;;;;;;;;;;;;11968:27;;;;;;;;;;;;;;;;4952:201;;;;;;;;;;-1:-1:-1;4952:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;5118:18:0;;;5086:7;5118:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4952:201;11345:33;;;;;;;;;;;;;;;;12077:25;;;;;;;;;;;;;;;;16596:118;;;;;;;;;;-1:-1:-1;16596:118:0;;;;;:::i;:::-;;:::i;17015:98::-;;;;;;;;;;;;;:::i;11421:37::-;;;;;;;;;;;;;;;;33223:665;;;;;;;;;;-1:-1:-1;33223:665:0;;;;;:::i;:::-;;:::i;12040:30::-;;;;;;;;;;;;;;;;9353:281;;;;;;;;;;-1:-1:-1;9353:281:0;;;;;:::i;:::-;;:::i;30463:185::-;;;;;;;;;;;;;:::i;12185:31::-;;;;;;;;;;;;;;;;12557:34;;;;;;;;;;-1:-1:-1;12557:34:0;;;;;;;;;;;11220:24;;;;;;;;;;;;;;;;4106:100;4160:13;4193:5;4186:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4106:100;:::o;5161:210::-;5280:4;5302:39;256:10;5325:7;5334:6;5302:8;:39::i;:::-;-1:-1:-1;5359:4:0;5161:210;;;;;:::o;16722:232::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;;;;;;;;;16850:9:::1;16845:102;16865:18:::0;;::::1;16845:102;;;16931:4;16905:11;:23;16917:7;;16925:1;16917:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16905:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;16905:23:0;:30;;-1:-1:-1;;16905:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;16885:3;::::1;::::0;::::1;:::i;:::-;;;;16845:102;;;;16722:232:::0;;;:::o;31892:454::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;31962:3:::1;31943:16;:22:::0;;;31994:1:::1;31976:15;:19:::0;;;32006:10:::1;:14:::0;;;31994:1;32046:34:::1;::::0;31994:1;;32046:34:::1;:::i;:::-;:47;;;;:::i;:::-;32031:12;:62:::0;32126:3:::1;32106:17;:23:::0;;;-1:-1:-1;32140:16:0::1;:20:::0;;;32171:11:::1;:15:::0;;;-1:-1:-1;32213:36:0::1;::::0;-1:-1:-1;;32213:36:0::1;:::i;:::-;:50;;;;:::i;:::-;32197:13;:66:::0;32294:7:::1;32276:15;:25:::0;32331:7:::1;32312:16;:26:::0;31892:454::o;17121:330::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;17259:14:::1;4409:2:::0;17259::::1;:14;:::i;:::-;17250:4;17229:13;4515:12:::0;;;4427:108;17229:13:::1;:17;::::0;17245:1:::1;17229:17;:::i;:::-;17228:26;;;;:::i;:::-;17227:47;;;;:::i;:::-;17217:6;:57;;17195:148;;;;-1:-1:-1::0;;;17195:148:0::1;;;;;;;:::i;:::-;17379:14;4409:2:::0;17379::::1;:14;:::i;:::-;17369:25;::::0;:6;:25:::1;:::i;:::-;17354:12;:40:::0;;;17410:33:::1;::::0;2717:25:1;;;17410:33:0::1;::::0;2705:2:1;2690:18;17410:33:0::1;;;;;;;;17121:330:::0;:::o;5379:529::-;5519:4;5536:36;5546:6;5554:9;5565:6;5536:9;:36::i;:::-;-1:-1:-1;;;;;5612:19:0;;5585:24;5612:19;;;:11;:19;;;;;;;;256:10;5612:33;;;;;;;;5678:26;;;;5656:116;;;;-1:-1:-1;;;5656:116:0;;8813:2:1;5656:116:0;;;8795:21:1;8852:2;8832:18;;;8825:30;8891:34;8871:18;;;8864:62;-1:-1:-1;;;8942:18:1;;;8935:38;8990:19;;5656:116:0;8611:404:1;5656:116:0;5808:57;5817:6;256:10;5858:6;5839:16;:25;5808:8;:57::i;:::-;-1:-1:-1;5896:4:0;;5379:529;-1:-1:-1;;;;5379:529:0:o;29834:125::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;29919:21:::1;:32:::0;;-1:-1:-1;;29919:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29834:125::o;29345:481::-;29440:16;;;29454:1;29440:16;;;;;;;;29396:7;;;;29440:16;29454:1;29440:16;;;;;;;;-1:-1:-1;;29477:9:0;;:16;;;-1:-1:-1;;;29477:16:0;;;;29416:40;;-1:-1:-1;;;;;;29477:9:0;;;;:14;;-1:-1:-1;29477:16:0;;;;;;;;;;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29467:4;29472:1;29467:7;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1;;;;;29467:26:0;;;-1:-1:-1;;;;;29467:26:0;;;;;29522:4;29504;29509:1;29504:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29504:23:0;;;;:7;;;;;;;;;;:23;29567:16;;;29581:1;29567:16;;;;;;;;29540:24;;29567:16;;29581:1;;29567:16;;;;;;;;;-1:-1:-1;;29604:9:0;;29628:15;;29604:46;;-1:-1:-1;;;29604:46:0;;29540:43;;-1:-1:-1;;;;;;29604:9:0;;;;:23;;:46;;29645:4;;29604:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29604:46:0;;;;;;;;;;;;:::i;:::-;29594:56;;12296:5;29778:11;;29759:16;;29739:17;;:36;;;;:::i;:::-;:50;;;;:::i;:::-;29708:7;29716:1;29708:10;;;;;;;;:::i;:::-;;;;;;;:82;;;;:::i;:::-;29707:111;;;;:::i;:::-;29681:7;29689:1;29681:10;;;;;;;;:::i;:::-;;;;;;;:137;;;;:::i;:::-;29661:157;;;;29345:481;:::o;5916:297::-;256:10;6031:4;6125:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6125:34:0;;;;;;;;;;6031:4;;6053:130;;6103:7;;6125:47;;6162:10;;6125:47;:::i;:::-;6053:8;:130::i;31428:456::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;31498:3:::1;31479:16;:22:::0;;;31530:1:::1;31512:15;:19:::0;;;31542:10:::1;:14:::0;;;31530:1;31582:34:::1;::::0;31530:1;;31582:34:::1;:::i;:::-;:47;;;;:::i;:::-;31567:12;:62:::0;31662:3:::1;31642:17;:23:::0;;;-1:-1:-1;31676:16:0::1;:20:::0;;;31707:11:::1;:15:::0;;;-1:-1:-1;31749:36:0::1;::::0;-1:-1:-1;;31749:36:0::1;:::i;:::-;:50;;;;:::i;:::-;31733:13;:66:::0;31830:9:::1;31812:15;:27:::0;31869:7:::1;31850:16;:26:::0;31428:456::o;30656:297::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30789:32:0;::::1;30767:120;;;::::0;-1:-1:-1;;;30767:120:0;;11523:2:1;30767:120:0::1;::::0;::::1;11505:21:1::0;11562:2;11542:18;;;11535:30;11601:34;11581:18;;;11574:62;-1:-1:-1;;;11652:18:1;;;11645:36;11698:19;;30767:120:0::1;11321:402:1::0;30767:120:0::1;30898:17;:47:::0;;-1:-1:-1;;;;;;30898:47:0::1;-1:-1:-1::0;;;;;30898:47:0;;;::::1;::::0;;;::::1;::::0;;30656:297::o;30961:459::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;31031:3:::1;31012:16;:22:::0;;;31063:3:::1;31045:15;:21:::0;;;-1:-1:-1;31077:10:0::1;:14:::0;;;-1:-1:-1;31117:34:0::1;::::0;31063:3;31117:34:::1;:::i;:::-;:47;;;;:::i;:::-;31102:12;:62:::0;31197:3:::1;31177:17;:23:::0;;;31230:3:::1;31211:16;:22:::0;;;-1:-1:-1;31244:11:0::1;:15:::0;;;-1:-1:-1;31286:36:0::1;::::0;31230:3;31286:36:::1;:::i;:::-;:50;;;;:::i;:::-;31270:13;:66:::0;31367:8:::1;31349:15;:26:::0;31405:7:::1;31386:16;:26:::0;30961:459::o;29055:282::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;29161:2:::1;29151:6;:12;;:30;;;;;29177:4;29167:6;:14;;29151:30;29129:112;;;::::0;-1:-1:-1;;;29129:112:0;;11930:2:1;29129:112:0::1;::::0;::::1;11912:21:1::0;;;11949:18;;;11942:30;12008:34;11988:18;;;11981:62;12060:18;;29129:112:0::1;11728:356:1::0;29129:112:0::1;29270:13;:6:::0;29279:4:::1;29270:13;:::i;:::-;29252:15;:31:::0;29299:30:::1;::::0;2717:25:1;;;29299:30:0::1;::::0;2705:2:1;2690:18;29299:30:0::1;2571:177:1::0;4543::0;-1:-1:-1;;;;;4694:18:0;4662:7;4694:18;;;;;;;;;;;;4543:177::o;9195:150::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;9288:6:::1;::::0;9267:40:::1;::::0;9304:1:::1;::::0;-1:-1:-1;;;;;9288:6:0::1;::::0;9267:40:::1;::::0;9304:1;;9267:40:::1;9318:6;:19:::0;;-1:-1:-1;;;;;;9318:19:0::1;::::0;;9195:150::o;16342:154::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;16396:14:::1;:22:::0;;-1:-1:-1;;16396:22:0;;::::1;::::0;;;16429:20:::1;:28:::0;;;;::::1;::::0;;16473:15:::1;::::0;::::1;::::0;16413:5:::1;::::0;16473:15:::1;16342:154::o:0;18517:334::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;18637:4:::1;18632:155;;18694:6;::::0;-1:-1:-1;;;;;18694:6:0;;::::1;18684:16:::0;;::::1;::::0;18658:117:::1;;;::::0;-1:-1:-1;;;18658:117:0;;12291:2:1;18658:117:0::1;::::0;::::1;12273:21:1::0;12330:2;12310:18;;;12303:30;12369:34;12349:18;;;12342:62;-1:-1:-1;;;12420:18:1;;;12413:37;12467:19;;18658:117:0::1;12089:403:1::0;18658:117:0::1;-1:-1:-1::0;;;;;18797:39:0;;;::::1;;::::0;;;:31:::1;:39:::0;;;;;:46;;-1:-1:-1;;18797:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;18517:334::o;19470:411::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;19622:16:::1;:33:::0;;;19666:15:::1;:31:::0;;;19708:10:::1;:21:::0;;;19721:8;19755:34:::1;19684:13:::0;19641:14;19755:34:::1;:::i;:::-;:47;;;;:::i;:::-;19740:12;:62:::0;;;19837:3:::1;-1:-1:-1::0;19821:19:0::1;19813:60;;;::::0;-1:-1:-1;;;19813:60:0;;12699:2:1;19813:60:0::1;::::0;::::1;12681:21:1::0;12738:2;12718:18;;;12711:30;12777;12757:18;;;12750:58;12825:18;;19813:60:0::1;12497:352:1::0;19813:60:0::1;19470:411:::0;;;:::o;15960:330::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;16042:13:::1;::::0;::::1;::::0;::::1;;;16041:14;16033:50;;;::::0;-1:-1:-1;;;16033:50:0;;13056:2:1;16033:50:0::1;::::0;::::1;13038:21:1::0;13095:2;13075:18;;;13068:30;13134:25;13114:18;;;13107:53;13177:18;;16033:50:0::1;12854:347:1::0;16033:50:0::1;16094:13;:20:::0;;-1:-1:-1;;16125:18:0;;;;;16175:12:::1;16154:18;:33:::0;;;16219:31:::1;::::0;16240:10;;16219:31:::1;:::i;:::-;16198:18;:52:::0;16266:16:::1;::::0;::::1;::::0;;;::::1;15960:330:::0;:::o;29967:488::-;9108:6;;30081:10;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30117:20:0;::::1;30109:59;;;::::0;-1:-1:-1;;;30109:59:0;;13408:2:1;30109:59:0::1;::::0;::::1;13390:21:1::0;13447:2;13427:18;;;13420:30;13486:28;13466:18;;;13459:56;13532:18;;30109:59:0::1;13206:350:1::0;30109:59:0::1;30205:4;-1:-1:-1::0;;;;;30187:23:0;::::1;::::0;30179:64:::1;;;::::0;-1:-1:-1;;;30179:64:0;;13763:2:1;30179:64:0::1;::::0;::::1;13745:21:1::0;13802:2;13782:18;;;13775:30;13841;13821:18;;;13814:58;13889:18;;30179:64:0::1;13561:352:1::0;30179:64:0::1;30281:39;::::0;-1:-1:-1;;;30281:39:0;;30314:4:::1;30281:39;::::0;::::1;731:51:1::0;30254:24:0::1;::::0;-1:-1:-1;;;;;30281:24:0;::::1;::::0;::::1;::::0;704:18:1;;30281:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30339:46;::::0;-1:-1:-1;;;30339:46:0;;-1:-1:-1;;;;;14299:32:1;;;30339:46:0::1;::::0;::::1;14281:51:1::0;14348:18;;;14341:34;;;30254:66:0;;-1:-1:-1;30339:23:0;;::::1;::::0;::::1;::::0;14254:18:1;;30339:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30401;::::0;;-1:-1:-1;;;;;14299:32:1;;14281:51;;14363:2;14348:18;;14341:34;;;30331:54:0;;-1:-1:-1;30401:46:0::1;::::0;14254:18:1;30401:46:0::1;;;;;;;30098:357;29967:488:::0;;;;:::o;33896:1169::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;33977:13:::1;::::0;::::1;::::0;::::1;;;33976:14;33968:70;;;;-1:-1:-1::0;;;33968:70:0::1;;;;;;;:::i;:::-;34090:2;34071:16;:21;34049:110;;;::::0;-1:-1:-1;;;34049:110:0;;15250:2:1;34049:110:0::1;::::0;::::1;15232:21:1::0;15289:2;15269:18;;;15262:30;15328:34;15308:18;;;15301:62;-1:-1:-1;;;15379:18:1;;;15372:37;15426:19;;34049:110:0::1;15048:403:1::0;34049:110:0::1;34207:13;:20:::0;;-1:-1:-1;;34238:18:0;;;;;34288:12:::1;34267:18;:33:::0;;;34332:37:::1;::::0;34353:16;;34332:37:::1;:::i;:::-;34311:18;:58:::0;34385:16:::1;::::0;::::1;::::0;;;::::1;34492:1;34468:21;:25;34446:110;;;;-1:-1:-1::0;;;34446:110:0::1;;;;;;;:::i;:::-;34618:1;34591:24;34609:4;34591:9;:24::i;:::-;:28;34569:116;;;::::0;-1:-1:-1;;;34569:116:0;;16062:2:1;34569:116:0::1;::::0;::::1;16044:21:1::0;16101:2;16081:18;;;16074:30;16140:34;16120:18;;;16113:62;-1:-1:-1;;;16191:18:1;;;16184:36;16237:19;;34569:116:0::1;15860:402:1::0;34569:116:0::1;34730:9;::::0;34698:69:::1;::::0;34715:4:::1;::::0;-1:-1:-1;;;;;34730:9:0::1;34742:24;34715:4:::0;34742:9:::1;:24::i;34698:69::-;34780:9;::::0;-1:-1:-1;;;;;34780:9:0::1;:25;34813:21;34858:4;34878:24;34858:4:::0;34878:9:::1;:24::i;:::-;34917:1;34960::::0;35011:4:::1;35031:15;34780:277;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4214:104::-:0;4270:13;4303:7;4296:14;;;;;:::i;18859:355::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;19005:6:::1;::::0;-1:-1:-1;;;;;19005:6:0;;::::1;18997:14:::0;;::::1;::::0;18975:121:::1;;;::::0;-1:-1:-1;;;18975:121:0;;17392:2:1;18975:121:0::1;::::0;::::1;17374:21:1::0;17431:2;17411:18;;;17404:30;17470:34;17450:18;;;17443:62;17541:27;17521:18;;;17514:55;17586:19;;18975:121:0::1;17190:421:1::0;18975:121:0::1;19109:41;19138:4;19144:5;19109:28;:41::i;:::-;19166:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;19166:40:0;::::1;::::0;::::1;::::0;;;::::1;18859:355:::0;;:::o;28560:199::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;28669:1:::1;28653:13;:17;:42;;;;;28691:4;28674:13;:21;;28653:42;28645:51;;;::::0;::::1;;28726:25;:13:::0;28742:9:::1;28726:25;:::i;:::-;28707:16;:44:::0;-1:-1:-1;28560:199:0:o;16504:84::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;16559:14:::1;:21:::0;;-1:-1:-1;;16559:21:0::1;16576:4;16559:21;::::0;;16504:84::o;6221:482::-;256:10;6341:4;6390:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6390:34:0;;;;;;;;;;6457:35;;;;6435:122;;;;-1:-1:-1;;;6435:122:0;;17818:2:1;6435:122:0;;;17800:21:1;17857:2;17837:18;;;17830:30;17896:34;17876:18;;;17869:62;-1:-1:-1;;;17947:18:1;;;17940:35;17992:19;;6435:122:0;17616:401:1;6435:122:0;6593:67;256:10;6616:7;6644:15;6625:16;:34;6593:8;:67::i;:::-;-1:-1:-1;6691:4:0;;6221:482;-1:-1:-1;;;6221:482:0:o;4728:216::-;4850:4;4872:42;256:10;4896:9;4907:6;4872:9;:42::i;28767:280::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;28860:21:::1;28852:58;;;::::0;-1:-1:-1;;;28852:58:0;;18224:2:1;28852:58:0::1;::::0;::::1;18206:21:1::0;18263:2;18243:18;;;18236:30;18302:26;18282:18;;;18275:54;18346:18;;28852:58:0::1;18022:348:1::0;28852:58:0::1;28930:14;::::0;::::1;::::0;::::1;;;28929:15;28921:52;;;::::0;-1:-1:-1;;;28921:52:0;;18577:2:1;28921:52:0::1;::::0;::::1;18559:21:1::0;18616:2;18596:18;;;18589:30;18655:26;18635:18;;;18628:54;18699:18;;28921:52:0::1;18375:348:1::0;28921:52:0::1;28986:14;:21:::0;;-1:-1:-1;;28986:21:0::1;;;::::0;;29023:16:::1;::::0;::::1;::::0;28986:21;;29023:16:::1;28767:280:::0;:::o;32354:861::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;32426:12:::1;32418:56;;;::::0;-1:-1:-1;;;32418:56:0;;18930:2:1;32418:56:0::1;::::0;::::1;18912:21:1::0;18969:2;18949:18;;;18942:30;19008:33;18988:18;;;18981:61;19059:18;;32418:56:0::1;18728:355:1::0;32418:56:0::1;32494:13;::::0;::::1;::::0;::::1;;;32493:14;32485:70;;;;-1:-1:-1::0;;;32485:70:0::1;;;;;;;:::i;:::-;32644:1;32620:21;:25;32598:110;;;;-1:-1:-1::0;;;32598:110:0::1;;;;;;;:::i;20317:182::-:0;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20402:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;20402:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20457:34;;1389:41:1;;;20457:34:0::1;::::0;1362:18:1;20457:34:0::1;;;;;;;20317:182:::0;;:::o;19889:420::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;20042:17:::1;:34:::0;;;20087:16:::1;:32:::0;;;20130:11:::1;:22:::0;;;20144:8;20179:36:::1;20106:13:::0;20062:14;20179:36:::1;:::i;:::-;:50;;;;:::i;:::-;20163:13;:66:::0;;;20265:3:::1;-1:-1:-1::0;20248:20:0::1;20240:61;;;::::0;-1:-1:-1;;;20240:61:0;;12699:2:1;20240:61:0::1;::::0;::::1;12681:21:1::0;12738:2;12718:18;;;12711:30;12777;12757:18;;;12750:58;12825:18;;20240:61:0::1;12497:352:1::0;17459:323:0;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;17599:14:::1;4409:2:::0;17599::::1;:14;:::i;:::-;17591:3;17570:13;4515:12:::0;;;4427:108;17570:13:::1;:17;::::0;17586:1:::1;17570:17;:::i;:::-;17569:25;;;;:::i;:::-;17568:46;;;;:::i;:::-;17558:6;:56;;17536:147;;;;-1:-1:-1::0;;;17536:147:0::1;;;;;;;:::i;:::-;17716:14;4409:2:::0;17716::::1;:14;:::i;:::-;17706:25;::::0;:6;:25:::1;:::i;:::-;17694:9;:37:::0;;;17747:27:::1;::::0;2717:25:1;;;17747:27:0::1;::::0;2705:2:1;2690:18;17747:27:0::1;2571:177:1::0;17852:428:0;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;17992:6:::1;17971:13;4515:12:::0;;;4427:108;17971:13:::1;:17;::::0;17987:1:::1;17971:17;:::i;:::-;17970:28;;;;:::i;:::-;17957:9;:41;;17935:144;;;::::0;-1:-1:-1;;;17935:144:0;;19290:2:1;17935:144:0::1;::::0;::::1;19272:21:1::0;19329:2;19309:18;;;19302:30;19368:34;19348:18;;;19341:62;-1:-1:-1;;;19419:18:1;;;19412:51;19480:19;;17935:144:0::1;19088:417:1::0;17935:144:0::1;18147:4;18126:13;4515:12:::0;;;4427:108;18126:13:::1;:17;::::0;18142:1:::1;18126:17;:::i;:::-;18125:26;;;;:::i;:::-;18112:9;:39;;18090:141;;;::::0;-1:-1:-1;;;18090:141:0;;19712:2:1;18090:141:0::1;::::0;::::1;19694:21:1::0;19751:2;19731:18;;;19724:30;19790:34;19770:18;;;19763:62;-1:-1:-1;;;19841:18:1;;;19834:50;19901:19;;18090:141:0::1;19510:416:1::0;18090:141:0::1;18242:18;:30:::0;17852:428::o;16596:118::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16680:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:26;;-1:-1:-1;;16680:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;16596:118::o;17015:98::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;17077:20:::1;:28:::0;;-1:-1:-1;;17077:28:0::1;::::0;;17015:98::o;33223:665::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;33315:6:::1;::::0;33308:39:::1;::::0;-1:-1:-1;;;33308:39:0;;33341:4:::1;33308:39;::::0;::::1;731:51:1::0;33288:17:0::1;::::0;-1:-1:-1;;;;;33315:6:0::1;::::0;33308:24:::1;::::0;704:18:1;;33308:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33288:59;;33380:1;33368:9;:13;33360:50;;;::::0;-1:-1:-1;;;33360:50:0;;20133:2:1;33360:50:0::1;::::0;::::1;20115:21:1::0;20172:2;20152:18;;;20145:30;20211:26;20191:18;;;20184:54;20255:18;;33360:50:0::1;19931:348:1::0;33360:50:0::1;33423:16;33466:5;33443:19;33455:7:::0;33443:9;:19:::1;:::i;:::-;33442:29;;;;:::i;:::-;33558:6;::::0;33582:9:::1;::::0;33551:52:::1;::::0;-1:-1:-1;;;33551:52:0;;-1:-1:-1;;;;;33582:9:0;;::::1;33551:52;::::0;::::1;14281:51:1::0;14348:18;;;14341:34;;;33423:48:0;;-1:-1:-1;33558:6:0::1;::::0;33551:22:::1;::::0;14254:18:1;;33551:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;33649:9:0::1;::::0;:231:::1;::::0;-1:-1:-1;;;33649:231:0;;-1:-1:-1;;;;;33649:9:0;;::::1;::::0;:28:::1;::::0;:231:::1;::::0;33700:4:::1;::::0;33720:8;;33649:9;;;;33829:10:::1;::::0;33854:15:::1;::::0;33649:231:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33277:611;;33223:665:::0;:::o;9353:281::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9456:22:0;::::1;9434:110;;;::::0;-1:-1:-1;;;9434:110:0;;21348:2:1;9434:110:0::1;::::0;::::1;21330:21:1::0;21387:2;21367:18;;;21360:30;21426:34;21406:18;;;21399:62;-1:-1:-1;;;21477:18:1;;;21470:36;21523:19;;9434:110:0::1;21146:402:1::0;9434:110:0::1;9581:6;::::0;9560:38:::1;::::0;-1:-1:-1;;;;;9560:38:0;;::::1;::::0;9581:6:::1;::::0;9560:38:::1;::::0;9581:6:::1;::::0;9560:38:::1;9609:6;:17:::0;;-1:-1:-1;;;;;;9609:17:0::1;-1:-1:-1::0;;;;;9609:17:0;;;::::1;::::0;;;::::1;::::0;;9353:281::o;30463:185::-;9108:6;;-1:-1:-1;;;;;9108:6:0;256:10;9108:22;9100:67;;;;-1:-1:-1;;;9100:67:0;;;;;;;:::i;:::-;30558:82:::1;::::0;30521:12:::1;::::0;30566:10:::1;::::0;30590:21:::1;::::0;30521:12;30558:82;30521:12;30558:82;30590:21;30566:10;30558:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8250:380:::0;-1:-1:-1;;;;;8386:19:0;;8378:68;;;;-1:-1:-1;;;8378:68:0;;21965:2:1;8378:68:0;;;21947:21:1;22004:2;21984:18;;;21977:30;22043:34;22023:18;;;22016:62;-1:-1:-1;;;22094:18:1;;;22087:34;22138:19;;8378:68:0;21763:400:1;8378:68:0;-1:-1:-1;;;;;8465:21:0;;8457:68;;;;-1:-1:-1;;;8457:68:0;;22370:2:1;8457:68:0;;;22352:21:1;22409:2;22389:18;;;22382:30;22448:34;22428:18;;;22421:62;-1:-1:-1;;;22499:18:1;;;22492:32;22541:19;;8457:68:0;22168:398:1;8457:68:0;-1:-1:-1;;;;;8538:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;8590:32;;2717:25:1;;;8590:32:0;;2690:18:1;8590:32:0;;;;;;;;8250:380;;;:::o;20507:7317::-;-1:-1:-1;;;;;20639:18:0;;20631:68;;;;-1:-1:-1;;;20631:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20718:16:0;;20710:64;;;;-1:-1:-1;;;20710:64:0;;;;;;;:::i;:::-;20802:1;20793:6;:10;20785:52;;;;-1:-1:-1;;;20785:52:0;;23583:2:1;20785:52:0;;;23565:21:1;23622:2;23602:18;;;23595:30;23661:31;23641:18;;;23634:59;23710:18;;20785:52:0;23381:353:1;20785:52:0;20855:13;;;;;;;20850:183;;-1:-1:-1;;;;;20911:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;20940:23:0;;;;;;:19;:23;;;;;;;;20911:52;20885:136;;;;-1:-1:-1;;;20885:136:0;;23941:2:1;20885:136:0;;;23923:21:1;23980:2;23960:18;;;23953:30;-1:-1:-1;;;23999:18:1;;;23992:52;24061:18;;20885:136:0;23739:346:1;20885:136:0;21049:18;;:22;21045:247;;-1:-1:-1;;;;;21115:17:0;;;;;;:11;:17;;;;;;;;21114:18;;:35;;-1:-1:-1;9046:6:0;;-1:-1:-1;;;;;21136:13:0;;;9046:6;;21136:13;21114:35;:60;;;-1:-1:-1;;;;;;21153:21:0;;21167:6;21153:21;21114:60;21088:192;;;;-1:-1:-1;;;21088:192:0;;24292:2:1;21088:192:0;;;24274:21:1;24331:2;24311:18;;;24304:30;24370:34;24350:18;;;24343:62;24441:34;24421:18;;;24414:62;-1:-1:-1;;;24492:19:1;;;24485:37;24539:19;;21088:192:0;24090:474:1;21088:192:0;21308:14;;;;21304:3385;;;9046:6;;-1:-1:-1;;;;;21361:15:0;;;9046:6;;21361:15;;;;:49;;-1:-1:-1;9046:6:0;;-1:-1:-1;;;;;21397:13:0;;;9046:6;;21397:13;;21361:49;:86;;;;-1:-1:-1;;;;;;21431:16:0;;;;21361:86;:128;;;;-1:-1:-1;;;;;;21468:21:0;;21482:6;21468:21;;21361:128;:175;;;;-1:-1:-1;;;;;;21511:25:0;;;;;;:19;:25;;;;;;;;21510:26;21361:175;:220;;;;-1:-1:-1;;;;;;21558:23:0;;;;;;:19;:23;;;;;;;;21557:24;21361:220;21339:3339;;;21752:20;;;;21748:692;;;21815:9;;-1:-1:-1;;;;;21801:24:0;;;21815:9;;21801:24;;;;:49;;-1:-1:-1;21843:6:0;;-1:-1:-1;;;;;21829:21:0;;;21843:6;;21829:21;;21801:49;21797:624;;;21992:16;22007:1;21992:12;:16;:::i;:::-;21946:9;21917:39;;;;:28;:39;;;;;;:91;:212;;;;-1:-1:-1;22113:16:0;22128:1;22113:12;:16;:::i;:::-;-1:-1:-1;;;;;22045:32:0;;;;;;:28;:32;;;;;;:84;21917:212;21879:363;;;;-1:-1:-1;;;21879:363:0;;24904:2:1;21879:363:0;;;24886:21:1;24943:2;24923:18;;;24916:30;24982:34;24962:18;;;24955:62;-1:-1:-1;;;25033:18:1;;;25026:51;25094:19;;21879:363:0;24702:417:1;21879:363:0;22298:9;22269:39;;;;:28;:39;;;;;;22311:12;22269:54;;;;-1:-1:-1;;;;;22350:32:0;;;;;;:47;21797:624;-1:-1:-1;;;;;22514:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;22571:35:0;;;;;;:31;:35;;;;;;;;22570:36;22514:92;22488:2175;;;22693:12;;22683:6;:22;;22649:148;;;;-1:-1:-1;;;22649:148:0;;25326:2:1;22649:148:0;;;25308:21:1;25365:2;25345:18;;;25338:30;25404:34;25384:18;;;25377:62;-1:-1:-1;;;25455:18:1;;;25448:38;25503:19;;22649:148:0;25124:404:1;22649:148:0;22880:9;;22870:6;22854:13;22864:2;22854:9;:13::i;:::-;:22;;;;:::i;:::-;:35;;22820:140;;;;-1:-1:-1;;;22820:140:0;;25735:2:1;22820:140:0;;;25717:21:1;25774:2;25754:18;;;25747:30;-1:-1:-1;;;25793:18:1;;;25786:49;25852:18;;22820:140:0;25533:343:1;22820:140:0;22488:2175;;;-1:-1:-1;;;;;23058:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;23113:37:0;;;;;;:31;:37;;;;;;;;23112:38;23058:92;23032:1631;;;23201:14;;;;;;;23193:43;;;;-1:-1:-1;;;23193:43:0;;26083:2:1;23193:43:0;;;26065:21:1;26122:2;26102:18;;;26095:30;-1:-1:-1;;;26141:18:1;;;26134:46;26197:18;;23193:43:0;25881:340:1;23193:43:0;23305:12;;23295:6;:22;;23261:149;;;;-1:-1:-1;;;23261:149:0;;26428:2:1;23261:149:0;;;26410:21:1;26467:2;26447:18;;;26440:30;26506:34;26486:18;;;26479:62;-1:-1:-1;;;26557:18:1;;;26550:39;26606:19;;23261:149:0;26226:405:1;23261:149:0;23439:21;;;;23435:595;;;-1:-1:-1;;;;;23527:26:0;;;;;;:20;:26;;;;;;23557:15;-1:-1:-1;23527:45:0;23489:158;;;;-1:-1:-1;;;23489:158:0;;26838:2:1;23489:158:0;;;26820:21:1;26877:2;26857:18;;;26850:30;-1:-1:-1;;;26896:18:1;;;26889:45;26951:18;;23489:158:0;26636:339:1;23489:158:0;23724:20;:18;:20::i;:::-;23714:6;:30;;23676:180;;;;-1:-1:-1;;;23676:180:0;;27182:2:1;23676:180:0;;;27164:21:1;27221:2;27201:18;;;27194:30;27260:34;27240:18;;;27233:62;-1:-1:-1;;;27311:18:1;;;27304:50;27371:19;;23676:180:0;26980:416:1;23676:180:0;23990:16;;23943:63;;:15;:63;:::i;:::-;-1:-1:-1;;;;;23885:26:0;;;;;;:20;:26;;;;;:121;23032:1631;;;-1:-1:-1;;;;;24082:35:0;;;;;;:31;:35;;;;;;;;24081:36;:85;;;;-1:-1:-1;;;;;;24143:23:0;;;;;;:19;:23;;;;;;;;24142:24;24081:85;24055:608;;;24213:21;;;;24209:435;;;24263:148;;-1:-1:-1;;;24263:148:0;;27603:2:1;24263:148:0;;;27585:21:1;27642:2;27622:18;;;27615:30;27681:34;27661:18;;;27654:62;27752:34;27732:18;;;27725:62;-1:-1:-1;;;27803:19:1;;;27796:49;27862:19;;24263:148:0;27401:486:1;24209:435:0;24532:9;;24522:6;24506:13;24516:2;24506:9;:13::i;:::-;:22;;;;:::i;:::-;:35;;24468:152;;;;-1:-1:-1;;;24468:152:0;;25735:2:1;24468:152:0;;;25717:21:1;25774:2;25754:18;;;25747:30;-1:-1:-1;;;25793:18:1;;;25786:49;25852:18;;24468:152:0;25533:343:1;24468:152:0;24701:28;24732:24;24750:4;24732:9;:24::i;:::-;24808:18;;24701:55;;-1:-1:-1;24784:42:0;;;;;;;24857:35;;-1:-1:-1;24881:11:0;;;;;;;24857:35;:61;;;;-1:-1:-1;24910:8:0;;-1:-1:-1;;;24910:8:0;;;;24909:9;24857:61;:110;;;;-1:-1:-1;;;;;;24936:31:0;;;;;;:25;:31;;;;;;;;24935:32;24857:110;:153;;;;-1:-1:-1;;;;;;24985:25:0;;;;;;:19;:25;;;;;;;;24984:26;24857:153;:194;;;;-1:-1:-1;;;;;;25028:23:0;;;;;;:19;:23;;;;;;;;25027:24;24857:194;24839:510;;;25078:8;:15;;-1:-1:-1;;;;25078:15:0;-1:-1:-1;;;25078:15:0;;;25137:18;;:23;;25078:8;25137:23;:::i;:::-;25114:20;:46;25110:133;;;25204:18;;:23;;25225:2;25204:23;:::i;:::-;25181:46;;25110:133;25259:45;25283:20;25259:23;:45::i;:::-;25321:8;:16;;-1:-1:-1;;;;25321:16:0;;;24839:510;-1:-1:-1;;;;;25480:25:0;;25361:12;25480:25;;;:19;:25;;;;;;25376:4;;25480:25;;;:52;;-1:-1:-1;;;;;;25509:23:0;;;;;;:19;:23;;;;;;;;25480:52;25476:100;;;-1:-1:-1;25559:5:0;25476:100;25588:12;25615:18;25648:23;25686:31;25808:7;25804:1967;;;27927:18;;27912:12;:33;25890:77;;;;-1:-1:-1;;;;;;25936:31:0;;;;;;:25;:31;;;;;;;;25890:77;:128;;;;-1:-1:-1;;;;;;25989:29:0;;;;;;:25;:29;;;;;;;;25988:30;25890:128;:165;;;;;26054:1;26039:12;;:16;25890:165;25868:1387;;;-1:-1:-1;;;;;26095:15:0;;;;;;:11;:15;;;;;;;;26090:173;;-1:-1:-1;;;;;26135:15:0;;;;;;:11;:15;;;;;:22;;-1:-1:-1;;26135:22:0;26153:4;26135:22;;;;;;26180:10;:15;;26153:4;;26180:10;;:15;;26153:4;;26180:15;:::i;:::-;;;;-1:-1:-1;;26223:20:0;;-1:-1:-1;;;;;749:32:1;;731:51;;26223:20:0;;719:2:1;704:18;26223:20:0;;;;;;;26090:173;-1:-1:-1;26307:4:0;26353:3;26338:11;:6;26347:2;26338:11;:::i;:::-;26337:19;;;;:::i;:::-;26330:26;;26420:12;;26401:15;;26394:4;:22;;;;:::i;:::-;26393:39;;;;:::i;:::-;26375:57;;26486:12;;26472:10;;26465:4;:17;;;;:::i;:::-;26464:34;;;;:::i;:::-;26451:47;;25868:1387;;;-1:-1:-1;;;;;26561:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;26610:1;26594:13;;:17;26561:50;26557:698;;;26658:2;26632:28;;12296:5;26696:13;;26687:6;:22;;;;:::i;:::-;26686:38;;;;:::i;:::-;26679:45;;26789:13;;26769:16;;26762:4;:23;;;;:::i;:::-;26761:41;;;;:::i;:::-;26743:59;;26857:13;;26842:11;;26835:4;:18;;;;:::i;26557:698::-;-1:-1:-1;;;;;26932:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;26982:1;26967:12;;:16;26932:51;26928:327;;;27030:4;27004:30;;12296:5;27070:12;;27061:6;:21;;;;:::i;:::-;27060:37;;;;:::i;:::-;27053:44;;27161:12;;27142:15;;27135:4;:22;;;;:::i;:::-;27134:39;;;;:::i;:::-;27116:57;;27227:12;;27213:10;;27206:4;:17;;;;:::i;:::-;27205:34;;;;:::i;:::-;27192:47;;26928:327;27275:8;;27271:460;;27304:42;27320:4;27334;27341;27304:15;:42::i;:::-;27369:14;;27365:95;;27408:32;27422:4;27429:10;27408:5;:32::i;:::-;27482:19;;27478:238;;27526:170;27576:4;27608:23;27658:15;27526;:170::i;:::-;27745:14;27755:4;27745:14;;:::i;:::-;;;25804:1967;27783:33;27799:4;27805:2;27809:6;27783:15;:33::i;:::-;20620:7204;;;;;;;20507:7317;;;:::o;19222:240::-;-1:-1:-1;;;;;19305:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;19305:39:0;;;;;;;19357;19305:31;:39;19357:26;:39::i;27961:591::-;28118:16;;;28132:1;28118:16;;;;;;;;28094:21;;28118:16;;;;;;;;;;-1:-1:-1;28118:16:0;28094:40;;28163:4;28145;28150:1;28145:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28145:23:0;;;:7;;;;;;;;;;:23;;;;28189:9;;:16;;;-1:-1:-1;;;28189:16:0;;;;:9;;;;;:14;;:16;;;;;28145:7;;28189:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28179:4;28184:1;28179:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28179:26:0;;;:7;;;;;;;;;:26;28250:9;;28218:56;;28235:4;;28250:9;28262:11;28218:8;:56::i;:::-;28313:9;;28485:17;;28313:231;;-1:-1:-1;;;28313:231:0;;-1:-1:-1;;;;;28313:9:0;;;;:60;;:231;;28388:11;;28313:9;;28458:4;;28485:17;;;28518:15;;28313:231;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28023:529;27961:591;:::o;6711:651::-;-1:-1:-1;;;;;6851:20:0;;6843:70;;;;-1:-1:-1;;;6843:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6932:23:0;;6924:71;;;;-1:-1:-1;;;6924:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7032:17:0;;7008:21;7032:17;;;;;;;;;;;7082:23;;;;7060:111;;;;-1:-1:-1;;;7060:111:0;;28681:2:1;7060:111:0;;;28663:21:1;28720:2;28700:18;;;28693:30;28759:34;28739:18;;;28732:62;-1:-1:-1;;;28810:18:1;;;28803:36;28856:19;;7060:111:0;28479:402:1;7060:111:0;-1:-1:-1;;;;;7207:17:0;;;:9;:17;;;;;;;;;;;7227:22;;;7207:42;;7271:20;;;;;;;;:30;;7243:6;;7207:9;7271:30;;7243:6;;7271:30;:::i;:::-;;;;;;;;7336:9;-1:-1:-1;;;;;7319:35:0;7328:6;-1:-1:-1;;;;;7319:35:0;;7347:6;7319:35;;;;2717:25:1;;2705:2;2690:18;;2571:177;7319:35:0;;;;;;;;6832:530;6711:651;;;:::o;7692:550::-;-1:-1:-1;;;;;7776:21:0;;7768:67;;;;-1:-1:-1;;;7768:67:0;;29088:2:1;7768:67:0;;;29070:21:1;29127:2;29107:18;;;29100:30;29166:34;29146:18;;;29139:62;-1:-1:-1;;;29217:18:1;;;29210:31;29258:19;;7768:67:0;28886:397:1;7768:67:0;-1:-1:-1;;;;;7871:18:0;;7846:22;7871:18;;;;;;;;;;;7908:24;;;;7900:71;;;;-1:-1:-1;;;7900:71:0;;29490:2:1;7900:71:0;;;29472:21:1;29529:2;29509:18;;;29502:30;29568:34;29548:18;;;29541:62;-1:-1:-1;;;29619:18:1;;;29612:32;29661:19;;7900:71:0;29288:398:1;7900:71:0;-1:-1:-1;;;;;8007:18:0;;:9;:18;;;;;;;;;;;8028:23;;;8007:44;;8146:12;:22;;;;;;;8197:37;2717:25:1;;;8007:9:0;;:18;8197:37;;2690:18:1;8197:37:0;2571:177:1;18288:221:0;-1:-1:-1;;;;;18390:39:0;;;;;;:31;:39;;;;;;;;:52;;-1:-1:-1;;18390:52:0;;;;;;;;;;18458:43;;29859:51:1;;;29926:18;;;29919:50;18458:43:0;;29832:18:1;18458:43:0;;;;;;;18288:221;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;793:131::-;-1:-1:-1;;;;;868:31:1;;858:42;;848:70;;914:1;911;904:12;848:70;793:131;:::o;929:315::-;997:6;1005;1058:2;1046:9;1037:7;1033:23;1029:32;1026:52;;;1074:1;1071;1064:12;1026:52;1113:9;1100:23;1132:31;1157:5;1132:31;:::i;:::-;1182:5;1234:2;1219:18;;;;1206:32;;-1:-1:-1;;;929:315:1:o;1441:247::-;1500:6;1553:2;1541:9;1532:7;1528:23;1524:32;1521:52;;;1569:1;1566;1559:12;1521:52;1608:9;1595:23;1627:31;1652:5;1627:31;:::i;:::-;1677:5;1441:247;-1:-1:-1;;;1441:247:1:o;1693:118::-;1779:5;1772:13;1765:21;1758:5;1755:32;1745:60;;1801:1;1798;1791:12;1816:750;1908:6;1916;1924;1977:2;1965:9;1956:7;1952:23;1948:32;1945:52;;;1993:1;1990;1983:12;1945:52;2033:9;2020:23;2062:18;2103:2;2095:6;2092:14;2089:34;;;2119:1;2116;2109:12;2089:34;2157:6;2146:9;2142:22;2132:32;;2202:7;2195:4;2191:2;2187:13;2183:27;2173:55;;2224:1;2221;2214:12;2173:55;2264:2;2251:16;2290:2;2282:6;2279:14;2276:34;;;2306:1;2303;2296:12;2276:34;2361:7;2354:4;2344:6;2341:1;2337:14;2333:2;2329:23;2325:34;2322:47;2319:67;;;2382:1;2379;2372:12;2319:67;2413:4;2405:13;;;;-1:-1:-1;2437:6:1;-1:-1:-1;;2478:20:1;;2465:34;2508:28;2465:34;2508:28;:::i;:::-;2555:5;2545:15;;;1816:750;;;;;:::o;2753:180::-;2812:6;2865:2;2853:9;2844:7;2840:23;2836:32;2833:52;;;2881:1;2878;2871:12;2833:52;-1:-1:-1;2904:23:1;;2753:180;-1:-1:-1;2753:180:1:o;2938:456::-;3015:6;3023;3031;3084:2;3072:9;3063:7;3059:23;3055:32;3052:52;;;3100:1;3097;3090:12;3052:52;3139:9;3126:23;3158:31;3183:5;3158:31;:::i;:::-;3208:5;-1:-1:-1;3265:2:1;3250:18;;3237:32;3278:33;3237:32;3278:33;:::i;:::-;2938:456;;3330:7;;-1:-1:-1;;;3384:2:1;3369:18;;;;3356:32;;2938:456::o;3399:241::-;3455:6;3508:2;3496:9;3487:7;3483:23;3479:32;3476:52;;;3524:1;3521;3514:12;3476:52;3563:9;3550:23;3582:28;3604:5;3582:28;:::i;4042:382::-;4107:6;4115;4168:2;4156:9;4147:7;4143:23;4139:32;4136:52;;;4184:1;4181;4174:12;4136:52;4223:9;4210:23;4242:31;4267:5;4242:31;:::i;:::-;4292:5;-1:-1:-1;4349:2:1;4334:18;;4321:32;4362:30;4321:32;4362:30;:::i;:::-;4411:7;4401:17;;;4042:382;;;;;:::o;4429:316::-;4506:6;4514;4522;4575:2;4563:9;4554:7;4550:23;4546:32;4543:52;;;4591:1;4588;4581:12;4543:52;-1:-1:-1;;4614:23:1;;;4684:2;4669:18;;4656:32;;-1:-1:-1;4735:2:1;4720:18;;;4707:32;;4429:316;-1:-1:-1;4429:316:1:o;4750:388::-;4818:6;4826;4879:2;4867:9;4858:7;4854:23;4850:32;4847:52;;;4895:1;4892;4885:12;4847:52;4934:9;4921:23;4953:31;4978:5;4953:31;:::i;:::-;5003:5;-1:-1:-1;5060:2:1;5045:18;;5032:32;5073:33;5032:32;5073:33;:::i;5143:380::-;5222:1;5218:12;;;;5265;;;5286:61;;5340:4;5332:6;5328:17;5318:27;;5286:61;5393:2;5385:6;5382:14;5362:18;5359:38;5356:161;;5439:10;5434:3;5430:20;5427:1;5420:31;5474:4;5471:1;5464:15;5502:4;5499:1;5492:15;5356:161;;5143:380;;;:::o;5528:356::-;5730:2;5712:21;;;5749:18;;;5742:30;5808:34;5803:2;5788:18;;5781:62;5875:2;5860:18;;5528:356::o;5889:127::-;5950:10;5945:3;5941:20;5938:1;5931:31;5981:4;5978:1;5971:15;6005:4;6002:1;5995:15;6021:127;6082:10;6077:3;6073:20;6070:1;6063:31;6113:4;6110:1;6103:15;6137:4;6134:1;6127:15;6153:135;6192:3;6213:17;;;6210:43;;6233:18;;:::i;:::-;-1:-1:-1;6280:1:1;6269:13;;6153:135::o;6293:125::-;6358:9;;;6379:10;;;6376:36;;;6392:18;;:::i;6423:422::-;6512:1;6555:5;6512:1;6569:270;6590:7;6580:8;6577:21;6569:270;;;6649:4;6645:1;6641:6;6637:17;6631:4;6628:27;6625:53;;;6658:18;;:::i;:::-;6708:7;6698:8;6694:22;6691:55;;;6728:16;;;;6691:55;6807:22;;;;6767:15;;;;6569:270;;;6573:3;6423:422;;;;;:::o;6850:806::-;6899:5;6929:8;6919:80;;-1:-1:-1;6970:1:1;6984:5;;6919:80;7018:4;7008:76;;-1:-1:-1;7055:1:1;7069:5;;7008:76;7100:4;7118:1;7113:59;;;;7186:1;7181:130;;;;7093:218;;7113:59;7143:1;7134:10;;7157:5;;;7181:130;7218:3;7208:8;7205:17;7202:43;;;7225:18;;:::i;:::-;-1:-1:-1;;7281:1:1;7267:16;;7296:5;;7093:218;;7395:2;7385:8;7382:16;7376:3;7370:4;7367:13;7363:36;7357:2;7347:8;7344:16;7339:2;7333:4;7330:12;7326:35;7323:77;7320:159;;;-1:-1:-1;7432:19:1;;;7464:5;;7320:159;7511:34;7536:8;7530:4;7511:34;:::i;:::-;7581:6;7577:1;7573:6;7569:19;7560:7;7557:32;7554:58;;;7592:18;;:::i;:::-;7630:20;;6850:806;-1:-1:-1;;;6850:806:1:o;7661:140::-;7719:5;7748:47;7789:4;7779:8;7775:19;7769:4;7748:47;:::i;7806:168::-;7846:7;7912:1;7908;7904:6;7900:14;7897:1;7894:21;7889:1;7882:9;7875:17;7871:45;7868:71;;;7919:18;;:::i;:::-;-1:-1:-1;7959:9:1;;7806:168::o;7979:217::-;8019:1;8045;8035:132;;8089:10;8084:3;8080:20;8077:1;8070:31;8124:4;8121:1;8114:15;8152:4;8149:1;8142:15;8035:132;-1:-1:-1;8181:9:1;;7979:217::o;8201:405::-;8403:2;8385:21;;;8442:2;8422:18;;;8415:30;8481:34;8476:2;8461:18;;8454:62;-1:-1:-1;;;8547:2:1;8532:18;;8525:39;8596:3;8581:19;;8201:405::o;9020:127::-;9081:10;9076:3;9072:20;9069:1;9062:31;9112:4;9109:1;9102:15;9136:4;9133:1;9126:15;9152:251;9222:6;9275:2;9263:9;9254:7;9250:23;9246:32;9243:52;;;9291:1;9288;9281:12;9243:52;9323:9;9317:16;9342:31;9367:5;9342:31;:::i;9408:461::-;9461:3;9499:5;9493:12;9526:6;9521:3;9514:19;9552:4;9581:2;9576:3;9572:12;9565:19;;9618:2;9611:5;9607:14;9639:1;9649:195;9663:6;9660:1;9657:13;9649:195;;;9728:13;;-1:-1:-1;;;;;9724:39:1;9712:52;;9784:12;;;;9819:15;;;;9760:1;9678:9;9649:195;;;-1:-1:-1;9860:3:1;;9408:461;-1:-1:-1;;;;;9408:461:1:o;9874:332::-;10081:6;10070:9;10063:25;10124:2;10119;10108:9;10104:18;10097:30;10044:4;10144:56;10196:2;10185:9;10181:18;10173:6;10144:56;:::i;:::-;10136:64;9874:332;-1:-1:-1;;;;9874:332:1:o;10211:1105::-;10306:6;10337:2;10380;10368:9;10359:7;10355:23;10351:32;10348:52;;;10396:1;10393;10386:12;10348:52;10429:9;10423:16;10458:18;10499:2;10491:6;10488:14;10485:34;;;10515:1;10512;10505:12;10485:34;10553:6;10542:9;10538:22;10528:32;;10598:7;10591:4;10587:2;10583:13;10579:27;10569:55;;10620:1;10617;10610:12;10569:55;10649:2;10643:9;10671:2;10667;10664:10;10661:36;;;10677:18;;:::i;:::-;10723:2;10720:1;10716:10;10755:2;10749:9;10818:2;10814:7;10809:2;10805;10801:11;10797:25;10789:6;10785:38;10873:6;10861:10;10858:22;10853:2;10841:10;10838:18;10835:46;10832:72;;;10884:18;;:::i;:::-;10920:2;10913:22;10970:18;;;11004:15;;;;-1:-1:-1;11046:11:1;;;11042:20;;;11074:19;;;11071:39;;;11106:1;11103;11096:12;11071:39;11130:11;;;;11150:135;11166:6;11161:3;11158:15;11150:135;;;11232:10;;11220:23;;11183:12;;;;11263;;;;11150:135;;;11304:6;10211:1105;-1:-1:-1;;;;;;;;10211:1105:1:o;13918:184::-;13988:6;14041:2;14029:9;14020:7;14016:23;14012:32;14009:52;;;14057:1;14054;14047:12;14009:52;-1:-1:-1;14080:16:1;;13918:184;-1:-1:-1;13918:184:1:o;14386:245::-;14453:6;14506:2;14494:9;14485:7;14481:23;14477:32;14474:52;;;14522:1;14519;14512:12;14474:52;14554:9;14548:16;14573:28;14595:5;14573:28;:::i;14636:407::-;14838:2;14820:21;;;14877:2;14857:18;;;14850:30;14916:34;14911:2;14896:18;;14889:62;-1:-1:-1;;;14982:2:1;14967:18;;14960:41;15033:3;15018:19;;14636:407::o;15456:399::-;15658:2;15640:21;;;15697:2;15677:18;;;15670:30;15736:34;15731:2;15716:18;;15709:62;-1:-1:-1;;;15802:2:1;15787:18;;15780:33;15845:3;15830:19;;15456:399::o;16267:607::-;-1:-1:-1;;;;;16626:15:1;;;16608:34;;16673:2;16658:18;;16651:34;;;;16716:2;16701:18;;16694:34;;;;16759:2;16744:18;;16737:34;;;;16808:15;;;16802:3;16787:19;;16780:44;16588:3;16840:19;;16833:35;;;;16557:3;16542:19;;16267:607::o;16879:306::-;16967:6;16975;16983;17036:2;17024:9;17015:7;17011:23;17007:32;17004:52;;;17052:1;17049;17042:12;17004:52;17081:9;17075:16;17065:26;;17131:2;17120:9;17116:18;17110:25;17100:35;;17175:2;17164:9;17160:18;17154:25;17144:35;;16879:306;;;;;:::o;20896:245::-;20975:6;20983;21036:2;21024:9;21015:7;21011:23;21007:32;21004:52;;;21052:1;21049;21042:12;21004:52;-1:-1:-1;;21075:16:1;;21131:2;21116:18;;;21110:25;21075:16;;21110:25;;-1:-1:-1;20896:245:1:o;22571:401::-;22773:2;22755:21;;;22812:2;22792:18;;;22785:30;22851:34;22846:2;22831:18;;22824:62;-1:-1:-1;;;22917:2:1;22902:18;;22895:35;22962:3;22947:19;;22571:401::o;22977:399::-;23179:2;23161:21;;;23218:2;23198:18;;;23191:30;23257:34;23252:2;23237:18;;23230:62;-1:-1:-1;;;23323:2:1;23308:18;;23301:33;23366:3;23351:19;;22977:399::o;24569:128::-;24636:9;;;24657:11;;;24654:37;;;24671:18;;:::i;27892:582::-;28191:6;28180:9;28173:25;28234:6;28229:2;28218:9;28214:18;28207:34;28277:3;28272:2;28261:9;28257:18;28250:31;28154:4;28298:57;28350:3;28339:9;28335:19;28327:6;28298:57;:::i;:::-;-1:-1:-1;;;;;28391:32:1;;;;28386:2;28371:18;;28364:60;-1:-1:-1;28455:3:1;28440:19;28433:35;28290:65;27892:582;-1:-1:-1;;;27892:582:1:o

Swarm Source

ipfs://911f871548f6d310f0c1cc3ef0ab166d7b4110c7023ea8141420c20429ad6677
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.