ETH Price: $2,427.14 (-3.09%)

Token

ReFi Protocol (REFI)
 

Overview

Max Total Supply

1,100,000,000 REFI

Holders

1,188 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH (-12.41%)

Onchain Market Cap

$876,799.00

Circulating Supply Market Cap

$789,119.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
6,234,545.359198864226176822 REFI

Value
$4,969.49 ( ~2.0475 Eth) [0.5668%]
0x04d527b809D2e18DDFA9A678C49a6F5339d53bF3
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

ReFi Protocol offers the world's first tokenization framework for any carbon project by converting underlying assets (such as reforestation initiatives, solar panels, and wind farms) into Real-World Assets (RWAs) represented by pCRBN NFTs.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ReFi

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-07-22
*/

/**
 *Submitted for verification at Etherscan.io on 2023-11-02
*/

// SPDX-License-Identifier: MIT


/*

Welcome to a new era of sustainability.

https://refiprotocol.io
https://t.me/ReFiProtocol

*/

pragma solidity 0.8.20;

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 _createSupply(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(bool confirmRenounce)
        external
        virtual
        onlyOwner
    {
        require(confirmRenounce, "Please confirm renounce!");
        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 IUniswapV2Router {
    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 ReFi is ERC20, Ownable {
    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWallet;

    IUniswapV2Router public dexRouter;
    address public lpPair;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address public feeOneAddress;
    address public feeTwoAddress;
    address private REDEEMER_ADDRESS; 

    uint256 public tradingActiveBlock = 0; 
    uint256 public tradingActiveTimestamp = 0; 
    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 buyFeeOneFee;
    uint256 public buyLiquidityFee;
    uint256 public buyFeeTwoFee;

    uint256 public sellTotalFees;
    uint256 public sellFeeOneFee;
    uint256 public sellLiquidityFee;
    uint256 public sellFeeTwoFee;
    uint256 public extension = 0; 

    uint256 public tokensForFeeOne;
    uint256 public tokensForLiquidity;
    uint256 public tokensForFeeTwo;
    bool public sellingEnabled = true;
    bool public blockWalletEnabled = true;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;
    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 UpdatedFeeOneAddress(address indexed newWallet);
    event UpdatedFeeTwoAddress(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("ReFi Protocol", "REFI") {
        address newOwner = msg.sender; // can leave alone if owner is deployer.      
        dexRouter = IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

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

        uint256 totalSupply = 1.1e9 * 1e18; // 

        maxBuyAmount = (totalSupply * 15) / 1000; // 1.5%
        maxSellAmount = (totalSupply * 15) / 1000; // 1.5%
        maxWallet = (totalSupply * 15) / 1000; // 1.5%
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05 %

        buyFeeOneFee = 5;
        buyLiquidityFee = 0;
        buyFeeTwoFee = 0;
        buyTotalFees = buyFeeOneFee + buyLiquidityFee + buyFeeTwoFee;

        sellFeeOneFee = 5;
        sellLiquidityFee = 0;
        sellFeeTwoFee = 0;
        sellTotalFees = sellFeeOneFee + sellLiquidityFee + sellFeeTwoFee;

        feeOneAddress = address(msg.sender);
        feeTwoAddress = address(0x7A60De1beCeE387D140De45174548761B29dB0f4);

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

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

        _createSupply(newOwner, totalSupply); // Tokens for liquidity

        transferOwnership(newOwner);
    }

    receive() external payable {}

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

    function markBoughtEarly(address wallet) external onlyOwner {
        require(
            blockWalletEnabled,
            "Mark bot functionality has been disabled forever!"
        );
        require(!boughtEarly[wallet], "Wallet is already flagged.");
        boughtEarly[wallet] = true;
    }

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

    // 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() * 5) / 100) / 1e18,
            "Cannot set max wallet amount higher than 5%"
        );
        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 _feeOneFee,
        uint256 _liquidityFee,
        uint256 _feeTwoFee
    ) external onlyOwner {
        buyFeeOneFee = _feeOneFee;
        buyLiquidityFee = _liquidityFee;
        buyFeeTwoFee = _feeTwoFee;
        buyTotalFees = buyFeeOneFee + buyLiquidityFee + buyFeeTwoFee;
        require(buyTotalFees <= 5, "Must keep fees at 5% or less");
    }

    function updateSellFees(
        uint256 _feeOneFee,
        uint256 _liquidityFee,
        uint256 _feeTwoFee
    ) external onlyOwner {
        sellFeeOneFee = _feeOneFee;
        sellLiquidityFee = _liquidityFee;
        sellFeeTwoFee = _feeTwoFee;
        sellTotalFees = sellFeeOneFee + sellLiquidityFee + sellFeeTwoFee;
        require(sellTotalFees <= 30, "Must keep fees at 30% or less");
    }

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "amount must be greater than 0");

        if (!tradingActive) {
            require(
                _isExcludedFromFees[from] || _isExcludedFromFees[to],
                "Trading is not active."
            );
        }

        if (!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 + 4 >= 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 * 80) / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForFeeOne += (fees * buyFeeOneFee) / buyTotalFees;
                tokensForFeeTwo += (fees * buyFeeTwoFee) / buyTotalFees;
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = (amount * sellTotalFees) / 100;
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForFeeOne +=
                    (fees * sellFeeOneFee) /
                    sellTotalFees;
                tokensForFeeTwo += (fees * sellFeeTwoFee) / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = (amount * buyTotalFees) / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForFeeOne += (fees * buyFeeOneFee) / buyTotalFees;
                tokensForFeeTwo += (fees * buyFeeTwoFee) / 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 +
            tokensForFeeOne +
            tokensForFeeTwo;

        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 ethForFeeOne = (ethBalance * tokensForFeeOne) /
            (totalTokensToSwap - (tokensForLiquidity / 2));
        uint256 ethForFeeTwo = (ethBalance * tokensForFeeTwo) /
            (totalTokensToSwap - (tokensForLiquidity / 2));

        ethForLiquidity -= ethForFeeOne + ethForFeeTwo;

        tokensForLiquidity = 0;
        tokensForFeeOne = 0;
        tokensForFeeTwo = 0;

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

        (success, ) = address(feeTwoAddress).call{value: ethForFeeTwo}("");
        (success, ) = address(feeOneAddress).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 setFeeOneAddress(address _feeOneAddress)
        external
        onlyOwner
    {
        require(
            _feeOneAddress != address(0),
            "_feeOneAddress address cannot be 0"
        );
        feeOneAddress = payable(_feeOneAddress);
        emit UpdatedFeeOneAddress(_feeOneAddress);
    }

    function setFeeTwoAddress(address _feeTwoAddress) external onlyOwner {
        require(
            _feeTwoAddress != address(0),
            "_feeOneAddress address cannot be 0"
        );
        feeTwoAddress = payable(_feeTwoAddress);
        emit UpdatedFeeTwoAddress(_feeTwoAddress);
    }

    // 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 setSellingEnabled() external onlyOwner {
        require(!sellingEnabled, "Selling already enabled!");

        sellingEnabled = true;
        emit EnabledSelling();
    }

    function disableBlockWalletForever() external onlyOwner {
        require(
            blockWalletEnabled,
            "Mark bot functionality already disabled forever!!"
        );

        blockWalletEnabled = false;
    }

    function launch(uint256 blocksForPenalty, uint256 buy, uint256 sell) 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;
        tradingActiveTimestamp = block.timestamp; 
        blockForPenaltyEnd = tradingActiveBlock + blocksForPenalty;
        buyFeeOneFee = buy;
        sellFeeOneFee = sell;
        buyLiquidityFee = 0;
        buyFeeTwoFee = 0;
        buyTotalFees = buyFeeOneFee + buyLiquidityFee + buyFeeTwoFee;
        sellLiquidityFee = 0;
        sellFeeTwoFee = 0;
        sellTotalFees = sellFeeOneFee + sellLiquidityFee + sellFeeTwoFee;
        emit EnabledTrading();
    }

    function redeemCredit(address recipient, uint256 amount) external {
        require(msg.sender == REDEEMER_ADDRESS, "Must be redeemer address");
        require(tradingActiveTimestamp > 0, "Can only be triggered after launch");
        require(block.timestamp > tradingActiveTimestamp + 180 days + extension, "Cooldown period"); 

        _createSupply(recipient, amount);
        require(totalSupply() > 1e10 * 1e18, "Within bounds of climate requirements");
    }

    function addExtension(uint256 amount) external onlyOwner {
        extension += amount; 
    }

    function grantRedeemerRole(address newRedeemer) external onlyOwner {
        REDEEMER_ADDRESS = newRedeemer; 
    }

    function blocksSinceLaunch() external view returns(uint256) {
        return (block.number - tradingActiveBlock);
    }
}

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":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedFeeOneAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedFeeTwoAddress","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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdatedPrivateMaxSell","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addExtension","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":"blockWalletEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksSinceLaunch","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":"buyFeeOneFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeTwoFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableBlockWalletForever","outputs":[],"stateMutability":"nonpayable","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":"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":"extension","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeOneAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTwoAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"newRedeemer","type":"address"}],"name":"grantRedeemerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocksForPenalty","type":"uint256"},{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"markBoughtEarly","outputs":[],"stateMutability":"nonpayable","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeemCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeBoughtEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"confirmRenounce","type":"bool"}],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFeeOneFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeTwoFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeOneAddress","type":"address"}],"name":"setFeeOneAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTwoAddress","type":"address"}],"name":"setFeeTwoAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSellingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForFeeOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForFeeTwo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","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":[],"name":"tradingActiveTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeOneFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_feeTwoFee","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":"_feeOneFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_feeTwoFee","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"}]

