ETH Price: $3,256.31 (-0.57%)
Gas: 1 Gwei

Token

The People Protocol (PEOPLES)
 

Overview

Max Total Supply

7,982,424,384 PEOPLES

Holders

201

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
4,731,530.306505469111260571 PEOPLES

Value
$0.00
0x8a1e083624ca6bbc65bafe126a3f18254bd6a955
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:
Peoples

Compiler Version
v0.8.13+commit.abaa5c0e

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-25
*/

// SPDX-License-Identifier: MIT
/*
 *  https://the-people.io/
 *
 *  TG: https://t.me/ThePeopleProtocol
 *  TW: https://twitter.com/PeopleProtocol
 *  RD: https://www.reddit.com/user/PeopleProtocol
 */
pragma solidity 0.8.13;

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

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

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

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

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

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

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

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

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

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

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

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

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

        emit Transfer(sender, recipient, amount);
    }

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

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

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

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

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

interface ILpPair {
    function sync() external;
}

interface IDexRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        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 getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

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

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

contract Peoples is ERC20, Ownable {
    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWallet;

    IDexRouter public dexRouter;
    address public lpPair;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address public operationsAddress;
    address public treasuryAddress;

    uint256 public tradingActiveBlock = 0; // 0 means trading is not active
    uint256 public blockForPenaltyEnd;
    mapping(address => bool) public boughtEarly;
    address[] public earlyBuyers;
    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 buyTreasuryFee;

    uint256 private originalSellOperationsFee;
    uint256 private originalSellLiquidityFee;
    uint256 private originalSellTreasuryFee;

    uint256 public sellTotalFees;
    uint256 public sellOperationsFee;
    uint256 public sellLiquidityFee;
    uint256 public sellTreasuryFee;

    uint256 public tokensForOperations;
    uint256 public tokensForLiquidity;
    uint256 public tokensForTreasury;
    bool public sellingEnabled = false;

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

    // 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 ExcludeFromFees(address indexed account, bool isExcluded);

    event UpdatedMaxBuyAmount(uint256 newAmount);

    event UpdatedMaxSellAmount(uint256 newAmount);

    event UpdatedMaxWalletAmount(uint256 newAmount);

    event UpdatedOperationsAddress(address indexed newWallet);

    event UpdatedTreasuryAddress(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 UpdatedPrivateMaxSell(uint256 amount);

    event EnabledSelling();

    constructor() payable ERC20("The People Protocol", "PEOPLES") {
        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 == 4) {
            _dexRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // ETH: Rinkeby
        } 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 = 7982424384 * 1e18; // world population

        maxBuyAmount = (totalSupply * 1) / 100; // 1%
        maxSellAmount = (totalSupply * 1) / 100; // 1%
        maxWallet = (totalSupply * 2) / 100; // 2%
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05 %

        buyOperationsFee = 2;
        buyLiquidityFee = 1;
        buyTreasuryFee = 3;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyTreasuryFee;

        originalSellOperationsFee = 2;
        originalSellLiquidityFee = 1;
        originalSellTreasuryFee = 3;

        sellOperationsFee = 9;
        sellLiquidityFee = 3;
        sellTreasuryFee = 0;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellTreasuryFee;

        operationsAddress = address(0xcbA766cF7C455ab3dB08220cbAe4be25F30eaf47);
        treasuryAddress = address(0x66403cf4fA97bE8023DbCE861FecC5de37f1426a);

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

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

        _createInitialSupply(address(0xdead), (totalSupply * 25) / 100); // Burn
        _createInitialSupply(address(this), (totalSupply * 40) / 100); // Tokens for liquidity
        _createInitialSupply(newOwner, (totalSupply * 35) / 100); // Lock

        transferOwnership(newOwner);
    }

    receive() external payable {}

    function enableTrading(uint256 blocksForPenalty) external onlyOwner {
        require(!tradingActive, "Cannot reenable trading");
        require(
            blocksForPenalty <= 10,
            "Cannot make penalty blocks more than 10"
        );
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
        blockForPenaltyEnd = tradingActiveBlock + blocksForPenalty;
        emit EnabledTrading();
    }

    function getEarlyBuyers() external view returns (address[] memory) {
        return earlyBuyers;
    }

    function removeBoughtEarly(address wallet) external onlyOwner {
        require(boughtEarly[wallet], "Wallet is already not flagged.");
        boughtEarly[wallet] = false;
    }

    function emergencyUpdateRouter(address router) external onlyOwner {
        require(!tradingActive, "Cannot update after trading is functional");
        dexRouter = IDexRouter(router);
    }

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

    function updateMaxBuyAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set max buy amount lower than 0.5%"
        );
        require(
            newNum <= ((totalSupply() * 2) / 100) / 1e18,
            "Cannot set buy sell amount higher than 2%"
        );
        maxBuyAmount = newNum * (10**18);
        emit UpdatedMaxBuyAmount(maxBuyAmount);
    }

    function updateMaxSellAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set max sell amount lower than 0.5%"
        );
        require(
            newNum <= ((totalSupply() * 2) / 100) / 1e18,
            "Cannot set max sell amount higher than 2%"
        );
        maxSellAmount = newNum * (10**18);
        emit UpdatedMaxSellAmount(maxSellAmount);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set max wallet amount lower than 0.5%"
        );
        require(
            newNum <= ((totalSupply() * 2) / 100) / 1e18,
            "Cannot set max wallet amount higher than 2%"
        );
        maxWallet = newNum * (10**18);
        emit UpdatedMaxWalletAmount(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 _treasuryFee
    ) external onlyOwner {
        buyOperationsFee = _operationsFee;
        buyLiquidityFee = _liquidityFee;
        buyTreasuryFee = _treasuryFee;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyTreasuryFee;
        require(buyTotalFees <= 10, "Must keep fees at 10% or less");
    }

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

    function restoreTaxes() external onlyOwner {
        buyOperationsFee = originalSellOperationsFee;
        buyLiquidityFee = originalSellLiquidityFee;
        buyTreasuryFee = originalSellTreasuryFee;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyTreasuryFee;

        sellOperationsFee = originalSellOperationsFee;
        sellLiquidityFee = originalSellLiquidityFee;
        sellTreasuryFee = originalSellTreasuryFee;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellTreasuryFee;
    }

    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 (!earlyBuyPenaltyInEffect() && tradingActive) {
            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(0xdead) &&
                !_isExcludedFromFees[from] &&
                !_isExcludedFromFees[to]
            ) {
                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 <= maxBuyAmount,
                        "Buy transfer amount exceeds the max buy."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max Wallet Exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(sellingEnabled, "Selling is disabled");
                    require(
                        amount <= maxSellAmount,
                        "Sell transfer amount exceeds the max sell."
                    );
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max Wallet Exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap && swapEnabled && !swapping && automatedMarketMakerPairs[to]
        ) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeFee = true;
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // bot/sniper penalty.
            if (
                (earlyBuyPenaltyInEffect() ||
                    (amount >= maxBuyAmount - .9 ether &&
                        blockForPenaltyEnd + 8 >= block.number)) &&
                automatedMarketMakerPairs[from] &&
                !automatedMarketMakerPairs[to] &&
                !_isExcludedFromFees[to] &&
                buyTotalFees > 0
            ) {
                if (!earlyBuyPenaltyInEffect()) {
                    // reduce by 1 wei per max buy over what Uniswap will allow to revert bots as best as possible to limit erroneously blacklisted wallets. First bot will get in and be blacklisted, rest will be reverted (*cross fingers*)
                    maxBuyAmount -= 1;
                }

                if (!boughtEarly[to]) {
                    boughtEarly[to] = true;
                    botsCaught += 1;
                    earlyBuyers.push(to);
                    emit CaughtEarlyBuyer(to);
                }

                fees = (amount * 99) / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForOperations += (fees * buyOperationsFee) / buyTotalFees;
                tokensForTreasury += (fees * buyTreasuryFee) / buyTotalFees;
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = (amount * sellTotalFees) / 100;
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForOperations +=
                    (fees * sellOperationsFee) /
                    sellTotalFees;
                tokensForTreasury += (fees * sellTreasuryFee) / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = (amount * buyTotalFees) / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForOperations += (fees * buyOperationsFee) / buyTotalFees;
                tokensForTreasury += (fees * buyTreasuryFee) / buyTotalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

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

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

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

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

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(dexRouter), tokenAmount);

        // add the liquidity
        dexRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(0xdead),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForOperations +
            tokensForTreasury;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 10) {
            contractBalance = swapTokensAtAmount * 10;
        }

        bool success;

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = (contractBalance * tokensForLiquidity) /
            totalTokensToSwap /
            2;

        swapTokensForEth(contractBalance - liquidityTokens);

        uint256 ethBalance = address(this).balance;
        uint256 ethForLiquidity = ethBalance;

        uint256 ethForOperations = (ethBalance * tokensForOperations) /
            (totalTokensToSwap - (tokensForLiquidity / 2));
        uint256 ethForStaking = (ethBalance * tokensForTreasury) /
            (totalTokensToSwap - (tokensForLiquidity / 2));

        ethForLiquidity -= ethForOperations + ethForStaking;

        tokensForLiquidity = 0;
        tokensForOperations = 0;
        tokensForTreasury = 0;

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
        }

        (success, ) = address(treasuryAddress).call{value: ethForStaking}("");
        (success, ) = address(operationsAddress).call{
            value: address(this).balance
        }("");
    }

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

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

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

    function setTreasuryAddress(address _treasuryAddress) external onlyOwner {
        require(
            _treasuryAddress != address(0),
            "_operationsAddress address cannot be 0"
        );
        treasuryAddress = payable(_treasuryAddress);
        emit UpdatedTreasuryAddress(_treasuryAddress);
    }

    // force Swap back if slippage issues.
    function forceSwapBack() external onlyOwner {
        require(
            balanceOf(address(this)) >= swapTokensAtAmount,
            "Can only swap when token amount is at or higher than restriction"
        );
        swapping = true;
        swapBack();
        swapping = false;
        emit OwnerForcedSwapBack(block.timestamp);
    }

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

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

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

        sellingEnabled = true;
        emit EnabledSelling();
    }

    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":[{"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":"newAmount","type":"uint256"}],"name":"UpdatedMaxBuyAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxSellAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxWalletAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedOperationsAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdatedPrivateMaxSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedTreasuryAddress","type":"event"},{"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":"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":"buyTreasuryFee","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":"uint256","name":"","type":"uint256"}],"name":"earlyBuyers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"emergencyUpdateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocksForPenalty","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":"forceSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getEarlyBuyers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"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":[{"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":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"name":"operationsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeBoughtEarly","outputs":[],"stateMutability":"nonpayable","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":"restoreTaxes","outputs":[],"stateMutability":"nonpayable","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":"sellTreasuryFee","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":"address","name":"_operationsAddress","type":"address"}],"name":"setOperationsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSellingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","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":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTreasury","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":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6000600e556013805462ffffff1916600190811782556015805460ff19908116909217905560248054909116905560808181527f5468652050656f706c652050726f746f636f6c0000000000000000000000000060a0908152610100604052600760c09081526650454f504c455360c81b60e0529192620000839160039162000930565b5080516200009990600490602084019062000930565b5050506000620000ae620005d160201b60201c565b600580546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062004bd3833981519152908290a35033600046600103620001135750737a250d5630b4cf539739df2c5dacb4c659f2488d62000185565b46600403620001385750737a250d5630b4cf539739df2c5dacb4c659f2488d62000185565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b600980546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620001df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002059190620009d6565b6001600160a01b031663c9c6539630600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000268573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028e9190620009d6565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003029190620009d6565b600a80546001600160a01b0319166001600160a01b039290921691821790556200032e906001620005d5565b600a5462000347906001600160a01b0316600162000638565b6b19cae81cf1137665bd00000060646200036382600162000a1e565b6200036f919062000a40565b60065560646200038182600162000a1e565b6200038d919062000a40565b60075560646200039f82600262000a1e565b620003ab919062000a40565b600855612710620003be82600562000a1e565b620003ca919062000a40565b600b5560026017819055600160188190556003601981905591620003ef919062000a63565b620003fb919062000a63565b6016556002601a556001601b556003601c8190556009601e819055601f82905560006020819055916200042e9162000a63565b6200043a919062000a63565b601d55600c80546001600160a01b031990811673cba766cf7c455ab3db08220cbae4be25f30eaf4717909155600d80549091167366403cf4fa97be8023dbce861fecc5de37f1426a17905562000492836001620005d5565b6200049f306001620005d5565b620004ae61dead6001620005d5565b600c54620004c7906001600160a01b03166001620005d5565b600d54620004e0906001600160a01b03166001620005d5565b600954620004f9906001600160a01b03166001620005d5565b62000506836001620006a4565b62000513306001620006a4565b6200052261dead6001620006a4565b600c546200053b906001600160a01b03166001620006a4565b600d5462000554906001600160a01b03166001620006a4565b6009546200056d906001600160a01b03166001620006a4565b6200059561dead60646200058384601962000a1e565b6200058f919062000a40565b6200074e565b620005a93060646200058384602862000a1e565b620005bd8360646200058384602362000a1e565b620005c88362000833565b50505062000aba565b3390565b6001600160a01b038216600081815260266020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382166000908152602760205260409020805460ff1916821515179055620006688282620005d5565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314620006ef5760405162461bcd60e51b8152602060048201819052602482015260008051602062004bb383398151915260448201526064016200017c565b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620007a65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200017c565b8060026000828254620007ba919062000a63565b90915550506001600160a01b03821660009081526020819052604081208054839290620007e990849062000a63565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b031633146200087e5760405162461bcd60e51b8152602060048201819052602482015260008051602062004bb383398151915260448201526064016200017c565b6001600160a01b038116620008e55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200017c565b6005546040516001600160a01b0380841692169060008051602062004bd383398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b8280546200093e9062000a7e565b90600052602060002090601f016020900481019282620009625760008555620009ad565b82601f106200097d57805160ff1916838001178555620009ad565b82800160010185558215620009ad579182015b82811115620009ad57825182559160200191906001019062000990565b50620009bb929150620009bf565b5090565b5b80821115620009bb5760008155600101620009c0565b600060208284031215620009e957600080fd5b81516001600160a01b038116811462000a0157600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000a3b5762000a3b62000a08565b500290565b60008262000a5e57634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000a795762000a7962000a08565b500190565b600181811c9082168062000a9357607f821691505b60208210810362000ab457634e487b7160e01b600052602260045260246000fd5b50919050565b6140e98062000aca6000396000f3fe60806040526004361061041f5760003560e01c806385ecfd281161021e578063cc2ffe7c11610123578063ee40166e116100ab578063f5648a4f1161007a578063f5648a4f14610c0d578063f637434214610c22578063f771cb6514610c38578063f8b45b0514610c52578063fb002c9714610c6857600080fd5b8063ee40166e14610ba1578063efda116514610bb7578063f11a24d314610bd7578063f2fde38b14610bed57600080fd5b8063dd62ed3e116100f2578063dd62ed3e14610af0578063e2f4560514610b36578063e884f26014610b4c578063ea4cfe1214610b61578063eb472fc414610b8157600080fd5b8063cc2ffe7c14610a84578063d257b34f14610a9a578063d85ba06314610aba578063dc3f0d0f14610ad057600080fd5b8063a9059cbb116101a6578063c024666811610175578063c0246668146109ea578063c17b5b8c14610a0a578063c18bc19514610a2a578063c5f956af14610a4a578063c876d0b914610a6a57600080fd5b8063a9059cbb1461095b578063b62496f51461097b578063b9875539146109ab578063bbc0c742146109cb57600080fd5b80639a5bd2dd116101ed5780639a5bd2dd146108ce5780639a7a23d6146108f0578063a28e86d314610910578063a457c2d714610925578063a62068ce1461094557600080fd5b806385ecfd281461085557806388e765ff146108855780638da5cb5b1461089b57806395d89b41146108b957600080fd5b80635a139dd4116103245780636ddd1713116102ac5780637571336a1161027b5780637571336a146107b55780638095d564146107d557806382aa7c68146107f55780638366e79a1461081557806385b12c7c1461083557600080fd5b80636ddd17131461074b57806370a082311461076b578063715018a61461078b578063751039fc146107a057600080fd5b80636605bfda116102f35780636605bfda146106d357806366d602ae146106f35780636a486a8e146107095780636b0a894c1461071f5780636b2fb1241461073557600080fd5b80635a139dd4146106725780635bb988c9146106885780635c068a8c146106a85780635eed98e2146106be57600080fd5b80632be32b61116103a7578063499b839411610376578063499b8394146105f65780634a62bb65146106165780634f77f6c01461063057806351f205e41461064657806358a6d5311461065b57600080fd5b80632be32b611461057a578063313ce5671461059a57806339509351146105b6578063452ed4f1146105d657600080fd5b806310d5de53116103ee57806310d5de53146104d55780631805805b1461050557806318160ddd146105255780631a8145bb1461054457806323b872dd1461055a57600080fd5b806306fdde031461042b5780630758d92414610456578063095ea7b31461048e5780630fcdfb94146104be57600080fd5b3661042657005b600080fd5b34801561043757600080fd5b50610440610c7e565b60405161044d9190613abd565b60405180910390f35b34801561046257600080fd5b50600954610476906001600160a01b031681565b6040516001600160a01b03909116815260200161044d565b34801561049a57600080fd5b506104ae6104a9366004613b2a565b610d10565b604051901515815260200161044d565b3480156104ca57600080fd5b506104d3610d26565b005b3480156104e157600080fd5b506104ae6104f0366004613b56565b60266020526000908152604090205460ff1681565b34801561051157600080fd5b506104d3610520366004613b56565b610de4565b34801561053157600080fd5b506002545b60405190815260200161044d565b34801561055057600080fd5b5061053660225481565b34801561056657600080fd5b506104ae610575366004613b7a565b610e9a565b34801561058657600080fd5b506104d3610595366004613bbb565b610f44565b3480156105a657600080fd5b506040516012815260200161044d565b3480156105c257600080fd5b506104ae6105d1366004613b2a565b6110e5565b3480156105e257600080fd5b50600a54610476906001600160a01b031681565b34801561060257600080fd5b506104d3610611366004613b56565b611121565b34801561062257600080fd5b506013546104ae9060ff1681565b34801561063c57600080fd5b50610536601e5481565b34801561065257600080fd5b506104d36111bb565b34801561066757600080fd5b50600f5443106104ae565b34801561067e57600080fd5b5061053660175481565b34801561069457600080fd5b506104d36106a3366004613b56565b6112c4565b3480156106b457600080fd5b5061053660195481565b3480156106ca57600080fd5b506104d3611377565b3480156106df57600080fd5b506104d36106ee366004613b56565b611403565b3480156106ff57600080fd5b5061053660075481565b34801561071557600080fd5b50610536601d5481565b34801561072b57600080fd5b5061053660125481565b34801561074157600080fd5b5061053660205481565b34801561075757600080fd5b506013546104ae9062010000900460ff1681565b34801561077757600080fd5b50610536610786366004613b56565b61149d565b34801561079757600080fd5b506104d36114b8565b3480156107ac57600080fd5b506104d361152c565b3480156107c157600080fd5b506104d36107d0366004613be2565b611562565b3480156107e157600080fd5b506104d36107f0366004613c1b565b61162a565b34801561080157600080fd5b506104d3610810366004613bbb565b6116d2565b34801561082157600080fd5b506104ae610830366004613c47565b6117c6565b34801561084157600080fd5b506104d3610850366004613bbb565b611a00565b34801561086157600080fd5b506104ae610870366004613b56565b60106020526000908152604090205460ff1681565b34801561089157600080fd5b5061053660065481565b3480156108a757600080fd5b506005546001600160a01b0316610476565b3480156108c557600080fd5b50610440611bed565b3480156108da57600080fd5b506108e3611bfc565b60405161044d9190613cb9565b3480156108fc57600080fd5b506104d361090b366004613be2565b611c5d565b34801561091c57600080fd5b506104d3611d51565b34801561093157600080fd5b506104ae610940366004613b2a565b611d8a565b34801561095157600080fd5b50610536600f5481565b34801561096757600080fd5b506104ae610976366004613b2a565b611e23565b34801561098757600080fd5b506104ae610996366004613b56565b60276020526000908152604090205460ff1681565b3480156109b757600080fd5b506104d36109c6366004613ccc565b611e30565b3480156109d757600080fd5b506013546104ae90610100900460ff1681565b3480156109f657600080fd5b506104d3610a05366004613be2565b611eef565b348015610a1657600080fd5b506104d3610a25366004613c1b565b611f78565b348015610a3657600080fd5b506104d3610a45366004613bbb565b61201b565b348015610a5657600080fd5b50600d54610476906001600160a01b031681565b348015610a7657600080fd5b506015546104ae9060ff1681565b348015610a9057600080fd5b5061053660235481565b348015610aa657600080fd5b506104d3610ab5366004613bbb565b6121ba565b348015610ac657600080fd5b5061053660165481565b348015610adc57600080fd5b506104d3610aeb366004613bbb565b612305565b348015610afc57600080fd5b50610536610b0b366004613c47565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b4257600080fd5b50610536600b5481565b348015610b5857600080fd5b506104d36124a0565b348015610b6d57600080fd5b50600c54610476906001600160a01b031681565b348015610b8d57600080fd5b50610476610b9c366004613bbb565b6124d6565b348015610bad57600080fd5b50610536600e5481565b348015610bc357600080fd5b506104d3610bd2366004613bbb565b612500565b348015610be357600080fd5b5061053660185481565b348015610bf957600080fd5b506104d3610c08366004613b56565b612701565b348015610c1957600080fd5b506104d36127ec565b348015610c2e57600080fd5b50610536601f5481565b348015610c4457600080fd5b506024546104ae9060ff1681565b348015610c5e57600080fd5b5061053660085481565b348015610c7457600080fd5b5061053660215481565b606060038054610c8d90613ce9565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb990613ce9565b8015610d065780601f10610cdb57610100808354040283529160200191610d06565b820191906000526020600020905b815481529060010190602001808311610ce957829003601f168201915b5050505050905090565b6000610d1d338484612858565b50600192915050565b6005546001600160a01b03163314610d595760405162461bcd60e51b8152600401610d5090613d23565b60405180910390fd5b60245460ff1615610dac5760405162461bcd60e51b815260206004820152601860248201527f53656c6c696e6720616c726561647920656e61626c65642100000000000000006044820152606401610d50565b6024805460ff191660011790556040517f7fdc9c6ba047bed382d2ae7be131e601f2fead137f249278e33c13a6928b080890600090a1565b6005546001600160a01b03163314610e0e5760405162461bcd60e51b8152600401610d5090613d23565b601354610100900460ff1615610e785760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74207570646174652061667465722074726164696e6720697320666044820152681d5b98dd1a5bdb985b60ba1b6064820152608401610d50565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000610ea784848461297c565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610f2c5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610d50565b610f398533858403612858565b506001949350505050565b6005546001600160a01b03163314610f6e5760405162461bcd60e51b8152600401610d5090613d23565b670de0b6b3a76400006103e8610f8360025490565b610f8e906005613d6e565b610f989190613d8d565b610fa29190613d8d565b8110156110035760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e352560b81b6064820152608401610d50565b670de0b6b3a7640000606461101760025490565b611022906002613d6e565b61102c9190613d8d565b6110369190613d8d565b8111156110975760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206275792073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610d50565b6110a981670de0b6b3a7640000613d6e565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d1d91859061111c908690613daf565b612858565b6005546001600160a01b0316331461114b5760405162461bcd60e51b8152600401610d5090613d23565b6001600160a01b0381166111715760405162461bcd60e51b8152600401610d5090613dc7565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f4efa56652237561d0f1fd31311aeaaa41f3b754a461545ed3cf6ced5876d298290600090a250565b6005546001600160a01b031633146111e55760405162461bcd60e51b8152600401610d5090613d23565b600b546111f13061149d565b1015611267576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610d50565b600a805460ff60a01b1916600160a01b1790556112826134db565b600a805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b6005546001600160a01b031633146112ee5760405162461bcd60e51b8152600401610d5090613d23565b6001600160a01b03811660009081526010602052604090205460ff166113565760405162461bcd60e51b815260206004820152601e60248201527f57616c6c657420697320616c7265616479206e6f7420666c61676765642e00006044820152606401610d50565b6001600160a01b03166000908152601060205260409020805460ff19169055565b6005546001600160a01b031633146113a15760405162461bcd60e51b8152600401610d5090613d23565b601a546017819055601b546018819055601c546019819055916113c49190613daf565b6113ce9190613daf565b601655601a54601e819055601b54601f819055601c546020819055916113f49190613daf565b6113fe9190613daf565b601d55565b6005546001600160a01b0316331461142d5760405162461bcd60e51b8152600401610d5090613d23565b6001600160a01b0381166114535760405162461bcd60e51b8152600401610d5090613dc7565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f2e1e696cfb265fa16e1170d24ef04cb2262772bde00ecf34d80bae6722487b7f90600090a250565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146114e25760405162461bcd60e51b8152600401610d5090613d23565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146115565760405162461bcd60e51b8152600401610d5090613d23565b6013805460ff19169055565b6005546001600160a01b0316331461158c5760405162461bcd60e51b8152600401610d5090613d23565b806115ff57600a546001600160a01b03908116908316036115ff5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610d50565b6001600160a01b03919091166000908152602660205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146116545760405162461bcd60e51b8152600401610d5090613d23565b6017839055601882905560198190558061166e8385613daf565b6116789190613daf565b6016819055600a10156116cd5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610d50565b505050565b6005546001600160a01b031633146116fc5760405162461bcd60e51b8152600401610d5090613d23565b601354610100900460ff16156117545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610d50565b600a8111156117755760405162461bcd60e51b8152600401610d5090613e0d565b6013805462ffff0019166201010017905543600e819055611797908290613daf565b600f556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a150565b6005546000906001600160a01b031633146117f35760405162461bcd60e51b8152600401610d5090613d23565b6001600160a01b0383166118495760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610d50565b6001600160a01b038316301415806118695750601354610100900460ff16155b6118d25760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610d50565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611919573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193d9190613e54565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b49190613e6d565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b03163314611a2a5760405162461bcd60e51b8152600401610d5090613d23565b601354610100900460ff1615611a525760405162461bcd60e51b8152600401610d5090613e8a565b600a8110611a725760405162461bcd60e51b8152600401610d5090613e0d565b6013805462ffff0019166201010017905543600e819055611a94908290613daf565b600f556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a160004711611ae05760405162461bcd60e51b8152600401610d5090613ed5565b6000611aeb3061149d565b11611b475760405162461bcd60e51b815260206004820152602660248201527f4d757374206861766520546f6b656e73206f6e20636f6e747261637420746f206044820152650d8c2eadcc6d60d31b6064820152608401610d50565b600954611b629030906001600160a01b031661111c8261149d565b6009546001600160a01b031663f305d7194730611b7e8161149d565b60008030426040518863ffffffff1660e01b8152600401611ba496959493929190613f18565b60606040518083038185885af1158015611bc2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611be79190613f53565b50505050565b606060048054610c8d90613ce9565b60606011805480602002602001604051908101604052809291908181526020018280548015610d0657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c36575050505050905090565b6005546001600160a01b03163314611c875760405162461bcd60e51b8152600401610d5090613d23565b600a546001600160a01b0390811690831603611d0b5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610d50565b611d1582826136e3565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314611d7b5760405162461bcd60e51b8152600401610d5090613d23565b6013805460ff19166001179055565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611e0c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d50565b611e193385858403612858565b5060019392505050565b6000610d1d33848461297c565b6005546001600160a01b03163314611e5a5760405162461bcd60e51b8152600401610d5090613d23565b80611ea75760405162461bcd60e51b815260206004820152601f60248201527f506c6561736520636f6e6669726d20616464696e67206f6620746865204c50006044820152606401610d50565b601354610100900460ff1615611ecf5760405162461bcd60e51b8152600401610d5090613e8a565b60004711611ae05760405162461bcd60e51b8152600401610d5090613ed5565b6005546001600160a01b03163314611f195760405162461bcd60e51b8152600401610d5090613d23565b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611fa25760405162461bcd60e51b8152600401610d5090613d23565b601e839055601f829055602081905580611fbc8385613daf565b611fc69190613daf565b601d819055600a10156116cd5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610d50565b6005546001600160a01b031633146120455760405162461bcd60e51b8152600401610d5090613d23565b670de0b6b3a76400006103e861205a60025490565b612065906005613d6e565b61206f9190613d8d565b6120799190613d8d565b8110156120dd5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610d50565b670de0b6b3a764000060646120f160025490565b6120fc906002613d6e565b6121069190613d8d565b6121109190613d8d565b8111156121735760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e742068696760448201526a686572207468616e20322560a81b6064820152608401610d50565b61218581670de0b6b3a7640000613d6e565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc906020016110da565b6005546001600160a01b031633146121e45760405162461bcd60e51b8152600401610d5090613d23565b620186a06121f160025490565b6121fc906001613d6e565b6122069190613d8d565b8110156122735760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610d50565b6103e861227f60025490565b61228a906001613d6e565b6122949190613d8d565b8111156123005760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610d50565b600b55565b6005546001600160a01b0316331461232f5760405162461bcd60e51b8152600401610d5090613d23565b670de0b6b3a76400006103e861234460025490565b61234f906005613d6e565b6123599190613d8d565b6123639190613d8d565b8110156123c55760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e352560b01b6064820152608401610d50565b670de0b6b3a764000060646123d960025490565b6123e4906002613d6e565b6123ee9190613d8d565b6123f89190613d8d565b8111156124595760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610d50565b61246b81670de0b6b3a7640000613d6e565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e906020016110da565b6005546001600160a01b031633146124ca5760405162461bcd60e51b8152600401610d5090613d23565b6015805460ff19169055565b601181815481106124e657600080fd5b6000918252602090912001546001600160a01b0316905081565b6005546001600160a01b0316331461252a5760405162461bcd60e51b8152600401610d5090613d23565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125979190613e54565b9050600081116125e95760405162461bcd60e51b815260206004820152601860248201527f4e6f204c5020746f6b656e7320696e20636f6e747261637400000000000000006044820152606401610d50565b60006127106125f88484613d6e565b6126029190613d8d565b600a5460095460405163095ea7b360e01b81526001600160a01b03918216600482015260248101849052929350169063095ea7b3906044016020604051808303816000875af1158015612659573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267d9190613e6d565b50600954604051629d473b60e21b81526001600160a01b03909116906302751cec906126b89030908590600190819033904290600401613f18565b60408051808303816000875af11580156126d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fa9190613f81565b5050505050565b6005546001600160a01b0316331461272b5760405162461bcd60e51b8152600401610d5090613d23565b6001600160a01b0381166127905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d50565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146128165760405162461bcd60e51b8152600401610d5090613d23565b604051600090339047908381818185875af1925050503d8060008114611be7576040519150601f19603f3d011682016040523d82523d6000602084013e611be7565b6001600160a01b0383166128ba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d50565b6001600160a01b03821661291b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d50565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166129a25760405162461bcd60e51b8152600401610d5090613fa5565b6001600160a01b0382166129c85760405162461bcd60e51b8152600401610d5090613fea565b60008111612a185760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610d50565b601354610100900460ff16612aab576001600160a01b03831660009081526025602052604090205460ff1680612a6657506001600160a01b03821660009081526025602052604090205460ff165b612aab5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d50565b600f544310158015612ac45750601354610100900460ff165b15612b94576001600160a01b03831660009081526010602052604090205460ff161580612afe57506005546001600160a01b038381169116145b80612b1357506001600160a01b03821661dead145b612b945760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610d50565b60135460ff1615612fba576005546001600160a01b03848116911614801590612bcb57506005546001600160a01b03838116911614155b8015612be257506001600160a01b03821661dead14155b8015612c0757506001600160a01b03831660009081526025602052604090205460ff16155b8015612c2c57506001600160a01b03821660009081526025602052604090205460ff16155b15612fba5760155460ff1615612d45576009546001600160a01b03838116911614801590612c685750600a546001600160a01b03838116911614155b15612d4557612c7860024361402d565b32600090815260146020526040902054108015612cb65750612c9b60024361402d565b6001600160a01b038316600090815260146020526040902054105b612d205760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610d50565b3260009081526014602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526027602052604090205460ff168015612d8657506001600160a01b03821660009081526026602052604090205460ff16155b15612e4d57600654811115612dee5760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610d50565b600854612dfa8361149d565b612e049083613daf565b1115612e485760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d50565b612fba565b6001600160a01b03821660009081526027602052604090205460ff168015612e8e57506001600160a01b03831660009081526026602052604090205460ff16155b15612f405760245460ff16612edb5760405162461bcd60e51b815260206004820152601360248201527214d95b1b1a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610d50565b600754811115612e485760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610d50565b6001600160a01b03821660009081526026602052604090205460ff16612fba57600854612f6c8361149d565b612f769083613daf565b1115612fba5760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d50565b6000612fc53061149d565b600b5490915081108015908190612fe4575060135462010000900460ff165b8015612ffa5750600a54600160a01b900460ff16155b801561301e57506001600160a01b03841660009081526027602052604090205460ff165b1561304c57600a805460ff60a01b1916600160a01b17905561303e6134db565b600a805460ff60a01b191690555b6001600160a01b03851660009081526025602052604090205460019060ff168061308e57506001600160a01b03851660009081526025602052604090205460ff165b15613097575060005b600081156134c757600f544310806130dd5750670c7d713b49da00006006546130c0919061402d565b85101580156130dd575043600f5460086130da9190613daf565b10155b801561310157506001600160a01b03871660009081526027602052604090205460ff165b801561312657506001600160a01b03861660009081526027602052604090205460ff16155b801561314b57506001600160a01b03861660009081526025602052604090205460ff16155b801561315957506000601654115b1561331057600f5443106131805760016006600082825461317a919061402d565b90915550505b6001600160a01b03861660009081526010602052604090205460ff16613260576001600160a01b0386166000908152601060205260408120805460ff1916600190811790915560128054919290916131d9908490613daf565b9091555050601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0388169081179091556040519081527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b606461326d866063613d6e565b6132779190613d8d565b90506016546018548261328a9190613d6e565b6132949190613d8d565b602260008282546132a59190613daf565b90915550506016546017546132ba9083613d6e565b6132c49190613d8d565b602160008282546132d59190613daf565b90915550506016546019546132ea9083613d6e565b6132f49190613d8d565b602360008282546133059190613daf565b909155506134a99050565b6001600160a01b03861660009081526027602052604090205460ff16801561333a57506000601d54115b156133cc576064601d548661334f9190613d6e565b6133599190613d8d565b9050601d54601f548261336c9190613d6e565b6133769190613d8d565b602260008282546133879190613daf565b9091555050601d54601e5461339c9083613d6e565b6133a69190613d8d565b602160008282546133b79190613daf565b9091555050601d546020546132ea9083613d6e565b6001600160a01b03871660009081526027602052604090205460ff1680156133f657506000601654115b156134a95760646016548661340b9190613d6e565b6134159190613d8d565b9050601654601854826134289190613d6e565b6134329190613d8d565b602260008282546134439190613daf565b90915550506016546017546134589083613d6e565b6134629190613d8d565b602160008282546134739190613daf565b90915550506016546019546134889083613d6e565b6134929190613d8d565b602360008282546134a39190613daf565b90915550505b80156134ba576134ba873083613711565b6134c4818661402d565b94505b6134d2878787613711565b50505050505050565b60006134e63061149d565b905060006023546021546022546134fd9190613daf565b6135079190613daf565b9050811580613514575080155b1561351d575050565b600b5461352b90600a613d6e565b82111561354357600b5461354090600a613d6e565b91505b600080600283602254866135579190613d6e565b6135619190613d8d565b61356b9190613d8d565b905061357f61357a828661402d565b613866565b6022544790819060009061359590600290613d8d565b61359f908761402d565b6021546135ac9085613d6e565b6135b69190613d8d565b9050600060026022546135c99190613d8d565b6135d3908861402d565b6023546135e09086613d6e565b6135ea9190613d8d565b90506135f68183613daf565b613600908461402d565b600060228190556021819055602355925084158015906136205750600083115b1561362f5761362f85846139c0565b600d546040516001600160a01b03909116908290600081818185875af1925050503d806000811461367c576040519150601f19603f3d011682016040523d82523d6000602084013e613681565b606091505b5050600c546040519197506001600160a01b0316904790600081818185875af1925050503d80600081146136d1576040519150601f19603f3d011682016040523d82523d6000602084013e6136d6565b606091505b5050505050505050505050565b6001600160a01b0382166000908152602760205260409020805460ff1916821515179055611d158282613a5a565b6001600160a01b0383166137375760405162461bcd60e51b8152600401610d5090613fa5565b6001600160a01b03821661375d5760405162461bcd60e51b8152600401610d5090613fea565b6001600160a01b038316600090815260208190526040902054818110156137d55760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d50565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061380c908490613daf565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161385891815260200190565b60405180910390a350505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061389b5761389b614044565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156138f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613918919061405a565b8160018151811061392b5761392b614044565b6001600160a01b0392831660209182029290920101526009546139519130911684612858565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac9479061398a908590600090869030904290600401614077565b600060405180830381600087803b1580156139a457600080fd5b505af11580156139b8573d6000803e3d6000fd5b505050505050565b6009546139d89030906001600160a01b031684612858565b60095460405163f305d71960e01b81526001600160a01b039091169063f305d719908390613a179030908790600090819061dead904290600401613f18565b60606040518083038185885af1158015613a35573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126fa9190613f53565b6001600160a01b038216600081815260266020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b600060208083528351808285015260005b81811015613aea57858101830151858201604001528201613ace565b81811115613afc576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114613b2757600080fd5b50565b60008060408385031215613b3d57600080fd5b8235613b4881613b12565b946020939093013593505050565b600060208284031215613b6857600080fd5b8135613b7381613b12565b9392505050565b600080600060608486031215613b8f57600080fd5b8335613b9a81613b12565b92506020840135613baa81613b12565b929592945050506040919091013590565b600060208284031215613bcd57600080fd5b5035919050565b8015158114613b2757600080fd5b60008060408385031215613bf557600080fd5b8235613c0081613b12565b91506020830135613c1081613bd4565b809150509250929050565b600080600060608486031215613c3057600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613c5a57600080fd5b8235613c6581613b12565b91506020830135613c1081613b12565b600081518084526020808501945080840160005b83811015613cae5781516001600160a01b031687529582019590820190600101613c89565b509495945050505050565b602081526000613b736020830184613c75565b600060208284031215613cde57600080fd5b8135613b7381613bd4565b600181811c90821680613cfd57607f821691505b602082108103613d1d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613d8857613d88613d58565b500290565b600082613daa57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613dc257613dc2613d58565b500190565b60208082526026908201527f5f6f7065726174696f6e734164647265737320616464726573732063616e6e6f60408201526507420626520360d41b606082015260800190565b60208082526027908201527f43616e6e6f74206d616b652070656e616c747920626c6f636b73206d6f72652060408201526607468616e2031360cc1b606082015260800190565b600060208284031215613e6657600080fd5b5051919050565b600060208284031215613e7f57600080fd5b8151613b7381613bd4565b6020808252602b908201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60408201526a3a103932b630bab731b41760a91b606082015260800190565b60208082526023908201527f4d757374206861766520455448206f6e20636f6e747261637420746f206c61756040820152620dcc6d60eb1b606082015260800190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600080600060608486031215613f6857600080fd5b8351925060208401519150604084015190509250925092565b60008060408385031215613f9457600080fd5b505080516020909101519092909150565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60008282101561403f5761403f613d58565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561406c57600080fd5b8151613b7381613b12565b85815284602082015260a06040820152600061409660a0830186613c75565b6001600160a01b039490941660608301525060800152939250505056fea264697066735822122033dd421d821564bf62e771a7ea2c292e3d0768cda9a7cb642f3c11445b587f9664736f6c634300080d00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x60806040526004361061041f5760003560e01c806385ecfd281161021e578063cc2ffe7c11610123578063ee40166e116100ab578063f5648a4f1161007a578063f5648a4f14610c0d578063f637434214610c22578063f771cb6514610c38578063f8b45b0514610c52578063fb002c9714610c6857600080fd5b8063ee40166e14610ba1578063efda116514610bb7578063f11a24d314610bd7578063f2fde38b14610bed57600080fd5b8063dd62ed3e116100f2578063dd62ed3e14610af0578063e2f4560514610b36578063e884f26014610b4c578063ea4cfe1214610b61578063eb472fc414610b8157600080fd5b8063cc2ffe7c14610a84578063d257b34f14610a9a578063d85ba06314610aba578063dc3f0d0f14610ad057600080fd5b8063a9059cbb116101a6578063c024666811610175578063c0246668146109ea578063c17b5b8c14610a0a578063c18bc19514610a2a578063c5f956af14610a4a578063c876d0b914610a6a57600080fd5b8063a9059cbb1461095b578063b62496f51461097b578063b9875539146109ab578063bbc0c742146109cb57600080fd5b80639a5bd2dd116101ed5780639a5bd2dd146108ce5780639a7a23d6146108f0578063a28e86d314610910578063a457c2d714610925578063a62068ce1461094557600080fd5b806385ecfd281461085557806388e765ff146108855780638da5cb5b1461089b57806395d89b41146108b957600080fd5b80635a139dd4116103245780636ddd1713116102ac5780637571336a1161027b5780637571336a146107b55780638095d564146107d557806382aa7c68146107f55780638366e79a1461081557806385b12c7c1461083557600080fd5b80636ddd17131461074b57806370a082311461076b578063715018a61461078b578063751039fc146107a057600080fd5b80636605bfda116102f35780636605bfda146106d357806366d602ae146106f35780636a486a8e146107095780636b0a894c1461071f5780636b2fb1241461073557600080fd5b80635a139dd4146106725780635bb988c9146106885780635c068a8c146106a85780635eed98e2146106be57600080fd5b80632be32b61116103a7578063499b839411610376578063499b8394146105f65780634a62bb65146106165780634f77f6c01461063057806351f205e41461064657806358a6d5311461065b57600080fd5b80632be32b611461057a578063313ce5671461059a57806339509351146105b6578063452ed4f1146105d657600080fd5b806310d5de53116103ee57806310d5de53146104d55780631805805b1461050557806318160ddd146105255780631a8145bb1461054457806323b872dd1461055a57600080fd5b806306fdde031461042b5780630758d92414610456578063095ea7b31461048e5780630fcdfb94146104be57600080fd5b3661042657005b600080fd5b34801561043757600080fd5b50610440610c7e565b60405161044d9190613abd565b60405180910390f35b34801561046257600080fd5b50600954610476906001600160a01b031681565b6040516001600160a01b03909116815260200161044d565b34801561049a57600080fd5b506104ae6104a9366004613b2a565b610d10565b604051901515815260200161044d565b3480156104ca57600080fd5b506104d3610d26565b005b3480156104e157600080fd5b506104ae6104f0366004613b56565b60266020526000908152604090205460ff1681565b34801561051157600080fd5b506104d3610520366004613b56565b610de4565b34801561053157600080fd5b506002545b60405190815260200161044d565b34801561055057600080fd5b5061053660225481565b34801561056657600080fd5b506104ae610575366004613b7a565b610e9a565b34801561058657600080fd5b506104d3610595366004613bbb565b610f44565b3480156105a657600080fd5b506040516012815260200161044d565b3480156105c257600080fd5b506104ae6105d1366004613b2a565b6110e5565b3480156105e257600080fd5b50600a54610476906001600160a01b031681565b34801561060257600080fd5b506104d3610611366004613b56565b611121565b34801561062257600080fd5b506013546104ae9060ff1681565b34801561063c57600080fd5b50610536601e5481565b34801561065257600080fd5b506104d36111bb565b34801561066757600080fd5b50600f5443106104ae565b34801561067e57600080fd5b5061053660175481565b34801561069457600080fd5b506104d36106a3366004613b56565b6112c4565b3480156106b457600080fd5b5061053660195481565b3480156106ca57600080fd5b506104d3611377565b3480156106df57600080fd5b506104d36106ee366004613b56565b611403565b3480156106ff57600080fd5b5061053660075481565b34801561071557600080fd5b50610536601d5481565b34801561072b57600080fd5b5061053660125481565b34801561074157600080fd5b5061053660205481565b34801561075757600080fd5b506013546104ae9062010000900460ff1681565b34801561077757600080fd5b50610536610786366004613b56565b61149d565b34801561079757600080fd5b506104d36114b8565b3480156107ac57600080fd5b506104d361152c565b3480156107c157600080fd5b506104d36107d0366004613be2565b611562565b3480156107e157600080fd5b506104d36107f0366004613c1b565b61162a565b34801561080157600080fd5b506104d3610810366004613bbb565b6116d2565b34801561082157600080fd5b506104ae610830366004613c47565b6117c6565b34801561084157600080fd5b506104d3610850366004613bbb565b611a00565b34801561086157600080fd5b506104ae610870366004613b56565b60106020526000908152604090205460ff1681565b34801561089157600080fd5b5061053660065481565b3480156108a757600080fd5b506005546001600160a01b0316610476565b3480156108c557600080fd5b50610440611bed565b3480156108da57600080fd5b506108e3611bfc565b60405161044d9190613cb9565b3480156108fc57600080fd5b506104d361090b366004613be2565b611c5d565b34801561091c57600080fd5b506104d3611d51565b34801561093157600080fd5b506104ae610940366004613b2a565b611d8a565b34801561095157600080fd5b50610536600f5481565b34801561096757600080fd5b506104ae610976366004613b2a565b611e23565b34801561098757600080fd5b506104ae610996366004613b56565b60276020526000908152604090205460ff1681565b3480156109b757600080fd5b506104d36109c6366004613ccc565b611e30565b3480156109d757600080fd5b506013546104ae90610100900460ff1681565b3480156109f657600080fd5b506104d3610a05366004613be2565b611eef565b348015610a1657600080fd5b506104d3610a25366004613c1b565b611f78565b348015610a3657600080fd5b506104d3610a45366004613bbb565b61201b565b348015610a5657600080fd5b50600d54610476906001600160a01b031681565b348015610a7657600080fd5b506015546104ae9060ff1681565b348015610a9057600080fd5b5061053660235481565b348015610aa657600080fd5b506104d3610ab5366004613bbb565b6121ba565b348015610ac657600080fd5b5061053660165481565b348015610adc57600080fd5b506104d3610aeb366004613bbb565b612305565b348015610afc57600080fd5b50610536610b0b366004613c47565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b4257600080fd5b50610536600b5481565b348015610b5857600080fd5b506104d36124a0565b348015610b6d57600080fd5b50600c54610476906001600160a01b031681565b348015610b8d57600080fd5b50610476610b9c366004613bbb565b6124d6565b348015610bad57600080fd5b50610536600e5481565b348015610bc357600080fd5b506104d3610bd2366004613bbb565b612500565b348015610be357600080fd5b5061053660185481565b348015610bf957600080fd5b506104d3610c08366004613b56565b612701565b348015610c1957600080fd5b506104d36127ec565b348015610c2e57600080fd5b50610536601f5481565b348015610c4457600080fd5b506024546104ae9060ff1681565b348015610c5e57600080fd5b5061053660085481565b348015610c7457600080fd5b5061053660215481565b606060038054610c8d90613ce9565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb990613ce9565b8015610d065780601f10610cdb57610100808354040283529160200191610d06565b820191906000526020600020905b815481529060010190602001808311610ce957829003601f168201915b5050505050905090565b6000610d1d338484612858565b50600192915050565b6005546001600160a01b03163314610d595760405162461bcd60e51b8152600401610d5090613d23565b60405180910390fd5b60245460ff1615610dac5760405162461bcd60e51b815260206004820152601860248201527f53656c6c696e6720616c726561647920656e61626c65642100000000000000006044820152606401610d50565b6024805460ff191660011790556040517f7fdc9c6ba047bed382d2ae7be131e601f2fead137f249278e33c13a6928b080890600090a1565b6005546001600160a01b03163314610e0e5760405162461bcd60e51b8152600401610d5090613d23565b601354610100900460ff1615610e785760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74207570646174652061667465722074726164696e6720697320666044820152681d5b98dd1a5bdb985b60ba1b6064820152608401610d50565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000610ea784848461297c565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610f2c5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610d50565b610f398533858403612858565b506001949350505050565b6005546001600160a01b03163314610f6e5760405162461bcd60e51b8152600401610d5090613d23565b670de0b6b3a76400006103e8610f8360025490565b610f8e906005613d6e565b610f989190613d8d565b610fa29190613d8d565b8110156110035760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e352560b81b6064820152608401610d50565b670de0b6b3a7640000606461101760025490565b611022906002613d6e565b61102c9190613d8d565b6110369190613d8d565b8111156110975760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206275792073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610d50565b6110a981670de0b6b3a7640000613d6e565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d1d91859061111c908690613daf565b612858565b6005546001600160a01b0316331461114b5760405162461bcd60e51b8152600401610d5090613d23565b6001600160a01b0381166111715760405162461bcd60e51b8152600401610d5090613dc7565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f4efa56652237561d0f1fd31311aeaaa41f3b754a461545ed3cf6ced5876d298290600090a250565b6005546001600160a01b031633146111e55760405162461bcd60e51b8152600401610d5090613d23565b600b546111f13061149d565b1015611267576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610d50565b600a805460ff60a01b1916600160a01b1790556112826134db565b600a805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b6005546001600160a01b031633146112ee5760405162461bcd60e51b8152600401610d5090613d23565b6001600160a01b03811660009081526010602052604090205460ff166113565760405162461bcd60e51b815260206004820152601e60248201527f57616c6c657420697320616c7265616479206e6f7420666c61676765642e00006044820152606401610d50565b6001600160a01b03166000908152601060205260409020805460ff19169055565b6005546001600160a01b031633146113a15760405162461bcd60e51b8152600401610d5090613d23565b601a546017819055601b546018819055601c546019819055916113c49190613daf565b6113ce9190613daf565b601655601a54601e819055601b54601f819055601c546020819055916113f49190613daf565b6113fe9190613daf565b601d55565b6005546001600160a01b0316331461142d5760405162461bcd60e51b8152600401610d5090613d23565b6001600160a01b0381166114535760405162461bcd60e51b8152600401610d5090613dc7565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f2e1e696cfb265fa16e1170d24ef04cb2262772bde00ecf34d80bae6722487b7f90600090a250565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146114e25760405162461bcd60e51b8152600401610d5090613d23565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146115565760405162461bcd60e51b8152600401610d5090613d23565b6013805460ff19169055565b6005546001600160a01b0316331461158c5760405162461bcd60e51b8152600401610d5090613d23565b806115ff57600a546001600160a01b03908116908316036115ff5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610d50565b6001600160a01b03919091166000908152602660205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146116545760405162461bcd60e51b8152600401610d5090613d23565b6017839055601882905560198190558061166e8385613daf565b6116789190613daf565b6016819055600a10156116cd5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610d50565b505050565b6005546001600160a01b031633146116fc5760405162461bcd60e51b8152600401610d5090613d23565b601354610100900460ff16156117545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610d50565b600a8111156117755760405162461bcd60e51b8152600401610d5090613e0d565b6013805462ffff0019166201010017905543600e819055611797908290613daf565b600f556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a150565b6005546000906001600160a01b031633146117f35760405162461bcd60e51b8152600401610d5090613d23565b6001600160a01b0383166118495760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610d50565b6001600160a01b038316301415806118695750601354610100900460ff16155b6118d25760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610d50565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611919573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193d9190613e54565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b49190613e6d565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b03163314611a2a5760405162461bcd60e51b8152600401610d5090613d23565b601354610100900460ff1615611a525760405162461bcd60e51b8152600401610d5090613e8a565b600a8110611a725760405162461bcd60e51b8152600401610d5090613e0d565b6013805462ffff0019166201010017905543600e819055611a94908290613daf565b600f556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a160004711611ae05760405162461bcd60e51b8152600401610d5090613ed5565b6000611aeb3061149d565b11611b475760405162461bcd60e51b815260206004820152602660248201527f4d757374206861766520546f6b656e73206f6e20636f6e747261637420746f206044820152650d8c2eadcc6d60d31b6064820152608401610d50565b600954611b629030906001600160a01b031661111c8261149d565b6009546001600160a01b031663f305d7194730611b7e8161149d565b60008030426040518863ffffffff1660e01b8152600401611ba496959493929190613f18565b60606040518083038185885af1158015611bc2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611be79190613f53565b50505050565b606060048054610c8d90613ce9565b60606011805480602002602001604051908101604052809291908181526020018280548015610d0657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c36575050505050905090565b6005546001600160a01b03163314611c875760405162461bcd60e51b8152600401610d5090613d23565b600a546001600160a01b0390811690831603611d0b5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610d50565b611d1582826136e3565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314611d7b5760405162461bcd60e51b8152600401610d5090613d23565b6013805460ff19166001179055565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611e0c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d50565b611e193385858403612858565b5060019392505050565b6000610d1d33848461297c565b6005546001600160a01b03163314611e5a5760405162461bcd60e51b8152600401610d5090613d23565b80611ea75760405162461bcd60e51b815260206004820152601f60248201527f506c6561736520636f6e6669726d20616464696e67206f6620746865204c50006044820152606401610d50565b601354610100900460ff1615611ecf5760405162461bcd60e51b8152600401610d5090613e8a565b60004711611ae05760405162461bcd60e51b8152600401610d5090613ed5565b6005546001600160a01b03163314611f195760405162461bcd60e51b8152600401610d5090613d23565b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611fa25760405162461bcd60e51b8152600401610d5090613d23565b601e839055601f829055602081905580611fbc8385613daf565b611fc69190613daf565b601d819055600a10156116cd5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610d50565b6005546001600160a01b031633146120455760405162461bcd60e51b8152600401610d5090613d23565b670de0b6b3a76400006103e861205a60025490565b612065906005613d6e565b61206f9190613d8d565b6120799190613d8d565b8110156120dd5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610d50565b670de0b6b3a764000060646120f160025490565b6120fc906002613d6e565b6121069190613d8d565b6121109190613d8d565b8111156121735760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e742068696760448201526a686572207468616e20322560a81b6064820152608401610d50565b61218581670de0b6b3a7640000613d6e565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc906020016110da565b6005546001600160a01b031633146121e45760405162461bcd60e51b8152600401610d5090613d23565b620186a06121f160025490565b6121fc906001613d6e565b6122069190613d8d565b8110156122735760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610d50565b6103e861227f60025490565b61228a906001613d6e565b6122949190613d8d565b8111156123005760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610d50565b600b55565b6005546001600160a01b0316331461232f5760405162461bcd60e51b8152600401610d5090613d23565b670de0b6b3a76400006103e861234460025490565b61234f906005613d6e565b6123599190613d8d565b6123639190613d8d565b8110156123c55760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e352560b01b6064820152608401610d50565b670de0b6b3a764000060646123d960025490565b6123e4906002613d6e565b6123ee9190613d8d565b6123f89190613d8d565b8111156124595760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610d50565b61246b81670de0b6b3a7640000613d6e565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e906020016110da565b6005546001600160a01b031633146124ca5760405162461bcd60e51b8152600401610d5090613d23565b6015805460ff19169055565b601181815481106124e657600080fd5b6000918252602090912001546001600160a01b0316905081565b6005546001600160a01b0316331461252a5760405162461bcd60e51b8152600401610d5090613d23565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125979190613e54565b9050600081116125e95760405162461bcd60e51b815260206004820152601860248201527f4e6f204c5020746f6b656e7320696e20636f6e747261637400000000000000006044820152606401610d50565b60006127106125f88484613d6e565b6126029190613d8d565b600a5460095460405163095ea7b360e01b81526001600160a01b03918216600482015260248101849052929350169063095ea7b3906044016020604051808303816000875af1158015612659573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267d9190613e6d565b50600954604051629d473b60e21b81526001600160a01b03909116906302751cec906126b89030908590600190819033904290600401613f18565b60408051808303816000875af11580156126d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fa9190613f81565b5050505050565b6005546001600160a01b0316331461272b5760405162461bcd60e51b8152600401610d5090613d23565b6001600160a01b0381166127905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d50565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146128165760405162461bcd60e51b8152600401610d5090613d23565b604051600090339047908381818185875af1925050503d8060008114611be7576040519150601f19603f3d011682016040523d82523d6000602084013e611be7565b6001600160a01b0383166128ba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d50565b6001600160a01b03821661291b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d50565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166129a25760405162461bcd60e51b8152600401610d5090613fa5565b6001600160a01b0382166129c85760405162461bcd60e51b8152600401610d5090613fea565b60008111612a185760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610d50565b601354610100900460ff16612aab576001600160a01b03831660009081526025602052604090205460ff1680612a6657506001600160a01b03821660009081526025602052604090205460ff165b612aab5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d50565b600f544310158015612ac45750601354610100900460ff165b15612b94576001600160a01b03831660009081526010602052604090205460ff161580612afe57506005546001600160a01b038381169116145b80612b1357506001600160a01b03821661dead145b612b945760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610d50565b60135460ff1615612fba576005546001600160a01b03848116911614801590612bcb57506005546001600160a01b03838116911614155b8015612be257506001600160a01b03821661dead14155b8015612c0757506001600160a01b03831660009081526025602052604090205460ff16155b8015612c2c57506001600160a01b03821660009081526025602052604090205460ff16155b15612fba5760155460ff1615612d45576009546001600160a01b03838116911614801590612c685750600a546001600160a01b03838116911614155b15612d4557612c7860024361402d565b32600090815260146020526040902054108015612cb65750612c9b60024361402d565b6001600160a01b038316600090815260146020526040902054105b612d205760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610d50565b3260009081526014602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526027602052604090205460ff168015612d8657506001600160a01b03821660009081526026602052604090205460ff16155b15612e4d57600654811115612dee5760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610d50565b600854612dfa8361149d565b612e049083613daf565b1115612e485760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d50565b612fba565b6001600160a01b03821660009081526027602052604090205460ff168015612e8e57506001600160a01b03831660009081526026602052604090205460ff16155b15612f405760245460ff16612edb5760405162461bcd60e51b815260206004820152601360248201527214d95b1b1a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610d50565b600754811115612e485760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610d50565b6001600160a01b03821660009081526026602052604090205460ff16612fba57600854612f6c8361149d565b612f769083613daf565b1115612fba5760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d50565b6000612fc53061149d565b600b5490915081108015908190612fe4575060135462010000900460ff165b8015612ffa5750600a54600160a01b900460ff16155b801561301e57506001600160a01b03841660009081526027602052604090205460ff165b1561304c57600a805460ff60a01b1916600160a01b17905561303e6134db565b600a805460ff60a01b191690555b6001600160a01b03851660009081526025602052604090205460019060ff168061308e57506001600160a01b03851660009081526025602052604090205460ff165b15613097575060005b600081156134c757600f544310806130dd5750670c7d713b49da00006006546130c0919061402d565b85101580156130dd575043600f5460086130da9190613daf565b10155b801561310157506001600160a01b03871660009081526027602052604090205460ff165b801561312657506001600160a01b03861660009081526027602052604090205460ff16155b801561314b57506001600160a01b03861660009081526025602052604090205460ff16155b801561315957506000601654115b1561331057600f5443106131805760016006600082825461317a919061402d565b90915550505b6001600160a01b03861660009081526010602052604090205460ff16613260576001600160a01b0386166000908152601060205260408120805460ff1916600190811790915560128054919290916131d9908490613daf565b9091555050601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0388169081179091556040519081527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b606461326d866063613d6e565b6132779190613d8d565b90506016546018548261328a9190613d6e565b6132949190613d8d565b602260008282546132a59190613daf565b90915550506016546017546132ba9083613d6e565b6132c49190613d8d565b602160008282546132d59190613daf565b90915550506016546019546132ea9083613d6e565b6132f49190613d8d565b602360008282546133059190613daf565b909155506134a99050565b6001600160a01b03861660009081526027602052604090205460ff16801561333a57506000601d54115b156133cc576064601d548661334f9190613d6e565b6133599190613d8d565b9050601d54601f548261336c9190613d6e565b6133769190613d8d565b602260008282546133879190613daf565b9091555050601d54601e5461339c9083613d6e565b6133a69190613d8d565b602160008282546133b79190613daf565b9091555050601d546020546132ea9083613d6e565b6001600160a01b03871660009081526027602052604090205460ff1680156133f657506000601654115b156134a95760646016548661340b9190613d6e565b6134159190613d8d565b9050601654601854826134289190613d6e565b6134329190613d8d565b602260008282546134439190613daf565b90915550506016546017546134589083613d6e565b6134629190613d8d565b602160008282546134739190613daf565b90915550506016546019546134889083613d6e565b6134929190613d8d565b602360008282546134a39190613daf565b90915550505b80156134ba576134ba873083613711565b6134c4818661402d565b94505b6134d2878787613711565b50505050505050565b60006134e63061149d565b905060006023546021546022546134fd9190613daf565b6135079190613daf565b9050811580613514575080155b1561351d575050565b600b5461352b90600a613d6e565b82111561354357600b5461354090600a613d6e565b91505b600080600283602254866135579190613d6e565b6135619190613d8d565b61356b9190613d8d565b905061357f61357a828661402d565b613866565b6022544790819060009061359590600290613d8d565b61359f908761402d565b6021546135ac9085613d6e565b6135b69190613d8d565b9050600060026022546135c99190613d8d565b6135d3908861402d565b6023546135e09086613d6e565b6135ea9190613d8d565b90506135f68183613daf565b613600908461402d565b600060228190556021819055602355925084158015906136205750600083115b1561362f5761362f85846139c0565b600d546040516001600160a01b03909116908290600081818185875af1925050503d806000811461367c576040519150601f19603f3d011682016040523d82523d6000602084013e613681565b606091505b5050600c546040519197506001600160a01b0316904790600081818185875af1925050503d80600081146136d1576040519150601f19603f3d011682016040523d82523d6000602084013e6136d6565b606091505b5050505050505050505050565b6001600160a01b0382166000908152602760205260409020805460ff1916821515179055611d158282613a5a565b6001600160a01b0383166137375760405162461bcd60e51b8152600401610d5090613fa5565b6001600160a01b03821661375d5760405162461bcd60e51b8152600401610d5090613fea565b6001600160a01b038316600090815260208190526040902054818110156137d55760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d50565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061380c908490613daf565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161385891815260200190565b60405180910390a350505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061389b5761389b614044565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156138f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613918919061405a565b8160018151811061392b5761392b614044565b6001600160a01b0392831660209182029290920101526009546139519130911684612858565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac9479061398a908590600090869030904290600401614077565b600060405180830381600087803b1580156139a457600080fd5b505af11580156139b8573d6000803e3d6000fd5b505050505050565b6009546139d89030906001600160a01b031684612858565b60095460405163f305d71960e01b81526001600160a01b039091169063f305d719908390613a179030908790600090819061dead904290600401613f18565b60606040518083038185885af1158015613a35573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126fa9190613f53565b6001600160a01b038216600081815260266020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b600060208083528351808285015260005b81811015613aea57858101830151858201604001528201613ace565b81811115613afc576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114613b2757600080fd5b50565b60008060408385031215613b3d57600080fd5b8235613b4881613b12565b946020939093013593505050565b600060208284031215613b6857600080fd5b8135613b7381613b12565b9392505050565b600080600060608486031215613b8f57600080fd5b8335613b9a81613b12565b92506020840135613baa81613b12565b929592945050506040919091013590565b600060208284031215613bcd57600080fd5b5035919050565b8015158114613b2757600080fd5b60008060408385031215613bf557600080fd5b8235613c0081613b12565b91506020830135613c1081613bd4565b809150509250929050565b600080600060608486031215613c3057600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613c5a57600080fd5b8235613c6581613b12565b91506020830135613c1081613b12565b600081518084526020808501945080840160005b83811015613cae5781516001600160a01b031687529582019590820190600101613c89565b509495945050505050565b602081526000613b736020830184613c75565b600060208284031215613cde57600080fd5b8135613b7381613bd4565b600181811c90821680613cfd57607f821691505b602082108103613d1d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613d8857613d88613d58565b500290565b600082613daa57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613dc257613dc2613d58565b500190565b60208082526026908201527f5f6f7065726174696f6e734164647265737320616464726573732063616e6e6f60408201526507420626520360d41b606082015260800190565b60208082526027908201527f43616e6e6f74206d616b652070656e616c747920626c6f636b73206d6f72652060408201526607468616e2031360cc1b606082015260800190565b600060208284031215613e6657600080fd5b5051919050565b600060208284031215613e7f57600080fd5b8151613b7381613bd4565b6020808252602b908201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60408201526a3a103932b630bab731b41760a91b606082015260800190565b60208082526023908201527f4d757374206861766520455448206f6e20636f6e747261637420746f206c61756040820152620dcc6d60eb1b606082015260800190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600080600060608486031215613f6857600080fd5b8351925060208401519150604084015190509250925092565b60008060408385031215613f9457600080fd5b505080516020909101519092909150565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60008282101561403f5761403f613d58565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561406c57600080fd5b8151613b7381613b12565b85815284602082015260a06040820152600061409660a0830186613c75565b6001600160a01b039490941660608301525060800152939250505056fea264697066735822122033dd421d821564bf62e771a7ea2c292e3d0768cda9a7cb642f3c11445b587f9664736f6c634300080d0033

