ETH Price: $3,147.33 (+0.90%)
Gas: 3 Gwei

Token

Vacuum Coin (VC)
 

Overview

Max Total Supply

2,997,924,580 VC

Holders

5,611

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
222.852431581 VC

Value
$0.00
0xFA66445C5b9c10EC31012C016A416868391A60F0
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:
VacuumCoin

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-29
*/

// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.10;

interface IBEP20 {
    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 {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return 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;
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

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

    function initialize(address, address) external;
}

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

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

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

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

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


contract VacuumCoin is Context, IBEP20, Ownable {
    using SafeMath for uint256;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isExcluded;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) public _isExcludedFromAutoLiquidity;

    address[] private _excluded;
    address public _marketingWallet = 0xAC384287797DD6698461C6a178cAEfd723eaa645;

    string private constant _name     = "Vacuum Coin";
    string private constant _symbol   = "VC";
    uint8 private constant _decimals = 9;

    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 2997924580 * 10 ** _decimals;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    uint256 public taxFee = 1;
    uint256 public liquidityFee = 2;
    uint256 public percentageOfLiquidityForMarketing = 100;
    uint256 public maxWalletToken = _tTotal * 2 / 100;
    uint256 public maxTxAmount     = _tTotal / 100;
    uint256 private _minTokenBalance = _tTotal * 5 / 1000;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;
    bool _inSwapAndLiquify;
    IUniswapV2Router02 public _uniswapV2Router;
    address            public _uniswapV2Pair;
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 bnbReceived,
        uint256 tokensIntoLiqudity
    );
    event MarketingFeeSent(address to, uint256 bnbSent);

    modifier lockTheSwap {
        _inSwapAndLiquify = true;
        _;
        _inSwapAndLiquify = false;
    }

    constructor () {
        _rOwned[msg.sender] = _rTotal;

        // uniswap
        IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _uniswapV2Router = uniswapV2Router;
        _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
            .createPair(address(this), uniswapV2Router.WETH());

        // exclude system contracts
        _isExcludedFromFee[msg.sender] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_marketingWallet] = true;

        _isExcludedFromAutoLiquidity[_uniswapV2Pair]            = true;
        _isExcludedFromAutoLiquidity[address(_uniswapV2Router)] = true;

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

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

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

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

    function totalSupply() public 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) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public 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) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "BEP20: transfer amount exceeds allowance"));
        return true;
    }

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

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

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

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

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        (, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        uint256 currentRate = _getRate();

        if (!deductTransferFee) {
            (uint256 rAmount,,) = _getRValues(tAmount, tFee, tLiquidity, currentRate);
            return rAmount;

        } else {
            (, uint256 rTransferAmount,) = _getRValues(tAmount, tFee, tLiquidity, currentRate);
            return rTransferAmount;
        }
    }

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

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        require(!tradingActive, "Trading is already enabled");
        tradingActive = true;
        swapEnabled = true;
    }

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

    function excludeFromReward(address account) external onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");

        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner {
        require(_isExcluded[account], "Account is already excluded");

        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function setMarketingWallet(address marketingWallet) external onlyOwner {
        _marketingWallet = marketingWallet;
    }
    
    function setMinimumTokenBalance (uint256 minimumToken) external onlyOwner {
        _minTokenBalance = minimumToken;
    }
    function setExcludedFromFee(address account, bool e) external onlyOwner {
        _isExcludedFromFee[account] = e;
    }

    function setTaxFeePercent(uint256 amount) external onlyOwner {
        require(amount <= 4, "Holder Reflection cannot exceed 4%");
        taxFee = amount;
    }

    function setLiquidityFeePercent(uint256 amount) external onlyOwner {
        require(amount <= 6, "Liquidity Fee cannot exceed 6%");
        liquidityFee = amount;
    }

    function setPercentageOfLiquidityForMarketing(uint256 marketingFee) external onlyOwner {
        require(marketingFee <= 100, "Percent cannot exceed 100%");
        percentageOfLiquidityForMarketing = marketingFee;
    }

    function setMaxWalletTokens(uint256 amount) external onlyOwner {
        require(amount >= _tTotal / 100, "Cannot set maxTransactionAmount lower than 1%");
  	    maxWalletToken = amount ;
  	}

    function setMaxTxAmount(uint256 amount) external onlyOwner {
        require(amount >= _tTotal * 5 / 1000, "Cannot set maxTransactionAmount lower than 0.5%");
        maxTxAmount = amount;
    }

    function setSwapAndLiquifyEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
        emit SwapAndLiquifyEnabledUpdated(enabled);
    }

    receive() external payable {}

    function setUniswapRouter(address r) external onlyOwner {
        IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(r);
        _uniswapV2Router = uniswapV2Router;
    }

    function setUniswapPair(address p) external onlyOwner {
        _uniswapV2Pair = p;
    }

    function setExcludedFromAutoLiquidity(address a, bool b) external onlyOwner {
        _isExcludedFromAutoLiquidity[a] = b;
    }

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

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee       = calculateFee(tAmount, taxFee);
        uint256 tLiquidity = calculateFee(tAmount, liquidityFee);
        uint256 tTransferAmount = tAmount.sub(tFee);
        tTransferAmount = tTransferAmount.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);
        rTransferAmount = rTransferAmount.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 takeTransactionFee(address to, uint256 tAmount, uint256 currentRate) private {
        if (tAmount <= 0) { return; }

        uint256 rAmount = tAmount.mul(currentRate);
        _rOwned[to] = _rOwned[to].add(rAmount);
        if (_isExcluded[to]) {
            _tOwned[to] = _tOwned[to].add(tAmount);
        }
    }

    function calculateFee(uint256 amount, uint256 fee) private pure returns (uint256) {
        return amount.mul(fee).div(100);
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

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

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

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

        uint256 contractTokenBalance = balanceOf(address(this));

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

            if (from != owner() && to != owner()) {
                require(amount <= maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
            }

            /*
                - swapAndLiquify will be initiated when token balance of this contract
                has accumulated enough over the minimum number of tokens required.
                - don't get caught in a circular liquidity event.
                - don't swapAndLiquify if sender is uniswap pair.
            */

            if (contractTokenBalance >= maxTxAmount) {
                contractTokenBalance = maxTxAmount;
            }
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                to != _uniswapV2Pair
            ) {

                uint256 contractBalanceRecepient = balanceOf(to);
                require(
                    contractBalanceRecepient + amount <= maxWalletToken,
                    "Exceeds maximum wallet token amount."
                );

            }
        }

        bool isOverMinTokenBalance = contractTokenBalance >= _minTokenBalance;
        if (
            isOverMinTokenBalance &&
            !_inSwapAndLiquify &&
            !_isExcludedFromAutoLiquidity[from] &&
            swapEnabled
        ) {
            // contractTokenBalance = _minTokenBalance;
            swapAndLiquify(contractTokenBalance);
        }


        bool takeFee = true;
        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }
        _tokenTransfer(from, to, amount, takeFee);
    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        uint256 liqTokens = contractTokenBalance.mul(100 - percentageOfLiquidityForMarketing).div(200);
        uint256 swapTokens = contractTokenBalance.sub(liqTokens);

        uint256 initialBalance = address(this).balance;

        // swap tokens for BNB
        swapTokensForBnb(swapTokens);

        // this is the amount of BNB that we just swapped into
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // take marketing fee
        uint256 bnbForLiquidity = newBalance.mul(100 - percentageOfLiquidityForMarketing).div(100);
        uint256 marketingFee = newBalance.sub(bnbForLiquidity);
        if (marketingFee > 0) {
            payable(_marketingWallet).transfer(marketingFee);
            emit MarketingFeeSent(_marketingWallet, marketingFee);
        }

        if (liqTokens > 0) {
            addLiquidity(liqTokens, bnbForLiquidity);
        }

        emit SwapAndLiquify(swapTokens, bnbForLiquidity, liqTokens);
    }
    function swapTokensForBnb(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapV2Router.WETH();

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

        // make the swap
        _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of BNB
            path,
            address(this),
            block.timestamp
        );
    }
    function addLiquidity(uint256 tokenAmount, uint256 bnbAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(_uniswapV2Router), tokenAmount);

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

    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        uint256 previousTaxFee       = taxFee;
        uint256 previousLiquidityFee = liquidityFee;

        if (!takeFee) {
            taxFee       = 0;
            liquidityFee = 0;
        }

        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]) {
            _transferStandard(sender, recipient, amount);

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

        } else {
            _transferStandard(sender, recipient, amount);
        }

        if (!takeFee) {
            taxFee       = previousTaxFee;
            liquidityFee = previousLiquidityFee;
        }
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        uint256 currentRate = _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, currentRate);

        _rOwned[sender]    = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        takeTransactionFee(address(this), tLiquidity, currentRate);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        uint256 currentRate = _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, currentRate);

        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        takeTransactionFee(address(this), tLiquidity, currentRate);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        uint256 currentRate = _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, currentRate);

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        takeTransactionFee(address(this), tLiquidity, currentRate);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        uint256 currentRate = _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, currentRate);

        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        takeTransactionFee(address(this), tLiquidity, currentRate);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

}

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":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"bnbSent","type":"uint256"}],"name":"MarketingFeeSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromAutoLiquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletToken","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":[],"name":"percentageOfLiquidityForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"},{"internalType":"bool","name":"b","type":"bool"}],"name":"setExcludedFromAutoLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"e","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minimumToken","type":"uint256"}],"name":"setMinimumTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"}],"name":"setPercentageOfLiquidityForMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"p","type":"address"}],"name":"setUniswapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"r","type":"address"}],"name":"setUniswapRouter","outputs":[],"stateMutability":"nonpayable","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":[],"name":"taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"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"},{"stateMutability":"payable","type":"receive"}]

