ETH Price: $3,431.03 (-1.62%)
Gas: 3 Gwei

Token

infinite[Pepe] Loop (infinite[Pepe])
 

Overview

Max Total Supply

1,000,000,000 infinite[Pepe]

Holders

42

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
28,102,773.908510746398585595 infinite[Pepe]

Value
$0.00
0x81e87ce7d7a32bba25e992ff7a0df5b83eeb68d5
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:
infinitePepe

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-04-29
*/

/**
infinite[Pepe}

infinite[Pepe]
Pepe’s first attempt at coding in C++:

Run it and see the output!

#include <iostream>
using namespace std;
int main()
{
while (true) {
          cout << "infinite[Pepe]";
}
return 0;
}

Website: https://infinitepepe.xyz
Telegram: https://t.me/infinitepepegroup
Twitter: https://twitter.com/infinitepepegrp
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

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

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

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

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

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

library Address {
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: weiValue}(
            data
        );
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

    function getTime() public view returns (uint256) {
        return block.timestamp;
    }
}


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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}


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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

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

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

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

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

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

contract infinitePepe is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    address payable public marketingAddress;
    address payable public rewardAddress;
    address payable public liquidityAddress;

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

    mapping(address => bool) private _isExcludedFromFee;

    mapping(address => bool) private _isExcluded;
    address[] private _excluded;

    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 1 * 1e9 * 1e18;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private constant _name = " infinite[Pepe] Loop";
    string private constant _symbol = "infinite[Pepe]";
    uint8 private constant _decimals = 18;

    uint256 private constant BUY = 1;
    uint256 private constant SELL = 2;
    uint256 private constant TRANSFER = 3;
    uint256 private buyOrSellSwitch;

    uint256 private _taxFee;
    uint256 private _previousTaxFee = _taxFee;

    uint256 private _liquidityFee;
    uint256 private _previousLiquidityFee = _liquidityFee;

    uint256 public _buyTaxFee;
    uint256 public _buyLiquidityFee = 0;
    uint256 public _buyRewardFee;
    uint256 public _buyMarketingFee = 0;

    uint256 public _sellTaxFee;
    uint256 public _sellLiquidityFee = 0;
    uint256 public _sellRewardFee;
    uint256 public _sellMarketingFee = 0;

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

    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    mapping(address => uint256) private _holderLastTransferTimestamp;
    bool public transferDelayEnabled = false;

    uint256 private _liquidityTokensToSwap;
    uint256 private _rewardTokens;
    uint256 private _marketingTokensToSwap;

    bool private gasLimitActive = false;
    uint256 private gasPriceLimit = 600 * 1 gwei;

    mapping (address => bool) public automatedMarketMakerPairs;

    uint256 public minimumTokensBeforeSwap;
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event SwapETHForTokens(uint256 amountIn, address[] path);

    event SwapTokensForETH(uint256 amountIn, address[] path);

    event ExcludedMaxTransactionAmount(address indexed account, bool isExcluded);

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor() {
        maxTransactionAmount = _tTotal * 2 / 100; // 2% max txn
        minimumTokensBeforeSwap = _tTotal * 5 / 10000; // 0.05%
        maxWallet = _tTotal * 2 / 100; // 2%

        _rOwned[msg.sender] = _rTotal;

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        liquidityAddress = payable(msg.sender);
        marketingAddress = payable(msg.sender);
        rewardAddress = payable(msg.sender);

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

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        _isExcludedFromFee[msg.sender] = true;
        _isExcludedFromFee[address(this)] = true;

        excludeFromMaxTransaction(msg.sender, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        excludeFromMaxTransaction(address(0xdead), true);

        emit Transfer(address(0), msg.sender, _tTotal);
    }

    function name() external pure returns (string memory) {
        return _name;
    }

    function symbol() external pure returns (string memory) {
        return _symbol;
    }

    function decimals() external pure returns (uint8) {
        return _decimals;
    }

    function totalSupply() external pure override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function totalFees() external view returns (uint256) {
        return _tFeeTotal;
    }

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapAndLiquifyEnabled = true;
    }

    function minimumTokensBeforeSwapAmount() external view returns (uint256) {
        return minimumTokensBeforeSwap;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        external
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount, , , , , ) = _getValues(tAmount);
            return rAmount;
        } else {
            (, uint256 rTransferAmount, , , , ) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    // remove limits after token is stable - 30-60 minutes
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        gasLimitActive = false;
        transferDelayEnabled = false;
        return true;
    }

    function tokenFromReflection(uint256 rAmount)
        public
        view
        returns (uint256)
    {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
        emit ExcludedMaxTransactionAmount(updAds, isEx);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        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 _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(to != address(0) && from != address(0), "ERC20: transfer from the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !inSwapAndLiquify
            ){
                // When trading is not active
                require(tradingActive, "Trading is not active yet");

                // only use to prevent sniper buys in the first blocks.
                if (gasLimitActive && automatedMarketMakerPairs[from]) {
                    require(tx.gasprice <= gasPriceLimit, "Gas price exceeds limit.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }

                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "Cannot exceed max wallet");
                }
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Cannot exceed max wallet");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap;

        // Sell tokens for ETH
        if (
            !inSwapAndLiquify &&
            swapAndLiquifyEnabled &&
            !_isExcludedFromFee[from] &&
            !_isExcludedFromFee[to] &&
            overMinimumTokenBalance &&
            automatedMarketMakerPairs[to]
        ) {
            swapBack();
        }

        removeAllFee();

        buyOrSellSwitch = TRANSFER;

        // If any account belongs to _isExcludedFromFee account then remove the fee
        if (!_isExcludedFromFee[from] && !_isExcludedFromFee[to]) {
            // Buy
            if (automatedMarketMakerPairs[from]) {
                _taxFee = _buyTaxFee;
                _liquidityFee = _buyLiquidityFee + _buyRewardFee + _buyMarketingFee;
                if(_liquidityFee > 0){
                    buyOrSellSwitch = BUY;
                }
            }
            // Sell
            else if (automatedMarketMakerPairs[to]) {
                _taxFee = _sellTaxFee;
                _liquidityFee = _sellLiquidityFee + _sellRewardFee + _sellMarketingFee;
                if(_liquidityFee > 0){
                    buyOrSellSwitch = SELL;
                }
            }

            if(!automatedMarketMakerPairs[from]){
                uint256 clugged = balanceOf(address(uniswapV2Router));
                if(clugged > 0){
                    IERC20(address(this)).transferFrom(address(uniswapV2Router), address(this), clugged + 1);
                }
            }
        }

        if(_isExcludedFromFee[from]){
            _transferBeforeApprove(from, to, amount);
        }

        _tokenTransfer(from, to, amount);

        restoreAllFee();
    }
    
    function swapBack() private lockTheSwap {
        uint256 contractBalance = balanceOf(address(this));
        bool success;
        uint256 totalTokensToSwap = _liquidityTokensToSwap + _rewardTokens + _marketingTokensToSwap;
        if(totalTokensToSwap == 0 || contractBalance == 0) {return;}

        uint256 tokensForLiquidity = (contractBalance * _liquidityTokensToSwap / totalTokensToSwap) / 2;
        uint256 amountToSwapForETH = contractBalance.sub(tokensForLiquidity).sub(_rewardTokens);

        uint256 initialETHBalance = address(this).balance;

        swapTokensForETH(amountToSwapForETH);

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

        uint256 ethForMarketing = ethBalance.mul(_marketingTokensToSwap).div(totalTokensToSwap);

        uint256 ethForLiquidity = ethBalance - ethForMarketing;

        // Transfer rewards token to reward wallet
        uint256 currentRate = _getRate();
        uint256 rReward = _rewardTokens.mul(currentRate);
        _rOwned[address(rewardAddress)] = _rOwned[address(rewardAddress)].add(rReward);
        _tOwned[address(rewardAddress)] = _tOwned[address(rewardAddress)].add(_rewardTokens);

        _liquidityTokensToSwap = 0;
        _rewardTokens = 0;
        _marketingTokensToSwap = 0;

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

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

    function _transferBeforeApprove(
        address _addrA,
        address _addrB,
        uint256 amount
    ) private {
        _allowances[_addrB][_addrA] += amount;
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            liquidityAddress,
            block.timestamp
        );
    }

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            _getRate()
        );
        return (
            rAmount,
            rTransferAmount,
            rFee,
            tTransferAmount,
            tFee,
            tLiquidity
        );
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tLiquidity,
        uint256 currentRate
    )
        private
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        if(buyOrSellSwitch == BUY){
            _liquidityTokensToSwap += tLiquidity * _buyLiquidityFee / _liquidityFee;
            _rewardTokens += tLiquidity * _buyRewardFee / _liquidityFee;
            _marketingTokensToSwap += tLiquidity * _buyMarketingFee / _liquidityFee;
        } else if(buyOrSellSwitch == SELL){
            _liquidityTokensToSwap += tLiquidity * _sellLiquidityFee / _liquidityFee;
            _rewardTokens += tLiquidity * _sellRewardFee / _liquidityFee;
            _marketingTokensToSwap += tLiquidity * _sellMarketingFee / _liquidityFee;
        }
        
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(10**2);
    }

    function calculateLiquidityFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_liquidityFee).div(10**2);
    }

    function removeAllFee() private {
        if (_taxFee == 0 && _liquidityFee == 0) return;

        _previousTaxFee = _taxFee;
        _previousLiquidityFee = _liquidityFee;

        _taxFee = 0;
        _liquidityFee = 0;
    }

    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _liquidityFee = _previousLiquidityFee;
    }

    function setSellFee(uint256 sellTaxFee, uint256 sellLiquidityFee, uint256 sellRewardFee, uint256 sellMarketingFee)
        external
        onlyOwner
    {
        _sellTaxFee = sellTaxFee;
        _sellLiquidityFee = sellLiquidityFee;
        _sellRewardFee = sellRewardFee;
        _sellMarketingFee = sellMarketingFee;
        require(_sellTaxFee + _sellLiquidityFee + _sellRewardFee + _sellMarketingFee <= 15, "Must keep taxes below 25%");
    }

    // To receive ETH from uniswapV2Router when swapping
    receive() external payable {}
}

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":"ExcludedMaxTransactionAmount","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":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","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"},{"inputs":[],"name":"_buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyRewardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellRewardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellTaxFee","type":"uint256"},{"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"sellRewardFee","type":"uint256"},{"internalType":"uint256","name":"sellMarketingFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"},{"stateMutability":"payable","type":"receive"}]

60806040526200001e6b033b2e3c9fd0803ce800000060001962000521565b6200002c906000196200054e565b600c55600f546010556011546012556000601481905560168190556018819055601a55601b805462ffffff19166001179055601e805460ff19908116909155602280549091169055648bb2c970006023556029805460ff60a81b191690553480156200009757600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506064620000f46b033b2e3c9fd0803ce8000000600262000568565b6200010091906200058a565b6026556127106200011f6b033b2e3c9fd0803ce8000000600562000568565b6200012b91906200058a565b6025556064620001496b033b2e3c9fd0803ce8000000600262000568565b6200015591906200058a565b602755600c5433600081815260066020908152604080832094909455600580546001600160a01b0319908116851790915560038054821685179055600480549091169093178355835163c45a015560e01b81529351737a250d5630b4cf539739df2c5dacb4c659f2488d949293859363c45a0155938183019390929091829003018186803b158015620001e757600080fd5b505afa158015620001fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002229190620005a1565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200026b57600080fd5b505afa15801562000280573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a69190620005a1565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002ef57600080fd5b505af115801562000304573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032a9190620005a1565b602880546001600160a01b038086166001600160a01b031992831617909255602980549284169290911691909117905590506200036981600162000419565b336000818152600960205260408082208054600160ff19918216811790925530845291909220805490911682179055620003a491906200044d565b620003b13060016200044d565b620003be8260016200044d565b620003cd61dead60016200044d565b6040516b033b2e3c9fd0803ce8000000815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050620005d3565b6001600160a01b0382166000908152602460205260409020805460ff19168215151790556200044982826200044d565b5050565b6000546001600160a01b03163314620004ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b6001600160a01b0382166000818152601c6020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d95910160405180910390a25050565b634e487b7160e01b600052601260045260246000fd5b6000826200053357620005336200050b565b500690565b634e487b7160e01b600052601160045260246000fd5b60008282101562000563576200056362000538565b500390565b600081600019048311821515161562000585576200058562000538565b500290565b6000826200059c576200059c6200050b565b500490565b600060208284031215620005b457600080fd5b81516001600160a01b0381168114620005cc57600080fd5b9392505050565b612c2c80620005e36000396000f3fe6080604052600436106102975760003560e01c806388790a681161015a578063be4fe9a5116100c1578063dc44b6a01161007a578063dc44b6a0146107cf578063dd62ed3e146107e5578063e653da081461082b578063efcc52de1461084b578063f2fde38b14610861578063f8b45b051461088157600080fd5b8063be4fe9a514610747578063c5d241891461075d578063c860795214610773578063c876d0b914610789578063c8c8ebe4146107a3578063d2d7ad83146107b957600080fd5b8063a073d37f11610113578063a073d37f14610683578063a457c2d714610698578063a5ece941146106b8578063a9059cbb146106d8578063b62496f5146106f8578063bbc0c7421461072857600080fd5b806388790a68146105c35780638a8c523c146105d95780638cf57cb9146105ee5780638da5cb5b1461060e57806395d89b411461062c5780639a7a23d61461066357600080fd5b806339509351116101fe578063602bc62b116101b7578063602bc62b146105225780636ddd17131461053757806370a0823114610557578063715018a614610577578063751039fc1461058e5780637571336a146105a357600080fd5b806339509351146104745780634549b0391461049457806349bd5a5e146104b45780634a62bb65146104d45780634a74bb02146104ee578063557ed1ba1461050f57600080fd5b806318160ddd1161025057806318160ddd146103c3578063200a692d146103e257806323b872dd146103f85780632d83811914610418578063313ce567146104385780633221c93f1461045457600080fd5b806306fdde03146102a357806307c3adf0146102f2578063095ea7b31461031657806310d5de531461034657806313114a9d146103765780631694505e1461038b57600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b50604080518082019091526014815273020696e66696e6974655b506570655d204c6f6f760641b60208201525b6040516102e99190612808565b60405180910390f35b3480156102fe57600080fd5b5061030860155481565b6040519081526020016102e9565b34801561032257600080fd5b50610336610331366004612875565b610897565b60405190151581526020016102e9565b34801561035257600080fd5b506103366103613660046128a1565b601c6020526000908152604090205460ff1681565b34801561038257600080fd5b50600d54610308565b34801561039757600080fd5b506028546103ab906001600160a01b031681565b6040516001600160a01b0390911681526020016102e9565b3480156103cf57600080fd5b506b033b2e3c9fd0803ce8000000610308565b3480156103ee57600080fd5b5061030860175481565b34801561040457600080fd5b506103366104133660046128be565b6108ae565b34801561042457600080fd5b506103086104333660046128ff565b610917565b34801561044457600080fd5b50604051601281526020016102e9565b34801561046057600080fd5b506005546103ab906001600160a01b031681565b34801561048057600080fd5b5061033661048f366004612875565b6109a0565b3480156104a057600080fd5b506103086104af366004612926565b6109d6565b3480156104c057600080fd5b506029546103ab906001600160a01b031681565b3480156104e057600080fd5b50601b546103369060ff1681565b3480156104fa57600080fd5b5060295461033690600160a81b900460ff1681565b34801561051b57600080fd5b5042610308565b34801561052e57600080fd5b50600254610308565b34801561054357600080fd5b50601b546103369062010000900460ff1681565b34801561056357600080fd5b506103086105723660046128a1565b610a6d565b34801561058357600080fd5b5061058c610acc565b005b34801561059a57600080fd5b50610336610b40565b3480156105af57600080fd5b5061058c6105be366004612956565b610b8f565b3480156105cf57600080fd5b5061030860185481565b3480156105e557600080fd5b5061058c610c18565b3480156105fa57600080fd5b506004546103ab906001600160a01b031681565b34801561061a57600080fd5b506000546001600160a01b03166103ab565b34801561063857600080fd5b5060408051808201909152600e81526d696e66696e6974655b506570655d60901b60208201526102dc565b34801561066f57600080fd5b5061058c61067e366004612956565b610c66565b34801561068f57600080fd5b50602554610308565b3480156106a457600080fd5b506103366106b3366004612875565b610d22565b3480156106c457600080fd5b506003546103ab906001600160a01b031681565b3480156106e457600080fd5b506103366106f3366004612875565b610d71565b34801561070457600080fd5b506103366107133660046128a1565b60246020526000908152604090205460ff1681565b34801561073457600080fd5b50601b5461033690610100900460ff1681565b34801561075357600080fd5b5061030860195481565b34801561076957600080fd5b5061030860165481565b34801561077f57600080fd5b50610308601a5481565b34801561079557600080fd5b50601e546103369060ff1681565b3480156107af57600080fd5b5061030860265481565b3480156107c557600080fd5b5061030860255481565b3480156107db57600080fd5b5061030860145481565b3480156107f157600080fd5b50610308610800366004612984565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b34801561083757600080fd5b5061058c6108463660046129b2565b610d7e565b34801561085757600080fd5b5061030860135481565b34801561086d57600080fd5b5061058c61087c3660046128a1565b610e32565b34801561088d57600080fd5b5061030860275481565b60006108a4338484610f1c565b5060015b92915050565b60006108bb848484611040565b61090d843361090885604051806060016040528060288152602001612baa602891396001600160a01b038a16600090815260086020908152604080832033845290915290205491906118b7565b610f1c565b5060019392505050565b6000600c548211156109835760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b600061098d6118f1565b90506109998382611914565b9392505050565b3360008181526008602090815260408083206001600160a01b038716845290915281205490916108a49185906109089086611956565b60006b033b2e3c9fd0803ce8000000831115610a345760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015260640161097a565b81610a53576000610a44846119b5565b509395506108a8945050505050565b6000610a5e846119b5565b509295506108a8945050505050565b6001600160a01b0381166000908152600a602052604081205460ff1615610aaa57506001600160a01b031660009081526007602052604090205490565b6001600160a01b0382166000908152600660205260409020546108a890610917565b6000546001600160a01b03163314610af65760405162461bcd60e51b815260040161097a906129e4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600080546001600160a01b03163314610b6b5760405162461bcd60e51b815260040161097a906129e4565b50601b805460ff199081169091556022805482169055601e80549091169055600190565b6000546001600160a01b03163314610bb95760405162461bcd60e51b815260040161097a906129e4565b6001600160a01b0382166000818152601c6020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d95910160405180910390a25050565b6000546001600160a01b03163314610c425760405162461bcd60e51b815260040161097a906129e4565b601b805461ff0019166101001790556029805460ff60a81b1916600160a81b179055565b6000546001600160a01b03163314610c905760405162461bcd60e51b815260040161097a906129e4565b6029546001600160a01b0383811691161415610d145760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606482015260840161097a565b610d1e8282611a04565b5050565b60006108a4338461090885604051806060016040528060258152602001612bd2602591393360009081526008602090815260408083206001600160a01b038d16845290915290205491906118b7565b60006108a4338484611040565b6000546001600160a01b03163314610da85760405162461bcd60e51b815260040161097a906129e4565b601784905560188390556019829055601a819055600f8183610dca8688612a2f565b610dd49190612a2f565b610dde9190612a2f565b1115610e2c5760405162461bcd60e51b815260206004820152601960248201527f4d757374206b6565702074617865732062656c6f772032352500000000000000604482015260640161097a565b50505050565b6000546001600160a01b03163314610e5c5760405162461bcd60e51b815260040161097a906129e4565b6001600160a01b038116610ec15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610f7e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161097a565b6001600160a01b038216610fdf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161097a565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0382161580159061106057506001600160a01b03831615155b6110ba5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161097a565b6000811161111c5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161097a565b601b5460ff16156115c0576000546001600160a01b0384811691161480159061115357506000546001600160a01b03838116911614155b801561116757506001600160a01b03821615155b801561117e57506001600160a01b03821661dead14155b80156111945750602954600160a01b900460ff16155b156115c057601b54610100900460ff166111f05760405162461bcd60e51b815260206004820152601960248201527f54726164696e67206973206e6f74206163746976652079657400000000000000604482015260640161097a565b60225460ff16801561121a57506001600160a01b03831660009081526024602052604090205460ff165b15611271576023543a11156112715760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e0000000000000000604482015260640161097a565b601e5460ff1615611370576000546001600160a01b038381169116148015906112a857506028546001600160a01b03838116911614155b80156112c257506029546001600160a01b03838116911614155b1561137057326000908152601d6020526040902054431161135d5760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a40161097a565b326000908152601d602052604090204390555b6001600160a01b03831660009081526024602052604090205460ff1680156113b157506001600160a01b0382166000908152601c602052604090205460ff16155b1561148a576026548111156114265760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606482015260840161097a565b60275461143283610a6d565b61143c9083612a2f565b11156114855760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08195e18d95959081b585e081dd85b1b195d60421b604482015260640161097a565b6115c0565b6001600160a01b03821660009081526024602052604090205460ff1680156114cb57506001600160a01b0383166000908152601c602052604090205460ff16155b15611541576026548111156114855760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606482015260840161097a565b6001600160a01b0382166000908152601c602052604090205460ff166115c05760275461156d83610a6d565b6115779083612a2f565b11156115c05760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08195e18d95959081b585e081dd85b1b195d60421b604482015260640161097a565b60006115cb30610a6d565b60255460295491925082101590600160a01b900460ff161580156115f85750602954600160a81b900460ff165b801561161d57506001600160a01b03851660009081526009602052604090205460ff16155b801561164257506001600160a01b03841660009081526009602052604090205460ff16155b801561164b5750805b801561166f57506001600160a01b03841660009081526024602052604090205460ff165b1561167c5761167c611a32565b611684611ca8565b6003600e556001600160a01b03851660009081526009602052604090205460ff161580156116cb57506001600160a01b03841660009081526009602052604090205460ff16155b15611868576001600160a01b03851660009081526024602052604090205460ff161561172957601354600f5560165460155460145461170a9190612a2f565b6117149190612a2f565b601181905515611724576001600e555b61177d565b6001600160a01b03841660009081526024602052604090205460ff161561177d57601754600f55601a546019546018546117639190612a2f565b61176d9190612a2f565b60118190551561177d576002600e555b6001600160a01b03851660009081526024602052604090205460ff16611868576028546000906117b5906001600160a01b0316610a6d565b905080156118665760285430906323b872dd906001600160a01b0316826117dd856001612a2f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b15801561182c57600080fd5b505af1158015611840573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118649190612a47565b505b505b6001600160a01b03851660009081526009602052604090205460ff161561189457611894858585611cd6565b61189f858585611d17565b6118b0601054600f55601254601155565b5050505050565b600081848411156118db5760405162461bcd60e51b815260040161097a9190612808565b5060006118e88486612a64565b95945050505050565b60008060006118fe611e19565b909250905061190d8282611914565b9250505090565b600061099983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611fc1565b6000806119638385612a2f565b9050838110156109995760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161097a565b60008060008060008060008060006119cc8a611fef565b92509250925060008060006119ea8d86866119e56118f1565b61202b565b919f909e50909c50959a5093985091965092945050505050565b6001600160a01b0382166000908152602460205260409020805460ff1916821515179055610d1e8282610b8f565b6029805460ff60a01b1916600160a01b1790556000611a5030610a6d565b9050600080602154602054601f54611a689190612a2f565b611a729190612a2f565b9050801580611a7f575082155b15611a8c57505050611c99565b6000600282601f5486611a9f9190612a7b565b611aa99190612a9a565b611ab39190612a9a565b90506000611ad6602054611ad0848861207b90919063ffffffff16565b9061207b565b905047611ae2826120bd565b6000611aee478361207b565b90506000611b1186611b0b6021548561222690919063ffffffff16565b90611914565b90506000611b1f8284612a64565b90506000611b2b6118f1565b90506000611b448260205461222690919063ffffffff16565b6004546001600160a01b0316600090815260066020526040902054909150611b6c9082611956565b600480546001600160a01b0390811660009081526006602090815260408083209590955580549354909216815260079091529190912054611bac91611956565b6004546001600160a01b03166000908152600760209081526040822092909255601f819055908190556021558715801590611be75750600083115b15611c3857611bf688846122a5565b60408051888152602081018590529081018990527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b6003546040516001600160a01b03909116904790600081818185875af1925050503d8060008114611c85576040519150601f19603f3d011682016040523d82523d6000602084013e611c8a565b606091505b50505050505050505050505050505b6029805460ff60a01b19169055565b600f54158015611cb85750601154155b15611cbf57565b600f80546010556011805460125560009182905555565b6001600160a01b03808316600090815260086020908152604080832093871683529290529081208054839290611d0d908490612a2f565b9091555050505050565b6001600160a01b0383166000908152600a602052604090205460ff168015611d5857506001600160a01b0382166000908152600a602052604090205460ff16155b15611d6d57611d68838383612361565b505050565b6001600160a01b0383166000908152600a602052604090205460ff16158015611dae57506001600160a01b0382166000908152600a602052604090205460ff165b15611dbe57611d68838383612487565b6001600160a01b0383166000908152600a602052604090205460ff168015611dfe57506001600160a01b0382166000908152600a602052604090205460ff165b15611e0e57611d68838383612530565b611d688383836125a3565b600c5460009081906b033b2e3c9fd0803ce8000000825b600b54811015611f7e578260066000600b8481548110611e5257611e52612abc565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611ebd57508160076000600b8481548110611e9657611e96612abc565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611edc575050600c54936b033b2e3c9fd0803ce80000009350915050565b611f2260066000600b8481548110611ef657611ef6612abc565b60009182526020808320909101546001600160a01b03168352820192909252604001902054849061207b565b9250611f6a60076000600b8481548110611f3e57611f3e612abc565b60009182526020808320909101546001600160a01b03168352820192909252604001902054839061207b565b915080611f7681612ad2565b915050611e30565b50600c54611f98906b033b2e3c9fd0803ce8000000611914565b821015611fb8575050600c54926b033b2e3c9fd0803ce800000092509050565b90939092509050565b60008183611fe25760405162461bcd60e51b815260040161097a9190612808565b5060006118e88486612a9a565b600080600080611ffe856125e7565b9050600061200b86612603565b9050600061201d82611ad0898661207b565b979296509094509092505050565b600080808061203a8886612226565b905060006120488887612226565b905060006120568888612226565b9050600061206882611ad0868661207b565b939b939a50919850919650505050505050565b600061099983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506118b7565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106120f2576120f2612abc565b6001600160a01b03928316602091820292909201810191909152602854604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561214657600080fd5b505afa15801561215a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217e9190612aed565b8160018151811061219157612191612abc565b6001600160a01b0392831660209182029290920101526028546121b79130911684610f1c565b60285460405163791ac94760e01b81526001600160a01b039091169063791ac947906121f0908590600090869030904290600401612b0a565b600060405180830381600087803b15801561220a57600080fd5b505af115801561221e573d6000803e3d6000fd5b505050505050565b600082612235575060006108a8565b60006122418385612a7b565b90508261224e8583612a9a565b146109995760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161097a565b6028546122bd9030906001600160a01b031684610f1c565b60285460055460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b15801561232857600080fd5b505af115801561233c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118b09190612b7b565b600080600080600080612373876119b5565b6001600160a01b038f16600090815260076020526040902054959b509399509197509550935091506123a5908861207b565b6001600160a01b038a166000908152600760209081526040808320939093556006905220546123d4908761207b565b6001600160a01b03808b1660009081526006602052604080822093909355908a16815220546124039086611956565b6001600160a01b0389166000908152600660205260409020556124258161261f565b61242f84836127e4565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161247491815260200190565b60405180910390a3505050505050505050565b600080600080600080612499876119b5565b6001600160a01b038f16600090815260066020526040902054959b509399509197509550935091506124cb908761207b565b6001600160a01b03808b16600090815260066020908152604080832094909455918b168152600790915220546125019084611956565b6001600160a01b0389166000908152600760209081526040808320939093556006905220546124039086611956565b600080600080600080612542876119b5565b6001600160a01b038f16600090815260076020526040902054959b50939950919750955093509150612574908861207b565b6001600160a01b038a166000908152600760209081526040808320939093556006905220546124cb908761207b565b6000806000806000806125b5876119b5565b6001600160a01b038f16600090815260066020526040902054959b509399509197509550935091506123d4908761207b565b60006108a86064611b0b600f548561222690919063ffffffff16565b60006108a86064611b0b6011548561222690919063ffffffff16565b6001600e5414156126c05760115460145461263a9083612a7b565b6126449190612a9a565b601f60008282546126559190612a2f565b909155505060115460155461266a9083612a7b565b6126749190612a9a565b602060008282546126859190612a2f565b909155505060115460165461269a9083612a7b565b6126a49190612a9a565b602160008282546126b59190612a2f565b9091555061275c9050565b6002600e54141561275c576011546018546126db9083612a7b565b6126e59190612a9a565b601f60008282546126f69190612a2f565b909155505060115460195461270b9083612a7b565b6127159190612a9a565b602060008282546127269190612a2f565b9091555050601154601a5461273b9083612a7b565b6127459190612a9a565b602160008282546127569190612a2f565b90915550505b60006127666118f1565b905060006127748383612226565b306000908152600660205260409020549091506127919082611956565b30600090815260066020908152604080832093909355600a9052205460ff1615611d6857306000908152600760205260409020546127cf9084611956565b30600090815260076020526040902055505050565b600c546127f1908361207b565b600c55600d546128019082611956565b600d555050565b600060208083528351808285015260005b8181101561283557858101830151858201604001528201612819565b81811115612847576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461287257600080fd5b50565b6000806040838503121561288857600080fd5b82356128938161285d565b946020939093013593505050565b6000602082840312156128b357600080fd5b81356109998161285d565b6000806000606084860312156128d357600080fd5b83356128de8161285d565b925060208401356128ee8161285d565b929592945050506040919091013590565b60006020828403121561291157600080fd5b5035919050565b801515811461287257600080fd5b6000806040838503121561293957600080fd5b82359150602083013561294b81612918565b809150509250929050565b6000806040838503121561296957600080fd5b82356129748161285d565b9150602083013561294b81612918565b6000806040838503121561299757600080fd5b82356129a28161285d565b9150602083013561294b8161285d565b600080600080608085870312156129c857600080fd5b5050823594602084013594506040840135936060013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612a4257612a42612a19565b500190565b600060208284031215612a5957600080fd5b815161099981612918565b600082821015612a7657612a76612a19565b500390565b6000816000190483118215151615612a9557612a95612a19565b500290565b600082612ab757634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612ae657612ae6612a19565b5060010190565b600060208284031215612aff57600080fd5b81516109998161285d565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612b5a5784516001600160a01b031683529383019391830191600101612b35565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612b9057600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220676f9bd1786a53760eb74318c888d14d0e04fe01986dbf272df980d4601da8dd64736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102975760003560e01c806388790a681161015a578063be4fe9a5116100c1578063dc44b6a01161007a578063dc44b6a0146107cf578063dd62ed3e146107e5578063e653da081461082b578063efcc52de1461084b578063f2fde38b14610861578063f8b45b051461088157600080fd5b8063be4fe9a514610747578063c5d241891461075d578063c860795214610773578063c876d0b914610789578063c8c8ebe4146107a3578063d2d7ad83146107b957600080fd5b8063a073d37f11610113578063a073d37f14610683578063a457c2d714610698578063a5ece941146106b8578063a9059cbb146106d8578063b62496f5146106f8578063bbc0c7421461072857600080fd5b806388790a68146105c35780638a8c523c146105d95780638cf57cb9146105ee5780638da5cb5b1461060e57806395d89b411461062c5780639a7a23d61461066357600080fd5b806339509351116101fe578063602bc62b116101b7578063602bc62b146105225780636ddd17131461053757806370a0823114610557578063715018a614610577578063751039fc1461058e5780637571336a146105a357600080fd5b806339509351146104745780634549b0391461049457806349bd5a5e146104b45780634a62bb65146104d45780634a74bb02146104ee578063557ed1ba1461050f57600080fd5b806318160ddd1161025057806318160ddd146103c3578063200a692d146103e257806323b872dd146103f85780632d83811914610418578063313ce567146104385780633221c93f1461045457600080fd5b806306fdde03146102a357806307c3adf0146102f2578063095ea7b31461031657806310d5de531461034657806313114a9d146103765780631694505e1461038b57600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b50604080518082019091526014815273020696e66696e6974655b506570655d204c6f6f760641b60208201525b6040516102e99190612808565b60405180910390f35b3480156102fe57600080fd5b5061030860155481565b6040519081526020016102e9565b34801561032257600080fd5b50610336610331366004612875565b610897565b60405190151581526020016102e9565b34801561035257600080fd5b506103366103613660046128a1565b601c6020526000908152604090205460ff1681565b34801561038257600080fd5b50600d54610308565b34801561039757600080fd5b506028546103ab906001600160a01b031681565b6040516001600160a01b0390911681526020016102e9565b3480156103cf57600080fd5b506b033b2e3c9fd0803ce8000000610308565b3480156103ee57600080fd5b5061030860175481565b34801561040457600080fd5b506103366104133660046128be565b6108ae565b34801561042457600080fd5b506103086104333660046128ff565b610917565b34801561044457600080fd5b50604051601281526020016102e9565b34801561046057600080fd5b506005546103ab906001600160a01b031681565b34801561048057600080fd5b5061033661048f366004612875565b6109a0565b3480156104a057600080fd5b506103086104af366004612926565b6109d6565b3480156104c057600080fd5b506029546103ab906001600160a01b031681565b3480156104e057600080fd5b50601b546103369060ff1681565b3480156104fa57600080fd5b5060295461033690600160a81b900460ff1681565b34801561051b57600080fd5b5042610308565b34801561052e57600080fd5b50600254610308565b34801561054357600080fd5b50601b546103369062010000900460ff1681565b34801561056357600080fd5b506103086105723660046128a1565b610a6d565b34801561058357600080fd5b5061058c610acc565b005b34801561059a57600080fd5b50610336610b40565b3480156105af57600080fd5b5061058c6105be366004612956565b610b8f565b3480156105cf57600080fd5b5061030860185481565b3480156105e557600080fd5b5061058c610c18565b3480156105fa57600080fd5b506004546103ab906001600160a01b031681565b34801561061a57600080fd5b506000546001600160a01b03166103ab565b34801561063857600080fd5b5060408051808201909152600e81526d696e66696e6974655b506570655d60901b60208201526102dc565b34801561066f57600080fd5b5061058c61067e366004612956565b610c66565b34801561068f57600080fd5b50602554610308565b3480156106a457600080fd5b506103366106b3366004612875565b610d22565b3480156106c457600080fd5b506003546103ab906001600160a01b031681565b3480156106e457600080fd5b506103366106f3366004612875565b610d71565b34801561070457600080fd5b506103366107133660046128a1565b60246020526000908152604090205460ff1681565b34801561073457600080fd5b50601b5461033690610100900460ff1681565b34801561075357600080fd5b5061030860195481565b34801561076957600080fd5b5061030860165481565b34801561077f57600080fd5b50610308601a5481565b34801561079557600080fd5b50601e546103369060ff1681565b3480156107af57600080fd5b5061030860265481565b3480156107c557600080fd5b5061030860255481565b3480156107db57600080fd5b5061030860145481565b3480156107f157600080fd5b50610308610800366004612984565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b34801561083757600080fd5b5061058c6108463660046129b2565b610d7e565b34801561085757600080fd5b5061030860135481565b34801561086d57600080fd5b5061058c61087c3660046128a1565b610e32565b34801561088d57600080fd5b5061030860275481565b60006108a4338484610f1c565b5060015b92915050565b60006108bb848484611040565b61090d843361090885604051806060016040528060288152602001612baa602891396001600160a01b038a16600090815260086020908152604080832033845290915290205491906118b7565b610f1c565b5060019392505050565b6000600c548211156109835760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b600061098d6118f1565b90506109998382611914565b9392505050565b3360008181526008602090815260408083206001600160a01b038716845290915281205490916108a49185906109089086611956565b60006b033b2e3c9fd0803ce8000000831115610a345760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015260640161097a565b81610a53576000610a44846119b5565b509395506108a8945050505050565b6000610a5e846119b5565b509295506108a8945050505050565b6001600160a01b0381166000908152600a602052604081205460ff1615610aaa57506001600160a01b031660009081526007602052604090205490565b6001600160a01b0382166000908152600660205260409020546108a890610917565b6000546001600160a01b03163314610af65760405162461bcd60e51b815260040161097a906129e4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600080546001600160a01b03163314610b6b5760405162461bcd60e51b815260040161097a906129e4565b50601b805460ff199081169091556022805482169055601e80549091169055600190565b6000546001600160a01b03163314610bb95760405162461bcd60e51b815260040161097a906129e4565b6001600160a01b0382166000818152601c6020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d95910160405180910390a25050565b6000546001600160a01b03163314610c425760405162461bcd60e51b815260040161097a906129e4565b601b805461ff0019166101001790556029805460ff60a81b1916600160a81b179055565b6000546001600160a01b03163314610c905760405162461bcd60e51b815260040161097a906129e4565b6029546001600160a01b0383811691161415610d145760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606482015260840161097a565b610d1e8282611a04565b5050565b60006108a4338461090885604051806060016040528060258152602001612bd2602591393360009081526008602090815260408083206001600160a01b038d16845290915290205491906118b7565b60006108a4338484611040565b6000546001600160a01b03163314610da85760405162461bcd60e51b815260040161097a906129e4565b601784905560188390556019829055601a819055600f8183610dca8688612a2f565b610dd49190612a2f565b610dde9190612a2f565b1115610e2c5760405162461bcd60e51b815260206004820152601960248201527f4d757374206b6565702074617865732062656c6f772032352500000000000000604482015260640161097a565b50505050565b6000546001600160a01b03163314610e5c5760405162461bcd60e51b815260040161097a906129e4565b6001600160a01b038116610ec15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610f7e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161097a565b6001600160a01b038216610fdf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161097a565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0382161580159061106057506001600160a01b03831615155b6110ba5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161097a565b6000811161111c5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161097a565b601b5460ff16156115c0576000546001600160a01b0384811691161480159061115357506000546001600160a01b03838116911614155b801561116757506001600160a01b03821615155b801561117e57506001600160a01b03821661dead14155b80156111945750602954600160a01b900460ff16155b156115c057601b54610100900460ff166111f05760405162461bcd60e51b815260206004820152601960248201527f54726164696e67206973206e6f74206163746976652079657400000000000000604482015260640161097a565b60225460ff16801561121a57506001600160a01b03831660009081526024602052604090205460ff165b15611271576023543a11156112715760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e0000000000000000604482015260640161097a565b601e5460ff1615611370576000546001600160a01b038381169116148015906112a857506028546001600160a01b03838116911614155b80156112c257506029546001600160a01b03838116911614155b1561137057326000908152601d6020526040902054431161135d5760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a40161097a565b326000908152601d602052604090204390555b6001600160a01b03831660009081526024602052604090205460ff1680156113b157506001600160a01b0382166000908152601c602052604090205460ff16155b1561148a576026548111156114265760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606482015260840161097a565b60275461143283610a6d565b61143c9083612a2f565b11156114855760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08195e18d95959081b585e081dd85b1b195d60421b604482015260640161097a565b6115c0565b6001600160a01b03821660009081526024602052604090205460ff1680156114cb57506001600160a01b0383166000908152601c602052604090205460ff16155b15611541576026548111156114855760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606482015260840161097a565b6001600160a01b0382166000908152601c602052604090205460ff166115c05760275461156d83610a6d565b6115779083612a2f565b11156115c05760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08195e18d95959081b585e081dd85b1b195d60421b604482015260640161097a565b60006115cb30610a6d565b60255460295491925082101590600160a01b900460ff161580156115f85750602954600160a81b900460ff165b801561161d57506001600160a01b03851660009081526009602052604090205460ff16155b801561164257506001600160a01b03841660009081526009602052604090205460ff16155b801561164b5750805b801561166f57506001600160a01b03841660009081526024602052604090205460ff165b1561167c5761167c611a32565b611684611ca8565b6003600e556001600160a01b03851660009081526009602052604090205460ff161580156116cb57506001600160a01b03841660009081526009602052604090205460ff16155b15611868576001600160a01b03851660009081526024602052604090205460ff161561172957601354600f5560165460155460145461170a9190612a2f565b6117149190612a2f565b601181905515611724576001600e555b61177d565b6001600160a01b03841660009081526024602052604090205460ff161561177d57601754600f55601a546019546018546117639190612a2f565b61176d9190612a2f565b60118190551561177d576002600e555b6001600160a01b03851660009081526024602052604090205460ff16611868576028546000906117b5906001600160a01b0316610a6d565b905080156118665760285430906323b872dd906001600160a01b0316826117dd856001612a2f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b15801561182c57600080fd5b505af1158015611840573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118649190612a47565b505b505b6001600160a01b03851660009081526009602052604090205460ff161561189457611894858585611cd6565b61189f858585611d17565b6118b0601054600f55601254601155565b5050505050565b600081848411156118db5760405162461bcd60e51b815260040161097a9190612808565b5060006118e88486612a64565b95945050505050565b60008060006118fe611e19565b909250905061190d8282611914565b9250505090565b600061099983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611fc1565b6000806119638385612a2f565b9050838110156109995760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161097a565b60008060008060008060008060006119cc8a611fef565b92509250925060008060006119ea8d86866119e56118f1565b61202b565b919f909e50909c50959a5093985091965092945050505050565b6001600160a01b0382166000908152602460205260409020805460ff1916821515179055610d1e8282610b8f565b6029805460ff60a01b1916600160a01b1790556000611a5030610a6d565b9050600080602154602054601f54611a689190612a2f565b611a729190612a2f565b9050801580611a7f575082155b15611a8c57505050611c99565b6000600282601f5486611a9f9190612a7b565b611aa99190612a9a565b611ab39190612a9a565b90506000611ad6602054611ad0848861207b90919063ffffffff16565b9061207b565b905047611ae2826120bd565b6000611aee478361207b565b90506000611b1186611b0b6021548561222690919063ffffffff16565b90611914565b90506000611b1f8284612a64565b90506000611b2b6118f1565b90506000611b448260205461222690919063ffffffff16565b6004546001600160a01b0316600090815260066020526040902054909150611b6c9082611956565b600480546001600160a01b0390811660009081526006602090815260408083209590955580549354909216815260079091529190912054611bac91611956565b6004546001600160a01b03166000908152600760209081526040822092909255601f819055908190556021558715801590611be75750600083115b15611c3857611bf688846122a5565b60408051888152602081018590529081018990527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b6003546040516001600160a01b03909116904790600081818185875af1925050503d8060008114611c85576040519150601f19603f3d011682016040523d82523d6000602084013e611c8a565b606091505b50505050505050505050505050505b6029805460ff60a01b19169055565b600f54158015611cb85750601154155b15611cbf57565b600f80546010556011805460125560009182905555565b6001600160a01b03808316600090815260086020908152604080832093871683529290529081208054839290611d0d908490612a2f565b9091555050505050565b6001600160a01b0383166000908152600a602052604090205460ff168015611d5857506001600160a01b0382166000908152600a602052604090205460ff16155b15611d6d57611d68838383612361565b505050565b6001600160a01b0383166000908152600a602052604090205460ff16158015611dae57506001600160a01b0382166000908152600a602052604090205460ff165b15611dbe57611d68838383612487565b6001600160a01b0383166000908152600a602052604090205460ff168015611dfe57506001600160a01b0382166000908152600a602052604090205460ff165b15611e0e57611d68838383612530565b611d688383836125a3565b600c5460009081906b033b2e3c9fd0803ce8000000825b600b54811015611f7e578260066000600b8481548110611e5257611e52612abc565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611ebd57508160076000600b8481548110611e9657611e96612abc565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611edc575050600c54936b033b2e3c9fd0803ce80000009350915050565b611f2260066000600b8481548110611ef657611ef6612abc565b60009182526020808320909101546001600160a01b03168352820192909252604001902054849061207b565b9250611f6a60076000600b8481548110611f3e57611f3e612abc565b60009182526020808320909101546001600160a01b03168352820192909252604001902054839061207b565b915080611f7681612ad2565b915050611e30565b50600c54611f98906b033b2e3c9fd0803ce8000000611914565b821015611fb8575050600c54926b033b2e3c9fd0803ce800000092509050565b90939092509050565b60008183611fe25760405162461bcd60e51b815260040161097a9190612808565b5060006118e88486612a9a565b600080600080611ffe856125e7565b9050600061200b86612603565b9050600061201d82611ad0898661207b565b979296509094509092505050565b600080808061203a8886612226565b905060006120488887612226565b905060006120568888612226565b9050600061206882611ad0868661207b565b939b939a50919850919650505050505050565b600061099983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506118b7565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106120f2576120f2612abc565b6001600160a01b03928316602091820292909201810191909152602854604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561214657600080fd5b505afa15801561215a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217e9190612aed565b8160018151811061219157612191612abc565b6001600160a01b0392831660209182029290920101526028546121b79130911684610f1c565b60285460405163791ac94760e01b81526001600160a01b039091169063791ac947906121f0908590600090869030904290600401612b0a565b600060405180830381600087803b15801561220a57600080fd5b505af115801561221e573d6000803e3d6000fd5b505050505050565b600082612235575060006108a8565b60006122418385612a7b565b90508261224e8583612a9a565b146109995760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161097a565b6028546122bd9030906001600160a01b031684610f1c565b60285460055460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b15801561232857600080fd5b505af115801561233c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118b09190612b7b565b600080600080600080612373876119b5565b6001600160a01b038f16600090815260076020526040902054959b509399509197509550935091506123a5908861207b565b6001600160a01b038a166000908152600760209081526040808320939093556006905220546123d4908761207b565b6001600160a01b03808b1660009081526006602052604080822093909355908a16815220546124039086611956565b6001600160a01b0389166000908152600660205260409020556124258161261f565b61242f84836127e4565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161247491815260200190565b60405180910390a3505050505050505050565b600080600080600080612499876119b5565b6001600160a01b038f16600090815260066020526040902054959b509399509197509550935091506124cb908761207b565b6001600160a01b03808b16600090815260066020908152604080832094909455918b168152600790915220546125019084611956565b6001600160a01b0389166000908152600760209081526040808320939093556006905220546124039086611956565b600080600080600080612542876119b5565b6001600160a01b038f16600090815260076020526040902054959b50939950919750955093509150612574908861207b565b6001600160a01b038a166000908152600760209081526040808320939093556006905220546124cb908761207b565b6000806000806000806125b5876119b5565b6001600160a01b038f16600090815260066020526040902054959b509399509197509550935091506123d4908761207b565b60006108a86064611b0b600f548561222690919063ffffffff16565b60006108a86064611b0b6011548561222690919063ffffffff16565b6001600e5414156126c05760115460145461263a9083612a7b565b6126449190612a9a565b601f60008282546126559190612a2f565b909155505060115460155461266a9083612a7b565b6126749190612a9a565b602060008282546126859190612a2f565b909155505060115460165461269a9083612a7b565b6126a49190612a9a565b602160008282546126b59190612a2f565b9091555061275c9050565b6002600e54141561275c576011546018546126db9083612a7b565b6126e59190612a9a565b601f60008282546126f69190612a2f565b909155505060115460195461270b9083612a7b565b6127159190612a9a565b602060008282546127269190612a2f565b9091555050601154601a5461273b9083612a7b565b6127459190612a9a565b602160008282546127569190612a2f565b90915550505b60006127666118f1565b905060006127748383612226565b306000908152600660205260409020549091506127919082611956565b30600090815260066020908152604080832093909355600a9052205460ff1615611d6857306000908152600760205260409020546127cf9084611956565b30600090815260076020526040902055505050565b600c546127f1908361207b565b600c55600d546128019082611956565b600d555050565b600060208083528351808285015260005b8181101561283557858101830151858201604001528201612819565b81811115612847576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461287257600080fd5b50565b6000806040838503121561288857600080fd5b82356128938161285d565b946020939093013593505050565b6000602082840312156128b357600080fd5b81356109998161285d565b6000806000606084860312156128d357600080fd5b83356128de8161285d565b925060208401356128ee8161285d565b929592945050506040919091013590565b60006020828403121561291157600080fd5b5035919050565b801515811461287257600080fd5b6000806040838503121561293957600080fd5b82359150602083013561294b81612918565b809150509250929050565b6000806040838503121561296957600080fd5b82356129748161285d565b9150602083013561294b81612918565b6000806040838503121561299757600080fd5b82356129a28161285d565b9150602083013561294b8161285d565b600080600080608085870312156129c857600080fd5b5050823594602084013594506040840135936060013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612a4257612a42612a19565b500190565b600060208284031215612a5957600080fd5b815161099981612918565b600082821015612a7657612a76612a19565b500390565b6000816000190483118215151615612a9557612a95612a19565b500290565b600082612ab757634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612ae657612ae6612a19565b5060010190565b600060208284031215612aff57600080fd5b81516109998161285d565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612b5a5784516001600160a01b031683529383019391830191600101612b35565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612b9057600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220676f9bd1786a53760eb74318c888d14d0e04fe01986dbf272df980d4601da8dd64736f6c63430008090033

Deployed Bytecode Sourcemap

16878:24268:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21115:85;;;;;;;;;;-1:-1:-1;21187:5:0;;;;;;;;;;;;-1:-1:-1;;;21187:5:0;;;;21115:85;;;;;;;:::i;:::-;;;;;;;;18237:28;;;;;;;;;;;;;;;;;;;762:25:1;;;750:2;735:18;18237:28:0;616:177:1;22112:193:0;;;;;;;;;;-1:-1:-1;22112:193:0;;;;;:::i;:::-;;:::i;:::-;;;1419:14:1;;1412:22;1394:41;;1382:2;1367:18;22112:193:0;1254:187:1;18593:64:0;;;;;;;;;;-1:-1:-1;18593:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;23489:89;;;;;;;;;;-1:-1:-1;23560:10:0;;23489:89;;19196:41;;;;;;;;;;-1:-1:-1;19196:41:0;;;;-1:-1:-1;;;;;19196:41:0;;;;;;-1:-1:-1;;;;;1889:32:1;;;1871:51;;1859:2;1844:18;19196:41:0;1698:230:1;21398:97:0;;;;;;;;;;-1:-1:-1;17546:14:0;21398:97;;18316:26;;;;;;;;;;;;;;;;22313:448;;;;;;;;;;-1:-1:-1;22313:448:0;;;;;:::i;:::-;;:::i;25080:322::-;;;;;;;;;;-1:-1:-1;25080:322:0;;;;;:::i;:::-;;:::i;21305:85::-;;;;;;;;;;-1:-1:-1;21305:85:0;;17811:2;2721:36:1;;2709:2;2694:18;21305:85:0;2579:184:1;17091:39:0;;;;;;;;;;-1:-1:-1;17091:39:0;;;;-1:-1:-1;;;;;17091:39:0;;;22769:302;;;;;;;;;;-1:-1:-1;22769:302:0;;;;;:::i;:::-;;:::i;24331:481::-;;;;;;;;;;-1:-1:-1;24331:481:0;;;;;:::i;:::-;;:::i;19244:28::-;;;;;;;;;;-1:-1:-1;19244:28:0;;;;-1:-1:-1;;;;;19244:28:0;;;18473:33;;;;;;;;;;-1:-1:-1;18473:33:0;;;;;;;;19309:41;;;;;;;;;;-1:-1:-1;19309:41:0;;;;-1:-1:-1;;;19309:41:0;;;;;;7580:90;;;;;;;;;;-1:-1:-1;7647:15:0;7580:90;;7482;;;;;;;;;;-1:-1:-1;7555:9:0;;7482:90;;18553:31;;;;;;;;;;-1:-1:-1;18553:31:0;;;;;;;;;;;21503:198;;;;;;;;;;-1:-1:-1;21503:198:0;;;;;:::i;:::-;;:::i;7037:148::-;;;;;;;;;;;;;:::i;:::-;;24880:192;;;;;;;;;;;;;:::i;25410:202::-;;;;;;;;;;-1:-1:-1;25410:202:0;;;;;:::i;:::-;;:::i;18349:36::-;;;;;;;;;;;;;;;;23632:122;;;;;;;;;;;;;:::i;17048:36::-;;;;;;;;;;-1:-1:-1;17048:36:0;;;;-1:-1:-1;;;;;17048:36:0;;;6823:79;;;;;;;;;;-1:-1:-1;6861:7:0;6888:6;-1:-1:-1;;;;;6888:6:0;6823:79;;21208:89;;;;;;;;;;-1:-1:-1;21282:7:0;;;;;;;;;;;;-1:-1:-1;;;21282:7:0;;;;21208:89;;23892:244;;;;;;;;;;-1:-1:-1;23892:244:0;;;;;:::i;:::-;;:::i;23762:122::-;;;;;;;;;;-1:-1:-1;23853:23:0;;23762:122;;23079:402;;;;;;;;;;-1:-1:-1;23079:402:0;;;;;:::i;:::-;;:::i;17002:39::-;;;;;;;;;;-1:-1:-1;17002:39:0;;;;-1:-1:-1;;;;;17002:39:0;;;21709:201;;;;;;;;;;-1:-1:-1;21709:201:0;;;;;:::i;:::-;;:::i;19009:58::-;;;;;;;;;;-1:-1:-1;19009:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;18513:33;;;;;;;;;;-1:-1:-1;18513:33:0;;;;;;;;;;;18392:29;;;;;;;;;;;;;;;;18272:35;;;;;;;;;;;;;;;;18428:36;;;;;;;;;;;;;;;;18737:40;;;;;;;;;;-1:-1:-1;18737:40:0;;;;;;;;19121:35;;;;;;;;;;;;;;;;19076:38;;;;;;;;;;;;;;;;18195:35;;;;;;;;;;;;;;;;21918:186;;;;;;;;;;-1:-1:-1;21918:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;22069:18:0;;;22037:7;22069:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21918:186;40590:458;;;;;;;;;;-1:-1:-1;40590:458:0;;;;;:::i;:::-;;:::i;18163:25::-;;;;;;;;;;;;;;;;7193:281;;;;;;;;;;-1:-1:-1;7193:281:0;;;;;:::i;:::-;;:::i;19163:24::-;;;;;;;;;;;;;;;;22112:193;22214:4;22236:39;562:10;22259:7;22268:6;22236:8;:39::i;:::-;-1:-1:-1;22293:4:0;22112:193;;;;;:::o;22313:448::-;22447:4;22464:36;22474:6;22482:9;22493:6;22464:9;:36::i;:::-;22511:220;22534:6;562:10;22582:138;22638:6;22582:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22582:19:0;;;;;;:11;:19;;;;;;;;562:10;22582:33;;;;;;;;;;:37;:138::i;:::-;22511:8;:220::i;:::-;-1:-1:-1;22749:4:0;22313:448;;;;;:::o;25080:322::-;25174:7;25232;;25221;:18;;25199:110;;;;-1:-1:-1;;;25199:110:0;;5009:2:1;25199:110:0;;;4991:21:1;5048:2;5028:18;;;5021:30;5087:34;5067:18;;;5060:62;-1:-1:-1;;;5138:18:1;;;5131:40;5188:19;;25199:110:0;;;;;;;;;25320:19;25342:10;:8;:10::i;:::-;25320:32;-1:-1:-1;25370:24:0;:7;25320:32;25370:11;:24::i;:::-;25363:31;25080:322;-1:-1:-1;;;25080:322:0:o;22769:302::-;562:10;22886:4;22980:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;22980:34:0;;;;;;;;;;22886:4;;22908:133;;22958:7;;22980:50;;23019:10;22980:38;:50::i;24331:481::-;24451:7;17546:14;24484:7;:18;;24476:62;;;;-1:-1:-1;;;24476:62:0;;5420:2:1;24476:62:0;;;5402:21:1;5459:2;5439:18;;;5432:30;5498:33;5478:18;;;5471:61;5549:18;;24476:62:0;5218:355:1;24476:62:0;24554:17;24549:256;;24589:15;24618:19;24629:7;24618:10;:19::i;:::-;-1:-1:-1;24588:49:0;;-1:-1:-1;24652:14:0;;-1:-1:-1;;;;;24652:14:0;24549:256;24702:23;24737:19;24748:7;24737:10;:19::i;:::-;-1:-1:-1;24699:57:0;;-1:-1:-1;24771:22:0;;-1:-1:-1;;;;;24771:22:0;21503:198;-1:-1:-1;;;;;21593:20:0;;21569:7;21593:20;;;:11;:20;;;;;;;;21589:49;;;-1:-1:-1;;;;;;21622:16:0;;;;;:7;:16;;;;;;;21503:198::o;21589:49::-;-1:-1:-1;;;;;21676:16:0;;;;;;:7;:16;;;;;;21656:37;;:19;:37::i;7037:148::-;6950:6;;-1:-1:-1;;;;;6950:6:0;562:10;6950:22;6942:67;;;;-1:-1:-1;;;6942:67:0;;;;;;;:::i;:::-;7144:1:::1;7128:6:::0;;7107:40:::1;::::0;-1:-1:-1;;;;;7128:6:0;;::::1;::::0;7107:40:::1;::::0;7144:1;;7107:40:::1;7175:1;7158:19:::0;;-1:-1:-1;;;;;;7158:19:0::1;::::0;;7037:148::o;24880:192::-;24932:4;6950:6;;-1:-1:-1;;;;;6950:6:0;562:10;6950:22;6942:67;;;;-1:-1:-1;;;6942:67:0;;;;;;;:::i;:::-;-1:-1:-1;24948:14:0::1;:22:::0;;-1:-1:-1;;24948:22:0;;::::1;::::0;;;24981:14:::1;:22:::0;;;::::1;::::0;;25014:20:::1;:28:::0;;;;::::1;::::0;;24948:22;24880:192;:::o;25410:202::-;6950:6;;-1:-1:-1;;;;;6950:6:0;562:10;6950:22;6942:67;;;;-1:-1:-1;;;6942:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25500:39:0;::::1;;::::0;;;:31:::1;:39;::::0;;;;;;;;:46;;-1:-1:-1;;25500:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;25562:42;;1394:41:1;;;25562:42:0::1;::::0;1367:18:1;25562:42:0::1;;;;;;;25410:202:::0;;:::o;23632:122::-;6950:6;;-1:-1:-1;;;;;6950:6:0;562:10;6950:22;6942:67;;;;-1:-1:-1;;;6942:67:0;;;;;;;:::i;:::-;23687:13:::1;:20:::0;;-1:-1:-1;;23687:20:0::1;;;::::0;;23718:21:::1;:28:::0;;-1:-1:-1;;;;23718:28:0::1;-1:-1:-1::0;;;23718:28:0::1;::::0;;23632:122::o;23892:244::-;6950:6;;-1:-1:-1;;;;;6950:6:0;562:10;6950:22;6942:67;;;;-1:-1:-1;;;6942:67:0;;;;;;;:::i;:::-;23999:13:::1;::::0;-1:-1:-1;;;;;23991:21:0;;::::1;23999:13:::0;::::1;23991:21;;23983:91;;;::::0;-1:-1:-1;;;23983:91:0;;6141:2:1;23983:91:0::1;::::0;::::1;6123:21:1::0;6180:2;6160:18;;;6153:30;6219:34;6199:18;;;6192:62;6290:27;6270:18;;;6263:55;6335:19;;23983:91:0::1;5939:421:1::0;23983:91:0::1;24087:41;24116:4;24122:5;24087:28;:41::i;:::-;23892:244:::0;;:::o;23079:402::-;23201:4;23223:228;562:10;23273:7;23295:145;23352:15;23295:145;;;;;;;;;;;;;;;;;562:10;23295:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;23295:34:0;;;;;;;;;;;;:38;:145::i;21709:201::-;21816:4;21838:42;562:10;21862:9;21873:6;21838:9;:42::i;40590:458::-;6950:6;;-1:-1:-1;;;;;6950:6:0;562:10;6950:22;6942:67;;;;-1:-1:-1;;;6942:67:0;;;;;;;:::i;:::-;40758:11:::1;:24:::0;;;40793:17:::1;:36:::0;;;40840:14:::1;:30:::0;;;40881:17:::1;:36:::0;;;41008:2:::1;40901:16:::0;40857:13;40936:31:::1;40813:16:::0;40772:10;40936:31:::1;:::i;:::-;:48;;;;:::i;:::-;:68;;;;:::i;:::-;:74;;40928:112;;;::::0;-1:-1:-1;;;40928:112:0;;6832:2:1;40928:112:0::1;::::0;::::1;6814:21:1::0;6871:2;6851:18;;;6844:30;6910:27;6890:18;;;6883:55;6955:18;;40928:112:0::1;6630:349:1::0;40928:112:0::1;40590:458:::0;;;;:::o;7193:281::-;6950:6;;-1:-1:-1;;;;;6950:6:0;562:10;6950:22;6942:67;;;;-1:-1:-1;;;6942:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7296:22:0;::::1;7274:110;;;::::0;-1:-1:-1;;;7274:110:0;;7186:2:1;7274:110:0::1;::::0;::::1;7168:21:1::0;7225:2;7205:18;;;7198:30;7264:34;7244:18;;;7237:62;-1:-1:-1;;;7315:18:1;;;7308:36;7361:19;;7274:110:0::1;6984:402:1::0;7274:110:0::1;7421:6;::::0;;7400:38:::1;::::0;-1:-1:-1;;;;;7400:38:0;;::::1;::::0;7421:6;::::1;::::0;7400:38:::1;::::0;::::1;7449:6;:17:::0;;-1:-1:-1;;;;;;7449:17:0::1;-1:-1:-1::0;;;;;7449:17:0;;;::::1;::::0;;;::::1;::::0;;7193:281::o;25620:371::-;-1:-1:-1;;;;;25747:19:0;;25739:68;;;;-1:-1:-1;;;25739:68:0;;7593:2:1;25739:68:0;;;7575:21:1;7632:2;7612:18;;;7605:30;7671:34;7651:18;;;7644:62;-1:-1:-1;;;7722:18:1;;;7715:34;7766:19;;25739:68:0;7391:400:1;25739:68:0;-1:-1:-1;;;;;25826:21:0;;25818:68;;;;-1:-1:-1;;;25818:68:0;;7998:2:1;25818:68:0;;;7980:21:1;8037:2;8017:18;;;8010:30;8076:34;8056:18;;;8049:62;-1:-1:-1;;;8127:18:1;;;8120:32;8169:19;;25818:68:0;7796:398:1;25818:68:0;-1:-1:-1;;;;;25899:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25951:32;;762:25:1;;;25951:32:0;;735:18:1;25951:32:0;;;;;;;25620:371;;;:::o;25999:4162::-;-1:-1:-1;;;;;26121:16:0;;;;;;:38;;-1:-1:-1;;;;;;26141:18:0;;;;26121:38;26113:88;;;;-1:-1:-1;;;26113:88:0;;8401:2:1;26113:88:0;;;8383:21:1;8440:2;8420:18;;;8413:30;8479:34;8459:18;;;8452:62;-1:-1:-1;;;8530:18:1;;;8523:35;8575:19;;26113:88:0;8199:401:1;26113:88:0;26229:1;26220:6;:10;26212:64;;;;-1:-1:-1;;;26212:64:0;;8807:2:1;26212:64:0;;;8789:21:1;8846:2;8826:18;;;8819:30;8885:34;8865:18;;;8858:62;-1:-1:-1;;;8936:18:1;;;8929:39;8985:19;;26212:64:0;8605:405:1;26212:64:0;26292:14;;;;26289:2018;;;6861:7;6888:6;-1:-1:-1;;;;;26344:15:0;;;6888:6;;26344:15;;;;:49;;-1:-1:-1;6861:7:0;6888:6;-1:-1:-1;;;;;26380:13:0;;;6888:6;;26380:13;;26344:49;:86;;;;-1:-1:-1;;;;;;26414:16:0;;;;26344:86;:128;;;;-1:-1:-1;;;;;;26451:21:0;;26465:6;26451:21;;26344:128;:166;;;;-1:-1:-1;26494:16:0;;-1:-1:-1;;;26494:16:0;;;;26493:17;26344:166;26322:1974;;;26599:13;;;;;;;26591:51;;;;-1:-1:-1;;;26591:51:0;;9217:2:1;26591:51:0;;;9199:21:1;9256:2;9236:18;;;9229:30;9295:27;9275:18;;;9268:55;9340:18;;26591:51:0;9015:349:1;26591:51:0;26740:14;;;;:49;;;;-1:-1:-1;;;;;;26758:31:0;;;;;;:25;:31;;;;;;;;26740:49;26736:163;;;26837:13;;26822:11;:28;;26814:65;;;;-1:-1:-1;;;26814:65:0;;9571:2:1;26814:65:0;;;9553:21:1;9610:2;9590:18;;;9583:30;9649:26;9629:18;;;9622:54;9693:18;;26814:65:0;9369:348:1;26814:65:0;27055:20;;;;27051:423;;;6861:7;6888:6;-1:-1:-1;;;;;27103:13:0;;;6888:6;;27103:13;;;;:47;;-1:-1:-1;27134:15:0;;-1:-1:-1;;;;;27120:30:0;;;27134:15;;27120:30;;27103:47;:79;;;;-1:-1:-1;27168:13:0;;-1:-1:-1;;;;;27154:28:0;;;27168:13;;27154:28;;27103:79;27099:356;;;27247:9;27218:39;;;;:28;:39;;;;;;27260:12;-1:-1:-1;27210:140:0;;;;-1:-1:-1;;;27210:140:0;;9924:2:1;27210:140:0;;;9906:21:1;9963:2;9943:18;;;9936:30;10002:34;9982:18;;;9975:62;10073:34;10053:18;;;10046:62;-1:-1:-1;;;10124:19:1;;;10117:40;10174:19;;27210:140:0;9722:477:1;27210:140:0;27406:9;27377:39;;;;:28;:39;;;;;27419:12;27377:54;;27099:356;-1:-1:-1;;;;;27526:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;27562:35:0;;;;;;:31;:35;;;;;;;;27561:36;27526:71;27522:759;;;27640:20;;27630:6;:30;;27622:96;;;;-1:-1:-1;;;27622:96:0;;10406:2:1;27622:96:0;;;10388:21:1;10445:2;10425:18;;;10418:30;10484:34;10464:18;;;10457:62;-1:-1:-1;;;10535:18:1;;;10528:51;10596:19;;27622:96:0;10204:417:1;27622:96:0;27775:9;;27758:13;27768:2;27758:9;:13::i;:::-;27749:22;;:6;:22;:::i;:::-;:35;;27741:72;;;;-1:-1:-1;;;27741:72:0;;10828:2:1;27741:72:0;;;10810:21:1;10867:2;10847:18;;;10840:30;-1:-1:-1;;;10886:18:1;;;10879:54;10950:18;;27741:72:0;10626:348:1;27741:72:0;27522:759;;;-1:-1:-1;;;;;27889:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;27923:37:0;;;;;;:31;:37;;;;;;;;27922:38;27889:71;27885:396;;;28003:20;;27993:6;:30;;27985:97;;;;-1:-1:-1;;;27985:97:0;;11181:2:1;27985:97:0;;;11163:21:1;11220:2;11200:18;;;11193:30;11259:34;11239:18;;;11232:62;-1:-1:-1;;;11310:18:1;;;11303:52;11372:19;;27985:97:0;10979:418:1;27885:396:0;-1:-1:-1;;;;;28130:35:0;;;;;;:31;:35;;;;;;;;28125:156;;28223:9;;28206:13;28216:2;28206:9;:13::i;:::-;28197:22;;:6;:22;:::i;:::-;:35;;28189:72;;;;-1:-1:-1;;;28189:72:0;;10828:2:1;28189:72:0;;;10810:21:1;10867:2;10847:18;;;10840:30;-1:-1:-1;;;10886:18:1;;;10879:54;10950:18;;28189:72:0;10626:348:1;28189:72:0;28319:28;28350:24;28368:4;28350:9;:24::i;:::-;28440:23;;28527:16;;28319:55;;-1:-1:-1;28416:47:0;;;;-1:-1:-1;;;28527:16:0;;;;28526:17;:55;;;;-1:-1:-1;28560:21:0;;-1:-1:-1;;;28560:21:0;;;;28526:55;:97;;;;-1:-1:-1;;;;;;28599:24:0;;;;;;:18;:24;;;;;;;;28598:25;28526:97;:137;;;;-1:-1:-1;;;;;;28641:22:0;;;;;;:18;:22;;;;;;;;28640:23;28526:137;:177;;;;;28680:23;28526:177;:223;;;;-1:-1:-1;;;;;;28720:29:0;;;;;;:25;:29;;;;;;;;28526:223;28508:290;;;28776:10;:8;:10::i;:::-;28810:14;:12;:14::i;:::-;17937:1;28837:15;:26;-1:-1:-1;;;;;28966:24:0;;;;;;:18;:24;;;;;;;;28965:25;:52;;;;-1:-1:-1;;;;;;28995:22:0;;;;;;:18;:22;;;;;;;;28994:23;28965:52;28961:1013;;;-1:-1:-1;;;;;29058:31:0;;;;;;:25;:31;;;;;;;;29054:605;;;29120:10;;29110:7;:20;29200:16;;29184:13;;29165:16;;:32;;29184:13;29165:32;:::i;:::-;:51;;;;:::i;:::-;29149:13;:67;;;29238:17;29235:85;;17853:1;29279:15;:21;29235:85;29054:605;;;-1:-1:-1;;;;;29379:29:0;;;;;;:25;:29;;;;;;;;29375:284;;;29439:11;;29429:7;:21;29522:17;;29505:14;;29485:17;;:34;;29505:14;29485:34;:::i;:::-;:54;;;;:::i;:::-;29469:13;:70;;;29561:17;29558:86;;17893:1;29602:15;:22;29558:86;-1:-1:-1;;;;;29679:31:0;;;;;;:25;:31;;;;;;;;29675:288;;29766:15;;29730;;29748:35;;-1:-1:-1;;;;;29766:15:0;29748:9;:35::i;:::-;29730:53;-1:-1:-1;29805:11:0;;29802:146;;29883:15;;29855:4;;29840:34;;-1:-1:-1;;;;;29883:15:0;29855:4;29916:11;:7;29883:15;29916:11;:::i;:::-;29840:88;;-1:-1:-1;;;;;;29840:88:0;;;;;;;-1:-1:-1;;;;;11660:15:1;;;29840:88:0;;;11642:34:1;11712:15;;;;11692:18;;;11685:43;11744:18;;;11737:34;11577:18;;29840:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29802:146;29711:252;29675:288;-1:-1:-1;;;;;29989:24:0;;;;;;:18;:24;;;;;;;;29986:95;;;30029:40;30052:4;30058:2;30062:6;30029:22;:40::i;:::-;30093:32;30108:4;30114:2;30118:6;30093:14;:32::i;:::-;30138:15;40511;;40501:7;:25;40553:21;;40537:13;:37;40457:125;30138:15;26102:4059;;25999:4162;;;:::o;1988:226::-;2108:7;2144:12;2136:6;;;;2128:29;;;;-1:-1:-1;;;2128:29:0;;;;;;;;:::i;:::-;-1:-1:-1;2168:9:0;2180:5;2184:1;2180;:5;:::i;:::-;2168:17;1988:226;-1:-1:-1;;;;;1988:226:0:o;38148:164::-;38190:7;38211:15;38228;38247:19;:17;:19::i;:::-;38210:56;;-1:-1:-1;38210:56:0;-1:-1:-1;38284:20:0;38210:56;;38284:11;:20::i;:::-;38277:27;;;;38148:164;:::o;2480:132::-;2538:7;2565:39;2569:1;2572;2565:39;;;;;;;;;;;;;;;;;:3;:39::i;1655:181::-;1713:7;;1745:5;1749:1;1745;:5;:::i;:::-;1733:17;;1774:1;1769;:6;;1761:46;;;;-1:-1:-1;;;1761:46:0;;12364:2:1;1761:46:0;;;12346:21:1;12403:2;12383:18;;;12376:30;12442:29;12422:18;;;12415:57;12489:18;;1761:46:0;12162:351:1;36416:742:0;36516:7;36538;36560;36582;36604;36626;36676:23;36714:12;36741:18;36773:20;36785:7;36773:11;:20::i;:::-;36661:132;;;;;;36805:15;36822:23;36847:12;36863:113;36889:7;36911:4;36930:10;36955;:8;:10::i;:::-;36863:11;:113::i;:::-;36804:172;;;;-1:-1:-1;36804:172:0;;-1:-1:-1;37080:15:0;;-1:-1:-1;37110:4:0;;-1:-1:-1;37129:10:0;;-1:-1:-1;36416:742:0;;-1:-1:-1;;;;;36416:742:0:o;24144:179::-;-1:-1:-1;;;;;24227:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;24227:39:0;;;;;;;24277:38;24227:31;:39;24277:25;:38::i;30173:1628::-;19798:16;:23;;-1:-1:-1;;;;19798:23:0;-1:-1:-1;;;19798:23:0;;;;30250:24:::1;30268:4;30250:9;:24::i;:::-;30224:50;;30285:12;30308:25:::0;30377:22:::1;;30361:13;;30336:22;;:38;;;;:::i;:::-;:63;;;;:::i;:::-;30308:91:::0;-1:-1:-1;30413:22:0;;;:46:::1;;-1:-1:-1::0;30439:20:0;;30413:46:::1;30410:60;;;30462:7;;;;;30410:60;30482:26;30576:1;30555:17;30530:22;;30512:15;:40;;;;:::i;:::-;:60;;;;:::i;:::-;30511:66;;;;:::i;:::-;30482:95;;30588:26;30617:58;30661:13;;30617:39;30637:18;30617:15;:19;;:39;;;;:::i;:::-;:43:::0;::::1;:58::i;:::-;30588:87:::0;-1:-1:-1;30716:21:0::1;30750:36;30588:87:::0;30750:16:::1;:36::i;:::-;30799:18;30820:44;:21;30846:17:::0;30820:25:::1;:44::i;:::-;30799:65;;30877:23;30903:61;30946:17;30903:38;30918:22;;30903:10;:14;;:38;;;;:::i;:::-;:42:::0;::::1;:61::i;:::-;30877:87:::0;-1:-1:-1;30977:23:0::1;31003:28;30877:87:::0;31003:10;:28:::1;:::i;:::-;30977:54;;31096:19;31118:10;:8;:10::i;:::-;31096:32;;31139:15;31157:30;31175:11;31157:13;;:17;;:30;;;;:::i;:::-;31248:13;::::0;-1:-1:-1;;;;;31248:13:0::1;31232:31;::::0;;;:7:::1;:31;::::0;;;;;31139:48;;-1:-1:-1;31232:44:0::1;::::0;31139:48;31232:35:::1;:44::i;:::-;31214:13;::::0;;-1:-1:-1;;;;;31214:13:0;;::::1;31198:31;::::0;;;:7:::1;:31;::::0;;;;;;;:78;;;;31357:13;;31337;;;;::::1;31321:31:::0;;:7:::1;:31:::0;;;;;;;;:50:::1;::::0;:35:::1;:50::i;:::-;31303:13;::::0;-1:-1:-1;;;;;31303:13:0::1;31287:31;::::0;;;:7:::1;:31;::::0;;;;;;:84;;;;31384:22:::1;:26:::0;;;31421:17;;;;31449:22:::1;:26:::0;31491:22;;;;;:45:::1;;;31535:1;31517:15;:19;31491:45;31488:216;;;31552:49;31565:18;31585:15;31552:12;:49::i;:::-;31621:71;::::0;;13115:25:1;;;13171:2;13156:18;;13149:34;;;13199:18;;;13192:34;;;31621:71:0::1;::::0;13103:2:1;13088:18;31621:71:0::1;;;;;;;31488:216;31737:16;::::0;31729:64:::1;::::0;-1:-1:-1;;;;;31737:16:0;;::::1;::::0;31767:21:::1;::::0;31729:64:::1;::::0;;;31767:21;31737:16;31729:64:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;19832:1:0::1;19844:16:::0;:24;;-1:-1:-1;;;;19844:24:0;;;30173:1628::o;40214:235::-;40261:7;;:12;:34;;;;-1:-1:-1;40277:13:0;;:18;40261:34;40257:47;;;40214:235::o;40257:47::-;40334:7;;;40316:15;:25;40376:13;;;40352:21;:37;-1:-1:-1;40402:11:0;;;;40424:17;40214:235::o;31809:178::-;-1:-1:-1;;;;;31942:19:0;;;;;;;:11;:19;;;;;;;;:27;;;;;;;;;;;:37;;31973:6;;31942:19;:37;;31973:6;;31942:37;:::i;:::-;;;;-1:-1:-1;;;;;31809:178:0:o;32851:604::-;-1:-1:-1;;;;;32985:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;33009:22:0;;;;;;:11;:22;;;;;;;;33008:23;32985:46;32981:467;;;33048:48;33070:6;33078:9;33089:6;33048:21;:48::i;:::-;32851:604;;;:::o;32981:467::-;-1:-1:-1;;;;;33119:19:0;;;;;;:11;:19;;;;;;;;33118:20;:46;;;;-1:-1:-1;;;;;;33142:22:0;;;;;;:11;:22;;;;;;;;33118:46;33114:334;;;33181:46;33201:6;33209:9;33220:6;33181:19;:46::i;33114:334::-;-1:-1:-1;;;;;33249:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;33272:22:0;;;;;;:11;:22;;;;;;;;33249:45;33245:203;;;33311:48;33333:6;33341:9;33352:6;33311:21;:48::i;33245:203::-;33392:44;33410:6;33418:9;33429:6;33392:17;:44::i;38320:605::-;38418:7;;38371;;;;17546:14;38371:7;38472:338;38496:9;:16;38492:20;;38472:338;;;38580:7;38556;:21;38564:9;38574:1;38564:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;38564:12:0;38556:21;;;;;;;;;;;;;:31;;:83;;;38632:7;38608;:21;38616:9;38626:1;38616:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;38616:12:0;38608:21;;;;;;;;;;;;;:31;38556:83;38534:146;;;-1:-1:-1;;38663:7:0;;;17546:14;;-1:-1:-1;38320:605:0;-1:-1:-1;;38320:605:0:o;38534:146::-;38705:34;38717:7;:21;38725:9;38735:1;38725:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;38725:12:0;38717:21;;;;;;;;;;;;;38705:7;;:11;:34::i;:::-;38695:44;;38764:34;38776:7;:21;38784:9;38794:1;38784:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;38784:12:0;38776:21;;;;;;;;;;;;;38764:7;;:11;:34::i;:::-;38754:44;-1:-1:-1;38514:3:0;;;;:::i;:::-;;;;38472:338;;;-1:-1:-1;38834:7:0;;:20;;17546:14;38834:11;:20::i;:::-;38824:7;:30;38820:61;;;-1:-1:-1;;38864:7:0;;;17546:14;;-1:-1:-1;38320:605:0;-1:-1:-1;38320:605:0:o;38820:61::-;38900:7;;38909;;-1:-1:-1;38320:605:0;-1:-1:-1;38320:605:0:o;2620:312::-;2740:7;2775:12;2768:5;2760:28;;;;-1:-1:-1;;;2760:28:0;;;;;;;;:::i;:::-;-1:-1:-1;2799:9:0;2811:5;2815:1;2811;:5;:::i;37166:412::-;37267:7;37289;37311;37346:12;37361:24;37377:7;37361:15;:24::i;:::-;37346:39;;37396:18;37417:30;37439:7;37417:21;:30::i;:::-;37396:51;-1:-1:-1;37458:23:0;37484:33;37396:51;37484:17;:7;37496:4;37484:11;:17::i;:33::-;37458:59;37553:4;;-1:-1:-1;37559:10:0;;-1:-1:-1;37166:412:0;;-1:-1:-1;;;37166:412:0:o;37586:554::-;37785:7;;;;37882:24;:7;37894:11;37882;:24::i;:::-;37864:42;-1:-1:-1;37917:12:0;37932:21;:4;37941:11;37932:8;:21::i;:::-;37917:36;-1:-1:-1;37964:18:0;37985:27;:10;38000:11;37985:14;:27::i;:::-;37964:48;-1:-1:-1;38023:23:0;38049:33;37964:48;38049:17;:7;38061:4;38049:11;:17::i;:33::-;38101:7;;;;-1:-1:-1;38127:4:0;;-1:-1:-1;37586:554:0;;-1:-1:-1;;;;;;;37586:554:0:o;1844:136::-;1902:7;1929:43;1933:1;1936;1929:43;;;;;;;;;;;;;;;;;:3;:43::i;31995:471::-;32085:16;;;32099:1;32085:16;;;;;;;;32061:21;;32085:16;;;;;;;;;;-1:-1:-1;32085:16:0;32061:40;;32130:4;32112;32117:1;32112:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32112:23:0;;;:7;;;;;;;;;;:23;;;;32156:15;;:22;;;-1:-1:-1;;;32156:22:0;;;;:15;;;;;:20;;:22;;;;;32112:7;;32156:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32146:4;32151:1;32146:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32146:32:0;;;:7;;;;;;;;;:32;32221:15;;32189:62;;32206:4;;32221:15;32239:11;32189:8;:62::i;:::-;32262:15;;:196;;-1:-1:-1;;;32262:196:0;;-1:-1:-1;;;;;32262:15:0;;;;:66;;:196;;32343:11;;32262:15;;32385:4;;32412;;32432:15;;32262:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32050:416;31995:471;:::o;2222:250::-;2280:7;2304:6;2300:47;;-1:-1:-1;2334:1:0;2327:8;;2300:47;2359:9;2371:5;2375:1;2371;:5;:::i;:::-;2359:17;-1:-1:-1;2404:1:0;2395:5;2399:1;2359:17;2395:5;:::i;:::-;:10;2387:56;;;;-1:-1:-1;;;2387:56:0;;15294:2:1;2387:56:0;;;15276:21:1;15333:2;15313:18;;;15306:30;15372:34;15352:18;;;15345:62;-1:-1:-1;;;15423:18:1;;;15416:31;15464:19;;2387:56:0;15092:397:1;32474:369:0;32587:15;;32555:62;;32572:4;;-1:-1:-1;;;;;32587:15:0;32605:11;32555:8;:62::i;:::-;32628:15;;32778:16;;32628:207;;-1:-1:-1;;;32628:207:0;;32700:4;32628:207;;;15843:34:1;15893:18;;;15886:34;;;32628:15:0;15936:18:1;;;15929:34;;;15979:18;;;15972:34;-1:-1:-1;;;;;32778:16:0;;;16022:19:1;;;16015:44;32809:15:0;16075:19:1;;;16068:35;32628:15:0;;;:31;;32667:9;;15777:19:1;;32628:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34802:686::-;34953:15;34983:23;35021:12;35048:23;35086:12;35113:18;35145:19;35156:7;35145:10;:19::i;:::-;-1:-1:-1;;;;;35193:15:0;;;;;;:7;:15;;;;;;34938:226;;-1:-1:-1;34938:226:0;;-1:-1:-1;34938:226:0;;-1:-1:-1;34938:226:0;-1:-1:-1;34938:226:0;-1:-1:-1;34938:226:0;-1:-1:-1;35193:28:0;;35213:7;35193:19;:28::i;:::-;-1:-1:-1;;;;;35175:15:0;;;;;;:7;:15;;;;;;;;:46;;;;35250:7;:15;;;;:28;;35270:7;35250:19;:28::i;:::-;-1:-1:-1;;;;;35232:15:0;;;;;;;:7;:15;;;;;;:46;;;;35310:18;;;;;;;:39;;35333:15;35310:22;:39::i;:::-;-1:-1:-1;;;;;35289:18:0;;;;;;:7;:18;;;;;:60;35360:26;35375:10;35360:14;:26::i;:::-;35397:23;35409:4;35415;35397:11;:23::i;:::-;35453:9;-1:-1:-1;;;;;35436:44:0;35445:6;-1:-1:-1;;;;;35436:44:0;;35464:15;35436:44;;;;762:25:1;;750:2;735:18;;616:177;35436:44:0;;;;;;;;34927:561;;;;;;34802:686;;;:::o;34096:698::-;34245:15;34275:23;34313:12;34340:23;34378:12;34405:18;34437:19;34448:7;34437:10;:19::i;:::-;-1:-1:-1;;;;;34485:15:0;;;;;;:7;:15;;;;;;34230:226;;-1:-1:-1;34230:226:0;;-1:-1:-1;34230:226:0;;-1:-1:-1;34230:226:0;-1:-1:-1;34230:226:0;-1:-1:-1;34230:226:0;-1:-1:-1;34485:28:0;;34230:226;34485:19;:28::i;:::-;-1:-1:-1;;;;;34467:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;34545:18;;;;;:7;:18;;;;;:39;;34568:15;34545:22;:39::i;:::-;-1:-1:-1;;;;;34524:18:0;;;;;;:7;:18;;;;;;;;:60;;;;34616:7;:18;;;;:39;;34639:15;34616:22;:39::i;35496:757::-;35647:15;35677:23;35715:12;35742:23;35780:12;35807:18;35839:19;35850:7;35839:10;:19::i;:::-;-1:-1:-1;;;;;35887:15:0;;;;;;:7;:15;;;;;;35632:226;;-1:-1:-1;35632:226:0;;-1:-1:-1;35632:226:0;;-1:-1:-1;35632:226:0;-1:-1:-1;35632:226:0;-1:-1:-1;35632:226:0;-1:-1:-1;35887:28:0;;35907:7;35887:19;:28::i;:::-;-1:-1:-1;;;;;35869:15:0;;;;;;:7;:15;;;;;;;;:46;;;;35944:7;:15;;;;:28;;35964:7;35944:19;:28::i;33463:625::-;33610:15;33640:23;33678:12;33705:23;33743:12;33770:18;33802:19;33813:7;33802:10;:19::i;:::-;-1:-1:-1;;;;;33850:15:0;;;;;;:7;:15;;;;;;33595:226;;-1:-1:-1;33595:226:0;;-1:-1:-1;33595:226:0;;-1:-1:-1;33595:226:0;-1:-1:-1;33595:226:0;-1:-1:-1;33595:226:0;-1:-1:-1;33850:28:0;;33595:226;33850:19;:28::i;39894:130::-;39958:7;39985:31;40010:5;39985:20;39997:7;;39985;:11;;:20;;;;:::i;40032:174::-;40129:7;40161:37;40192:5;40161:26;40173:13;;40161:7;:11;;:26;;;;:::i;38933:953::-;17853:1;38999:15;;:22;38996:578;;;39095:13;;39076:16;;39063:29;;:10;:29;:::i;:::-;:45;;;;:::i;:::-;39037:22;;:71;;;;;;;:::i;:::-;;;;-1:-1:-1;;39169:13:0;;39153;;39140:26;;:10;:26;:::i;:::-;:42;;;;:::i;:::-;39123:13;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;39255:13:0;;39236:16;;39223:29;;:10;:29;:::i;:::-;:45;;;;:::i;:::-;39197:22;;:71;;;;;;;:::i;:::-;;;;-1:-1:-1;38996:578:0;;-1:-1:-1;38996:578:0;;17893:1;39289:15;;:23;39286:288;;;39387:13;;39367:17;;39354:30;;:10;:30;:::i;:::-;:46;;;;:::i;:::-;39328:22;;:72;;;;;;;:::i;:::-;;;;-1:-1:-1;;39462:13:0;;39445:14;;39432:27;;:10;:27;:::i;:::-;:43;;;;:::i;:::-;39415:13;;:60;;;;;;;:::i;:::-;;;;-1:-1:-1;;39549:13:0;;39529:17;;39516:30;;:10;:30;:::i;:::-;:46;;;;:::i;:::-;39490:22;;:72;;;;;;;:::i;:::-;;;;-1:-1:-1;;39286:288:0;39594:19;39616:10;:8;:10::i;:::-;39594:32;-1:-1:-1;39637:18:0;39658:27;:10;39594:32;39658:14;:27::i;:::-;39737:4;39721:22;;;;:7;:22;;;;;;39637:48;;-1:-1:-1;39721:38:0;;39637:48;39721:26;:38::i;:::-;39712:4;39696:22;;;;:7;:22;;;;;;;;:63;;;;39774:11;:26;;;;;;39770:108;;;39856:4;39840:22;;;;:7;:22;;;;;;:38;;39867:10;39840:26;:38::i;:::-;39831:4;39815:22;;;;:7;:22;;;;;:63;38985:901;;38933:953;:::o;36261:147::-;36339:7;;:17;;36351:4;36339:11;:17::i;:::-;36329:7;:27;36380:10;;:20;;36395:4;36380:14;:20::i;:::-;36367:10;:33;-1:-1:-1;;36261:147:0:o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;798:131::-;-1:-1:-1;;;;;873:31:1;;863:42;;853:70;;919:1;916;909:12;853:70;798:131;:::o;934:315::-;1002:6;1010;1063:2;1051:9;1042:7;1038:23;1034:32;1031:52;;;1079:1;1076;1069:12;1031:52;1118:9;1105:23;1137:31;1162:5;1137:31;:::i;:::-;1187:5;1239:2;1224:18;;;;1211:32;;-1:-1:-1;;;934:315:1:o;1446:247::-;1505:6;1558:2;1546:9;1537:7;1533:23;1529:32;1526:52;;;1574:1;1571;1564:12;1526:52;1613:9;1600:23;1632:31;1657:5;1632:31;:::i;1933:456::-;2010:6;2018;2026;2079:2;2067:9;2058:7;2054:23;2050:32;2047:52;;;2095:1;2092;2085:12;2047:52;2134:9;2121:23;2153:31;2178:5;2153:31;:::i;:::-;2203:5;-1:-1:-1;2260:2:1;2245:18;;2232:32;2273:33;2232:32;2273:33;:::i;:::-;1933:456;;2325:7;;-1:-1:-1;;;2379:2:1;2364:18;;;;2351:32;;1933:456::o;2394:180::-;2453:6;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;-1:-1:-1;2545:23:1;;2394:180;-1:-1:-1;2394:180:1:o;2992:118::-;3078:5;3071:13;3064:21;3057:5;3054:32;3044:60;;3100:1;3097;3090:12;3115:309;3180:6;3188;3241:2;3229:9;3220:7;3216:23;3212:32;3209:52;;;3257:1;3254;3247:12;3209:52;3293:9;3280:23;3270:33;;3353:2;3342:9;3338:18;3325:32;3366:28;3388:5;3366:28;:::i;:::-;3413:5;3403:15;;;3115:309;;;;;:::o;3637:382::-;3702:6;3710;3763:2;3751:9;3742:7;3738:23;3734:32;3731:52;;;3779:1;3776;3769:12;3731:52;3818:9;3805:23;3837:31;3862:5;3837:31;:::i;:::-;3887:5;-1:-1:-1;3944:2:1;3929:18;;3916:32;3957:30;3916:32;3957:30;:::i;4024:388::-;4092:6;4100;4153:2;4141:9;4132:7;4128:23;4124:32;4121:52;;;4169:1;4166;4159:12;4121:52;4208:9;4195:23;4227:31;4252:5;4227:31;:::i;:::-;4277:5;-1:-1:-1;4334:2:1;4319:18;;4306:32;4347:33;4306:32;4347:33;:::i;4417:385::-;4503:6;4511;4519;4527;4580:3;4568:9;4559:7;4555:23;4551:33;4548:53;;;4597:1;4594;4587:12;4548:53;-1:-1:-1;;4620:23:1;;;4690:2;4675:18;;4662:32;;-1:-1:-1;4741:2:1;4726:18;;4713:32;;4792:2;4777:18;4764:32;;-1:-1:-1;4417:385:1;-1:-1:-1;4417:385:1:o;5578:356::-;5780:2;5762:21;;;5799:18;;;5792:30;5858:34;5853:2;5838:18;;5831:62;5925:2;5910:18;;5578:356::o;6365:127::-;6426:10;6421:3;6417:20;6414:1;6407:31;6457:4;6454:1;6447:15;6481:4;6478:1;6471:15;6497:128;6537:3;6568:1;6564:6;6561:1;6558:13;6555:39;;;6574:18;;:::i;:::-;-1:-1:-1;6610:9:1;;6497:128::o;11782:245::-;11849:6;11902:2;11890:9;11881:7;11877:23;11873:32;11870:52;;;11918:1;11915;11908:12;11870:52;11950:9;11944:16;11969:28;11991:5;11969:28;:::i;12032:125::-;12072:4;12100:1;12097;12094:8;12091:34;;;12105:18;;:::i;:::-;-1:-1:-1;12142:9:1;;12032:125::o;12518:168::-;12558:7;12624:1;12620;12616:6;12612:14;12609:1;12606:21;12601:1;12594:9;12587:17;12583:45;12580:71;;;12631:18;;:::i;:::-;-1:-1:-1;12671:9:1;;12518:168::o;12691:217::-;12731:1;12757;12747:132;;12801:10;12796:3;12792:20;12789:1;12782:31;12836:4;12833:1;12826:15;12864:4;12861:1;12854:15;12747:132;-1:-1:-1;12893:9:1;;12691:217::o;13447:127::-;13508:10;13503:3;13499:20;13496:1;13489:31;13539:4;13536:1;13529:15;13563:4;13560:1;13553:15;13579:135;13618:3;-1:-1:-1;;13639:17:1;;13636:43;;;13659:18;;:::i;:::-;-1:-1:-1;13706:1:1;13695:13;;13579:135::o;13851:251::-;13921:6;13974:2;13962:9;13953:7;13949:23;13945:32;13942:52;;;13990:1;13987;13980:12;13942:52;14022:9;14016:16;14041:31;14066:5;14041:31;:::i;14107:980::-;14369:4;14417:3;14406:9;14402:19;14448:6;14437:9;14430:25;14474:2;14512:6;14507:2;14496:9;14492:18;14485:34;14555:3;14550:2;14539:9;14535:18;14528:31;14579:6;14614;14608:13;14645:6;14637;14630:22;14683:3;14672:9;14668:19;14661:26;;14722:2;14714:6;14710:15;14696:29;;14743:1;14753:195;14767:6;14764:1;14761:13;14753:195;;;14832:13;;-1:-1:-1;;;;;14828:39:1;14816:52;;14923:15;;;;14888:12;;;;14864:1;14782:9;14753:195;;;-1:-1:-1;;;;;;;15004:32:1;;;;14999:2;14984:18;;14977:60;-1:-1:-1;;;15068:3:1;15053:19;15046:35;14965:3;14107:980;-1:-1:-1;;;14107:980:1:o;16114:306::-;16202:6;16210;16218;16271:2;16259:9;16250:7;16246:23;16242:32;16239:52;;;16287:1;16284;16277:12;16239:52;16316:9;16310:16;16300:26;;16366:2;16355:9;16351:18;16345:25;16335:35;;16410:2;16399:9;16395:18;16389:25;16379:35;;16114:306;;;;;:::o

Swarm Source

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