ETH Price: $2,524.37 (+0.29%)

Token

Venom (VNM)
 

Overview

Max Total Supply

99,322,429,931.77250484254899807 VNM

Holders

436 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,313,846,920 VNM

Value
$0.00
0x03673792b5a8022ea32e38bb71fcf2ebf34ae780
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Venom (#VNM) is a hyper-deflationary token with unique rewards, true burn mechanics, and a strong community-driven ecosystem.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Venom

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license, Audited

Contract Source Code (Solidity)Audit Report

/**
 *Submitted for verification at Etherscan.io on 2022-12-10
*/

/**
Venom SmartContract 
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

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

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address owner) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transfer(address to, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint256);

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

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

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

    function price0CumulativeLast() external view returns (uint256);
    function price1CumulativeLast() external view returns (uint256);
    function kLast() external view returns (uint256);
    function mint(address to) external returns (uint256 liquidity);
    function burn(address to) external returns (uint256 amount0, uint256 amount1);

    function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;
    function initialize(address, address) external;
}

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint256) external view returns (address pair);
    function allPairsLength() external view returns (uint256);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 internal _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount,
                "ERC20: 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,
                "ERC20: decreased allowance below zero"));
        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount,"ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

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

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

        _balances[account] = _balances[account].sub(amount,"ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

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

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

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

interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(address _owner) external view returns (uint256);
    function withdrawnDividendOf(address _owner) external view returns (uint256);
    function accumulativeDividendOf(address _owner) external view returns (uint256);
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns (uint256);
    function distributeDividends() external payable;
    function withdrawDividend() external;

    event DividendsDistributed(address indexed from, uint256 weiAmount);
    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}

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

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

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

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

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

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

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

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

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

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract DividendPayingToken is ERC20, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;

    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;

    constructor(string memory _name, string memory _symbol)
        ERC20(_name, _symbol)
    {}

    receive() external payable {
        distributeDividends();
    }

    function distributeDividends() public payable override {
        require(totalSupply() > 0);

        if (msg.value > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (msg.value).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, msg.value);

            totalDividendsDistributed = totalDividendsDistributed.add(
                msg.value
            );
        }
    }

    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user) internal virtual returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            (bool success, ) = user.call{value: _withdrawableDividend, gas: 3000}("");

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    function dividendOf(address _owner) public view override returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(address _owner) public view override returns (uint256) {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    function withdrawnDividendOf(address _owner) public view override returns (uint256) {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(address _owner) public view override returns (uint256) {
        return
            magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
            .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
    }

    function _transfer(address from, address to, uint256 value) internal virtual override {
        require(false);

        int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);

        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } 
        else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }
}

contract Venom is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    bool private swapping;
    bool public tradingEnabled = false;

    uint256 public sellAmount = 1;
    uint256 public buyAmount = 1;

    uint256 private totalSellFees;
    uint256 private totalBuyFees;

    VenomDividendTracker public dividendTracker;

    address payable public marketingWallet;

    // Max tx, dividend threshold and tax variables
    uint256 public maxWallet;
    uint256 public maxTX;
    uint256 public swapTokensAtAmount;
    uint256 public sellRewardsFee;
    uint256 public sellDeadFees;
    uint256 public sellMarketingFees;
    uint256 public sellLiquidityFee;
    uint256 public buyDeadFees;
    uint256 public buyMarketingFees;
    uint256 public buyLiquidityFee;
    uint256 public buyRewardsFee;
    uint256 public transferFee;

    bool public swapAndLiquifyEnabled = true;

    uint256 public gasForProcessing = 500000;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) private canTransferBeforeTradingIsEnabled;
    mapping(address => uint256) private tokensVesting;
    mapping(address => bool) private _isVesting;
    mapping(address => uint256) private _vestingTimestamp;
    mapping(address => bool) private _diamondHands;
    mapping(address => bool) private _multiplier;
    mapping(address => uint256) private _holderBuy1Timestamp;
    mapping(address => uint256) private _holderBuy2Timestamp;
    uint256 private minimumForDiamondHands;

    // Limit variables for bot protection
    bool public limitsInEffect = true; //boolean used to turn limits on and off
    uint256 private gasPriceLimit; 
    mapping(address => uint256) private _holderLastTransferBlock; // for 1 tx per block
    mapping(address => uint256) private _holderLastTransferTimestamp; // for sell cooldown timer
    mapping(address => uint256) private _holderFirstBuyTimestamp;
    
   
    
    uint256 public launchblock;
    uint256 public launchtimestamp;
    
    uint256 public delay;
    uint256 public cooldowntimer = 60; //default cooldown 60s

    event EnableSwapAndLiquify(bool enabled);
    event SetPreSaleWallet(address wallet);
    event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress);
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event TradingEnabled();
    event UpdateFees(uint256 sellDeadFees, uint256 sellMarketingFees, uint256 sellLiquidityFee, uint256 sellRewardsFee,
                     uint256 buyDeadFees, uint256 buyMarketingFees, uint256 buyLiquidityFee, uint256 buyRewardsFee);

    event UpdateTransferFee(uint256 transferFee);
    event Airdrop(address holder, uint256 amount);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    event SendDividends(uint256 amount, uint256 opAmount, bool success);
    event ProcessedDividendTracker(uint256 iterations, uint256 claims, uint256 lastProcessedIndex,
                                   bool indexed automatic, uint256 gas);

    event UpdatePayoutToken(address token);

    constructor() ERC20("Venom", "VNM") {
        marketingWallet = payable(0xB4ba72b728248Ba8caC7f1A8f560324340a6c239);
        address router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

        buyDeadFees = 2;
        sellDeadFees = 2;
        buyMarketingFees = 2;
        sellMarketingFees = 2;
        buyLiquidityFee = 0;
        sellLiquidityFee = 0;
        buyRewardsFee = 2;
        sellRewardsFee = 2;
        transferFee = 1;

        totalBuyFees = buyRewardsFee.add(buyLiquidityFee).add(buyMarketingFees);
        totalSellFees = sellRewardsFee.add(sellLiquidityFee).add(sellMarketingFees);

        dividendTracker = new VenomDividendTracker(payable(this), router, address(this),
                                                   "VenomTRACKER", "VNMTRACKER");

        uniswapV2Router = IUniswapV2Router02(router);
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this),
                uniswapV2Router.WETH()
            );

        _setAutomatedMarketMakerPair(uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(DEAD);
        dividendTracker.excludedFromDividends(address(0));
        dividendTracker.excludeFromDividends(router);
        dividendTracker.excludeFromDividends(marketingWallet);
        dividendTracker.excludeFromDividends(owner());

        // exclude from paying fees or having max transaction amount
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(dividendTracker)] = true;
        _isExcludedFromFees[address(marketingWallet)] = true;
        _isExcludedFromFees[msg.sender] = true;

        uint256 totalTokenSupply = (100_000_000_000) * (10**18);
        _mint(owner(), totalTokenSupply); // only time internal mint function is ever called is to create supply
        swapTokensAtAmount = totalTokenSupply / 2000; // 0.05%
        minimumForDiamondHands = totalTokenSupply / 2000; // 0.05%
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[address(this)] = true;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    receive() external payable {}

    // writeable function to enable trading, can only enable, trading can never be disabled
    function enableTrading(uint256 initialMaxGwei, uint256 initialMaxWallet, uint256 initialMaxTX,
                           uint256 setDelay) external onlyOwner {
        initialMaxWallet = initialMaxWallet * (10**18);
        initialMaxTX = initialMaxTX * (10**18);
        require(!tradingEnabled);
        require(initialMaxWallet >= _totalSupply / 1000,"cannot set below 0.1%");
        require(initialMaxTX >= _totalSupply / 1000,"cannot set below 0.1%");
        maxWallet = initialMaxWallet;
        maxTX = initialMaxTX;
        gasPriceLimit = initialMaxGwei * 1 gwei;
        tradingEnabled = true;
        launchblock = block.number;
        launchtimestamp = block.timestamp;
        delay = setDelay;
        emit TradingEnabled();
    }
    // use for pre sale wallet, adds all exclusions to it
    function setPresaleWallet(address wallet) external onlyOwner {
        canTransferBeforeTradingIsEnabled[wallet] = true;
        _isExcludedFromFees[wallet] = true;
        dividendTracker.excludeFromDividends(wallet);
        emit SetPreSaleWallet(wallet);
    }
    
    // exclude a wallet from fees 
    function setExcludeFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    // exclude from dividends (rewards)
    function setExcludeDividends(address account) public onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // include in dividends 
    function setIncludeDividends(address account) public onlyOwner {
        dividendTracker.includeFromDividends(account);
        dividendTracker.setBalance(account, getMultiplier(account));
    }

    //allow a wallet to trade before trading enabled
    function setCanTransferBefore(address wallet, bool enable) external onlyOwner {
        canTransferBeforeTradingIsEnabled[wallet] = enable;
    }

    // turn limits on and off
    function setLimitsInEffect(bool value) external onlyOwner {
        limitsInEffect = value;
    }

    // set max GWEI
    function setGasPriceLimit(uint256 GWEI) external onlyOwner {
        require(GWEI >= 50, "can never be set lower than 50");
        gasPriceLimit = GWEI * 1 gwei;
    }

    // set cooldown timer, can only be between 0 and 300 seconds (5 mins max)
    function setcooldowntimer(uint256 value) external onlyOwner {
        require(value <= 300, "cooldown timer cannot exceed 5 minutes");
        cooldowntimer = value;
    }

    // set max wallet, can not be lower than 0.1% of supply
    function setmaxWallet(uint256 value) external onlyOwner {
        value = value * (10**18);
        require(value >= _totalSupply / 1000, "max wallet cannot be set to less than 0.1%");
        maxWallet = value;
    }

    // in case any ETH gets stuck in the contract
    function Sweep() external onlyOwner {
        uint256 amountETH = address(this).balance;
        payable(msg.sender).transfer(amountETH);
    }

    // set max tx, can not be lower than 0.1% of supply
    function setmaxTX(uint256 value) external onlyOwner {
        value = value * (10**18);
        require(value >= _totalSupply / 1000, "max tx cannot be set to less than 0.1%");
        maxTX = value;
    }

    function setMinimumForDiamondHands (uint256 value) external onlyOwner {
        value = value * (10**18);
        require(value <= _totalSupply / 2000, "cannot be set to more than 0.05%");
        minimumForDiamondHands = value;
    }

    // rewards threshold
    function setSwapTriggerAmount(uint256 amount) public onlyOwner {
        swapTokensAtAmount = amount * (10**18);
    }

    function enableSwapAndLiquify(bool enabled) public onlyOwner {
        require(swapAndLiquifyEnabled != enabled);
        swapAndLiquifyEnabled = enabled;
        emit EnableSwapAndLiquify(enabled);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        _setAutomatedMarketMakerPair(pair, value);
    }

    function setAllowCustomTokens(bool allow) public onlyOwner {
        dividendTracker.setAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) public onlyOwner {
        dividendTracker.setAllowAutoReinvest(allow);
    }

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

        if (value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200000 && newValue <= 5000000);
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function transferAdmin(address newOwner) public onlyOwner {
        dividendTracker.excludeFromDividends(newOwner);
        _isExcludedFromFees[newOwner] = true;
        transferOwnership(newOwner);
    }

    function updateTransferFee(uint256 newTransferFee) public onlyOwner {
        require (newTransferFee <= 5, "transfer fee cannot exceed 5%");
        transferFee = newTransferFee;
        emit UpdateTransferFee(transferFee);
    }

    function updateRewardsMultiplier() external {
        if (!_multiplier[msg.sender]) {
                    _multiplier[msg.sender] = true;
                }
        dividendTracker.setBalance(msg.sender, getMultiplier(msg.sender));
    }

    function updateFees(uint256 deadBuy, uint256 deadSell, uint256 marketingBuy, uint256 marketingSell,
                        uint256 liquidityBuy, uint256 liquiditySell, uint256 RewardsBuy,
                        uint256 RewardsSell) public onlyOwner {
        
        buyDeadFees = deadBuy;
        buyMarketingFees = marketingBuy;
        buyLiquidityFee = liquidityBuy;
        buyRewardsFee = RewardsBuy;
        sellDeadFees = deadSell;
        sellMarketingFees = marketingSell;
        sellLiquidityFee = liquiditySell;
        sellRewardsFee = RewardsSell;

        totalSellFees = sellRewardsFee.add(sellLiquidityFee).add(sellMarketingFees);

        totalBuyFees = buyRewardsFee.add(buyLiquidityFee).add(buyMarketingFees);
        require(deadBuy <= 3 && deadSell <= 3, "burn fees cannot exceed 3%");
        require(totalSellFees <= 10 && totalBuyFees <= 10, "total fees cannot exceed 10%");

        emit UpdateFees(sellDeadFees, sellMarketingFees, sellLiquidityFee, sellRewardsFee, buyDeadFees,
                        buyMarketingFees, buyLiquidityFee, buyRewardsFee);
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

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

    function withdrawableDividendOf(address account) public view returns (uint256) {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account) public view returns (uint256) {
        return dividendTracker.balanceOf(account);
    }

    function getAccountDividendsInfo(address account) external view returns (address, int256, int256, uint256,
                                                                             uint256, uint256) {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index) external view returns (address, int256, int256,
                                                                                  uint256, uint256, uint256) {
        return dividendTracker.getAccountAtIndex(index);
    }

    function processDividendTracker(uint256 gas) external {
        (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas);
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    function setAutoClaim(bool value) external {
        dividendTracker.setAutoClaim(msg.sender, value);
    }

    function setReinvest(bool value) external {
        dividendTracker.setReinvest(msg.sender, value);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        dividendTracker.setDividendsPaused(value);
    }

    function isExcludedFromAutoClaim(address account) external view returns (bool) {
        return dividendTracker.isExcludedFromAutoClaim(account);
    }

    function isReinvest(address account) external view returns (bool) {
        return dividendTracker.isReinvest(account);
    }

    function _transfer(address from, address to, uint256 amount) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        uint256 RewardsFee;
        uint256 deadFees;
        uint256 marketingFees;
        uint256 liquidityFee;

        if (!canTransferBeforeTradingIsEnabled[from]) {
            require(tradingEnabled, "Trading has not yet been enabled");
        }
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        } 

        if (_isVesting[from]) {
            if (block.timestamp < _vestingTimestamp[from] + 5 minutes) {
                require(balanceOf(from) - amount >= tokensVesting[from], "cant sell vested tokens");
            }
            else {
                tokensVesting[from] = 0;
                _isVesting[from] = false;
            }
        }

        
        else if (!swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            bool isSelling = automatedMarketMakerPairs[to];
            bool isBuying = automatedMarketMakerPairs[from];

            if (!isBuying && !isSelling) {
                if (!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                    uint256 tFees = amount.mul(transferFee).div(100);
                    amount = amount.sub(tFees);
                    super._transfer(from, address(this), tFees);
                    super._transfer(from, to, amount);
                    dividendTracker.setBalance(from, getMultiplier(from));
                    dividendTracker.setBalance(to, getMultiplier(to));
                    _diamondHands[from] = false;
                    _multiplier[from] = false;
                    _holderFirstBuyTimestamp[from] = block.timestamp;
                    return;
                }
                else {
                    super._transfer(from, to, amount);
                    dividendTracker.setBalance(from, getMultiplier(from));
                    dividendTracker.setBalance(to, getMultiplier(to));
                    _diamondHands[from] = false;
                    _multiplier[from] = false;
                    _holderFirstBuyTimestamp[from] = block.timestamp;
                    return;
                }
            }

            else if (isSelling) {
                if (amount >= minimumForDiamondHands) {
                    RewardsFee = 8;
                }
                else {
                    RewardsFee = sellRewardsFee;
                }
                deadFees = sellDeadFees;
                marketingFees = sellMarketingFees;
                liquidityFee = sellLiquidityFee;

                if (limitsInEffect) {
                require(block.timestamp >= _holderLastTransferTimestamp[from] + cooldowntimer,
                        "cooldown period active");
                require(amount <= maxTX,"above max transaction limit");
                _holderLastTransferTimestamp[from] = block.timestamp;

                }
                _diamondHands[from] = false;
                _multiplier[from] = false;
                _holderFirstBuyTimestamp[from] = block.timestamp;


            } else if (isBuying) {

                if (_diamondHands[to]) {
                    if (block.timestamp >= _holderBuy1Timestamp[to] + 1 days && balanceOf(to) >= minimumForDiamondHands) {
                        super._transfer(from, to, amount);
                        dividendTracker.setBalance(from, getMultiplier(from));
                        dividendTracker.setBalance(to, getMultiplier(to));
                        return;
                    }
                }

                if (!_multiplier[to]) {
                    _multiplier[to] = true;
                    _holderFirstBuyTimestamp[to] = block.timestamp;
                }

                if (!_diamondHands[to]) {
                    _diamondHands[to] = true;
                    _holderBuy1Timestamp[to] = block.timestamp;
                }

                RewardsFee = buyRewardsFee;
                deadFees = buyDeadFees;
                marketingFees = buyMarketingFees;
                liquidityFee = buyLiquidityFee;

                if (limitsInEffect) {
                require(block.timestamp > launchtimestamp + delay,"you shall not pass");
                require(tx.gasprice <= gasPriceLimit,"Gas price exceeds limit.");
                require(_holderLastTransferBlock[to] != block.number,"Too many TX in block");
                require(amount <= maxTX,"above max transaction limit");
                _holderLastTransferBlock[to] = block.number;
                }

                uint256 contractBalanceRecipient = balanceOf(to);
                require(contractBalanceRecipient + amount <= maxWallet,"Exceeds maximum wallet token amount." );
            }

            uint256 totalFees = RewardsFee.add(liquidityFee + marketingFees);

            uint256 contractTokenBalance = balanceOf(address(this));

            bool canSwap = contractTokenBalance >= swapTokensAtAmount;

            if (canSwap && isSelling) {
                swapping = true;

                if (swapAndLiquifyEnabled && liquidityFee > 0 && totalBuyFees > 0) {
                    uint256 totalBuySell = buyAmount.add(sellAmount);
                    uint256 swapAmountBought = contractTokenBalance.mul(buyAmount).div(totalBuySell);
                    uint256 swapAmountSold = contractTokenBalance.mul(sellAmount).div(totalBuySell);
                    uint256 swapBuyTokens = swapAmountBought.mul(liquidityFee).div(totalBuyFees);
                    uint256 swapSellTokens = swapAmountSold.mul(liquidityFee).div(totalSellFees);
                    uint256 swapTokens = swapSellTokens.add(swapBuyTokens);

                    swapAndLiquify(swapTokens);
                }

                uint256 remainingBalance = balanceOf(address(this));
                swapAndSendDividends(remainingBalance);
                buyAmount = 1;
                sellAmount = 1;
                swapping = false;
            }

            uint256 fees = amount.mul(totalFees).div(100);
            uint256 burntokens;

            if (deadFees > 0) {
            burntokens = amount.mul(deadFees) / 100;
            super._transfer(from, DEAD, burntokens);
            _totalSupply = _totalSupply.sub(burntokens);

            }

            amount = amount.sub(fees + burntokens);

            if (isSelling) {
                sellAmount = sellAmount.add(fees);
            } 
            else {
                buyAmount = buyAmount.add(fees);
            }

            super._transfer(from, address(this), fees);

            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas);
            } catch {}
        }

        super._transfer(from, to, amount);
        dividendTracker.setBalance(from, getMultiplier(from));
        dividendTracker.setBalance(to, getMultiplier(to));
    }

    function getMultiplier(address account) private view returns (uint256) {
        uint256 multiplier;
        if (_multiplier[account] && block.timestamp > _holderFirstBuyTimestamp[account] + 1 weeks && 
            block.timestamp < _holderFirstBuyTimestamp[account] + 2 weeks) {
            multiplier = balanceOf(account).mul(3);
        }
        else if (_multiplier[account] && block.timestamp > _holderFirstBuyTimestamp[account] + 2 weeks && 
                 block.timestamp < _holderFirstBuyTimestamp[account] + 3 weeks) {
                     multiplier = balanceOf(account).mul(5);
        }
        else if (_multiplier[account] && block.timestamp > _holderFirstBuyTimestamp[account] + 3 weeks) {
                     multiplier = balanceOf(account).mul(7);
        }
        else {
            multiplier = balanceOf(account);
        }
        
        return
                multiplier;
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered
        uint256 newBalance = address(this).balance.sub(initialBalance);
        addLiquidity(otherHalf, newBalance);
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function updatePayoutToken(address token) public onlyOwner {
        dividendTracker.updatePayoutToken(token);
        emit UpdatePayoutToken(token);
    }

    function getPayoutToken() public view returns (address) {
        return dividendTracker.getPayoutToken();
    }

    function setMinimumTokenBalanceForAutoDividends(uint256 value) public onlyOwner {
        dividendTracker.setMinimumTokenBalanceForAutoDividends(value);
    }

    function setMinimumTokenBalanceForDividends(uint256 value) public onlyOwner {
        dividendTracker.setMinimumTokenBalanceForDividends(value);
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    function forceSwapAndSendDividends(uint256 tokens) public onlyOwner {
        tokens = tokens * (10**18);
        uint256 totalAmount = buyAmount.add(sellAmount);
        uint256 fromBuy = tokens.mul(buyAmount).div(totalAmount);
        uint256 fromSell = tokens.mul(sellAmount).div(totalAmount);

        swapAndSendDividends(tokens);

        buyAmount = buyAmount.sub(fromBuy);
        sellAmount = sellAmount.sub(fromSell);
    }

    function swapAndSendDividends(uint256 tokens) private {
        if (tokens == 0) {
            return;
        }
        swapTokensForEth(tokens);
        uint256 totalAmount = buyAmount.add(sellAmount);

        bool success = true;
        bool successOp1 = true;

        uint256 dividends;
        uint256 dividendsFromBuy;
        uint256 dividendsFromSell;

        if (buyRewardsFee > 0) {
            dividendsFromBuy = address(this).balance.mul(buyAmount).div(totalAmount)
            .mul(buyRewardsFee).div(buyRewardsFee + buyMarketingFees);
        }
        if (sellRewardsFee > 0) {
            dividendsFromSell = address(this).balance.mul(sellAmount).div(totalAmount)
            .mul(sellRewardsFee).div(sellRewardsFee + sellMarketingFees);
        }
        dividends = dividendsFromBuy.add(dividendsFromSell);

        if (dividends > 0) {
            (success, ) = address(dividendTracker).call{value: dividends}("");
        }
        
        uint256 _completeFees = sellMarketingFees + buyMarketingFees;

        uint256 feePortions;
        if (_completeFees > 0) {
            feePortions = address(this).balance.div(_completeFees);
        }
        uint256 marketingPayout = buyMarketingFees.add(sellMarketingFees).mul(feePortions);

        if (marketingPayout > 0) {
            (successOp1, ) = address(marketingWallet).call{value: marketingPayout}("");
        }

        emit SendDividends(dividends, marketingPayout, success && successOp1);
    }

    function airdropToWallets(
        address[] memory airdropWallets,
        uint256[] memory amount
    ) external onlyOwner {
        require(airdropWallets.length == amount.length,"Arrays must be the same length");
        require(airdropWallets.length <= 200, "Wallets list length must be <= 200");
        for (uint256 i = 0; i < airdropWallets.length; i++) {
            address wallet = airdropWallets[i];
            uint256 airdropAmount = amount[i] * (10**18);
            super._transfer(msg.sender, wallet, airdropAmount);
            dividendTracker.setBalance(payable(wallet), getMultiplier(wallet));
        }
    }

    function airdropToWalletsAndVest(
        address[] memory airdropWallets,
        uint256[] memory amount
    ) external onlyOwner {
        require(airdropWallets.length == amount.length, "Arrays must be the same length");
        require(airdropWallets.length <= 200, "Wallets list length must be <= 200");
        for (uint256 i = 0; i < airdropWallets.length; i++) {
            address wallet = airdropWallets[i];
            uint256 airdropAmount = amount[i] * (10**18);
            super._transfer(msg.sender, wallet, airdropAmount);
            dividendTracker.setBalance(payable(wallet), getMultiplier(wallet));
            tokensVesting[wallet] = airdropAmount;
            _isVesting[wallet] = true;
            _vestingTimestamp[wallet] = block.timestamp;
        }
    }
}

contract VenomDividendTracker is DividendPayingToken, Ownable {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;
    mapping(address => bool) public excludedFromAutoClaim;
    mapping(address => bool) public autoReinvest;
    address public defaultToken;
    bool public allowCustomTokens;
    bool public allowAutoReinvest;
    bool public dividendsPaused = false;

    string private trackerName;
    string private trackerTicker;

    IUniswapV2Router02 public uniswapV2Router;

    Venom public VenomContract;

    mapping(address => uint256) public lastClaimTimes;

    uint256 private minimumTokenBalanceForAutoDividends;
    uint256 private minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event DividendReinvested(address indexed acount, uint256 value, bool indexed automatic);
    event Claim(address indexed account, uint256 amount, bool indexed automatic);
    event DividendsPaused(bool paused);
    event SetAllowCustomTokens(bool allow);
    event SetAllowAutoReinvest(bool allow);

    constructor(address payable mainContract, address router, address token, string memory _name,
                string memory _ticker) DividendPayingToken(_name, _ticker) {
        
        trackerName = _name;
        trackerTicker = _ticker;
        defaultToken = token;
        VenomContract = Venom(mainContract);
        minimumTokenBalanceForAutoDividends = 1_000000000000000000; // 1 token
        minimumTokenBalanceForDividends = minimumTokenBalanceForAutoDividends;

        uniswapV2Router = IUniswapV2Router02(router);
        allowCustomTokens = true;
        allowAutoReinvest = false;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function name() public view virtual override returns (string memory) {
        return trackerName;
    }

    function symbol() public view virtual override returns (string memory) {
        return trackerTicker;
    }

    function _transfer(address, address, uint256) internal pure override {
        require(false, "No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(false, "withdrawDividend disabled. Use the 'claim' function on the main Venom contract.");
    }

    function isExcludedFromAutoClaim(address account) external view onlyOwner returns (bool) {
        return excludedFromAutoClaim[account];
    }

    function isReinvest(address account) external view onlyOwner returns (bool) {
        return autoReinvest[account];
    }

    function setAllowCustomTokens(bool allow) external onlyOwner {
        require(allowCustomTokens != allow);
        allowCustomTokens = allow;
        emit SetAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) external onlyOwner {
        require(allowAutoReinvest != allow);
        allowAutoReinvest = allow;
        emit SetAllowAutoReinvest(allow);
    }

    function excludeFromDividends(address account) external onlyOwner {
        //require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;

        _setBalance(account, 0);
        tokenHoldersMap.remove(account);

        emit ExcludeFromDividends(account);
    }

    function includeFromDividends(address account) external onlyOwner {
        excludedFromDividends[account] = false;
    }

    function setAutoClaim(address account, bool value) external onlyOwner {
        excludedFromAutoClaim[account] = value;
    }

    function setReinvest(address account, bool value) external onlyOwner {
        autoReinvest[account] = value;
    }

    function setMinimumTokenBalanceForAutoDividends(uint256 value) external onlyOwner {
        minimumTokenBalanceForAutoDividends = value * (10**18);
    }

    function setMinimumTokenBalanceForDividends(uint256 value) external onlyOwner {
        minimumTokenBalanceForDividends = value * (10**18);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        require(dividendsPaused != value);
        dividendsPaused = value;
        emit DividendsPaused(value);
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getAccount(address _account) public view returns (address account, int256 index, int256 iterationsUntilProcessed,
                                                               uint256 withdrawableDividends, uint256 totalDividends,
                                                               uint256 lastClaimTime) {
        account = _account;
        index = tokenHoldersMap.getIndexOfKey(account);
        iterationsUntilProcessed = -1;

        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            } 
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length >
                    lastProcessedIndex
                    ? tokenHoldersMap.keys.length.sub(lastProcessedIndex)
                    : 0;

                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }

        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];
    }

    function getAccountAtIndex(uint256 index) public view returns (address, int256, int256, uint256,
                                                                   uint256, uint256) {
        if (index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function setBalance(address account, uint256 newBalance) external onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }

        if (newBalance < minimumTokenBalanceForDividends) {
            tokenHoldersMap.remove(account);
            _setBalance(account, 0);

            return;
        }

        _setBalance(account, newBalance);

        if (newBalance >= minimumTokenBalanceForAutoDividends) {
            tokenHoldersMap.set(account, newBalance);
        } 
        else {
            tokenHoldersMap.remove(account);
        }
    }

    function process(uint256 gas) public returns (uint256, uint256, uint256)
    {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if (numberOfTokenHolders == 0 || dividendsPaused) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if (_lastProcessedIndex >= numberOfTokenHolders) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (!excludedFromAutoClaim[account]) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }

            iterations++;

            uint256 newGasLeft = gasleft();

            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic) public onlyOwner
        returns (bool)
    {
        if (dividendsPaused) {
            return false;
        }

        bool reinvest = autoReinvest[account];

        if (automatic && reinvest && !allowAutoReinvest) {
            return false;
        }

        uint256 amount = reinvest
            ? _reinvestDividendOfUser(account)
            : _withdrawDividendOfUser(account);

        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            if (reinvest) {
                emit DividendReinvested(account, amount, automatic);
            } 
            else {
                emit Claim(account, amount, automatic);
            }
            return true;
        }

        return false;
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function updatePayoutToken(address token) public onlyOwner {
        defaultToken = token;
    }

    function getPayoutToken() public view returns (address) {
        return defaultToken;
    }

    function _reinvestDividendOfUser(address account) private returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(account);
        if (_withdrawableDividend > 0) {
            bool success;

            withdrawnDividends[account] = withdrawnDividends[account].add(_withdrawableDividend);

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

            uint256 prevBalance = VenomContract.balanceOf(address(this));

            // make the swap
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{value: _withdrawableDividend}
                    (0, path, address(this), block.timestamp)
            {
                uint256 received = VenomContract.balanceOf(address(this)).sub(prevBalance);
                if (received > 0) {
                    success = true;
                    VenomContract.transfer(account, received);
                } 
                else {
                    success = false;
                }
            } catch {
                success = false;
            }

            if (!success) {
                withdrawnDividends[account] = withdrawnDividends[account].sub(_withdrawableDividend);
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    function _withdrawDividendOfUser(address payable user) internal override returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);

            address tokenAddress = defaultToken;
            bool success;

            if (tokenAddress == address(0)) {
                (success, ) = user.call{value: _withdrawableDividend, gas: 3000}("");
            } 
            else {
                address[] memory path = new address[](2);
                path[0] = uniswapV2Router.WETH();
                path[1] = tokenAddress;
                try
                    uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend}(0, path, user, block.timestamp)
                {
                    success = true;
                } catch {
                    success = false;
                }
            }

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
                return 0;
            } 
            else {
                emit DividendWithdrawn(user, _withdrawableDividend);
            }
            return _withdrawableDividend;
        }
        return 0;
    }
}

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) internal view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key) internal view returns (int256) {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index) internal view returns (address) {
        return map.keys[index];
    }

    function size(Map storage map) internal view returns (uint256) {
        return map.keys.length;
    }

    function set(Map storage map, address key, uint256 val) internal {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) internal {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Airdrop","type":"event"},{"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":"bool","name":"enabled","type":"bool"}],"name":"EnableSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","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":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"opAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"SetPreSaleWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellDeadFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDeadFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyRewardsFee","type":"uint256"}],"name":"UpdateFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"UpdatePayoutToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"transferFee","type":"uint256"}],"name":"UpdateTransferFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropWallets","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropWallets","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"airdropToWalletsAndVest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDeadFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldowntimer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract VenomDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"initialMaxGwei","type":"uint256"},{"internalType":"uint256","name":"initialMaxWallet","type":"uint256"},{"internalType":"uint256","name":"initialMaxTX","type":"uint256"},{"internalType":"uint256","name":"setDelay","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"forceSwapAndSendDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPayoutToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromAutoClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isReinvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchblock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchtimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDeadFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowAutoReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowCustomTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutoClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setCanTransferBefore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setDividendsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setExcludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"GWEI","type":"uint256"}],"name":"setGasPriceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setIncludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setLimitsInEffect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinimumForDiamondHands","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinimumTokenBalanceForAutoDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTriggerAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setcooldowntimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setmaxTX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setmaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"deadBuy","type":"uint256"},{"internalType":"uint256","name":"deadSell","type":"uint256"},{"internalType":"uint256","name":"marketingBuy","type":"uint256"},{"internalType":"uint256","name":"marketingSell","type":"uint256"},{"internalType":"uint256","name":"liquidityBuy","type":"uint256"},{"internalType":"uint256","name":"liquiditySell","type":"uint256"},{"internalType":"uint256","name":"RewardsBuy","type":"uint256"},{"internalType":"uint256","name":"RewardsSell","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"updatePayoutToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateRewardsMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTransferFee","type":"uint256"}],"name":"updateTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260088054600161ff0160a01b03191661dead17905560016009819055600a819055601b805460ff1990811683179091556207a120601c55602880549091169091179055603c6030553480156200005957600080fd5b506040518060400160405280600581526020016456656e6f6d60d81b81525060405180604001604052806003815260200162564e4d60e81b8152508160039081620000a5919062000b11565b506004620000b4828262000b11565b5050506000620000c96200081e60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e805473b4ba72b728248ba8cac7f1a8f560324340a6c2396001600160a01b031990911617905560026016819055601381905560178190556014819055600060188190556015819055601982905560128290556001601a55737a250d5630b4cf539739df2c5dacb4c659f2488d91620001b891620001a490829062000822602090811b62002bea17901c565b6200082260201b62002bea1790919060201c565b600c81905550620001e3601454620001a46015546012546200082260201b62002bea1790919060201c565b600b81905550308130604051620001fa9062000a5f565b6001600160a01b0393841681529183166020830152909116604082015260a060608201819052600c908201526b2b32b737b6aa2920a1a5a2a960a11b60c082015260e060808201819052600a90820152692b2726aa2920a1a5a2a960b11b61010082015261012001604051809103906000f0801580156200027f573d6000803e3d6000fd5b50600d80546001600160a01b039283166001600160a01b0319918216179091556006805492841692909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620002ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000310919062000bdd565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000373573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000399919062000bdd565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620003e7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200040d919062000bdd565b600780546001600160a01b0319166001600160a01b039290921691821790556200043990600162000892565b600d5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200048057600080fd5b505af115801562000495573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620004df57600080fd5b505af1158015620004f4573d6000803e3d6000fd5b5050600d5460085460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200054257600080fd5b505af115801562000557573d6000803e3d6000fd5b5050600d54604051634e7b827f60e01b8152600060048201526001600160a01b039091169250634e7b827f9150602401602060405180830381865afa158015620005a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cb919062000c08565b50600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b1580156200061457600080fd5b505af115801562000629573d6000803e3d6000fd5b5050600d54600e5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200067757600080fd5b505af11580156200068c573d6000803e3d6000fd5b5050600d546001600160a01b031691506331e79db09050620006b66005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620006f857600080fd5b505af11580156200070d573d6000803e3d6000fd5b5050306000908152601d60205260408082208054600160ff199182168117909255600d546001600160a01b0390811685528385208054831684179055600e5416845282842080548216831790553384529190922080549091169091179055506c01431e0fae6d7217caa000000090506200079a620007936005546001600160a01b031690565b826200095e565b620007a86107d08262000c2c565b601155620007b96107d08262000c2c565b6027556001601f6000620007d56005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055308152601f9092529020805490911660011790555062000c719050565b3390565b60008062000831838562000c4f565b905083811015620008895760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b90505b92915050565b6001600160a01b0382166000908152601e60205260409020805460ff191682158015919091179091556200092257600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200090857600080fd5b505af11580156200091d573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b038216620009b65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000880565b620009d2816002546200082260201b62002bea1790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a0591839062002bea62000822821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b613056806200596783390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000a9857607f821691505b60208210810362000ab957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a5a57600081815260208120601f850160051c8101602086101562000ae85750805b601f850160051c820191505b8181101562000b095782815560010162000af4565b505050505050565b81516001600160401b0381111562000b2d5762000b2d62000a6d565b62000b458162000b3e845462000a83565b8462000abf565b602080601f83116001811462000b7d576000841562000b645750858301515b600019600386901b1c1916600185901b17855562000b09565b600085815260208120601f198616915b8281101562000bae5788860151825594840194600190910190840162000b8d565b508582101562000bcd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000bf057600080fd5b81516001600160a01b03811681146200088957600080fd5b60006020828403121562000c1b57600080fd5b815180151581146200088957600080fd5b60008262000c4a57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200088c57634e487b7160e01b600052601160045260246000fd5b614ce68062000c816000396000f3fe6080604052600436106104c45760003560e01c806372d8edf411610276578063ad56c13c1161014f578063e2f45605116100c1578063f2f5ec3a11610085578063f2f5ec3a14610e88578063f2fde38b14610ea8578063f5d3c79a14610ec8578063f637434214610ee8578063f8b45b0514610efe578063fc6b151c14610f1457600080fd5b8063e2f4560514610e11578063e7841ec014610e27578063ebae7c1c14610e3c578063f11a24d314610e52578063f27fd25414610e6857600080fd5b8063bb8d513111610113578063bb8d513114610d35578063d07a091c14610d4b578063d5e3725114610d6b578063d8032ed314610d8b578063dd62ed3e14610dab578063e14a93d614610df157600080fd5b8063ad56c13c14610c58578063b494298814610caf578063b62496f514610cc5578063b74e3b1114610cf5578063ba079d4914610d1557600080fd5b806394564774116101e85780639c3372ea116101ac5780639c3372ea14610ba25780639ec1037e14610bc2578063a457c2d714610be2578063a8b9d24014610c02578063a9059cbb14610c22578063acb2ad6f14610c4257600080fd5b80639456477414610b2c57806395451c2914610b4157806395d89b4114610b575780639a7a23d614610b6c5780639c1b8af514610b8c57600080fd5b80638577a6d51161023a5780638577a6d514610a82578063868730c714610aa2578063871c128d14610ac25780638c3c82b214610ae25780638ca2923a14610af85780638da5cb5b14610b0e57600080fd5b806372d8edf4146109ec57806375829def14610a0c57806375f0a87414610a2c57806377a3b60914610a4c5780637fdde05c14610a6257600080fd5b80634a62bb65116103a857806364b0f6531161031a5780636d48467b116102de5780636d48467b14610942578063700bb191146109625780637088fb7f1461098257806370a082311461099757806370c8be13146109b7578063715018a6146109d757600080fd5b806364b0f653146108b757806366236b4a146108cc578063679ca6e9146108ec5780636843cd841461090c5780636a42b8f81461092c57600080fd5b80634fbee1931161036c5780634fbee193146107f25780635124f8741461082b5780635a84c5eb146108415780635c234bb6146108615780635ebf4db9146108775780635eee4bae1461089757600080fd5b80634a62bb65146107685780634a74bb02146107825780634ada218b1461079c5780634e71d92d146107bd5780634e974537146107d257600080fd5b80632307b44111610441578063313ce56711610405578063313ce567146106b65780633599bb17146106d257806339509351146106f25780633f407b841461071257806340ffdd801461072857806349bd5a5e1461074857600080fd5b80632307b4411461062c57806323b872dd1461064c57806325cd35981461066c5780632c1f52161461068157806330bb4cff146106a157600080fd5b8063095ea7b311610488578063095ea7b3146105915780631694505e146105c157806318160ddd146105e15780631d7b1fb4146106005780631fa705311461061657600080fd5b806303fd2a45146104d057806305ca5f081461050d57806306fdde031461052f57806308dfe8a514610551578063092316021461057157600080fd5b366104cb57005b600080fd5b3480156104dc57600080fd5b506008546104f0906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561051957600080fd5b5061052d61052836600461454b565b610f34565b005b34801561053b57600080fd5b50610544611005565b6040516105049190614564565b34801561055d57600080fd5b5061052d61056c3660046145d5565b611097565b34801561057d57600080fd5b5061052d61058c36600461454b565b611120565b34801561059d57600080fd5b506105b16105ac36600461460e565b6111af565b6040519015158152602001610504565b3480156105cd57600080fd5b506006546104f0906001600160a01b031681565b3480156105ed57600080fd5b506002545b604051908152602001610504565b34801561060c57600080fd5b506105f260305481565b34801561062257600080fd5b506105f2600a5481565b34801561063857600080fd5b5061052d610647366004614710565b6111c6565b34801561065857600080fd5b506105b16106673660046147d2565b61134d565b34801561067857600080fd5b506104f06113b6565b34801561068d57600080fd5b50600d546104f0906001600160a01b031681565b3480156106ad57600080fd5b506105f2611429565b3480156106c257600080fd5b5060405160128152602001610504565b3480156106de57600080fd5b5061052d6106ed366004614813565b611497565b3480156106fe57600080fd5b506105b161070d36600461460e565b611524565b34801561071e57600080fd5b506105f260095481565b34801561073457600080fd5b5061052d610743366004614813565b61155a565b34801561075457600080fd5b506007546104f0906001600160a01b031681565b34801561077457600080fd5b506028546105b19060ff1681565b34801561078e57600080fd5b50601b546105b19060ff1681565b3480156107a857600080fd5b506008546105b190600160a81b900460ff1681565b3480156107c957600080fd5b5061052d6115b5565b3480156107de57600080fd5b5061052d6107ed36600461454b565b61162d565b3480156107fe57600080fd5b506105b161080d366004614830565b6001600160a01b03166000908152601d602052604090205460ff1690565b34801561083757600080fd5b506105f260175481565b34801561084d57600080fd5b5061052d61085c36600461454b565b6116cf565b34801561086d57600080fd5b506105f260165481565b34801561088357600080fd5b5061052d61089236600461454b565b61172a565b3480156108a357600080fd5b5061052d6108b236600461454b565b611785565b3480156108c357600080fd5b506105f26117c7565b3480156108d857600080fd5b5061052d6108e736600461454b565b611811565b3480156108f857600080fd5b5061052d610907366004614813565b6118c2565b34801561091857600080fd5b506105f2610927366004614830565b6118ff565b34801561093857600080fd5b506105f2602f5481565b34801561094e57600080fd5b506105b161095d366004614830565b61196f565b34801561096e57600080fd5b5061052d61097d36600461454b565b6119df565b34801561098e57600080fd5b5061052d611aaf565b3480156109a357600080fd5b506105f26109b2366004614830565b611b0c565b3480156109c357600080fd5b5061052d6109d2366004614710565b611b27565b3480156109e357600080fd5b5061052d611cde565b3480156109f857600080fd5b5061052d610a07366004614830565b611d52565b348015610a1857600080fd5b5061052d610a27366004614830565b611dae565b348015610a3857600080fd5b50600e546104f0906001600160a01b031681565b348015610a5857600080fd5b506105f260195481565b348015610a6e57600080fd5b5061052d610a7d3660046145d5565b611e63565b348015610a8e57600080fd5b5061052d610a9d36600461454b565b611eb8565b348015610aae57600080fd5b5061052d610abd366004614813565b611f6f565b348015610ace57600080fd5b5061052d610add36600461454b565b611fa7565b348015610aee57600080fd5b506105f2602e5481565b348015610b0457600080fd5b506105f260135481565b348015610b1a57600080fd5b506005546001600160a01b03166104f0565b348015610b3857600080fd5b5061052d612023565b348015610b4d57600080fd5b506105f260145481565b348015610b6357600080fd5b506105446120c1565b348015610b7857600080fd5b5061052d610b873660046145d5565b6120d0565b348015610b9857600080fd5b506105f2601c5481565b348015610bae57600080fd5b5061052d610bbd366004614813565b612104565b348015610bce57600080fd5b5061052d610bdd366004614830565b612160565b348015610bee57600080fd5b506105b1610bfd36600461460e565b612223565b348015610c0e57600080fd5b506105f2610c1d366004614830565b612272565b348015610c2e57600080fd5b506105b1610c3d36600461460e565b6122a5565b348015610c4e57600080fd5b506105f2601a5481565b348015610c6457600080fd5b50610c78610c73366004614830565b6122b2565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610504565b348015610cbb57600080fd5b506105f2602d5481565b348015610cd157600080fd5b506105b1610ce0366004614830565b601e6020526000908152604090205460ff1681565b348015610d0157600080fd5b5061052d610d1036600461454b565b612342565b348015610d2157600080fd5b506105b1610d30366004614830565b6123d2565b348015610d4157600080fd5b506105f260125481565b348015610d5757600080fd5b5061052d610d66366004614830565b612405565b348015610d7757600080fd5b5061052d610d86366004614813565b6124fd565b348015610d9757600080fd5b5061052d610da6366004614830565b61257f565b348015610db757600080fd5b506105f2610dc636600461484d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610dfd57600080fd5b5061052d610e0c36600461487b565b612642565b348015610e1d57600080fd5b506105f260115481565b348015610e3357600080fd5b506105f26127c4565b348015610e4857600080fd5b506105f260105481565b348015610e5e57600080fd5b506105f260185481565b348015610e7457600080fd5b50610c78610e8336600461454b565b61280e565b348015610e9457600080fd5b5061052d610ea33660046148ad565b61284c565b348015610eb457600080fd5b5061052d610ec3366004614830565b612a12565b348015610ed457600080fd5b5061052d610ee3366004614813565b612afd565b348015610ef457600080fd5b506105f260155481565b348015610f0a57600080fd5b506105f2600f5481565b348015610f2057600080fd5b5061052d610f2f36600461454b565b612b35565b6005546001600160a01b03163314610f675760405162461bcd60e51b8152600401610f5e90614902565b60405180910390fd5b610f7981670de0b6b3a764000061494d565b90506000610f94600954600a54612bea90919063ffffffff16565b90506000610fb782610fb1600a5486612c5090919063ffffffff16565b90612cd2565b90506000610fd483610fb160095487612c5090919063ffffffff16565b9050610fdf84612d14565b600a54610fec9083612f39565b600a55600954610ffc9082612f39565b60095550505050565b60606003805461101490614964565b80601f016020809104026020016040519081016040528092919081815260200182805461104090614964565b801561108d5780601f106110625761010080835404028352916020019161108d565b820191906000526020600020905b81548152906001019060200180831161107057829003601f168201915b5050505050905090565b6005546001600160a01b031633146110c15760405162461bcd60e51b8152600401610f5e90614902565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461114a5760405162461bcd60e51b8152600401610f5e90614902565b603281101561119b5760405162461bcd60e51b815260206004820152601e60248201527f63616e206e6576657220626520736574206c6f776572207468616e20353000006044820152606401610f5e565b6111a981633b9aca0061494d565b60295550565b60006111bc338484612f7b565b5060015b92915050565b6005546001600160a01b031633146111f05760405162461bcd60e51b8152600401610f5e90614902565b80518251146112415760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610f5e565b60c8825111156112635760405162461bcd60e51b8152600401610f5e9061499e565b60005b8251811015611348576000838281518110611283576112836149e0565b6020026020010151905060008383815181106112a1576112a16149e0565b6020026020010151670de0b6b3a76400006112bc919061494d565b90506112c93383836130a0565b600d546001600160a01b031663e30443bc836112e4816131a9565b6040518363ffffffff1660e01b81526004016113019291906149f6565b600060405180830381600087803b15801561131b57600080fd5b505af115801561132f573d6000803e3d6000fd5b505050505050808061134090614a0f565b915050611266565b505050565b600061135a848484613338565b6113ac84336113a785604051806060016040528060288152602001614c64602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061418f565b612f7b565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa158015611400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114249190614a28565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611473573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114249190614a45565b6005546001600160a01b031633146114c15760405162461bcd60e51b8152600401610f5e90614902565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b15801561150957600080fd5b505af115801561151d573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916111bc9185906113a79086612bea565b6005546001600160a01b031633146115845760405162461bcd60e51b8152600401610f5e90614902565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd80906024016114ef565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162a9190614a5e565b50565b6005546001600160a01b031633146116575760405162461bcd60e51b8152600401610f5e90614902565b61166981670de0b6b3a764000061494d565b90506107d060025461167b9190614a7b565b8111156116ca5760405162461bcd60e51b815260206004820181905260248201527f63616e6e6f742062652073657420746f206d6f7265207468616e20302e3035256044820152606401610f5e565b602755565b6005546001600160a01b031633146116f95760405162461bcd60e51b8152600401610f5e90614902565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb906024016114ef565b6005546001600160a01b031633146117545760405162461bcd60e51b8152600401610f5e90614902565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db9906024016114ef565b6005546001600160a01b031633146117af5760405162461bcd60e51b8152600401610f5e90614902565b6117c181670de0b6b3a764000061494d565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611473573d6000803e3d6000fd5b6005546001600160a01b0316331461183b5760405162461bcd60e51b8152600401610f5e90614902565b61184d81670de0b6b3a764000061494d565b90506103e860025461185f9190614a7b565b8110156118bd5760405162461bcd60e51b815260206004820152602660248201527f6d61782074782063616e6e6f742062652073657420746f206c657373207468616044820152656e20302e312560d01b6064820152608401610f5e565b601055565b6005546001600160a01b031633146118ec5760405162461bcd60e51b8152600401610f5e90614902565b6028805460ff1916911515919091179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561194b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c09190614a45565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa1580156119bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c09190614a5e565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a569190614a9d565b60408051848152602081018490529081018290526060810188905292955090935091506000907f9dc81572b65340d35ebe017a23f2c72bc0c4364a633be553004be62a3eef54f79060800160405180910390a250505050565b6005546001600160a01b03163314611ad95760405162461bcd60e51b8152600401610f5e90614902565b6040514790339082156108fc029083906000818181858888f19350505050158015611b08573d6000803e3d6000fd5b5050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611b515760405162461bcd60e51b8152600401610f5e90614902565b8051825114611ba25760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610f5e565b60c882511115611bc45760405162461bcd60e51b8152600401610f5e9061499e565b60005b8251811015611348576000838281518110611be457611be46149e0565b602002602001015190506000838381518110611c0257611c026149e0565b6020026020010151670de0b6b3a7640000611c1d919061494d565b9050611c2a3383836130a0565b600d546001600160a01b031663e30443bc83611c45816131a9565b6040518363ffffffff1660e01b8152600401611c629291906149f6565b600060405180830381600087803b158015611c7c57600080fd5b505af1158015611c90573d6000803e3d6000fd5b5050506001600160a01b039092166000908152602080805260408083209390935560218152828220805460ff1916600117905560229052204290555080611cd681614a0f565b915050611bc7565b6005546001600160a01b03163314611d085760405162461bcd60e51b8152600401610f5e90614902565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611d7c5760405162461bcd60e51b8152600401610f5e90614902565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024016114ef565b6005546001600160a01b03163314611dd85760405162461bcd60e51b8152600401610f5e90614902565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611e1f57600080fd5b505af1158015611e33573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601d60205260409020805460ff191660011790555061162a81612a12565b6005546001600160a01b03163314611e8d5760405162461bcd60e51b8152600401610f5e90614902565b6001600160a01b03919091166000908152601f60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611ee25760405162461bcd60e51b8152600401610f5e90614902565b6005811115611f335760405162461bcd60e51b815260206004820152601d60248201527f7472616e73666572206665652063616e6e6f74206578636565642035250000006044820152606401610f5e565b601a8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d639906044016114ef565b6005546001600160a01b03163314611fd15760405162461bcd60e51b8152600401610f5e90614902565b62030d408110158015611fe75750624c4b408111155b611ff057600080fd5b601c5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601c55565b3360009081526024602052604090205460ff1661205557336000908152602460205260409020805460ff191660011790555b600d546001600160a01b031663e30443bc33612070816131a9565b6040518363ffffffff1660e01b815260040161208d9291906149f6565b600060405180830381600087803b1580156120a757600080fd5b505af11580156120bb573d6000803e3d6000fd5b50505050565b60606004805461101490614964565b6005546001600160a01b031633146120fa5760405162461bcd60e51b8152600401610f5e90614902565b611b0882826141c9565b6005546001600160a01b0316331461212e5760405162461bcd60e51b8152600401610f5e90614902565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea906024016114ef565b6005546001600160a01b0316331461218a5760405162461bcd60e51b8152600401610f5e90614902565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b1580156121d157600080fd5b505af11580156121e5573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905082612206816131a9565b6040518363ffffffff1660e01b81526004016114ef9291906149f6565b60006111bc33846113a785604051806060016040528060258152602001614c8c602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061418f565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161192e565b60006111bc338484613338565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa15801561230a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232e9190614acb565b949c939b5091995097509550909350915050565b6005546001600160a01b0316331461236c5760405162461bcd60e51b8152600401610f5e90614902565b61012c8111156123cd5760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b6064820152608401610f5e565b603055565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d499060240161199e565b6005546001600160a01b0316331461242f5760405162461bcd60e51b8152600401610f5e90614902565b6001600160a01b038181166000818152601f602090815260408083208054600160ff199182168117909255601d9093529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b1580156124ab57600080fd5b505af11580156124bf573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611f64565b6005546001600160a01b031633146125275760405162461bcd60e51b8152600401610f5e90614902565b601b5481151560ff90911615150361253e57600080fd5b601b805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001611f64565b6005546001600160a01b031633146125a95760405162461bcd60e51b8152600401610f5e90614902565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b1580156125f057600080fd5b505af1158015612604573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611f64565b6005546001600160a01b0316331461266c5760405162461bcd60e51b8152600401610f5e90614902565b61267e83670de0b6b3a764000061494d565b925061269282670de0b6b3a764000061494d565b600854909250600160a81b900460ff16156126ac57600080fd5b6103e86002546126bc9190614a7b565b8310156127035760405162461bcd60e51b815260206004820152601560248201527463616e6e6f74207365742062656c6f7720302e312560581b6044820152606401610f5e565b6103e86002546127139190614a7b565b82101561275a5760405162461bcd60e51b815260206004820152601560248201527463616e6e6f74207365742062656c6f7720302e312560581b6044820152606401610f5e565b600f839055601082905561277284633b9aca0061494d565b6029556008805460ff60a81b1916600160a81b17905543602d5542602e55602f8190556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150505050565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611473573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd906024016122ed565b6005546001600160a01b031633146128765760405162461bcd60e51b8152600401610f5e90614902565b601688905560178690556018849055601982905560138790556014859055601583905560128190556128b2856128ac8386612bea565b90612bea565b600b556017546018546019546128cd92916128ac9190612bea565b600c55600388118015906128e2575060038711155b61292e5760405162461bcd60e51b815260206004820152601a60248201527f6275726e20666565732063616e6e6f74206578636565642033250000000000006044820152606401610f5e565b600a600b54111580156129445750600a600c5411155b6129905760405162461bcd60e51b815260206004820152601c60248201527f746f74616c20666565732063616e6e6f742065786365656420313025000000006044820152606401610f5e565b601354601454601554601254601654601754601854601954604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201527f1640531881cbf0e2bf36c30fec3ed06b08e062adb13340f00fd16cedba09637a906101000160405180910390a15050505050505050565b6005546001600160a01b03163314612a3c5760405162461bcd60e51b8152600401610f5e90614902565b6001600160a01b038116612aa15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f5e565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a04906044016114ef565b6005546001600160a01b03163314612b5f5760405162461bcd60e51b8152600401610f5e90614902565b612b7181670de0b6b3a764000061494d565b90506103e8600254612b839190614a7b565b811015612be55760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b6064820152608401610f5e565b600f55565b600080612bf78385614b1e565b905083811015612c495760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610f5e565b9392505050565b600082600003612c62575060006111c0565b6000612c6e838561494d565b905082612c7b8583614a7b565b14612c495760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610f5e565b6000612c4983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614292565b80600003612d1f5750565b612d28816142c0565b6000612d41600954600a54612bea90919063ffffffff16565b60195490915060019081906000908190819015612d9357612d90601754601954612d6b9190614b1e565b610fb1601954612d8a8a610fb1600a5447612c5090919063ffffffff16565b90612c50565b91505b60125415612dd057612dcd601454601254612dae9190614b1e565b610fb1601254612d8a8a610fb160095447612c5090919063ffffffff16565b90505b612dda8282612bea565b92508215612e3a57600d546040516001600160a01b03909116908490600081818185875af1925050503d8060008114612e2f576040519150601f19603f3d011682016040523d82523d6000602084013e612e34565b606091505b50909550505b6000601754601454612e4c9190614b1e565b905060008115612e6357612e604783612cd2565b90505b6000612e8082612d8a601454601754612bea90919063ffffffff16565b90508015612ee057600e546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612ed5576040519150601f19603f3d011682016040523d82523d6000602084013e612eda565b606091505b50909750505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd086828a8015612f0d5750895b60408051938452602084019290925215159082015260600160405180910390a150505050505050505050565b6000612c4983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061418f565b6001600160a01b038316612fdd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f5e565b6001600160a01b03821661303e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f5e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166130c65760405162461bcd60e51b8152600401610f5e90614b31565b6001600160a01b0382166130ec5760405162461bcd60e51b8152600401610f5e90614b76565b61312981604051806060016040528060268152602001614c3e602691396001600160a01b038616600090815260208190526040902054919061418f565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546131589082612bea565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613093565b6001600160a01b038116600090815260246020526040812054819060ff1680156131f757506001600160a01b0383166000908152602c60205260409020546131f49062093a80614b1e565b42115b801561322757506001600160a01b0383166000908152602c60205260409020546132249062127500614b1e565b42105b156132415761323a6003612d8a85611b0c565b90506111c0565b6001600160a01b03831660009081526024602052604090205460ff16801561328d57506001600160a01b0383166000908152602c602052604090205461328a9062127500614b1e565b42115b80156132bd57506001600160a01b0383166000908152602c60205260409020546132ba90621baf80614b1e565b42105b156132d05761323a6005612d8a85611b0c565b6001600160a01b03831660009081526024602052604090205460ff16801561331c57506001600160a01b0383166000908152602c602052604090205461331990621baf80614b1e565b42115b1561332f5761323a6007612d8a85611b0c565b612c4983611b0c565b6001600160a01b03831661335e5760405162461bcd60e51b8152600401610f5e90614b31565b6001600160a01b0382166133845760405162461bcd60e51b8152600401610f5e90614b76565b6001600160a01b0383166000908152601f602052604081205481908190819060ff1661340357600854600160a81b900460ff166134035760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610f5e565b8460000361342057613417878760006130a0565b50505050505050565b6001600160a01b03871660009081526021602052604090205460ff161561351c576001600160a01b0387166000908152602260205260409020546134669061012c614b1e565b4210156134ec576001600160a01b03871660009081526020805260409020548561348f89611b0c565b6134999190614bb9565b10156134e75760405162461bcd60e51b815260206004820152601760248201527f63616e742073656c6c2076657374656420746f6b656e730000000000000000006044820152606401610f5e565b6140a5565b6001600160a01b03871660009081526020808052604080832083905560219091529020805460ff191690556140a5565b600854600160a01b900460ff1615801561354f57506001600160a01b0387166000908152601d602052604090205460ff16155b801561357457506001600160a01b0386166000908152601d602052604090205460ff16155b156140a5576001600160a01b038087166000908152601e602052604080822054928a16825290205460ff9182169116801580156135af575081155b15613885576001600160a01b0389166000908152601d602052604090205460ff161580156135f657506001600160a01b0388166000908152601d602052604090205460ff16155b1561375b5760006136176064610fb1601a548b612c5090919063ffffffff16565b90506136238882612f39565b97506136308a30836130a0565b61363b8a8a8a6130a0565b600d546001600160a01b031663e30443bc8b613656816131a9565b6040518363ffffffff1660e01b81526004016136739291906149f6565b600060405180830381600087803b15801561368d57600080fd5b505af11580156136a1573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508a6136c2816131a9565b6040518363ffffffff1660e01b81526004016136df9291906149f6565b600060405180830381600087803b1580156136f957600080fd5b505af115801561370d573d6000803e3d6000fd5b5050506001600160a01b03909a166000908152602360209081526040808320805460ff199081169091556024835281842080549091169055602c909152902042905550505050505050505050565b6137668989896130a0565b600d546001600160a01b031663e30443bc8a613781816131a9565b6040518363ffffffff1660e01b815260040161379e9291906149f6565b600060405180830381600087803b1580156137b857600080fd5b505af11580156137cc573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050896137ed816131a9565b6040518363ffffffff1660e01b815260040161380a9291906149f6565b600060405180830381600087803b15801561382457600080fd5b505af1158015613838573d6000803e3d6000fd5b5050506001600160a01b039099166000908152602360209081526040808320805460ff199081169091556024835281842080549091169055602c9091529020429055505050505050505050565b81156139de57602754871061389d57600895506138a3565b60125495505b601354601454601554602854929750909550935060ff161561399b576030546001600160a01b038a166000908152602b60205260409020546138e59190614b1e565b42101561392d5760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b6044820152606401610f5e565b60105487111561397f5760405162461bcd60e51b815260206004820152601b60248201527f61626f7665206d6178207472616e73616374696f6e206c696d697400000000006044820152606401610f5e565b6001600160a01b0389166000908152602b602052604090204290555b6001600160a01b0389166000908152602360209081526040808320805460ff199081169091556024835281842080549091169055602c9091529020429055613de1565b8015613de1576001600160a01b03881660009081526023602052604090205460ff1615613b35576001600160a01b038816600090815260256020526040902054613a2b9062015180614b1e565b4210158015613a445750602754613a4189611b0c565b10155b15613b3557613a548989896130a0565b600d546001600160a01b031663e30443bc8a613a6f816131a9565b6040518363ffffffff1660e01b8152600401613a8c9291906149f6565b600060405180830381600087803b158015613aa657600080fd5b505af1158015613aba573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905089613adb816131a9565b6040518363ffffffff1660e01b8152600401613af89291906149f6565b600060405180830381600087803b158015613b1257600080fd5b505af1158015613b26573d6000803e3d6000fd5b50505050505050505050505050565b6001600160a01b03881660009081526024602052604090205460ff16613b86576001600160a01b0388166000908152602460209081526040808320805460ff19166001179055602c90915290204290555b6001600160a01b03881660009081526023602052604090205460ff16613bd7576001600160a01b0388166000908152602360209081526040808320805460ff19166001179055602590915290204290555b6019546016546017546018546028549399509197509550935060ff1615613d6a57602f54602e54613c089190614b1e565b4211613c4b5760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b6044820152606401610f5e565b6029543a1115613c9d5760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401610f5e565b6001600160a01b0388166000908152602a6020526040902054439003613cfc5760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b6044820152606401610f5e565b601054871115613d4e5760405162461bcd60e51b815260206004820152601b60248201527f61626f7665206d6178207472616e73616374696f6e206c696d697400000000006044820152606401610f5e565b6001600160a01b0388166000908152602a602052604090204390555b6000613d7589611b0c565b600f54909150613d858983614b1e565b1115613ddf5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610f5e565b505b6000613df7613df08686614b1e565b8890612bea565b90506000613e0430611b0c565b60115490915081108015908190613e185750845b15613f31576008805460ff60a01b1916600160a01b179055601b5460ff168015613e425750600086115b8015613e5057506000600c54115b15613f02576000613e6e600954600a54612bea90919063ffffffff16565b90506000613e8b82610fb1600a5487612c5090919063ffffffff16565b90506000613ea883610fb160095488612c5090919063ffffffff16565b90506000613ec5600c54610fb18c86612c5090919063ffffffff16565b90506000613ee2600b54610fb18d86612c5090919063ffffffff16565b90506000613ef08284612bea565b9050613efb8161441a565b5050505050505b6000613f0d30611b0c565b9050613f1881612d14565b506001600a8190556009556008805460ff60a01b191690555b6000613f426064610fb18d87612c50565b905060008915613f8e576064613f588d8c612c50565b613f629190614a7b565b600854909150613f7d908f906001600160a01b0316836130a0565b600254613f8a9082612f39565b6002555b613fa2613f9b8284614b1e565b8d90612f39565b9b508615613fbf57600954613fb79083612bea565b600955613fd0565b600a54613fcc9083612bea565b600a555b613fdb8e30846130a0565b601c54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015614048575060408051601f3d908101601f1916820190925261404591810190614a9d565b60015b1561409c576040805184815260208101849052908101829052606081018590526001907f9dc81572b65340d35ebe017a23f2c72bc0c4364a633be553004be62a3eef54f79060800160405180910390a25050505b50505050505050505b6140b08787876130a0565b600d546001600160a01b031663e30443bc886140cb816131a9565b6040518363ffffffff1660e01b81526004016140e89291906149f6565b600060405180830381600087803b15801561410257600080fd5b505af1158015614116573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905087614137816131a9565b6040518363ffffffff1660e01b81526004016141549291906149f6565b600060405180830381600087803b15801561416e57600080fd5b505af1158015614182573d6000803e3d6000fd5b5050505050505050505050565b600081848411156141b35760405162461bcd60e51b8152600401610f5e9190614564565b5060006141c08486614bb9565b95945050505050565b6001600160a01b0382166000908152601e60205260409020805460ff1916821580159190911790915561425657600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561423d57600080fd5b505af1158015614251573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600081836142b35760405162461bcd60e51b8152600401610f5e9190614564565b5060006141c08486614a7b565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106142f5576142f56149e0565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561434e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143729190614a28565b81600181518110614385576143856149e0565b6001600160a01b0392831660209182029290920101526006546143ab9130911684612f7b565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906143e4908590600090869030904290600401614bcc565b600060405180830381600087803b1580156143fe57600080fd5b505af1158015614412573d6000803e3d6000fd5b505050505050565b6000614427826002612cd2565b905060006144358383612f39565b905047614441836142c0565b600061444d4783612f39565b905061445983826144a1565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6006546144b99030906001600160a01b031684612f7b565b60065460405163f305d71960e01b8152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015614526573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061151d9190614a9d565b60006020828403121561455d57600080fd5b5035919050565b600060208083528351808285015260005b8181101561459157858101830151858201604001528201614575565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461162a57600080fd5b801515811461162a57600080fd5b600080604083850312156145e857600080fd5b82356145f3816145b2565b91506020830135614603816145c7565b809150509250929050565b6000806040838503121561462157600080fd5b823561462c816145b2565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156146795761467961463a565b604052919050565b600067ffffffffffffffff82111561469b5761469b61463a565b5060051b60200190565b600082601f8301126146b657600080fd5b813560206146cb6146c683614681565b614650565b82815260059290921b840181019181810190868411156146ea57600080fd5b8286015b8481101561470557803583529183019183016146ee565b509695505050505050565b6000806040838503121561472357600080fd5b823567ffffffffffffffff8082111561473b57600080fd5b818501915085601f83011261474f57600080fd5b8135602061475f6146c683614681565b82815260059290921b8401810191818101908984111561477e57600080fd5b948201945b838610156147a5578535614796816145b2565b82529482019490820190614783565b965050860135925050808211156147bb57600080fd5b506147c8858286016146a5565b9150509250929050565b6000806000606084860312156147e757600080fd5b83356147f2816145b2565b92506020840135614802816145b2565b929592945050506040919091013590565b60006020828403121561482557600080fd5b8135612c49816145c7565b60006020828403121561484257600080fd5b8135612c49816145b2565b6000806040838503121561486057600080fd5b823561486b816145b2565b91506020830135614603816145b2565b6000806000806080858703121561489157600080fd5b5050823594602084013594506040840135936060013592509050565b600080600080600080600080610100898b0312156148ca57600080fd5b505086359860208801359850604088013597606081013597506080810135965060a0810135955060c0810135945060e0013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176111c0576111c0614937565b600181811c9082168061497857607f821691505b60208210810361499857634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526022908201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604082015261030360f41b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03929092168252602082015260400190565b600060018201614a2157614a21614937565b5060010190565b600060208284031215614a3a57600080fd5b8151612c49816145b2565b600060208284031215614a5757600080fd5b5051919050565b600060208284031215614a7057600080fd5b8151612c49816145c7565b600082614a9857634e487b7160e01b600052601260045260246000fd5b500490565b600080600060608486031215614ab257600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c08789031215614ae457600080fd5b8651614aef816145b2565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b808201808211156111c0576111c0614937565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156111c0576111c0614937565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614c1c5784516001600160a01b031683529383019391830191600101614bf7565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ba6180f189fcc48843217cc4551f02d925f12e9eb57126958f8cd53ec2825d6d64736f6c6343000811003360806040526012805460ff60b01b191690553480156200001e57600080fd5b506040516200305638038062003056833981016040819052620000419162000238565b81818181600362000053838262000372565b50600462000062828262000372565b50505050506000620000796200015660201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506013620000d5838262000372565b506014620000e4828262000372565b505060128054601680546001600160a01b03199081166001600160a01b0398891617909155670de0b6b3a764000060188190556019556015805490911695871695909517909455600160a01b929094166001600160a81b0319909316929092171760ff60a81b1916909155506200043e565b3390565b6001600160a01b03811681146200017057600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200019b57600080fd5b81516001600160401b0380821115620001b857620001b862000173565b604051601f8301601f19908116603f01168101908282118183101715620001e357620001e362000173565b816040528381526020925086838588010111156200020057600080fd5b600091505b8382101562000224578582018301518183018401529082019062000205565b600093810190920192909252949350505050565b600080600080600060a086880312156200025157600080fd5b85516200025e816200015a565b602087015190955062000271816200015a565b604087015190945062000284816200015a565b60608701519093506001600160401b0380821115620002a257600080fd5b620002b089838a0162000189565b93506080880151915080821115620002c757600080fd5b50620002d68882890162000189565b9150509295509295909350565b600181811c90821680620002f857607f821691505b6020821081036200031957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200036d57600081815260208120601f850160051c81016020861015620003485750805b601f850160051c820191505b81811015620003695782815560010162000354565b5050505b505050565b81516001600160401b038111156200038e576200038e62000173565b620003a6816200039f8454620002e3565b846200031f565b602080601f831160018114620003de5760008415620003c55750858301515b600019600386901b1c1916600185901b17855562000369565b600085815260208120601f198616915b828110156200040f57888601518255948401946001909101908401620003ee565b50858210156200042e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612c08806200044e6000396000f3fe60806040526004361061031e5760003560e01c80636b69163b116101ab578063a457c2d7116100f7578063d8032ed311610095578063e7841ec01161006f578063e7841ec0146109ed578063f2fde38b14610a02578063fbcbc0f114610a22578063ffb2c47914610a4257600080fd5b8063d8032ed314610967578063dd62ed3e14610987578063e30443bc146109cd57600080fd5b8063aafd847a116100d1578063aafd847a146108d1578063b22f8a0414610907578063ba079d4914610927578063bc4c4b371461094757600080fd5b8063a457c2d714610871578063a8b9d24014610891578063a9059cbb146108b157600080fd5b80638bc1d6391161016457806395d89b411161013e57806395d89b41146107fa5780639c3372ea1461080f5780639eec101e1461082f578063a42340691461085057600080fd5b80638bc1d6391461079c5780638da5cb5b146107bc57806391b89fba146107da57600080fd5b80636b69163b146106cb5780636d48467b146106fb57806370a082311461071b578063715018a61461075157806374c13fda1461076657806385a6b3ae1461078657600080fd5b8063313ce5671161026a5780634640ef44116102235780635a84c5eb116101fd5780635a84c5eb146106565780635ebf4db91461067657806365b8dbc0146106965780636a474002146106b657600080fd5b80634640ef44146105af5780634e7b827f146105cf5780635183d6fd146105ff57600080fd5b8063313ce567146104f257806331e79db01461050e5780633599bb171461052e578063395093511461054e57806340ffdd801461056e578063418089041461058e57600080fd5b806318160ddd116102d757806323b872dd116102b157806323b872dd1461047e57806325cd35981461049e57806327ce0147146104bc5780633009a609146104dc57600080fd5b806318160ddd1461040c5780631d4ff89a14610421578063226cfa3d1461045157600080fd5b806303c833021461033257806306fdde031461033a5780630928847114610365578063095ea7b31461038557806309bbedde146103b55780631694505e146103d457600080fd5b3661032d5761032b610a7d565b005b600080fd5b61032b610a7d565b34801561034657600080fd5b5061034f610b10565b60405161035c9190612784565b60405180910390f35b34801561037157600080fd5b5061032b6103803660046127ea565b610ba2565b34801561039157600080fd5b506103a56103a0366004612807565b610bf6565b604051901515815260200161035c565b3480156103c157600080fd5b50600a545b60405190815260200161035c565b3480156103e057600080fd5b506015546103f4906001600160a01b031681565b6040516001600160a01b03909116815260200161035c565b34801561041857600080fd5b506002546103c6565b34801561042d57600080fd5b506103a561043c3660046127ea565b60116020526000908152604090205460ff1681565b34801561045d57600080fd5b506103c661046c3660046127ea565b60176020526000908152604090205481565b34801561048a57600080fd5b506103a5610499366004612833565b610c0d565b3480156104aa57600080fd5b506012546001600160a01b03166103f4565b3480156104c857600080fd5b506103c66104d73660046127ea565b610c76565b3480156104e857600080fd5b506103c6600e5481565b3480156104fe57600080fd5b506040516012815260200161035c565b34801561051a57600080fd5b5061032b6105293660046127ea565b610cd2565b34801561053a57600080fd5b5061032b610549366004612882565b610d6c565b34801561055a57600080fd5b506103a5610569366004612807565b610e0d565b34801561057a57600080fd5b5061032b610589366004612882565b610e43565b34801561059a57600080fd5b506012546103a590600160a81b900460ff1681565b3480156105bb57600080fd5b506016546103f4906001600160a01b031681565b3480156105db57600080fd5b506103a56105ea3660046127ea565b600f6020526000908152604090205460ff1681565b34801561060b57600080fd5b5061061f61061a36600461289f565b610ed9565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161035c565b34801561066257600080fd5b5061032b61067136600461289f565b610f39565b34801561068257600080fd5b5061032b61069136600461289f565b610f7b565b3480156106a257600080fd5b5061032b6106b13660046127ea565b610fbd565b3480156106c257600080fd5b5061032b611009565b3480156106d757600080fd5b506103a56106e63660046127ea565b60106020526000908152604090205460ff1681565b34801561070757600080fd5b506103a56107163660046127ea565b61108f565b34801561072757600080fd5b506103c66107363660046127ea565b6001600160a01b031660009081526020819052604090205490565b34801561075d57600080fd5b5061032b6110db565b34801561077257600080fd5b506012546103f4906001600160a01b031681565b34801561079257600080fd5b506103c660085481565b3480156107a857600080fd5b5061032b6107b73660046128b8565b61114f565b3480156107c857600080fd5b506009546001600160a01b03166103f4565b3480156107e657600080fd5b506103c66107f53660046127ea565b6111a4565b34801561080657600080fd5b5061034f6111af565b34801561081b57600080fd5b5061032b61082a366004612882565b6111be565b34801561083b57600080fd5b506012546103a590600160a01b900460ff1681565b34801561085c57600080fd5b506012546103a590600160b01b900460ff1681565b34801561087d57600080fd5b506103a561088c366004612807565b611254565b34801561089d57600080fd5b506103c66108ac3660046127ea565b6112a3565b3480156108bd57600080fd5b506103a56108cc366004612807565b6112cf565b3480156108dd57600080fd5b506103c66108ec3660046127ea565b6001600160a01b031660009081526007602052604090205490565b34801561091357600080fd5b5061032b6109223660046128b8565b6112dc565b34801561093357600080fd5b506103a56109423660046127ea565b611331565b34801561095357600080fd5b506103a56109623660046128b8565b61137d565b34801561097357600080fd5b5061032b6109823660046127ea565b6114fe565b34801561099357600080fd5b506103c66109a23660046128f1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109d957600080fd5b5061032b6109e8366004612807565b61154a565b3480156109f957600080fd5b50600e546103c6565b348015610a0e57600080fd5b5061032b610a1d3660046127ea565b6115e2565b348015610a2e57600080fd5b5061061f610a3d3660046127ea565b6116cd565b348015610a4e57600080fd5b50610a62610a5d36600461289f565b61177c565b6040805193845260208401929092529082015260600161035c565b6000610a8860025490565b11610a9257600080fd5b3415610b0e57610ac5610aa460025490565b610ab234600160801b6118a2565b610abc9190612935565b6005549061192b565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b0a903461192b565b6008555b565b606060138054610b1f90612957565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612957565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b5050505050905090565b6009546001600160a01b03163314610bd55760405162461bcd60e51b8152600401610bcc90612991565b60405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610c0333848461198a565b5060015b92915050565b6000610c1a848484611aae565b610c6c8433610c6785604051806060016040528060288152602001612b86602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611af2565b61198a565b5060019392505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b92610cc892610cc392610cbd91610cb891906118a2565b611b2c565b90611b3c565b611b7a565b610c079190612935565b6009546001600160a01b03163314610cfc5760405162461bcd60e51b8152600401610bcc90612991565b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610d2a908290611b8d565b610d35600a82611bec565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610d965760405162461bcd60e51b8152600401610bcc90612991565b801515601260169054906101000a900460ff16151503610db557600080fd5b60128054821515600160b01b0260ff60b01b199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610e0290831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c03918590610c67908661192b565b6009546001600160a01b03163314610e6d5760405162461bcd60e51b8152600401610bcc90612991565b801515601260159054906101000a900460ff16151503610e8c57600080fd5b60128054821515600160a81b0260ff60a81b199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610e0290831515815260200190565b600080600080600080610eeb600a5490565b8710610f0a575060009450600019935083925084915081905080610f30565b6000610f17600a89611d27565b9050610f22816116cd565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610f635760405162461bcd60e51b8152600401610bcc90612991565b610f7581670de0b6b3a76400006129c6565b60185550565b6009546001600160a01b03163314610fa55760405162461bcd60e51b8152600401610bcc90612991565b610fb781670de0b6b3a76400006129c6565b60195550565b6009546001600160a01b03163314610fe75760405162461bcd60e51b8152600401610bcc90612991565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60405162461bcd60e51b815260206004820152604f60248201527f77697468647261774469766964656e642064697361626c65642e20557365207460448201527f68652027636c61696d272066756e6374696f6e206f6e20746865206d61696e2060648201526e2b32b737b69031b7b73a3930b1ba1760891b608482015260a401610bcc565b6009546000906001600160a01b031633146110bc5760405162461bcd60e51b8152600401610bcc90612991565b506001600160a01b031660009081526010602052604090205460ff1690565b6009546001600160a01b031633146111055760405162461bcd60e51b8152600401610bcc90612991565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6009546001600160a01b031633146111795760405162461bcd60e51b8152600401610bcc90612991565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610c07826112a3565b606060148054610b1f90612957565b6009546001600160a01b031633146111e85760405162461bcd60e51b8152600401610bcc90612991565b801515601260149054906101000a900460ff1615150361120757600080fd5b60128054821515600160a01b0260ff60a01b199091161790556040517f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890610e0290831515815260200190565b6000610c033384610c6785604051806060016040528060258152602001612bae602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611af2565b6001600160a01b038116600090815260076020526040812054610c07906112c984610c76565b90611d5a565b6000610c03338484611aae565b6009546001600160a01b031633146113065760405162461bcd60e51b8152600401610bcc90612991565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b0316331461135e5760405162461bcd60e51b8152600401610bcc90612991565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146113aa5760405162461bcd60e51b8152600401610bcc90612991565b601254600160b01b900460ff16156113c457506000610c07565b6001600160a01b03831660009081526011602052604090205460ff168280156113ea5750805b80156114005750601254600160a81b900460ff16155b1561140f576000915050610c07565b6000816114245761141f85611d9c565b61142d565b61142d85612055565b905080156114f3576001600160a01b038516600090815260176020526040902042905581156114a157831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c8360405161149491815260200190565b60405180910390a36114e8565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040516114df91815260200190565b60405180910390a35b600192505050610c07565b506000949350505050565b6009546001600160a01b031633146115285760405162461bcd60e51b8152600401610bcc90612991565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031633146115745760405162461bcd60e51b8152600401610bcc90612991565b6001600160a01b0382166000908152600f602052604090205460ff166115b4576019548110156115b8576115a9600a83611bec565b6115b4826000611b8d565b5050565b6115c28282611b8d565b60185481106115d7576115b4600a83836123c8565b6115b4600a83611bec565b6009546001600160a01b0316331461160c5760405162461bcd60e51b8152600401610bcc90612991565b6001600160a01b0381166116715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bcc565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080806116df600a87612471565b945060001993506000851261174157600e5485111561170d57600e546117069086906124bc565b9350611741565b600e54600a5460009110611722576000611731565b600e54600a5461173191611d5a565b905061173d8682611b3c565b9450505b61174a866112a3565b925061175586610c76565b6001600160a01b038716600090815260176020526040902054969895975093959294915050565b600a546000908190819080158061179c5750601254600160b01b900460ff165b156117b2575050600e546000925082915061189b565b600e546000805a90506000805b89841080156117cd57508582105b1561188a57846117dc816129dd565b9550508585106117eb57600094505b6000600a6000018681548110611803576118036129f6565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff166118505761183d81600161137d565b15611850578161184c816129dd565b9250505b8261185a816129dd565b93505060005a9050808511156118815761187e6118778683611d5a565b879061192b565b95505b93506117bf9050565b600e85905590975095509193505050505b9193909250565b6000826000036118b457506000610c07565b60006118c083856129c6565b9050826118cd8583612935565b146119245760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610bcc565b9392505050565b6000806119388385612a0c565b9050838110156119245760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bcc565b6001600160a01b0383166119ec5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bcc565b6001600160a01b038216611a4d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bcc565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b8152602060048201526014602482015273139bc81d1c985b9cd9995c9cc8185b1b1bddd95960621b6044820152606401610bcc565b505050565b60008184841115611b165760405162461bcd60e51b8152600401610bcc9190612784565b506000611b238486612a1f565b95945050505050565b60008181811215610c0757600080fd5b600080611b498385612a32565b905060008312158015611b5c5750838112155b80611b715750600083128015611b7157508381125b61192457600080fd5b600080821215611b8957600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611bcc576000611bba8383611d5a565b9050611bc684826124f9565b50505050565b80821015611aed576000611be08284611d5a565b9050611bc6848261255d565b6001600160a01b038116600090815260038301602052604090205460ff16611c12575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611c5c91612a1f565b90506000846000018281548110611c7557611c756129f6565b60009182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611cc457611cc46129f6565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611cfe57611cfe612a5a565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000826000018281548110611d3e57611d3e6129f6565b6000918252602090912001546001600160a01b03169392505050565b600061192483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611af2565b600080611da8836112a3565b9050801561204c576001600160a01b038316600090815260076020526040902054611dd3908261192b565b6001600160a01b03808516600090815260076020526040812092909255601254169081611e58576040516001600160a01b03861690610bb89085906000818181858888f193505050503d8060008114611e48576040519150601f19603f3d011682016040523d82523d6000602084013e611e4d565b606091505b505080915050611fb2565b6040805160028082526060820183526000926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611ec2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee69190612a70565b81600081518110611ef957611ef96129f6565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611f2d57611f2d6129f6565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de95908690611f739060009086908c904290600401612ad1565b6000604051808303818588803b158015611f8c57600080fd5b505af193505050508015611f9e575060015b611fab5760009150611fb0565b600191505b505b80612000576001600160a01b038516600090815260076020526040902054611fda9084611d5a565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8460405161203b91815260200190565b60405180910390a250909392505050565b50600092915050565b600080612061836112a3565b9050801561204c576001600160a01b03831660009081526007602052604081205461208c908361192b565b6001600160a01b03851660009081526007602052604080822092909255815160028082526060820190935290918160200160208202803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612114573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121389190612a70565b8160008151811061214b5761214b6129f6565b6001600160a01b03928316602091820292909201015260165482519116908290600190811061217c5761217c6129f6565b6001600160a01b0392831660209182029290920101526016546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa1580156121d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fa9190612b06565b60155460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de9590869061223490600090879030904290600401612ad1565b6000604051808303818588803b15801561224d57600080fd5b505af19350505050801561225f575060015b61226c576000925061236f565b6016546040516370a0823160e01b81523060048201526000916122df9184916001600160a01b0316906370a0823190602401602060405180830381865afa1580156122bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c99190612b06565b905080156123685760165460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af115801561233e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123629190612b1f565b5061236d565b600093505b505b826123be576001600160a01b0386166000908152600760205260409020546123979085611d5a565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff161561240d576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff1661249c5750600019610c07565b506001600160a01b03166000908152600291909101602052604090205490565b6000806124c98385612b3c565b9050600083121580156124dc5750838113155b80611b715750600083128015611b71575083811361192457600080fd5b61250382826125a1565b61253d61251e610cb8836005546118a290919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906124bc565b6001600160a01b0390921660009081526006602052604090209190915550565b6125678282612680565b61253d612582610cb8836005546118a290919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611b3c565b6001600160a01b0382166125f75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610bcc565b600254612604908261192b565b6002556001600160a01b03821660009081526020819052604090205461262a908261192b565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166126e05760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610bcc565b61271d81604051806060016040528060228152602001612b64602291396001600160a01b0385166000908152602081905260409020549190611af2565b6001600160a01b0383166000908152602081905260409020556002546127439082611d5a565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612674565b600060208083528351808285015260005b818110156127b157858101830151858201604001528201612795565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146127e757600080fd5b50565b6000602082840312156127fc57600080fd5b8135611924816127d2565b6000806040838503121561281a57600080fd5b8235612825816127d2565b946020939093013593505050565b60008060006060848603121561284857600080fd5b8335612853816127d2565b92506020840135612863816127d2565b929592945050506040919091013590565b80151581146127e757600080fd5b60006020828403121561289457600080fd5b813561192481612874565b6000602082840312156128b157600080fd5b5035919050565b600080604083850312156128cb57600080fd5b82356128d6816127d2565b915060208301356128e681612874565b809150509250929050565b6000806040838503121561290457600080fd5b823561290f816127d2565b915060208301356128e6816127d2565b634e487b7160e01b600052601160045260246000fd5b60008261295257634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061296b57607f821691505b60208210810361298b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8082028115828204841417610c0757610c0761291f565b6000600182016129ef576129ef61291f565b5060010190565b634e487b7160e01b600052603260045260246000fd5b80820180821115610c0757610c0761291f565b81810381811115610c0757610c0761291f565b8082018281126000831280158216821582161715612a5257612a5261291f565b505092915050565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612a8257600080fd5b8151611924816127d2565b600081518084526020808501945080840160005b83811015612ac65781516001600160a01b031687529582019590820190600101612aa1565b509495945050505050565b848152608060208201526000612aea6080830186612a8d565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215612b1857600080fd5b5051919050565b600060208284031215612b3157600080fd5b815161192481612874565b8181036000831280158383131683831282161715612b5c57612b5c61291f565b509291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220db3085fe48534ea43c6a20c44c1eb1e32037662c3a96abc53d306391f53f92b464736f6c63430008110033

Deployed Bytecode

0x6080604052600436106104c45760003560e01c806372d8edf411610276578063ad56c13c1161014f578063e2f45605116100c1578063f2f5ec3a11610085578063f2f5ec3a14610e88578063f2fde38b14610ea8578063f5d3c79a14610ec8578063f637434214610ee8578063f8b45b0514610efe578063fc6b151c14610f1457600080fd5b8063e2f4560514610e11578063e7841ec014610e27578063ebae7c1c14610e3c578063f11a24d314610e52578063f27fd25414610e6857600080fd5b8063bb8d513111610113578063bb8d513114610d35578063d07a091c14610d4b578063d5e3725114610d6b578063d8032ed314610d8b578063dd62ed3e14610dab578063e14a93d614610df157600080fd5b8063ad56c13c14610c58578063b494298814610caf578063b62496f514610cc5578063b74e3b1114610cf5578063ba079d4914610d1557600080fd5b806394564774116101e85780639c3372ea116101ac5780639c3372ea14610ba25780639ec1037e14610bc2578063a457c2d714610be2578063a8b9d24014610c02578063a9059cbb14610c22578063acb2ad6f14610c4257600080fd5b80639456477414610b2c57806395451c2914610b4157806395d89b4114610b575780639a7a23d614610b6c5780639c1b8af514610b8c57600080fd5b80638577a6d51161023a5780638577a6d514610a82578063868730c714610aa2578063871c128d14610ac25780638c3c82b214610ae25780638ca2923a14610af85780638da5cb5b14610b0e57600080fd5b806372d8edf4146109ec57806375829def14610a0c57806375f0a87414610a2c57806377a3b60914610a4c5780637fdde05c14610a6257600080fd5b80634a62bb65116103a857806364b0f6531161031a5780636d48467b116102de5780636d48467b14610942578063700bb191146109625780637088fb7f1461098257806370a082311461099757806370c8be13146109b7578063715018a6146109d757600080fd5b806364b0f653146108b757806366236b4a146108cc578063679ca6e9146108ec5780636843cd841461090c5780636a42b8f81461092c57600080fd5b80634fbee1931161036c5780634fbee193146107f25780635124f8741461082b5780635a84c5eb146108415780635c234bb6146108615780635ebf4db9146108775780635eee4bae1461089757600080fd5b80634a62bb65146107685780634a74bb02146107825780634ada218b1461079c5780634e71d92d146107bd5780634e974537146107d257600080fd5b80632307b44111610441578063313ce56711610405578063313ce567146106b65780633599bb17146106d257806339509351146106f25780633f407b841461071257806340ffdd801461072857806349bd5a5e1461074857600080fd5b80632307b4411461062c57806323b872dd1461064c57806325cd35981461066c5780632c1f52161461068157806330bb4cff146106a157600080fd5b8063095ea7b311610488578063095ea7b3146105915780631694505e146105c157806318160ddd146105e15780631d7b1fb4146106005780631fa705311461061657600080fd5b806303fd2a45146104d057806305ca5f081461050d57806306fdde031461052f57806308dfe8a514610551578063092316021461057157600080fd5b366104cb57005b600080fd5b3480156104dc57600080fd5b506008546104f0906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561051957600080fd5b5061052d61052836600461454b565b610f34565b005b34801561053b57600080fd5b50610544611005565b6040516105049190614564565b34801561055d57600080fd5b5061052d61056c3660046145d5565b611097565b34801561057d57600080fd5b5061052d61058c36600461454b565b611120565b34801561059d57600080fd5b506105b16105ac36600461460e565b6111af565b6040519015158152602001610504565b3480156105cd57600080fd5b506006546104f0906001600160a01b031681565b3480156105ed57600080fd5b506002545b604051908152602001610504565b34801561060c57600080fd5b506105f260305481565b34801561062257600080fd5b506105f2600a5481565b34801561063857600080fd5b5061052d610647366004614710565b6111c6565b34801561065857600080fd5b506105b16106673660046147d2565b61134d565b34801561067857600080fd5b506104f06113b6565b34801561068d57600080fd5b50600d546104f0906001600160a01b031681565b3480156106ad57600080fd5b506105f2611429565b3480156106c257600080fd5b5060405160128152602001610504565b3480156106de57600080fd5b5061052d6106ed366004614813565b611497565b3480156106fe57600080fd5b506105b161070d36600461460e565b611524565b34801561071e57600080fd5b506105f260095481565b34801561073457600080fd5b5061052d610743366004614813565b61155a565b34801561075457600080fd5b506007546104f0906001600160a01b031681565b34801561077457600080fd5b506028546105b19060ff1681565b34801561078e57600080fd5b50601b546105b19060ff1681565b3480156107a857600080fd5b506008546105b190600160a81b900460ff1681565b3480156107c957600080fd5b5061052d6115b5565b3480156107de57600080fd5b5061052d6107ed36600461454b565b61162d565b3480156107fe57600080fd5b506105b161080d366004614830565b6001600160a01b03166000908152601d602052604090205460ff1690565b34801561083757600080fd5b506105f260175481565b34801561084d57600080fd5b5061052d61085c36600461454b565b6116cf565b34801561086d57600080fd5b506105f260165481565b34801561088357600080fd5b5061052d61089236600461454b565b61172a565b3480156108a357600080fd5b5061052d6108b236600461454b565b611785565b3480156108c357600080fd5b506105f26117c7565b3480156108d857600080fd5b5061052d6108e736600461454b565b611811565b3480156108f857600080fd5b5061052d610907366004614813565b6118c2565b34801561091857600080fd5b506105f2610927366004614830565b6118ff565b34801561093857600080fd5b506105f2602f5481565b34801561094e57600080fd5b506105b161095d366004614830565b61196f565b34801561096e57600080fd5b5061052d61097d36600461454b565b6119df565b34801561098e57600080fd5b5061052d611aaf565b3480156109a357600080fd5b506105f26109b2366004614830565b611b0c565b3480156109c357600080fd5b5061052d6109d2366004614710565b611b27565b3480156109e357600080fd5b5061052d611cde565b3480156109f857600080fd5b5061052d610a07366004614830565b611d52565b348015610a1857600080fd5b5061052d610a27366004614830565b611dae565b348015610a3857600080fd5b50600e546104f0906001600160a01b031681565b348015610a5857600080fd5b506105f260195481565b348015610a6e57600080fd5b5061052d610a7d3660046145d5565b611e63565b348015610a8e57600080fd5b5061052d610a9d36600461454b565b611eb8565b348015610aae57600080fd5b5061052d610abd366004614813565b611f6f565b348015610ace57600080fd5b5061052d610add36600461454b565b611fa7565b348015610aee57600080fd5b506105f2602e5481565b348015610b0457600080fd5b506105f260135481565b348015610b1a57600080fd5b506005546001600160a01b03166104f0565b348015610b3857600080fd5b5061052d612023565b348015610b4d57600080fd5b506105f260145481565b348015610b6357600080fd5b506105446120c1565b348015610b7857600080fd5b5061052d610b873660046145d5565b6120d0565b348015610b9857600080fd5b506105f2601c5481565b348015610bae57600080fd5b5061052d610bbd366004614813565b612104565b348015610bce57600080fd5b5061052d610bdd366004614830565b612160565b348015610bee57600080fd5b506105b1610bfd36600461460e565b612223565b348015610c0e57600080fd5b506105f2610c1d366004614830565b612272565b348015610c2e57600080fd5b506105b1610c3d36600461460e565b6122a5565b348015610c4e57600080fd5b506105f2601a5481565b348015610c6457600080fd5b50610c78610c73366004614830565b6122b2565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610504565b348015610cbb57600080fd5b506105f2602d5481565b348015610cd157600080fd5b506105b1610ce0366004614830565b601e6020526000908152604090205460ff1681565b348015610d0157600080fd5b5061052d610d1036600461454b565b612342565b348015610d2157600080fd5b506105b1610d30366004614830565b6123d2565b348015610d4157600080fd5b506105f260125481565b348015610d5757600080fd5b5061052d610d66366004614830565b612405565b348015610d7757600080fd5b5061052d610d86366004614813565b6124fd565b348015610d9757600080fd5b5061052d610da6366004614830565b61257f565b348015610db757600080fd5b506105f2610dc636600461484d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610dfd57600080fd5b5061052d610e0c36600461487b565b612642565b348015610e1d57600080fd5b506105f260115481565b348015610e3357600080fd5b506105f26127c4565b348015610e4857600080fd5b506105f260105481565b348015610e5e57600080fd5b506105f260185481565b348015610e7457600080fd5b50610c78610e8336600461454b565b61280e565b348015610e9457600080fd5b5061052d610ea33660046148ad565b61284c565b348015610eb457600080fd5b5061052d610ec3366004614830565b612a12565b348015610ed457600080fd5b5061052d610ee3366004614813565b612afd565b348015610ef457600080fd5b506105f260155481565b348015610f0a57600080fd5b506105f2600f5481565b348015610f2057600080fd5b5061052d610f2f36600461454b565b612b35565b6005546001600160a01b03163314610f675760405162461bcd60e51b8152600401610f5e90614902565b60405180910390fd5b610f7981670de0b6b3a764000061494d565b90506000610f94600954600a54612bea90919063ffffffff16565b90506000610fb782610fb1600a5486612c5090919063ffffffff16565b90612cd2565b90506000610fd483610fb160095487612c5090919063ffffffff16565b9050610fdf84612d14565b600a54610fec9083612f39565b600a55600954610ffc9082612f39565b60095550505050565b60606003805461101490614964565b80601f016020809104026020016040519081016040528092919081815260200182805461104090614964565b801561108d5780601f106110625761010080835404028352916020019161108d565b820191906000526020600020905b81548152906001019060200180831161107057829003601f168201915b5050505050905090565b6005546001600160a01b031633146110c15760405162461bcd60e51b8152600401610f5e90614902565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461114a5760405162461bcd60e51b8152600401610f5e90614902565b603281101561119b5760405162461bcd60e51b815260206004820152601e60248201527f63616e206e6576657220626520736574206c6f776572207468616e20353000006044820152606401610f5e565b6111a981633b9aca0061494d565b60295550565b60006111bc338484612f7b565b5060015b92915050565b6005546001600160a01b031633146111f05760405162461bcd60e51b8152600401610f5e90614902565b80518251146112415760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610f5e565b60c8825111156112635760405162461bcd60e51b8152600401610f5e9061499e565b60005b8251811015611348576000838281518110611283576112836149e0565b6020026020010151905060008383815181106112a1576112a16149e0565b6020026020010151670de0b6b3a76400006112bc919061494d565b90506112c93383836130a0565b600d546001600160a01b031663e30443bc836112e4816131a9565b6040518363ffffffff1660e01b81526004016113019291906149f6565b600060405180830381600087803b15801561131b57600080fd5b505af115801561132f573d6000803e3d6000fd5b505050505050808061134090614a0f565b915050611266565b505050565b600061135a848484613338565b6113ac84336113a785604051806060016040528060288152602001614c64602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061418f565b612f7b565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa158015611400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114249190614a28565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611473573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114249190614a45565b6005546001600160a01b031633146114c15760405162461bcd60e51b8152600401610f5e90614902565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b15801561150957600080fd5b505af115801561151d573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916111bc9185906113a79086612bea565b6005546001600160a01b031633146115845760405162461bcd60e51b8152600401610f5e90614902565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd80906024016114ef565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162a9190614a5e565b50565b6005546001600160a01b031633146116575760405162461bcd60e51b8152600401610f5e90614902565b61166981670de0b6b3a764000061494d565b90506107d060025461167b9190614a7b565b8111156116ca5760405162461bcd60e51b815260206004820181905260248201527f63616e6e6f742062652073657420746f206d6f7265207468616e20302e3035256044820152606401610f5e565b602755565b6005546001600160a01b031633146116f95760405162461bcd60e51b8152600401610f5e90614902565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb906024016114ef565b6005546001600160a01b031633146117545760405162461bcd60e51b8152600401610f5e90614902565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db9906024016114ef565b6005546001600160a01b031633146117af5760405162461bcd60e51b8152600401610f5e90614902565b6117c181670de0b6b3a764000061494d565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611473573d6000803e3d6000fd5b6005546001600160a01b0316331461183b5760405162461bcd60e51b8152600401610f5e90614902565b61184d81670de0b6b3a764000061494d565b90506103e860025461185f9190614a7b565b8110156118bd5760405162461bcd60e51b815260206004820152602660248201527f6d61782074782063616e6e6f742062652073657420746f206c657373207468616044820152656e20302e312560d01b6064820152608401610f5e565b601055565b6005546001600160a01b031633146118ec5760405162461bcd60e51b8152600401610f5e90614902565b6028805460ff1916911515919091179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561194b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c09190614a45565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa1580156119bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c09190614a5e565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a569190614a9d565b60408051848152602081018490529081018290526060810188905292955090935091506000907f9dc81572b65340d35ebe017a23f2c72bc0c4364a633be553004be62a3eef54f79060800160405180910390a250505050565b6005546001600160a01b03163314611ad95760405162461bcd60e51b8152600401610f5e90614902565b6040514790339082156108fc029083906000818181858888f19350505050158015611b08573d6000803e3d6000fd5b5050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611b515760405162461bcd60e51b8152600401610f5e90614902565b8051825114611ba25760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610f5e565b60c882511115611bc45760405162461bcd60e51b8152600401610f5e9061499e565b60005b8251811015611348576000838281518110611be457611be46149e0565b602002602001015190506000838381518110611c0257611c026149e0565b6020026020010151670de0b6b3a7640000611c1d919061494d565b9050611c2a3383836130a0565b600d546001600160a01b031663e30443bc83611c45816131a9565b6040518363ffffffff1660e01b8152600401611c629291906149f6565b600060405180830381600087803b158015611c7c57600080fd5b505af1158015611c90573d6000803e3d6000fd5b5050506001600160a01b039092166000908152602080805260408083209390935560218152828220805460ff1916600117905560229052204290555080611cd681614a0f565b915050611bc7565b6005546001600160a01b03163314611d085760405162461bcd60e51b8152600401610f5e90614902565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611d7c5760405162461bcd60e51b8152600401610f5e90614902565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024016114ef565b6005546001600160a01b03163314611dd85760405162461bcd60e51b8152600401610f5e90614902565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611e1f57600080fd5b505af1158015611e33573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601d60205260409020805460ff191660011790555061162a81612a12565b6005546001600160a01b03163314611e8d5760405162461bcd60e51b8152600401610f5e90614902565b6001600160a01b03919091166000908152601f60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611ee25760405162461bcd60e51b8152600401610f5e90614902565b6005811115611f335760405162461bcd60e51b815260206004820152601d60248201527f7472616e73666572206665652063616e6e6f74206578636565642035250000006044820152606401610f5e565b601a8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d639906044016114ef565b6005546001600160a01b03163314611fd15760405162461bcd60e51b8152600401610f5e90614902565b62030d408110158015611fe75750624c4b408111155b611ff057600080fd5b601c5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601c55565b3360009081526024602052604090205460ff1661205557336000908152602460205260409020805460ff191660011790555b600d546001600160a01b031663e30443bc33612070816131a9565b6040518363ffffffff1660e01b815260040161208d9291906149f6565b600060405180830381600087803b1580156120a757600080fd5b505af11580156120bb573d6000803e3d6000fd5b50505050565b60606004805461101490614964565b6005546001600160a01b031633146120fa5760405162461bcd60e51b8152600401610f5e90614902565b611b0882826141c9565b6005546001600160a01b0316331461212e5760405162461bcd60e51b8152600401610f5e90614902565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea906024016114ef565b6005546001600160a01b0316331461218a5760405162461bcd60e51b8152600401610f5e90614902565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b1580156121d157600080fd5b505af11580156121e5573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905082612206816131a9565b6040518363ffffffff1660e01b81526004016114ef9291906149f6565b60006111bc33846113a785604051806060016040528060258152602001614c8c602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061418f565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161192e565b60006111bc338484613338565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa15801561230a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232e9190614acb565b949c939b5091995097509550909350915050565b6005546001600160a01b0316331461236c5760405162461bcd60e51b8152600401610f5e90614902565b61012c8111156123cd5760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b6064820152608401610f5e565b603055565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d499060240161199e565b6005546001600160a01b0316331461242f5760405162461bcd60e51b8152600401610f5e90614902565b6001600160a01b038181166000818152601f602090815260408083208054600160ff199182168117909255601d9093529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b1580156124ab57600080fd5b505af11580156124bf573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611f64565b6005546001600160a01b031633146125275760405162461bcd60e51b8152600401610f5e90614902565b601b5481151560ff90911615150361253e57600080fd5b601b805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001611f64565b6005546001600160a01b031633146125a95760405162461bcd60e51b8152600401610f5e90614902565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b1580156125f057600080fd5b505af1158015612604573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611f64565b6005546001600160a01b0316331461266c5760405162461bcd60e51b8152600401610f5e90614902565b61267e83670de0b6b3a764000061494d565b925061269282670de0b6b3a764000061494d565b600854909250600160a81b900460ff16156126ac57600080fd5b6103e86002546126bc9190614a7b565b8310156127035760405162461bcd60e51b815260206004820152601560248201527463616e6e6f74207365742062656c6f7720302e312560581b6044820152606401610f5e565b6103e86002546127139190614a7b565b82101561275a5760405162461bcd60e51b815260206004820152601560248201527463616e6e6f74207365742062656c6f7720302e312560581b6044820152606401610f5e565b600f839055601082905561277284633b9aca0061494d565b6029556008805460ff60a81b1916600160a81b17905543602d5542602e55602f8190556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150505050565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611473573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd906024016122ed565b6005546001600160a01b031633146128765760405162461bcd60e51b8152600401610f5e90614902565b601688905560178690556018849055601982905560138790556014859055601583905560128190556128b2856128ac8386612bea565b90612bea565b600b556017546018546019546128cd92916128ac9190612bea565b600c55600388118015906128e2575060038711155b61292e5760405162461bcd60e51b815260206004820152601a60248201527f6275726e20666565732063616e6e6f74206578636565642033250000000000006044820152606401610f5e565b600a600b54111580156129445750600a600c5411155b6129905760405162461bcd60e51b815260206004820152601c60248201527f746f74616c20666565732063616e6e6f742065786365656420313025000000006044820152606401610f5e565b601354601454601554601254601654601754601854601954604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201527f1640531881cbf0e2bf36c30fec3ed06b08e062adb13340f00fd16cedba09637a906101000160405180910390a15050505050505050565b6005546001600160a01b03163314612a3c5760405162461bcd60e51b8152600401610f5e90614902565b6001600160a01b038116612aa15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f5e565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a04906044016114ef565b6005546001600160a01b03163314612b5f5760405162461bcd60e51b8152600401610f5e90614902565b612b7181670de0b6b3a764000061494d565b90506103e8600254612b839190614a7b565b811015612be55760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b6064820152608401610f5e565b600f55565b600080612bf78385614b1e565b905083811015612c495760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610f5e565b9392505050565b600082600003612c62575060006111c0565b6000612c6e838561494d565b905082612c7b8583614a7b565b14612c495760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610f5e565b6000612c4983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614292565b80600003612d1f5750565b612d28816142c0565b6000612d41600954600a54612bea90919063ffffffff16565b60195490915060019081906000908190819015612d9357612d90601754601954612d6b9190614b1e565b610fb1601954612d8a8a610fb1600a5447612c5090919063ffffffff16565b90612c50565b91505b60125415612dd057612dcd601454601254612dae9190614b1e565b610fb1601254612d8a8a610fb160095447612c5090919063ffffffff16565b90505b612dda8282612bea565b92508215612e3a57600d546040516001600160a01b03909116908490600081818185875af1925050503d8060008114612e2f576040519150601f19603f3d011682016040523d82523d6000602084013e612e34565b606091505b50909550505b6000601754601454612e4c9190614b1e565b905060008115612e6357612e604783612cd2565b90505b6000612e8082612d8a601454601754612bea90919063ffffffff16565b90508015612ee057600e546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612ed5576040519150601f19603f3d011682016040523d82523d6000602084013e612eda565b606091505b50909750505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd086828a8015612f0d5750895b60408051938452602084019290925215159082015260600160405180910390a150505050505050505050565b6000612c4983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061418f565b6001600160a01b038316612fdd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f5e565b6001600160a01b03821661303e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f5e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166130c65760405162461bcd60e51b8152600401610f5e90614b31565b6001600160a01b0382166130ec5760405162461bcd60e51b8152600401610f5e90614b76565b61312981604051806060016040528060268152602001614c3e602691396001600160a01b038616600090815260208190526040902054919061418f565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546131589082612bea565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613093565b6001600160a01b038116600090815260246020526040812054819060ff1680156131f757506001600160a01b0383166000908152602c60205260409020546131f49062093a80614b1e565b42115b801561322757506001600160a01b0383166000908152602c60205260409020546132249062127500614b1e565b42105b156132415761323a6003612d8a85611b0c565b90506111c0565b6001600160a01b03831660009081526024602052604090205460ff16801561328d57506001600160a01b0383166000908152602c602052604090205461328a9062127500614b1e565b42115b80156132bd57506001600160a01b0383166000908152602c60205260409020546132ba90621baf80614b1e565b42105b156132d05761323a6005612d8a85611b0c565b6001600160a01b03831660009081526024602052604090205460ff16801561331c57506001600160a01b0383166000908152602c602052604090205461331990621baf80614b1e565b42115b1561332f5761323a6007612d8a85611b0c565b612c4983611b0c565b6001600160a01b03831661335e5760405162461bcd60e51b8152600401610f5e90614b31565b6001600160a01b0382166133845760405162461bcd60e51b8152600401610f5e90614b76565b6001600160a01b0383166000908152601f602052604081205481908190819060ff1661340357600854600160a81b900460ff166134035760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610f5e565b8460000361342057613417878760006130a0565b50505050505050565b6001600160a01b03871660009081526021602052604090205460ff161561351c576001600160a01b0387166000908152602260205260409020546134669061012c614b1e565b4210156134ec576001600160a01b03871660009081526020805260409020548561348f89611b0c565b6134999190614bb9565b10156134e75760405162461bcd60e51b815260206004820152601760248201527f63616e742073656c6c2076657374656420746f6b656e730000000000000000006044820152606401610f5e565b6140a5565b6001600160a01b03871660009081526020808052604080832083905560219091529020805460ff191690556140a5565b600854600160a01b900460ff1615801561354f57506001600160a01b0387166000908152601d602052604090205460ff16155b801561357457506001600160a01b0386166000908152601d602052604090205460ff16155b156140a5576001600160a01b038087166000908152601e602052604080822054928a16825290205460ff9182169116801580156135af575081155b15613885576001600160a01b0389166000908152601d602052604090205460ff161580156135f657506001600160a01b0388166000908152601d602052604090205460ff16155b1561375b5760006136176064610fb1601a548b612c5090919063ffffffff16565b90506136238882612f39565b97506136308a30836130a0565b61363b8a8a8a6130a0565b600d546001600160a01b031663e30443bc8b613656816131a9565b6040518363ffffffff1660e01b81526004016136739291906149f6565b600060405180830381600087803b15801561368d57600080fd5b505af11580156136a1573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508a6136c2816131a9565b6040518363ffffffff1660e01b81526004016136df9291906149f6565b600060405180830381600087803b1580156136f957600080fd5b505af115801561370d573d6000803e3d6000fd5b5050506001600160a01b03909a166000908152602360209081526040808320805460ff199081169091556024835281842080549091169055602c909152902042905550505050505050505050565b6137668989896130a0565b600d546001600160a01b031663e30443bc8a613781816131a9565b6040518363ffffffff1660e01b815260040161379e9291906149f6565b600060405180830381600087803b1580156137b857600080fd5b505af11580156137cc573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050896137ed816131a9565b6040518363ffffffff1660e01b815260040161380a9291906149f6565b600060405180830381600087803b15801561382457600080fd5b505af1158015613838573d6000803e3d6000fd5b5050506001600160a01b039099166000908152602360209081526040808320805460ff199081169091556024835281842080549091169055602c9091529020429055505050505050505050565b81156139de57602754871061389d57600895506138a3565b60125495505b601354601454601554602854929750909550935060ff161561399b576030546001600160a01b038a166000908152602b60205260409020546138e59190614b1e565b42101561392d5760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b6044820152606401610f5e565b60105487111561397f5760405162461bcd60e51b815260206004820152601b60248201527f61626f7665206d6178207472616e73616374696f6e206c696d697400000000006044820152606401610f5e565b6001600160a01b0389166000908152602b602052604090204290555b6001600160a01b0389166000908152602360209081526040808320805460ff199081169091556024835281842080549091169055602c9091529020429055613de1565b8015613de1576001600160a01b03881660009081526023602052604090205460ff1615613b35576001600160a01b038816600090815260256020526040902054613a2b9062015180614b1e565b4210158015613a445750602754613a4189611b0c565b10155b15613b3557613a548989896130a0565b600d546001600160a01b031663e30443bc8a613a6f816131a9565b6040518363ffffffff1660e01b8152600401613a8c9291906149f6565b600060405180830381600087803b158015613aa657600080fd5b505af1158015613aba573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905089613adb816131a9565b6040518363ffffffff1660e01b8152600401613af89291906149f6565b600060405180830381600087803b158015613b1257600080fd5b505af1158015613b26573d6000803e3d6000fd5b50505050505050505050505050565b6001600160a01b03881660009081526024602052604090205460ff16613b86576001600160a01b0388166000908152602460209081526040808320805460ff19166001179055602c90915290204290555b6001600160a01b03881660009081526023602052604090205460ff16613bd7576001600160a01b0388166000908152602360209081526040808320805460ff19166001179055602590915290204290555b6019546016546017546018546028549399509197509550935060ff1615613d6a57602f54602e54613c089190614b1e565b4211613c4b5760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b6044820152606401610f5e565b6029543a1115613c9d5760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401610f5e565b6001600160a01b0388166000908152602a6020526040902054439003613cfc5760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b6044820152606401610f5e565b601054871115613d4e5760405162461bcd60e51b815260206004820152601b60248201527f61626f7665206d6178207472616e73616374696f6e206c696d697400000000006044820152606401610f5e565b6001600160a01b0388166000908152602a602052604090204390555b6000613d7589611b0c565b600f54909150613d858983614b1e565b1115613ddf5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610f5e565b505b6000613df7613df08686614b1e565b8890612bea565b90506000613e0430611b0c565b60115490915081108015908190613e185750845b15613f31576008805460ff60a01b1916600160a01b179055601b5460ff168015613e425750600086115b8015613e5057506000600c54115b15613f02576000613e6e600954600a54612bea90919063ffffffff16565b90506000613e8b82610fb1600a5487612c5090919063ffffffff16565b90506000613ea883610fb160095488612c5090919063ffffffff16565b90506000613ec5600c54610fb18c86612c5090919063ffffffff16565b90506000613ee2600b54610fb18d86612c5090919063ffffffff16565b90506000613ef08284612bea565b9050613efb8161441a565b5050505050505b6000613f0d30611b0c565b9050613f1881612d14565b506001600a8190556009556008805460ff60a01b191690555b6000613f426064610fb18d87612c50565b905060008915613f8e576064613f588d8c612c50565b613f629190614a7b565b600854909150613f7d908f906001600160a01b0316836130a0565b600254613f8a9082612f39565b6002555b613fa2613f9b8284614b1e565b8d90612f39565b9b508615613fbf57600954613fb79083612bea565b600955613fd0565b600a54613fcc9083612bea565b600a555b613fdb8e30846130a0565b601c54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015614048575060408051601f3d908101601f1916820190925261404591810190614a9d565b60015b1561409c576040805184815260208101849052908101829052606081018590526001907f9dc81572b65340d35ebe017a23f2c72bc0c4364a633be553004be62a3eef54f79060800160405180910390a25050505b50505050505050505b6140b08787876130a0565b600d546001600160a01b031663e30443bc886140cb816131a9565b6040518363ffffffff1660e01b81526004016140e89291906149f6565b600060405180830381600087803b15801561410257600080fd5b505af1158015614116573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905087614137816131a9565b6040518363ffffffff1660e01b81526004016141549291906149f6565b600060405180830381600087803b15801561416e57600080fd5b505af1158015614182573d6000803e3d6000fd5b5050505050505050505050565b600081848411156141b35760405162461bcd60e51b8152600401610f5e9190614564565b5060006141c08486614bb9565b95945050505050565b6001600160a01b0382166000908152601e60205260409020805460ff1916821580159190911790915561425657600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561423d57600080fd5b505af1158015614251573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600081836142b35760405162461bcd60e51b8152600401610f5e9190614564565b5060006141c08486614a7b565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106142f5576142f56149e0565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561434e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143729190614a28565b81600181518110614385576143856149e0565b6001600160a01b0392831660209182029290920101526006546143ab9130911684612f7b565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906143e4908590600090869030904290600401614bcc565b600060405180830381600087803b1580156143fe57600080fd5b505af1158015614412573d6000803e3d6000fd5b505050505050565b6000614427826002612cd2565b905060006144358383612f39565b905047614441836142c0565b600061444d4783612f39565b905061445983826144a1565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6006546144b99030906001600160a01b031684612f7b565b60065460405163f305d71960e01b8152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015614526573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061151d9190614a9d565b60006020828403121561455d57600080fd5b5035919050565b600060208083528351808285015260005b8181101561459157858101830151858201604001528201614575565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461162a57600080fd5b801515811461162a57600080fd5b600080604083850312156145e857600080fd5b82356145f3816145b2565b91506020830135614603816145c7565b809150509250929050565b6000806040838503121561462157600080fd5b823561462c816145b2565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156146795761467961463a565b604052919050565b600067ffffffffffffffff82111561469b5761469b61463a565b5060051b60200190565b600082601f8301126146b657600080fd5b813560206146cb6146c683614681565b614650565b82815260059290921b840181019181810190868411156146ea57600080fd5b8286015b8481101561470557803583529183019183016146ee565b509695505050505050565b6000806040838503121561472357600080fd5b823567ffffffffffffffff8082111561473b57600080fd5b818501915085601f83011261474f57600080fd5b8135602061475f6146c683614681565b82815260059290921b8401810191818101908984111561477e57600080fd5b948201945b838610156147a5578535614796816145b2565b82529482019490820190614783565b965050860135925050808211156147bb57600080fd5b506147c8858286016146a5565b9150509250929050565b6000806000606084860312156147e757600080fd5b83356147f2816145b2565b92506020840135614802816145b2565b929592945050506040919091013590565b60006020828403121561482557600080fd5b8135612c49816145c7565b60006020828403121561484257600080fd5b8135612c49816145b2565b6000806040838503121561486057600080fd5b823561486b816145b2565b91506020830135614603816145b2565b6000806000806080858703121561489157600080fd5b5050823594602084013594506040840135936060013592509050565b600080600080600080600080610100898b0312156148ca57600080fd5b505086359860208801359850604088013597606081013597506080810135965060a0810135955060c0810135945060e0013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176111c0576111c0614937565b600181811c9082168061497857607f821691505b60208210810361499857634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526022908201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604082015261030360f41b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03929092168252602082015260400190565b600060018201614a2157614a21614937565b5060010190565b600060208284031215614a3a57600080fd5b8151612c49816145b2565b600060208284031215614a5757600080fd5b5051919050565b600060208284031215614a7057600080fd5b8151612c49816145c7565b600082614a9857634e487b7160e01b600052601260045260246000fd5b500490565b600080600060608486031215614ab257600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c08789031215614ae457600080fd5b8651614aef816145b2565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b808201808211156111c0576111c0614937565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156111c0576111c0614937565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614c1c5784516001600160a01b031683529383019391830191600101614bf7565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ba6180f189fcc48843217cc4551f02d925f12e9eb57126958f8cd53ec2825d6d64736f6c63430008110033

Deployed Bytecode Sourcemap

23375:29236:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23535:64;;;;;;;;;;-1:-1:-1;23535:64:0;;;;-1:-1:-1;;;;;23535:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;23535:64:0;;;;;;;;49181:443;;;;;;;;;;-1:-1:-1;49181:443:0;;;;;:::i;:::-;;:::i;:::-;;5024:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30751:181::-;;;;;;;;;;-1:-1:-1;30751:181:0;;;;;:::i;:::-;;:::i;31719:171::-;;;;;;;;;;-1:-1:-1;31719:171:0;;;;;:::i;:::-;;:::i;5938:169::-;;;;;;;;;;-1:-1:-1;5938:169:0;;;;;:::i;:::-;;:::i;:::-;;;2091:14:1;;2084:22;2066:41;;2054:2;2039:18;5938:169:0;1926:187:1;23450:41:0;;;;;;;;;;-1:-1:-1;23450:41:0;;;;-1:-1:-1;;;;;23450:41:0;;;5345:108;;;;;;;;;;-1:-1:-1;5433:12:0;;5345:108;;;2499:25:1;;;2487:2;2472:18;5345:108:0;2353:177:1;25670:33:0;;;;;;;;;;;;;;;;23713:28;;;;;;;;;;;;;;;;51160:641;;;;;;;;;;-1:-1:-1;51160:641:0;;;;;:::i;:::-;;:::i;6115:338::-;;;;;;;;;;-1:-1:-1;6115:338:0;;;;;:::i;:::-;;:::i;48207:114::-;;;;;;;;;;;;;:::i;23823:43::-;;;;;;;;;;-1:-1:-1;23823:43:0;;;;-1:-1:-1;;;;;23823:43:0;;;36312:141;;;;;;;;;;;;;:::i;29376:93::-;;;;;;;;;;-1:-1:-1;29376:93:0;;29459:2;5870:36:1;;5858:2;5843:18;29376:93:0;5728:184:1;38360:119:0;;;;;;;;;;-1:-1:-1;38360:119:0;;;;;:::i;:::-;;:::i;6461:218::-;;;;;;;;;;-1:-1:-1;6461:218:0;;;;;:::i;:::-;;:::i;23677:29::-;;;;;;;;;;;;;;;;33821:121;;;;;;;;;;-1:-1:-1;33821:121:0;;;;;:::i;:::-;;:::i;23500:28::-;;;;;;;;;;-1:-1:-1;23500:28:0;;;;-1:-1:-1;;;;;23500:28:0;;;25178:33;;;;;;;;;;-1:-1:-1;25178:33:0;;;;;;;;24398:40;;;;;;;;;;-1:-1:-1;24398:40:0;;;;;;;;23634:34;;;;;;;;;;-1:-1:-1;23634:34:0;;;;-1:-1:-1;;;23634:34:0;;;;;;37729:103;;;;;;;;;;;;;:::i;32928:238::-;;;;;;;;;;-1:-1:-1;32928:238:0;;;;;:::i;:::-;;:::i;36461:126::-;;;;;;;;;;-1:-1:-1;36461:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;36551:28:0;36527:4;36551:28;;;:19;:28;;;;;;;;;36461:126;24253:31;;;;;;;;;;;;;;;;48329:160;;;;;;;;;;-1:-1:-1;48329:160:0;;;;;:::i;:::-;;:::i;24220:26::-;;;;;;;;;;;;;;;;48497:152;;;;;;;;;;-1:-1:-1;48497:152:0;;;;;:::i;:::-;;:::i;33200:120::-;;;;;;;;;;-1:-1:-1;33200:120:0;;;;;:::i;:::-;;:::i;37978:142::-;;;;;;;;;;;;;:::i;32711:209::-;;;;;;;;;;-1:-1:-1;32711:209:0;;;;;:::i;:::-;;:::i;31591:99::-;;;;;;;;;;-1:-1:-1;31591:99:0;;;;;:::i;:::-;;:::i;36755:139::-;;;;;;;;;;-1:-1:-1;36755:139:0;;;;;:::i;:::-;;:::i;25643:20::-;;;;;;;;;;;;;;;;38487:153;;;;;;;;;;-1:-1:-1;38487:153:0;;;;;:::i;:::-;;:::i;37461:260::-;;;;;;;;;;-1:-1:-1;37461:260:0;;;;;:::i;:::-;;:::i;32500:146::-;;;;;;;;;;;;;:::i;5461:127::-;;;;;;;;;;-1:-1:-1;5461:127:0;;;;;:::i;:::-;;:::i;51809:799::-;;;;;;;;;;-1:-1:-1;51809:799:0;;;;;:::i;:::-;;:::i;11540:148::-;;;;;;;;;;;;;:::i;30981:127::-;;;;;;;;;;-1:-1:-1;30981:127:0;;;;;:::i;:::-;;:::i;34487:208::-;;;;;;;;;;-1:-1:-1;34487:208:0;;;;;:::i;:::-;;:::i;23875:38::-;;;;;;;;;;-1:-1:-1;23875:38:0;;;;-1:-1:-1;;;;;23875:38:0;;;24328:28;;;;;;;;;;;;;;;;31405:147;;;;;;;;;;-1:-1:-1;31405:147:0;;;;;:::i;:::-;;:::i;34703:234::-;;;;;;;;;;-1:-1:-1;34703:234:0;;;;;:::i;:::-;;:::i;38128:109::-;;;;;;;;;;-1:-1:-1;38128:109:0;;;;;:::i;:::-;;:::i;34238:241::-;;;;;;;;;;-1:-1:-1;34238:241:0;;;;;:::i;:::-;;:::i;25600:30::-;;;;;;;;;;;;;;;;24109:27;;;;;;;;;;;;;;;;11326:79;;;;;;;;;;-1:-1:-1;11391:6:0;;-1:-1:-1;;;;;11391:6:0;11326:79;;34945:241;;;;;;;;;;;;;:::i;24143:32::-;;;;;;;;;;;;;;;;5132:104;;;;;;;;;;;;;:::i;33544:140::-;;;;;;;;;;-1:-1:-1;33544:140:0;;;;;:::i;:::-;;:::i;24447:40::-;;;;;;;;;;;;;;;;33692:121;;;;;;;;;;-1:-1:-1;33692:121:0;;;;;:::i;:::-;;:::i;31146:197::-;;;;;;;;;;-1:-1:-1;31146:197:0;;;;;:::i;:::-;;:::i;6687:286::-;;;;;;;;;;-1:-1:-1;6687:286:0;;;;;:::i;:::-;;:::i;36595:152::-;;;;;;;;;;-1:-1:-1;36595:152:0;;;;;:::i;:::-;;:::i;5596:175::-;;;;;;;;;;-1:-1:-1;5596:175:0;;;;;:::i;:::-;;:::i;24363:26::-;;;;;;;;;;;;;;;;36902:264;;;;;;;;;;-1:-1:-1;36902:264:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6940:32:1;;;6922:51;;7004:2;6989:18;;6982:34;;;;7032:18;;;7025:34;;;;7090:2;7075:18;;7068:34;7133:3;7118:19;;7111:35;6960:3;7162:19;;7155:35;6909:3;6894:19;36902:264:0;6639:557:1;25567:26:0;;;;;;;;;;;;;;;;24555:57;;;;;;;;;;-1:-1:-1;24555:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31977:174;;;;;;;;;;-1:-1:-1;31977:174:0;;;;;:::i;:::-;;:::i;38648:127::-;;;;;;;;;;-1:-1:-1;38648:127:0;;;;;:::i;:::-;;:::i;24073:29::-;;;;;;;;;;;;;;;;30435:268;;;;;;;;;;-1:-1:-1;30435:268:0;;;;;:::i;:::-;;:::i;33328:208::-;;;;;;;;;;-1:-1:-1;33328:208:0;;;;;:::i;:::-;;:::i;48041:158::-;;;;;;;;;;-1:-1:-1;48041:158:0;;;;;:::i;:::-;;:::i;5779:151::-;;;;;;;;;;-1:-1:-1;5779:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;5895:18:0;;;5868:7;5895:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;5779:151;29607:763;;;;;;;;;;-1:-1:-1;29607:763:0;;;;;:::i;:::-;;:::i;24033:33::-;;;;;;;;;;;;;;;;37840:130;;;;;;;;;;;;;:::i;24006:20::-;;;;;;;;;;;;;;;;24291:30;;;;;;;;;;;;;;;;37174:279;;;;;;;;;;-1:-1:-1;37174:279:0;;;;;:::i;:::-;;:::i;35194:1110::-;;;;;;;;;;-1:-1:-1;35194:1110:0;;;;;:::i;:::-;;:::i;11696:243::-;;;;;;;;;;-1:-1:-1;11696:243:0;;;;;:::i;:::-;;:::i;38245:107::-;;;;;;;;;;-1:-1:-1;38245:107:0;;;;;:::i;:::-;;:::i;24182:31::-;;;;;;;;;;;;;;;;23975:24;;;;;;;;;;;;;;;;32220:221;;;;;;;;;;-1:-1:-1;32220:221:0;;;;;:::i;:::-;;:::i;49181:443::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;;;;;;;;;49269:17:::1;:6:::0;49279::::1;49269:17;:::i;:::-;49260:26;;49297:19;49319:25;49333:10;;49319:9;;:13;;:25;;;;:::i;:::-;49297:47;;49355:15;49373:38;49399:11;49373:21;49384:9;;49373:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;49355:56;;49422:16;49441:39;49468:11;49441:22;49452:10;;49441:6;:10;;:22;;;;:::i;:39::-;49422:58;;49493:28;49514:6;49493:20;:28::i;:::-;49546:9;::::0;:22:::1;::::0;49560:7;49546:13:::1;:22::i;:::-;49534:9;:34:::0;49592:10:::1;::::0;:24:::1;::::0;49607:8;49592:14:::1;:24::i;:::-;49579:10;:37:::0;-1:-1:-1;;;;49181:443:0:o;5024:100::-;5078:13;5111:5;5104:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5024:100;:::o;30751:181::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30835:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;30835:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;30890:34;;2066:41:1;;;30890:34:0::1;::::0;2039:18:1;30890:34:0::1;;;;;;;30751:181:::0;;:::o;31719:171::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;31805:2:::1;31797:4;:10;;31789:53;;;::::0;-1:-1:-1;;;31789:53:0;;9903:2:1;31789:53:0::1;::::0;::::1;9885:21:1::0;9942:2;9922:18;;;9915:30;9981:32;9961:18;;;9954:60;10031:18;;31789:53:0::1;9701:354:1::0;31789:53:0::1;31869:13;:4:::0;31876:6:::1;31869:13;:::i;:::-;31853;:29:::0;-1:-1:-1;31719:171:0:o;5938:169::-;6021:4;6038:39;206:10;6061:7;6070:6;6038:8;:39::i;:::-;-1:-1:-1;6095:4:0;5938:169;;;;;:::o;51160:641::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;51332:6:::1;:13;51307:14;:21;:38;51299:80;;;::::0;-1:-1:-1;;;51299:80:0;;10262:2:1;51299:80:0::1;::::0;::::1;10244:21:1::0;10301:2;10281:18;;;10274:30;10340:32;10320:18;;;10313:60;10390:18;;51299:80:0::1;10060:354:1::0;51299:80:0::1;51423:3;51398:14;:21;:28;;51390:75;;;;-1:-1:-1::0;;;51390:75:0::1;;;;;;;:::i;:::-;51481:9;51476:318;51500:14;:21;51496:1;:25;51476:318;;;51543:14;51560;51575:1;51560:17;;;;;;;;:::i;:::-;;;;;;;51543:34;;51592:21;51616:6;51623:1;51616:9;;;;;;;;:::i;:::-;;;;;;;51629:6;51616:20;;;;:::i;:::-;51592:44;;51651:50;51667:10;51679:6;51687:13;51651:15;:50::i;:::-;51716:15;::::0;-1:-1:-1;;;;;51716:15:0::1;:26;51751:6:::0;51760:21:::1;51751:6:::0;51760:13:::1;:21::i;:::-;51716:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51528:266;;51523:3;;;;;:::i;:::-;;;;51476:318;;;;51160:641:::0;;:::o;6115:338::-;6221:4;6238:36;6248:6;6256:9;6267:6;6238:9;:36::i;:::-;6285:138;6294:6;206:10;6316:106;6354:6;6316:106;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6316:19:0;;;;;;:11;:19;;;;;;;;206:10;6316:33;;;;;;;;;;:37;:106::i;:::-;6285:8;:138::i;:::-;-1:-1:-1;6441:4:0;6115:338;;;;;:::o;48207:114::-;48281:15;;:32;;;-1:-1:-1;;;48281:32:0;;;;48254:7;;-1:-1:-1;;;;;48281:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48274:39;;48207:114;:::o;36312:141::-;36402:15;;:43;;;-1:-1:-1;;;36402:43:0;;;;36375:7;;-1:-1:-1;;;;;36402:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38360:119::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;38430:15:::1;::::0;:41:::1;::::0;-1:-1:-1;;;38430:41:0;;2091:14:1;;2084:22;38430:41:0::1;::::0;::::1;2066::1::0;-1:-1:-1;;;;;38430:15:0;;::::1;::::0;:34:::1;::::0;2039:18:1;;38430:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38360:119:::0;:::o;6461:218::-;206:10;6549:4;6598:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6598:34:0;;;;;;;;;;6549:4;;6566:83;;6589:7;;6598:50;;6637:10;6598:38;:50::i;33821:121::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;33891:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;33891:43:0;;2091:14:1;;2084:22;33891:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;33891:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;33891:43:0::1;1926:187:1::0;37729:103:0;37766:15;;:58;;-1:-1:-1;;;37766:58:0;;37805:10;37766:58;;;12010:51:1;37766:15:0;12077:18:1;;;12070:50;-1:-1:-1;;;;;37766:15:0;;;;:30;;11983:18:1;;37766:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37729:103::o;32928:238::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;33017:16:::1;:5:::0;33026:6:::1;33017:16;:::i;:::-;33009:24;;33076:4;33061:12;;:19;;;;:::i;:::-;33052:5;:28;;33044:73;;;::::0;-1:-1:-1;;;33044:73:0;;12805:2:1;33044:73:0::1;::::0;::::1;12787:21:1::0;;;12824:18;;;12817:30;12883:34;12863:18;;;12856:62;12935:18;;33044:73:0::1;12603:356:1::0;33044:73:0::1;33128:22;:30:::0;32928:238::o;48329:160::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;48420:15:::1;::::0;:61:::1;::::0;-1:-1:-1;;;48420:61:0;;::::1;::::0;::::1;2499:25:1::0;;;-1:-1:-1;;;;;48420:15:0;;::::1;::::0;:54:::1;::::0;2472:18:1;;48420:61:0::1;2353:177:1::0;48497:152:0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;48584:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;48584:57:0;;::::1;::::0;::::1;2499:25:1::0;;;-1:-1:-1;;;;;48584:15:0;;::::1;::::0;:50:::1;::::0;2472:18:1;;48584:57:0::1;2353:177:1::0;33200:120:0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;33295:17:::1;:6:::0;33305::::1;33295:17;:::i;:::-;33274:18;:38:::0;-1:-1:-1;33200:120:0:o;37978:142::-;38071:15;;:41;;;-1:-1:-1;;;38071:41:0;;;;38044:7;;-1:-1:-1;;;;;38071:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;32711:209;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;32782:16:::1;:5:::0;32791:6:::1;32782:16;:::i;:::-;32774:24;;32841:4;32826:12;;:19;;;;:::i;:::-;32817:5;:28;;32809:79;;;::::0;-1:-1:-1;;;32809:79:0;;13166:2:1;32809:79:0::1;::::0;::::1;13148:21:1::0;13205:2;13185:18;;;13178:30;13244:34;13224:18;;;13217:62;-1:-1:-1;;;13295:18:1;;;13288:36;13341:19;;32809:79:0::1;12964:402:1::0;32809:79:0::1;32899:5;:13:::0;32711:209::o;31591:99::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;31660:14:::1;:22:::0;;-1:-1:-1;;31660:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31591:99::o;36755:139::-;36852:15;;:34;;-1:-1:-1;;;36852:34:0;;-1:-1:-1;;;;;178:32:1;;;36852:34:0;;;160:51:1;36825:7:0;;36852:15;;:25;;133:18:1;;36852:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38487:153::-;38584:15;;:48;;-1:-1:-1;;;38584:48:0;;-1:-1:-1;;;;;178:32:1;;;38584:48:0;;;160:51:1;38560:4:0;;38584:15;;:39;;133:18:1;;38584:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37461:260::-;37593:15;;:28;;-1:-1:-1;;;;;;37593:28:0;;;;;2499:25:1;;;37527:18:0;;;;;;-1:-1:-1;;;;;37593:15:0;;:23;;2472:18:1;;37593:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37637:76;;;13913:25:1;;;13969:2;13954:18;;13947:34;;;13997:18;;;13990:34;;;14055:2;14040:18;;14033:34;;;37526:95:0;;-1:-1:-1;37526:95:0;;-1:-1:-1;37526:95:0;-1:-1:-1;37702:5:0;;37637:76;;13900:3:1;13885:19;37637:76:0;;;;;;;37515:206;;;37461:260;:::o;32500:146::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;32599:39:::1;::::0;32567:21:::1;::::0;32607:10:::1;::::0;32599:39;::::1;;;::::0;32567:21;;32547:17:::1;32599:39:::0;32547:17;32599:39;32567:21;32607:10;32599:39;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;32536:110;32500:146::o:0;5461:127::-;-1:-1:-1;;;;;5562:18:0;5535:7;5562:18;;;;;;;;;;;;5461:127::o;51809:799::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;51988:6:::1;:13;51963:14;:21;:38;51955:81;;;::::0;-1:-1:-1;;;51955:81:0;;10262:2:1;51955:81:0::1;::::0;::::1;10244:21:1::0;10301:2;10281:18;;;10274:30;10340:32;10320:18;;;10313:60;10390:18;;51955:81:0::1;10060:354:1::0;51955:81:0::1;52080:3;52055:14;:21;:28;;52047:75;;;;-1:-1:-1::0;;;52047:75:0::1;;;;;;;:::i;:::-;52138:9;52133:468;52157:14;:21;52153:1;:25;52133:468;;;52200:14;52217;52232:1;52217:17;;;;;;;;:::i;:::-;;;;;;;52200:34;;52249:21;52273:6;52280:1;52273:9;;;;;;;;:::i;:::-;;;;;;;52286:6;52273:20;;;;:::i;:::-;52249:44;;52308:50;52324:10;52336:6;52344:13;52308:15;:50::i;:::-;52373:15;::::0;-1:-1:-1;;;;;52373:15:0::1;:26;52408:6:::0;52417:21:::1;52408:6:::0;52417:13:::1;:21::i;:::-;52373:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;52454:21:0;;::::1;;::::0;;;:13:::1;:21:::0;;;;;;;:37;;;;52506:10:::1;:18:::0;;;;;:25;;-1:-1:-1;;52506:25:0::1;52527:4;52506:25;::::0;;52546:17:::1;:25:::0;;;52574:15:::1;52546:43:::0;;-1:-1:-1;52180:3:0;::::1;::::0;::::1;:::i;:::-;;;;52133:468;;11540:148:::0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;11631:6:::1;::::0;11610:40:::1;::::0;11647:1:::1;::::0;-1:-1:-1;;;;;11631:6:0::1;::::0;11610:40:::1;::::0;11647:1;;11610:40:::1;11661:6;:19:::0;;-1:-1:-1;;;;;;11661:19:0::1;::::0;;11540:148::o;30981:127::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;31055:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;31055:45:0;;-1:-1:-1;;;;;178:32:1;;;31055:45:0::1;::::0;::::1;160:51:1::0;31055:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;31055:45:0::1;14:203:1::0;34487:208:0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;34556:15:::1;::::0;:46:::1;::::0;-1:-1:-1;;;34556:46:0;;-1:-1:-1;;;;;178:32:1;;;34556:46:0::1;::::0;::::1;160:51:1::0;34556:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;34556:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;34613:29:0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;34613:36:0::1;34645:4;34613:36;::::0;;-1:-1:-1;34660:27:0::1;34633:8:::0;34660:17:::1;:27::i;31405:147::-:0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31494:41:0;;;::::1;;::::0;;;:33:::1;:41;::::0;;;;:50;;-1:-1:-1;;31494:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31405:147::o;34703:234::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;34809:1:::1;34791:14;:19;;34782:62;;;::::0;-1:-1:-1;;;34782:62:0;;14280:2:1;34782:62:0::1;::::0;::::1;14262:21:1::0;14319:2;14299:18;;;14292:30;14358:31;14338:18;;;14331:59;14407:18;;34782:62:0::1;14078:353:1::0;34782:62:0::1;34855:11;:28:::0;;;34899:30:::1;::::0;2499:25:1;;;34899:30:0::1;::::0;2487:2:1;2472:18;34899:30:0::1;;;;;;;;34703:234:::0;:::o;38128:109::-;38182:15;;:47;;-1:-1:-1;;;38182:47:0;;38211:10;38182:47;;;12010:51:1;12104:14;;12097:22;12077:18;;;12070:50;-1:-1:-1;;;;;38182:15:0;;;;:28;;11983:18:1;;38182:47:0;11826:300:1;34238:241:0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;34336:6:::1;34324:8;:18;;:41;;;;;34358:7;34346:8;:19;;34324:41;34316:50;;;::::0;::::1;;34416:16;::::0;34382:51:::1;::::0;34406:8;;34382:51:::1;::::0;;;::::1;34444:16;:27:::0;34238:241::o;34945:::-;35017:10;35005:23;;;;:11;:23;;;;;;;;35000:103;;35065:10;35053:23;;;;:11;:23;;;;;:30;;-1:-1:-1;;35053:30:0;35079:4;35053:30;;;35000:103;35113:15;;-1:-1:-1;;;;;35113:15:0;:26;35140:10;35152:25;35140:10;35152:13;:25::i;:::-;35113:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34945:241::o;5132:104::-;5188:13;5221:7;5214:14;;;;;:::i;33544:140::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;33635:41:::1;33664:4;33670:5;33635:28;:41::i;33692:121::-:0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;33762:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;33762:43:0;;2091:14:1;;2084:22;33762:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;33762:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;33762:43:0::1;1926:187:1::0;31146:197:0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;31220:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;31220:45:0;;-1:-1:-1;;;;;178:32:1;;;31220:45:0::1;::::0;::::1;160:51:1::0;31220:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;31220:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31276:15:0::1;::::0;-1:-1:-1;;;;;31276:15:0::1;::::0;-1:-1:-1;31276:26:0::1;::::0;-1:-1:-1;31303:7:0;31312:22:::1;31303:7:::0;31312:13:::1;:22::i;:::-;31276:59;;;;;;;;;;;;;;;;:::i;6687:286::-:0;6780:4;6797:146;206:10;6820:7;6829:113;6868:15;6829:113;;;;;;;;;;;;;;;;;206:10;6829:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6829:34:0;;;;;;;;;;;;:38;:113::i;36595:152::-;36692:15;;:47;;-1:-1:-1;;;36692:47:0;;-1:-1:-1;;;;;178:32:1;;;36692:47:0;;;160:51:1;36665:7:0;;36692:15;;:38;;133:18:1;;36692:47:0;14:203:1;5596:175:0;5682:4;5699:42;206:10;5723:9;5734:6;5699:9;:42::i;36902:264::-;37123:15;;:35;;-1:-1:-1;;;37123:35:0;;-1:-1:-1;;;;;178:32:1;;;37123:35:0;;;160:51:1;36975:7:0;;;;;;;;;;;;37123:15;;;;:26;;133:18:1;;37123:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37116:42;;;;-1:-1:-1;37116:42:0;;-1:-1:-1;37116:42:0;-1:-1:-1;37116:42:0;-1:-1:-1;37116:42:0;;-1:-1:-1;36902:264:0;-1:-1:-1;;36902:264:0:o;31977:174::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;32065:3:::1;32056:5;:12;;32048:63;;;::::0;-1:-1:-1;;;32048:63:0;;15768:2:1;32048:63:0::1;::::0;::::1;15750:21:1::0;15807:2;15787:18;;;15780:30;15846:34;15826:18;;;15819:62;-1:-1:-1;;;15897:18:1;;;15890:36;15943:19;;32048:63:0::1;15566:402:1::0;32048:63:0::1;32122:13;:21:::0;31977:174::o;38648:127::-;38732:15;;:35;;-1:-1:-1;;;38732:35:0;;-1:-1:-1;;;;;178:32:1;;;38732:35:0;;;160:51:1;38708:4:0;;38732:15;;:26;;133:18:1;;38732:35:0;14:203:1;30435:268:0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30507:41:0;;::::1;;::::0;;;:33:::1;:41;::::0;;;;;;;:48;;30551:4:::1;-1:-1:-1::0;;30507:48:0;;::::1;::::0;::::1;::::0;;;30566:19:::1;:27:::0;;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;30611:15:::1;::::0;:44;;-1:-1:-1;;;30611:44:0;;::::1;::::0;::::1;160:51:1::0;;;;30611:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;30611:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;30671:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;30671:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;30671:24:0::1;14:203:1::0;33328:208:0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;33408:21:::1;::::0;:32;::::1;;:21;::::0;;::::1;:32;;::::0;33400:41:::1;;;::::0;::::1;;33452:21;:31:::0;;-1:-1:-1;;33452:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;33499:29:::1;::::0;2066:41:1;;;33499:29:0::1;::::0;2054:2:1;2039:18;33499:29:0::1;1926:187:1::0;48041:158:0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;48111:15:::1;::::0;:40:::1;::::0;-1:-1:-1;;;48111:40:0;;-1:-1:-1;;;;;178:32:1;;;48111:40:0::1;::::0;::::1;160:51:1::0;48111:15:0;;::::1;::::0;:33:::1;::::0;133:18:1;;48111:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;48167:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;48167:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;48167:24:0::1;14:203:1::0;29607:763:0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;29797:27:::1;:16:::0;29817:6:::1;29797:27;:::i;:::-;29778:46:::0;-1:-1:-1;29850:23:0::1;:12:::0;29866:6:::1;29850:23;:::i;:::-;29893:14;::::0;29835:38;;-1:-1:-1;;;;29893:14:0;::::1;;;29892:15;29884:24;;;::::0;::::1;;29962:4;29947:12;;:19;;;;:::i;:::-;29927:16;:39;;29919:72;;;::::0;-1:-1:-1;;;29919:72:0;;16175:2:1;29919:72:0::1;::::0;::::1;16157:21:1::0;16214:2;16194:18;;;16187:30;-1:-1:-1;;;16233:18:1;;;16226:51;16294:18;;29919:72:0::1;15973:345:1::0;29919:72:0::1;30041:4;30026:12;;:19;;;;:::i;:::-;30010:12;:35;;30002:68;;;::::0;-1:-1:-1;;;30002:68:0;;16175:2:1;30002:68:0::1;::::0;::::1;16157:21:1::0;16214:2;16194:18;;;16187:30;-1:-1:-1;;;16233:18:1;;;16226:51;16294:18;;30002:68:0::1;15973:345:1::0;30002:68:0::1;30081:9;:28:::0;;;30120:5:::1;:20:::0;;;30167:23:::1;:14:::0;30184:6:::1;30167:23;:::i;:::-;30151:13;:39:::0;30201:14:::1;:21:::0;;-1:-1:-1;;;;30201:21:0::1;-1:-1:-1::0;;;30201:21:0::1;::::0;;30247:12:::1;30233:11;:26:::0;30288:15:::1;30270;:33:::0;30314:5:::1;:16:::0;;;30346::::1;::::0;::::1;::::0;30201:21;;30346:16:::1;29607:763:::0;;;;:::o;37840:130::-;37923:15;;:39;;;-1:-1:-1;;;37923:39:0;;;;37896:7;;-1:-1:-1;;;;;37923:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;37174:279;37405:15;;:40;;-1:-1:-1;;;37405:40:0;;;;;2499:25:1;;;37252:7:0;;;;;;;;;;;;-1:-1:-1;;;;;37405:15:0;;;;:33;;2472:18:1;;37405:40:0;2353:177:1;35194:1110:0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;35468:11:::1;:21:::0;;;35500:16:::1;:31:::0;;;35542:15:::1;:30:::0;;;35583:13:::1;:26:::0;;;35620:12:::1;:23:::0;;;35654:17:::1;:33:::0;;;35698:16:::1;:32:::0;;;35741:14:::1;:28:::0;;;35798:59:::1;35674:13:::0;35798:36:::1;35758:11:::0;35717:13;35798:18:::1;:36::i;:::-;:40:::0;::::1;:59::i;:::-;35782:13;:75:::0;35924:16:::1;::::0;35903:15:::1;::::0;35885:13:::1;::::0;:56:::1;::::0;35924:16;35885:34:::1;::::0;:13;:17:::1;:34::i;:56::-;35870:12;:71:::0;35971:1:::1;35960:12:::0;::::1;::::0;::::1;::::0;:29:::1;;;35988:1;35976:8;:13;;35960:29;35952:68;;;::::0;-1:-1:-1;;;35952:68:0;;16525:2:1;35952:68:0::1;::::0;::::1;16507:21:1::0;16564:2;16544:18;;;16537:30;16603:28;16583:18;;;16576:56;16649:18;;35952:68:0::1;16323:350:1::0;35952:68:0::1;36056:2;36039:13;;:19;;:41;;;;;36078:2;36062:12;;:18;;36039:41;36031:82;;;::::0;-1:-1:-1;;;36031:82:0;;16880:2:1;36031:82:0::1;::::0;::::1;16862:21:1::0;16919:2;16899:18;;;16892:30;16958;16938:18;;;16931:58;17006:18;;36031:82:0::1;16678:352:1::0;36031:82:0::1;36142:12;::::0;36156:17:::1;::::0;36175:16:::1;::::0;36193:14:::1;::::0;36209:11:::1;::::0;36247:16:::1;::::0;36265:15:::1;::::0;36282:13:::1;::::0;36131:165:::1;::::0;;17378:25:1;;;17434:2;17419:18;;17412:34;;;;17462:18;;;17455:34;;;;17520:2;17505:18;;17498:34;;;;17563:3;17548:19;;17541:35;17607:3;17592:19;;17585:35;17651:3;17636:19;;17629:35;17695:3;17680:19;;17673:35;36131:165:0::1;::::0;17365:3:1;17350:19;36131:165:0::1;;;;;;;35194:1110:::0;;;;;;;;:::o;11696:243::-;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11785:22:0;::::1;11777:72;;;::::0;-1:-1:-1;;;11777:72:0;;17921:2:1;11777:72:0::1;::::0;::::1;17903:21:1::0;17960:2;17940:18;;;17933:30;17999:34;17979:18;;;17972:62;-1:-1:-1;;;18050:18:1;;;18043:36;18096:19;;11777:72:0::1;17719:402:1::0;11777:72:0::1;11886:6;::::0;11865:38:::1;::::0;-1:-1:-1;;;;;11865:38:0;;::::1;::::0;11886:6:::1;::::0;11865:38:::1;::::0;11886:6:::1;::::0;11865:38:::1;11914:6;:17:::0;;-1:-1:-1;;;;;;11914:17:0::1;-1:-1:-1::0;;;;;11914:17:0;;;::::1;::::0;;;::::1;::::0;;11696:243::o;38245:107::-;38298:15;;:46;;-1:-1:-1;;;38298:46:0;;38326:10;38298:46;;;12010:51:1;12104:14;;12097:22;12077:18;;;12070:50;-1:-1:-1;;;;;38298:15:0;;;;:27;;11983:18:1;;38298:46:0;11826:300:1;32220:221:0;11453:6;;-1:-1:-1;;;;;11453:6:0;206:10;11453:22;11445:67;;;;-1:-1:-1;;;11445:67:0;;;;;;;:::i;:::-;32295:16:::1;:5:::0;32304:6:::1;32295:16;:::i;:::-;32287:24;;32354:4;32339:12;;:19;;;;:::i;:::-;32330:5;:28;;32322:83;;;::::0;-1:-1:-1;;;32322:83:0;;18328:2:1;32322:83:0::1;::::0;::::1;18310:21:1::0;18367:2;18347:18;;;18340:30;18406:34;18386:18;;;18379:62;-1:-1:-1;;;18457:18:1;;;18450:40;18507:19;;32322:83:0::1;18126:406:1::0;32322:83:0::1;32416:9;:17:::0;32220:221::o;9487:179::-;9545:7;;9577:5;9581:1;9577;:5;:::i;:::-;9565:17;;9606:1;9601;:6;;9593:46;;;;-1:-1:-1;;;9593:46:0;;18869:2:1;9593:46:0;;;18851:21:1;18908:2;18888:18;;;18881:30;18947:29;18927:18;;;18920:57;18994:18;;9593:46:0;18667:351:1;9593:46:0;9657:1;9487:179;-1:-1:-1;;;9487:179:0:o;10016:248::-;10074:7;10098:1;10103;10098:6;10094:47;;-1:-1:-1;10128:1:0;10121:8;;10094:47;10153:9;10165:5;10169:1;10165;:5;:::i;:::-;10153:17;-1:-1:-1;10198:1:0;10189:5;10193:1;10153:17;10189:5;:::i;:::-;:10;10181:56;;;;-1:-1:-1;;;10181:56:0;;19225:2:1;10181:56:0;;;19207:21:1;19264:2;19244:18;;;19237:30;19303:34;19283:18;;;19276:62;-1:-1:-1;;;19354:18:1;;;19347:31;19395:19;;10181:56:0;19023:397:1;10272:132:0;10330:7;10357:39;10361:1;10364;10357:39;;;;;;;;;;;;;;;;;:3;:39::i;49632:1520::-;49701:6;49711:1;49701:11;49697:50;;49632:1520;:::o;49697:50::-;49757:24;49774:6;49757:16;:24::i;:::-;49792:19;49814:25;49828:10;;49814:9;;:13;;:25;;;;:::i;:::-;50022:13;;49792:47;;-1:-1:-1;49867:4:0;;;;49852:12;;;;;;50022:17;50018:193;;50075:124;50182:16;;50166:13;;:32;;;;:::i;:::-;50075:86;50147:13;;50075:53;50116:11;50075:36;50101:9;;50075:21;:25;;:36;;;;:::i;:53::-;:71;;:86::i;:124::-;50056:143;;50018:193;50225:14;;:18;50221:199;;50280:128;50390:17;;50373:14;;:34;;;;:::i;:::-;50280:88;50353:14;;50280:54;50322:11;50280:37;50306:10;;50280:21;:25;;:37;;;;:::i;:128::-;50260:148;;50221:199;50442:39;:16;50463:17;50442:20;:39::i;:::-;50430:51;-1:-1:-1;50498:13:0;;50494:111;;50550:15;;50542:51;;-1:-1:-1;;;;;50550:15:0;;;;50579:9;;50542:51;;;;50579:9;50550:15;50542:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50528:65:0;;-1:-1:-1;;50494:111:0;50625:21;50669:16;;50649:17;;:36;;;;:::i;:::-;50625:60;-1:-1:-1;50698:19:0;50732:17;;50728:104;;50780:40;:21;50806:13;50780:25;:40::i;:::-;50766:54;;50728:104;50842:23;50868:56;50912:11;50868:39;50889:17;;50868:16;;:20;;:39;;;;:::i;:56::-;50842:82;-1:-1:-1;50941:19:0;;50937:126;;51002:15;;50994:57;;-1:-1:-1;;;;;51002:15:0;;;;51031;;50994:57;;;;51031:15;51002;50994:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50977:74:0;;-1:-1:-1;;50937:126:0;51080:64;51094:9;51105:15;51122:7;:21;;;;;51133:10;51122:21;51080:64;;;19831:25:1;;;19887:2;19872:18;;19865:34;;;;19942:14;19935:22;19915:18;;;19908:50;19819:2;19804:18;51080:64:0;;;;;;;49686:1466;;;;;;;;;49632:1520;:::o;9674:136::-;9732:7;9759:43;9763:1;9766;9759:43;;;;;;;;;;;;;;;;;:3;:43::i;8338:346::-;-1:-1:-1;;;;;8440:19:0;;8432:68;;;;-1:-1:-1;;;8432:68:0;;20171:2:1;8432:68:0;;;20153:21:1;20210:2;20190:18;;;20183:30;20249:34;20229:18;;;20222:62;-1:-1:-1;;;20300:18:1;;;20293:34;20344:19;;8432:68:0;19969:400:1;8432:68:0;-1:-1:-1;;;;;8519:21:0;;8511:68;;;;-1:-1:-1;;;8511:68:0;;20576:2:1;8511:68:0;;;20558:21:1;20615:2;20595:18;;;20588:30;20654:34;20634:18;;;20627:62;-1:-1:-1;;;20705:18:1;;;20698:32;20747:19;;8511:68:0;20374:398:1;8511:68:0;-1:-1:-1;;;;;8592:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;8644:32;;2499:25:1;;;8644:32:0;;2472:18:1;8644:32:0;;;;;;;;8338:346;;;:::o;6981:538::-;-1:-1:-1;;;;;7087:20:0;;7079:70;;;;-1:-1:-1;;;7079:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7168:23:0;;7160:71;;;;-1:-1:-1;;;7160:71:0;;;;;;;:::i;:::-;7324:70;7346:6;7324:70;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7324:17:0;;:9;:17;;;;;;;;;;;;:70;:21;:70::i;:::-;-1:-1:-1;;;;;7304:17:0;;;:9;:17;;;;;;;;;;;:90;;;;7428:20;;;;;;;:32;;7453:6;7428:24;:32::i;:::-;-1:-1:-1;;;;;7405:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;7476:35;2499:25:1;;;7405:20:0;;7476:35;;;;;;2472:18:1;7476:35:0;2353:177:1;46113:925:0;-1:-1:-1;;;;;46228:20:0;;46175:7;46228:20;;;:11;:20;;;;;;46175:7;;46228:20;;:85;;;;-1:-1:-1;;;;;;46270:33:0;;;;;;:24;:33;;;;;;:43;;46306:7;46270:43;:::i;:::-;46252:15;:61;46228:85;:164;;;;-1:-1:-1;;;;;;46349:33:0;;;;;;:24;:33;;;;;;:43;;46385:7;46349:43;:::i;:::-;46331:15;:61;46228:164;46224:752;;;46422:25;46445:1;46422:18;46432:7;46422:9;:18::i;:25::-;46409:38;;46224:752;;;-1:-1:-1;;;;;46478:20:0;;;;;;:11;:20;;;;;;;;:85;;;;-1:-1:-1;;;;;;46520:33:0;;;;;;:24;:33;;;;;;:43;;46556:7;46520:43;:::i;:::-;46502:15;:61;46478:85;:169;;;;-1:-1:-1;;;;;;46604:33:0;;;;;;:24;:33;;;;;;:43;;46640:7;46604:43;:::i;:::-;46586:15;:61;46478:169;46474:502;;;46686:25;46709:1;46686:18;46696:7;46686:9;:18::i;46474:502::-;-1:-1:-1;;;;;46742:20:0;;;;;;:11;:20;;;;;;;;:85;;;;-1:-1:-1;;;;;;46784:33:0;;;;;;:24;:33;;;;;;:43;;46820:7;46784:43;:::i;:::-;46766:15;:61;46742:85;46738:238;;;46866:25;46889:1;46866:18;46876:7;46866:9;:18::i;46738:238::-;46946:18;46956:7;46946:9;:18::i;38783:7322::-;-1:-1:-1;;;;;38881:18:0;;38873:68;;;;-1:-1:-1;;;38873:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38960:16:0;;38952:64;;;;-1:-1:-1;;;38952:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39153:39:0;;39027:18;39153:39;;;:33;:39;;;;;;39027:18;;;;;;39153:39;;39148:132;;39217:14;;-1:-1:-1;;;39217:14:0;;;;39209:59;;;;-1:-1:-1;;;39209:59:0;;21789:2:1;39209:59:0;;;21771:21:1;;;21808:18;;;21801:30;21867:34;21847:18;;;21840:62;21919:18;;39209:59:0;21587:356:1;39209:59:0;39294:6;39304:1;39294:11;39290:93;;39322:28;39338:4;39344:2;39348:1;39322:15;:28::i;:::-;39365:7;;;;38783:7322;;;:::o;39290:93::-;-1:-1:-1;;;;;39400:16:0;;;;;;:10;:16;;;;;;;;39396:6532;;;-1:-1:-1;;;;;39455:23:0;;;;;;:17;:23;;;;;;:35;;39481:9;39455:35;:::i;:::-;39437:15;:53;39433:297;;;-1:-1:-1;;;;;39547:19:0;;;;;;:13;:19;;;;;;39537:6;39519:15;39561:4;39519:9;:15::i;:::-;:24;;;;:::i;:::-;:47;;39511:83;;;;-1:-1:-1;;;39511:83:0;;22283:2:1;39511:83:0;;;22265:21:1;22322:2;22302:18;;;22295:30;22361:25;22341:18;;;22334:53;22404:18;;39511:83:0;22081:347:1;39511:83:0;39396:6532;;39433:297;-1:-1:-1;;;;;39648:19:0;;39670:1;39648:19;;;:13;:19;;;;;;;:23;;;39690:10;:16;;;;;:24;;-1:-1:-1;;39690:24:0;;;39396:6532;;;39773:8;;-1:-1:-1;;;39773:8:0;;;;39772:9;:39;;;;-1:-1:-1;;;;;;39786:25:0;;;;;;:19;:25;;;;;;;;39785:26;39772:39;:67;;;;-1:-1:-1;;;;;;39816:23:0;;;;;;:19;:23;;;;;;;;39815:24;39772:67;39768:6160;;;-1:-1:-1;;;;;39873:29:0;;;39856:14;39873:29;;;:25;:29;;;;;;;39933:31;;;;;;;;39873:29;;;;;39933:31;39985:9;;:23;;;;;39999:9;39998:10;39985:23;39981:3774;;;-1:-1:-1;;;;;40034:25:0;;;;;;:19;:25;;;;;;;;40033:26;:54;;;;-1:-1:-1;;;;;;40064:23:0;;;;;;:19;:23;;;;;;;;40063:24;40033:54;40029:1113;;;40112:13;40128:32;40156:3;40128:23;40139:11;;40128:6;:10;;:23;;;;:::i;:32::-;40112:48;-1:-1:-1;40192:17:0;:6;40112:48;40192:10;:17::i;:::-;40183:26;;40232:43;40248:4;40262;40269:5;40232:15;:43::i;:::-;40298:33;40314:4;40320:2;40324:6;40298:15;:33::i;:::-;40354:15;;-1:-1:-1;;;;;40354:15:0;:26;40381:4;40387:19;40381:4;40387:13;:19::i;:::-;40354:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40430:15:0;;-1:-1:-1;;;;;40430:15:0;;-1:-1:-1;40430:26:0;;-1:-1:-1;40457:2:0;40461:17;40457:2;40461:13;:17::i;:::-;40430:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;40502:19:0;;;40524:5;40502:19;;;:13;:19;;;;;;;;:27;;-1:-1:-1;;40502:27:0;;;;;;40552:11;:17;;;;;:25;;;;;;;40600:24;:30;;;;;40633:15;40600:48;;-1:-1:-1;;;;;;;;;;38783:7322:0:o;40029:1113::-;40743:33;40759:4;40765:2;40769:6;40743:15;:33::i;:::-;40799:15;;-1:-1:-1;;;;;40799:15:0;:26;40826:4;40832:19;40826:4;40832:13;:19::i;:::-;40799:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40875:15:0;;-1:-1:-1;;;;;40875:15:0;;-1:-1:-1;40875:26:0;;-1:-1:-1;40902:2:0;40906:17;40902:2;40906:13;:17::i;:::-;40875:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;40947:19:0;;;40969:5;40947:19;;;:13;:19;;;;;;;;:27;;-1:-1:-1;;40947:27:0;;;;;;40997:11;:17;;;;;:25;;;;;;;41045:24;:30;;;;;41078:15;41045:48;;-1:-1:-1;;;;;;;;;38783:7322:0:o;39981:3774::-;41182:9;41178:2577;;;41226:22;;41216:6;:32;41212:188;;41286:1;41273:14;;41212:188;;;41366:14;;41353:27;;41212:188;41429:12;;41476:17;;41527:16;;41568:14;;41429:12;;-1:-1:-1;41476:17:0;;-1:-1:-1;41527:16:0;-1:-1:-1;41568:14:0;;41564:334;;;41667:13;;-1:-1:-1;;;;;41630:34:0;;;;;;:28;:34;;;;;;:50;;41667:13;41630:50;:::i;:::-;41611:15;:69;;41603:129;;;;-1:-1:-1;;;41603:129:0;;22635:2:1;41603:129:0;;;22617:21:1;22674:2;22654:18;;;22647:30;-1:-1:-1;;;22693:18:1;;;22686:52;22755:18;;41603:129:0;22433:346:1;41603:129:0;41769:5;;41759:6;:15;;41751:54;;;;-1:-1:-1;;;41751:54:0;;22986:2:1;41751:54:0;;;22968:21:1;23025:2;23005:18;;;22998:30;23064:29;23044:18;;;23037:57;23111:18;;41751:54:0;22784:351:1;41751:54:0;-1:-1:-1;;;;;41824:34:0;;;;;;:28;:34;;;;;41861:15;41824:52;;41564:334;-1:-1:-1;;;;;41916:19:0;;41938:5;41916:19;;;:13;:19;;;;;;;;:27;;-1:-1:-1;;41916:27:0;;;;;;41962:11;:17;;;;;:25;;;;;;;42006:24;:30;;;;;42039:15;42006:48;;41178:2577;;;42084:8;42080:1675;;;-1:-1:-1;;;;;42119:17:0;;;;;;:13;:17;;;;;;;;42115:439;;;-1:-1:-1;;;;;42184:24:0;;;;;;:20;:24;;;;;;:33;;42211:6;42184:33;:::i;:::-;42165:15;:52;;:95;;;;;42238:22;;42221:13;42231:2;42221:9;:13::i;:::-;:39;;42165:95;42161:374;;;42289:33;42305:4;42311:2;42315:6;42289:15;:33::i;:::-;42349:15;;-1:-1:-1;;;;;42349:15:0;:26;42376:4;42382:19;42376:4;42382:13;:19::i;:::-;42349:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42429:15:0;;-1:-1:-1;;;;;42429:15:0;;-1:-1:-1;42429:26:0;;-1:-1:-1;42456:2:0;42460:17;42456:2;42460:13;:17::i;:::-;42429:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42505:7;;;;;;38783:7322;;;:::o;42161:374::-;-1:-1:-1;;;;;42579:15:0;;;;;;:11;:15;;;;;;;;42574:156;;-1:-1:-1;;;;;42619:15:0;;;;;;:11;:15;;;;;;;;:22;;-1:-1:-1;;42619:22:0;42637:4;42619:22;;;42664:24;:28;;;;;42695:15;42664:46;;42574:156;-1:-1:-1;;;;;42755:17:0;;;;;;:13;:17;;;;;;;;42750:156;;-1:-1:-1;;;;;42797:17:0;;;;;;:13;:17;;;;;;;;:24;;-1:-1:-1;;42797:24:0;42817:4;42797:24;;;42844:20;:24;;;;;42871:15;42844:42;;42750:156;42939:13;;42982:11;;43028:16;;43078:15;;43118:14;;42939:13;;-1:-1:-1;42982:11:0;;-1:-1:-1;43028:16:0;-1:-1:-1;43078:15:0;-1:-1:-1;43118:14:0;;43114:443;;;43197:5;;43179:15;;:23;;;;:::i;:::-;43161:15;:41;43153:71;;;;-1:-1:-1;;;43153:71:0;;23342:2:1;43153:71:0;;;23324:21:1;23381:2;23361:18;;;23354:30;-1:-1:-1;;;23400:18:1;;;23393:48;23458:18;;43153:71:0;23140:342:1;43153:71:0;43266:13;;43251:11;:28;;43243:64;;;;-1:-1:-1;;;43243:64:0;;23689:2:1;43243:64:0;;;23671:21:1;23728:2;23708:18;;;23701:30;23767:26;23747:18;;;23740:54;23811:18;;43243:64:0;23487:348:1;43243:64:0;-1:-1:-1;;;;;43334:28:0;;;;;;:24;:28;;;;;;43366:12;43334:44;;43326:76;;;;-1:-1:-1;;;43326:76:0;;24042:2:1;43326:76:0;;;24024:21:1;24081:2;24061:18;;;24054:30;-1:-1:-1;;;24100:18:1;;;24093:50;24160:18;;43326:76:0;23840:344:1;43326:76:0;43439:5;;43429:6;:15;;43421:54;;;;-1:-1:-1;;;43421:54:0;;22986:2:1;43421:54:0;;;22968:21:1;23025:2;23005:18;;;22998:30;23064:29;23044:18;;;23037:57;23111:18;;43421:54:0;22784:351:1;43421:54:0;-1:-1:-1;;;;;43494:28:0;;;;;;:24;:28;;;;;43525:12;43494:43;;43114:443;43577:32;43612:13;43622:2;43612:9;:13::i;:::-;43689:9;;43577:48;;-1:-1:-1;43652:33:0;43679:6;43577:48;43652:33;:::i;:::-;:46;;43644:95;;;;-1:-1:-1;;;43644:95:0;;24391:2:1;43644:95:0;;;24373:21:1;24430:2;24410:18;;;24403:30;24469:34;24449:18;;;24442:62;-1:-1:-1;;;24520:18:1;;;24513:34;24564:19;;43644:95:0;24189:400:1;43644:95:0;42094:1661;42080:1675;43771:17;43791:44;43806:28;43821:13;43806:12;:28;:::i;:::-;43791:10;;:14;:44::i;:::-;43771:64;;43852:28;43883:24;43901:4;43883:9;:24::i;:::-;43963:18;;43852:55;;-1:-1:-1;43939:42:0;;;;;;;44002:20;;;44013:9;44002:20;43998:1014;;;44043:8;:15;;-1:-1:-1;;;;44043:15:0;-1:-1:-1;;;44043:15:0;;;44083:21;;44043:15;44083:21;:41;;;;;44123:1;44108:12;:16;44083:41;:61;;;;;44143:1;44128:12;;:16;44083:61;44079:689;;;44169:20;44192:25;44206:10;;44192:9;;:13;;:25;;;;:::i;:::-;44169:48;;44240:24;44267:53;44307:12;44267:35;44292:9;;44267:20;:24;;:35;;;;:::i;:53::-;44240:80;;44343:22;44368:54;44409:12;44368:36;44393:10;;44368:20;:24;;:36;;;;:::i;:54::-;44343:79;;44445:21;44469:52;44508:12;;44469:34;44490:12;44469:16;:20;;:34;;;;:::i;:52::-;44445:76;;44544:22;44569:51;44606:13;;44569:32;44588:12;44569:14;:18;;:32;;;;:::i;:51::-;44544:76;-1:-1:-1;44643:18:0;44664:33;44544:76;44683:13;44664:18;:33::i;:::-;44643:54;;44722:26;44737:10;44722:14;:26::i;:::-;44146:622;;;;;;44079:689;44788:24;44815;44833:4;44815:9;:24::i;:::-;44788:51;;44858:38;44879:16;44858:20;:38::i;:::-;-1:-1:-1;44927:1:0;44915:9;:13;;;44947:10;:14;44980:8;:16;;-1:-1:-1;;;;44980:16:0;;;43998:1014;45028:12;45043:30;45069:3;45043:21;:6;45054:9;45043:10;:21::i;:30::-;45028:45;-1:-1:-1;45088:18:0;45127:12;;45123:202;;45192:3;45169:20;:6;45180:8;45169:10;:20::i;:::-;:26;;;;:::i;:::-;45232:4;;45156:39;;-1:-1:-1;45210:39:0;;45226:4;;-1:-1:-1;;;;;45232:4:0;45156:39;45210:15;:39::i;:::-;45279:12;;:28;;45296:10;45279:16;:28::i;:::-;45264:12;:43;45123:202;45350:29;45361:17;45368:10;45361:4;:17;:::i;:::-;45350:6;;:10;:29::i;:::-;45341:38;;45400:9;45396:169;;;45443:10;;:20;;45458:4;45443:14;:20::i;:::-;45430:10;:33;45396:169;;;45530:9;;:19;;45544:4;45530:13;:19::i;:::-;45518:9;:31;45396:169;45581:42;45597:4;45611;45618;45581:15;:42::i;:::-;45654:16;;45691:15;;:28;;-1:-1:-1;;;;;;45691:28:0;;;;;2499:25:1;;;-1:-1:-1;;;;;45691:15:0;;;;:23;;2472:18:1;;45691:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;45691:28:0;;;;;;;;-1:-1:-1;;45691:28:0;;;;;;;;;;;;:::i;:::-;;;45687:230;;;45817:75;;;13913:25:1;;;13969:2;13954:18;;13947:34;;;13997:18;;;13990:34;;;14055:2;14040:18;;14033:34;;;45882:4:0;;45817:75;;13900:3:1;13885:19;45817:75:0;;;;;;;45720:188;;;45687:230;39841:6087;;;;;;;;39768:6160;45940:33;45956:4;45962:2;45966:6;45940:15;:33::i;:::-;45984:15;;-1:-1:-1;;;;;45984:15:0;:26;46011:4;46017:19;46011:4;46017:13;:19::i;:::-;45984:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46048:15:0;;-1:-1:-1;;;;;46048:15:0;;-1:-1:-1;46048:26:0;;-1:-1:-1;46075:2:0;46079:17;46075:2;46079:13;:17::i;:::-;46048:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38862:7243;;;;38783:7322;;;:::o;9818:190::-;9904:7;9940:12;9932:6;;;;9924:29;;;;-1:-1:-1;;;9924:29:0;;;;;;;;:::i;:::-;-1:-1:-1;9964:9:0;9976:5;9980:1;9976;:5;:::i;:::-;9964:17;9818:190;-1:-1:-1;;;;;9818:190:0:o;33950:280::-;-1:-1:-1;;;;;34033:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;34033:39:0;;;;;;;;;;;;34085:80;;34111:15;;:42;;-1:-1:-1;;;34111:42:0;;-1:-1:-1;;;;;178:32:1;;;34111:42:0;;;160:51:1;34111:15:0;;;;:36;;133:18:1;;34111:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34085:80;34182:40;;;;;;-1:-1:-1;;;;;34182:40:0;;;;;;;;33950:280;;:::o;10412:276::-;10498:7;10533:12;10526:5;10518:28;;;;-1:-1:-1;;;10518:28:0;;;;;;;;:::i;:::-;-1:-1:-1;10557:9:0;10569:5;10573:1;10569;:5;:::i;47534:499::-;47624:16;;;47638:1;47624:16;;;;;;;;47600:21;;47624:16;;;;;;;;;;-1:-1:-1;47624:16:0;47600:40;;47669:4;47651;47656:1;47651:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47651:23:0;;;:7;;;;;;;;;;:23;;;;47695:15;;:22;;;-1:-1:-1;;;47695:22:0;;;;:15;;;;;:20;;:22;;;;;47651:7;;47695:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47685:4;47690:1;47685:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47685:32:0;;;:7;;;;;;;;;:32;47760:15;;47728:62;;47745:4;;47760:15;47778:11;47728:8;:62::i;:::-;47801:15;;:224;;-1:-1:-1;;;47801:224:0;;-1:-1:-1;;;;;47801:15:0;;;;:66;;:224;;47882:11;;47801:15;;47952:4;;47979;;47999:15;;47801:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47589:444;47534:499;:::o;47046:480::-;47105:12;47120:13;:6;47131:1;47120:10;:13::i;:::-;47105:28;-1:-1:-1;47144:17:0;47164:16;:6;47105:28;47164:10;:16::i;:::-;47144:36;-1:-1:-1;47216:21:0;47248:22;47265:4;47248:16;:22::i;:::-;47351:18;47372:41;:21;47398:14;47372:25;:41::i;:::-;47351:62;;47424:35;47437:9;47448:10;47424:12;:35::i;:::-;47475:43;;;25781:25:1;;;25837:2;25822:18;;25815:34;;;25865:18;;;25858:34;;;47475:43:0;;25769:2:1;25754:18;47475:43:0;;;;;;;47094:432;;;;47046:480;:::o;48657:516::-;48837:15;;48805:62;;48822:4;;-1:-1:-1;;;;;48837:15:0;48855:11;48805:8;:62::i;:::-;48910:15;;:255;;-1:-1:-1;;;48910:255:0;;48982:4;48910:255;;;26244:34:1;26294:18;;;26287:34;;;48910:15:0;26337:18:1;;;26330:34;;;26380:18;;;26373:34;;;26423:19;;;26416:44;49139:15:0;26476:19:1;;;26469:35;-1:-1:-1;;;;;48910:15:0;;;;:31;;48949:9;;26178:19:1;;48910:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;222:180:1:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;-1:-1:-1;373:23:1;;222:180;-1:-1:-1;222:180:1:o;407:548::-;519:4;548:2;577;566:9;559:21;609:6;603:13;652:6;647:2;636:9;632:18;625:34;677:1;687:140;701:6;698:1;695:13;687:140;;;796:14;;;792:23;;786:30;762:17;;;781:2;758:26;751:66;716:10;;687:140;;;691:3;876:1;871:2;862:6;851:9;847:22;843:31;836:42;946:2;939;935:7;930:2;922:6;918:15;914:29;903:9;899:45;895:54;887:62;;;;407:548;;;;:::o;960:131::-;-1:-1:-1;;;;;1035:31:1;;1025:42;;1015:70;;1081:1;1078;1071:12;1096:118;1182:5;1175:13;1168:21;1161:5;1158:32;1148:60;;1204:1;1201;1194:12;1219:382;1284:6;1292;1345:2;1333:9;1324:7;1320:23;1316:32;1313:52;;;1361:1;1358;1351:12;1313:52;1400:9;1387:23;1419:31;1444:5;1419:31;:::i;:::-;1469:5;-1:-1:-1;1526:2:1;1511:18;;1498:32;1539:30;1498:32;1539:30;:::i;:::-;1588:7;1578:17;;;1219:382;;;;;:::o;1606:315::-;1674:6;1682;1735:2;1723:9;1714:7;1710:23;1706:32;1703:52;;;1751:1;1748;1741:12;1703:52;1790:9;1777:23;1809:31;1834:5;1809:31;:::i;:::-;1859:5;1911:2;1896:18;;;;1883:32;;-1:-1:-1;;;1606:315:1:o;2535:127::-;2596:10;2591:3;2587:20;2584:1;2577:31;2627:4;2624:1;2617:15;2651:4;2648:1;2641:15;2667:275;2738:2;2732:9;2803:2;2784:13;;-1:-1:-1;;2780:27:1;2768:40;;2838:18;2823:34;;2859:22;;;2820:62;2817:88;;;2885:18;;:::i;:::-;2921:2;2914:22;2667:275;;-1:-1:-1;2667:275:1:o;2947:183::-;3007:4;3040:18;3032:6;3029:30;3026:56;;;3062:18;;:::i;:::-;-1:-1:-1;3107:1:1;3103:14;3119:4;3099:25;;2947:183::o;3135:662::-;3189:5;3242:3;3235:4;3227:6;3223:17;3219:27;3209:55;;3260:1;3257;3250:12;3209:55;3296:6;3283:20;3322:4;3346:60;3362:43;3402:2;3362:43;:::i;:::-;3346:60;:::i;:::-;3440:15;;;3526:1;3522:10;;;;3510:23;;3506:32;;;3471:12;;;;3550:15;;;3547:35;;;3578:1;3575;3568:12;3547:35;3614:2;3606:6;3602:15;3626:142;3642:6;3637:3;3634:15;3626:142;;;3708:17;;3696:30;;3746:12;;;;3659;;3626:142;;;-1:-1:-1;3786:5:1;3135:662;-1:-1:-1;;;;;;3135:662:1:o;3802:1215::-;3920:6;3928;3981:2;3969:9;3960:7;3956:23;3952:32;3949:52;;;3997:1;3994;3987:12;3949:52;4037:9;4024:23;4066:18;4107:2;4099:6;4096:14;4093:34;;;4123:1;4120;4113:12;4093:34;4161:6;4150:9;4146:22;4136:32;;4206:7;4199:4;4195:2;4191:13;4187:27;4177:55;;4228:1;4225;4218:12;4177:55;4264:2;4251:16;4286:4;4310:60;4326:43;4366:2;4326:43;:::i;4310:60::-;4404:15;;;4486:1;4482:10;;;;4474:19;;4470:28;;;4435:12;;;;4510:19;;;4507:39;;;4542:1;4539;4532:12;4507:39;4566:11;;;;4586:217;4602:6;4597:3;4594:15;4586:217;;;4682:3;4669:17;4699:31;4724:5;4699:31;:::i;:::-;4743:18;;4619:12;;;;4781;;;;4586:217;;;4822:5;-1:-1:-1;;4865:18:1;;4852:32;;-1:-1:-1;;4896:16:1;;;4893:36;;;4925:1;4922;4915:12;4893:36;;4948:63;5003:7;4992:8;4981:9;4977:24;4948:63;:::i;:::-;4938:73;;;3802:1215;;;;;:::o;5022:456::-;5099:6;5107;5115;5168:2;5156:9;5147:7;5143:23;5139:32;5136:52;;;5184:1;5181;5174:12;5136:52;5223:9;5210:23;5242:31;5267:5;5242:31;:::i;:::-;5292:5;-1:-1:-1;5349:2:1;5334:18;;5321:32;5362:33;5321:32;5362:33;:::i;:::-;5022:456;;5414:7;;-1:-1:-1;;;5468:2:1;5453:18;;;;5440:32;;5022:456::o;5917:241::-;5973:6;6026:2;6014:9;6005:7;6001:23;5997:32;5994:52;;;6042:1;6039;6032:12;5994:52;6081:9;6068:23;6100:28;6122:5;6100:28;:::i;6163:247::-;6222:6;6275:2;6263:9;6254:7;6250:23;6246:32;6243:52;;;6291:1;6288;6281:12;6243:52;6330:9;6317:23;6349:31;6374:5;6349:31;:::i;7201:388::-;7269:6;7277;7330:2;7318:9;7309:7;7305:23;7301:32;7298:52;;;7346:1;7343;7336:12;7298:52;7385:9;7372:23;7404:31;7429:5;7404:31;:::i;:::-;7454:5;-1:-1:-1;7511:2:1;7496:18;;7483:32;7524:33;7483:32;7524:33;:::i;7594:385::-;7680:6;7688;7696;7704;7757:3;7745:9;7736:7;7732:23;7728:33;7725:53;;;7774:1;7771;7764:12;7725:53;-1:-1:-1;;7797:23:1;;;7867:2;7852:18;;7839:32;;-1:-1:-1;7918:2:1;7903:18;;7890:32;;7969:2;7954:18;7941:32;;-1:-1:-1;7594:385:1;-1:-1:-1;7594:385:1:o;7984:661::-;8106:6;8114;8122;8130;8138;8146;8154;8162;8215:3;8203:9;8194:7;8190:23;8186:33;8183:53;;;8232:1;8229;8222:12;8183:53;-1:-1:-1;;8255:23:1;;;8325:2;8310:18;;8297:32;;-1:-1:-1;8376:2:1;8361:18;;8348:32;;8427:2;8412:18;;8399:32;;-1:-1:-1;8478:3:1;8463:19;;8450:33;;-1:-1:-1;8530:3:1;8515:19;;8502:33;;-1:-1:-1;8582:3:1;8567:19;;8554:33;;-1:-1:-1;8634:3:1;8619:19;8606:33;;-1:-1:-1;7984:661:1;-1:-1:-1;7984:661:1:o;8650:356::-;8852:2;8834:21;;;8871:18;;;8864:30;8930:34;8925:2;8910:18;;8903:62;8997:2;8982:18;;8650:356::o;9011:127::-;9072:10;9067:3;9063:20;9060:1;9053:31;9103:4;9100:1;9093:15;9127:4;9124:1;9117:15;9143:168;9216:9;;;9247;;9264:15;;;9258:22;;9244:37;9234:71;;9285:18;;:::i;9316:380::-;9395:1;9391:12;;;;9438;;;9459:61;;9513:4;9505:6;9501:17;9491:27;;9459:61;9566:2;9558:6;9555:14;9535:18;9532:38;9529:161;;9612:10;9607:3;9603:20;9600:1;9593:31;9647:4;9644:1;9637:15;9675:4;9672:1;9665:15;9529:161;;9316:380;;;:::o;10419:398::-;10621:2;10603:21;;;10660:2;10640:18;;;10633:30;10699:34;10694:2;10679:18;;10672:62;-1:-1:-1;;;10765:2:1;10750:18;;10743:32;10807:3;10792:19;;10419:398::o;10822:127::-;10883:10;10878:3;10874:20;10871:1;10864:31;10914:4;10911:1;10904:15;10938:4;10935:1;10928:15;10954:282;-1:-1:-1;;;;;11154:32:1;;;;11136:51;;11218:2;11203:18;;11196:34;11124:2;11109:18;;10954:282::o;11241:135::-;11280:3;11301:17;;;11298:43;;11321:18;;:::i;:::-;-1:-1:-1;11368:1:1;11357:13;;11241:135::o;11381:251::-;11451:6;11504:2;11492:9;11483:7;11479:23;11475:32;11472:52;;;11520:1;11517;11510:12;11472:52;11552:9;11546:16;11571:31;11596:5;11571:31;:::i;11637:184::-;11707:6;11760:2;11748:9;11739:7;11735:23;11731:32;11728:52;;;11776:1;11773;11766:12;11728:52;-1:-1:-1;11799:16:1;;11637:184;-1:-1:-1;11637:184:1:o;12131:245::-;12198:6;12251:2;12239:9;12230:7;12226:23;12222:32;12219:52;;;12267:1;12264;12257:12;12219:52;12299:9;12293:16;12318:28;12340:5;12318:28;:::i;12381:217::-;12421:1;12447;12437:132;;12491:10;12486:3;12482:20;12479:1;12472:31;12526:4;12523:1;12516:15;12554:4;12551:1;12544:15;12437:132;-1:-1:-1;12583:9:1;;12381:217::o;13371:306::-;13459:6;13467;13475;13528:2;13516:9;13507:7;13503:23;13499:32;13496:52;;;13544:1;13541;13534:12;13496:52;13573:9;13567:16;13557:26;;13623:2;13612:9;13608:18;13602:25;13592:35;;13667:2;13656:9;13652:18;13646:25;13636:35;;13371:306;;;;;:::o;15004:557::-;15117:6;15125;15133;15141;15149;15157;15210:3;15198:9;15189:7;15185:23;15181:33;15178:53;;;15227:1;15224;15217:12;15178:53;15259:9;15253:16;15278:31;15303:5;15278:31;:::i;:::-;15373:2;15358:18;;15352:25;15417:2;15402:18;;15396:25;15461:2;15446:18;;15440:25;15505:3;15490:19;;15484:26;15550:3;15535:19;;;15529:26;15328:5;;15352:25;;-1:-1:-1;15396:25:1;;15440;;-1:-1:-1;15484:26:1;-1:-1:-1;15529:26:1;;-1:-1:-1;15004:557:1;-1:-1:-1;;;15004:557:1:o;18537:125::-;18602:9;;;18623:10;;;18620:36;;;18636:18;;:::i;20777:401::-;20979:2;20961:21;;;21018:2;20998:18;;;20991:30;21057:34;21052:2;21037:18;;21030:62;-1:-1:-1;;;21123:2:1;21108:18;;21101:35;21168:3;21153:19;;20777:401::o;21183:399::-;21385:2;21367:21;;;21424:2;21404:18;;;21397:30;21463:34;21458:2;21443:18;;21436:62;-1:-1:-1;;;21529:2:1;21514:18;;21507:33;21572:3;21557:19;;21183:399::o;21948:128::-;22015:9;;;22036:11;;;22033:37;;;22050:18;;:::i;24594:980::-;24856:4;24904:3;24893:9;24889:19;24935:6;24924:9;24917:25;24961:2;24999:6;24994:2;24983:9;24979:18;24972:34;25042:3;25037:2;25026:9;25022:18;25015:31;25066:6;25101;25095:13;25132:6;25124;25117:22;25170:3;25159:9;25155:19;25148:26;;25209:2;25201:6;25197:15;25183:29;;25230:1;25240:195;25254:6;25251:1;25248:13;25240:195;;;25319:13;;-1:-1:-1;;;;;25315:39:1;25303:52;;25410:15;;;;25375:12;;;;25351:1;25269:9;25240:195;;;-1:-1:-1;;;;;;;25491:32:1;;;;25486:2;25471:18;;25464:60;-1:-1:-1;;;25555:3:1;25540:19;25533:35;25452:3;24594:980;-1:-1:-1;;;24594:980:1:o

Swarm Source

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