6080604052600880546001600160a01b03191673ac384287797dd6698461c6a178caefd723eaa645179055620000386009600a62000539565b620000489063b2b0b2e462000551565b620000569060001962000581565b620000649060001962000598565b6009556001600b556002600c556064600d5560646009600a62000088919062000539565b620000989063b2b0b2e462000551565b620000a590600262000551565b620000b19190620005ae565b600e556064620000c46009600a62000539565b620000d49063b2b0b2e462000551565b620000e09190620005ae565b600f556103e8620000f46009600a62000539565b620001049063b2b0b2e462000551565b6200011190600562000551565b6200011d9190620005ae565b6010556011805462ffffff191660011790553480156200013c57600080fd5b506200014833620003d4565b600954336000908152600160209081526040918290209290925560118054600160201b600160c01b031916777a250d5630b4cf539739df2c5dacb4c659f2488d00000000179055805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a015592600480830193928290030181865afa158015620001dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002029190620005c5565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000250573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002769190620005c5565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ea9190620005c5565b601280546001600160a01b0319166001600160a01b03928316178155336000818152600360209081526040808320805460ff199081166001908117909255308552828520805482168317905560085488168552828520805482168317905595548716845260069092528083208054861683179055601154640100000000900490951682529381208054909316909317909155907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620003ac6009600a62000539565b620003bc9063b2b0b2e462000551565b60405190815260200160405180910390a350620005f0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200047b5781600019048211156200045f576200045f62000424565b808516156200046d57918102915b93841c93908002906200043f565b509250929050565b600082620004945750600162000533565b81620004a35750600062000533565b8160018114620004bc5760028114620004c757620004e7565b600191505062000533565b60ff841115620004db57620004db62000424565b50506001821b62000533565b5060208310610133831016604e8410600b84101617156200050c575081810a62000533565b6200051883836200043a565b80600019048211156200052f576200052f62000424565b0290505b92915050565b60006200054a60ff84168362000483565b9392505050565b808202811582820484141762000533576200053362000424565b634e487b7160e01b600052601260045260246000fd5b6000826200059357620005936200056b565b500690565b8181038181111562000533576200053362000424565b600082620005c057620005c06200056b565b500490565b600060208284031215620005d857600080fd5b81516001600160a01b03811681146200054a57600080fd5b612c4880620006006000396000f3fe60806040526004361061028c5760003560e01c8063715018a61161015a578063a457c2d7116100c1578063c49b9a801161007a578063c49b9a80146107fb578063d5aed6bf1461081b578063dd62ed3e1461083b578063e6c75f7114610881578063ec28438a14610897578063f2fde38b146108b757600080fd5b8063a457c2d71461072c578063a49d95511461074c578063a9059cbb1461076c578063baa043981461078c578063bbc0c742146107bc578063bea9849e146107db57600080fd5b80638ee88c53116101135780638ee88c531461067557806395d89b4114610695578063962dfc75146106c057806398118cb4146106e05780639c74daf0146106f6578063a071dcf41461071657600080fd5b8063715018a6146105c9578063751039fc146105de57806388f82020146105f35780638a8c523c1461062c5780638c0b5e22146106415780638da5cb5b1461065757600080fd5b806339509351116101fe578063583e0568116101b7578063583e0568146104e95780635d098b38146105295780635d83b454146105495780636612e66f146105695780636ddd17131461058957806370a08231146105a957600080fd5b806339509351146104205780634549b039146104405780634a62bb651461046057806352390c021461047a5780635342acb41461049a57806354e69eb3146104d357600080fd5b806318160ddd1161025057806318160ddd1461036f57806323b872dd146103845780632d838119146103a45780632ff9c145146103c4578063313ce567146103e45780633685d4191461040057600080fd5b8063061c82d01461029857806306fdde03146102ba578063095ea7b3146103005780630fec5dd01461033057806313114a9d1461035057600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102b86102b3366004612760565b6108d7565b005b3480156102c657600080fd5b5060408051808201909152600b81526a2b30b1babab69021b7b4b760a91b60208201525b6040516102f79190612779565b60405180910390f35b34801561030c57600080fd5b5061032061031b3660046127dc565b61096b565b60405190151581526020016102f7565b34801561033c57600080fd5b506102b861034b366004612760565b610982565b34801561035c57600080fd5b50600a545b6040519081526020016102f7565b34801561037b57600080fd5b50610361610a3c565b34801561039057600080fd5b5061032061039f366004612808565b610a5d565b3480156103b057600080fd5b506103616103bf366004612760565b610ac6565b3480156103d057600080fd5b506102b86103df366004612760565b610b4a565b3480156103f057600080fd5b50604051600981526020016102f7565b34801561040c57600080fd5b506102b861041b366004612849565b610b79565b34801561042c57600080fd5b5061032061043b3660046127dc565b610d2f565b34801561044c57600080fd5b5061036161045b36600461287b565b610d65565b34801561046c57600080fd5b506011546103209060ff1681565b34801561048657600080fd5b506102b8610495366004612849565b610e2b565b3480156104a657600080fd5b506103206104b5366004612849565b6001600160a01b031660009081526003602052604090205460ff1690565b3480156104df57600080fd5b50610361600d5481565b3480156104f557600080fd5b506011546105119064010000000090046001600160a01b031681565b6040516001600160a01b0390911681526020016102f7565b34801561053557600080fd5b506102b8610544366004612849565b610f7e565b34801561055557600080fd5b506102b86105643660046128a7565b610fca565b34801561057557600080fd5b506102b86105843660046128a7565b61101f565b34801561059557600080fd5b506011546103209062010000900460ff1681565b3480156105b557600080fd5b506103616105c4366004612849565b611074565b3480156105d557600080fd5b506102b86110d3565b3480156105ea57600080fd5b506102b8611109565b3480156105ff57600080fd5b5061032061060e366004612849565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561063857600080fd5b506102b861113f565b34801561064d57600080fd5b50610361600f5481565b34801561066357600080fd5b506000546001600160a01b0316610511565b34801561068157600080fd5b506102b8610690366004612760565b6111d4565b3480156106a157600080fd5b50604080518082019091526002815261564360f01b60208201526102ea565b3480156106cc57600080fd5b50600854610511906001600160a01b031681565b3480156106ec57600080fd5b50610361600c5481565b34801561070257600080fd5b50601254610511906001600160a01b031681565b34801561072257600080fd5b50610361600b5481565b34801561073857600080fd5b506103206107473660046127dc565b611254565b34801561075857600080fd5b506102b8610767366004612760565b6112a3565b34801561077857600080fd5b506103206107873660046127dc565b611323565b34801561079857600080fd5b506103206107a7366004612849565b60066020526000908152604090205460ff1681565b3480156107c857600080fd5b5060115461032090610100900460ff1681565b3480156107e757600080fd5b506102b86107f6366004612849565b611330565b34801561080757600080fd5b506102b86108163660046128d3565b611388565b34801561082757600080fd5b506102b8610836366004612849565b611408565b34801561084757600080fd5b506103616108563660046128ee565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b34801561088d57600080fd5b50610361600e5481565b3480156108a357600080fd5b506102b86108b2366004612760565b611454565b3480156108c357600080fd5b506102b86108d2366004612849565b61151c565b6000546001600160a01b0316331461090a5760405162461bcd60e51b815260040161090190612927565b60405180910390fd5b60048111156109665760405162461bcd60e51b815260206004820152602260248201527f486f6c646572205265666c656374696f6e2063616e6e6f742065786365656420604482015261342560f01b6064820152608401610901565b600b55565b60006109783384846115b7565b5060015b92915050565b6000546001600160a01b031633146109ac5760405162461bcd60e51b815260040161090190612927565b60646109ba6009600a612a56565b6109c89063b2b0b2e4612a65565b6109d29190612a7c565b811015610a375760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526c6c6f776572207468616e20312560981b6064820152608401610901565b600e55565b6000610a4a6009600a612a56565b610a589063b2b0b2e4612a65565b905090565b6000610a6a8484846116db565b610abc8433610ab785604051806060016040528060288152602001612bc6602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611b02565b6115b7565b5060019392505050565b6000600954821115610b2d5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610901565b6000610b37611b2e565b9050610b438382611b51565b9392505050565b6000546001600160a01b03163314610b745760405162461bcd60e51b815260040161090190612927565b601055565b6000546001600160a01b03163314610ba35760405162461bcd60e51b815260040161090190612927565b6001600160a01b03811660009081526004602052604090205460ff16610c0b5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610901565b60005b600754811015610d2b57816001600160a01b031660078281548110610c3557610c35612a9e565b6000918252602090912001546001600160a01b031603610d195760078054610c5f90600190612ab4565b81548110610c6f57610c6f612a9e565b600091825260209091200154600780546001600160a01b039092169183908110610c9b57610c9b612a9e565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600490925220805460ff191690556007805480610cf357610cf3612ac7565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610d2381612add565b915050610c0e565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610978918590610ab79086611b5d565b6000610d736009600a612a56565b610d819063b2b0b2e4612a65565b831115610dd05760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610901565b600080610ddc85611b69565b92509250506000610deb611b2e565b905084610e0f576000610e0087858585611bb3565b5090955061097c945050505050565b6000610e1d87858585611bb3565b50955061097c945050505050565b6000546001600160a01b03163314610e555760405162461bcd60e51b815260040161090190612927565b6001600160a01b03811660009081526004602052604090205460ff1615610ebe5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610901565b6001600160a01b03811660009081526001602052604090205415610f18576001600160a01b038116600090815260016020526040902054610efe90610ac6565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600460205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6000546001600160a01b03163314610fa85760405162461bcd60e51b815260040161090190612927565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610ff45760405162461bcd60e51b815260040161090190612927565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146110495760405162461bcd60e51b815260040161090190612927565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6001600160a01b03811660009081526004602052604081205460ff16156110b157506001600160a01b031660009081526002602052604090205490565b6001600160a01b03821660009081526001602052604090205461097c90610ac6565b6000546001600160a01b031633146110fd5760405162461bcd60e51b815260040161090190612927565b6111076000611c0b565b565b6000546001600160a01b031633146111335760405162461bcd60e51b815260040161090190612927565b6011805460ff19169055565b6000546001600160a01b031633146111695760405162461bcd60e51b815260040161090190612927565b601154610100900460ff16156111c15760405162461bcd60e51b815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c65640000000000006044820152606401610901565b6011805462ffff00191662010100179055565b6000546001600160a01b031633146111fe5760405162461bcd60e51b815260040161090190612927565b600681111561124f5760405162461bcd60e51b815260206004820152601e60248201527f4c6971756964697479204665652063616e6e6f742065786365656420362500006044820152606401610901565b600c55565b60006109783384610ab785604051806060016040528060258152602001612bee602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190611b02565b6000546001600160a01b031633146112cd5760405162461bcd60e51b815260040161090190612927565b606481111561131e5760405162461bcd60e51b815260206004820152601a60248201527f50657263656e742063616e6e6f742065786365656420313030250000000000006044820152606401610901565b600d55565b60006109783384846116db565b6000546001600160a01b0316331461135a5760405162461bcd60e51b815260040161090190612927565b601180546001600160a01b0390921664010000000002640100000000600160c01b0319909216919091179055565b6000546001600160a01b031633146113b25760405162461bcd60e51b815260040161090190612927565b60118054821515620100000262ff0000199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906113fd90831515815260200190565b60405180910390a150565b6000546001600160a01b031633146114325760405162461bcd60e51b815260040161090190612927565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461147e5760405162461bcd60e51b815260040161090190612927565b6103e861148d6009600a612a56565b61149b9063b2b0b2e4612a65565b6114a6906005612a65565b6114b09190612a7c565b8110156115175760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b6064820152608401610901565b600f55565b6000546001600160a01b031633146115465760405162461bcd60e51b815260040161090190612927565b6001600160a01b0381166115ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610901565b6115b481611c0b565b50565b6001600160a01b0383166116195760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610901565b6001600160a01b03821661167a5760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610901565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661173f5760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610901565b6001600160a01b0382166117a15760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610901565b600081116118035760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610901565b600061180e30611074565b60115490915060ff1615611a3e57601154610100900460ff166118af576001600160a01b03841660009081526003602052604090205460ff168061186a57506001600160a01b03831660009081526003602052604090205460ff165b6118af5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610901565b6000546001600160a01b038581169116148015906118db57506000546001600160a01b03848116911614155b1561194357600f548211156119435760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610901565b600f5481106119515750600f545b6000546001600160a01b0385811691161480159061197d57506000546001600160a01b03848116911614155b801561199157506001600160a01b03831615155b80156119a857506001600160a01b03831661dead14155b80156119c257506012546001600160a01b03848116911614155b15611a3e5760006119d284611074565b600e549091506119e28483612af6565b1115611a3c5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610901565b505b60105481108015908190611a5c57506011546301000000900460ff16155b8015611a8157506001600160a01b03851660009081526006602052604090205460ff16155b8015611a95575060115462010000900460ff165b15611aa357611aa382611c5b565b6001600160a01b03851660009081526003602052604090205460019060ff1680611ae557506001600160a01b03851660009081526003602052604090205460ff165b15611aee575060005b611afa86868684611dd7565b505050505050565b60008184841115611b265760405162461bcd60e51b81526004016109019190612779565b505050900390565b6000806000611b3b611f55565b9092509050611b4a8282611b51565b9250505090565b6000610b438284612a7c565b6000610b438284612af6565b600080600080611b7b85600b54612140565b90506000611b8b86600c54612140565b90506000611b998784612151565b9050611ba58183612151565b979296509094509092505050565b6000808080611bc2888661215d565b90506000611bd0888761215d565b90506000611bde888861215d565b90506000611bec8484612151565b9050611bf88183612151565b939b939a50919850919650505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6011805463ff00000019166301000000179055600d54600090611c979060c890611c9190611c8a906064612ab4565b859061215d565b90611b51565b90506000611ca58383612151565b905047611cb182612169565b6000611cbd4783612151565b90506000611cd86064611c91600d546064611c8a9190612ab4565b90506000611ce68383612151565b90508015611d70576008546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611d28573d6000803e3d6000fd5b50600854604080516001600160a01b039092168252602082018390527f1af6c280083a73c311541c1467fa5fed97da7b6fd18e594778af9bdb5793b5c4910160405180910390a15b8515611d8057611d8086836122e4565b60408051868152602081018490529081018790527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506011805463ff000000191690555050505050565b600b54600c5482611ded576000600b819055600c555b6001600160a01b03861660009081526004602052604090205460ff168015611e2e57506001600160a01b03851660009081526004602052604090205460ff16155b15611e4357611e3e8686866123a4565b611f41565b6001600160a01b03861660009081526004602052604090205460ff16158015611e8457506001600160a01b03851660009081526004602052604090205460ff165b15611e9457611e3e8686866124e5565b6001600160a01b03861660009081526004602052604090205460ff16158015611ed657506001600160a01b03851660009081526004602052604090205460ff16155b15611ee657611e3e8686866125a6565b6001600160a01b03861660009081526004602052604090205460ff168015611f2657506001600160a01b03851660009081526004602052604090205460ff165b15611f3657611e3e868686612602565b611f418686866125a6565b82611afa57600b91909155600c5550505050565b6000806000600954905060006009600a611f6f9190612a56565b611f7d9063b2b0b2e4612a65565b905060005b6007548110156120e057826001600060078481548110611fa457611fa4612a9e565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061200f5750816002600060078481548110611fe857611fe8612a9e565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561203e576009546009600a6120259190612a56565b6120339063b2b0b2e4612a65565b945094505050509091565b612084600160006007848154811061205857612058612a9e565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612151565b92506120cc60026000600784815481106120a0576120a0612a9e565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612151565b9150806120d881612add565b915050611f82565b506121076120f06009600a612a56565b6120fe9063b2b0b2e4612a65565b60095490611b51565b821015612137576009546009600a61211f9190612a56565b61212d9063b2b0b2e4612a65565b9350935050509091565b90939092509050565b6000610b436064611c91858561215d565b6000610b438284612ab4565b6000610b438284612a65565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061219e5761219e612a9e565b60200260200101906001600160a01b031690816001600160a01b031681525050601160049054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122359190612b09565b8160018151811061224857612248612a9e565b6001600160a01b039283166020918202929092010152601154612276913091640100000000900416846115b7565b60115460405163791ac94760e01b81526401000000009091046001600160a01b03169063791ac947906122b6908590600090869030904290600401612b26565b600060405180830381600087803b1580156122d057600080fd5b505af1158015611afa573d6000803e3d6000fd5b60115461230490309064010000000090046001600160a01b0316846115b7565b60115460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526401000000009091046001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015612378573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061239d9190612b97565b5050505050565b60008060006123b284611b69565b92509250925060006123c2611b2e565b905060008060006123d588878787611bb3565b6001600160a01b038d1660009081526002602052604090205492955090935091506124009089612151565b6001600160a01b038b1660009081526002602090815260408083209390935560019052205461242f9084612151565b6001600160a01b03808c1660009081526001602052604080822093909355908b168152205461245e9083611b5d565b6001600160a01b038a1660009081526001602052604090205561248230868661268d565b61248c818761273c565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040516124d191815260200190565b60405180910390a350505050505050505050565b60008060006124f384611b69565b9250925092506000612503611b2e565b9050600080600061251688878787611bb3565b6001600160a01b038d1660009081526001602052604090205492955090935091506125419084612151565b6001600160a01b03808c16600090815260016020908152604080832094909455918c168152600290915220546125779088611b5d565b6001600160a01b038a1660009081526002602090815260408083209390935560019052205461245e9083611b5d565b60008060006125b484611b69565b92509250925060006125c4611b2e565b905060008060006125d788878787611bb3565b6001600160a01b038d16600090815260016020526040902054929550909350915061242f9084612151565b600080600061261084611b69565b9250925092506000612620611b2e565b9050600080600061263388878787611bb3565b6001600160a01b038d16600090815260026020526040902054929550909350915061265e9089612151565b6001600160a01b038b166000908152600260209081526040808320939093556001905220546125419084612151565b6000821161269a57505050565b60006126a6838361215d565b6001600160a01b0385166000908152600160205260409020549091506126cc9082611b5d565b6001600160a01b03851660009081526001602090815260408083209390935560049052205460ff1615612736576001600160a01b03841660009081526002602052604090205461271c9084611b5d565b6001600160a01b0385166000908152600260205260409020555b50505050565b6009546127499083612151565b600955600a546127599082611b5d565b600a555050565b60006020828403121561277257600080fd5b5035919050565b600060208083528351808285015260005b818110156127a65785810183015185820160400152820161278a565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146115b457600080fd5b600080604083850312156127ef57600080fd5b82356127fa816127c7565b946020939093013593505050565b60008060006060848603121561281d57600080fd5b8335612828816127c7565b92506020840135612838816127c7565b929592945050506040919091013590565b60006020828403121561285b57600080fd5b8135610b43816127c7565b8035801515811461287657600080fd5b919050565b6000806040838503121561288e57600080fd5b8235915061289e60208401612866565b90509250929050565b600080604083850312156128ba57600080fd5b82356128c5816127c7565b915061289e60208401612866565b6000602082840312156128e557600080fd5b610b4382612866565b6000806040838503121561290157600080fd5b823561290c816127c7565b9150602083013561291c816127c7565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156129ad5781600019048211156129935761299361295c565b808516156129a057918102915b93841c9390800290612977565b509250929050565b6000826129c45750600161097c565b816129d15750600061097c565b81600181146129e757600281146129f157612a0d565b600191505061097c565b60ff841115612a0257612a0261295c565b50506001821b61097c565b5060208310610133831016604e8410600b8410161715612a30575081810a61097c565b612a3a8383612972565b8060001904821115612a4e57612a4e61295c565b029392505050565b6000610b4360ff8416836129b5565b808202811582820484141761097c5761097c61295c565b600082612a9957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b8181038181111561097c5761097c61295c565b634e487b7160e01b600052603160045260246000fd5b600060018201612aef57612aef61295c565b5060010190565b8082018082111561097c5761097c61295c565b600060208284031215612b1b57600080fd5b8151610b43816127c7565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612b765784516001600160a01b031683529383019391830191600101612b51565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612bac57600080fd5b835192506020840151915060408401519050925092509256fe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122000a4cf688b0d4f79e93e370855f33b5be7b0976cef564abd50fcc7cfd8003aec64736f6c63430008110033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c8063715018a61161015a578063a457c2d7116100c1578063c49b9a801161007a578063c49b9a80146107fb578063d5aed6bf1461081b578063dd62ed3e1461083b578063e6c75f7114610881578063ec28438a14610897578063f2fde38b146108b757600080fd5b8063a457c2d71461072c578063a49d95511461074c578063a9059cbb1461076c578063baa043981461078c578063bbc0c742146107bc578063bea9849e146107db57600080fd5b80638ee88c53116101135780638ee88c531461067557806395d89b4114610695578063962dfc75146106c057806398118cb4146106e05780639c74daf0146106f6578063a071dcf41461071657600080fd5b8063715018a6146105c9578063751039fc146105de57806388f82020146105f35780638a8c523c1461062c5780638c0b5e22146106415780638da5cb5b1461065757600080fd5b806339509351116101fe578063583e0568116101b7578063583e0568146104e95780635d098b38146105295780635d83b454146105495780636612e66f146105695780636ddd17131461058957806370a08231146105a957600080fd5b806339509351146104205780634549b039146104405780634a62bb651461046057806352390c021461047a5780635342acb41461049a57806354e69eb3146104d357600080fd5b806318160ddd1161025057806318160ddd1461036f57806323b872dd146103845780632d838119146103a45780632ff9c145146103c4578063313ce567146103e45780633685d4191461040057600080fd5b8063061c82d01461029857806306fdde03146102ba578063095ea7b3146103005780630fec5dd01461033057806313114a9d1461035057600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102b86102b3366004612760565b6108d7565b005b3480156102c657600080fd5b5060408051808201909152600b81526a2b30b1babab69021b7b4b760a91b60208201525b6040516102f79190612779565b60405180910390f35b34801561030c57600080fd5b5061032061031b3660046127dc565b61096b565b60405190151581526020016102f7565b34801561033c57600080fd5b506102b861034b366004612760565b610982565b34801561035c57600080fd5b50600a545b6040519081526020016102f7565b34801561037b57600080fd5b50610361610a3c565b34801561039057600080fd5b5061032061039f366004612808565b610a5d565b3480156103b057600080fd5b506103616103bf366004612760565b610ac6565b3480156103d057600080fd5b506102b86103df366004612760565b610b4a565b3480156103f057600080fd5b50604051600981526020016102f7565b34801561040c57600080fd5b506102b861041b366004612849565b610b79565b34801561042c57600080fd5b5061032061043b3660046127dc565b610d2f565b34801561044c57600080fd5b5061036161045b36600461287b565b610d65565b34801561046c57600080fd5b506011546103209060ff1681565b34801561048657600080fd5b506102b8610495366004612849565b610e2b565b3480156104a657600080fd5b506103206104b5366004612849565b6001600160a01b031660009081526003602052604090205460ff1690565b3480156104df57600080fd5b50610361600d5481565b3480156104f557600080fd5b506011546105119064010000000090046001600160a01b031681565b6040516001600160a01b0390911681526020016102f7565b34801561053557600080fd5b506102b8610544366004612849565b610f7e565b34801561055557600080fd5b506102b86105643660046128a7565b610fca565b34801561057557600080fd5b506102b86105843660046128a7565b61101f565b34801561059557600080fd5b506011546103209062010000900460ff1681565b3480156105b557600080fd5b506103616105c4366004612849565b611074565b3480156105d557600080fd5b506102b86110d3565b3480156105ea57600080fd5b506102b8611109565b3480156105ff57600080fd5b5061032061060e366004612849565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561063857600080fd5b506102b861113f565b34801561064d57600080fd5b50610361600f5481565b34801561066357600080fd5b506000546001600160a01b0316610511565b34801561068157600080fd5b506102b8610690366004612760565b6111d4565b3480156106a157600080fd5b50604080518082019091526002815261564360f01b60208201526102ea565b3480156106cc57600080fd5b50600854610511906001600160a01b031681565b3480156106ec57600080fd5b50610361600c5481565b34801561070257600080fd5b50601254610511906001600160a01b031681565b34801561072257600080fd5b50610361600b5481565b34801561073857600080fd5b506103206107473660046127dc565b611254565b34801561075857600080fd5b506102b8610767366004612760565b6112a3565b34801561077857600080fd5b506103206107873660046127dc565b611323565b34801561079857600080fd5b506103206107a7366004612849565b60066020526000908152604090205460ff1681565b3480156107c857600080fd5b5060115461032090610100900460ff1681565b3480156107e757600080fd5b506102b86107f6366004612849565b611330565b34801561080757600080fd5b506102b86108163660046128d3565b611388565b34801561082757600080fd5b506102b8610836366004612849565b611408565b34801561084757600080fd5b506103616108563660046128ee565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b34801561088d57600080fd5b50610361600e5481565b3480156108a357600080fd5b506102b86108b2366004612760565b611454565b3480156108c357600080fd5b506102b86108d2366004612849565b61151c565b6000546001600160a01b0316331461090a5760405162461bcd60e51b815260040161090190612927565b60405180910390fd5b60048111156109665760405162461bcd60e51b815260206004820152602260248201527f486f6c646572205265666c656374696f6e2063616e6e6f742065786365656420604482015261342560f01b6064820152608401610901565b600b55565b60006109783384846115b7565b5060015b92915050565b6000546001600160a01b031633146109ac5760405162461bcd60e51b815260040161090190612927565b60646109ba6009600a612a56565b6109c89063b2b0b2e4612a65565b6109d29190612a7c565b811015610a375760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526c6c6f776572207468616e20312560981b6064820152608401610901565b600e55565b6000610a4a6009600a612a56565b610a589063b2b0b2e4612a65565b905090565b6000610a6a8484846116db565b610abc8433610ab785604051806060016040528060288152602001612bc6602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611b02565b6115b7565b5060019392505050565b6000600954821115610b2d5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610901565b6000610b37611b2e565b9050610b438382611b51565b9392505050565b6000546001600160a01b03163314610b745760405162461bcd60e51b815260040161090190612927565b601055565b6000546001600160a01b03163314610ba35760405162461bcd60e51b815260040161090190612927565b6001600160a01b03811660009081526004602052604090205460ff16610c0b5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610901565b60005b600754811015610d2b57816001600160a01b031660078281548110610c3557610c35612a9e565b6000918252602090912001546001600160a01b031603610d195760078054610c5f90600190612ab4565b81548110610c6f57610c6f612a9e565b600091825260209091200154600780546001600160a01b039092169183908110610c9b57610c9b612a9e565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600490925220805460ff191690556007805480610cf357610cf3612ac7565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610d2381612add565b915050610c0e565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610978918590610ab79086611b5d565b6000610d736009600a612a56565b610d819063b2b0b2e4612a65565b831115610dd05760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610901565b600080610ddc85611b69565b92509250506000610deb611b2e565b905084610e0f576000610e0087858585611bb3565b5090955061097c945050505050565b6000610e1d87858585611bb3565b50955061097c945050505050565b6000546001600160a01b03163314610e555760405162461bcd60e51b815260040161090190612927565b6001600160a01b03811660009081526004602052604090205460ff1615610ebe5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610901565b6001600160a01b03811660009081526001602052604090205415610f18576001600160a01b038116600090815260016020526040902054610efe90610ac6565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600460205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6000546001600160a01b03163314610fa85760405162461bcd60e51b815260040161090190612927565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610ff45760405162461bcd60e51b815260040161090190612927565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146110495760405162461bcd60e51b815260040161090190612927565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6001600160a01b03811660009081526004602052604081205460ff16156110b157506001600160a01b031660009081526002602052604090205490565b6001600160a01b03821660009081526001602052604090205461097c90610ac6565b6000546001600160a01b031633146110fd5760405162461bcd60e51b815260040161090190612927565b6111076000611c0b565b565b6000546001600160a01b031633146111335760405162461bcd60e51b815260040161090190612927565b6011805460ff19169055565b6000546001600160a01b031633146111695760405162461bcd60e51b815260040161090190612927565b601154610100900460ff16156111c15760405162461bcd60e51b815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c65640000000000006044820152606401610901565b6011805462ffff00191662010100179055565b6000546001600160a01b031633146111fe5760405162461bcd60e51b815260040161090190612927565b600681111561124f5760405162461bcd60e51b815260206004820152601e60248201527f4c6971756964697479204665652063616e6e6f742065786365656420362500006044820152606401610901565b600c55565b60006109783384610ab785604051806060016040528060258152602001612bee602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190611b02565b6000546001600160a01b031633146112cd5760405162461bcd60e51b815260040161090190612927565b606481111561131e5760405162461bcd60e51b815260206004820152601a60248201527f50657263656e742063616e6e6f742065786365656420313030250000000000006044820152606401610901565b600d55565b60006109783384846116db565b6000546001600160a01b0316331461135a5760405162461bcd60e51b815260040161090190612927565b601180546001600160a01b0390921664010000000002640100000000600160c01b0319909216919091179055565b6000546001600160a01b031633146113b25760405162461bcd60e51b815260040161090190612927565b60118054821515620100000262ff0000199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906113fd90831515815260200190565b60405180910390a150565b6000546001600160a01b031633146114325760405162461bcd60e51b815260040161090190612927565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461147e5760405162461bcd60e51b815260040161090190612927565b6103e861148d6009600a612a56565b61149b9063b2b0b2e4612a65565b6114a6906005612a65565b6114b09190612a7c565b8110156115175760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b6064820152608401610901565b600f55565b6000546001600160a01b031633146115465760405162461bcd60e51b815260040161090190612927565b6001600160a01b0381166115ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610901565b6115b481611c0b565b50565b6001600160a01b0383166116195760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610901565b6001600160a01b03821661167a5760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610901565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661173f5760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610901565b6001600160a01b0382166117a15760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610901565b600081116118035760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610901565b600061180e30611074565b60115490915060ff1615611a3e57601154610100900460ff166118af576001600160a01b03841660009081526003602052604090205460ff168061186a57506001600160a01b03831660009081526003602052604090205460ff165b6118af5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610901565b6000546001600160a01b038581169116148015906118db57506000546001600160a01b03848116911614155b1561194357600f548211156119435760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610901565b600f5481106119515750600f545b6000546001600160a01b0385811691161480159061197d57506000546001600160a01b03848116911614155b801561199157506001600160a01b03831615155b80156119a857506001600160a01b03831661dead14155b80156119c257506012546001600160a01b03848116911614155b15611a3e5760006119d284611074565b600e549091506119e28483612af6565b1115611a3c5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610901565b505b60105481108015908190611a5c57506011546301000000900460ff16155b8015611a8157506001600160a01b03851660009081526006602052604090205460ff16155b8015611a95575060115462010000900460ff165b15611aa357611aa382611c5b565b6001600160a01b03851660009081526003602052604090205460019060ff1680611ae557506001600160a01b03851660009081526003602052604090205460ff165b15611aee575060005b611afa86868684611dd7565b505050505050565b60008184841115611b265760405162461bcd60e51b81526004016109019190612779565b505050900390565b6000806000611b3b611f55565b9092509050611b4a8282611b51565b9250505090565b6000610b438284612a7c565b6000610b438284612af6565b600080600080611b7b85600b54612140565b90506000611b8b86600c54612140565b90506000611b998784612151565b9050611ba58183612151565b979296509094509092505050565b6000808080611bc2888661215d565b90506000611bd0888761215d565b90506000611bde888861215d565b90506000611bec8484612151565b9050611bf88183612151565b939b939a50919850919650505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6011805463ff00000019166301000000179055600d54600090611c979060c890611c9190611c8a906064612ab4565b859061215d565b90611b51565b90506000611ca58383612151565b905047611cb182612169565b6000611cbd4783612151565b90506000611cd86064611c91600d546064611c8a9190612ab4565b90506000611ce68383612151565b90508015611d70576008546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611d28573d6000803e3d6000fd5b50600854604080516001600160a01b039092168252602082018390527f1af6c280083a73c311541c1467fa5fed97da7b6fd18e594778af9bdb5793b5c4910160405180910390a15b8515611d8057611d8086836122e4565b60408051868152602081018490529081018790527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506011805463ff000000191690555050505050565b600b54600c5482611ded576000600b819055600c555b6001600160a01b03861660009081526004602052604090205460ff168015611e2e57506001600160a01b03851660009081526004602052604090205460ff16155b15611e4357611e3e8686866123a4565b611f41565b6001600160a01b03861660009081526004602052604090205460ff16158015611e8457506001600160a01b03851660009081526004602052604090205460ff165b15611e9457611e3e8686866124e5565b6001600160a01b03861660009081526004602052604090205460ff16158015611ed657506001600160a01b03851660009081526004602052604090205460ff16155b15611ee657611e3e8686866125a6565b6001600160a01b03861660009081526004602052604090205460ff168015611f2657506001600160a01b03851660009081526004602052604090205460ff165b15611f3657611e3e868686612602565b611f418686866125a6565b82611afa57600b91909155600c5550505050565b6000806000600954905060006009600a611f6f9190612a56565b611f7d9063b2b0b2e4612a65565b905060005b6007548110156120e057826001600060078481548110611fa457611fa4612a9e565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061200f5750816002600060078481548110611fe857611fe8612a9e565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561203e576009546009600a6120259190612a56565b6120339063b2b0b2e4612a65565b945094505050509091565b612084600160006007848154811061205857612058612a9e565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612151565b92506120cc60026000600784815481106120a0576120a0612a9e565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612151565b9150806120d881612add565b915050611f82565b506121076120f06009600a612a56565b6120fe9063b2b0b2e4612a65565b60095490611b51565b821015612137576009546009600a61211f9190612a56565b61212d9063b2b0b2e4612a65565b9350935050509091565b90939092509050565b6000610b436064611c91858561215d565b6000610b438284612ab4565b6000610b438284612a65565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061219e5761219e612a9e565b60200260200101906001600160a01b031690816001600160a01b031681525050601160049054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122359190612b09565b8160018151811061224857612248612a9e565b6001600160a01b039283166020918202929092010152601154612276913091640100000000900416846115b7565b60115460405163791ac94760e01b81526401000000009091046001600160a01b03169063791ac947906122b6908590600090869030904290600401612b26565b600060405180830381600087803b1580156122d057600080fd5b505af1158015611afa573d6000803e3d6000fd5b60115461230490309064010000000090046001600160a01b0316846115b7565b60115460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526401000000009091046001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015612378573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061239d9190612b97565b5050505050565b60008060006123b284611b69565b92509250925060006123c2611b2e565b905060008060006123d588878787611bb3565b6001600160a01b038d1660009081526002602052604090205492955090935091506124009089612151565b6001600160a01b038b1660009081526002602090815260408083209390935560019052205461242f9084612151565b6001600160a01b03808c1660009081526001602052604080822093909355908b168152205461245e9083611b5d565b6001600160a01b038a1660009081526001602052604090205561248230868661268d565b61248c818761273c565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040516124d191815260200190565b60405180910390a350505050505050505050565b60008060006124f384611b69565b9250925092506000612503611b2e565b9050600080600061251688878787611bb3565b6001600160a01b038d1660009081526001602052604090205492955090935091506125419084612151565b6001600160a01b03808c16600090815260016020908152604080832094909455918c168152600290915220546125779088611b5d565b6001600160a01b038a1660009081526002602090815260408083209390935560019052205461245e9083611b5d565b60008060006125b484611b69565b92509250925060006125c4611b2e565b905060008060006125d788878787611bb3565b6001600160a01b038d16600090815260016020526040902054929550909350915061242f9084612151565b600080600061261084611b69565b9250925092506000612620611b2e565b9050600080600061263388878787611bb3565b6001600160a01b038d16600090815260026020526040902054929550909350915061265e9089612151565b6001600160a01b038b166000908152600260209081526040808320939093556001905220546125419084612151565b6000821161269a57505050565b60006126a6838361215d565b6001600160a01b0385166000908152600160205260409020549091506126cc9082611b5d565b6001600160a01b03851660009081526001602090815260408083209390935560049052205460ff1615612736576001600160a01b03841660009081526002602052604090205461271c9084611b5d565b6001600160a01b0385166000908152600260205260409020555b50505050565b6009546127499083612151565b600955600a546127599082611b5d565b600a555050565b60006020828403121561277257600080fd5b5035919050565b600060208083528351808285015260005b818110156127a65785810183015185820160400152820161278a565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146115b457600080fd5b600080604083850312156127ef57600080fd5b82356127fa816127c7565b946020939093013593505050565b60008060006060848603121561281d57600080fd5b8335612828816127c7565b92506020840135612838816127c7565b929592945050506040919091013590565b60006020828403121561285b57600080fd5b8135610b43816127c7565b8035801515811461287657600080fd5b919050565b6000806040838503121561288e57600080fd5b8235915061289e60208401612866565b90509250929050565b600080604083850312156128ba57600080fd5b82356128c5816127c7565b915061289e60208401612866565b6000602082840312156128e557600080fd5b610b4382612866565b6000806040838503121561290157600080fd5b823561290c816127c7565b9150602083013561291c816127c7565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156129ad5781600019048211156129935761299361295c565b808516156129a057918102915b93841c9390800290612977565b509250929050565b6000826129c45750600161097c565b816129d15750600061097c565b81600181146129e757600281146129f157612a0d565b600191505061097c565b60ff841115612a0257612a0261295c565b50506001821b61097c565b5060208310610133831016604e8410600b8410161715612a30575081810a61097c565b612a3a8383612972565b8060001904821115612a4e57612a4e61295c565b029392505050565b6000610b4360ff8416836129b5565b808202811582820484141761097c5761097c61295c565b600082612a9957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b8181038181111561097c5761097c61295c565b634e487b7160e01b600052603160045260246000fd5b600060018201612aef57612aef61295c565b5060010190565b8082018082111561097c5761097c61295c565b600060208284031215612b1b57600080fd5b8151610b43816127c7565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612b765784516001600160a01b031683529383019391830191600101612b51565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612bac57600080fd5b835192506020840151915060408401519050925092509256fe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122000a4cf688b0d4f79e93e370855f33b5be7b0976cef564abd50fcc7cfd8003aec64736f6c63430008110033