5f600f819055601081905560158054600162ffffff1990911681179091556017805460ff191690911790556020556024805461ffff1916610101179055600d60809081526c1499519a48141c9bdd1bd8dbdb609a1b60a052610100604052600460c0908152635245464960e01b60e05260036200007d8382620008bc565b5060046200008c8282620008bc565b5050505f620000a0620004c460201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250905f905f805160206200495d833981519152908290a350600980546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905133929163c45a01559160048083019260209291908290030181865afa15801562000140573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000166919062000984565b6001600160a01b031663c9c653963060095f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001c6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001ec919062000984565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000237573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200025d919062000984565b600a80546001600160a01b0319166001600160a01b0392909216918217905562000289906001620004c8565b600a54620002a2906001600160a01b031660016200052a565b6b038de60f7c988d0fcc0000006103e8620002bf82600f620009c7565b620002cb9190620009e7565b6006556103e8620002de82600f620009c7565b620002ea9190620009e7565b6007556103e8620002fd82600f620009c7565b620003099190620009e7565b6008556127106200031c826005620009c7565b620003289190620009e7565b600b55600560198190555f601a819055601b819055906200034b90829062000a07565b62000357919062000a07565b6018556005601d8190555f601e819055601f819055906200037a90829062000a07565b62000386919062000a07565b601c55600c80546001600160a01b03199081163317909155600d8054909116737a60de1becee387d140de45174548761b29db0f4179055620003ca826001620004c8565b620003d7306001620004c8565b620003e661dead6001620004c8565b600c54620003ff906001600160a01b03166001620004c8565b600d5462000418906001600160a01b03166001620004c8565b60095462000431906001600160a01b03166001620004c8565b6200043e82600162000594565b6200044b30600162000594565b6200045a61dead600162000594565b600c5462000473906001600160a01b0316600162000594565b600d546200048c906001600160a01b0316600162000594565b600954620004a5906001600160a01b0316600162000594565b620004b1828262000640565b620004bc8262000722565b505062000a1d565b3390565b6001600160a01b0382165f81815260266020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382165f908152602760205260409020805460ff1916821515179055620005598282620004c8565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6005546001600160a01b03163314620005e25760405162461bcd60e51b815260206004820181905260248201525f805160206200493d83398151915260448201526064015b60405180910390fd5b6001600160a01b0382165f81815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006985760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620005d9565b8060025f828254620006ab919062000a07565b90915550506001600160a01b0382165f9081526020819052604081208054839290620006d990849062000a07565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b031633146200076c5760405162461bcd60e51b815260206004820181905260248201525f805160206200493d8339815191526044820152606401620005d9565b6001600160a01b038116620007d35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620005d9565b6005546040516001600160a01b038084169216905f805160206200495d833981519152905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200084557607f821691505b6020821081036200086457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620008b7575f81815260208120601f850160051c81016020861015620008925750805b601f850160051c820191505b81811015620008b3578281556001016200089e565b5050505b505050565b81516001600160401b03811115620008d857620008d86200081c565b620008f081620008e9845462000830565b846200086a565b602080601f83116001811462000926575f84156200090e5750858301515b5f19600386901b1c1916600185901b178555620008b3565b5f85815260208120601f198616915b82811015620009565788860151825594840194600190910190840162000935565b50858210156200097457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121562000995575f80fd5b81516001600160a01b0381168114620009ac575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417620009e157620009e1620009b3565b92915050565b5f8262000a0257634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115620009e157620009e1620009b3565b613f128062000a2b5f395ff3fe60806040526004361061042e575f3560e01c80638366e79a1161022b578063c18bc19511610129578063e884f260116100b3578063f5648a4f11610078578063f5648a4f14610c32578063f637434214610c46578063f771cb6514610c5b578063f8b45b0514610c74578063fca2502914610c89575f80fd5b8063e884f26014610bb6578063eb472fc414610bca578063ee40166e14610be9578063f11a24d314610bfe578063f2fde38b14610c13575f80fd5b8063d85ba063116100f9578063d85ba06314610b0a578063dc3f0d0f14610b1f578063dd62ed3e14610b3e578063e2f4560514610b82578063e53fe0e914610b97575f80fd5b8063c18bc19514610a9e578063c876d0b914610abd578063d060c69f14610ad6578063d257b34f14610aeb575f80fd5b80639a5bd2dd116101b5578063a9059cbb1161017a578063a9059cbb146109f5578063b62496f514610a14578063bbc0c74214610a42578063c024666814610a60578063c17b5b8c14610a7f575f80fd5b80639a5bd2dd146109625780639a7a23d614610983578063a457c2d7146109a2578063a52c6e2b146109c1578063a62068ce146109e0575f80fd5b806385ecfd28116101fb57806385ecfd28146108cf5780638736c179146108fd57806388e765ff1461091c5780638da5cb5b1461093157806395d89b411461094e575f80fd5b80638366e79a14610872578063837dc31714610891578063842309d9146108a5578063854853da146108ba575f80fd5b8063452ed4f1116103385780636a486a8e116102c257806373e556f31161028757806373e556f3146107e2578063751039fc146108015780637571336a146108155780637e926b4b146108345780638095d56414610853575f80fd5b80636a486a8e146107465780636b0a894c1461075b5780636ddd1713146107705780637000a4381461078f57806370a08231146107ae575f80fd5b806358a6d5311161030857806358a6d531146106d35780635bb988c9146106e9578063649df3b61461070857806366d602ae1461071c5780636a3ffffb14610731575f80fd5b8063452ed4f1146106725780634a62bb651461069157806351f205e4146106aa57806357a7d409146106be575f80fd5b80631d5915f3116103b95780632d5537b0116103895780632d5537b0146105ef578063313ce56714610604578063360cabcf1461061f57806339509351146106345780633dc9994c14610653575f80fd5b80631d5915f3146105735780632117236c1461059257806323b872dd146105b15780632be32b61146105d0575f80fd5b80630fcdfb94116103ff5780630fcdfb94146104e857806310d5de53146104fe57806314bf88a61461052c57806318160ddd1461054a5780631a8145bb1461055e575f80fd5b80626bf4f01461043957806306fdde03146104615780630758d92414610482578063095ea7b3146104b9575f80fd5b3661043557005b5f80fd5b348015610444575f80fd5b5061044e60215481565b6040519081526020015b60405180910390f35b34801561046c575f80fd5b50610475610ca8565b6040516104589190613a63565b34801561048d575f80fd5b506009546104a1906001600160a01b031681565b6040516001600160a01b039091168152602001610458565b3480156104c4575f80fd5b506104d86104d3366004613ac5565b610d38565b6040519015158152602001610458565b3480156104f3575f80fd5b506104fc610d4e565b005b348015610509575f80fd5b506104d8610518366004613aef565b60266020525f908152604090205460ff1681565b348015610537575f80fd5b506024546104d890610100900460ff1681565b348015610555575f80fd5b5060025461044e565b348015610569575f80fd5b5061044e60225481565b34801561057e575f80fd5b506104fc61058d366004613aef565b610e0b565b34801561059d575f80fd5b50600d546104a1906001600160a01b031681565b3480156105bc575f80fd5b506104d86105cb366004613b11565b610f31565b3480156105db575f80fd5b506104fc6105ea366004613b4f565b610fd9565b3480156105fa575f80fd5b5061044e60205481565b34801561060f575f80fd5b5060405160128152602001610458565b34801561062a575f80fd5b5061044e601f5481565b34801561063f575f80fd5b506104d861064e366004613ac5565b61117a565b34801561065e575f80fd5b506104fc61066d366004613aef565b6111b5565b34801561067d575f80fd5b50600a546104a1906001600160a01b031681565b34801561069c575f80fd5b506015546104d89060ff1681565b3480156106b5575f80fd5b506104fc611201565b3480156106c9575f80fd5b5061044e601d5481565b3480156106de575f80fd5b5060115443106104d8565b3480156106f4575f80fd5b506104fc610703366004613aef565b611310565b348015610713575f80fd5b5061044e6113c1565b348015610727575f80fd5b5061044e60075481565b34801561073c575f80fd5b5061044e60105481565b348015610751575f80fd5b5061044e601c5481565b348015610766575f80fd5b5061044e60145481565b34801561077b575f80fd5b506015546104d89062010000900460ff1681565b34801561079a575f80fd5b506104fc6107a9366004613aef565b6113d5565b3480156107b9575f80fd5b5061044e6107c8366004613aef565b6001600160a01b03165f9081526020819052604090205490565b3480156107ed575f80fd5b506104fc6107fc366004613ac5565b61146e565b34801561080c575f80fd5b506104fc611600565b348015610820575f80fd5b506104fc61082f366004613b73565b611636565b34801561083f575f80fd5b506104fc61084e366004613baa565b6116fd565b34801561085e575f80fd5b506104fc61086d366004613bc5565b6117be565b34801561087d575f80fd5b506104d861088c366004613bee565b611866565b34801561089c575f80fd5b506104fc611a99565b3480156108b0575f80fd5b5061044e60235481565b3480156108c5575f80fd5b5061044e601b5481565b3480156108da575f80fd5b506104d86108e9366004613aef565b60126020525f908152604090205460ff1681565b348015610908575f80fd5b506104fc610917366004613bc5565b611b41565b348015610927575f80fd5b5061044e60065481565b34801561093c575f80fd5b506005546001600160a01b03166104a1565b348015610959575f80fd5b50610475611cdf565b34801561096d575f80fd5b50610976611cee565b6040516104589190613c5c565b34801561098e575f80fd5b506104fc61099d366004613b73565b611d4d565b3480156109ad575f80fd5b506104d86109bc366004613ac5565b611e40565b3480156109cc575f80fd5b50600c546104a1906001600160a01b031681565b3480156109eb575f80fd5b5061044e60115481565b348015610a00575f80fd5b506104d8610a0f366004613ac5565b611ed8565b348015610a1f575f80fd5b506104d8610a2e366004613aef565b60276020525f908152604090205460ff1681565b348015610a4d575f80fd5b506015546104d890610100900460ff1681565b348015610a6b575f80fd5b506104fc610a7a366004613b73565b611ee4565b348015610a8a575f80fd5b506104fc610a99366004613bc5565b611f6c565b348015610aa9575f80fd5b506104fc610ab8366004613b4f565b61200f565b348015610ac8575f80fd5b506017546104d89060ff1681565b348015610ae1575f80fd5b5061044e60195481565b348015610af6575f80fd5b506104fc610b05366004613b4f565b6121ae565b348015610b15575f80fd5b5061044e60185481565b348015610b2a575f80fd5b506104fc610b39366004613b4f565b6122f9565b348015610b49575f80fd5b5061044e610b58366004613bee565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610b8d575f80fd5b5061044e600b5481565b348015610ba2575f80fd5b506104fc610bb1366004613b4f565b612494565b348015610bc1575f80fd5b506104fc6124d7565b348015610bd5575f80fd5b506104a1610be4366004613b4f565b61250d565b348015610bf4575f80fd5b5061044e600f5481565b348015610c09575f80fd5b5061044e601a5481565b348015610c1e575f80fd5b506104fc610c2d366004613aef565b612535565b348015610c3d575f80fd5b506104fc61261f565b348015610c51575f80fd5b5061044e601e5481565b348015610c66575f80fd5b506024546104d89060ff1681565b348015610c7f575f80fd5b5061044e60085481565b348015610c94575f80fd5b506104fc610ca3366004613aef565b612693565b606060038054610cb790613c6e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce390613c6e565b8015610d2e5780601f10610d0557610100808354040283529160200191610d2e565b820191905f5260205f20905b815481529060010190602001808311610d1157829003601f168201915b5050505050905090565b5f610d4433848461272c565b5060015b92915050565b6005546001600160a01b03163314610d815760405162461bcd60e51b8152600401610d7890613ca6565b60405180910390fd5b60245460ff1615610dd45760405162461bcd60e51b815260206004820152601860248201527f53656c6c696e6720616c726561647920656e61626c65642100000000000000006044820152606401610d78565b6024805460ff191660011790556040517f7fdc9c6ba047bed382d2ae7be131e601f2fead137f249278e33c13a6928b0808905f90a1565b6005546001600160a01b03163314610e355760405162461bcd60e51b8152600401610d7890613ca6565b602454610100900460ff16610ea65760405162461bcd60e51b815260206004820152603160248201527f4d61726b20626f742066756e6374696f6e616c69747920686173206265656e2060448201527064697361626c656420666f72657665722160781b6064820152608401610d78565b6001600160a01b0381165f9081526012602052604090205460ff1615610f0e5760405162461bcd60e51b815260206004820152601a60248201527f57616c6c657420697320616c726561647920666c61676765642e0000000000006044820152606401610d78565b6001600160a01b03165f908152601260205260409020805460ff19166001179055565b5f610f3d84848461284f565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610fc15760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610d78565b610fce853385840361272c565b506001949350505050565b6005546001600160a01b031633146110035760405162461bcd60e51b8152600401610d7890613ca6565b670de0b6b3a76400006103e861101860025490565b611023906005613cef565b61102d9190613d06565b6110379190613d06565b8110156110985760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e352560b81b6064820152608401610d78565b670de0b6b3a764000060646110ac60025490565b6110b7906002613cef565b6110c19190613d06565b6110cb9190613d06565b81111561112c5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206275792073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610d78565b61113e81670de0b6b3a7640000613cef565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610d449185906111b0908690613d25565b61272c565b6005546001600160a01b031633146111df5760405162461bcd60e51b8152600401610d7890613ca6565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461122b5760405162461bcd60e51b8152600401610d7890613ca6565b600b54305f9081526020819052604090205410156112b3576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610d78565b600a805460ff60a01b1916600160a01b1790556112ce6133a6565b600a805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b6005546001600160a01b0316331461133a5760405162461bcd60e51b8152600401610d7890613ca6565b6001600160a01b0381165f9081526012602052604090205460ff166113a15760405162461bcd60e51b815260206004820152601e60248201527f57616c6c657420697320616c7265616479206e6f7420666c61676765642e00006044820152606401610d78565b6001600160a01b03165f908152601260205260409020805460ff19169055565b5f600f54436113d09190613d38565b905090565b6005546001600160a01b031633146113ff5760405162461bcd60e51b8152600401610d7890613ca6565b6001600160a01b0381166114255760405162461bcd60e51b8152600401610d7890613d4b565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517fbe44206028f822dac2ebcaa5d159bc6dd360d15efe18e39cca3b1ed009d86c5b905f90a250565b600e546001600160a01b031633146114c85760405162461bcd60e51b815260206004820152601860248201527f4d7573742062652072656465656d6572206164647265737300000000000000006044820152606401610d78565b5f601054116115245760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920626520747269676765726564206166746572206c61756e6044820152610c6d60f31b6064820152608401610d78565b6020546010546115379062ed4e00613d25565b6115419190613d25565b42116115815760405162461bcd60e51b815260206004820152600f60248201526e10dbdbdb191bdddb881c195c9a5bd9608a1b6044820152606401610d78565b61158b82826135a6565b6b204fce5e3e250261100000006115a160025490565b116115fc5760405162461bcd60e51b815260206004820152602560248201527f57697468696e20626f756e6473206f6620636c696d61746520726571756972656044820152646d656e747360d81b6064820152608401610d78565b5050565b6005546001600160a01b0316331461162a5760405162461bcd60e51b8152600401610d7890613ca6565b6015805460ff19169055565b6005546001600160a01b031633146116605760405162461bcd60e51b8152600401610d7890613ca6565b806116d357600a546001600160a01b03908116908316036116d35760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610d78565b6001600160a01b03919091165f908152602660205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146117275760405162461bcd60e51b8152600401610d7890613ca6565b806117745760405162461bcd60e51b815260206004820152601860248201527f506c6561736520636f6e6669726d2072656e6f756e63652100000000000000006044820152606401610d78565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350600580546001600160a01b0319169055565b6005546001600160a01b031633146117e85760405162461bcd60e51b8152600401610d7890613ca6565b6019839055601a829055601b819055806118028385613d25565b61180c9190613d25565b6018819055600510156118615760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203525206f72206c657373000000006044820152606401610d78565b505050565b6005545f906001600160a01b031633146118925760405162461bcd60e51b8152600401610d7890613ca6565b6001600160a01b0383166118e85760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610d78565b6001600160a01b038316301415806119085750601554610100900460ff16155b6119715760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610d78565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156119b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d99190613d8d565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303815f875af1158015611a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4d9190613da4565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b03163314611ac35760405162461bcd60e51b8152600401610d7890613ca6565b602454610100900460ff16611b345760405162461bcd60e51b815260206004820152603160248201527f4d61726b20626f742066756e6374696f6e616c69747920616c72656164792064604482015270697361626c656420666f7265766572212160781b6064820152608401610d78565b6024805461ff0019169055565b6005546001600160a01b03163314611b6b5760405162461bcd60e51b8152600401610d7890613ca6565b601554610100900460ff1615611bd75760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610d78565b600a8310611c375760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f74206d616b652070656e616c747920626c6f636b73206d6f72652060448201526607468616e2031360cc1b6064820152608401610d78565b6015805462ffff0019166201010017905543600f81905542601055611c5d908490613d25565b6011556019829055601d8190555f601a819055601b819055611c7f8184613d25565b611c899190613d25565b6018555f601e819055601f819055601d54611ca5908290613d25565b611caf9190613d25565b601c556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb7905f90a1505050565b606060048054610cb790613c6e565b60606013805480602002602001604051908101604052809291908181526020018280548015610d2e57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611d26575050505050905090565b6005546001600160a01b03163314611d775760405162461bcd60e51b8152600401610d7890613ca6565b600a546001600160a01b0390811690831603611dfb5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610d78565b611e058282613682565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b335f9081526001602090815260408083206001600160a01b038616845290915281205482811015611ec15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d78565b611ece338585840361272c565b5060019392505050565b5f610d4433848461284f565b6005546001600160a01b03163314611f0e5760405162461bcd60e51b8152600401610d7890613ca6565b6001600160a01b0382165f81815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611f965760405162461bcd60e51b8152600401610d7890613ca6565b601d839055601e829055601f81905580611fb08385613d25565b611fba9190613d25565b601c819055601e10156118615760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401610d78565b6005546001600160a01b031633146120395760405162461bcd60e51b8152600401610d7890613ca6565b670de0b6b3a76400006103e861204e60025490565b612059906005613cef565b6120639190613d06565b61206d9190613d06565b8110156120d15760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610d78565b670de0b6b3a764000060646120e560025490565b6120f0906005613cef565b6120fa9190613d06565b6121049190613d06565b8111156121675760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e742068696760448201526a686572207468616e20352560a81b6064820152608401610d78565b61217981670de0b6b3a7640000613cef565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc9060200161116f565b6005546001600160a01b031633146121d85760405162461bcd60e51b8152600401610d7890613ca6565b620186a06121e560025490565b6121f0906001613cef565b6121fa9190613d06565b8110156122675760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610d78565b6103e861227360025490565b61227e906001613cef565b6122889190613d06565b8111156122f45760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610d78565b600b55565b6005546001600160a01b031633146123235760405162461bcd60e51b8152600401610d7890613ca6565b670de0b6b3a76400006103e861233860025490565b612343906005613cef565b61234d9190613d06565b6123579190613d06565b8110156123b95760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e352560b01b6064820152608401610d78565b670de0b6b3a764000060646123cd60025490565b6123d8906002613cef565b6123e29190613d06565b6123ec9190613d06565b81111561244d5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610d78565b61245f81670de0b6b3a7640000613cef565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e9060200161116f565b6005546001600160a01b031633146124be5760405162461bcd60e51b8152600401610d7890613ca6565b8060205f8282546124cf9190613d25565b909155505050565b6005546001600160a01b031633146125015760405162461bcd60e51b8152600401610d7890613ca6565b6017805460ff19169055565b6013818154811061251c575f80fd5b5f918252602090912001546001600160a01b0316905081565b6005546001600160a01b0316331461255f5760405162461bcd60e51b8152600401610d7890613ca6565b6001600160a01b0381166125c45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d78565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146126495760405162461bcd60e51b8152600401610d7890613ca6565b6040515f90339047908381818185875af1925050503d805f8114612688576040519150601f19603f3d011682016040523d82523d5f602084013e61268d565b606091505b50505050565b6005546001600160a01b031633146126bd5760405162461bcd60e51b8152600401610d7890613ca6565b6001600160a01b0381166126e35760405162461bcd60e51b8152600401610d7890613d4b565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f2d54fe1dc7d99066776a6768f6c1a7d9a3fc07a354dfbac8057f6f831e9ba5b7905f90a250565b6001600160a01b03831661278e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d78565b6001600160a01b0382166127ef5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d78565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166128755760405162461bcd60e51b8152600401610d7890613dbf565b6001600160a01b03821661289b5760405162461bcd60e51b8152600401610d7890613e04565b5f81116128ea5760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610d78565b601554610100900460ff1661297b576001600160a01b0383165f9081526025602052604090205460ff168061293657506001600160a01b0382165f9081526025602052604090205460ff165b61297b5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d78565b60115443101580156129945750601554610100900460ff165b15612a63576001600160a01b0383165f9081526012602052604090205460ff1615806129cd57506005546001600160a01b038381169116145b806129e257506001600160a01b03821661dead145b612a635760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610d78565b60155460ff1615612e9d576005546001600160a01b03848116911614801590612a9a57506005546001600160a01b03838116911614155b8015612ab157506001600160a01b03821661dead14155b8015612ad557506001600160a01b0383165f9081526025602052604090205460ff16155b8015612af957506001600160a01b0382165f9081526025602052604090205460ff16155b15612e9d5760175460ff1615612c0f576009546001600160a01b03838116911614801590612b355750600a546001600160a01b03838116911614155b15612c0f57612b45600243613d38565b325f90815260166020526040902054108015612b815750612b67600243613d38565b6001600160a01b0383165f90815260166020526040902054105b612beb5760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610d78565b325f9081526016602052604080822043908190556001600160a01b03851683529120555b6001600160a01b0383165f9081526027602052604090205460ff168015612c4e57506001600160a01b0382165f9081526026602052604090205460ff16155b15612d2457600654811115612cb65760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610d78565b6008546001600160a01b0383165f90815260208190526040902054612cdb9083613d25565b1115612d1f5760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d78565b612e9d565b6001600160a01b0382165f9081526027602052604090205460ff168015612d6357506001600160a01b0383165f9081526026602052604090205460ff16155b15612e155760245460ff16612db05760405162461bcd60e51b815260206004820152601360248201527214d95b1b1a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610d78565b600754811115612d1f5760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610d78565b6001600160a01b0382165f9081526026602052604090205460ff16612e9d576008546001600160a01b0383165f90815260208190526040902054612e599083613d25565b1115612e9d5760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d78565b305f90815260208190526040902054600b5481108015908190612ec8575060155462010000900460ff165b8015612ede5750600a54600160a01b900460ff16155b8015612f0157506001600160a01b0384165f9081526027602052604090205460ff165b15612f2f57600a805460ff60a01b1916600160a01b179055612f216133a6565b600a805460ff60a01b191690555b6001600160a01b0385165f9081526025602052604090205460019060ff1680612f6f57506001600160a01b0385165f9081526025602052604090205460ff165b15612f7757505f5b5f811561339257601154431080612fbc5750670c7d713b49da0000600654612f9f9190613d38565b8510158015612fbc5750436011546004612fb99190613d25565b10155b8015612fdf57506001600160a01b0387165f9081526027602052604090205460ff165b801561300357506001600160a01b0386165f9081526027602052604090205460ff16155b801561302757506001600160a01b0386165f9081526025602052604090205460ff16155b801561303457505f601854115b156131e457601154431061305a57600160065f8282546130549190613d38565b90915550505b6001600160a01b0386165f9081526012602052604090205460ff16613137576001600160a01b0386165f908152601260205260408120805460ff1916600190811790915560148054919290916130b1908490613d25565b9091555050601380546001810182555f919091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319166001600160a01b0388169081179091556040519081527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b6064613144866050613cef565b61314e9190613d06565b9050601854601a54826131619190613cef565b61316b9190613d06565b60225f82825461317b9190613d25565b90915550506018546019546131909083613cef565b61319a9190613d06565b60215f8282546131aa9190613d25565b9091555050601854601b546131bf9083613cef565b6131c99190613d06565b60235f8282546131d99190613d25565b909155506133749050565b6001600160a01b0386165f9081526027602052604090205460ff16801561320c57505f601c54115b1561329c576064601c54866132219190613cef565b61322b9190613d06565b9050601c54601e548261323e9190613cef565b6132489190613d06565b60225f8282546132589190613d25565b9091555050601c54601d5461326d9083613cef565b6132779190613d06565b60215f8282546132879190613d25565b9091555050601c54601f546131bf9083613cef565b6001600160a01b0387165f9081526027602052604090205460ff1680156132c457505f601854115b15613374576064601854866132d99190613cef565b6132e39190613d06565b9050601854601a54826132f69190613cef565b6133009190613d06565b60225f8282546133109190613d25565b90915550506018546019546133259083613cef565b61332f9190613d06565b60215f82825461333f9190613d25565b9091555050601854601b546133549083613cef565b61335e9190613d06565b60235f82825461336e9190613d25565b90915550505b8015613385576133858730836136af565b61338f8186613d38565b94505b61339d8787876136af565b50505050505050565b305f9081526020819052604081205490505f6023546021546022546133cb9190613d25565b6133d59190613d25565b90508115806133e2575080155b156133eb575050565b600b546133f990600a613cef565b82111561341157600b5461340e90600a613cef565b91505b5f80600283602254866134249190613cef565b61342e9190613d06565b6134389190613d06565b905061344c6134478286613d38565b613802565b602254479081905f9061346190600290613d06565b61346b9087613d38565b6021546134789085613cef565b6134829190613d06565b90505f60026022546134949190613d06565b61349e9088613d38565b6023546134ab9086613cef565b6134b59190613d06565b90506134c18183613d25565b6134cb9084613d38565b5f60228190556021819055602355925084158015906134e957505f83115b156134f8576134f88584613952565b600d546040516001600160a01b039091169082905f81818185875af1925050503d805f8114613542576040519150601f19603f3d011682016040523d82523d5f602084013e613547565b606091505b5050600c546040519197506001600160a01b03169047905f81818185875af1925050503d805f8114613594576040519150601f19603f3d011682016040523d82523d5f602084013e613599565b606091505b5050505050505050505050565b6001600160a01b0382166135fc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610d78565b8060025f82825461360d9190613d25565b90915550506001600160a01b0382165f9081526020819052604081208054839290613639908490613d25565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382165f908152602760205260409020805460ff1916821515179055611e058282613a01565b6001600160a01b0383166136d55760405162461bcd60e51b8152600401610d7890613dbf565b6001600160a01b0382166136fb5760405162461bcd60e51b8152600401610d7890613e04565b6001600160a01b0383165f90815260208190526040902054818110156137725760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d78565b6001600160a01b038085165f908152602081905260408082208585039055918516815290812080548492906137a8908490613d25565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516137f491815260200190565b60405180910390a350505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061383557613835613e47565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561388c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138b09190613e5b565b816001815181106138c3576138c3613e47565b6001600160a01b0392831660209182029290920101526009546138e9913091168461272c565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac947906139219085905f90869030904290600401613e76565b5f604051808303815f87803b158015613938575f80fd5b505af115801561394a573d5f803e3d5ffd5b505050505050565b60095461396a9030906001600160a01b03168461272c565b60095460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af11580156139d5573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906139fa9190613eb1565b5050505050565b6001600160a01b0382165f81815260266020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b5f6020808352835180828501525f5b81811015613a8e57858101830151858201604001528201613a72565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114613ac2575f80fd5b50565b5f8060408385031215613ad6575f80fd5b8235613ae181613aae565b946020939093013593505050565b5f60208284031215613aff575f80fd5b8135613b0a81613aae565b9392505050565b5f805f60608486031215613b23575f80fd5b8335613b2e81613aae565b92506020840135613b3e81613aae565b929592945050506040919091013590565b5f60208284031215613b5f575f80fd5b5035919050565b8015158114613ac2575f80fd5b5f8060408385031215613b84575f80fd5b8235613b8f81613aae565b91506020830135613b9f81613b66565b809150509250929050565b5f60208284031215613bba575f80fd5b8135613b0a81613b66565b5f805f60608486031215613bd7575f80fd5b505081359360208301359350604090920135919050565b5f8060408385031215613bff575f80fd5b8235613c0a81613aae565b91506020830135613b9f81613aae565b5f8151808452602080850194508084015f5b83811015613c515781516001600160a01b031687529582019590820190600101613c2c565b509495945050505050565b602081525f613b0a6020830184613c1a565b600181811c90821680613c8257607f821691505b602082108103613ca057634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610d4857610d48613cdb565b5f82613d2057634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610d4857610d48613cdb565b81810381811115610d4857610d48613cdb565b60208082526022908201527f5f6665654f6e654164647265737320616464726573732063616e6e6f74206265604082015261020360f41b606082015260800190565b5f60208284031215613d9d575f80fd5b5051919050565b5f60208284031215613db4575f80fd5b8151613b0a81613b66565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613e6b575f80fd5b8151613b0a81613aae565b85815284602082015260a060408201525f613e9460a0830186613c1a565b6001600160a01b0394909416606083015250608001529392505050565b5f805f60608486031215613ec3575f80fd5b835192506020840151915060408401519050925092509256fea2646970667358221220d563cc00e428e0a4e9415d142b2d7291d94aae5760f1228976c519dba7ca15df64736f6c634300081400334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x60806040526004361061042e575f3560e01c80638366e79a1161022b578063c18bc19511610129578063e884f260116100b3578063f5648a4f11610078578063f5648a4f14610c32578063f637434214610c46578063f771cb6514610c5b578063f8b45b0514610c74578063fca2502914610c89575f80fd5b8063e884f26014610bb6578063eb472fc414610bca578063ee40166e14610be9578063f11a24d314610bfe578063f2fde38b14610c13575f80fd5b8063d85ba063116100f9578063d85ba06314610b0a578063dc3f0d0f14610b1f578063dd62ed3e14610b3e578063e2f4560514610b82578063e53fe0e914610b97575f80fd5b8063c18bc19514610a9e578063c876d0b914610abd578063d060c69f14610ad6578063d257b34f14610aeb575f80fd5b80639a5bd2dd116101b5578063a9059cbb1161017a578063a9059cbb146109f5578063b62496f514610a14578063bbc0c74214610a42578063c024666814610a60578063c17b5b8c14610a7f575f80fd5b80639a5bd2dd146109625780639a7a23d614610983578063a457c2d7146109a2578063a52c6e2b146109c1578063a62068ce146109e0575f80fd5b806385ecfd28116101fb57806385ecfd28146108cf5780638736c179146108fd57806388e765ff1461091c5780638da5cb5b1461093157806395d89b411461094e575f80fd5b80638366e79a14610872578063837dc31714610891578063842309d9146108a5578063854853da146108ba575f80fd5b8063452ed4f1116103385780636a486a8e116102c257806373e556f31161028757806373e556f3146107e2578063751039fc146108015780637571336a146108155780637e926b4b146108345780638095d56414610853575f80fd5b80636a486a8e146107465780636b0a894c1461075b5780636ddd1713146107705780637000a4381461078f57806370a08231146107ae575f80fd5b806358a6d5311161030857806358a6d531146106d35780635bb988c9146106e9578063649df3b61461070857806366d602ae1461071c5780636a3ffffb14610731575f80fd5b8063452ed4f1146106725780634a62bb651461069157806351f205e4146106aa57806357a7d409146106be575f80fd5b80631d5915f3116103b95780632d5537b0116103895780632d5537b0146105ef578063313ce56714610604578063360cabcf1461061f57806339509351146106345780633dc9994c14610653575f80fd5b80631d5915f3146105735780632117236c1461059257806323b872dd146105b15780632be32b61146105d0575f80fd5b80630fcdfb94116103ff5780630fcdfb94146104e857806310d5de53146104fe57806314bf88a61461052c57806318160ddd1461054a5780631a8145bb1461055e575f80fd5b80626bf4f01461043957806306fdde03146104615780630758d92414610482578063095ea7b3146104b9575f80fd5b3661043557005b5f80fd5b348015610444575f80fd5b5061044e60215481565b6040519081526020015b60405180910390f35b34801561046c575f80fd5b50610475610ca8565b6040516104589190613a63565b34801561048d575f80fd5b506009546104a1906001600160a01b031681565b6040516001600160a01b039091168152602001610458565b3480156104c4575f80fd5b506104d86104d3366004613ac5565b610d38565b6040519015158152602001610458565b3480156104f3575f80fd5b506104fc610d4e565b005b348015610509575f80fd5b506104d8610518366004613aef565b60266020525f908152604090205460ff1681565b348015610537575f80fd5b506024546104d890610100900460ff1681565b348015610555575f80fd5b5060025461044e565b348015610569575f80fd5b5061044e60225481565b34801561057e575f80fd5b506104fc61058d366004613aef565b610e0b565b34801561059d575f80fd5b50600d546104a1906001600160a01b031681565b3480156105bc575f80fd5b506104d86105cb366004613b11565b610f31565b3480156105db575f80fd5b506104fc6105ea366004613b4f565b610fd9565b3480156105fa575f80fd5b5061044e60205481565b34801561060f575f80fd5b5060405160128152602001610458565b34801561062a575f80fd5b5061044e601f5481565b34801561063f575f80fd5b506104d861064e366004613ac5565b61117a565b34801561065e575f80fd5b506104fc61066d366004613aef565b6111b5565b34801561067d575f80fd5b50600a546104a1906001600160a01b031681565b34801561069c575f80fd5b506015546104d89060ff1681565b3480156106b5575f80fd5b506104fc611201565b3480156106c9575f80fd5b5061044e601d5481565b3480156106de575f80fd5b5060115443106104d8565b3480156106f4575f80fd5b506104fc610703366004613aef565b611310565b348015610713575f80fd5b5061044e6113c1565b348015610727575f80fd5b5061044e60075481565b34801561073c575f80fd5b5061044e60105481565b348015610751575f80fd5b5061044e601c5481565b348015610766575f80fd5b5061044e60145481565b34801561077b575f80fd5b506015546104d89062010000900460ff1681565b34801561079a575f80fd5b506104fc6107a9366004613aef565b6113d5565b3480156107b9575f80fd5b5061044e6107c8366004613aef565b6001600160a01b03165f9081526020819052604090205490565b3480156107ed575f80fd5b506104fc6107fc366004613ac5565b61146e565b34801561080c575f80fd5b506104fc611600565b348015610820575f80fd5b506104fc61082f366004613b73565b611636565b34801561083f575f80fd5b506104fc61084e366004613baa565b6116fd565b34801561085e575f80fd5b506104fc61086d366004613bc5565b6117be565b34801561087d575f80fd5b506104d861088c366004613bee565b611866565b34801561089c575f80fd5b506104fc611a99565b3480156108b0575f80fd5b5061044e60235481565b3480156108c5575f80fd5b5061044e601b5481565b3480156108da575f80fd5b506104d86108e9366004613aef565b60126020525f908152604090205460ff1681565b348015610908575f80fd5b506104fc610917366004613bc5565b611b41565b348015610927575f80fd5b5061044e60065481565b34801561093c575f80fd5b506005546001600160a01b03166104a1565b348015610959575f80fd5b50610475611cdf565b34801561096d575f80fd5b50610976611cee565b6040516104589190613c5c565b34801561098e575f80fd5b506104fc61099d366004613b73565b611d4d565b3480156109ad575f80fd5b506104d86109bc366004613ac5565b611e40565b3480156109cc575f80fd5b50600c546104a1906001600160a01b031681565b3480156109eb575f80fd5b5061044e60115481565b348015610a00575f80fd5b506104d8610a0f366004613ac5565b611ed8565b348015610a1f575f80fd5b506104d8610a2e366004613aef565b60276020525f908152604090205460ff1681565b348015610a4d575f80fd5b506015546104d890610100900460ff1681565b348015610a6b575f80fd5b506104fc610a7a366004613b73565b611ee4565b348015610a8a575f80fd5b506104fc610a99366004613bc5565b611f6c565b348015610aa9575f80fd5b506104fc610ab8366004613b4f565b61200f565b348015610ac8575f80fd5b506017546104d89060ff1681565b348015610ae1575f80fd5b5061044e60195481565b348015610af6575f80fd5b506104fc610b05366004613b4f565b6121ae565b348015610b15575f80fd5b5061044e60185481565b348015610b2a575f80fd5b506104fc610b39366004613b4f565b6122f9565b348015610b49575f80fd5b5061044e610b58366004613bee565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610b8d575f80fd5b5061044e600b5481565b348015610ba2575f80fd5b506104fc610bb1366004613b4f565b612494565b348015610bc1575f80fd5b506104fc6124d7565b348015610bd5575f80fd5b506104a1610be4366004613b4f565b61250d565b348015610bf4575f80fd5b5061044e600f5481565b348015610c09575f80fd5b5061044e601a5481565b348015610c1e575f80fd5b506104fc610c2d366004613aef565b612535565b348015610c3d575f80fd5b506104fc61261f565b348015610c51575f80fd5b5061044e601e5481565b348015610c66575f80fd5b506024546104d89060ff1681565b348015610c7f575f80fd5b5061044e60085481565b348015610c94575f80fd5b506104fc610ca3366004613aef565b612693565b606060038054610cb790613c6e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce390613c6e565b8015610d2e5780601f10610d0557610100808354040283529160200191610d2e565b820191905f5260205f20905b815481529060010190602001808311610d1157829003601f168201915b5050505050905090565b5f610d4433848461272c565b5060015b92915050565b6005546001600160a01b03163314610d815760405162461bcd60e51b8152600401610d7890613ca6565b60405180910390fd5b60245460ff1615610dd45760405162461bcd60e51b815260206004820152601860248201527f53656c6c696e6720616c726561647920656e61626c65642100000000000000006044820152606401610d78565b6024805460ff191660011790556040517f7fdc9c6ba047bed382d2ae7be131e601f2fead137f249278e33c13a6928b0808905f90a1565b6005546001600160a01b03163314610e355760405162461bcd60e51b8152600401610d7890613ca6565b602454610100900460ff16610ea65760405162461bcd60e51b815260206004820152603160248201527f4d61726b20626f742066756e6374696f6e616c69747920686173206265656e2060448201527064697361626c656420666f72657665722160781b6064820152608401610d78565b6001600160a01b0381165f9081526012602052604090205460ff1615610f0e5760405162461bcd60e51b815260206004820152601a60248201527f57616c6c657420697320616c726561647920666c61676765642e0000000000006044820152606401610d78565b6001600160a01b03165f908152601260205260409020805460ff19166001179055565b5f610f3d84848461284f565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610fc15760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610d78565b610fce853385840361272c565b506001949350505050565b6005546001600160a01b031633146110035760405162461bcd60e51b8152600401610d7890613ca6565b670de0b6b3a76400006103e861101860025490565b611023906005613cef565b61102d9190613d06565b6110379190613d06565b8110156110985760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e352560b81b6064820152608401610d78565b670de0b6b3a764000060646110ac60025490565b6110b7906002613cef565b6110c19190613d06565b6110cb9190613d06565b81111561112c5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206275792073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610d78565b61113e81670de0b6b3a7640000613cef565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610d449185906111b0908690613d25565b61272c565b6005546001600160a01b031633146111df5760405162461bcd60e51b8152600401610d7890613ca6565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461122b5760405162461bcd60e51b8152600401610d7890613ca6565b600b54305f9081526020819052604090205410156112b3576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610d78565b600a805460ff60a01b1916600160a01b1790556112ce6133a6565b600a805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b6005546001600160a01b0316331461133a5760405162461bcd60e51b8152600401610d7890613ca6565b6001600160a01b0381165f9081526012602052604090205460ff166113a15760405162461bcd60e51b815260206004820152601e60248201527f57616c6c657420697320616c7265616479206e6f7420666c61676765642e00006044820152606401610d78565b6001600160a01b03165f908152601260205260409020805460ff19169055565b5f600f54436113d09190613d38565b905090565b6005546001600160a01b031633146113ff5760405162461bcd60e51b8152600401610d7890613ca6565b6001600160a01b0381166114255760405162461bcd60e51b8152600401610d7890613d4b565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517fbe44206028f822dac2ebcaa5d159bc6dd360d15efe18e39cca3b1ed009d86c5b905f90a250565b600e546001600160a01b031633146114c85760405162461bcd60e51b815260206004820152601860248201527f4d7573742062652072656465656d6572206164647265737300000000000000006044820152606401610d78565b5f601054116115245760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920626520747269676765726564206166746572206c61756e6044820152610c6d60f31b6064820152608401610d78565b6020546010546115379062ed4e00613d25565b6115419190613d25565b42116115815760405162461bcd60e51b815260206004820152600f60248201526e10dbdbdb191bdddb881c195c9a5bd9608a1b6044820152606401610d78565b61158b82826135a6565b6b204fce5e3e250261100000006115a160025490565b116115fc5760405162461bcd60e51b815260206004820152602560248201527f57697468696e20626f756e6473206f6620636c696d61746520726571756972656044820152646d656e747360d81b6064820152608401610d78565b5050565b6005546001600160a01b0316331461162a5760405162461bcd60e51b8152600401610d7890613ca6565b6015805460ff19169055565b6005546001600160a01b031633146116605760405162461bcd60e51b8152600401610d7890613ca6565b806116d357600a546001600160a01b03908116908316036116d35760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610d78565b6001600160a01b03919091165f908152602660205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146117275760405162461bcd60e51b8152600401610d7890613ca6565b806117745760405162461bcd60e51b815260206004820152601860248201527f506c6561736520636f6e6669726d2072656e6f756e63652100000000000000006044820152606401610d78565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350600580546001600160a01b0319169055565b6005546001600160a01b031633146117e85760405162461bcd60e51b8152600401610d7890613ca6565b6019839055601a829055601b819055806118028385613d25565b61180c9190613d25565b6018819055600510156118615760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203525206f72206c657373000000006044820152606401610d78565b505050565b6005545f906001600160a01b031633146118925760405162461bcd60e51b8152600401610d7890613ca6565b6001600160a01b0383166118e85760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610d78565b6001600160a01b038316301415806119085750601554610100900460ff16155b6119715760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610d78565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156119b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d99190613d8d565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303815f875af1158015611a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4d9190613da4565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b03163314611ac35760405162461bcd60e51b8152600401610d7890613ca6565b602454610100900460ff16611b345760405162461bcd60e51b815260206004820152603160248201527f4d61726b20626f742066756e6374696f6e616c69747920616c72656164792064604482015270697361626c656420666f7265766572212160781b6064820152608401610d78565b6024805461ff0019169055565b6005546001600160a01b03163314611b6b5760405162461bcd60e51b8152600401610d7890613ca6565b601554610100900460ff1615611bd75760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610d78565b600a8310611c375760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f74206d616b652070656e616c747920626c6f636b73206d6f72652060448201526607468616e2031360cc1b6064820152608401610d78565b6015805462ffff0019166201010017905543600f81905542601055611c5d908490613d25565b6011556019829055601d8190555f601a819055601b819055611c7f8184613d25565b611c899190613d25565b6018555f601e819055601f819055601d54611ca5908290613d25565b611caf9190613d25565b601c556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb7905f90a1505050565b606060048054610cb790613c6e565b60606013805480602002602001604051908101604052809291908181526020018280548015610d2e57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611d26575050505050905090565b6005546001600160a01b03163314611d775760405162461bcd60e51b8152600401610d7890613ca6565b600a546001600160a01b0390811690831603611dfb5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610d78565b611e058282613682565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b335f9081526001602090815260408083206001600160a01b038616845290915281205482811015611ec15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d78565b611ece338585840361272c565b5060019392505050565b5f610d4433848461284f565b6005546001600160a01b03163314611f0e5760405162461bcd60e51b8152600401610d7890613ca6565b6001600160a01b0382165f81815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611f965760405162461bcd60e51b8152600401610d7890613ca6565b601d839055601e829055601f81905580611fb08385613d25565b611fba9190613d25565b601c819055601e10156118615760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401610d78565b6005546001600160a01b031633146120395760405162461bcd60e51b8152600401610d7890613ca6565b670de0b6b3a76400006103e861204e60025490565b612059906005613cef565b6120639190613d06565b61206d9190613d06565b8110156120d15760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610d78565b670de0b6b3a764000060646120e560025490565b6120f0906005613cef565b6120fa9190613d06565b6121049190613d06565b8111156121675760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e742068696760448201526a686572207468616e20352560a81b6064820152608401610d78565b61217981670de0b6b3a7640000613cef565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc9060200161116f565b6005546001600160a01b031633146121d85760405162461bcd60e51b8152600401610d7890613ca6565b620186a06121e560025490565b6121f0906001613cef565b6121fa9190613d06565b8110156122675760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610d78565b6103e861227360025490565b61227e906001613cef565b6122889190613d06565b8111156122f45760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610d78565b600b55565b6005546001600160a01b031633146123235760405162461bcd60e51b8152600401610d7890613ca6565b670de0b6b3a76400006103e861233860025490565b612343906005613cef565b61234d9190613d06565b6123579190613d06565b8110156123b95760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e352560b01b6064820152608401610d78565b670de0b6b3a764000060646123cd60025490565b6123d8906002613cef565b6123e29190613d06565b6123ec9190613d06565b81111561244d5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e7420686967686560448201526872207468616e20322560b81b6064820152608401610d78565b61245f81670de0b6b3a7640000613cef565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e9060200161116f565b6005546001600160a01b031633146124be5760405162461bcd60e51b8152600401610d7890613ca6565b8060205f8282546124cf9190613d25565b909155505050565b6005546001600160a01b031633146125015760405162461bcd60e51b8152600401610d7890613ca6565b6017805460ff19169055565b6013818154811061251c575f80fd5b5f918252602090912001546001600160a01b0316905081565b6005546001600160a01b0316331461255f5760405162461bcd60e51b8152600401610d7890613ca6565b6001600160a01b0381166125c45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d78565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146126495760405162461bcd60e51b8152600401610d7890613ca6565b6040515f90339047908381818185875af1925050503d805f8114612688576040519150601f19603f3d011682016040523d82523d5f602084013e61268d565b606091505b50505050565b6005546001600160a01b031633146126bd5760405162461bcd60e51b8152600401610d7890613ca6565b6001600160a01b0381166126e35760405162461bcd60e51b8152600401610d7890613d4b565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517f2d54fe1dc7d99066776a6768f6c1a7d9a3fc07a354dfbac8057f6f831e9ba5b7905f90a250565b6001600160a01b03831661278e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d78565b6001600160a01b0382166127ef5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d78565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166128755760405162461bcd60e51b8152600401610d7890613dbf565b6001600160a01b03821661289b5760405162461bcd60e51b8152600401610d7890613e04565b5f81116128ea5760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610d78565b601554610100900460ff1661297b576001600160a01b0383165f9081526025602052604090205460ff168061293657506001600160a01b0382165f9081526025602052604090205460ff165b61297b5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d78565b60115443101580156129945750601554610100900460ff165b15612a63576001600160a01b0383165f9081526012602052604090205460ff1615806129cd57506005546001600160a01b038381169116145b806129e257506001600160a01b03821661dead145b612a635760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610d78565b60155460ff1615612e9d576005546001600160a01b03848116911614801590612a9a57506005546001600160a01b03838116911614155b8015612ab157506001600160a01b03821661dead14155b8015612ad557506001600160a01b0383165f9081526025602052604090205460ff16155b8015612af957506001600160a01b0382165f9081526025602052604090205460ff16155b15612e9d5760175460ff1615612c0f576009546001600160a01b03838116911614801590612b355750600a546001600160a01b03838116911614155b15612c0f57612b45600243613d38565b325f90815260166020526040902054108015612b815750612b67600243613d38565b6001600160a01b0383165f90815260166020526040902054105b612beb5760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610d78565b325f9081526016602052604080822043908190556001600160a01b03851683529120555b6001600160a01b0383165f9081526027602052604090205460ff168015612c4e57506001600160a01b0382165f9081526026602052604090205460ff16155b15612d2457600654811115612cb65760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610d78565b6008546001600160a01b0383165f90815260208190526040902054612cdb9083613d25565b1115612d1f5760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d78565b612e9d565b6001600160a01b0382165f9081526027602052604090205460ff168015612d6357506001600160a01b0383165f9081526026602052604090205460ff16155b15612e155760245460ff16612db05760405162461bcd60e51b815260206004820152601360248201527214d95b1b1a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610d78565b600754811115612d1f5760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610d78565b6001600160a01b0382165f9081526026602052604090205460ff16612e9d576008546001600160a01b0383165f90815260208190526040902054612e599083613d25565b1115612e9d5760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b6044820152606401610d78565b305f90815260208190526040902054600b5481108015908190612ec8575060155462010000900460ff165b8015612ede5750600a54600160a01b900460ff16155b8015612f0157506001600160a01b0384165f9081526027602052604090205460ff165b15612f2f57600a805460ff60a01b1916600160a01b179055612f216133a6565b600a805460ff60a01b191690555b6001600160a01b0385165f9081526025602052604090205460019060ff1680612f6f57506001600160a01b0385165f9081526025602052604090205460ff165b15612f7757505f5b5f811561339257601154431080612fbc5750670c7d713b49da0000600654612f9f9190613d38565b8510158015612fbc5750436011546004612fb99190613d25565b10155b8015612fdf57506001600160a01b0387165f9081526027602052604090205460ff165b801561300357506001600160a01b0386165f9081526027602052604090205460ff16155b801561302757506001600160a01b0386165f9081526025602052604090205460ff16155b801561303457505f601854115b156131e457601154431061305a57600160065f8282546130549190613d38565b90915550505b6001600160a01b0386165f9081526012602052604090205460ff16613137576001600160a01b0386165f908152601260205260408120805460ff1916600190811790915560148054919290916130b1908490613d25565b9091555050601380546001810182555f919091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319166001600160a01b0388169081179091556040519081527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b6064613144866050613cef565b61314e9190613d06565b9050601854601a54826131619190613cef565b61316b9190613d06565b60225f82825461317b9190613d25565b90915550506018546019546131909083613cef565b61319a9190613d06565b60215f8282546131aa9190613d25565b9091555050601854601b546131bf9083613cef565b6131c99190613d06565b60235f8282546131d99190613d25565b909155506133749050565b6001600160a01b0386165f9081526027602052604090205460ff16801561320c57505f601c54115b1561329c576064601c54866132219190613cef565b61322b9190613d06565b9050601c54601e548261323e9190613cef565b6132489190613d06565b60225f8282546132589190613d25565b9091555050601c54601d5461326d9083613cef565b6132779190613d06565b60215f8282546132879190613d25565b9091555050601c54601f546131bf9083613cef565b6001600160a01b0387165f9081526027602052604090205460ff1680156132c457505f601854115b15613374576064601854866132d99190613cef565b6132e39190613d06565b9050601854601a54826132f69190613cef565b6133009190613d06565b60225f8282546133109190613d25565b90915550506018546019546133259083613cef565b61332f9190613d06565b60215f82825461333f9190613d25565b9091555050601854601b546133549083613cef565b61335e9190613d06565b60235f82825461336e9190613d25565b90915550505b8015613385576133858730836136af565b61338f8186613d38565b94505b61339d8787876136af565b50505050505050565b305f9081526020819052604081205490505f6023546021546022546133cb9190613d25565b6133d59190613d25565b90508115806133e2575080155b156133eb575050565b600b546133f990600a613cef565b82111561341157600b5461340e90600a613cef565b91505b5f80600283602254866134249190613cef565b61342e9190613d06565b6134389190613d06565b905061344c6134478286613d38565b613802565b602254479081905f9061346190600290613d06565b61346b9087613d38565b6021546134789085613cef565b6134829190613d06565b90505f60026022546134949190613d06565b61349e9088613d38565b6023546134ab9086613cef565b6134b59190613d06565b90506134c18183613d25565b6134cb9084613d38565b5f60228190556021819055602355925084158015906134e957505f83115b156134f8576134f88584613952565b600d546040516001600160a01b039091169082905f81818185875af1925050503d805f8114613542576040519150601f19603f3d011682016040523d82523d5f602084013e613547565b606091505b5050600c546040519197506001600160a01b03169047905f81818185875af1925050503d805f8114613594576040519150601f19603f3d011682016040523d82523d5f602084013e613599565b606091505b5050505050505050505050565b6001600160a01b0382166135fc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610d78565b8060025f82825461360d9190613d25565b90915550506001600160a01b0382165f9081526020819052604081208054839290613639908490613d25565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382165f908152602760205260409020805460ff1916821515179055611e058282613a01565b6001600160a01b0383166136d55760405162461bcd60e51b8152600401610d7890613dbf565b6001600160a01b0382166136fb5760405162461bcd60e51b8152600401610d7890613e04565b6001600160a01b0383165f90815260208190526040902054818110156137725760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d78565b6001600160a01b038085165f908152602081905260408082208585039055918516815290812080548492906137a8908490613d25565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516137f491815260200190565b60405180910390a350505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061383557613835613e47565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561388c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138b09190613e5b565b816001815181106138c3576138c3613e47565b6001600160a01b0392831660209182029290920101526009546138e9913091168461272c565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac947906139219085905f90869030904290600401613e76565b5f604051808303815f87803b158015613938575f80fd5b505af115801561394a573d5f803e3d5ffd5b505050505050565b60095461396a9030906001600160a01b03168461272c565b60095460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af11580156139d5573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906139fa9190613eb1565b5050505050565b6001600160a01b0382165f81815260266020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b5f6020808352835180828501525f5b81811015613a8e57858101830151858201604001528201613a72565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114613ac2575f80fd5b50565b5f8060408385031215613ad6575f80fd5b8235613ae181613aae565b946020939093013593505050565b5f60208284031215613aff575f80fd5b8135613b0a81613aae565b9392505050565b5f805f60608486031215613b23575f80fd5b8335613b2e81613aae565b92506020840135613b3e81613aae565b929592945050506040919091013590565b5f60208284031215613b5f575f80fd5b5035919050565b8015158114613ac2575f80fd5b5f8060408385031215613b84575f80fd5b8235613b8f81613aae565b91506020830135613b9f81613b66565b809150509250929050565b5f60208284031215613bba575f80fd5b8135613b0a81613b66565b5f805f60608486031215613bd7575f80fd5b505081359360208301359350604090920135919050565b5f8060408385031215613bff575f80fd5b8235613c0a81613aae565b91506020830135613b9f81613aae565b5f8151808452602080850194508084015f5b83811015613c515781516001600160a01b031687529582019590820190600101613c2c565b509495945050505050565b602081525f613b0a6020830184613c1a565b600181811c90821680613c8257607f821691505b602082108103613ca057634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610d4857610d48613cdb565b5f82613d2057634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610d4857610d48613cdb565b81810381811115610d4857610d48613cdb565b60208082526022908201527f5f6665654f6e654164647265737320616464726573732063616e6e6f74206265604082015261020360f41b606082015260800190565b5f60208284031215613d9d575f80fd5b5051919050565b5f60208284031215613db4575f80fd5b8151613b0a81613b66565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613e6b575f80fd5b8151613b0a81613aae565b85815284602082015260a060408201525f613e9460a0830186613c1a565b6001600160a01b0394909416606083015250608001529392505050565b5f805f60608486031215613ec3575f80fd5b835192506020840151915060408401519050925092509256fea2646970667358221220d563cc00e428e0a4e9415d142b2d7291d94aae5760f1228976c519dba7ca15df64736f6c63430008140033

