Overview ERC20

Price
$0.00 @ 0.000000 ETH
Fully Diluted Market Cap
Total Supply:
1,000,000,000 KEKAI

Holders:
55 addresses

Transfers:
-

Contract:
0x2067694cf3e2e16154f225a6e52ae0e4386fb77a0x2067694cf3E2e16154F225a6e52Ae0e4386Fb77a

Decimals:
18

Official Site:

Social Profiles:

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Kek AI is an AI-powered motion image generator/talking digital humans, meme, and jokes generator. It currently runs on the Arbitrum network.


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

Contract Source Code Verified (Exact Match)

Contract Name:
KEKAIARB

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2023-04-03
*/

// SPDX-License-Identifier: MIT
pragma solidity =0.8.19;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IERC20 {

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        _afterTokenTransfer(sender, recipient, amount);
    }

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

        _beforeTokenTransfer(address(0), account, amount);

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

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

library SafeMath {

    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

////// src/IUniswapV2Router02.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        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 swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

contract KEKAIARB is ERC20, Ownable { // Contract name
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public marketingWallet;
    address public devWallet;

    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;

    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;


    mapping(address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event ExcludeFromFees(address indexed account, bool isExcluded);

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

    event marketingWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event devWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

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

    event AutoNukeLP();

    event ManualNukeLP();

    constructor() ERC20("KEK AI", "KEKAI") { // "Name","SYMBOL"
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506
        );

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        // Buy Fees
        uint256 _buyMarketingFee = 2;
        uint256 _buyLiquidityFee = 1;
        uint256 _buyDevFee = 2;
        // Sell Fees
        uint256 _sellMarketingFee = 2;
        uint256 _sellLiquidityFee = 1;
        uint256 _sellDevFee = 2;

        uint256 totalSupply = 1_000_000_000 * 1e18; // Total Supply

        maxTransactionAmount = (totalSupply) / 100; // 1% from total supply maxTransactionAmountTxn
        maxWallet = (totalSupply) / 100; // 1% from total supply maxWallet
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05% swap wallet

        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;

        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;

        marketingWallet = address(0xe6C27e78F4F595032B3f686C808b5C15f04D976D); // Mkt Wallet
        devWallet = address(0x7D9Ce0113176D869c2C9f924cb4Fde437FDD9941); // Dev Wallet

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

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    /// @notice Launches the token and enables trading. Irriversable.
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
    }

    /// @notice Removes the max wallet and max transaction limits
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    /// @notice Changes the minimum balance of tokens the contract must have before swapping tokens for ETH
    /// @param newAmount Base 100000, so 0.5% = 500.
    function updateSwapTokensAtAmount(uint256 newAmount)
        external
        onlyOwner
        returns (bool)
    {
        require(
            newAmount >= 1,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= 500,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = newAmount * totalSupply()/ 100000;
        return true;
    }

    /// @notice Changes the maximum amount of tokens that can be bought or sold in a single transaction
    /// @param newNum Base 1000, so 1% = 10
    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1000) / 1e18,
            "Cannot set maxTransactionAmount lower than 0.1%"
        );
        maxTransactionAmount = newNum * (10**18);
    }

    /// @notice Changes the maximum amount of tokens a wallet can hold
    /// @param newNum Base 1000, so 1% = 10
    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= 5,
            "Cannot set maxWallet lower than 0.5%"
        );
        maxWallet = newNum * totalSupply()/1000;
    }

    /// @notice Sets if a wallet is excluded from the max wallet and tx limits
    /// @param updAds The wallet to update
    /// @param isEx If the wallet is excluded or not
    function excludeFromMaxTransaction(address updAds, bool isEx)
        public
        onlyOwner
    {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    /// @notice Sets if the contract can sell tokens
    /// @param enabled set to false to disable selling
    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    /// @notice Sets the fees for buys
    /// @param _marketingFee The fee for the marketing wallet
    /// @param _liquidityFee The fee for the liquidity pool
    /// @param _devFee The fee for the dev wallet
    function updateBuyFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _devFee
    ) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyDevFee = _devFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
        require(buyTotalFees <= 11, "Must keep fees at 11% or less");
    }

    /// @notice Sets the fees for sells
    /// @param _marketingFee The fee for the marketing wallet
    /// @param _liquidityFee The fee for the liquidity pool
    /// @param _devFee The fee for the dev wallet
    function updateSellFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _devFee
    ) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellDevFee = _devFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
        require(sellTotalFees <= 11, "Must keep fees at 11% or less");
    }

    /// @notice Sets if a wallet is excluded from fees
    /// @param account The wallet to update
    /// @param excluded If the wallet is excluded or not
    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    /// @notice Sets an address as a new liquidity pair. You probably dont want to do this.
    /// @param pair The new pair
    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateMarketingWallet(address newMarketingWallet)
        external
        onlyOwner
    {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function updateDevWallet(address newWallet) external onlyOwner {
        emit devWalletUpdated(newWallet, devWallet);
        devWallet = newWallet;
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    event BoughtEarly(address indexed sniper);

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

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ) {
                if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Trading is not active."
                    );
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy transfer amount exceeds the maxTransactionAmount."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Sell transfer amount exceeds the maxTransactionAmount."
                    );
                } 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[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

        // 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) {
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForDev += (fees * sellDevFee) / sellTotalFees;
                tokensForMarketing += (fees * sellMarketingFee) / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForDev += (fees * buyDevFee) / buyTotalFees;
                tokensForMarketing += (fees * buyMarketingFee) / buyTotalFees;
            }

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

            amount -= fees;
        }

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

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

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

        // make the swap
        uniswapV2Router.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(uniswapV2Router), tokenAmount);

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

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForMarketing +
            tokensForDev;
        bool success;

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

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

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

        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH);

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);

        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(
            totalTokensToSwap
        );
        uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap);

        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;

        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForDev = 0;

        (success, ) = address(devWallet).call{value: ethForDev}("");

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                tokensForLiquidity
            );
        }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sniper","type":"address"}],"name":"BoughtEarly","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":[],"name":"ManualNukeLP","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":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"devWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","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":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","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":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"tokensForDev","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":"tokensForMarketing","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":[{"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":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600b805462ffffff191660011790553480156200002057600080fd5b50604051806040016040528060068152602001654b454b20414960d01b815250604051806040016040528060058152602001644b454b414960d81b81525081600390816200006f91906200071f565b5060046200007e82826200071f565b5050506200009b62000095620003c360201b60201c565b620003c7565b731b02da8cb0d097eb8d57a175b88c7d8b47997506620000bd81600162000419565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000108573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012e9190620007eb565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200017c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001a29190620007eb565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620001f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002169190620007eb565b6001600160a01b031660a08190526200023190600162000419565b60a0516200024190600162000493565b60026001818082816b033b2e3c9fd0803ce80000006200026360648262000833565b6008556200027360648262000833565b600a556127106200028682600562000856565b62000292919062000833565b600955600d879055600e869055600f85905584620002b1878962000876565b620002bd919062000876565b600c5560118490556012839055601382905581620002dc848662000876565b620002e8919062000876565b601055600680546001600160a01b031990811673e6c27e78f4f595032b3f686c808b5c15f04d976d1790915560078054909116737d9ce0113176d869c2c9f924cb4fde437fdd9941179055620003526200034a6005546001600160a01b031690565b6001620004e7565b6200035f306001620004e7565b6200036e61dead6001620004e7565b6200038d620003856005546001600160a01b031690565b600162000419565b6200039a30600162000419565b620003a961dead600162000419565b620003b5338262000591565b50505050505050506200088c565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620004685760405162461bcd60e51b815260206004820181905260248201526000805160206200309283398151915260448201526064015b60405180910390fd5b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b6001600160a01b038216600081815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b03163314620005325760405162461bcd60e51b815260206004820181905260248201526000805160206200309283398151915260448201526064016200045f565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620005e95760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200045f565b8060026000828254620005fd919062000876565b90915550506001600160a01b038216600090815260208190526040812080548392906200062c90849062000876565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620006a657607f821691505b602082108103620006c757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200067657600081815260208120601f850160051c81016020861015620006f65750805b601f850160051c820191505b81811015620007175782815560010162000702565b505050505050565b81516001600160401b038111156200073b576200073b6200067b565b62000753816200074c845462000691565b84620006cd565b602080601f8311600181146200078b5760008415620007725750858301515b600019600386901b1c1916600185901b17855562000717565b600085815260208120601f198616915b82811015620007bc578886015182559484019460019091019084016200079b565b5085821015620007db5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620007fe57600080fd5b81516001600160a01b03811681146200081657600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b6000826200085157634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176200087057620008706200081d565b92915050565b808201808211156200087057620008706200081d565b60805160a0516127b6620008dc600039600081816104f70152610ebb0152600081816103ac0152818161212d015281816121e6015281816122220152818161229c01526122f901526127b66000f3fe6080604052600436106103035760003560e01c80638da5cb5b11610190578063bbc0c742116100dc578063d85ba06311610095578063f11a24d31161006f578063f11a24d31461092f578063f2fde38b14610945578063f637434214610965578063f8b45b051461097b57600080fd5b8063d85ba063146108bd578063dd62ed3e146108d3578063e2f456051461091957600080fd5b8063bbc0c74214610808578063c024666814610827578063c17b5b8c14610847578063c18bc19514610867578063c8c8ebe414610887578063d257b34f1461089d57600080fd5b80639c3b4fdc11610149578063a457c2d711610123578063a457c2d714610778578063a9059cbb14610798578063aacebbe3146107b8578063b62496f5146107d857600080fd5b80639c3b4fdc146107365780639fccce321461074c578063a0d82dc51461076257600080fd5b80638da5cb5b1461068d5780638ea5220f146106ab57806392136913146106cb578063924de9b7146106e157806395d89b41146107015780639a7a23d61461071657600080fd5b806349bd5a5e1161024f578063715018a61161020857806375f0a874116101e257806375f0a874146106225780637bce5a04146106425780638095d564146106585780638a8c523c1461067857600080fd5b8063715018a6146105d8578063751039fc146105ed5780637571336a1461060257600080fd5b806349bd5a5e146104e55780634a62bb65146105195780634fbee193146105335780636a486a8e1461056c5780636ddd17131461058257806370a08231146105a257600080fd5b80631a8145bb116102bc57806323b872dd1161029657806323b872dd1461047357806327c8f83514610493578063313ce567146104a957806339509351146104c557600080fd5b80631a8145bb146104275780631f3fed8f1461043d578063203e727e1461045357600080fd5b806306fdde031461030f578063095ea7b31461033a57806310d5de531461036a5780631694505e1461039a57806318160ddd146103e65780631816467f1461040557600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b50610324610991565b6040516103319190612377565b60405180910390f35b34801561034657600080fd5b5061035a6103553660046123da565b610a23565b6040519015158152602001610331565b34801561037657600080fd5b5061035a610385366004612406565b60186020526000908152604090205460ff1681565b3480156103a657600080fd5b506103ce7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610331565b3480156103f257600080fd5b506002545b604051908152602001610331565b34801561041157600080fd5b50610425610420366004612406565b610a3a565b005b34801561043357600080fd5b506103f760155481565b34801561044957600080fd5b506103f760145481565b34801561045f57600080fd5b5061042561046e366004612423565b610aca565b34801561047f57600080fd5b5061035a61048e36600461243c565b610ba7565b34801561049f57600080fd5b506103ce61dead81565b3480156104b557600080fd5b5060405160128152602001610331565b3480156104d157600080fd5b5061035a6104e03660046123da565b610c51565b3480156104f157600080fd5b506103ce7f000000000000000000000000000000000000000000000000000000000000000081565b34801561052557600080fd5b50600b5461035a9060ff1681565b34801561053f57600080fd5b5061035a61054e366004612406565b6001600160a01b031660009081526017602052604090205460ff1690565b34801561057857600080fd5b506103f760105481565b34801561058e57600080fd5b50600b5461035a9062010000900460ff1681565b3480156105ae57600080fd5b506103f76105bd366004612406565b6001600160a01b031660009081526020819052604090205490565b3480156105e457600080fd5b50610425610c8d565b3480156105f957600080fd5b5061035a610cc3565b34801561060e57600080fd5b5061042561061d36600461248d565b610d00565b34801561062e57600080fd5b506006546103ce906001600160a01b031681565b34801561064e57600080fd5b506103f7600d5481565b34801561066457600080fd5b506104256106733660046124c2565b610d55565b34801561068457600080fd5b50610425610dfd565b34801561069957600080fd5b506005546001600160a01b03166103ce565b3480156106b757600080fd5b506007546103ce906001600160a01b031681565b3480156106d757600080fd5b506103f760115481565b3480156106ed57600080fd5b506104256106fc3660046124ee565b610e3a565b34801561070d57600080fd5b50610324610e80565b34801561072257600080fd5b5061042561073136600461248d565b610e8f565b34801561074257600080fd5b506103f7600f5481565b34801561075857600080fd5b506103f760165481565b34801561076e57600080fd5b506103f760135481565b34801561078457600080fd5b5061035a6107933660046123da565b610f6e565b3480156107a457600080fd5b5061035a6107b33660046123da565b611007565b3480156107c457600080fd5b506104256107d3366004612406565b611014565b3480156107e457600080fd5b5061035a6107f3366004612406565b60196020526000908152604090205460ff1681565b34801561081457600080fd5b50600b5461035a90610100900460ff1681565b34801561083357600080fd5b5061042561084236600461248d565b61109b565b34801561085357600080fd5b506104256108623660046124c2565b611124565b34801561087357600080fd5b50610425610882366004612423565b6111c7565b34801561089357600080fd5b506103f760085481565b3480156108a957600080fd5b5061035a6108b8366004612423565b611274565b3480156108c957600080fd5b506103f7600c5481565b3480156108df57600080fd5b506103f76108ee366004612509565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561092557600080fd5b506103f760095481565b34801561093b57600080fd5b506103f7600e5481565b34801561095157600080fd5b50610425610960366004612406565b6113ac565b34801561097157600080fd5b506103f760125481565b34801561098757600080fd5b506103f7600a5481565b6060600380546109a090612542565b80601f01602080910402602001604051908101604052809291908181526020018280546109cc90612542565b8015610a195780601f106109ee57610100808354040283529160200191610a19565b820191906000526020600020905b8154815290600101906020018083116109fc57829003601f168201915b5050505050905090565b6000610a30338484611447565b5060015b92915050565b6005546001600160a01b03163314610a6d5760405162461bcd60e51b8152600401610a649061257c565b60405180910390fd5b6007546040516001600160a01b03918216918316907f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74390600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610af45760405162461bcd60e51b8152600401610a649061257c565b670de0b6b3a76400006103e8610b0960025490565b610b149060016125c7565b610b1e91906125de565b610b2891906125de565b811015610b8f5760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610a64565b610ba181670de0b6b3a76400006125c7565b60085550565b6000610bb484848461156b565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610c395760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610a64565b610c468533858403611447565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610a30918590610c88908690612600565b611447565b6005546001600160a01b03163314610cb75760405162461bcd60e51b8152600401610a649061257c565b610cc16000611c76565b565b6005546000906001600160a01b03163314610cf05760405162461bcd60e51b8152600401610a649061257c565b50600b805460ff19169055600190565b6005546001600160a01b03163314610d2a5760405162461bcd60e51b8152600401610a649061257c565b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610d7f5760405162461bcd60e51b8152600401610a649061257c565b600d839055600e829055600f81905580610d998385612600565b610da39190612600565b600c819055600b1015610df85760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313125206f72206c6573730000006044820152606401610a64565b505050565b6005546001600160a01b03163314610e275760405162461bcd60e51b8152600401610a649061257c565b600b805462ffff00191662010100179055565b6005546001600160a01b03163314610e645760405162461bcd60e51b8152600401610a649061257c565b600b8054911515620100000262ff000019909216919091179055565b6060600480546109a090612542565b6005546001600160a01b03163314610eb95760405162461bcd60e51b8152600401610a649061257c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603610f605760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610a64565b610f6a8282611cc8565b5050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610ff05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a64565b610ffd3385858403611447565b5060019392505050565b6000610a3033848461156b565b6005546001600160a01b0316331461103e5760405162461bcd60e51b8152600401610a649061257c565b6006546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146110c55760405162461bcd60e51b8152600401610a649061257c565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461114e5760405162461bcd60e51b8152600401610a649061257c565b601183905560128290556013819055806111688385612600565b6111729190612600565b6010819055600b1015610df85760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313125206f72206c6573730000006044820152606401610a64565b6005546001600160a01b031633146111f15760405162461bcd60e51b8152600401610a649061257c565b600581101561124e5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610a64565b6103e861125a60025490565b61126490836125c7565b61126e91906125de565b600a5550565b6005546000906001600160a01b031633146112a15760405162461bcd60e51b8152600401610a649061257c565b60018210156113105760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610a64565b6101f482111561137f5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610a64565b620186a061138c60025490565b61139690846125c7565b6113a091906125de565b6009555060015b919050565b6005546001600160a01b031633146113d65760405162461bcd60e51b8152600401610a649061257c565b6001600160a01b03811661143b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a64565b61144481611c76565b50565b6001600160a01b0383166114a95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a64565b6001600160a01b03821661150a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a64565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166115915760405162461bcd60e51b8152600401610a6490612613565b6001600160a01b0382166115b75760405162461bcd60e51b8152600401610a6490612658565b806000036115cb57610df883836000611d1c565b600b5460ff1615611941576005546001600160a01b0384811691161480159061160257506005546001600160a01b03838116911614155b801561161657506001600160a01b03821615155b801561162d57506001600160a01b03821661dead14155b80156116435750600554600160a01b900460ff16155b1561194157600b54610100900460ff166116db576001600160a01b03831660009081526017602052604090205460ff168061169657506001600160a01b03821660009081526017602052604090205460ff165b6116db5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610a64565b6001600160a01b03831660009081526019602052604090205460ff16801561171c57506001600160a01b03821660009081526018602052604090205460ff16155b15611800576008548111156117915760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610a64565b600a546001600160a01b0383166000908152602081905260409020546117b79083612600565b11156117fb5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a64565b611941565b6001600160a01b03821660009081526019602052604090205460ff16801561184157506001600160a01b03831660009081526018602052604090205460ff16155b156118b7576008548111156117fb5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610a64565b6001600160a01b03821660009081526018602052604090205460ff1661194157600a546001600160a01b0383166000908152602081905260409020546118fd9083612600565b11156119415760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a64565b306000908152602081905260409020546009548110801590819061196d5750600b5462010000900460ff165b80156119835750600554600160a01b900460ff16155b80156119a857506001600160a01b03851660009081526019602052604090205460ff16155b80156119cd57506001600160a01b03851660009081526017602052604090205460ff16155b80156119f257506001600160a01b03841660009081526017602052604090205460ff16155b15611a20576005805460ff60a01b1916600160a01b179055611a12611e71565b6005805460ff60a01b191690555b6005546001600160a01b03861660009081526017602052604090205460ff600160a01b909204821615911680611a6e57506001600160a01b03851660009081526017602052604090205460ff165b15611a77575060005b60008115611c62576001600160a01b03861660009081526019602052604090205460ff168015611aa957506000601054115b15611b6757611ace6064611ac8601054886120ab90919063ffffffff16565b906120be565b905060105460125482611ae191906125c7565b611aeb91906125de565b60156000828254611afc9190612600565b9091555050601054601354611b1190836125c7565b611b1b91906125de565b60166000828254611b2c9190612600565b9091555050601054601154611b4190836125c7565b611b4b91906125de565b60146000828254611b5c9190612600565b90915550611c449050565b6001600160a01b03871660009081526019602052604090205460ff168015611b9157506000600c54115b15611c4457611bb06064611ac8600c54886120ab90919063ffffffff16565b9050600c54600e5482611bc391906125c7565b611bcd91906125de565b60156000828254611bde9190612600565b9091555050600c54600f54611bf390836125c7565b611bfd91906125de565b60166000828254611c0e9190612600565b9091555050600c54600d54611c2390836125c7565b611c2d91906125de565b60146000828254611c3e9190612600565b90915550505b8015611c5557611c55873083611d1c565b611c5f818661269b565b94505b611c6d878787611d1c565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611d425760405162461bcd60e51b8152600401610a6490612613565b6001600160a01b038216611d685760405162461bcd60e51b8152600401610a6490612658565b6001600160a01b03831660009081526020819052604090205481811015611de05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a64565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611e17908490612600565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e6391815260200190565b60405180910390a350505050565b3060009081526020819052604081205490506000601654601454601554611e989190612600565b611ea29190612600565b90506000821580611eb1575081155b15611ebb57505050565b600954611ec99060146125c7565b831115611ee157600954611ede9060146125c7565b92505b600060028360155486611ef491906125c7565b611efe91906125de565b611f0891906125de565b90506000611f1685836120ca565b905047611f22826120d6565b6000611f2e47836120ca565b90506000611f4b87611ac8601454856120ab90919063ffffffff16565b90506000611f6888611ac8601654866120ab90919063ffffffff16565b9050600081611f77848661269b565b611f81919061269b565b60006015819055601481905560168190556007546040519293506001600160a01b031691849181818185875af1925050503d8060008114611fde576040519150601f19603f3d011682016040523d82523d6000602084013e611fe3565b606091505b50909850508615801590611ff75750600081115b1561204a576120068782612296565b601554604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6006546040516001600160a01b03909116904790600081818185875af1925050503d8060008114612097576040519150601f19603f3d011682016040523d82523d6000602084013e61209c565b606091505b50505050505050505050505050565b60006120b782846125c7565b9392505050565b60006120b782846125de565b60006120b7828461269b565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061210b5761210b6126ae565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ad91906126c4565b816001815181106121c0576121c06126ae565b60200260200101906001600160a01b031690816001600160a01b03168152505061220b307f000000000000000000000000000000000000000000000000000000000000000084611447565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906122609085906000908690309042906004016126e1565b600060405180830381600087803b15801561227a57600080fd5b505af115801561228e573d6000803e3d6000fd5b505050505050565b6122c1307f000000000000000000000000000000000000000000000000000000000000000084611447565b60405163f305d71960e01b815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f305d71990839060c40160606040518083038185885af115801561234b573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123709190612752565b5050505050565b600060208083528351808285015260005b818110156123a457858101830151858201604001528201612388565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461144457600080fd5b600080604083850312156123ed57600080fd5b82356123f8816123c5565b946020939093013593505050565b60006020828403121561241857600080fd5b81356120b7816123c5565b60006020828403121561243557600080fd5b5035919050565b60008060006060848603121561245157600080fd5b833561245c816123c5565b9250602084013561246c816123c5565b929592945050506040919091013590565b803580151581146113a757600080fd5b600080604083850312156124a057600080fd5b82356124ab816123c5565b91506124b96020840161247d565b90509250929050565b6000806000606084860312156124d757600080fd5b505081359360208301359350604090920135919050565b60006020828403121561250057600080fd5b6120b78261247d565b6000806040838503121561251c57600080fd5b8235612527816123c5565b91506020830135612537816123c5565b809150509250929050565b600181811c9082168061255657607f821691505b60208210810361257657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a3457610a346125b1565b6000826125fb57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610a3457610a346125b1565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610a3457610a346125b1565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156126d657600080fd5b81516120b7816123c5565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156127315784516001600160a01b03168352938301939183019160010161270c565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561276757600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212209ff0d8dd1bff81ec722180ea9dfcc2b02591538de78d2e84aebcf70756f2792e64736f6c634300081300334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed ByteCode Sourcemap

15061:16093:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2649:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3563:169;;;;;;;;;;-1:-1:-1;3563:169:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;3563:169:0;1023:187:1;16117:63:0;;;;;;;;;;-1:-1:-1;16117:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;15156:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1658:32:1;;;1640:51;;1628:2;1613:18;15156:51:0;1467:230:1;2970:108:0;;;;;;;;;;-1:-1:-1;3058:12:0;;2970:108;;;1848:25:1;;;1836:2;1821:18;2970:108:0;1702:177:1;23992:157:0;;;;;;;;;;-1:-1:-1;23992:157:0;;;;;:::i;:::-;;:::i;:::-;;15982:33;;;;;;;;;;;;;;;;15942;;;;;;;;;;;;;;;;20296:275;;;;;;;;;;-1:-1:-1;20296:275:0;;;;;:::i;:::-;;:::i;3740:492::-;;;;;;;;;;-1:-1:-1;3740:492:0;;;;;:::i;:::-;;:::i;15259:53::-;;;;;;;;;;;;15305:6;15259:53;;2869:93;;;;;;;;;;-1:-1:-1;2869:93:0;;2952:2;2880:36:1;;2868:2;2853:18;2869:93:0;2738:184:1;4240:215:0;;;;;;;;;;-1:-1:-1;4240:215:0;;;;;:::i;:::-;;:::i;15214:38::-;;;;;;;;;;;;;;;15536:33;;;;;;;;;;-1:-1:-1;15536:33:0;;;;;;;;24157:126;;;;;;;;;;-1:-1:-1;24157:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;24247:28:0;24223:4;24247:28;;;:19;:28;;;;;;;;;24157:126;15797:28;;;;;;;;;;;;;;;;15616:31;;;;;;;;;;-1:-1:-1;15616:31:0;;;;;;;;;;;3086:127;;;;;;;;;;-1:-1:-1;3086:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;3187:18:0;3160:7;3187:18;;;;;;;;;;;;3086:127;771:103;;;;;;;;;;;;;:::i;19375:121::-;;;;;;;;;;;;;:::i;21114:167::-;;;;;;;;;;-1:-1:-1;21114:167:0;;;;;:::i;:::-;;:::i;15351:30::-;;;;;;;;;;-1:-1:-1;15351:30:0;;;;-1:-1:-1;;;;;15351:30:0;;;15690;;;;;;;;;;;;;;;;21722:403;;;;;;;;;;-1:-1:-1;21722:403:0;;;;;:::i;:::-;;:::i;19188:112::-;;;;;;;;;;;;;:::i;548:87::-;;;;;;;;;;-1:-1:-1;621:6:0;;-1:-1:-1;;;;;621:6:0;548:87;;15388:24;;;;;;;;;;-1:-1:-1;15388:24:0;;;;-1:-1:-1;;;;;15388:24:0;;;15832:31;;;;;;;;;;;;;;;;21399:100;;;;;;;;;;-1:-1:-1;21399:100:0;;;;;:::i;:::-;;:::i;2757:104::-;;;;;;;;;;;;;:::i;23245:304::-;;;;;;;;;;-1:-1:-1;23245:304:0;;;;;:::i;:::-;;:::i;15764:24::-;;;;;;;;;;;;;;;;16022:27;;;;;;;;;;;;;;;;15908:25;;;;;;;;;;;;;;;;4463:413;;;;;;;;;;-1:-1:-1;4463:413:0;;;;;:::i;:::-;;:::i;3221:175::-;;;;;;;;;;-1:-1:-1;3221:175:0;;;;;:::i;:::-;;:::i;23753:231::-;;;;;;;;;;-1:-1:-1;23753:231:0;;;;;:::i;:::-;;:::i;16191:57::-;;;;;;;;;;-1:-1:-1;16191:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;15576:33;;;;;;;;;;-1:-1:-1;15576:33:0;;;;;;;;;;;22928:182;;;;;;;;;;-1:-1:-1;22928:182:0;;;;;:::i;:::-;;:::i;22349:412::-;;;;;;;;;;-1:-1:-1;22349:412:0;;;;;:::i;:::-;;:::i;20696:232::-;;;;;;;;;;-1:-1:-1;20696:232:0;;;;;:::i;:::-;;:::i;15421:35::-;;;;;;;;;;;;;;;;19667:471;;;;;;;;;;-1:-1:-1;19667:471:0;;;;;:::i;:::-;;:::i;15656:27::-;;;;;;;;;;;;;;;;3404:151;;;;;;;;;;-1:-1:-1;3404:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;3520:18:0;;;3493:7;3520:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3404:151;15463:33;;;;;;;;;;;;;;;;15727:30;;;;;;;;;;;;;;;;882:201;;;;;;;;;;-1:-1:-1;882:201:0;;;;;:::i;:::-;;:::i;15870:31::-;;;;;;;;;;;;;;;;15503:24;;;;;;;;;;;;;;;;2649:100;2703:13;2736:5;2729:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2649:100;:::o;3563:169::-;3646:4;3663:39;174:10;3686:7;3695:6;3663:8;:39::i;:::-;-1:-1:-1;3720:4:0;3563:169;;;;;:::o;23992:157::-;621:6;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;;;;;;;;;24099:9:::1;::::0;24071:38:::1;::::0;-1:-1:-1;;;;;24099:9:0;;::::1;::::0;24071:38;::::1;::::0;::::1;::::0;24099:9:::1;::::0;24071:38:::1;24120:9;:21:::0;;-1:-1:-1;;;;;;24120:21:0::1;-1:-1:-1::0;;;;;24120:21:0;;;::::1;::::0;;;::::1;::::0;;23992:157::o;20296:275::-;621:6;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;20433:4:::1;20425;20404:13;3058:12:::0;;;2970:108;20404:13:::1;:17;::::0;20420:1:::1;20404:17;:::i;:::-;20403:26;;;;:::i;:::-;20402:35;;;;:::i;:::-;20392:6;:45;;20370:142;;;::::0;-1:-1:-1;;;20370:142:0;;5786:2:1;20370:142:0::1;::::0;::::1;5768:21:1::0;5825:2;5805:18;;;5798:30;5864:34;5844:18;;;5837:62;-1:-1:-1;;;5915:18:1;;;5908:45;5970:19;;20370:142:0::1;5584:411:1::0;20370:142:0::1;20546:17;:6:::0;20556::::1;20546:17;:::i;:::-;20523:20;:40:::0;-1:-1:-1;20296:275:0:o;3740:492::-;3880:4;3897:36;3907:6;3915:9;3926:6;3897:9;:36::i;:::-;-1:-1:-1;;;;;3973:19:0;;3946:24;3973:19;;;:11;:19;;;;;;;;174:10;3973:33;;;;;;;;4025:26;;;;4017:79;;;;-1:-1:-1;;;4017:79:0;;6202:2:1;4017:79:0;;;6184:21:1;6241:2;6221:18;;;6214:30;6280:34;6260:18;;;6253:62;-1:-1:-1;;;6331:18:1;;;6324:38;6379:19;;4017:79:0;6000:404:1;4017:79:0;4132:57;4141:6;174:10;4182:6;4163:16;:25;4132:8;:57::i;:::-;-1:-1:-1;4220:4:0;;3740:492;-1:-1:-1;;;;3740:492:0:o;4240:215::-;174:10;4328:4;4377:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;4377:34:0;;;;;;;;;;4328:4;;4345:80;;4368:7;;4377:47;;4414:10;;4377:47;:::i;:::-;4345:8;:80::i;771:103::-;621:6;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;836:30:::1;863:1;836:18;:30::i;:::-;771:103::o:0;19375:121::-;621:6;;19427:4;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;-1:-1:-1;19444:14:0::1;:22:::0;;-1:-1:-1;;19444:22:0::1;::::0;;;19375:121;:::o;21114:167::-;621:6;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21227:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;21227:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;21114:167::o;21722:403::-;621:6;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;21872:15:::1;:31:::0;;;21914:15:::1;:31:::0;;;21956:9:::1;:19:::0;;;21968:7;22001:33:::1;21932:13:::0;21890;22001:33:::1;:::i;:::-;:45;;;;:::i;:::-;21986:12;:60:::0;;;22081:2:::1;-1:-1:-1::0;22065:18:0::1;22057:60;;;::::0;-1:-1:-1;;;22057:60:0;;6741:2:1;22057:60:0::1;::::0;::::1;6723:21:1::0;6780:2;6760:18;;;6753:30;6819:31;6799:18;;;6792:59;6868:18;;22057:60:0::1;6539:353:1::0;22057:60:0::1;21722:403:::0;;;:::o;19188:112::-;621:6;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;19243:13:::1;:20:::0;;-1:-1:-1;;19274:18:0;;;;;19188:112::o;21399:100::-;621:6;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;21470:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;21470:21:0;;::::1;::::0;;;::::1;::::0;;21399:100::o;2757:104::-;2813:13;2846:7;2839:14;;;;;:::i;23245:304::-;621:6;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;23389:13:::1;-1:-1:-1::0;;;;;23381:21:0::1;:4;-1:-1:-1::0;;;;;23381:21:0::1;::::0;23359:128:::1;;;::::0;-1:-1:-1;;;23359:128:0;;7099:2:1;23359:128:0::1;::::0;::::1;7081:21:1::0;7138:2;7118:18;;;7111:30;7177:34;7157:18;;;7150:62;7248:27;7228:18;;;7221:55;7293:19;;23359:128:0::1;6897:421:1::0;23359:128:0::1;23500:41;23529:4;23535:5;23500:28;:41::i;:::-;23245:304:::0;;:::o;4463:413::-;174:10;4556:4;4600:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;4600:34:0;;;;;;;;;;4653:35;;;;4645:85;;;;-1:-1:-1;;;4645:85:0;;7525:2:1;4645:85:0;;;7507:21:1;7564:2;7544:18;;;7537:30;7603:34;7583:18;;;7576:62;-1:-1:-1;;;7654:18:1;;;7647:35;7699:19;;4645:85:0;7323:401:1;4645:85:0;4766:67;174:10;4789:7;4817:15;4798:16;:34;4766:8;:67::i;:::-;-1:-1:-1;4864:4:0;;4463:413;-1:-1:-1;;;4463:413:0:o;3221:175::-;3307:4;3324:42;174:10;3348:9;3359:6;3324:9;:42::i;23753:231::-;621:6;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;23913:15:::1;::::0;23870:59:::1;::::0;-1:-1:-1;;;;;23913:15:0;;::::1;::::0;23870:59;::::1;::::0;::::1;::::0;23913:15:::1;::::0;23870:59:::1;23940:15;:36:::0;;-1:-1:-1;;;;;;23940:36:0::1;-1:-1:-1::0;;;;;23940:36:0;;;::::1;::::0;;;::::1;::::0;;23753:231::o;22928:182::-;621:6;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23013:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;23013:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;23068:34;;1163:41:1;;;23068:34:0::1;::::0;1136:18:1;23068:34:0::1;;;;;;;22928:182:::0;;:::o;22349:412::-;621:6;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;22500:16:::1;:32:::0;;;22543:16:::1;:32:::0;;;22586:10:::1;:20:::0;;;22599:7;22633:35:::1;22562:13:::0;22519;22633:35:::1;:::i;:::-;:48;;;;:::i;:::-;22617:13;:64:::0;;;22717:2:::1;-1:-1:-1::0;22700:19:0::1;22692:61;;;::::0;-1:-1:-1;;;22692:61:0;;6741:2:1;22692:61:0::1;::::0;::::1;6723:21:1::0;6780:2;6760:18;;;6753:30;6819:31;6799:18;;;6792:59;6868:18;;22692:61:0::1;6539:353:1::0;20696:232:0;621:6;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;20805:1:::1;20795:6;:11;;20773:97;;;::::0;-1:-1:-1;;;20773:97:0;;7931:2:1;20773:97:0::1;::::0;::::1;7913:21:1::0;7970:2;7950:18;;;7943:30;8009:34;7989:18;;;7982:62;-1:-1:-1;;;8060:18:1;;;8053:34;8104:19;;20773:97:0::1;7729:400:1::0;20773:97:0::1;20916:4;20902:13;3058:12:::0;;;2970:108;20902:13:::1;20893:22;::::0;:6;:22:::1;:::i;:::-;:27;;;;:::i;:::-;20881:9;:39:::0;-1:-1:-1;20696:232:0:o;19667:471::-;621:6;;19775:4;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;19832:1:::1;19819:9;:14;;19797:117;;;::::0;-1:-1:-1;;;19797:117:0;;8336:2:1;19797:117:0::1;::::0;::::1;8318:21:1::0;8375:2;8355:18;;;8348:30;8414:34;8394:18;;;8387:62;-1:-1:-1;;;8465:18:1;;;8458:51;8526:19;;19797:117:0::1;8134:417:1::0;19797:117:0::1;19960:3;19947:9;:16;;19925:118;;;::::0;-1:-1:-1;;;19925:118:0;;8758:2:1;19925:118:0::1;::::0;::::1;8740:21:1::0;8797:2;8777:18;;;8770:30;8836:34;8816:18;;;8809:62;-1:-1:-1;;;8887:18:1;;;8880:50;8947:19;;19925:118:0::1;8556:416:1::0;19925:118:0::1;20102:6;20087:13;3058:12:::0;;;2970:108;20087:13:::1;20075:25;::::0;:9;:25:::1;:::i;:::-;:33;;;;:::i;:::-;20054:18;:54:::0;-1:-1:-1;20126:4:0::1;754:1;19667:471:::0;;;:::o;882:201::-;621:6;;-1:-1:-1;;;;;621:6:0;174:10;683:23;675:68;;;;-1:-1:-1;;;675:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;971:22:0;::::1;963:73;;;::::0;-1:-1:-1;;;963:73:0;;9179:2:1;963:73:0::1;::::0;::::1;9161:21:1::0;9218:2;9198:18;;;9191:30;9257:34;9237:18;;;9230:62;-1:-1:-1;;;9308:18:1;;;9301:36;9354:19;;963:73:0::1;8977:402:1::0;963:73:0::1;1047:28;1066:8;1047:18;:28::i;:::-;882:201:::0;:::o;6631:380::-;-1:-1:-1;;;;;6767:19:0;;6759:68;;;;-1:-1:-1;;;6759:68:0;;9586:2:1;6759:68:0;;;9568:21:1;9625:2;9605:18;;;9598:30;9664:34;9644:18;;;9637:62;-1:-1:-1;;;9715:18:1;;;9708:34;9759:19;;6759:68:0;9384:400:1;6759:68:0;-1:-1:-1;;;;;6846:21:0;;6838:68;;;;-1:-1:-1;;;6838:68:0;;9991:2:1;6838:68:0;;;9973:21:1;10030:2;10010:18;;;10003:30;10069:34;10049:18;;;10042:62;-1:-1:-1;;;10120:18:1;;;10113:32;10162:19;;6838:68:0;9789:398:1;6838:68:0;-1:-1:-1;;;;;6919:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;6971:32;;1848:25:1;;;6971:32:0;;1821:18:1;6971:32:0;;;;;;;6631:380;;;:::o;24341:3924::-;-1:-1:-1;;;;;24473:18:0;;24465:68;;;;-1:-1:-1;;;24465:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24552:16:0;;24544:64;;;;-1:-1:-1;;;24544:64:0;;;;;;;:::i;:::-;24625:6;24635:1;24625:11;24621:93;;24653:28;24669:4;24675:2;24679:1;24653:15;:28::i;24621:93::-;24730:14;;;;24726:1694;;;621:6;;-1:-1:-1;;;;;24783:15:0;;;621:6;;24783:15;;;;:49;;-1:-1:-1;621:6:0;;-1:-1:-1;;;;;24819:13:0;;;621:6;;24819:13;;24783:49;:86;;;;-1:-1:-1;;;;;;24853:16:0;;;;24783:86;:128;;;;-1:-1:-1;;;;;;24890:21:0;;24904:6;24890:21;;24783:128;:158;;;;-1:-1:-1;24933:8:0;;-1:-1:-1;;;24933:8:0;;;;24932:9;24783:158;24761:1648;;;24981:13;;;;;;;24976:223;;-1:-1:-1;;;;;25053:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;25082:23:0;;;;;;:19;:23;;;;;;;;25053:52;25019:160;;;;-1:-1:-1;;;25019:160:0;;11204:2:1;25019:160:0;;;11186:21:1;11243:2;11223:18;;;11216:30;-1:-1:-1;;;11262:18:1;;;11255:52;11324:18;;25019:160:0;11002:346:1;25019:160:0;-1:-1:-1;;;;;25273:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;25330:35:0;;;;;;:31;:35;;;;;;;;25329:36;25273:92;25247:1147;;;25452:20;;25442:6;:30;;25408:169;;;;-1:-1:-1;;;25408:169:0;;11555:2:1;25408:169:0;;;11537:21:1;11594:2;11574:18;;;11567:30;11633:34;11613:18;;;11606:62;-1:-1:-1;;;11684:18:1;;;11677:51;11745:19;;25408:169:0;11353:417:1;25408:169:0;25660:9;;-1:-1:-1;;;;;3187:18:0;;3160:7;3187:18;;;;;;;;;;;25634:22;;:6;:22;:::i;:::-;:35;;25600:140;;;;-1:-1:-1;;;25600:140:0;;11977:2:1;25600:140:0;;;11959:21:1;12016:2;11996:18;;;11989:30;-1:-1:-1;;;12035:18:1;;;12028:49;12094:18;;25600:140:0;11775:343:1;25600:140:0;25247:1147;;;-1:-1:-1;;;;;25838:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;25893:37:0;;;;;;:31;:37;;;;;;;;25892:38;25838:92;25812:582;;;26017:20;;26007:6;:30;;25973:170;;;;-1:-1:-1;;;25973:170:0;;12325:2:1;25973:170:0;;;12307:21:1;12364:2;12344:18;;;12337:30;12403:34;12383:18;;;12376:62;-1:-1:-1;;;12454:18:1;;;12447:52;12516:19;;25973:170:0;12123:418:1;25812:582:0;-1:-1:-1;;;;;26174:35:0;;;;;;:31;:35;;;;;;;;26169:225;;26294:9;;-1:-1:-1;;;;;3187:18:0;;3160:7;3187:18;;;;;;;;;;;26268:22;;:6;:22;:::i;:::-;:35;;26234:140;;;;-1:-1:-1;;;26234:140:0;;11977:2:1;26234:140:0;;;11959:21:1;12016:2;11996:18;;;11989:30;-1:-1:-1;;;12035:18:1;;;12028:49;12094:18;;26234:140:0;11775:343:1;26234:140:0;26481:4;26432:28;3187:18;;;;;;;;;;;26539;;26515:42;;;;;;;26588:35;;-1:-1:-1;26612:11:0;;;;;;;26588:35;:61;;;;-1:-1:-1;26641:8:0;;-1:-1:-1;;;26641:8:0;;;;26640:9;26588:61;:110;;;;-1:-1:-1;;;;;;26667:31:0;;;;;;:25;:31;;;;;;;;26666:32;26588:110;:153;;;;-1:-1:-1;;;;;;26716:25:0;;;;;;:19;:25;;;;;;;;26715:26;26588:153;:194;;;;-1:-1:-1;;;;;;26759:23:0;;;;;;:19;:23;;;;;;;;26758:24;26588:194;26570:326;;;26809:8;:15;;-1:-1:-1;;;;26809:15:0;-1:-1:-1;;;26809:15:0;;;26841:10;:8;:10::i;:::-;26868:8;:16;;-1:-1:-1;;;;26868:16:0;;;26570:326;26924:8;;-1:-1:-1;;;;;27034:25:0;;26908:12;27034:25;;;:19;:25;;;;;;26924:8;-1:-1:-1;;;26924:8:0;;;;;26923:9;;27034:25;;:52;;-1:-1:-1;;;;;;27063:23:0;;;;;;:19;:23;;;;;;;;27034:52;27030:100;;;-1:-1:-1;27113:5:0;27030:100;27142:12;27247:7;27243:969;;;-1:-1:-1;;;;;27299:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;27348:1;27332:13;;:17;27299:50;27295:768;;;27377:34;27407:3;27377:25;27388:13;;27377:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;27370:41;;27480:13;;27460:16;;27453:4;:23;;;;:::i;:::-;27452:41;;;;:::i;:::-;27430:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;27550:13:0;;27536:10;;27529:17;;:4;:17;:::i;:::-;27528:35;;;;:::i;:::-;27512:12;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;27632:13:0;;27612:16;;27605:23;;:4;:23;:::i;:::-;27604:41;;;;:::i;:::-;27582:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;27295:768:0;;-1:-1:-1;27295:768:0;;-1:-1:-1;;;;;27707:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;27757:1;27742:12;;:16;27707:51;27703:360;;;27786:33;27815:3;27786:24;27797:12;;27786:6;:10;;:24;;;;:::i;:33::-;27779:40;;27887:12;;27868:15;;27861:4;:22;;;;:::i;:::-;27860:39;;;;:::i;:::-;27838:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;27955:12:0;;27942:9;;27935:16;;:4;:16;:::i;:::-;27934:33;;;;:::i;:::-;27918:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;28035:12:0;;28016:15;;28009:22;;:4;:22;:::i;:::-;28008:39;;;;:::i;:::-;27986:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;27703:360:0;28083:8;;28079:91;;28112:42;28128:4;28142;28149;28112:15;:42::i;:::-;28186:14;28196:4;28186:14;;:::i;:::-;;;27243:969;28224:33;28240:4;28246:2;28250:6;28224:15;:33::i;:::-;24454:3811;;;;24341:3924;;;:::o;1091:191::-;1184:6;;;-1:-1:-1;;;;;1201:17:0;;;-1:-1:-1;;;;;;1201:17:0;;;;;;;1234:40;;1184:6;;;1201:17;1184:6;;1234:40;;1165:16;;1234:40;1154:128;1091:191;:::o;23557:188::-;-1:-1:-1;;;;;23640:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;23640:39:0;;;;;;;;;;23697:40;;23640:39;;:31;23697:40;;;23557:188;;:::o;4884:733::-;-1:-1:-1;;;;;5024:20:0;;5016:70;;;;-1:-1:-1;;;5016:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5105:23:0;;5097:71;;;;-1:-1:-1;;;5097:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5265:17:0;;5241:21;5265:17;;;;;;;;;;;5301:23;;;;5293:74;;;;-1:-1:-1;;;5293:74:0;;12881:2:1;5293:74:0;;;12863:21:1;12920:2;12900:18;;;12893:30;12959:34;12939:18;;;12932:62;-1:-1:-1;;;13010:18:1;;;13003:36;13056:19;;5293:74:0;12679:402:1;5293:74:0;-1:-1:-1;;;;;5403:17:0;;;:9;:17;;;;;;;;;;;5423:22;;;5403:42;;5467:20;;;;;;;;:30;;5439:6;;5403:9;5467:30;;5439:6;;5467:30;:::i;:::-;;;;;;;;5532:9;-1:-1:-1;;;;;5515:35:0;5524:6;-1:-1:-1;;;;;5515:35:0;;5543:6;5515:35;;;;1848:25:1;;1836:2;1821:18;;1702:177;5515:35:0;;;;;;;;5005:612;4884:733;;;:::o;29395:1756::-;29478:4;29434:23;3187:18;;;;;;;;;;;29434:50;;29495:25;29591:12;;29557:18;;29523;;:52;;;;:::i;:::-;:80;;;;:::i;:::-;29495:108;-1:-1:-1;29614:12:0;29643:20;;;:46;;-1:-1:-1;29667:22:0;;29643:46;29639:85;;;29706:7;;;29395:1756::o;29639:85::-;29758:18;;:23;;29779:2;29758:23;:::i;:::-;29740:15;:41;29736:115;;;29816:18;;:23;;29837:2;29816:23;:::i;:::-;29798:41;;29736:115;29912:23;30025:1;29992:17;29957:18;;29939:15;:36;;;;:::i;:::-;29938:71;;;;:::i;:::-;:88;;;;:::i;:::-;29912:114;-1:-1:-1;30037:26:0;30066:36;:15;29912:114;30066:19;:36::i;:::-;30037:65;-1:-1:-1;30143:21:0;30177:36;30037:65;30177:16;:36::i;:::-;30226:18;30247:44;:21;30273:17;30247:25;:44::i;:::-;30226:65;;30304:23;30330:81;30383:17;30330:34;30345:18;;30330:10;:14;;:34;;;;:::i;:81::-;30304:107;;30422:17;30442:51;30475:17;30442:28;30457:12;;30442:10;:14;;:28;;;;:::i;:51::-;30422:71;-1:-1:-1;30506:23:0;30422:71;30532:28;30545:15;30532:10;:28;:::i;:::-;:40;;;;:::i;:::-;30606:1;30585:18;:22;;;30618:18;:22;;;30651:12;:16;;;30702:9;;30694:45;;30506:66;;-1:-1:-1;;;;;;30702:9:0;;30725;;30694:45;30606:1;30694:45;30725:9;30702;30694:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30680:59:0;;-1:-1:-1;;30756:19:0;;;;;:42;;;30797:1;30779:15;:19;30756:42;30752:278;;;30815:46;30828:15;30845;30815:12;:46::i;:::-;30985:18;;30881:137;;;13498:25:1;;;13554:2;13539:18;;13532:34;;;13582:18;;;13575:34;;;;30881:137:0;;;;;;13486:2:1;30881:137:0;;;30752:278;31064:15;;31056:87;;-1:-1:-1;;;;;31064:15:0;;;;31107:21;;31056:87;;;;31107:21;31064:15;31056:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;29395:1756:0:o;8637:98::-;8695:7;8722:5;8726:1;8722;:5;:::i;:::-;8715:12;8637:98;-1:-1:-1;;;8637:98:0:o;8743:::-;8801:7;8828:5;8832:1;8828;:5;:::i;8531:98::-;8589:7;8616:5;8620:1;8616;:5;:::i;28273:589::-;28423:16;;;28437:1;28423:16;;;;;;;;28399:21;;28423:16;;;;;;;;;;-1:-1:-1;28423:16:0;28399:40;;28468:4;28450;28455:1;28450:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;28450:23:0;;;-1:-1:-1;;;;;28450:23:0;;;;;28494:15;-1:-1:-1;;;;;28494:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28484:4;28489:1;28484:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;28484:32:0;;;-1:-1:-1;;;;;28484:32:0;;;;;28529:62;28546:4;28561:15;28579:11;28529:8;:62::i;:::-;28630:224;;-1:-1:-1;;;28630:224:0;;-1:-1:-1;;;;;28630:15:0;:66;;;;:224;;28711:11;;28737:1;;28781:4;;28808;;28828:15;;28630:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28328:534;28273:589;:::o;28870:517::-;29018:62;29035:4;29050:15;29068:11;29018:8;:62::i;:::-;29123:256;;-1:-1:-1;;;29123:256:0;;29195:4;29123:256;;;15466:34:1;15516:18;;;15509:34;;;29241:1:0;15559:18:1;;;15552:34;;;15602:18;;;15595:34;15305:6:0;15645:19:1;;;15638:44;29353:15:0;15698:19:1;;;15691:35;29123:15:0;-1:-1:-1;;;;;29123:31:0;;;;29162:9;;15400:19:1;;29123:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;28870:517;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:247::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;1382:9;1369:23;1401:31;1426:5;1401:31;:::i;1884:180::-;1943:6;1996:2;1984:9;1975:7;1971:23;1967:32;1964:52;;;2012:1;2009;2002:12;1964:52;-1:-1:-1;2035:23:1;;1884:180;-1:-1:-1;1884:180:1:o;2069:456::-;2146:6;2154;2162;2215:2;2203:9;2194:7;2190:23;2186:32;2183:52;;;2231:1;2228;2221:12;2183:52;2270:9;2257:23;2289:31;2314:5;2289:31;:::i;:::-;2339:5;-1:-1:-1;2396:2:1;2381:18;;2368:32;2409:33;2368:32;2409:33;:::i;:::-;2069:456;;2461:7;;-1:-1:-1;;;2515:2:1;2500:18;;;;2487:32;;2069:456::o;2927:160::-;2992:20;;3048:13;;3041:21;3031:32;;3021:60;;3077:1;3074;3067:12;3092:315;3157:6;3165;3218:2;3206:9;3197:7;3193:23;3189:32;3186:52;;;3234:1;3231;3224:12;3186:52;3273:9;3260:23;3292:31;3317:5;3292:31;:::i;:::-;3342:5;-1:-1:-1;3366:35:1;3397:2;3382:18;;3366:35;:::i;:::-;3356:45;;3092:315;;;;;:::o;3412:316::-;3489:6;3497;3505;3558:2;3546:9;3537:7;3533:23;3529:32;3526:52;;;3574:1;3571;3564:12;3526:52;-1:-1:-1;;3597:23:1;;;3667:2;3652:18;;3639:32;;-1:-1:-1;3718:2:1;3703:18;;;3690:32;;3412:316;-1:-1:-1;3412:316:1:o;3733:180::-;3789:6;3842:2;3830:9;3821:7;3817:23;3813:32;3810:52;;;3858:1;3855;3848:12;3810:52;3881:26;3897:9;3881:26;:::i;3918:388::-;3986:6;3994;4047:2;4035:9;4026:7;4022:23;4018:32;4015:52;;;4063:1;4060;4053:12;4015:52;4102:9;4089:23;4121:31;4146:5;4121:31;:::i;:::-;4171:5;-1:-1:-1;4228:2:1;4213:18;;4200:32;4241:33;4200:32;4241:33;:::i;:::-;4293:7;4283:17;;;3918:388;;;;;:::o;4311:380::-;4390:1;4386:12;;;;4433;;;4454:61;;4508:4;4500:6;4496:17;4486:27;;4454:61;4561:2;4553:6;4550:14;4530:18;4527:38;4524:161;;4607:10;4602:3;4598:20;4595:1;4588:31;4642:4;4639:1;4632:15;4670:4;4667:1;4660:15;4524:161;;4311:380;;;:::o;4696:356::-;4898:2;4880:21;;;4917:18;;;4910:30;4976:34;4971:2;4956:18;;4949:62;5043:2;5028:18;;4696:356::o;5057:127::-;5118:10;5113:3;5109:20;5106:1;5099:31;5149:4;5146:1;5139:15;5173:4;5170:1;5163:15;5189:168;5262:9;;;5293;;5310:15;;;5304:22;;5290:37;5280:71;;5331:18;;:::i;5362:217::-;5402:1;5428;5418:132;;5472:10;5467:3;5463:20;5460:1;5453:31;5507:4;5504:1;5497:15;5535:4;5532:1;5525:15;5418:132;-1:-1:-1;5564:9:1;;5362:217::o;6409:125::-;6474:9;;;6495:10;;;6492:36;;;6508:18;;:::i;10192:401::-;10394:2;10376:21;;;10433:2;10413:18;;;10406:30;10472:34;10467:2;10452:18;;10445:62;-1:-1:-1;;;10538:2:1;10523:18;;10516:35;10583:3;10568:19;;10192:401::o;10598:399::-;10800:2;10782:21;;;10839:2;10819:18;;;10812:30;10878:34;10873:2;10858:18;;10851:62;-1:-1:-1;;;10944:2:1;10929:18;;10922:33;10987:3;10972:19;;10598:399::o;12546:128::-;12613:9;;;12634:11;;;12631:37;;;12648:18;;:::i;13752:127::-;13813:10;13808:3;13804:20;13801:1;13794:31;13844:4;13841:1;13834:15;13868:4;13865:1;13858:15;13884:251;13954:6;14007:2;13995:9;13986:7;13982:23;13978:32;13975:52;;;14023:1;14020;14013:12;13975:52;14055:9;14049:16;14074:31;14099:5;14074:31;:::i;14140:980::-;14402:4;14450:3;14439:9;14435:19;14481:6;14470:9;14463:25;14507:2;14545:6;14540:2;14529:9;14525:18;14518:34;14588:3;14583:2;14572:9;14568:18;14561:31;14612:6;14647;14641:13;14678:6;14670;14663:22;14716:3;14705:9;14701:19;14694:26;;14755:2;14747:6;14743:15;14729:29;;14776:1;14786:195;14800:6;14797:1;14794:13;14786:195;;;14865:13;;-1:-1:-1;;;;;14861:39:1;14849:52;;14956:15;;;;14921:12;;;;14897:1;14815:9;14786:195;;;-1:-1:-1;;;;;;;15037:32:1;;;;15032:2;15017:18;;15010:60;-1:-1:-1;;;15101:3:1;15086:19;15079:35;14998:3;14140:980;-1:-1:-1;;;14140:980:1:o;15737:306::-;15825:6;15833;15841;15894:2;15882:9;15873:7;15869:23;15865:32;15862:52;;;15910:1;15907;15900:12;15862:52;15939:9;15933:16;15923:26;;15989:2;15978:9;15974:18;15968:25;15958:35;;16033:2;16022:9;16018:18;16012:25;16002:35;;15737:306;;;;;:::o

Metadata Hash

ipfs://9ff0d8dd1bff81ec722180ea9dfcc2b02591538de78d2e84aebcf70756f2792e
Loading