Deployed Bytecode Sourcemap

17612:20166:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24906:164;;;;;;;;;;-1:-1:-1;24906:164:0;;;;;:::i;:::-;;:::i;:::-;;20302:83;;;;;;;;;;-1:-1:-1;20372:5:0;;;;;;;;;;;;-1:-1:-1;;;20372:5:0;;;;20302:83;;;;;;;:::i;:::-;;;;;;;;21214:161;;;;;;;;;;-1:-1:-1;21214:161:0;;;;;:::i;:::-;;:::i;:::-;;;1373:14:1;;1366:22;1348:41;;1336:2;1321:18;21214:161:0;1208:187:1;25489:196:0;;;;;;;;;;-1:-1:-1;25489:196:0;;;;;:::i;:::-;;:::i;22335:87::-;;;;;;;;;;-1:-1:-1;22404:10:0;;22335:87;;;1546:25:1;;;1534:2;1519:18;22335:87:0;1400:177:1;20579:95:0;;;;;;;;;;;;;:::i;21383:313::-;;;;;;;;;;-1:-1:-1;21383:313:0;;;;;:::i;:::-;;:::i;23050:254::-;;;;;;;;;;-1:-1:-1;23050:254:0;;;;;:::i;:::-;;:::i;24646:124::-;;;;;;;;;;-1:-1:-1;24646:124:0;;;;;:::i;:::-;;:::i;20488:83::-;;;;;;;;;;-1:-1:-1;20488:83:0;;18318:1;2185:36:1;;2173:2;2158:18;20488:83:0;2043:184:1;24022:479:0;;;;;;;;;;-1:-1:-1;24022:479:0;;;;;:::i;:::-;;:::i;21704:218::-;;;;;;;;;;-1:-1:-1;21704:218:0;;;;;:::i;:::-;;:::i;22430:612::-;;;;;;;;;;-1:-1:-1;22430:612:0;;;;;:::i;:::-;;:::i;18840:33::-;;;;;;;;;;-1:-1:-1;18840:33:0;;;;;;;;23678:336;;;;;;;;;;-1:-1:-1;23678:336:0;;;;;:::i;:::-;;:::i;28787:123::-;;;;;;;;;;-1:-1:-1;28787:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;28875:27:0;28851:4;28875:27;;;:18;:27;;;;;;;;;28787:123;18608:54;;;;;;;;;;;;;;;;18987:42;;;;;;;;;;-1:-1:-1;18987:42:0;;;;;;;-1:-1:-1;;;;;18987:42:0;;;;;;-1:-1:-1;;;;;3093:32:1;;;3075:51;;3063:2;3048:18;18987:42:0;2902:230:1;24509:125:0;;;;;;;;;;-1:-1:-1;24509:125:0;;;;;:::i;:::-;;:::i;26388:130::-;;;;;;;;;;-1:-1:-1;26388:130:0;;;;;:::i;:::-;;:::i;24776:122::-;;;;;;;;;;-1:-1:-1;24776:122:0;;;;;:::i;:::-;;:::i;18920:31::-;;;;;;;;;;-1:-1:-1;18920:31:0;;;;;;;;;;;20682:198;;;;;;;;;;-1:-1:-1;20682:198:0;;;;;:::i;:::-;;:::i;8830:103::-;;;;;;;;;;;;;:::i;23586:84::-;;;;;;;;;;;;;:::i;22207:120::-;;;;;;;;;;-1:-1:-1;22207:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;22299:20:0;22275:4;22299:20;;;:11;:20;;;;;;;;;22207:120;23358:176;;;;;;;;;;;;;:::i;18725:46::-;;;;;;;;;;;;;;;;8179:87;;;;;;;;;;-1:-1:-1;8225:7:0;8252:6;-1:-1:-1;;;;;8252:6:0;8179:87;;25078:172;;;;;;;;;;-1:-1:-1;25078:172:0;;;;;:::i;:::-;;:::i;20393:87::-;;;;;;;;;;-1:-1:-1;20465:7:0;;;;;;;;;;;;-1:-1:-1;;;20465:7:0;;;;20393:87;;18095:76;;;;;;;;;;-1:-1:-1;18095:76:0;;;;-1:-1:-1;;;;;18095:76:0;;;18570:31;;;;;;;;;;;;;;;;19036:40;;;;;;;;;;-1:-1:-1;19036:40:0;;;;-1:-1:-1;;;;;19036:40:0;;;18538:25;;;;;;;;;;;;;;;;21930:269;;;;;;;;;;-1:-1:-1;21930:269:0;;;;;:::i;:::-;;:::i;25258:223::-;;;;;;;;;;-1:-1:-1;25258:223:0;;;;;:::i;:::-;;:::i;20888:167::-;;;;;;;;;;-1:-1:-1;20888:167:0;;;;;:::i;:::-;;:::i;17991:61::-;;;;;;;;;;-1:-1:-1;17991:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;18880:33;;;;;;;;;;-1:-1:-1;18880:33:0;;;;;;;;;;;26103:178;;;;;;;;;;-1:-1:-1;26103:178:0;;;;;:::i;:::-;;:::i;25898:160::-;;;;;;;;;;-1:-1:-1;25898:160:0;;;;;:::i;:::-;;:::i;26289:91::-;;;;;;;;;;-1:-1:-1;26289:91:0;;;;;:::i;:::-;;:::i;21063:143::-;;;;;;;;;;-1:-1:-1;21063:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;21171:18:0;;;21144:7;21171:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21063:143;18669:49;;;;;;;;;;;;;;;;25693:197;;;;;;;;;;-1:-1:-1;25693:197:0;;;;;:::i;:::-;;:::i;9088:201::-;;;;;;;;;;-1:-1:-1;9088:201:0;;;;;:::i;:::-;;:::i;24906:164::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;;;;;;;;;24996:1:::1;24986:6;:11;;24978:58;;;::::0;-1:-1:-1;;;24978:58:0;;4806:2:1;24978:58:0::1;::::0;::::1;4788:21:1::0;4845:2;4825:18;;;4818:30;4884:34;4864:18;;;4857:62;-1:-1:-1;;;4935:18:1;;;4928:32;4977:19;;24978:58:0::1;4604:398:1::0;24978:58:0::1;25047:6;:15:::0;24906:164::o;21214:161::-;21289:4;21306:39;7501:10;21329:7;21338:6;21306:8;:39::i;:::-;-1:-1:-1;21363:4:0;21214:161;;;;;:::o;25489:196::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;25591:3:::1;18425:15;18318:1;18425:2;:15;:::i;:::-;18412:28;::::0;:10:::1;:28;:::i;:::-;25581:13;;;;:::i;:::-;25571:6;:23;;25563:81;;;::::0;-1:-1:-1;;;25563:81:0;;7119:2:1;25563:81:0::1;::::0;::::1;7101:21:1::0;7158:2;7138:18;;;7131:30;7197:34;7177:18;;;7170:62;-1:-1:-1;;;7248:18:1;;;7241:43;7301:19;;25563:81:0::1;6917:409:1::0;25563:81:0::1;25654:14;:23:::0;25489:196::o;20579:95::-;20632:7;18425:15;18318:1;18425:2;:15;:::i;:::-;18412:28;;:10;:28;:::i;:::-;20652:14;;20579:95;:::o;21383:313::-;21481:4;21498:36;21508:6;21516:9;21527:6;21498:9;:36::i;:::-;21545:121;21554:6;7501:10;21576:89;21614:6;21576:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21576:19:0;;;;;;:11;:19;;;;;;;;7501:10;21576:33;;;;;;;;;;:37;:89::i;:::-;21545:8;:121::i;:::-;-1:-1:-1;21684:4:0;21383:313;;;;;:::o;23050:254::-;23116:7;23155;;23144;:18;;23136:73;;;;-1:-1:-1;;;23136:73:0;;7533:2:1;23136:73:0;;;7515:21:1;7572:2;7552:18;;;7545:30;7611:34;7591:18;;;7584:62;-1:-1:-1;;;7662:18:1;;;7655:40;7712:19;;23136:73:0;7331:406:1;23136:73:0;23222:19;23244:10;:8;:10::i;:::-;23222:32;-1:-1:-1;23272:24:0;:7;23222:32;23272:11;:24::i;:::-;23265:31;23050:254;-1:-1:-1;;;23050:254:0:o;24646:124::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;24731:16:::1;:31:::0;24646:124::o;24022:479::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24102:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;24094:60;;;::::0;-1:-1:-1;;;24094:60:0;;7944:2:1;24094:60:0::1;::::0;::::1;7926:21:1::0;7983:2;7963:18;;;7956:30;8022:29;8002:18;;;7995:57;8069:18;;24094:60:0::1;7742:351:1::0;24094:60:0::1;24172:9;24167:327;24191:9;:16:::0;24187:20;::::1;24167:327;;;24249:7;-1:-1:-1::0;;;;;24233:23:0::1;:9;24243:1;24233:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;24233:12:0::1;:23:::0;24229:254:::1;;24292:9;24302:16:::0;;:20:::1;::::0;24321:1:::1;::::0;24302:20:::1;:::i;:::-;24292:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;24277:9:::1;:12:::0;;-1:-1:-1;;;;;24292:31:0;;::::1;::::0;24287:1;;24277:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;24277:46:0::1;-1:-1:-1::0;;;;;24277:46:0;;::::1;;::::0;;24342:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;24381:11:::1;:20:::0;;;;:28;;-1:-1:-1;;24381:28:0::1;::::0;;24428:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;24428:15:0;;;;;-1:-1:-1;;;;;;24428:15:0::1;::::0;;;;;24167:327:::1;24022:479:::0;:::o;24229:254::-:1;24209:3:::0;::::1;::::0;::::1;:::i;:::-;;;;24167:327;;;;24022:479:::0;:::o;21704:218::-;7501:10;21792:4;21841:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21841:34:0;;;;;;;;;;21792:4;;21809:83;;21832:7;;21841:50;;21880:10;21841:38;:50::i;22430:612::-;22520:7;18425:15;18318:1;18425:2;:15;:::i;:::-;18412:28;;:10;:28;:::i;:::-;22548:7;:18;;22540:62;;;;-1:-1:-1;;;22540:62:0;;8837:2:1;22540:62:0;;;8819:21:1;8876:2;8856:18;;;8849:30;8915:33;8895:18;;;8888:61;8966:18;;22540:62:0;8635:355:1;22540:62:0;22616:12;22630:18;22652:20;22664:7;22652:11;:20::i;:::-;22613:59;;;;;22683:19;22705:10;:8;:10::i;:::-;22683:32;;22733:17;22728:307;;22768:15;22789:51;22801:7;22810:4;22816:10;22828:11;22789;:51::i;:::-;-1:-1:-1;22767:73:0;;-1:-1:-1;22855:14:0;;-1:-1:-1;;;;;22855:14:0;22728:307;22907:23;22935:51;22947:7;22956:4;22962:10;22974:11;22935;:51::i;:::-;-1:-1:-1;22904:82:0;-1:-1:-1;23001:22:0;;-1:-1:-1;;;;;23001:22:0;23678:336;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23761:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;23760:21;23752:61;;;::::0;-1:-1:-1;;;23752:61:0;;7944:2:1;23752:61:0::1;::::0;::::1;7926:21:1::0;7983:2;7963:18;;;7956:30;8022:29;8002:18;;;7995:57;8069:18;;23752:61:0::1;7742:351:1::0;23752:61:0::1;-1:-1:-1::0;;;;;23830:16:0;::::1;23849:1;23830:16:::0;;;:7:::1;:16;::::0;;;;;:20;23826:109:::1;;-1:-1:-1::0;;;;;23906:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;23886:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;23867:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;23826:109:::1;-1:-1:-1::0;;;;;23945:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;23945:27:0::1;23968:4;23945:27:::0;;::::1;::::0;;;23983:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;23983:23:0::1;::::0;;::::1;::::0;;23678:336::o;24509:125::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;24592:16:::1;:34:::0;;-1:-1:-1;;;;;;24592:34:0::1;-1:-1:-1::0;;;;;24592:34:0;;;::::1;::::0;;;::::1;::::0;;24509:125::o;26388:130::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26475:31:0;;;::::1;;::::0;;;:28:::1;:31;::::0;;;;:35;;-1:-1:-1;;26475:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;26388:130::o;24776:122::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24859:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:31;;-1:-1:-1;;24859:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;24776:122::o;20682:198::-;-1:-1:-1;;;;;20772:20:0;;20748:7;20772:20;;;:11;:20;;;;;;;;20768:49;;;-1:-1:-1;;;;;;20801:16:0;;;;;:7;:16;;;;;;;20682:198::o;20768:49::-;-1:-1:-1;;;;;20855:16:0;;;;;;:7;:16;;;;;;20835:37;;:19;:37::i;8830:103::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;8895:30:::1;8922:1;8895:18;:30::i;:::-;8830:103::o:0;23586:84::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;23640:14:::1;:22:::0;;-1:-1:-1;;23640:22:0::1;::::0;;23586:84::o;23358:176::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;23422:13:::1;::::0;::::1;::::0;::::1;;;23421:14;23413:53;;;::::0;-1:-1:-1;;;23413:53:0;;9197:2:1;23413:53:0::1;::::0;::::1;9179:21:1::0;9236:2;9216:18;;;9209:30;9275:28;9255:18;;;9248:56;9321:18;;23413:53:0::1;8995:350:1::0;23413:53:0::1;23477:13;:20:::0;;-1:-1:-1;;23508:18:0;;;;;23358:176::o;25078:172::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;25174:1:::1;25164:6;:11;;25156:54;;;::::0;-1:-1:-1;;;25156:54:0;;9552:2:1;25156:54:0::1;::::0;::::1;9534:21:1::0;9591:2;9571:18;;;9564:30;9630:32;9610:18;;;9603:60;9680:18;;25156:54:0::1;9350:354:1::0;25156:54:0::1;25221:12;:21:::0;25078:172::o;21930:269::-;22023:4;22040:129;7501:10;22063:7;22072:96;22111:15;22072:96;;;;;;;;;;;;;;;;;7501:10;22072:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;22072:34:0;;;;;;;;;;;;:38;:96::i;25258:223::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;25380:3:::1;25364:12;:19;;25356:58;;;::::0;-1:-1:-1;;;25356:58:0;;9911:2:1;25356:58:0::1;::::0;::::1;9893:21:1::0;9950:2;9930:18;;;9923:30;9989:28;9969:18;;;9962:56;10035:18;;25356:58:0::1;9709:350:1::0;25356:58:0::1;25425:33;:48:::0;25258:223::o;20888:167::-;20966:4;20983:42;7501:10;21007:9;21018:6;20983:9;:42::i;26103:178::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;26239:16:::1;:34:::0;;-1:-1:-1;;;;;26239:34:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;26239:34:0;;::::1;::::0;;;::::1;::::0;;26103:178::o;25898:160::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;25976:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;25976:21:0;;::::1;;::::0;;26013:37:::1;::::0;::::1;::::0;::::1;::::0;25990:7;1373:14:1;1366:22;1348:41;;1336:2;1321:18;;1208:187;26013:37:0::1;;;;;;;;25898:160:::0;:::o;26289:91::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;26354:14:::1;:18:::0;;-1:-1:-1;;;;;;26354:18:0::1;-1:-1:-1::0;;;;;26354:18:0;;;::::1;::::0;;;::::1;::::0;;26289:91::o;25693:197::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;25795:4:::1;18425:15;18318:1;18425:2;:15;:::i;:::-;18412:28;::::0;:10:::1;:28;:::i;:::-;25781:11;::::0;25791:1:::1;25781:11;:::i;:::-;:18;;;;:::i;:::-;25771:6;:28;;25763:88;;;::::0;-1:-1:-1;;;25763:88:0;;10266:2:1;25763:88:0::1;::::0;::::1;10248:21:1::0;10305:2;10285:18;;;10278:30;10344:34;10324:18;;;10317:62;-1:-1:-1;;;10395:18:1;;;10388:45;10450:19;;25763:88:0::1;10064:411:1::0;25763:88:0::1;25862:11;:20:::0;25693:197::o;9088:201::-;8225:7;8252:6;-1:-1:-1;;;;;8252:6:0;7501:10;8399:23;8391:68;;;;-1:-1:-1;;;8391:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9177:22:0;::::1;9169:73;;;::::0;-1:-1:-1;;;9169:73:0;;10682:2:1;9169:73:0::1;::::0;::::1;10664:21:1::0;10721:2;10701:18;;;10694:30;10760:34;10740:18;;;10733:62;-1:-1:-1;;;10811:18:1;;;10804:36;10857:19;;9169:73:0::1;10480:402:1::0;9169:73:0::1;9253:28;9272:8;9253:18;:28::i;:::-;9088:201:::0;:::o;28918:337::-;-1:-1:-1;;;;;29011:19:0;;29003:68;;;;-1:-1:-1;;;29003:68:0;;11089:2:1;29003:68:0;;;11071:21:1;11128:2;11108:18;;;11101:30;11167:34;11147:18;;;11140:62;-1:-1:-1;;;11218:18:1;;;11211:34;11262:19;;29003:68:0;10887:400:1;29003:68:0;-1:-1:-1;;;;;29090:21:0;;29082:68;;;;-1:-1:-1;;;29082:68:0;;11494:2:1;29082:68:0;;;11476:21:1;11533:2;11513:18;;;11506:30;11572:34;11552:18;;;11545:62;-1:-1:-1;;;11623:18:1;;;11616:32;11665:19;;29082:68:0;11292:398:1;29082:68:0;-1:-1:-1;;;;;29163:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;29215:32;;1546:25:1;;;29215:32:0;;1519:18:1;29215:32:0;;;;;;;28918:337;;;:::o;29263:2356::-;-1:-1:-1;;;;;29385:18:0;;29377:68;;;;-1:-1:-1;;;29377:68:0;;11897:2:1;29377:68:0;;;11879:21:1;11936:2;11916:18;;;11909:30;11975:34;11955:18;;;11948:62;-1:-1:-1;;;12026:18:1;;;12019:35;12071:19;;29377:68:0;11695:401:1;29377:68:0;-1:-1:-1;;;;;29464:16:0;;29456:64;;;;-1:-1:-1;;;29456:64:0;;12303:2:1;29456:64:0;;;12285:21:1;12342:2;12322:18;;;12315:30;12381:34;12361:18;;;12354:62;-1:-1:-1;;;12432:18:1;;;12425:33;12475:19;;29456:64:0;12101:399:1;29456:64:0;29548:1;29539:6;:10;29531:64;;;;-1:-1:-1;;;29531:64:0;;12707:2:1;29531:64:0;;;12689:21:1;12746:2;12726:18;;;12719:30;12785:34;12765:18;;;12758:62;-1:-1:-1;;;12836:18:1;;;12829:39;12885:19;;29531:64:0;12505:405:1;29531:64:0;29608:28;29639:24;29657:4;29639:9;:24::i;:::-;29680:14;;29608:55;;-1:-1:-1;29680:14:0;;29676:1364;;;29716:13;;;;;;;29711:201;;-1:-1:-1;;;;;29780:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;29808:22:0;;;;;;:18;:22;;;;;;;;29780:50;29750:146;;;;-1:-1:-1;;;29750:146:0;;13117:2:1;29750:146:0;;;13099:21:1;13156:2;13136:18;;;13129:30;-1:-1:-1;;;13175:18:1;;;13168:52;13237:18;;29750:146:0;12915:346:1;29750:146:0;8225:7;8252:6;-1:-1:-1;;;;;29932:15:0;;;8252:6;;29932:15;;;;:32;;-1:-1:-1;8225:7:0;8252:6;-1:-1:-1;;;;;29951:13:0;;;8252:6;;29951:13;;29932:32;29928:147;;;30003:11;;29993:6;:21;;29985:74;;;;-1:-1:-1;;;29985:74:0;;13468:2:1;29985:74:0;;;13450:21:1;13507:2;13487:18;;;13480:30;13546:34;13526:18;;;13519:62;-1:-1:-1;;;13597:18:1;;;13590:38;13645:19;;29985:74:0;13266:404:1;29985:74:0;30459:11;;30435:20;:35;30431:110;;-1:-1:-1;30514:11:0;;30431:110;8225:7;8252:6;-1:-1:-1;;;;;30577:15:0;;;8252:6;;30577:15;;;;:49;;-1:-1:-1;8225:7:0;8252:6;-1:-1:-1;;;;;30613:13:0;;;8252:6;;30613:13;;30577:49;:86;;;;-1:-1:-1;;;;;;30647:16:0;;;;30577:86;:128;;;;-1:-1:-1;;;;;;30684:21:0;;30698:6;30684:21;;30577:128;:169;;;;-1:-1:-1;30732:14:0;;-1:-1:-1;;;;;30726:20:0;;;30732:14;;30726:20;;30577:169;30555:474;;;30783:32;30818:13;30828:2;30818:9;:13::i;:::-;30917:14;;30783:48;;-1:-1:-1;30880:33:0;30907:6;30783:48;30880:33;:::i;:::-;:51;;30850:161;;;;-1:-1:-1;;;30850:161:0;;14007:2:1;30850:161:0;;;13989:21:1;14046:2;14026:18;;;14019:30;14085:34;14065:18;;;14058:62;-1:-1:-1;;;14136:18:1;;;14129:34;14180:19;;30850:161:0;13805:400:1;30850:161:0;30762:267;30555:474;31105:16;;31081:40;;;;;;;31150:56;;-1:-1:-1;31189:17:0;;;;;;;31188:18;31150:56;:108;;;;-1:-1:-1;;;;;;31224:34:0;;;;;;:28;:34;;;;;;;;31223:35;31150:108;:136;;;;-1:-1:-1;31275:11:0;;;;;;;31150:136;31132:286;;;31370:36;31385:20;31370:14;:36::i;:::-;-1:-1:-1;;;;;31466:24:0;;31432:12;31466:24;;;:18;:24;;;;;;31447:4;;31466:24;;;:50;;-1:-1:-1;;;;;;31494:22:0;;;;;;:18;:22;;;;;;;;31466:50;31462:98;;;-1:-1:-1;31543:5:0;31462:98;31570:41;31585:4;31591:2;31595:6;31603:7;31570:14;:41::i;:::-;29366:2253;;;29263:2356;;;:::o;5375:206::-;5461:7;5522:12;5514:6;;;;5506:29;;;;-1:-1:-1;;;5506:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;5557:5:0;;;5375:206::o;27572:163::-;27613:7;27634:15;27651;27670:19;:17;:19::i;:::-;27633:56;;-1:-1:-1;27633:56:0;-1:-1:-1;27707:20:0;27633:56;;27707:11;:20::i;:::-;27700:27;;;;27572:163;:::o;4233:98::-;4291:7;4318:5;4322:1;4318;:5;:::i;3096:98::-;3154:7;3181:5;3185:1;3181;:5;:::i;26684:390::-;26744:7;26753;26762;26782:12;26803:29;26816:7;26825:6;;26803:12;:29::i;:::-;26782:50;;26843:18;26864:35;26877:7;26886:12;;26864;:35::i;:::-;26843:56;-1:-1:-1;26910:23:0;26936:17;:7;26948:4;26936:11;:17::i;:::-;26910:43;-1:-1:-1;26982:31:0;26910:43;27002:10;26982:19;:31::i;:::-;26964:49;27049:4;;-1:-1:-1;27055:10:0;;-1:-1:-1;26684:390:0;;-1:-1:-1;;;26684:390:0:o;27082:482::-;27197:7;;;;27256:24;:7;27268:11;27256;:24::i;:::-;27235:45;-1:-1:-1;27291:12:0;27312:21;:4;27321:11;27312:8;:21::i;:::-;27291:42;-1:-1:-1;27344:18:0;27365:27;:10;27380:11;27365:14;:27::i;:::-;27344:48;-1:-1:-1;27403:23:0;27429:17;:7;27441:4;27429:11;:17::i;:::-;27403:43;-1:-1:-1;27475:31:0;27403:43;27495:10;27475:19;:31::i;:::-;27525:7;;;;-1:-1:-1;27551:4:0;;-1:-1:-1;27082:482:0;;-1:-1:-1;;;;;;;27082:482:0:o;9449:191::-;9523:16;9542:6;;-1:-1:-1;;;;;9559:17:0;;;-1:-1:-1;;;;;;9559:17:0;;;;;;9592:40;;9542:6;;;;;;;9592:40;;9523:16;9592:40;9512:128;9449:191;:::o;31627:1069::-;19431:17;:24;;-1:-1:-1;;19431:24:0;;;;;31763:33:::1;::::0;19431:24;;31732:74:::1;::::0;31802:3:::1;::::0;31732:65:::1;::::0;31757:39:::1;::::0;:3:::1;:39;:::i;:::-;31732:20:::0;;:24:::1;:65::i;:::-;:69:::0;::::1;:74::i;:::-;31712:94:::0;-1:-1:-1;31817:18:0::1;31838:35;:20:::0;31712:94;31838:24:::1;:35::i;:::-;31817:56:::0;-1:-1:-1;31911:21:0::1;31977:28;31817:56:::0;31977:16:::1;:28::i;:::-;32082:18;32103:41;:21;32129:14:::0;32103:25:::1;:41::i;:::-;32082:62;;32188:23;32214:64;32274:3;32214:55;32235:33;;32229:3;:39;;;;:::i;32214:64::-;32188:90:::0;-1:-1:-1;32289:20:0::1;32312:31;:10:::0;32188:90;32312:14:::1;:31::i;:::-;32289:54:::0;-1:-1:-1;32358:16:0;;32354:165:::1;;32399:16;::::0;32391:48:::1;::::0;-1:-1:-1;;;;;32399:16:0;;::::1;::::0;32391:48;::::1;;;::::0;32426:12;;32399:16:::1;32391:48:::0;32399:16;32391:48;32426:12;32399:16;32391:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;32476:16:0::1;::::0;32459:48:::1;::::0;;-1:-1:-1;;;;;32476:16:0;;::::1;14384:51:1::0;;14466:2;14451:18;;14444:34;;;32459:48:0::1;::::0;14357:18:1;32459:48:0::1;;;;;;;32354:165;32535:13:::0;;32531:86:::1;;32565:40;32578:9;32589:15;32565:12;:40::i;:::-;32634:54;::::0;;14691:25:1;;;14747:2;14732:18;;14725:34;;;14775:18;;;14768:34;;;32634:54:0::1;::::0;14679:2:1;14664:18;32634:54:0::1;;;;;;;-1:-1:-1::0;;19478:17:0;:25;;-1:-1:-1;;19478:25:0;;;-1:-1:-1;;;;;31627:1069:0:o;33829:1055::-;33967:6;;34015:12;;34045:7;34040:88;;34084:1;34069:6;:16;;;34100:12;:16;34040:88;-1:-1:-1;;;;;34144:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;34168:22:0;;;;;;:11;:22;;;;;;;;34167:23;34144:46;34140:605;;;34207:48;34229:6;34237:9;34248:6;34207:21;:48::i;:::-;34140:605;;;-1:-1:-1;;;;;34280:19:0;;;;;;:11;:19;;;;;;;;34279:20;:46;;;;-1:-1:-1;;;;;;34303:22:0;;;;;;:11;:22;;;;;;;;34279:46;34275:470;;;34342:46;34362:6;34370:9;34381:6;34342:19;:46::i;34275:470::-;-1:-1:-1;;;;;34413:19:0;;;;;;:11;:19;;;;;;;;34412:20;:47;;;;-1:-1:-1;;;;;;34437:22:0;;;;;;:11;:22;;;;;;;;34436:23;34412:47;34408:337;;;34476:44;34494:6;34502:9;34513:6;34476:17;:44::i;34408:337::-;-1:-1:-1;;;;;34544:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;34567:22:0;;;;;;:11;:22;;;;;;;;34544:45;34540:205;;;34606:48;34628:6;34636:9;34647:6;34606:21;:48::i;34540:205::-;34689:44;34707:6;34715:9;34726:6;34689:17;:44::i;:::-;34762:7;34757:120;;34786:6;:29;;;;34830:12;:35;-1:-1:-1;;;;33829:1055:0:o;27743:555::-;27793:7;27802;27822:15;27840:7;;27822:25;;27858:15;18318:1;18425:2;:15;;;;:::i;:::-;18412:28;;:10;:28;:::i;:::-;27858:25;;27899:9;27894:289;27918:9;:16;27914:20;;27894:289;;;27984:7;27960;:21;27968:9;27978:1;27968:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;27968:12:0;27960:21;;;;;;;;;;;;;:31;;:66;;;28019:7;27995;:21;28003:9;28013:1;28003:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28003:12:0;27995:21;;;;;;;;;;;;;:31;27960:66;27956:97;;;28036:7;;18318:1;18425:2;:15;;;;:::i;:::-;18412:28;;:10;:28;:::i;:::-;28028:25;;;;;;;27743:555;;:::o;27956:97::-;28078:34;28090:7;:21;28098:9;28108:1;28098:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28098:12:0;28090:21;;;;;;;;;;;;;28078:7;;:11;:34::i;:::-;28068:44;;28137:34;28149:7;:21;28157:9;28167:1;28157:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28157:12:0;28149:21;;;;;;;;;;;;;28137:7;;:11;:34::i;:::-;28127:44;-1:-1:-1;27936:3:0;;;;:::i;:::-;;;;27894:289;;;-1:-1:-1;28207:20:0;18425:15;18318:1;18425:2;:15;:::i;:::-;18412:28;;:10;:28;:::i;:::-;28207:7;;;:11;:20::i;:::-;28197:7;:30;28193:61;;;28237:7;;18318:1;18425:2;:15;;;;:::i;:::-;18412:28;;:10;:28;:::i;:::-;28229:25;;;;;;27743:555;;:::o;28193:61::-;28273:7;;28282;;-1:-1:-1;27743:555:0;-1:-1:-1;27743:555:0:o;28647:132::-;28720:7;28747:24;28767:3;28747:15;:6;28758:3;28747:10;:15::i;3477:98::-;3535:7;3562:5;3566:1;3562;:5;:::i;3834:98::-;3892:7;3919:5;3923:1;3919;:5;:::i;32702:592::-;32852:16;;;32866:1;32852:16;;;;;;;;32828:21;;32852:16;;;;;;;;;;-1:-1:-1;32852:16:0;32828:40;;32897:4;32879;32884:1;32879:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;32879:23:0;;;-1:-1:-1;;;;;32879:23:0;;;;;32923:16;;;;;;;;;-1:-1:-1;;;;;32923:16:0;-1:-1:-1;;;;;32923:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32913:4;32918:1;32913:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32913:33:0;;;:7;;;;;;;;;:33;32991:16;;32959:63;;32976:4;;32991:16;;;;33010:11;32959:8;:63::i;:::-;33061:16;;:225;;-1:-1:-1;;;33061:225:0;;:16;;;;-1:-1:-1;;;;;33061:16:0;;:67;;:225;;33143:11;;33169:1;;33213:4;;33240;;33260:15;;33061:16;:225;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33300:521;33480:16;;33448:63;;33465:4;;33480:16;;;-1:-1:-1;;;;;33480:16:0;33499:11;33448:8;:63::i;:::-;33554:16;;:259;;-1:-1:-1;;;33554:259:0;;33627:4;33554:16;:259;;16527:34:1;;;16577:18;;;16570:34;;;33673:1:0;16620:18:1;;;16613:34;;;16663:18;;;16656:34;16706:19;;;16699:44;33787:15:0;16759:19:1;;;16752:35;33554:16:0;;;;-1:-1:-1;;;;;33554:16:0;;:32;;33594:9;;16461:19:1;;33554:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;33300:521;;:::o;37065:708::-;37168:23;37193:12;37207:18;37229:20;37241:7;37229:11;:20::i;:::-;37167:82;;;;;;37260:19;37282:10;:8;:10::i;:::-;37260:32;;37304:15;37321:23;37346:12;37362:51;37374:7;37383:4;37389:10;37401:11;37362;:51::i;:::-;-1:-1:-1;;;;;37444:15:0;;;;;;:7;:15;;;;;;37303:110;;-1:-1:-1;37303:110:0;;-1:-1:-1;37303:110:0;-1:-1:-1;37444:28:0;;37464:7;37444:19;:28::i;:::-;-1:-1:-1;;;;;37426:15:0;;;;;;:7;:15;;;;;;;;:46;;;;37501:7;:15;;;;:28;;37521:7;37501:19;:28::i;:::-;-1:-1:-1;;;;;37483:15:0;;;;;;;:7;:15;;;;;;:46;;;;37561:18;;;;;;;:39;;37584:15;37561:22;:39::i;:::-;-1:-1:-1;;;;;37540:18:0;;;;;;:7;:18;;;;;:60;37613:58;37640:4;37647:10;37659:11;37613:18;:58::i;:::-;37682:23;37694:4;37700;37682:11;:23::i;:::-;37738:9;-1:-1:-1;;;;;37721:44:0;37730:6;-1:-1:-1;;;;;37721:44:0;;37749:15;37721:44;;;;1546:25:1;;1534:2;1519:18;;1400:177;37721:44:0;;;;;;;;37156:617;;;;;;;37065:708;;;:::o;36337:720::-;36438:23;36463:12;36477:18;36499:20;36511:7;36499:11;:20::i;:::-;36437:82;;;;;;36530:19;36552:10;:8;:10::i;:::-;36530:32;;36574:15;36591:23;36616:12;36632:51;36644:7;36653:4;36659:10;36671:11;36632;:51::i;:::-;-1:-1:-1;;;;;36714:15:0;;;;;;:7;:15;;;;;;36573:110;;-1:-1:-1;36573:110:0;;-1:-1:-1;36573:110:0;-1:-1:-1;36714:28:0;;36573:110;36714:19;:28::i;:::-;-1:-1:-1;;;;;36696:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;36774:18;;;;;:7;:18;;;;;:39;;36797:15;36774:22;:39::i;:::-;-1:-1:-1;;;;;36753:18:0;;;;;;:7;:18;;;;;;;;:60;;;;36845:7;:18;;;;:39;;36868:15;36845:22;:39::i;34892:650::-;34991:23;35016:12;35030:18;35052:20;35064:7;35052:11;:20::i;:::-;34990:82;;;;;;35083:19;35105:10;:8;:10::i;:::-;35083:32;;35127:15;35144:23;35169:12;35185:51;35197:7;35206:4;35212:10;35224:11;35185;:51::i;:::-;-1:-1:-1;;;;;35270:15:0;;;;;;:7;:15;;;;;;35126:110;;-1:-1:-1;35126:110:0;;-1:-1:-1;35126:110:0;-1:-1:-1;35270:28:0;;35126:110;35270:19;:28::i;35550:779::-;35653:23;35678:12;35692:18;35714:20;35726:7;35714:11;:20::i;:::-;35652:82;;;;;;35745:19;35767:10;:8;:10::i;:::-;35745:32;;35789:15;35806:23;35831:12;35847:51;35859:7;35868:4;35874:10;35886:11;35847;:51::i;:::-;-1:-1:-1;;;;;35929:15:0;;;;;;:7;:15;;;;;;35788:110;;-1:-1:-1;35788:110:0;;-1:-1:-1;35788:110:0;-1:-1:-1;35929:28:0;;35949:7;35929:19;:28::i;:::-;-1:-1:-1;;;;;35911:15:0;;;;;;:7;:15;;;;;;;;:46;;;;35986:7;:15;;;;:28;;36006:7;35986:19;:28::i;28306:333::-;28418:1;28407:7;:12;28403:29;;28306:333;;;:::o;28403:29::-;28444:15;28462:24;:7;28474:11;28462;:24::i;:::-;-1:-1:-1;;;;;28511:11:0;;;;;;:7;:11;;;;;;28444:42;;-1:-1:-1;28511:24:0;;28444:42;28511:15;:24::i;:::-;-1:-1:-1;;;;;28497:11:0;;;;;;:7;:11;;;;;;;;:38;;;;28550:11;:15;;;;;;28546:86;;;-1:-1:-1;;;;;28596:11:0;;;;;;:7;:11;;;;;;:24;;28612:7;28596:15;:24::i;:::-;-1:-1:-1;;;;;28582:11:0;;;;;;:7;:11;;;;;:38;28546:86;28392:247;28306:333;;;:::o;26526:150::-;26607:7;;:17;;26619:4;26607:11;:17::i;:::-;26594:7;:30;26648:10;;:20;;26663:4;26648:14;:20::i;:::-;26635:10;:33;-1:-1:-1;;26526:150:0:o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:548::-;311:4;340:2;369;358:9;351:21;401:6;395:13;444:6;439:2;428:9;424:18;417:34;469:1;479:140;493:6;490:1;487:13;479:140;;;588:14;;;584:23;;578:30;554:17;;;573:2;550:26;543:66;508:10;;479:140;;;483:3;668:1;663:2;654:6;643:9;639:22;635:31;628:42;738:2;731;727:7;722:2;714:6;710:15;706:29;695:9;691:45;687:54;679:62;;;;199:548;;;;:::o;752:131::-;-1:-1:-1;;;;;827:31:1;;817:42;;807:70;;873:1;870;863:12;888:315;956:6;964;1017:2;1005:9;996:7;992:23;988:32;985:52;;;1033:1;1030;1023:12;985:52;1072:9;1059:23;1091:31;1116:5;1091:31;:::i;:::-;1141:5;1193:2;1178:18;;;;1165:32;;-1:-1:-1;;;888:315:1:o;1582:456::-;1659:6;1667;1675;1728:2;1716:9;1707:7;1703:23;1699:32;1696:52;;;1744:1;1741;1734:12;1696:52;1783:9;1770:23;1802:31;1827:5;1802:31;:::i;:::-;1852:5;-1:-1:-1;1909:2:1;1894:18;;1881:32;1922:33;1881:32;1922:33;:::i;:::-;1582:456;;1974:7;;-1:-1:-1;;;2028:2:1;2013:18;;;;2000:32;;1582:456::o;2232:247::-;2291:6;2344:2;2332:9;2323:7;2319:23;2315:32;2312:52;;;2360:1;2357;2350:12;2312:52;2399:9;2386:23;2418:31;2443:5;2418:31;:::i;2484:160::-;2549:20;;2605:13;;2598:21;2588:32;;2578:60;;2634:1;2631;2624:12;2578:60;2484:160;;;:::o;2649:248::-;2714:6;2722;2775:2;2763:9;2754:7;2750:23;2746:32;2743:52;;;2791:1;2788;2781:12;2743:52;2827:9;2814:23;2804:33;;2856:35;2887:2;2876:9;2872:18;2856:35;:::i;:::-;2846:45;;2649:248;;;;;:::o;3137:315::-;3202:6;3210;3263:2;3251:9;3242:7;3238:23;3234:32;3231:52;;;3279:1;3276;3269:12;3231:52;3318:9;3305:23;3337:31;3362:5;3337:31;:::i;:::-;3387:5;-1:-1:-1;3411:35:1;3442:2;3427:18;;3411:35;:::i;3665:180::-;3721:6;3774:2;3762:9;3753:7;3749:23;3745:32;3742:52;;;3790:1;3787;3780:12;3742:52;3813:26;3829:9;3813:26;:::i;3850:388::-;3918:6;3926;3979:2;3967:9;3958:7;3954:23;3950:32;3947:52;;;3995:1;3992;3985:12;3947:52;4034:9;4021:23;4053:31;4078:5;4053:31;:::i;:::-;4103:5;-1:-1:-1;4160:2:1;4145:18;;4132:32;4173:33;4132:32;4173:33;:::i;:::-;4225:7;4215:17;;;3850:388;;;;;:::o;4243:356::-;4445:2;4427:21;;;4464:18;;;4457:30;4523:34;4518:2;4503:18;;4496:62;4590:2;4575:18;;4243:356::o;5007:127::-;5068:10;5063:3;5059:20;5056:1;5049:31;5099:4;5096:1;5089:15;5123:4;5120:1;5113:15;5139:422;5228:1;5271:5;5228:1;5285:270;5306:7;5296:8;5293:21;5285:270;;;5365:4;5361:1;5357:6;5353:17;5347:4;5344:27;5341:53;;;5374:18;;:::i;:::-;5424:7;5414:8;5410:22;5407:55;;;5444:16;;;;5407:55;5523:22;;;;5483:15;;;;5285:270;;;5289:3;5139:422;;;;;:::o;5566:806::-;5615:5;5645:8;5635:80;;-1:-1:-1;5686:1:1;5700:5;;5635:80;5734:4;5724:76;;-1:-1:-1;5771:1:1;5785:5;;5724:76;5816:4;5834:1;5829:59;;;;5902:1;5897:130;;;;5809:218;;5829:59;5859:1;5850:10;;5873:5;;;5897:130;5934:3;5924:8;5921:17;5918:43;;;5941:18;;:::i;:::-;-1:-1:-1;;5997:1:1;5983:16;;6012:5;;5809:218;;6111:2;6101:8;6098:16;6092:3;6086:4;6083:13;6079:36;6073:2;6063:8;6060:16;6055:2;6049:4;6046:12;6042:35;6039:77;6036:159;;;-1:-1:-1;6148:19:1;;;6180:5;;6036:159;6227:34;6252:8;6246:4;6227:34;:::i;:::-;6297:6;6293:1;6289:6;6285:19;6276:7;6273:32;6270:58;;;6308:18;;:::i;:::-;6346:20;;5566:806;-1:-1:-1;;;5566:806:1:o;6377:140::-;6435:5;6464:47;6505:4;6495:8;6491:19;6485:4;6464:47;:::i;6522:168::-;6595:9;;;6626;;6643:15;;;6637:22;;6623:37;6613:71;;6664:18;;:::i;6695:217::-;6735:1;6761;6751:132;;6805:10;6800:3;6796:20;6793:1;6786:31;6840:4;6837:1;6830:15;6868:4;6865:1;6858:15;6751:132;-1:-1:-1;6897:9:1;;6695:217::o;8098:127::-;8159:10;8154:3;8150:20;8147:1;8140:31;8190:4;8187:1;8180:15;8214:4;8211:1;8204:15;8230:128;8297:9;;;8318:11;;;8315:37;;;8332:18;;:::i;8363:127::-;8424:10;8419:3;8415:20;8412:1;8405:31;8455:4;8452:1;8445:15;8479:4;8476:1;8469:15;8495:135;8534:3;8555:17;;;8552:43;;8575:18;;:::i;:::-;-1:-1:-1;8622:1:1;8611:13;;8495:135::o;13675:125::-;13740:9;;;13761:10;;;13758:36;;;13774:18;;:::i;14945:251::-;15015:6;15068:2;15056:9;15047:7;15043:23;15039:32;15036:52;;;15084:1;15081;15074:12;15036:52;15116:9;15110:16;15135:31;15160:5;15135:31;:::i;15201:980::-;15463:4;15511:3;15500:9;15496:19;15542:6;15531:9;15524:25;15568:2;15606:6;15601:2;15590:9;15586:18;15579:34;15649:3;15644:2;15633:9;15629:18;15622:31;15673:6;15708;15702:13;15739:6;15731;15724:22;15777:3;15766:9;15762:19;15755:26;;15816:2;15808:6;15804:15;15790:29;;15837:1;15847:195;15861:6;15858:1;15855:13;15847:195;;;15926:13;;-1:-1:-1;;;;;15922:39:1;15910:52;;16017:15;;;;15982:12;;;;15958:1;15876:9;15847:195;;;-1:-1:-1;;;;;;;16098:32:1;;;;16093:2;16078:18;;16071:60;-1:-1:-1;;;16162:3:1;16147:19;16140:35;16059:3;15201:980;-1:-1:-1;;;15201:980:1:o;16798:306::-;16886:6;16894;16902;16955:2;16943:9;16934:7;16930:23;16926:32;16923:52;;;16971:1;16968;16961:12;16923:52;17000:9;16994:16;16984:26;;17050:2;17039:9;17035:18;17029:25;17019:35;;17094:2;17083:9;17079:18;17073:25;17063:35;;16798:306;;;;;:::o

Swarm Source

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