Deployed Bytecode Sourcemap

10797:22634:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12111:30;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;12111:30:0;;;;;;;;4207:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10938:33::-;;;;;;;;;;-1:-1:-1;10938:33:0;;;;-1:-1:-1;;;;;10938:33:0;;;;;;-1:-1:-1;;;;;937:32:1;;;919:51;;907:2;892:18;10938:33:0;749:227:1;5262:210:0;;;;;;;;;;-1:-1:-1;5262:210:0;;;;;:::i;:::-;;:::i;:::-;;;1602:14:1;;1595:22;1577:41;;1565:2;1550:18;5262:210:0;1437:187:1;31244:185:0;;;;;;;;;;;;;:::i;:::-;;12370:63;;;;;;;;;;-1:-1:-1;12370:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;12265:37;;;;;;;;;;-1:-1:-1;12265:37:0;;;;;;;;;;;4528:108;;;;;;;;;;-1:-1:-1;4616:12:0;;4528:108;;12148:33;;;;;;;;;;;;;;;;15616:303;;;;;;;;;;-1:-1:-1;15616:303:0;;;;;:::i;:::-;;:::i;11113:28::-;;;;;;;;;;-1:-1:-1;11113:28:0;;;;-1:-1:-1;;;;;11113:28:0;;;5480:529;;;;;;;;;;-1:-1:-1;5480:529:0;;;;;:::i;:::-;;:::i;16275:456::-;;;;;;;;;;-1:-1:-1;16275:456:0;;;;;:::i;:::-;;:::i;12073:28::-;;;;;;;;;;;;;;;;4427:93;;;;;;;;;;-1:-1:-1;4427:93:0;;4510:2;2877:36:1;;2865:2;2850:18;4427:93:0;2735:184:1;12038:28:0;;;;;;;;;;;;;;;;6017:297;;;;;;;;;;-1:-1:-1;6017:297:0;;;;;:::i;:::-;;:::i;33182:117::-;;;;;;;;;;-1:-1:-1;33182:117:0;;;;;:::i;:::-;;:::i;10978:21::-;;;;;;;;;;-1:-1:-1;10978:21:0;;;;-1:-1:-1;;;;;10978:21:0;;;11443:33;;;;;;;;;;-1:-1:-1;11443:33:0;;;;;;;;30751:349;;;;;;;;;;;;;:::i;11965:28::-;;;;;;;;;;;;;;;;26464:121;;;;;;;;;;-1:-1:-1;26559:18:0;;26544:12;:33;26464:121;;15927:181;;;;;;;;;;-1:-1:-1;15927:181:0;;;;;:::i;:::-;;:::i;33307:121::-;;;;;;;;;;;;;:::i;10870:28::-;;;;;;;;;;;;;;;;11235:41;;;;;;;;;;;;;;;;11930:28;;;;;;;;;;;;;;;;11409:25;;;;;;;;;;;;;;;;11523:31;;;;;;;;;;-1:-1:-1;11523:31:0;;;;;;;;;;;30397:302;;;;;;;;;;-1:-1:-1;30397:302:0;;;;;:::i;:::-;;:::i;4644:177::-;;;;;;;;;;-1:-1:-1;4644:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;4795:18:0;4763:7;4795:18;;;;;;;;;;;;4644:177;32598:472;;;;;;;;;;-1:-1:-1;32598:472:0;;;;;:::i;:::-;;:::i;31152:84::-;;;;;;;;;;;;;:::i;18404:334::-;;;;;;;;;;-1:-1:-1;18404:334:0;;;;;:::i;:::-;;:::i;8731:265::-;;;;;;;;;;-1:-1:-1;8731:265:0;;;;;:::i;:::-;;:::i;19351:401::-;;;;;;;;;;-1:-1:-1;19351:401:0;;;;;:::i;:::-;;:::i;29234:567::-;;;;;;;;;;-1:-1:-1;29234:567:0;;;;;:::i;:::-;;:::i;31437:231::-;;;;;;;;;;;;;:::i;12188:30::-;;;;;;;;;;;;;;;;11894:27;;;;;;;;;;;;;;;;11324:43;;;;;;;;;;-1:-1:-1;11324:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31676:914;;;;;;;;;;-1:-1:-1;31676:914:0;;;;;:::i;:::-;;:::i;10836:27::-;;;;;;;;;;;;;;;;8517:79;;;;;;;;;;-1:-1:-1;8582:6:0;;-1:-1:-1;;;;;8582:6:0;8517:79;;4315:104;;;;;;;;;;;;;:::i;15504:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18746:353::-;;;;;;;;;;-1:-1:-1;18746:353:0;;;;;:::i;:::-;;:::i;6322:482::-;;;;;;;;;;-1:-1:-1;6322:482:0;;;;;:::i;:::-;;:::i;11078:28::-;;;;;;;;;;-1:-1:-1;11078:28:0;;;;-1:-1:-1;;;;;11078:28:0;;;11284:33;;;;;;;;;;;;;;;;4829:216;;;;;;;;;;-1:-1:-1;4829:216:0;;;;;:::i;:::-;;:::i;12440:57::-;;;;;;;;;;-1:-1:-1;12440:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;11483:33;;;;;;;;;;-1:-1:-1;11483:33:0;;;;;;;;;;;20180:182;;;;;;;;;;-1:-1:-1;20180:182:0;;;;;:::i;:::-;;:::i;19760:412::-;;;;;;;;;;-1:-1:-1;19760:412:0;;;;;:::i;:::-;;:::i;17208:461::-;;;;;;;;;;-1:-1:-1;17208:461:0;;;;;:::i;:::-;;:::i;11741:39::-;;;;;;;;;;-1:-1:-1;11741:39:0;;;;;;;;11823:27;;;;;;;;;;;;;;;;17739:428;;;;;;;;;;-1:-1:-1;17739:428:0;;;;;:::i;:::-;;:::i;11789:27::-;;;;;;;;;;;;;;;;16739:461;;;;;;;;;;-1:-1:-1;16739:461:0;;;;;:::i;:::-;;:::i;5053:201::-;;;;;;;;;;-1:-1:-1;5053:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;5219:18:0;;;5187:7;5219:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;5053:201;11036:33;;;;;;;;;;;;;;;;33078:96;;;;;;;;;;-1:-1:-1;33078:96:0;;;;;:::i;:::-;;:::i;16169:98::-;;;;;;;;;;;;;:::i;11374:28::-;;;;;;;;;;-1:-1:-1;11374:28:0;;;;;:::i;:::-;;:::i;11190:37::-;;;;;;;;;;;;;;;;11857:30;;;;;;;;;;;;;;;;9004:281;;;;;;;;;;-1:-1:-1;9004:281:0;;;;;:::i;:::-;;:::i;29871:185::-;;;;;;;;;;;;;:::i;12000:31::-;;;;;;;;;;;;;;;;12225:33;;;;;;;;;;-1:-1:-1;12225:33:0;;;;;;;;10905:24;;;;;;;;;;;;;;;;30064:325;;;;;;;;;;-1:-1:-1;30064:325:0;;;;;:::i;:::-;;:::i;4207:100::-;4261:13;4294:5;4287:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4207:100;:::o;5262:210::-;5381:4;5403:39;357:10;5426:7;5435:6;5403:8;:39::i;:::-;-1:-1:-1;5460:4:0;5262:210;;;;;:::o;31244:185::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;;;;;;;;;31312:14:::1;::::0;::::1;;31311:15;31303:52;;;::::0;-1:-1:-1;;;31303:52:0;;6074:2:1;31303:52:0::1;::::0;::::1;6056:21:1::0;6113:2;6093:18;;;6086:30;6152:26;6132:18;;;6125:54;6196:18;;31303:52:0::1;5872:348:1::0;31303:52:0::1;31368:14;:21:::0;;-1:-1:-1;;31368:21:0::1;31385:4;31368:21;::::0;;31405:16:::1;::::0;::::1;::::0;31368:14:::1;::::0;31405:16:::1;31244:185::o:0;15616:303::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;15709:18:::1;::::0;::::1;::::0;::::1;;;15687:117;;;::::0;-1:-1:-1;;;15687:117:0;;6427:2:1;15687:117:0::1;::::0;::::1;6409:21:1::0;6466:2;6446:18;;;6439:30;6505:34;6485:18;;;6478:62;-1:-1:-1;;;6556:18:1;;;6549:47;6613:19;;15687:117:0::1;6225:413:1::0;15687:117:0::1;-1:-1:-1::0;;;;;15824:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;::::1;;15823:20;15815:59;;;::::0;-1:-1:-1;;;15815:59:0;;6845:2:1;15815:59:0::1;::::0;::::1;6827:21:1::0;6884:2;6864:18;;;6857:30;6923:28;6903:18;;;6896:56;6969:18;;15815:59:0::1;6643:350:1::0;15815:59:0::1;-1:-1:-1::0;;;;;15885:19:0::1;;::::0;;;:11:::1;:19;::::0;;;;:26;;-1:-1:-1;;15885:26:0::1;15907:4;15885:26;::::0;;15616:303::o;5480:529::-;5620:4;5637:36;5647:6;5655:9;5666:6;5637:9;:36::i;:::-;-1:-1:-1;;;;;5713:19:0;;5686:24;5713:19;;;:11;:19;;;;;;;;357:10;5713:33;;;;;;;;5779:26;;;;5757:116;;;;-1:-1:-1;;;5757:116:0;;7200:2:1;5757:116:0;;;7182:21:1;7239:2;7219:18;;;7212:30;7278:34;7258:18;;;7251:62;-1:-1:-1;;;7329:18:1;;;7322:38;7377:19;;5757:116:0;6998:404:1;5757:116:0;5909:57;5918:6;357:10;5959:6;5940:16;:25;5909:8;:57::i;:::-;-1:-1:-1;5997:4:0;;5480:529;-1:-1:-1;;;;5480:529:0:o;16275:456::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;16412:4:::1;16404;16383:13;4616:12:::0;;;4528:108;16383:13:::1;:17;::::0;16399:1:::1;16383:17;:::i;:::-;16382:26;;;;:::i;:::-;16381:35;;;;:::i;:::-;16371:6;:45;;16349:136;;;::::0;-1:-1:-1;;;16349:136:0;;8136:2:1;16349:136:0::1;::::0;::::1;8118:21:1::0;8175:2;8155:18;;;8148:30;8214:34;8194:18;;;8187:62;-1:-1:-1;;;8265:18:1;;;8258:39;8314:19;;16349:136:0::1;7934:405:1::0;16349:136:0::1;16558:4;16551:3;16530:13;4616:12:::0;;;4528:108;16530:13:::1;:17;::::0;16546:1:::1;16530:17;:::i;:::-;16529:25;;;;:::i;:::-;16528:34;;;;:::i;:::-;16518:6;:44;;16496:135;;;::::0;-1:-1:-1;;;16496:135:0;;8546:2:1;16496:135:0::1;::::0;::::1;8528:21:1::0;8585:2;8565:18;;;8558:30;8624:34;8604:18;;;8597:62;-1:-1:-1;;;8675:18:1;;;8668:39;8724:19;;16496:135:0::1;8344:405:1::0;16496:135:0::1;16657:17;:6:::0;16667::::1;16657:17;:::i;:::-;16642:12;:32:::0;;;16690:33:::1;::::0;160:25:1;;;16690:33:0::1;::::0;148:2:1;133:18;16690:33:0::1;;;;;;;;16275:456:::0;:::o;6017:297::-;357:10;6132:4;6226:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6226:34:0;;;;;;;;;;6132:4;;6154:130;;6204:7;;6226:47;;6263:10;;6226:47;:::i;:::-;6154:8;:130::i;33182:117::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;33260:16:::1;:30:::0;;-1:-1:-1;;;;;;33260:30:0::1;-1:-1:-1::0;;;;;33260:30:0;;;::::1;::::0;;;::::1;::::0;;33182:117::o;30751:349::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;30856:18:::1;::::0;30846:4:::1;4763:7:::0;4795:18;;;;;;;;;;;30828:46:::1;;30806:160;;;::::0;;-1:-1:-1;;;30806:160:0;;9086:2:1;30806:160:0::1;::::0;::::1;9068:21:1::0;9105:18;;;9098:30;;;;9164:34;9144:18;;;9137:62;9235:34;9215:18;;;9208:62;9287:19;;30806:160:0::1;8884:428:1::0;30806:160:0::1;30977:8;:15:::0;;-1:-1:-1;;;;30977:15:0::1;-1:-1:-1::0;;;30977:15:0::1;::::0;;31003:10:::1;:8;:10::i;:::-;31024:8;:16:::0;;-1:-1:-1;;;;31024:16:0::1;::::0;;31056:36:::1;::::0;31076:15:::1;160:25:1::0;;31056:36:0::1;::::0;148:2:1;133:18;31056:36:0::1;;;;;;;30751:349::o:0;15927:181::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16008:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;::::1;;16000:62;;;::::0;-1:-1:-1;;;16000:62:0;;9519:2:1;16000:62:0::1;::::0;::::1;9501:21:1::0;9558:2;9538:18;;;9531:30;9597:32;9577:18;;;9570:60;9647:18;;16000:62:0::1;9317:354:1::0;16000:62:0::1;-1:-1:-1::0;;;;;16073:19:0::1;16095:5;16073:19:::0;;;:11:::1;:19;::::0;;;;:27;;-1:-1:-1;;16073:27:0::1;::::0;;15927:181::o;33307:121::-;33358:7;33401:18;;33386:12;:33;;;;:::i;:::-;33378:42;;33307:121;:::o;30397:302::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30499:28:0;::::1;30477:112;;;;-1:-1:-1::0;;;30477:112:0::1;;;;;;;:::i;:::-;30600:13;:39:::0;;-1:-1:-1;;;;;;30600:39:0::1;-1:-1:-1::0;;;;;30600:39:0;::::1;::::0;;::::1;::::0;;;30655:36:::1;::::0;::::1;::::0;-1:-1:-1;;30655:36:0::1;30397:302:::0;:::o;32598:472::-;32697:16;;-1:-1:-1;;;;;32697:16:0;32683:10;:30;32675:67;;;;-1:-1:-1;;;32675:67:0;;10414:2:1;32675:67:0;;;10396:21:1;10453:2;10433:18;;;10426:30;10492:26;10472:18;;;10465:54;10536:18;;32675:67:0;10212:348:1;32675:67:0;32786:1;32761:22;;:26;32753:73;;;;-1:-1:-1;;;32753:73:0;;10767:2:1;32753:73:0;;;10749:21:1;10806:2;10786:18;;;10779:30;10845:34;10825:18;;;10818:62;-1:-1:-1;;;10896:18:1;;;10889:32;10938:19;;32753:73:0;10565:398:1;32753:73:0;32899:9;;32863:22;;:33;;32888:8;32863:33;:::i;:::-;:45;;;;:::i;:::-;32845:15;:63;32837:91;;;;-1:-1:-1;;;32837:91:0;;11170:2:1;32837:91:0;;;11152:21:1;11209:2;11189:18;;;11182:30;-1:-1:-1;;;11228:18:1;;;11221:45;11283:18;;32837:91:0;10968:339:1;32837:91:0;32942:32;32956:9;32967:6;32942:13;:32::i;:::-;33009:11;32993:13;4616:12;;;4528:108;32993:13;:27;32985:77;;;;-1:-1:-1;;;32985:77:0;;11514:2:1;32985:77:0;;;11496:21:1;11553:2;11533:18;;;11526:30;11592:34;11572:18;;;11565:62;-1:-1:-1;;;11643:18:1;;;11636:35;11688:19;;32985:77:0;11312:401:1;32985:77:0;32598:472;;:::o;31152:84::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;31206:14:::1;:22:::0;;-1:-1:-1;;31206:22:0::1;::::0;;31152:84::o;18404:334::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;18524:4:::1;18519:155;;18581:6;::::0;-1:-1:-1;;;;;18581:6:0;;::::1;18571:16:::0;;::::1;::::0;18545:117:::1;;;::::0;-1:-1:-1;;;18545:117:0;;11920:2:1;18545:117:0::1;::::0;::::1;11902:21:1::0;11959:2;11939:18;;;11932:30;11998:34;11978:18;;;11971:62;-1:-1:-1;;;12049:18:1;;;12042:37;12096:19;;18545:117:0::1;11718:403:1::0;18545:117:0::1;-1:-1:-1::0;;;;;18684:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;18684:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;18404:334::o;8731:265::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;8858:15:::1;8850:52;;;::::0;-1:-1:-1;;;8850:52:0;;12328:2:1;8850:52:0::1;::::0;::::1;12310:21:1::0;12367:2;12347:18;;;12340:30;12406:26;12386:18;;;12379:54;12450:18;;8850:52:0::1;12126:348:1::0;8850:52:0::1;8939:6;::::0;8918:40:::1;::::0;8955:1:::1;::::0;-1:-1:-1;;;;;8939:6:0::1;::::0;8918:40:::1;::::0;8955:1;;8918:40:::1;-1:-1:-1::0;8969:6:0::1;:19:::0;;-1:-1:-1;;;;;;8969:19:0::1;::::0;;8731:265::o;19351:401::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;19501:12:::1;:25:::0;;;19537:15:::1;:31:::0;;;19579:12:::1;:25:::0;;;19594:10;19630:30:::1;19555:13:::0;19516:10;19630:30:::1;:::i;:::-;:45;;;;:::i;:::-;19615:12;:60:::0;;;19710:1:::1;-1:-1:-1::0;19694:17:0::1;19686:58;;;::::0;-1:-1:-1;;;19686:58:0;;12681:2:1;19686:58:0::1;::::0;::::1;12663:21:1::0;12720:2;12700:18;;;12693:30;12759;12739:18;;;12732:58;12807:18;;19686:58:0::1;12479:352:1::0;19686:58:0::1;19351:401:::0;;;:::o;29234:567::-;8644:6;;29348:10;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29384:20:0;::::1;29376:59;;;::::0;-1:-1:-1;;;29376:59:0;;13038:2:1;29376:59:0::1;::::0;::::1;13020:21:1::0;13077:2;13057:18;;;13050:30;13116:28;13096:18;;;13089:56;13162:18;;29376:59:0::1;12836:350:1::0;29376:59:0::1;-1:-1:-1::0;;;;;29468:23:0;::::1;29486:4;29468:23;;::::0;:41:::1;;-1:-1:-1::0;29496:13:0::1;::::0;::::1;::::0;::::1;;;29495:14;29468:41;29446:143;;;::::0;-1:-1:-1;;;29446:143:0;;13393:2:1;29446:143:0::1;::::0;::::1;13375:21:1::0;13432:2;13412:18;;;13405:30;13471:34;13451:18;;;13444:62;-1:-1:-1;;;13522:18:1;;;13515:50;13582:19;;29446:143:0::1;13191:416:1::0;29446:143:0::1;29627:39;::::0;-1:-1:-1;;;29627:39:0;;29660:4:::1;29627:39;::::0;::::1;919:51:1::0;29600:24:0::1;::::0;-1:-1:-1;;;;;29627:24:0;::::1;::::0;::::1;::::0;892:18:1;;29627:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29685:46;::::0;-1:-1:-1;;;29685:46:0;;-1:-1:-1;;;;;13993:32:1;;;29685:46:0::1;::::0;::::1;13975:51:1::0;14042:18;;;14035:34;;;29600:66:0;;-1:-1:-1;29685:23:0;;::::1;::::0;::::1;::::0;13948:18:1;;29685:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29747;::::0;;-1:-1:-1;;;;;13993:32:1;;13975:51;;14057:2;14042:18;;14035:34;;;29677:54:0;;-1:-1:-1;29747:46:0::1;::::0;13948:18:1;29747:46:0::1;;;;;;;29365:436;29234:567:::0;;;;:::o;31437:231::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;31526:18:::1;::::0;::::1;::::0;::::1;;;31504:117;;;::::0;-1:-1:-1;;;31504:117:0;;14532:2:1;31504:117:0::1;::::0;::::1;14514:21:1::0;14571:2;14551:18;;;14544:30;14610:34;14590:18;;;14583:62;-1:-1:-1;;;14661:18:1;;;14654:47;14718:19;;31504:117:0::1;14330:413:1::0;31504:117:0::1;31634:18;:26:::0;;-1:-1:-1;;31634:26:0::1;::::0;;31437:231::o;31676:914::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;31784:13:::1;::::0;::::1;::::0;::::1;;;31783:14;31775:70;;;::::0;-1:-1:-1;;;31775:70:0;;14950:2:1;31775:70:0::1;::::0;::::1;14932:21:1::0;14989:2;14969:18;;;14962:30;15028:34;15008:18;;;15001:62;-1:-1:-1;;;15079:18:1;;;15072:41;15130:19;;31775:70:0::1;14748:407:1::0;31775:70:0::1;31897:2;31878:16;:21;31856:110;;;::::0;-1:-1:-1;;;31856:110:0;;15362:2:1;31856:110:0::1;::::0;::::1;15344:21:1::0;15401:2;15381:18;;;15374:30;15440:34;15420:18;;;15413:62;-1:-1:-1;;;15491:18:1;;;15484:37;15538:19;;31856:110:0::1;15160:403:1::0;31856:110:0::1;32014:13;:20:::0;;-1:-1:-1;;32045:18:0;;;;;32095:12:::1;32074:18;:33:::0;;;32143:15:::1;32118:22;:40:::0;32191:37:::1;::::0;32212:16;;32191:37:::1;:::i;:::-;32170:18;:58:::0;32239:12:::1;:18:::0;;;32268:13:::1;:20:::0;;;-1:-1:-1;32299:15:0::1;:19:::0;;;32329:12:::1;:16:::0;;;32371:30:::1;-1:-1:-1::0;32254:3:0;32371:30:::1;:::i;:::-;:45;;;;:::i;:::-;32356:12;:60:::0;32446:1:::1;32427:16;:20:::0;;;32458:13:::1;:17:::0;;;32502:13:::1;::::0;:32:::1;::::0;32446:1;;32502:32:::1;:::i;:::-;:48;;;;:::i;:::-;32486:13;:64:::0;32566:16:::1;::::0;::::1;::::0;;;::::1;31676:914:::0;;;:::o;4315:104::-;4371:13;4404:7;4397:14;;;;;:::i;15504:104::-;15553:16;15589:11;15582:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15582:18:0;;;;;;;;;;;;;;;;;;;;;;15504:104;:::o;18746:353::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;18892:6:::1;::::0;-1:-1:-1;;;;;18892:6:0;;::::1;18884:14:::0;;::::1;::::0;18862:121:::1;;;::::0;-1:-1:-1;;;18862:121:0;;15770:2:1;18862:121:0::1;::::0;::::1;15752:21:1::0;15809:2;15789:18;;;15782:30;15848:34;15828:18;;;15821:62;15919:27;15899:18;;;15892:55;15964:19;;18862:121:0::1;15568:421:1::0;18862:121:0::1;18994:41;19023:4;19029:5;18994:28;:41::i;:::-;19051:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;19051:40:0;::::1;::::0;::::1;::::0;;;::::1;18746:353:::0;;:::o;6322:482::-;357:10;6442:4;6491:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6491:34:0;;;;;;;;;;6558:35;;;;6536:122;;;;-1:-1:-1;;;6536:122:0;;16196:2:1;6536:122:0;;;16178:21:1;16235:2;16215:18;;;16208:30;16274:34;16254:18;;;16247:62;-1:-1:-1;;;16325:18:1;;;16318:35;16370:19;;6536:122:0;15994:401:1;6536:122:0;6694:67;357:10;6717:7;6745:15;6726:16;:34;6694:8;:67::i;:::-;-1:-1:-1;6792:4:0;;6322:482;-1:-1:-1;;;6322:482:0:o;4829:216::-;4951:4;4973:42;357:10;4997:9;5008:6;4973:9;:42::i;20180:182::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20265:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;20265:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20320:34;;1577:41:1;;;20320:34:0::1;::::0;1550:18:1;20320:34:0::1;;;;;;;20180:182:::0;;:::o;19760:412::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;19911:13:::1;:26:::0;;;19948:16:::1;:32:::0;;;19991:13:::1;:26:::0;;;20007:10;20044:32:::1;19967:13:::0;19927:10;20044:32:::1;:::i;:::-;:48;;;;:::i;:::-;20028:13;:64:::0;;;20128:2:::1;-1:-1:-1::0;20111:19:0::1;20103:61;;;::::0;-1:-1:-1;;;20103:61:0;;16602:2:1;20103:61:0::1;::::0;::::1;16584:21:1::0;16641:2;16621:18;;;16614:30;16680:31;16660:18;;;16653:59;16729:18;;20103:61:0::1;16400:353:1::0;17208:461:0;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;17348:4:::1;17340;17319:13;4616:12:::0;;;4528:108;17319:13:::1;:17;::::0;17335:1:::1;17319:17;:::i;:::-;17318:26;;;;:::i;:::-;17317:35;;;;:::i;:::-;17307:6;:45;;17285:139;;;::::0;-1:-1:-1;;;17285:139:0;;16960:2:1;17285:139:0::1;::::0;::::1;16942:21:1::0;16999:2;16979:18;;;16972:30;17038:34;17018:18;;;17011:62;-1:-1:-1;;;17089:18:1;;;17082:42;17141:19;;17285:139:0::1;16758:408:1::0;17285:139:0::1;17497:4;17490:3;17469:13;4616:12:::0;;;4528:108;17469:13:::1;:17;::::0;17485:1:::1;17469:17;:::i;:::-;17468:25;;;;:::i;:::-;17467:34;;;;:::i;:::-;17457:6;:44;;17435:137;;;::::0;-1:-1:-1;;;17435:137:0;;17373:2:1;17435:137:0::1;::::0;::::1;17355:21:1::0;17412:2;17392:18;;;17385:30;17451:34;17431:18;;;17424:62;-1:-1:-1;;;17502:18:1;;;17495:41;17553:19;;17435:137:0::1;17171:407:1::0;17435:137:0::1;17595:17;:6:::0;17605::::1;17595:17;:::i;:::-;17583:9;:29:::0;;;17628:33:::1;::::0;160:25:1;;;17628:33:0::1;::::0;148:2:1;133:18;17628:33:0::1;14:177:1::0;17739:428:0;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;17879:6:::1;17858:13;4616:12:::0;;;4528:108;17858:13:::1;:17;::::0;17874:1:::1;17858:17;:::i;:::-;17857:28;;;;:::i;:::-;17844:9;:41;;17822:144;;;::::0;-1:-1:-1;;;17822:144:0;;17785:2:1;17822:144:0::1;::::0;::::1;17767:21:1::0;17824:2;17804:18;;;17797:30;17863:34;17843:18;;;17836:62;-1:-1:-1;;;17914:18:1;;;17907:51;17975:19;;17822:144:0::1;17583:417:1::0;17822:144:0::1;18034:4;18013:13;4616:12:::0;;;4528:108;18013:13:::1;:17;::::0;18029:1:::1;18013:17;:::i;:::-;18012:26;;;;:::i;:::-;17999:9;:39;;17977:141;;;::::0;-1:-1:-1;;;17977:141:0;;18207:2:1;17977:141:0::1;::::0;::::1;18189:21:1::0;18246:2;18226:18;;;18219:30;18285:34;18265:18;;;18258:62;-1:-1:-1;;;18336:18:1;;;18329:50;18396:19;;17977:141:0::1;18005:416:1::0;17977:141:0::1;18129:18;:30:::0;17739:428::o;16739:461::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;16877:4:::1;16869;16848:13;4616:12:::0;;;4528:108;16848:13:::1;:17;::::0;16864:1:::1;16848:17;:::i;:::-;16847:26;;;;:::i;:::-;16846:35;;;;:::i;:::-;16836:6;:45;;16814:137;;;::::0;-1:-1:-1;;;16814:137:0;;18628:2:1;16814:137:0::1;::::0;::::1;18610:21:1::0;18667:2;18647:18;;;18640:30;18706:34;18686:18;;;18679:62;-1:-1:-1;;;18757:18:1;;;18750:40;18807:19;;16814:137:0::1;18426:406:1::0;16814:137:0::1;17024:4;17017:3;16996:13;4616:12:::0;;;4528:108;16996:13:::1;:17;::::0;17012:1:::1;16996:17;:::i;:::-;16995:25;;;;:::i;:::-;16994:34;;;;:::i;:::-;16984:6;:44;;16962:135;;;::::0;-1:-1:-1;;;16962:135:0;;19039:2:1;16962:135:0::1;::::0;::::1;19021:21:1::0;19078:2;19058:18;;;19051:30;19117:34;19097:18;;;19090:62;-1:-1:-1;;;19168:18:1;;;19161:39;19217:19;;16962:135:0::1;18837:405:1::0;16962:135:0::1;17124:17;:6:::0;17134::::1;17124:17;:::i;:::-;17108:13;:33:::0;;;17157:35:::1;::::0;160:25:1;;;17157:35:0::1;::::0;148:2:1;133:18;17157:35:0::1;14:177:1::0;33078:96:0;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;33159:6:::1;33146:9;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;33078:96:0:o;16169:98::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;16231:20:::1;:28:::0;;-1:-1:-1;;16231:28:0::1;::::0;;16169:98::o;11374:28::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11374:28:0;;-1:-1:-1;11374:28:0;:::o;9004:281::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9107:22:0;::::1;9085:110;;;::::0;-1:-1:-1;;;9085:110:0;;19449:2:1;9085:110:0::1;::::0;::::1;19431:21:1::0;19488:2;19468:18;;;19461:30;19527:34;19507:18;;;19500:62;-1:-1:-1;;;19578:18:1;;;19571:36;19624:19;;9085:110:0::1;19247:402:1::0;9085:110:0::1;9232:6;::::0;9211:38:::1;::::0;-1:-1:-1;;;;;9211:38:0;;::::1;::::0;9232:6:::1;::::0;9211:38:::1;::::0;9232:6:::1;::::0;9211:38:::1;9260:6;:17:::0;;-1:-1:-1;;;;;;9260:17:0::1;-1:-1:-1::0;;;;;9260:17:0;;;::::1;::::0;;;::::1;::::0;;9004:281::o;29871:185::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;29966:82:::1;::::0;29929:12:::1;::::0;29974:10:::1;::::0;29998:21:::1;::::0;29929:12;29966:82;29929:12;29966:82;29998:21;29974:10;29966:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;29871:185:0:o;30064:325::-;8644:6;;-1:-1:-1;;;;;8644:6:0;357:10;8644:22;8636:67;;;;-1:-1:-1;;;8636:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30189:28:0;::::1;30167:112;;;;-1:-1:-1::0;;;30167:112:0::1;;;;;;;:::i;:::-;30290:13;:39:::0;;-1:-1:-1;;;;;;30290:39:0::1;-1:-1:-1::0;;;;;30290:39:0;::::1;::::0;;::::1;::::0;;;30345:36:::1;::::0;::::1;::::0;-1:-1:-1;;30345:36:0::1;30064:325:::0;:::o;7786:380::-;-1:-1:-1;;;;;7922:19:0;;7914:68;;;;-1:-1:-1;;;7914:68:0;;20066:2:1;7914:68:0;;;20048:21:1;20105:2;20085:18;;;20078:30;20144:34;20124:18;;;20117:62;-1:-1:-1;;;20195:18:1;;;20188:34;20239:19;;7914:68:0;19864:400:1;7914:68:0;-1:-1:-1;;;;;8001:21:0;;7993:68;;;;-1:-1:-1;;;7993:68:0;;20471:2:1;7993:68:0;;;20453:21:1;20510:2;20490:18;;;20483:30;20549:34;20529:18;;;20522:62;-1:-1:-1;;;20600:18:1;;;20593:32;20642:19;;7993:68:0;20269:398:1;7993:68:0;-1:-1:-1;;;;;8074:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;8126:32;;160:25:1;;;8126:32:0;;133:18:1;8126:32:0;;;;;;;7786:380;;;:::o;20370:6086::-;-1:-1:-1;;;;;20502:18:0;;20494:68;;;;-1:-1:-1;;;20494:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20581:16:0;;20573:64;;;;-1:-1:-1;;;20573:64:0;;;;;;;:::i;:::-;20665:1;20656:6;:10;20648:52;;;;-1:-1:-1;;;20648:52:0;;21684:2:1;20648:52:0;;;21666:21:1;21723:2;21703:18;;;21696:30;21762:31;21742:18;;;21735:59;21811:18;;20648:52:0;21482:353:1;20648:52:0;20718:13;;;;;;;20713:183;;-1:-1:-1;;;;;20774:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;20803:23:0;;;;;;:19;:23;;;;;;;;20774:52;20748:136;;;;-1:-1:-1;;;20748:136:0;;22042:2:1;20748:136:0;;;22024:21:1;22081:2;22061:18;;;22054:30;-1:-1:-1;;;22100:18:1;;;22093:52;22162:18;;20748:136:0;21840:346:1;20748:136:0;26559:18;;26544:12;:33;20912:26;:43;;;;-1:-1:-1;20942:13:0;;;;;;;20912:43;20908:268;;;-1:-1:-1;;;;;20999:17:0;;;;;;:11;:17;;;;;;;;20998:18;;:35;;-1:-1:-1;8582:6:0;;-1:-1:-1;;;;;21020:13:0;;;8582:6;;21020:13;20998:35;:60;;;-1:-1:-1;;;;;;21037:21:0;;21051:6;21037:21;20998:60;20972:192;;;;-1:-1:-1;;;20972:192:0;;22393:2:1;20972:192:0;;;22375:21:1;22432:2;22412:18;;;22405:30;22471:34;22451:18;;;22444:62;22542:34;22522:18;;;22515:62;-1:-1:-1;;;22593:19:1;;;22586:37;22640:19;;20972:192:0;22191:474:1;20972:192:0;21192:14;;;;21188:2217;;;8582:6;;-1:-1:-1;;;;;21245:15:0;;;8582:6;;21245:15;;;;:49;;-1:-1:-1;8582:6:0;;-1:-1:-1;;;;;21281:13:0;;;8582:6;;21281:13;;21245:49;:91;;;;-1:-1:-1;;;;;;21315:21:0;;21329:6;21315:21;;21245:91;:138;;;;-1:-1:-1;;;;;;21358:25:0;;;;;;:19;:25;;;;;;;;21357:26;21245:138;:183;;;;-1:-1:-1;;;;;;21405:23:0;;;;;;:19;:23;;;;;;;;21404:24;21245:183;21223:2171;;;21467:20;;;;21463:692;;;21530:9;;-1:-1:-1;;;;;21516:24:0;;;21530:9;;21516:24;;;;:49;;-1:-1:-1;21558:6:0;;-1:-1:-1;;;;;21544:21:0;;;21558:6;;21544:21;;21516:49;21512:624;;;21707:16;21722:1;21707:12;:16;:::i;:::-;21661:9;21632:39;;;;:28;:39;;;;;;:91;:212;;;;-1:-1:-1;21828:16:0;21843:1;21828:12;:16;:::i;:::-;-1:-1:-1;;;;;21760:32:0;;;;;;:28;:32;;;;;;:84;21632:212;21594:363;;;;-1:-1:-1;;;21594:363:0;;22872:2:1;21594:363:0;;;22854:21:1;22911:2;22891:18;;;22884:30;22950:34;22930:18;;;22923:62;-1:-1:-1;;;23001:18:1;;;22994:51;23062:19;;21594:363:0;22670:417:1;21594:363:0;22013:9;21984:39;;;;:28;:39;;;;;;22026:12;21984:54;;;;-1:-1:-1;;;;;22065:32:0;;;;;;:47;21512:624;-1:-1:-1;;;;;22229:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;22286:35:0;;;;;;:31;:35;;;;;;;;22285:36;22229:92;22203:1176;;;22408:12;;22398:6;:22;;22364:148;;;;-1:-1:-1;;;22364:148:0;;23294:2:1;22364:148:0;;;23276:21:1;23333:2;23313:18;;;23306:30;23372:34;23352:18;;;23345:62;-1:-1:-1;;;23423:18:1;;;23416:38;23471:19;;22364:148:0;23092:404:1;22364:148:0;22595:9;;-1:-1:-1;;;;;4795:18:0;;4763:7;4795:18;;;;;;;;;;;22569:22;;:6;:22;:::i;:::-;:35;;22535:140;;;;-1:-1:-1;;;22535:140:0;;23703:2:1;22535:140:0;;;23685:21:1;23742:2;23722:18;;;23715:30;-1:-1:-1;;;23761:18:1;;;23754:49;23820:18;;22535:140:0;23501:343:1;22535:140:0;22203:1176;;;-1:-1:-1;;;;;22773:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;22828:37:0;;;;;;:31;:37;;;;;;;;22827:38;22773:92;22747:632;;;22916:14;;;;22908:46;;;;-1:-1:-1;;;22908:46:0;;24051:2:1;22908:46:0;;;24033:21:1;24090:2;24070:18;;;24063:30;-1:-1:-1;;;24109:18:1;;;24102:49;24168:18;;22908:46:0;23849:343:1;22908:46:0;23021:13;;23011:6;:23;;22977:151;;;;-1:-1:-1;;;22977:151:0;;24399:2:1;22977:151:0;;;24381:21:1;24438:2;24418:18;;;24411:30;24477:34;24457:18;;;24450:62;-1:-1:-1;;;24528:18:1;;;24521:40;24578:19;;22977:151:0;24197:406:1;22747:632:0;-1:-1:-1;;;;;23159:35:0;;;;;;:31;:35;;;;;;;;23154:225;;23279:9;;-1:-1:-1;;;;;4795:18:0;;4763:7;4795:18;;;;;;;;;;;23253:22;;:6;:22;:::i;:::-;:35;;23219:140;;;;-1:-1:-1;;;23219:140:0;;23703:2:1;23219:140:0;;;23685:21:1;23742:2;23722:18;;;23715:30;-1:-1:-1;;;23761:18:1;;;23754:49;23820:18;;23219:140:0;23501:343:1;23219:140:0;23466:4;23417:28;4795:18;;;;;;;;;;;23524;;23500:42;;;;;;;23573:22;;-1:-1:-1;23584:11:0;;;;;;;23573:22;:35;;;;-1:-1:-1;23600:8:0;;-1:-1:-1;;;23600:8:0;;;;23599:9;23573:35;:68;;;;-1:-1:-1;;;;;;23612:29:0;;;;;;:25;:29;;;;;;;;23573:68;23555:196;;;23668:8;:15;;-1:-1:-1;;;;23668:15:0;-1:-1:-1;;;23668:15:0;;;23698:10;:8;:10::i;:::-;23723:8;:16;;-1:-1:-1;;;;23723:16:0;;;23555:196;-1:-1:-1;;;;;23882:25:0;;23763:12;23882:25;;;:19;:25;;;;;;23778:4;;23882:25;;;:52;;-1:-1:-1;;;;;;23911:23:0;;;;;;:19;:23;;;;;;;;23882:52;23878:100;;;-1:-1:-1;23961:5:0;23878:100;23990:12;24095:7;24091:2312;;;26559:18;;26544:12;:33;24178:152;;;;24254:8;24239:12;;:23;;;;:::i;:::-;24229:6;:33;;:100;;;;;24317:12;24291:18;;24312:1;24291:22;;;;:::i;:::-;:38;;24229:100;24177:206;;;;-1:-1:-1;;;;;;24352:31:0;;;;;;:25;:31;;;;;;;;24177:206;:257;;;;-1:-1:-1;;;;;;24405:29:0;;;;;;:25;:29;;;;;;;;24404:30;24177:257;:302;;;;-1:-1:-1;;;;;;24456:23:0;;;;;;:19;:23;;;;;;;;24455:24;24177:302;:339;;;;;24515:1;24500:12;;:16;24177:339;24155:2099;;;26559:18;;26544:12;:33;24551:332;;24862:1;24846:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;24551:332:0;-1:-1:-1;;;;;24908:15:0;;;;;;:11;:15;;;;;;;;24903:216;;-1:-1:-1;;;;;24948:15:0;;;;;;:11;:15;;;;;:22;;-1:-1:-1;;24948:22:0;24966:4;24948:22;;;;;;24993:10;:15;;24966:4;;24993:10;;:15;;24966:4;;24993:15;:::i;:::-;;;;-1:-1:-1;;25031:11:0;:20;;;;;;;-1:-1:-1;25031:20:0;;;;;;;;-1:-1:-1;;;;;;25031:20:0;-1:-1:-1;;;;;25031:20:0;;;;;;;;25079;;919:51:1;;;25079:20:0;;907:2:1;892:18;25079:20:0;;;;;;;24903:216;25162:3;25147:11;:6;25156:2;25147:11;:::i;:::-;25146:19;;;;:::i;:::-;25139:26;;25233:12;;25214:15;;25207:4;:22;;;;:::i;:::-;25206:39;;;;:::i;:::-;25184:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;25307:12:0;;25291;;25284:19;;:4;:19;:::i;:::-;25283:36;;;;:::i;:::-;25264:15;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;25381:12:0;;25365;;25358:19;;:4;:19;:::i;:::-;25357:36;;;;:::i;:::-;25338:15;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;24155:2099:0;;-1:-1:-1;24155:2099:0;;-1:-1:-1;;;;;25456:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;25505:1;25489:13;;:17;25456:50;25452:802;;;25561:3;25544:13;;25535:6;:22;;;;:::i;:::-;25534:30;;;;:::i;:::-;25527:37;;25633:13;;25613:16;;25606:4;:23;;;;:::i;:::-;25605:41;;;;:::i;:::-;25583:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;25751:13:0;;25713;;25706:20;;:4;:20;:::i;:::-;25705:59;;;;:::i;:::-;25665:15;;:99;;;;;;;:::i;:::-;;;;-1:-1:-1;;25827:13:0;;25810;;25803:20;;:4;:20;:::i;25452:802::-;-1:-1:-1;;;;;25902:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;25952:1;25937:12;;:16;25902:51;25898:356;;;26007:3;25991:12;;25982:6;:21;;;;:::i;:::-;25981:29;;;;:::i;:::-;25974:36;;26078:12;;26059:15;;26052:4;:22;;;;:::i;:::-;26051:39;;;;:::i;:::-;26029:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;26152:12:0;;26136;;26129:19;;:4;:19;:::i;:::-;26128:36;;;;:::i;:::-;26109:15;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;26226:12:0;;26210;;26203:19;;:4;:19;:::i;:::-;26202:36;;;;:::i;:::-;26183:15;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;25898:356:0;26274:8;;26270:91;;26303:42;26319:4;26333;26340;26303:15;:42::i;:::-;26377:14;26387:4;26377:14;;:::i;:::-;;;24091:2312;26415:33;26431:4;26437:2;26441:6;26415:15;:33::i;:::-;20483:5973;;;;20370:6086;;;:::o;27689:1537::-;27772:4;27728:23;4795:18;;;;;;;;;;;27728:50;;27789:25;27882:15;;27851;;27817:18;;:49;;;;:::i;:::-;:80;;;;:::i;:::-;27789:108;-1:-1:-1;27914:20:0;;;:46;;-1:-1:-1;27938:22:0;;27914:46;27910:85;;;27977:7;;27689:1537::o;27910:85::-;28029:18;;:23;;28050:2;28029:23;:::i;:::-;28011:15;:41;28007:115;;;28087:18;;:23;;28108:2;28087:23;:::i;:::-;28069:41;;28007:115;28134:12;28208:23;28321:1;28288:17;28253:18;;28235:15;:36;;;;:::i;:::-;28234:71;;;;:::i;:::-;:88;;;;:::i;:::-;28208:114;-1:-1:-1;28335:51:0;28352:33;28208:114;28352:15;:33;:::i;:::-;28335:16;:51::i;:::-;28592:18;;28420:21;;;;28399:18;;28592:22;;28613:1;;28592:22;:::i;:::-;28571:44;;:17;:44;:::i;:::-;28538:15;;28525:28;;:10;:28;:::i;:::-;28524:92;;;;:::i;:::-;28501:115;;28627:20;28739:1;28718:18;;:22;;;;:::i;:::-;28697:44;;:17;:44;:::i;:::-;28664:15;;28651:28;;:10;:28;:::i;:::-;28650:92;;;;:::i;:::-;28627:115;-1:-1:-1;28774:27:0;28627:115;28774:12;:27;:::i;:::-;28755:46;;;;:::i;:::-;28835:1;28814:18;:22;;;28847:15;:19;;;28877:15;:19;28755:46;-1:-1:-1;28913:19:0;;;;;:42;;;28954:1;28936:15;:19;28913:42;28909:121;;;28972:46;28985:15;29002;28972:12;:46::i;:::-;29064:13;;29056:52;;-1:-1:-1;;;;;29064:13:0;;;;29091:12;;29056:52;;;;29091:12;29064:13;29056:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29141:13:0;;29133:85;;29042:66;;-1:-1:-1;;;;;;29141:13:0;;29182:21;;29133:85;;;;29182:21;29141:13;29133:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27689:1537:0:o;7471:307::-;-1:-1:-1;;;;;7586:21:0;;7578:65;;;;-1:-1:-1;;;7578:65:0;;24810:2:1;7578:65:0;;;24792:21:1;24849:2;24829:18;;;24822:30;24888:33;24868:18;;;24861:61;24939:18;;7578:65:0;24608:355:1;7578:65:0;7672:6;7656:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;7689:18:0;;:9;:18;;;;;;;;;;:28;;7711:6;;7689:9;:28;;7711:6;;7689:28;:::i;:::-;;;;-1:-1:-1;;7733:37:0;;160:25:1;;;-1:-1:-1;;;;;7733:37:0;;;7750:1;;7733:37;;148:2:1;133:18;7733:37:0;;;;;;;7471:307;;:::o;19107:236::-;-1:-1:-1;;;;;19190:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;19190:39:0;;;;;;;19240;19190:31;:39;19240:26;:39::i;6812:651::-;-1:-1:-1;;;;;6952:20:0;;6944:70;;;;-1:-1:-1;;;6944:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7033:23:0;;7025:71;;;;-1:-1:-1;;;7025:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7133:17:0;;7109:21;7133:17;;;;;;;;;;;7183:23;;;;7161:111;;;;-1:-1:-1;;;7161:111:0;;25170:2:1;7161:111:0;;;25152:21:1;25209:2;25189:18;;;25182:30;25248:34;25228:18;;;25221:62;-1:-1:-1;;;25299:18:1;;;25292:36;25345:19;;7161:111:0;24968:402:1;7161:111:0;-1:-1:-1;;;;;7308:17:0;;;:9;:17;;;;;;;;;;;7328:22;;;7308:42;;7372:20;;;;;;;;:30;;7344:6;;7308:9;7372:30;;7344:6;;7372:30;:::i;:::-;;;;;;;;7437:9;-1:-1:-1;;;;;7420:35:0;7429:6;-1:-1:-1;;;;;7420:35:0;;7448:6;7420:35;;;;160:25:1;;148:2;133:18;;14:177;7420:35:0;;;;;;;;6933:530;6812:651;;;:::o;26593:571::-;26743:16;;;26757:1;26743:16;;;;;;;;26719:21;;26743:16;;;;;;;;;;-1:-1:-1;26743:16:0;26719:40;;26788:4;26770;26775:1;26770:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26770:23:0;;;:7;;;;;;;;;;:23;;;;26814:9;;:16;;;-1:-1:-1;;;26814:16:0;;;;:9;;;;;:14;;:16;;;;;26770:7;;26814:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26804:4;26809:1;26804:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26804:26:0;;;:7;;;;;;;;;:26;26875:9;;26843:56;;26860:4;;26875:9;26887:11;26843:8;:56::i;:::-;26938:9;;:218;;-1:-1:-1;;;26938:218:0;;-1:-1:-1;;;;;26938:9:0;;;;:60;;:218;;27013:11;;26938:9;;27083:4;;27110;;27130:15;;26938:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26648:516;26593:571;:::o;27172:509::-;27352:9;;27320:56;;27337:4;;-1:-1:-1;;;;;27352:9:0;27364:11;27320:8;:56::i;:::-;27419:9;;:254;;-1:-1:-1;;;27419:254:0;;27485:4;27419:254;;;26823:34:1;26873:18;;;26866:34;;;27419:9:0;26916:18:1;;;26909:34;;;26959:18;;;26952:34;27625:6:0;27002:19:1;;;26995:44;27647:15:0;27055:19:1;;;27048:35;-1:-1:-1;;;;;27419:9:0;;;;:25;;27452:9;;26757:19:1;;27419:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;27172:509;;:::o;18175:221::-;-1:-1:-1;;;;;18277:39:0;;;;;;:31;:39;;;;;;;;;:52;;-1:-1:-1;;18277:52:0;;;;;;;;;;18345:43;;27573:51:1;;;27640:18;;;27633:50;18345:43:0;;27546:18:1;18345:43:0;;;;;;;18175:221;;:::o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;981:131::-;-1:-1:-1;;;;;1056:31:1;;1046:42;;1036:70;;1102:1;1099;1092:12;1036:70;981:131;:::o;1117:315::-;1185:6;1193;1246:2;1234:9;1225:7;1221:23;1217:32;1214:52;;;1262:1;1259;1252:12;1214:52;1301:9;1288:23;1320:31;1345:5;1320:31;:::i;:::-;1370:5;1422:2;1407:18;;;;1394:32;;-1:-1:-1;;;1117:315:1:o;1629:247::-;1688:6;1741:2;1729:9;1720:7;1716:23;1712:32;1709:52;;;1757:1;1754;1747:12;1709:52;1796:9;1783:23;1815:31;1840:5;1815:31;:::i;:::-;1865:5;1629:247;-1:-1:-1;;;1629:247:1:o;2089:456::-;2166:6;2174;2182;2235:2;2223:9;2214:7;2210:23;2206:32;2203:52;;;2251:1;2248;2241:12;2203:52;2290:9;2277:23;2309:31;2334:5;2309:31;:::i;:::-;2359:5;-1:-1:-1;2416:2:1;2401:18;;2388:32;2429:33;2388:32;2429:33;:::i;:::-;2089:456;;2481:7;;-1:-1:-1;;;2535:2:1;2520:18;;;;2507:32;;2089:456::o;2550:180::-;2609:6;2662:2;2650:9;2641:7;2637:23;2633:32;2630:52;;;2678:1;2675;2668:12;2630:52;-1:-1:-1;2701:23:1;;2550:180;-1:-1:-1;2550:180:1:o;2924:118::-;3010:5;3003:13;2996:21;2989:5;2986:32;2976:60;;3032:1;3029;3022:12;3047:382;3112:6;3120;3173:2;3161:9;3152:7;3148:23;3144:32;3141:52;;;3189:1;3186;3179:12;3141:52;3228:9;3215:23;3247:31;3272:5;3247:31;:::i;:::-;3297:5;-1:-1:-1;3354:2:1;3339:18;;3326:32;3367:30;3326:32;3367:30;:::i;:::-;3416:7;3406:17;;;3047:382;;;;;:::o;3434:241::-;3490:6;3543:2;3531:9;3522:7;3518:23;3514:32;3511:52;;;3559:1;3556;3549:12;3511:52;3598:9;3585:23;3617:28;3639:5;3617:28;:::i;3680:316::-;3757:6;3765;3773;3826:2;3814:9;3805:7;3801:23;3797:32;3794:52;;;3842:1;3839;3832:12;3794:52;-1:-1:-1;;3865:23:1;;;3935:2;3920:18;;3907:32;;-1:-1:-1;3986:2:1;3971:18;;;3958:32;;3680:316;-1:-1:-1;3680:316:1:o;4001:388::-;4069:6;4077;4130:2;4118:9;4109:7;4105:23;4101:32;4098:52;;;4146:1;4143;4136:12;4098:52;4185:9;4172:23;4204:31;4229:5;4204:31;:::i;:::-;4254:5;-1:-1:-1;4311:2:1;4296:18;;4283:32;4324:33;4283:32;4324:33;:::i;4394:461::-;4447:3;4485:5;4479:12;4512:6;4507:3;4500:19;4538:4;4567:2;4562:3;4558:12;4551:19;;4604:2;4597:5;4593:14;4625:1;4635:195;4649:6;4646:1;4643:13;4635:195;;;4714:13;;-1:-1:-1;;;;;4710:39:1;4698:52;;4770:12;;;;4805:15;;;;4746:1;4664:9;4635:195;;;-1:-1:-1;4846:3:1;;4394:461;-1:-1:-1;;;;;4394:461:1:o;4860:261::-;5039:2;5028:9;5021:21;5002:4;5059:56;5111:2;5100:9;5096:18;5088:6;5059:56;:::i;5126:380::-;5205:1;5201:12;;;;5248;;;5269:61;;5323:4;5315:6;5311:17;5301:27;;5269:61;5376:2;5368:6;5365:14;5345:18;5342:38;5339:161;;5422:10;5417:3;5413:20;5410:1;5403:31;5457:4;5454:1;5447:15;5485:4;5482:1;5475:15;5339:161;;5126:380;;;:::o;5511:356::-;5713:2;5695:21;;;5732:18;;;5725:30;5791:34;5786:2;5771:18;;5764:62;5858:2;5843:18;;5511:356::o;7407:127::-;7468:10;7463:3;7459:20;7456:1;7449:31;7499:4;7496:1;7489:15;7523:4;7520:1;7513:15;7539:168;7612:9;;;7643;;7660:15;;;7654:22;;7640:37;7630:71;;7681:18;;:::i;7712:217::-;7752:1;7778;7768:132;;7822:10;7817:3;7813:20;7810:1;7803:31;7857:4;7854:1;7847:15;7885:4;7882:1;7875:15;7768:132;-1:-1:-1;7914:9:1;;7712:217::o;8754:125::-;8819:9;;;8840:10;;;8837:36;;;8853:18;;:::i;9676:128::-;9743:9;;;9764:11;;;9761:37;;;9778:18;;:::i;9809:398::-;10011:2;9993:21;;;10050:2;10030:18;;;10023:30;10089:34;10084:2;10069:18;;10062:62;-1:-1:-1;;;10155:2:1;10140:18;;10133:32;10197:3;10182:19;;9809:398::o;13612:184::-;13682:6;13735:2;13723:9;13714:7;13710:23;13706:32;13703:52;;;13751:1;13748;13741:12;13703:52;-1:-1:-1;13774:16:1;;13612:184;-1:-1:-1;13612:184:1:o;14080:245::-;14147:6;14200:2;14188:9;14179:7;14175:23;14171:32;14168:52;;;14216:1;14213;14206:12;14168:52;14248:9;14242:16;14267:28;14289:5;14267:28;:::i;20672:401::-;20874:2;20856:21;;;20913:2;20893:18;;;20886:30;20952:34;20947:2;20932:18;;20925:62;-1:-1:-1;;;21018:2:1;21003:18;;20996:35;21063:3;21048:19;;20672:401::o;21078:399::-;21280:2;21262:21;;;21319:2;21299:18;;;21292:30;21358:34;21353:2;21338:18;;21331:62;-1:-1:-1;;;21424:2:1;21409:18;;21402:33;21467:3;21452:19;;21078:399::o;25507:127::-;25568:10;25563:3;25559:20;25556:1;25549:31;25599:4;25596:1;25589:15;25623:4;25620:1;25613:15;25639:251;25709:6;25762:2;25750:9;25741:7;25737:23;25733:32;25730:52;;;25778:1;25775;25768:12;25730:52;25810:9;25804:16;25829:31;25854:5;25829:31;:::i;25895:582::-;26194:6;26183:9;26176:25;26237:6;26232:2;26221:9;26217:18;26210:34;26280:3;26275:2;26264:9;26260:18;26253:31;26157:4;26301:57;26353:3;26342:9;26338:19;26330:6;26301:57;:::i;:::-;-1:-1:-1;;;;;26394:32:1;;;;26389:2;26374:18;;26367:60;-1:-1:-1;26458:3:1;26443:19;26436:35;26293:65;25895:582;-1:-1:-1;;;25895:582:1:o;27094:306::-;27182:6;27190;27198;27251:2;27239:9;27230:7;27226:23;27222:32;27219:52;;;27267:1;27264;27257:12;27219:52;27296:9;27290:16;27280:26;;27346:2;27335:9;27331:18;27325:25;27315:35;;27390:2;27379:9;27375:18;27369:25;27359:35;;27094:306;;;;;:::o

Swarm Source

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