Deployed Bytecode Sourcemap

10733:25540:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4200:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10877:27;;;;;;;;;;-1:-1:-1;10877:27:0;;;;-1:-1:-1;;;;;10877:27:0;;;;;;-1:-1:-1;;;;;798:32:1;;;780:51;;768:2;753:18;10877:27:0;616:221:1;5255:210:0;;;;;;;;;;-1:-1:-1;5255:210:0;;;;;:::i;:::-;;:::i;:::-;;;1463:14:1;;1456:22;1438:41;;1426:2;1411:18;5255:210:0;1298:187:1;33370:185:0;;;;;;;;;;;;;:::i;:::-;;12415:63;;;;;;;;;;-1:-1:-1;12415:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;17237:194;;;;;;;;;;-1:-1:-1;17237:194:0;;;;;:::i;:::-;;:::i;4521:108::-;;;;;;;;;;-1:-1:-1;4609:12:0;;4521:108;;;1888:25:1;;;1876:2;1861:18;4521:108:0;1742:177:1;12153:33:0;;;;;;;;;;;;;;;;5473:529;;;;;;;;;;-1:-1:-1;5473:529:0;;;;;:::i;:::-;;:::i;17598:456::-;;;;;;;;;;-1:-1:-1;17598:456:0;;;;;:::i;:::-;;:::i;4420:93::-;;;;;;;;;;-1:-1:-1;4420:93:0;;4503:2;2712:36:1;;2700:2;2685:18;4420:93:0;2570:184:1;6010:297:0;;;;;;;;;;-1:-1:-1;6010:297:0;;;;;:::i;:::-;;:::i;10911:21::-;;;;;;;;;;-1:-1:-1;10911:21:0;;;;-1:-1:-1;;;;;10911:21:0;;;32048:357;;;;;;;;;;-1:-1:-1;32048:357:0;;;;;:::i;:::-;;:::i;11325:33::-;;;;;;;;;;-1:-1:-1;11325:33:0;;;;;;;;11996:32;;;;;;;;;;;;;;;;32785:349;;;;;;;;;;;;;:::i;28413:121::-;;;;;;;;;;-1:-1:-1;28508:18:0;;28493:12;:33;28413:121;;11705:31;;;;;;;;;;;;;;;;17048:181;;;;;;;;;;-1:-1:-1;17048:181:0;;;;;:::i;:::-;;:::i;11780:29::-;;;;;;;;;;;;;;;;21553:532;;;;;;;;;;;;;:::i;32413:320::-;;;;;;;;;;-1:-1:-1;32413:320:0;;;;;:::i;:::-;;:::i;10809:28::-;;;;;;;;;;;;;;;;11961;;;;;;;;;;;;;;;;11291:25;;;;;;;;;;;;;;;;12073:30;;;;;;;;;;;;;;;;11405:31;;;;;;;;;;-1:-1:-1;11405:31:0;;;;;;;;;;;4637:177;;;;;;;;;;-1:-1:-1;4637:177:0;;;;;:::i;:::-;;:::i;8731:150::-;;;;;;;;;;;;;:::i;33186:84::-;;;;;;;;;;;;;:::i;19727:334::-;;;;;;;;;;-1:-1:-1;19727:334:0;;;;;:::i;:::-;;:::i;20674:427::-;;;;;;;;;;-1:-1:-1;20674:427:0;;;;;:::i;:::-;;:::i;16464:464::-;;;;;;;;;;-1:-1:-1;16464:464:0;;;;;:::i;:::-;;:::i;31218:567::-;;;;;;;;;;-1:-1:-1;31218:567:0;;;;;:::i;:::-;;:::i;35105:1165::-;;;;;;;;;;-1:-1:-1;35105:1165:0;;;;;:::i;:::-;;:::i;11206:43::-;;;;;;;;;;-1:-1:-1;11206:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;10775:27;;;;;;;;;;;;;;;;8517:79;;;;;;;;;;-1:-1:-1;8582:6:0;;-1:-1:-1;;;;;8582:6:0;8517:79;;4308:104;;;;;;;;;;;;;:::i;16936:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20069:353::-;;;;;;;;;;-1:-1:-1;20069:353:0;;;;;:::i;:::-;;:::i;33278:84::-;;;;;;;;;;;;;:::i;6315:482::-;;;;;;;;;;-1:-1:-1;6315:482:0;;;;;:::i;:::-;;:::i;11166:33::-;;;;;;;;;;;;;;;;4822:216;;;;;;;;;;-1:-1:-1;4822:216:0;;;;;:::i;:::-;;:::i;12636:57::-;;;;;;;;;;-1:-1:-1;12636:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33563:861;;;;;;;;;;-1:-1:-1;33563:861:0;;;;;:::i;:::-;;:::i;11365:33::-;;;;;;;;;;-1:-1:-1;11365:33:0;;;;;;;;;;;22093:182;;;;;;;;;;-1:-1:-1;22093:182:0;;;;;:::i;:::-;;:::i;21109:436::-;;;;;;;;;;-1:-1:-1;21109:436:0;;;;;:::i;:::-;;:::i;18531:461::-;;;;;;;;;;-1:-1:-1;18531:461:0;;;;;:::i;:::-;;:::i;11050:30::-;;;;;;;;;;-1:-1:-1;11050:30:0;;;;-1:-1:-1;;;;;11050:30:0;;;11623:39;;;;;;;;;;-1:-1:-1;11623:39:0;;;;;;;;12193:32;;;;;;;;;;;;;;;;19062:428;;;;;;;;;;-1:-1:-1;19062:428:0;;;;;:::i;:::-;;:::i;11671:27::-;;;;;;;;;;;;;;;;18062:461;;;;;;;;;;-1:-1:-1;18062:461:0;;;;;:::i;:::-;;:::i;5046:201::-;;;;;;;;;;-1:-1:-1;5046:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;5212:18:0;;;5180:7;5212:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;5046:201;10969:33;;;;;;;;;;;;;;;;17492:98;;;;;;;;;;;;;:::i;11011:32::-;;;;;;;;;;-1:-1:-1;11011:32:0;;;;-1:-1:-1;;;;;11011:32:0;;;11256:28;;;;;;;;;;-1:-1:-1;11256:28:0;;;;;:::i;:::-;;:::i;11089:37::-;;;;;;;;;;;;;;;;34432:665;;;;;;;;;;-1:-1:-1;34432:665:0;;;;;:::i;:::-;;:::i;11743:30::-;;;;;;;;;;;;;;;;8889:281;;;;;;;;;;-1:-1:-1;8889:281:0;;;;;:::i;:::-;;:::i;31855:185::-;;;;;;;;;;;;;:::i;12035:31::-;;;;;;;;;;;;;;;;12232:34;;;;;;;;;;-1:-1:-1;12232:34:0;;;;;;;;10844:24;;;;;;;;;;;;;;;;12112:34;;;;;;;;;;;;;;;;4200:100;4254:13;4287:5;4280:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4200:100;:::o;5255:210::-;5374:4;5396:39;350:10;5419:7;5428:6;5396:8;:39::i;:::-;-1:-1:-1;5453:4:0;5255:210;;;;:::o;33370:185::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;;;;;;;;;33438:14:::1;::::0;::::1;;33437:15;33429:52;;;::::0;-1:-1:-1;;;33429:52:0;;6117:2:1;33429:52:0::1;::::0;::::1;6099:21:1::0;6156:2;6136:18;;;6129:30;6195:26;6175:18;;;6168:54;6239:18;;33429:52:0::1;5915:348:1::0;33429:52:0::1;33494:14;:21:::0;;-1:-1:-1;;33494:21:0::1;33511:4;33494:21;::::0;;33531:16:::1;::::0;::::1;::::0;33494:14:::1;::::0;33531:16:::1;33370:185::o:0;17237:194::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;17323:13:::1;::::0;::::1;::::0;::::1;;;17322:14;17314:68;;;::::0;-1:-1:-1;;;17314:68:0;;6470:2:1;17314:68:0::1;::::0;::::1;6452:21:1::0;6509:2;6489:18;;;6482:30;6548:34;6528:18;;;6521:62;-1:-1:-1;;;6599:18:1;;;6592:39;6648:19;;17314:68:0::1;6268:405:1::0;17314:68:0::1;17393:9;:30:::0;;-1:-1:-1;;;;;;17393:30:0::1;-1:-1:-1::0;;;;;17393:30:0;;;::::1;::::0;;;::::1;::::0;;17237:194::o;5473:529::-;5613:4;5630:36;5640:6;5648:9;5659:6;5630:9;:36::i;:::-;-1:-1:-1;;;;;5706:19:0;;5679:24;5706:19;;;:11;:19;;;;;;;;350:10;5706:33;;;;;;;;5772:26;;;;5750:116;;;;-1:-1:-1;;;5750:116:0;;6880:2:1;5750:116:0;;;6862:21:1;6919:2;6899:18;;;6892:30;6958:34;6938:18;;;6931:62;-1:-1:-1;;;7009:18:1;;;7002:38;7057:19;;5750:116:0;6678:404:1;5750:116:0;5902:57;5911:6;350:10;5952:6;5933:16;:25;5902:8;:57::i;:::-;-1:-1:-1;5990:4:0;;5473:529;-1:-1:-1;;;;5473:529:0:o;17598:456::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;17735:4:::1;17727;17706:13;4609:12:::0;;;4521:108;17706:13:::1;:17;::::0;17722:1:::1;17706:17;:::i;:::-;17705:26;;;;:::i;:::-;17704:35;;;;:::i;:::-;17694:6;:45;;17672:136;;;::::0;-1:-1:-1;;;17672:136:0;;7816:2:1;17672:136:0::1;::::0;::::1;7798:21:1::0;7855:2;7835:18;;;7828:30;7894:34;7874:18;;;7867:62;-1:-1:-1;;;7945:18:1;;;7938:39;7994:19;;17672:136:0::1;7614:405:1::0;17672:136:0::1;17881:4;17874:3;17853:13;4609:12:::0;;;4521:108;17853:13:::1;:17;::::0;17869:1:::1;17853:17;:::i;:::-;17852:25;;;;:::i;:::-;17851:34;;;;:::i;:::-;17841:6;:44;;17819:135;;;::::0;-1:-1:-1;;;17819:135:0;;8226:2:1;17819:135:0::1;::::0;::::1;8208:21:1::0;8265:2;8245:18;;;8238:30;8304:34;8284:18;;;8277:62;-1:-1:-1;;;8355:18:1;;;8348:39;8404:19;;17819:135:0::1;8024:405:1::0;17819:135:0::1;17980:17;:6:::0;17990::::1;17980:17;:::i;:::-;17965:12;:32:::0;;;18013:33:::1;::::0;1888:25:1;;;18013:33:0::1;::::0;1876:2:1;1861:18;18013:33:0::1;;;;;;;;17598:456:::0;:::o;6010:297::-;350:10;6125:4;6219:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6219:34:0;;;;;;;;;;6125:4;;6147:130;;6197:7;;6219:47;;6256:10;;6219:47;:::i;:::-;6147:8;:130::i;32048:357::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32181:32:0;::::1;32159:120;;;;-1:-1:-1::0;;;32159:120:0::1;;;;;;;:::i;:::-;32290:17;:47:::0;;-1:-1:-1;;;;;;32290:47:0::1;-1:-1:-1::0;;;;;32290:47:0;::::1;::::0;;::::1;::::0;;;32353:44:::1;::::0;::::1;::::0;-1:-1:-1;;32353:44:0::1;32048:357:::0;:::o;32785:349::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;32890:18:::1;;32862:24;32880:4;32862:9;:24::i;:::-;:46;;32840:160;;;::::0;;-1:-1:-1;;;32840:160:0;;9176:2:1;32840:160:0::1;::::0;::::1;9158:21:1::0;9195:18;;;9188:30;;;;9254:34;9234:18;;;9227:62;9325:34;9305:18;;;9298:62;9377:19;;32840:160:0::1;8974:428:1::0;32840:160:0::1;33011:8;:15:::0;;-1:-1:-1;;;;33011:15:0::1;-1:-1:-1::0;;;33011:15:0::1;::::0;;33037:10:::1;:8;:10::i;:::-;33058:8;:16:::0;;-1:-1:-1;;;;33058:16:0::1;::::0;;33090:36:::1;::::0;33110:15:::1;1888:25:1::0;;33090:36:0::1;::::0;1876:2:1;1861:18;33090:36:0::1;;;;;;;32785:349::o:0;17048:181::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17129:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;::::1;;17121:62;;;::::0;-1:-1:-1;;;17121:62:0;;9609:2:1;17121:62:0::1;::::0;::::1;9591:21:1::0;9648:2;9628:18;;;9621:30;9687:32;9667:18;;;9660:60;9737:18;;17121:62:0::1;9407:354:1::0;17121:62:0::1;-1:-1:-1::0;;;;;17194:19:0::1;17216:5;17194:19:::0;;;:11:::1;:19;::::0;;;;:27;;-1:-1:-1;;17194:27:0::1;::::0;;17048:181::o;21553:532::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;21626:25:::1;::::0;21607:16:::1;:44:::0;;;21680:24:::1;::::0;21662:15:::1;:42:::0;;;21732:23:::1;::::0;21715:14:::1;:40:::0;;;21732:23;21781:34:::1;::::0;21680:24;21781:34:::1;:::i;:::-;:51;;;;:::i;:::-;21766:12;:66:::0;21865:25:::1;::::0;21845:17:::1;:45:::0;;;21920:24:::1;::::0;21901:16:::1;:43:::0;;;21973:23:::1;::::0;21955:15:::1;:41:::0;;;21973:23;22023:36:::1;::::0;21920:24;22023:36:::1;:::i;:::-;:54;;;;:::i;:::-;22007:13;:70:::0;21553:532::o;32413:320::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32519:30:0;::::1;32497:118;;;;-1:-1:-1::0;;;32497:118:0::1;;;;;;;:::i;:::-;32626:15;:43:::0;;-1:-1:-1;;;;;;32626:43:0::1;-1:-1:-1::0;;;;;32626:43:0;::::1;::::0;;::::1;::::0;;;32685:40:::1;::::0;::::1;::::0;-1:-1:-1;;32685:40:0::1;32413:320:::0;:::o;4637:177::-;-1:-1:-1;;;;;4788:18:0;4756:7;4788:18;;;;;;;;;;;;4637:177::o;8731:150::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;8824:6:::1;::::0;8803:40:::1;::::0;8840:1:::1;::::0;-1:-1:-1;;;;;8824:6:0::1;::::0;8803:40:::1;::::0;8840:1;;8803:40:::1;8854:6;:19:::0;;-1:-1:-1;;;;;;8854:19:0::1;::::0;;8731:150::o;33186:84::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;33240:14:::1;:22:::0;;-1:-1:-1;;33240:22:0::1;::::0;;33186:84::o;19727:334::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;19847:4:::1;19842:155;;19904:6;::::0;-1:-1:-1;;;;;19904:6:0;;::::1;19894:16:::0;;::::1;::::0;19868:117:::1;;;::::0;-1:-1:-1;;;19868:117:0;;9968:2:1;19868:117:0::1;::::0;::::1;9950:21:1::0;10007:2;9987:18;;;9980:30;10046:34;10026:18;;;10019:62;-1:-1:-1;;;10097:18:1;;;10090:37;10144:19;;19868:117:0::1;9766:403:1::0;19868:117:0::1;-1:-1:-1::0;;;;;20007:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;20007:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;19727:334::o;20674:427::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;20830:16:::1;:33:::0;;;20874:15:::1;:31:::0;;;20916:14:::1;:29:::0;;;20933:12;20971:34:::1;20892:13:::0;20849:14;20971:34:::1;:::i;:::-;:51;;;;:::i;:::-;20956:12;:66:::0;;;21057:2:::1;-1:-1:-1::0;21041:18:0::1;21033:60;;;::::0;-1:-1:-1;;;21033:60:0;;10376:2:1;21033:60:0::1;::::0;::::1;10358:21:1::0;10415:2;10395:18;;;10388:30;10454:31;10434:18;;;10427:59;10503:18;;21033:60:0::1;10174:353:1::0;21033:60:0::1;20674:427:::0;;;:::o;16464:464::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;16552:13:::1;::::0;::::1;::::0;::::1;;;16551:14;16543:50;;;::::0;-1:-1:-1;;;16543:50:0;;10734:2:1;16543:50:0::1;::::0;::::1;10716:21:1::0;10773:2;10753:18;;;10746:30;10812:25;10792:18;;;10785:53;10855:18;;16543:50:0::1;10532:347:1::0;16543:50:0::1;16646:2;16626:16;:22;;16604:111;;;;-1:-1:-1::0;;;16604:111:0::1;;;;;;;:::i;:::-;16726:13;:20:::0;;-1:-1:-1;;16757:18:0;;;;;16807:12:::1;16786:18;:33:::0;;;16851:37:::1;::::0;16872:16;;16851:37:::1;:::i;:::-;16830:18;:58:::0;16904:16:::1;::::0;::::1;::::0;;;::::1;16464:464:::0;:::o;31218:567::-;8644:6;;31332:10;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31368:20:0;::::1;31360:59;;;::::0;-1:-1:-1;;;31360:59:0;;11494:2:1;31360:59:0::1;::::0;::::1;11476:21:1::0;11533:2;11513:18;;;11506:30;11572:28;11552:18;;;11545:56;11618:18;;31360:59:0::1;11292:350:1::0;31360:59:0::1;-1:-1:-1::0;;;;;31452:23:0;::::1;31470:4;31452:23;;::::0;:41:::1;;-1:-1:-1::0;31480:13:0::1;::::0;::::1;::::0;::::1;;;31479:14;31452:41;31430:143;;;::::0;-1:-1:-1;;;31430:143:0;;11849:2:1;31430:143:0::1;::::0;::::1;11831:21:1::0;11888:2;11868:18;;;11861:30;11927:34;11907:18;;;11900:62;-1:-1:-1;;;11978:18:1;;;11971:50;12038:19;;31430:143:0::1;11647:416:1::0;31430:143:0::1;31611:39;::::0;-1:-1:-1;;;31611:39:0;;31644:4:::1;31611:39;::::0;::::1;780:51:1::0;31584:24:0::1;::::0;-1:-1:-1;;;;;31611:24:0;::::1;::::0;::::1;::::0;753:18:1;;31611:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31669:46;::::0;-1:-1:-1;;;31669:46:0;;-1:-1:-1;;;;;12449:32:1;;;31669:46:0::1;::::0;::::1;12431:51:1::0;12498:18;;;12491:34;;;31584:66:0;;-1:-1:-1;31669:23:0;;::::1;::::0;::::1;::::0;12404:18:1;;31669:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31731;::::0;;-1:-1:-1;;;;;12449:32:1;;12431:51;;12513:2;12498:18;;12491:34;;;31661:54:0;;-1:-1:-1;31731:46:0::1;::::0;12404:18:1;31731:46:0::1;;;;;;;31349:436;31218:567:::0;;;;:::o;35105:1165::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;35186:13:::1;::::0;::::1;::::0;::::1;;;35185:14;35177:70;;;;-1:-1:-1::0;;;35177:70:0::1;;;;;;;:::i;:::-;35299:2;35280:16;:21;35258:110;;;;-1:-1:-1::0;;;35258:110:0::1;;;;;;;:::i;:::-;35416:13;:20:::0;;-1:-1:-1;;35447:18:0;;;;;35497:12:::1;35476:18;:33:::0;;;35541:37:::1;::::0;35562:16;;35541:37:::1;:::i;:::-;35520:18;:58:::0;35594:16:::1;::::0;::::1;::::0;;;::::1;35699:1;35675:21;:25;35653:110;;;;-1:-1:-1::0;;;35653:110:0::1;;;;;;;:::i;:::-;35823:1;35796:24;35814:4;35796:9;:24::i;:::-;:28;35774:116;;;::::0;-1:-1:-1;;;35774:116:0;;13804:2:1;35774:116:0::1;::::0;::::1;13786:21:1::0;13843:2;13823:18;;;13816:30;13882:34;13862:18;;;13855:62;-1:-1:-1;;;13933:18:1;;;13926:36;13979:19;;35774:116:0::1;13602:402:1::0;35774:116:0::1;35935:9;::::0;35903:69:::1;::::0;35920:4:::1;::::0;-1:-1:-1;;;;;35935:9:0::1;35947:24;35920:4:::0;35947:9:::1;:24::i;35903:69::-;35985:9;::::0;-1:-1:-1;;;;;35985:9:0::1;:25;36018:21;36063:4;36083:24;36063:4:::0;36083:9:::1;:24::i;:::-;36122:1;36165::::0;36216:4:::1;36236:15;35985:277;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;35105:1165:::0;:::o;4308:104::-;4364:13;4397:7;4390:14;;;;;:::i;16936:104::-;16985:16;17021:11;17014:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17014:18:0;;;;;;;;;;;;;;;;;;;;;;16936:104;:::o;20069:353::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;20215:6:::1;::::0;-1:-1:-1;;;;;20215:6:0;;::::1;20207:14:::0;;::::1;::::0;20185:121:::1;;;::::0;-1:-1:-1;;;20185:121:0;;15134:2:1;20185:121:0::1;::::0;::::1;15116:21:1::0;15173:2;15153:18;;;15146:30;15212:34;15192:18;;;15185:62;15283:27;15263:18;;;15256:55;15328:19;;20185:121:0::1;14932:421:1::0;20185:121:0::1;20317:41;20346:4;20352:5;20317:28;:41::i;:::-;20374:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;20374:40:0;::::1;::::0;::::1;::::0;;;::::1;20069:353:::0;;:::o;33278:84::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;33333:14:::1;:21:::0;;-1:-1:-1;;33333:21:0::1;33350:4;33333:21;::::0;;33278:84::o;6315:482::-;350:10;6435:4;6484:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6484:34:0;;;;;;;;;;6551:35;;;;6529:122;;;;-1:-1:-1;;;6529:122:0;;15560:2:1;6529:122:0;;;15542:21:1;15599:2;15579:18;;;15572:30;15638:34;15618:18;;;15611:62;-1:-1:-1;;;15689:18:1;;;15682:35;15734:19;;6529:122:0;15358:401:1;6529:122:0;6687:67;350:10;6710:7;6738:15;6719:16;:34;6687:8;:67::i;:::-;-1:-1:-1;6785:4:0;;6315:482;-1:-1:-1;;;6315:482:0:o;4822:216::-;4944:4;4966:42;350:10;4990:9;5001:6;4966:9;:42::i;33563:861::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;33635:12:::1;33627:56;;;::::0;-1:-1:-1;;;33627:56:0;;15966:2:1;33627:56:0::1;::::0;::::1;15948:21:1::0;16005:2;15985:18;;;15978:30;16044:33;16024:18;;;16017:61;16095:18;;33627:56:0::1;15764:355:1::0;33627:56:0::1;33703:13;::::0;::::1;::::0;::::1;;;33702:14;33694:70;;;;-1:-1:-1::0;;;33694:70:0::1;;;;;;;:::i;:::-;33853:1;33829:21;:25;33807:110;;;;-1:-1:-1::0;;;33807:110:0::1;;;;;;;:::i;22093:182::-:0;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22178:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;22178:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;22233:34;;1438:41:1;;;22233:34:0::1;::::0;1411:18:1;22233:34:0::1;;;;;;;22093:182:::0;;:::o;21109:436::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;21266:17:::1;:34:::0;;;21311:16:::1;:32:::0;;;21354:15:::1;:30:::0;;;21372:12;21411:36:::1;21330:13:::0;21286:14;21411:36:::1;:::i;:::-;:54;;;;:::i;:::-;21395:13;:70:::0;;;21501:2:::1;-1:-1:-1::0;21484:19:0::1;21476:61;;;::::0;-1:-1:-1;;;21476:61:0;;10376:2:1;21476:61:0::1;::::0;::::1;10358:21:1::0;10415:2;10395:18;;;10388:30;10454:31;10434:18;;;10427:59;10503:18;;21476:61:0::1;10174:353:1::0;18531:461:0;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;18671:4:::1;18663;18642:13;4609:12:::0;;;4521:108;18642:13:::1;:17;::::0;18658:1:::1;18642:17;:::i;:::-;18641:26;;;;:::i;:::-;18640:35;;;;:::i;:::-;18630:6;:45;;18608:139;;;::::0;-1:-1:-1;;;18608:139:0;;16326:2:1;18608:139:0::1;::::0;::::1;16308:21:1::0;16365:2;16345:18;;;16338:30;16404:34;16384:18;;;16377:62;-1:-1:-1;;;16455:18:1;;;16448:42;16507:19;;18608:139:0::1;16124:408:1::0;18608:139:0::1;18820:4;18813:3;18792:13;4609:12:::0;;;4521:108;18792:13:::1;:17;::::0;18808:1:::1;18792:17;:::i;:::-;18791:25;;;;:::i;:::-;18790:34;;;;:::i;:::-;18780:6;:44;;18758:137;;;::::0;-1:-1:-1;;;18758:137:0;;16739:2:1;18758:137:0::1;::::0;::::1;16721:21:1::0;16778:2;16758:18;;;16751:30;16817:34;16797:18;;;16790:62;-1:-1:-1;;;16868:18:1;;;16861:41;16919:19;;18758:137:0::1;16537:407:1::0;18758:137:0::1;18918:17;:6:::0;18928::::1;18918:17;:::i;:::-;18906:9;:29:::0;;;18951:33:::1;::::0;1888:25:1;;;18951:33:0::1;::::0;1876:2:1;1861:18;18951:33:0::1;1742:177:1::0;19062:428:0;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;19202:6:::1;19181:13;4609:12:::0;;;4521:108;19181:13:::1;:17;::::0;19197:1:::1;19181:17;:::i;:::-;19180:28;;;;:::i;:::-;19167:9;:41;;19145:144;;;::::0;-1:-1:-1;;;19145:144:0;;17151:2:1;19145:144:0::1;::::0;::::1;17133:21:1::0;17190:2;17170:18;;;17163:30;17229:34;17209:18;;;17202:62;-1:-1:-1;;;17280:18:1;;;17273:51;17341:19;;19145:144:0::1;16949:417:1::0;19145:144:0::1;19357:4;19336:13;4609:12:::0;;;4521:108;19336:13:::1;:17;::::0;19352:1:::1;19336:17;:::i;:::-;19335:26;;;;:::i;:::-;19322:9;:39;;19300:141;;;::::0;-1:-1:-1;;;19300:141:0;;17573:2:1;19300:141:0::1;::::0;::::1;17555:21:1::0;17612:2;17592:18;;;17585:30;17651:34;17631:18;;;17624:62;-1:-1:-1;;;17702:18:1;;;17695:50;17762:19;;19300:141:0::1;17371:416:1::0;19300:141:0::1;19452:18;:30:::0;19062:428::o;18062:461::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;18200:4:::1;18192;18171:13;4609:12:::0;;;4521:108;18171:13:::1;:17;::::0;18187:1:::1;18171:17;:::i;:::-;18170:26;;;;:::i;:::-;18169:35;;;;:::i;:::-;18159:6;:45;;18137:137;;;::::0;-1:-1:-1;;;18137:137:0;;17994:2:1;18137:137:0::1;::::0;::::1;17976:21:1::0;18033:2;18013:18;;;18006:30;18072:34;18052:18;;;18045:62;-1:-1:-1;;;18123:18:1;;;18116:40;18173:19;;18137:137:0::1;17792:406:1::0;18137:137:0::1;18347:4;18340:3;18319:13;4609:12:::0;;;4521:108;18319:13:::1;:17;::::0;18335:1:::1;18319:17;:::i;:::-;18318:25;;;;:::i;:::-;18317:34;;;;:::i;:::-;18307:6;:44;;18285:135;;;::::0;-1:-1:-1;;;18285:135:0;;18405:2:1;18285:135:0::1;::::0;::::1;18387:21:1::0;18444:2;18424:18;;;18417:30;18483:34;18463:18;;;18456:62;-1:-1:-1;;;18534:18:1;;;18527:39;18583:19;;18285:135:0::1;18203:405:1::0;18285:135:0::1;18447:17;:6:::0;18457::::1;18447:17;:::i;:::-;18431:13;:33:::0;;;18480:35:::1;::::0;1888:25:1;;;18480:35:0::1;::::0;1876:2:1;1861:18;18480:35:0::1;1742:177:1::0;17492:98:0;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;17554:20:::1;:28:::0;;-1:-1:-1;;17554:28:0::1;::::0;;17492:98::o;11256:28::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11256:28:0;;-1:-1:-1;11256:28:0;:::o;34432:665::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;34524:6:::1;::::0;34517:39:::1;::::0;-1:-1:-1;;;34517:39:0;;34550:4:::1;34517:39;::::0;::::1;780:51:1::0;34497:17:0::1;::::0;-1:-1:-1;;;;;34524:6:0::1;::::0;34517:24:::1;::::0;753:18:1;;34517:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34497:59;;34589:1;34577:9;:13;34569:50;;;::::0;-1:-1:-1;;;34569:50:0;;18815:2:1;34569:50:0::1;::::0;::::1;18797:21:1::0;18854:2;18834:18;;;18827:30;18893:26;18873:18;;;18866:54;18937:18;;34569:50:0::1;18613:348:1::0;34569:50:0::1;34632:16;34675:5;34652:19;34664:7:::0;34652:9;:19:::1;:::i;:::-;34651:29;;;;:::i;:::-;34767:6;::::0;34791:9:::1;::::0;34760:52:::1;::::0;-1:-1:-1;;;34760:52:0;;-1:-1:-1;;;;;34791:9:0;;::::1;34760:52;::::0;::::1;12431:51:1::0;12498:18;;;12491:34;;;34632:48:0;;-1:-1:-1;34767:6:0::1;::::0;34760:22:::1;::::0;12404:18:1;;34760:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;34858:9:0::1;::::0;:231:::1;::::0;-1:-1:-1;;;34858:231:0;;-1:-1:-1;;;;;34858:9:0;;::::1;::::0;:28:::1;::::0;:231:::1;::::0;34909:4:::1;::::0;34929:8;;34858:9;;;;35038:10:::1;::::0;35063:15:::1;::::0;34858:231:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34486:611;;34432:665:::0;:::o;8889:281::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8992:22:0;::::1;8970:110;;;::::0;-1:-1:-1;;;8970:110:0;;20030:2:1;8970:110:0::1;::::0;::::1;20012:21:1::0;20069:2;20049:18;;;20042:30;20108:34;20088:18;;;20081:62;-1:-1:-1;;;20159:18:1;;;20152:36;20205:19;;8970:110:0::1;19828:402:1::0;8970:110:0::1;9117:6;::::0;9096:38:::1;::::0;-1:-1:-1;;;;;9096:38:0;;::::1;::::0;9117:6:::1;::::0;9096:38:::1;::::0;9117:6:::1;::::0;9096:38:::1;9145:6;:17:::0;;-1:-1:-1;;;;;;9145:17:0::1;-1:-1:-1::0;;;;;9145:17:0;;;::::1;::::0;;;::::1;::::0;;8889:281::o;31855:185::-;8644:6;;-1:-1:-1;;;;;8644:6:0;350:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;31950:82:::1;::::0;31913:12:::1;::::0;31958:10:::1;::::0;31982:21:::1;::::0;31913:12;31950:82;31913:12;31950:82;31982:21;31958:10;31950:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7786:380:::0;-1:-1:-1;;;;;7922:19:0;;7914:68;;;;-1:-1:-1;;;7914:68:0;;20647:2:1;7914:68:0;;;20629:21:1;20686:2;20666:18;;;20659:30;20725:34;20705:18;;;20698:62;-1:-1:-1;;;20776:18:1;;;20769:34;20820:19;;7914:68:0;20445:400:1;7914:68:0;-1:-1:-1;;;;;8001:21:0;;7993:68;;;;-1:-1:-1;;;7993:68:0;;21052:2:1;7993:68:0;;;21034:21:1;21091:2;21071:18;;;21064:30;21130:34;21110:18;;;21103:62;-1:-1:-1;;;21181:18:1;;;21174:32;21223:19;;7993:68:0;20850:398:1;7993:68:0;-1:-1:-1;;;;;8074:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;8126:32;;1888:25:1;;;8126:32:0;;1861:18:1;8126:32:0;;;;;;;7786:380;;;:::o;22283:6122::-;-1:-1:-1;;;;;22415:18:0;;22407:68;;;;-1:-1:-1;;;22407:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22494:16:0;;22486:64;;;;-1:-1:-1;;;22486:64:0;;;;;;;:::i;:::-;22578:1;22569:6;:10;22561:52;;;;-1:-1:-1;;;22561:52:0;;22265:2:1;22561:52:0;;;22247:21:1;22304:2;22284:18;;;22277:30;22343:31;22323:18;;;22316:59;22392:18;;22561:52:0;22063:353:1;22561:52:0;22631:13;;;;;;;22626:183;;-1:-1:-1;;;;;22687:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;22716:23:0;;;;;;:19;:23;;;;;;;;22687:52;22661:136;;;;-1:-1:-1;;;22661:136:0;;22623:2:1;22661:136:0;;;22605:21:1;22662:2;22642:18;;;22635:30;-1:-1:-1;;;22681:18:1;;;22674:52;22743:18;;22661:136:0;22421:346:1;22661:136:0;28508:18;;28493:12;:33;22825:26;:43;;;;-1:-1:-1;22855:13:0;;;;;;;22825:43;22821:268;;;-1:-1:-1;;;;;22912:17:0;;;;;;:11;:17;;;;;;;;22911:18;;:35;;-1:-1:-1;8582:6:0;;-1:-1:-1;;;;;22933:13:0;;;8582:6;;22933:13;22911:35;:60;;;-1:-1:-1;;;;;;22950:21:0;;22964:6;22950:21;22911:60;22885:192;;;;-1:-1:-1;;;22885:192:0;;22974:2:1;22885:192:0;;;22956:21:1;23013:2;22993:18;;;22986:30;23052:34;23032:18;;;23025:62;23123:34;23103:18;;;23096:62;-1:-1:-1;;;23174:19:1;;;23167:37;23221:19;;22885:192:0;22772:474:1;22885:192:0;23105:14;;;;23101:2217;;;8582:6;;-1:-1:-1;;;;;23158:15:0;;;8582:6;;23158:15;;;;:49;;-1:-1:-1;8582:6:0;;-1:-1:-1;;;;;23194:13:0;;;8582:6;;23194:13;;23158:49;:91;;;;-1:-1:-1;;;;;;23228:21:0;;23242:6;23228:21;;23158:91;:138;;;;-1:-1:-1;;;;;;23271:25:0;;;;;;:19;:25;;;;;;;;23270:26;23158:138;:183;;;;-1:-1:-1;;;;;;23318:23:0;;;;;;:19;:23;;;;;;;;23317:24;23158:183;23136:2171;;;23380:20;;;;23376:692;;;23443:9;;-1:-1:-1;;;;;23429:24:0;;;23443:9;;23429:24;;;;:49;;-1:-1:-1;23471:6:0;;-1:-1:-1;;;;;23457:21:0;;;23471:6;;23457:21;;23429:49;23425:624;;;23620:16;23635:1;23620:12;:16;:::i;:::-;23574:9;23545:39;;;;:28;:39;;;;;;:91;:212;;;;-1:-1:-1;23741:16:0;23756:1;23741:12;:16;:::i;:::-;-1:-1:-1;;;;;23673:32:0;;;;;;:28;:32;;;;;;:84;23545:212;23507:363;;;;-1:-1:-1;;;23507:363:0;;23583:2:1;23507:363:0;;;23565:21:1;23622:2;23602:18;;;23595:30;23661:34;23641:18;;;23634:62;-1:-1:-1;;;23712:18:1;;;23705:51;23773:19;;23507:363:0;23381:417:1;23507:363:0;23926:9;23897:39;;;;:28;:39;;;;;;23939:12;23897:54;;;;-1:-1:-1;;;;;23978:32:0;;;;;;:47;23425:624;-1:-1:-1;;;;;24142:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;24199:35:0;;;;;;:31;:35;;;;;;;;24198:36;24142:92;24116:1176;;;24321:12;;24311:6;:22;;24277:148;;;;-1:-1:-1;;;24277:148:0;;24005:2:1;24277:148:0;;;23987:21:1;24044:2;24024:18;;;24017:30;24083:34;24063:18;;;24056:62;-1:-1:-1;;;24134:18:1;;;24127:38;24182:19;;24277:148:0;23803:404:1;24277:148:0;24508:9;;24491:13;24501:2;24491:9;:13::i;:::-;24482:22;;:6;:22;:::i;:::-;:35;;24448:140;;;;-1:-1:-1;;;24448:140:0;;24414:2:1;24448:140:0;;;24396:21:1;24453:2;24433:18;;;24426:30;-1:-1:-1;;;24472:18:1;;;24465:49;24531:18;;24448:140:0;24212:343:1;24448:140:0;24116:1176;;;-1:-1:-1;;;;;24686:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;24741:37:0;;;;;;:31;:37;;;;;;;;24740:38;24686:92;24660:632;;;24829:14;;;;24821:46;;;;-1:-1:-1;;;24821:46:0;;24762:2:1;24821:46:0;;;24744:21:1;24801:2;24781:18;;;24774:30;-1:-1:-1;;;24820:18:1;;;24813:49;24879:18;;24821:46:0;24560:343:1;24821:46:0;24934:13;;24924:6;:23;;24890:151;;;;-1:-1:-1;;;24890:151:0;;25110:2:1;24890:151:0;;;25092:21:1;25149:2;25129:18;;;25122:30;25188:34;25168:18;;;25161:62;-1:-1:-1;;;25239:18:1;;;25232:40;25289:19;;24890:151:0;24908:406:1;24660:632:0;-1:-1:-1;;;;;25072:35:0;;;;;;:31;:35;;;;;;;;25067:225;;25192:9;;25175:13;25185:2;25175:9;:13::i;:::-;25166:22;;:6;:22;:::i;:::-;:35;;25132:140;;;;-1:-1:-1;;;25132:140:0;;24414:2:1;25132:140:0;;;24396:21:1;24453:2;24433:18;;;24426:30;-1:-1:-1;;;24472:18:1;;;24465:49;24531:18;;25132:140:0;24212:343:1;25132:140:0;25330:28;25361:24;25379:4;25361:9;:24::i;:::-;25437:18;;25330:55;;-1:-1:-1;25413:42:0;;;;;;;25486:22;;-1:-1:-1;25497:11:0;;;;;;;25486:22;:35;;;;-1:-1:-1;25513:8:0;;-1:-1:-1;;;25513:8:0;;;;25512:9;25486:35;:68;;;;-1:-1:-1;;;;;;25525:29:0;;;;;;:25;:29;;;;;;;;25486:68;25468:196;;;25581:8;:15;;-1:-1:-1;;;;25581:15:0;-1:-1:-1;;;25581:15:0;;;25611:10;:8;:10::i;:::-;25636:8;:16;;-1:-1:-1;;;;25636:16:0;;;25468:196;-1:-1:-1;;;;;25795:25:0;;25676:12;25795:25;;;:19;:25;;;;;;25691:4;;25795:25;;;:52;;-1:-1:-1;;;;;;25824:23:0;;;;;;:19;:23;;;;;;;;25795:52;25791:100;;;-1:-1:-1;25874:5:0;25791:100;25903:12;26008:7;26004:2348;;;28508:18;;28493:12;:33;26091:152;;;;26167:8;26152:12;;:23;;;;:::i;:::-;26142:6;:33;;:100;;;;;26230:12;26204:18;;26225:1;26204:22;;;;:::i;:::-;:38;;26142:100;26090:206;;;;-1:-1:-1;;;;;;26265:31:0;;;;;;:25;:31;;;;;;;;26090:206;:257;;;;-1:-1:-1;;;;;;26318:29:0;;;;;;:25;:29;;;;;;;;26317:30;26090:257;:302;;;;-1:-1:-1;;;;;;26369:23:0;;;;;;:19;:23;;;;;;;;26368:24;26090:302;:339;;;;;26428:1;26413:12;;:16;26090:339;26068:2135;;;28508:18;;28493:12;:33;26464:332;;26775:1;26759:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;26464:332:0;-1:-1:-1;;;;;26821:15:0;;;;;;:11;:15;;;;;;;;26816:216;;-1:-1:-1;;;;;26861:15:0;;;;;;:11;:15;;;;;:22;;-1:-1:-1;;26861:22:0;26879:4;26861:22;;;;;;26906:10;:15;;26879:4;;26906:10;;:15;;26879:4;;26906:15;:::i;:::-;;;;-1:-1:-1;;26944:11:0;:20;;;;;;;-1:-1:-1;26944:20:0;;;;;;;;-1:-1:-1;;;;;;26944:20:0;-1:-1:-1;;;;;26944:20:0;;;;;;;;26992;;780:51:1;;;26992:20:0;;768:2:1;753:18;26992:20:0;;;;;;;26816:216;27075:3;27060:11;:6;27069:2;27060:11;:::i;:::-;27059:19;;;;:::i;:::-;27052:26;;27146:12;;27127:15;;27120:4;:22;;;;:::i;:::-;27119:39;;;;:::i;:::-;27097:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;27228:12:0;;27208:16;;27201:23;;:4;:23;:::i;:::-;27200:40;;;;:::i;:::-;27177:19;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;27306:12:0;;27288:14;;27281:21;;:4;:21;:::i;:::-;27280:38;;;;:::i;:::-;27259:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;26068:2135:0;;-1:-1:-1;26068:2135:0;;-1:-1:-1;;;;;27381:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;27430:1;27414:13;;:17;27381:50;27377:826;;;27486:3;27469:13;;27460:6;:22;;;;:::i;:::-;27459:30;;;;:::i;:::-;27452:37;;27558:13;;27538:16;;27531:4;:23;;;;:::i;:::-;27530:41;;;;:::i;:::-;27508:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;27684:13:0;;27642:17;;27635:24;;:4;:24;:::i;:::-;27634:63;;;;:::i;:::-;27590:19;;:107;;;;;;;:::i;:::-;;;;-1:-1:-1;;27764:13:0;;27745:15;;27738:22;;:4;:22;:::i;27377:826::-;-1:-1:-1;;;;;27839:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;27889:1;27874:12;;:16;27839:51;27835:368;;;27944:3;27928:12;;27919:6;:21;;;;:::i;:::-;27918:29;;;;:::i;:::-;27911:36;;28015:12;;27996:15;;27989:4;:22;;;;:::i;:::-;27988:39;;;;:::i;:::-;27966:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;28097:12:0;;28077:16;;28070:23;;:4;:23;:::i;:::-;28069:40;;;;:::i;:::-;28046:19;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;28175:12:0;;28157:14;;28150:21;;:4;:21;:::i;:::-;28149:38;;;;:::i;:::-;28128:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;27835:368:0;28223:8;;28219:91;;28252:42;28268:4;28282;28289;28252:15;:42::i;:::-;28326:14;28336:4;28326:14;;:::i;:::-;;;26004:2348;28364:33;28380:4;28386:2;28390:6;28364:15;:33::i;:::-;22396:6009;;;;22283:6122;;;:::o;29638:1572::-;29677:23;29703:24;29721:4;29703:9;:24::i;:::-;29677:50;;29738:25;29835:17;;29800:19;;29766:18;;:53;;;;:::i;:::-;:86;;;;:::i;:::-;29738:114;-1:-1:-1;29869:20:0;;;:46;;-1:-1:-1;29893:22:0;;29869:46;29865:85;;;29932:7;;29638:1572::o;29865:85::-;29984:18;;:23;;30005:2;29984:23;:::i;:::-;29966:15;:41;29962:115;;;30042:18;;:23;;30063:2;30042:23;:::i;:::-;30024:41;;29962:115;30089:12;30163:23;30276:1;30243:17;30208:18;;30190:15;:36;;;;:::i;:::-;30189:71;;;;:::i;:::-;:88;;;;:::i;:::-;30163:114;-1:-1:-1;30290:51:0;30307:33;30163:114;30307:15;:33;:::i;:::-;30290:16;:51::i;:::-;30555:18;;30375:21;;;;30354:18;;30555:22;;30576:1;;30555:22;:::i;:::-;30534:44;;:17;:44;:::i;:::-;30497:19;;30484:32;;:10;:32;:::i;:::-;30483:96;;;;:::i;:::-;30456:123;;30590:21;30705:1;30684:18;;:22;;;;:::i;:::-;30663:44;;:17;:44;:::i;:::-;30628:17;;30615:30;;:10;:30;:::i;:::-;30614:94;;;;:::i;:::-;30590:118;-1:-1:-1;30740:32:0;30590:118;30740:16;:32;:::i;:::-;30721:51;;;;:::i;:::-;30806:1;30785:18;:22;;;30818:19;:23;;;30852:17;:21;30721:51;-1:-1:-1;30890:19:0;;;;;:42;;;30931:1;30913:15;:19;30890:42;30886:121;;;30949:46;30962:15;30979;30949:12;:46::i;:::-;31041:15;;31033:55;;-1:-1:-1;;;;;31041:15:0;;;;31070:13;;31033:55;;;;31070:13;31041:15;31033:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31121:17:0;;31113:89;;31019:69;;-1:-1:-1;;;;;;31121:17:0;;31166:21;;31113:89;;;;31166:21;31121:17;31113:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;29638:1572:0:o;20430:236::-;-1:-1:-1;;;;;20513:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;20513:39:0;;;;;;;20563;20513:31;:39;20563:26;:39::i;6805:651::-;-1:-1:-1;;;;;6945:20:0;;6937:70;;;;-1:-1:-1;;;6937:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7026:23:0;;7018:71;;;;-1:-1:-1;;;7018:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7126:17:0;;7102:21;7126:17;;;;;;;;;;;7176:23;;;;7154:111;;;;-1:-1:-1;;;7154:111:0;;25521:2:1;7154:111:0;;;25503:21:1;25560:2;25540:18;;;25533:30;25599:34;25579:18;;;25572:62;-1:-1:-1;;;25650:18:1;;;25643:36;25696:19;;7154:111:0;25319:402:1;7154:111:0;-1:-1:-1;;;;;7301:17:0;;;:9;:17;;;;;;;;;;;7321:22;;;7301:42;;7365:20;;;;;;;;:30;;7337:6;;7301:9;7365:30;;7337:6;;7365:30;:::i;:::-;;;;;;;;7430:9;-1:-1:-1;;;;;7413:35:0;7422:6;-1:-1:-1;;;;;7413:35:0;;7441:6;7413:35;;;;1888:25:1;;1876:2;1861:18;;1742:177;7413:35:0;;;;;;;;6926:530;6805:651;;;:::o;28542:571::-;28692:16;;;28706:1;28692:16;;;;;;;;28668:21;;28692:16;;;;;;;;;;-1:-1:-1;28692:16:0;28668:40;;28737:4;28719;28724:1;28719:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28719:23:0;;;:7;;;;;;;;;;:23;;;;28763:9;;:16;;;-1:-1:-1;;;28763:16:0;;;;:9;;;;;:14;;:16;;;;;28719:7;;28763:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28753:4;28758:1;28753:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28753:26:0;;;:7;;;;;;;;;:26;28824:9;;28792:56;;28809:4;;28824:9;28836:11;28792:8;:56::i;:::-;28887:9;;:218;;-1:-1:-1;;;28887:218:0;;-1:-1:-1;;;;;28887:9:0;;;;:60;;:218;;28962:11;;28887:9;;29032:4;;29059;;29079:15;;28887:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28597:516;28542:571;:::o;29121:509::-;29301:9;;29269:56;;29286:4;;-1:-1:-1;;;;;29301:9:0;29313:11;29269:8;:56::i;:::-;29368:9;;:254;;-1:-1:-1;;;29368:254:0;;-1:-1:-1;;;;;29368:9:0;;;;:25;;29401:9;;29368:254;;29434:4;;29454:11;;29368:9;;;;29574:6;;29596:15;;29368:254;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19498:221::-;-1:-1:-1;;;;;19600:39:0;;;;;;:31;:39;;;;;;;;;:52;;-1:-1:-1;;19600:52:0;;;;;;;;;;19668:43;;27001:51:1;;;27068:18;;;27061:50;19668:43:0;;26974:18:1;19668:43:0;;;;;;;19498:221;;:::o;14:597: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;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;842:131::-;-1:-1:-1;;;;;917:31:1;;907:42;;897:70;;963:1;960;953:12;897:70;842:131;:::o;978:315::-;1046:6;1054;1107:2;1095:9;1086:7;1082:23;1078:32;1075:52;;;1123:1;1120;1113:12;1075:52;1162:9;1149:23;1181:31;1206:5;1181:31;:::i;:::-;1231:5;1283:2;1268:18;;;;1255:32;;-1:-1:-1;;;978:315:1:o;1490:247::-;1549:6;1602:2;1590:9;1581:7;1577:23;1573:32;1570:52;;;1618:1;1615;1608:12;1570:52;1657:9;1644:23;1676:31;1701:5;1676:31;:::i;:::-;1726:5;1490:247;-1:-1:-1;;;1490:247:1:o;1924:456::-;2001:6;2009;2017;2070:2;2058:9;2049:7;2045:23;2041:32;2038:52;;;2086:1;2083;2076:12;2038:52;2125:9;2112:23;2144:31;2169:5;2144:31;:::i;:::-;2194:5;-1:-1:-1;2251:2:1;2236:18;;2223:32;2264:33;2223:32;2264:33;:::i;:::-;1924:456;;2316:7;;-1:-1:-1;;;2370:2:1;2355:18;;;;2342:32;;1924:456::o;2385:180::-;2444:6;2497:2;2485:9;2476:7;2472:23;2468:32;2465:52;;;2513:1;2510;2503:12;2465:52;-1:-1:-1;2536:23:1;;2385:180;-1:-1:-1;2385:180:1:o;2967:118::-;3053:5;3046:13;3039:21;3032:5;3029:32;3019:60;;3075:1;3072;3065:12;3090:382;3155:6;3163;3216:2;3204:9;3195:7;3191:23;3187:32;3184:52;;;3232:1;3229;3222:12;3184:52;3271:9;3258:23;3290:31;3315:5;3290:31;:::i;:::-;3340:5;-1:-1:-1;3397:2:1;3382:18;;3369:32;3410:30;3369:32;3410:30;:::i;:::-;3459:7;3449:17;;;3090:382;;;;;:::o;3477:316::-;3554:6;3562;3570;3623:2;3611:9;3602:7;3598:23;3594:32;3591:52;;;3639:1;3636;3629:12;3591:52;-1:-1:-1;;3662:23:1;;;3732:2;3717:18;;3704:32;;-1:-1:-1;3783:2:1;3768:18;;;3755:32;;3477:316;-1:-1:-1;3477:316:1:o;3798:388::-;3866:6;3874;3927:2;3915:9;3906:7;3902:23;3898:32;3895:52;;;3943:1;3940;3933:12;3895:52;3982:9;3969:23;4001:31;4026:5;4001:31;:::i;:::-;4051:5;-1:-1:-1;4108:2:1;4093:18;;4080:32;4121:33;4080:32;4121:33;:::i;4191:461::-;4244:3;4282:5;4276:12;4309:6;4304:3;4297:19;4335:4;4364:2;4359:3;4355:12;4348:19;;4401:2;4394:5;4390:14;4422:1;4432:195;4446:6;4443:1;4440:13;4432:195;;;4511:13;;-1:-1:-1;;;;;4507:39:1;4495:52;;4567:12;;;;4602:15;;;;4543:1;4461:9;4432:195;;;-1:-1:-1;4643:3:1;;4191:461;-1:-1:-1;;;;;4191:461:1:o;4657:261::-;4836:2;4825:9;4818:21;4799:4;4856:56;4908:2;4897:9;4893:18;4885:6;4856:56;:::i;4923:241::-;4979:6;5032:2;5020:9;5011:7;5007:23;5003:32;5000:52;;;5048:1;5045;5038:12;5000:52;5087:9;5074:23;5106:28;5128:5;5106:28;:::i;5169:380::-;5248:1;5244:12;;;;5291;;;5312:61;;5366:4;5358:6;5354:17;5344:27;;5312:61;5419:2;5411:6;5408:14;5388:18;5385:38;5382:161;;5465:10;5460:3;5456:20;5453:1;5446:31;5500:4;5497:1;5490:15;5528:4;5525:1;5518:15;5382:161;;5169:380;;;:::o;5554:356::-;5756:2;5738:21;;;5775:18;;;5768:30;5834:34;5829:2;5814:18;;5807:62;5901:2;5886:18;;5554:356::o;7087:127::-;7148:10;7143:3;7139:20;7136:1;7129:31;7179:4;7176:1;7169:15;7203:4;7200:1;7193:15;7219:168;7259:7;7325:1;7321;7317:6;7313:14;7310:1;7307:21;7302:1;7295:9;7288:17;7284:45;7281:71;;;7332:18;;:::i;:::-;-1:-1:-1;7372:9:1;;7219:168::o;7392:217::-;7432:1;7458;7448:132;;7502:10;7497:3;7493:20;7490:1;7483:31;7537:4;7534:1;7527:15;7565:4;7562:1;7555:15;7448:132;-1:-1:-1;7594:9:1;;7392:217::o;8434:128::-;8474:3;8505:1;8501:6;8498:1;8495:13;8492:39;;;8511:18;;:::i;:::-;-1:-1:-1;8547:9:1;;8434:128::o;8567:402::-;8769:2;8751:21;;;8808:2;8788:18;;;8781:30;8847:34;8842:2;8827:18;;8820:62;-1:-1:-1;;;8913:2:1;8898:18;;8891:36;8959:3;8944:19;;8567:402::o;10884:403::-;11086:2;11068:21;;;11125:2;11105:18;;;11098:30;11164:34;11159:2;11144:18;;11137:62;-1:-1:-1;;;11230:2:1;11215:18;;11208:37;11277:3;11262:19;;10884:403::o;12068:184::-;12138:6;12191:2;12179:9;12170:7;12166:23;12162:32;12159:52;;;12207:1;12204;12197:12;12159:52;-1:-1:-1;12230:16:1;;12068:184;-1:-1:-1;12068:184:1:o;12536:245::-;12603:6;12656:2;12644:9;12635:7;12631:23;12627:32;12624:52;;;12672:1;12669;12662:12;12624:52;12704:9;12698:16;12723:28;12745:5;12723:28;:::i;12786:407::-;12988:2;12970:21;;;13027:2;13007:18;;;13000:30;13066:34;13061:2;13046:18;;13039:62;-1:-1:-1;;;13132:2:1;13117:18;;13110:41;13183:3;13168:19;;12786:407::o;13198:399::-;13400:2;13382:21;;;13439:2;13419:18;;;13412:30;13478:34;13473:2;13458:18;;13451:62;-1:-1:-1;;;13544:2:1;13529:18;;13522:33;13587:3;13572:19;;13198:399::o;14009:607::-;-1:-1:-1;;;;;14368:15:1;;;14350:34;;14415:2;14400:18;;14393:34;;;;14458:2;14443:18;;14436:34;;;;14501:2;14486:18;;14479:34;;;;14550:15;;;14544:3;14529:19;;14522:44;14330:3;14582:19;;14575:35;;;;14299:3;14284:19;;14009:607::o;14621:306::-;14709:6;14717;14725;14778:2;14766:9;14757:7;14753:23;14749:32;14746:52;;;14794:1;14791;14784:12;14746:52;14823:9;14817:16;14807:26;;14873:2;14862:9;14858:18;14852:25;14842:35;;14917:2;14906:9;14902:18;14896:25;14886:35;;14621:306;;;;;:::o;19578:245::-;19657:6;19665;19718:2;19706:9;19697:7;19693:23;19689:32;19686:52;;;19734:1;19731;19724:12;19686:52;-1:-1:-1;;19757:16:1;;19813:2;19798:18;;;19792:25;19757:16;;19792:25;;-1:-1:-1;19578:245:1:o;21253:401::-;21455:2;21437:21;;;21494:2;21474:18;;;21467:30;21533:34;21528:2;21513:18;;21506:62;-1:-1:-1;;;21599:2:1;21584:18;;21577:35;21644:3;21629:19;;21253:401::o;21659:399::-;21861:2;21843:21;;;21900:2;21880:18;;;21873:30;21939:34;21934:2;21919:18;;21912:62;-1:-1:-1;;;22005:2:1;21990:18;;21983:33;22048:3;22033:19;;21659:399::o;23251:125::-;23291:4;23319:1;23316;23313:8;23310:34;;;23324:18;;:::i;:::-;-1:-1:-1;23361:9:1;;23251:125::o;25858:127::-;25919:10;25914:3;25910:20;25907:1;25900:31;25950:4;25947:1;25940:15;25974:4;25971:1;25964:15;25990:251;26060:6;26113:2;26101:9;26092:7;26088:23;26084:32;26081:52;;;26129:1;26126;26119:12;26081:52;26161:9;26155:16;26180:31;26205:5;26180:31;:::i;26246:582::-;26545:6;26534:9;26527:25;26588:6;26583:2;26572:9;26568:18;26561:34;26631:3;26626:2;26615:9;26611:18;26604:31;26508:4;26652:57;26704:3;26693:9;26689:19;26681:6;26652:57;:::i;:::-;-1:-1:-1;;;;;26745:32:1;;;;26740:2;26725:18;;26718:60;-1:-1:-1;26809:3:1;26794:19;26787:35;26644:65;26246:582;-1:-1:-1;;;26246:582:1:o

Swarm Source

ipfs://33dd421d821564bf62e771a7ea2c292e3d0768cda9a7cb642f3c11445b587f96
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.