ETH Price: $3,468.84 (-1.08%)
Gas: 2 Gwei

Token

HUH Token (HUH)
 

Overview

Max Total Supply

888,000,000,000 HUH

Holders

210 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
7.025557215 HUH

Value
$0.00
0x68bf9c6fcf5de122e230139c4d1430a9a4d31b8b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

HUH Token is an “UTIMEME” cryptocurrency combining the power of meme tokens with the usability of utility tokens.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
HuhToken

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-06
*/

/**
 *Submitted for verification at BscScan.com on 2021-12-06
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.4;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Interface of the BEP20 standard as defined in the EIP.
 */
interface IBEP20 {
    function name() external pure returns (string memory);

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

    function decimals() external pure returns (uint8);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IRewardDistributor {
    function addRewardHolderShare(address rewardRecipient, uint256 amount) external;
}

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

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

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

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

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

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

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

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

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

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


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

    string private constant _NAME = "HUH_Token";
    string private constant _SYMBOL = "HUH";
    uint8 private constant _DECIMALS = 9;

    uint256 private constant _MAX = ~uint256(0);
    uint256 private constant _tTotal = 888 * 10 ** 9 * ( 10** _DECIMALS); // 888 Billion HuhToken
    uint256 private _rTotal = (_MAX - (_MAX % _tTotal));
    uint256 private _tFeeTotal;

    uint8 public referralReward = 10;

    uint8 public liquidityFeeOnBuy = 5;
    uint8 public marketingFeeOnBuy = 5;
    uint8 public HuHdistributionFeeOnBuy = 5;
    // Total of 15%

    uint8 public liquidityFeeOnWhiteListedBuy = 0;
    uint8 public marketingFeeOnBuyWhiteListed = 5;
    uint8 public HuHdistributionFeeOnBuyWhiteListed = 0;
    // Total of 15% (taking in referralReward)

    uint8 public liquidityFeeOnSell = 10;
    uint8 public marketingFeeOnSell = 5;
    uint8 public HuHdistributionFeeOnSell = 5;
    // Total of 20%

    uint8 public liquidityFeeOnWhiteListedSell = 25; // In the power of 1000 => 2.5%
    uint8 public marketingFeeOnWhiteListedSell = 50; // In the power of 1000 => 5%
    uint8 public HuHdistributionFeeOnWhiteListedSell = 25; // In the power of 1000 => 2.5%
    // Total of 10%

    uint256 public launchedAt;

    // State data for statistical purposes ONLY
    uint256 private referralCount;
    uint256 private totalReferralReward;
    mapping(address => uint256) private userReferralCount;
    mapping(address => uint256) private userReferralReward;

    address public referralCodeRegistrator;  // Address who allowed to register code for users (will be used later)
    address public marketingWallet;
    address private constant _DEAD_ADDRESS = 0x000000000000000000000000000000000000dEaD;

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

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

    mapping(address => bytes) public referCodeForUser;
    mapping(bytes => address) public referUserForCode;
    mapping(address => address) public referParent;
    mapping(address => address[]) public referralList;
    mapping(address => bool) public isWhitelisted;
    mapping(address => bool) public isFirstBuy;

    IUniswapV2Router02 public pcsV2Router;
    address public pcsV2Pair;

    IRewardDistributor public rewardDistributor;

    uint256 public maxTxAmount = _tTotal.mul(1).div(10**2); // 1% of total supply
    uint256 public amountOfTokensToAddToLiquidityThreshold = maxTxAmount.mul(10).div(10**2); // 10% of max transaction amount

    bool public swapAndLiquifyEnabled = true;
    bool private _inSwap;
    modifier swapping() {
        _inSwap = true;
        _;
        _inSwap = false;
    }

    event UserWhitelisted(address indexed account, address indexed referee);
    event RegisterCode(address indexed account, bytes indexed code);
    event SwapAndLiquify(uint256 indexed ethReceived, uint256 indexed tokensIntoLiqudity);
    event UpdatePancakeSwapRouter(address indexed pcsV2Router);
    event UpdateRewardDistributor(address indexed newRewardDistributor);
    event UpdateSwapAndLiquifyEnabled(bool indexed swapAndLiquifyEnabled);
    event ExcludeFromReflection(address indexed account);
    event IncludeInReflection(address indexed account);
    event SetIsExcludedFromFee(address indexed account, bool indexed flag);
    event ChangeFeesForNormalBuy(uint8 indexed liquidityFeeOnBuy, uint8 indexed marketingFeeOnBuy, uint8 indexed HuHdistributionFeeOnBuy);
    event ChangeFeesForWhiteListedBuy(uint8 indexed liquidityFeeOnBuy, uint8 indexed marketingFeeOnBuy, uint8 indexed HuHdistributionFeeOnBuy);
    event ChangeFeesForNormalSell(uint8 indexed liquidityFeeOnSell, uint8 indexed marketingFeeOnSell, uint8 indexed HuHdistributionFeeOnSell);
    event ChangeFeesForWhitelistedSell(uint8 indexed liquidityFeeOnSell, uint8 indexed marketingFeeOnSell, uint8 indexed HuHdistributionFeeOnSell);
    event ChangeReferralReward(uint8 indexed referralReward);
    event UpdateMarketingWallet(address indexed marketingWallet);
    event SetReferralCodeRegistrator(address indexed referralCodeRegistrator);
    event UpdateAmountOfTokensToAddToLiquidityThreshold(uint256 indexed amountOfTokensToAddToLiquidityThreshold);
    event SetMaxTxPercent(uint256 indexed maxTxPercent);

    constructor() {
        IUniswapV2Router02 _pancakeswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        pcsV2Pair = IUniswapV2Factory(_pancakeswapV2Router.factory()).createPair(address(this), _pancakeswapV2Router.WETH());
        pcsV2Router = _pancakeswapV2Router;
        _allowances[address(this)][address(pcsV2Router)] = _MAX;

        rewardDistributor = IRewardDistributor(0xc15e89f2149bCC0cBd5FB204C9e77fe878f1e9b2);
        _allowances[address(this)][address(rewardDistributor)] = _MAX;
        _allowances[address(rewardDistributor)][address(pcsV2Router)] = _MAX;

        marketingWallet = 0x783f51eF9Ac932B323dDb26701aD7897315a2cD5;

        _rOwned[msg.sender] = _rTotal;
        _isExcludedFromFee[msg.sender] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[address(rewardDistributor)] = true;
        _isExcludedFromFee[marketingWallet] = true;
        _excludeFromReflection(address(rewardDistributor));
        _excludeFromReflection(marketingWallet);

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

    receive() external payable {}

    fallback() external payable {}

    // Back-Up withdraw, in case BNB gets sent in here
    // NOTE: This function is to be called if and only if BNB gets sent into this contract. 
    // On no other occurence should this function be called. 
    function withdrawEthInWei(address payable recipient, uint256 amount) external onlyOwner {
        require(recipient != address(0), 'Invalid Recipient!');
        require(amount > 0, 'Invalid Amount!');
        recipient.transfer(amount);
    }

    // Withdraw BEP20 tokens sent to this contract
    // NOTE: This function is to be called if and only if BEP20 tokens gets sent into this contract. 
    // On no other occurence should this function be called. 
    function withdrawTokens(address token, address recipient) external onlyOwner {
        require(token != address(0), 'Invalid Token!');
        require(recipient != address(0), 'Invalid Recipient!');

        uint256 balance = IBEP20(token).balanceOf(address(this));
        if (balance > 0) {
            require(IBEP20(token).transfer(recipient, balance), "Transfer Failed");
        }
    }

    //  -----------------------------
    //  SETTERS (PROTECTED)
    //  -----------------------------
    function excludeFromReflection(address account) external onlyOwner {
        _excludeFromReflection(account);
        emit ExcludeFromReflection(account);
    }

    function includeInReflection(address account) external onlyOwner {
        _includeInReflection(account);
        emit IncludeInReflection(account);
    }

    function setIsExcludedFromFee(address account, bool flag) external onlyOwner {
        _setIsExcludedFromFee(account, flag);
        emit SetIsExcludedFromFee(account, flag);
    }

    function changeFeesForNormalBuy(uint8 _liquidityFeeOnBuy, uint8 _marketingFeeOnBuy, uint8 _HuHdistributionFeeOnBuy) external onlyOwner {
        require(_liquidityFeeOnBuy < 100, "Fee should be less than 100!");
        require(_marketingFeeOnBuy < 100, "Fee should be less than 100!");
        require(_HuHdistributionFeeOnBuy < 100, "Fee should be less than 100!");
        liquidityFeeOnBuy = _liquidityFeeOnBuy;
        marketingFeeOnBuy = _marketingFeeOnBuy;
        HuHdistributionFeeOnBuy = _HuHdistributionFeeOnBuy;
        emit ChangeFeesForNormalBuy(_liquidityFeeOnBuy, _marketingFeeOnBuy, _HuHdistributionFeeOnBuy);
    }

    function changeFeesForWhiteListedBuy(uint8 _liquidityFeeOnBuy, uint8 _marketingFeeOnBuy, uint8 _HuHdistributionFeeOnBuy) external onlyOwner {
        require(_liquidityFeeOnBuy < 100, "Fee should be less than 100!");
        require(_marketingFeeOnBuy < 100, "Fee should be less than 100!");
        require(_HuHdistributionFeeOnBuy < 100, "Fee should be less than 100!");
        liquidityFeeOnWhiteListedBuy = _liquidityFeeOnBuy;
        marketingFeeOnBuyWhiteListed = _marketingFeeOnBuy;
        HuHdistributionFeeOnBuyWhiteListed = _HuHdistributionFeeOnBuy;
        emit ChangeFeesForWhiteListedBuy(_liquidityFeeOnBuy, _marketingFeeOnBuy, _HuHdistributionFeeOnBuy);
    }

    function changeFeesForNormalSell(uint8 _liquidityFeeOnSell, uint8 _marketingFeeOnSell, uint8 _HuHdistributionFeeOnSell) external onlyOwner {
        require(_liquidityFeeOnSell < 100, "Fee should be less than 100!");
        require(_marketingFeeOnSell < 100, "Fee should be less than 100!");
        require(_HuHdistributionFeeOnSell < 100, "Fee should be less than 100!");
        liquidityFeeOnSell = _liquidityFeeOnSell;
        marketingFeeOnSell = _marketingFeeOnSell;
        HuHdistributionFeeOnSell = _HuHdistributionFeeOnSell;
        emit ChangeFeesForNormalSell(_liquidityFeeOnSell, _marketingFeeOnSell, _HuHdistributionFeeOnSell);
    }


    // NOTE: The values should always be in the power of 1000. So if the required percentage if 6%, the value will be 60, etc...
    function changeFeesForWhitelistedSell(uint8 _liquidityFeeOnSell, uint8 _marketingFeeOnSell, uint8 _HuHdistributionFeeOnSell) external onlyOwner {
        require(_liquidityFeeOnSell < 1000, "Fee should be less than 100!");
        require(_marketingFeeOnSell < 1000, "Fee should be less than 100!");
        require(_HuHdistributionFeeOnSell < 1000, "Fee should be less than 100!");
        liquidityFeeOnWhiteListedSell = _liquidityFeeOnSell;
        marketingFeeOnWhiteListedSell = _marketingFeeOnSell;
        HuHdistributionFeeOnWhiteListedSell = _HuHdistributionFeeOnSell;
        emit ChangeFeesForWhitelistedSell(_liquidityFeeOnSell, _marketingFeeOnSell, _HuHdistributionFeeOnSell);
    }

    function changeReferralReward(uint8 _referralReward) external onlyOwner {
        referralReward = _referralReward;
        emit ChangeReferralReward(_referralReward);
    }

    function updateMarketingWallet(address _marketingWallet) external onlyOwner {
        require(_marketingWallet != address(0), "Zero address not allowed!");
        _isExcludedFromFee[marketingWallet] = false;
        marketingWallet = _marketingWallet;
        _isExcludedFromFee[marketingWallet] = true;
        _excludeFromReflection(marketingWallet);
        emit UpdateMarketingWallet(_marketingWallet);
    }

    function setReferralCodeRegistrator(address _referralCodeRegistrator) external onlyOwner {
        require(_referralCodeRegistrator != address(0), "setReferralCodeRegistrator: Zero address not allowed!");
        referralCodeRegistrator = _referralCodeRegistrator;
        emit SetReferralCodeRegistrator(_referralCodeRegistrator);
    }

    function updateAmountOfTokensToAddToLiquidityThreshold(uint256 _amountOfTokensToAddToLiquidityThreshold) external onlyOwner {
        amountOfTokensToAddToLiquidityThreshold = _amountOfTokensToAddToLiquidityThreshold * (10 ** _DECIMALS);
        emit UpdateAmountOfTokensToAddToLiquidityThreshold(_amountOfTokensToAddToLiquidityThreshold);
    }

    function updatePancakeSwapRouter(address _pcsV2Router) external onlyOwner {
        require(_pcsV2Router != address(0), 'PancakeSwap Router Invalid!');
        require(address(pcsV2Router) != _pcsV2Router, 'PancakeSwap Router already exists!');
        _allowances[address(this)][address(pcsV2Router)] = 0; // Set Allowance to 0
        _allowances[address(rewardDistributor)][address(pcsV2Router)] = 0; // Set Allowance to 0
        pcsV2Router = IUniswapV2Router02(_pcsV2Router);
        pcsV2Pair = IUniswapV2Factory(pcsV2Router.factory()).createPair(address(this), pcsV2Router.WETH());
        _allowances[address(this)][address(pcsV2Router)] = _MAX;
        _allowances[address(rewardDistributor)][address(pcsV2Router)] = _MAX;
        emit UpdatePancakeSwapRouter(_pcsV2Router);
    }

    function updateRewardDistributor(address _rewardDistributor) external onlyOwner {
        require(address(rewardDistributor) != _rewardDistributor, 'Reward Distributor already exists!');
        _isExcludedFromFee[address(rewardDistributor)] = false;
        _allowances[address(this)][address(rewardDistributor)] = 0; // Set Allowance to 0
        _allowances[address(rewardDistributor)][address(pcsV2Router)] = 0; // Set Allowance to 0
        rewardDistributor = IRewardDistributor(_rewardDistributor);
        _allowances[address(this)][address(rewardDistributor)] = _MAX;
        _allowances[address(rewardDistributor)][address(pcsV2Router)] = _MAX;
        _isExcludedFromFee[address(rewardDistributor)] = true;
        _excludeFromReflection(address(rewardDistributor));
        emit UpdateRewardDistributor(_rewardDistributor);
    }

    function updateSwapAndLiquifyEnabled(bool _swapAndLiquifyEnabled) external onlyOwner {
        require(swapAndLiquifyEnabled != _swapAndLiquifyEnabled, 'Value already exists!');
        swapAndLiquifyEnabled = _swapAndLiquifyEnabled;
        emit UpdateSwapAndLiquifyEnabled(_swapAndLiquifyEnabled);
    }

    function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner {
        maxTxAmount = _tTotal.mul(maxTxPercent).div(10**2);
        emit SetMaxTxPercent(maxTxPercent);
    }

    function registerCodeForOwner(address account, string memory code) external {
        require(msg.sender == referralCodeRegistrator || msg.sender == owner(), "Not autorized!");

        bytes memory code_ = bytes(code);
        require(code_.length > 0, "Invalid code!");
        require(referUserForCode[code_] == address(0), "Code already used!");
        require(referCodeForUser[account].length == 0, "User already generated code!");

        _registerCode(account, code_);
    }

    function registerCode(string memory code) external {
        bytes memory code_ = bytes(code);
        require(code_.length > 0, "Invalid code!");
        require(referUserForCode[code_] == address(0), "Code already used!");
        require(referCodeForUser[msg.sender].length == 0, "User already generated code!");

        _registerCode(msg.sender, code_);
    }

    //  -----------------------------
    //  SETTERS
    //  -----------------------------
    function whitelist(string memory refCode) external {
        bytes memory refCode_ = bytes(refCode);
        require(refCode_.length > 0, "Invalid code!");
        require(!isWhitelisted[msg.sender], "Already whitelisted!");
        require(referUserForCode[refCode_] != address(0), "Non used code!");
        require(referUserForCode[refCode_] != msg.sender, "Invalid code, A -> A refer!");
        require(referParent[referUserForCode[refCode_]] != msg.sender, "Invalid code, A -> B -> A refer!");

        _whitelistWithRef(msg.sender, referUserForCode[refCode_]);
        referralCount = referralCount.add(1);
    }

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

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

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

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

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

    //  -----------------------------
    //  GETTERS
    //  -----------------------------
    function name() external pure override returns (string memory) {
        return _NAME;
    }

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

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

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

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

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

    function isExcludedFromReflection(address account) external view returns (bool) {
        return _isExcluded[account];
    }

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

    function reflectionFromToken(uint256 tAmount) public view returns (uint256) {
        uint256 rAmount = tAmount.mul(_getRate());
        return rAmount;
    }

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

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

    function getTotalNumberOfCommunityReferral() external view returns (uint256) {
        return referralCount;
    }

    function getTotalCommunityReferralReward() external view returns (uint256) {
        return totalReferralReward;
    }

    function getReferralList(address account) external view returns (address[] memory) {
        return referralList[account];
    }

    function getTotalNumberOfUserReferral(address account) external view returns (uint256) {
        return userReferralCount[account];
    }

    function getTotalUserReferralReward(address account) external view returns (uint256) {
        return userReferralReward[account];
    }


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

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

            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }

        if (rSupply < _rTotal.div(_tTotal)) {
            return (_rTotal, _tTotal);
        }

        return (rSupply, tSupply);
    }

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

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

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

        if(sender != owner() && recipient != owner())
            require(amount <= maxTxAmount, "Transfer amount exceeds the maxTxAmount");

        if (_inSwap) {
            _basicTransfer(sender, recipient, amount);
            return;
        }

        if (_shouldSwapBack())
            _swapAndAddToLiquidity();

        if (_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]) {
            _basicTransfer(sender, recipient, amount);
        } else {
            if (recipient == pcsV2Pair) {
                if (isWhitelisted[sender]) {
                    _whitelistedSell(sender, recipient, amount);
                } else {
                    _normalSell(sender, recipient, amount);
                }
            } else if (sender == pcsV2Pair) {
                if (isWhitelisted[recipient] && isFirstBuy[recipient]) {
                    _whitelistedBuy(sender, recipient, amount);
                    isFirstBuy[recipient] = false;
                } else {
                    _normalBuy(sender, recipient, amount);
                }
            } else {
                _basicTransfer(sender, recipient, amount);
            }
        }

        if (launchedAt == 0 && recipient == pcsV2Pair) {
            launchedAt = block.number;
        }
    }

    function _basicTransfer(address sender, address recipient, uint256 amount) private {
        uint256 rAmount = reflectionFromToken(amount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rAmount);
        if (_isExcluded[sender]) _tOwned[sender] = _tOwned[sender].sub(amount);
        if (_isExcluded[recipient]) _tOwned[recipient] = _tOwned[recipient].add(amount);

        emit Transfer(sender, recipient, amount);
    }

    function _normalBuy(address sender, address recipient, uint256 amount) private {
        uint256 currentRate = _getRate();
        uint256 rAmount = amount.mul(currentRate);
        uint256 rLiquidityFee = amount.mul(liquidityFeeOnBuy).mul(currentRate).div(100);
        uint256 rHuhdistributionFee = amount.mul(HuHdistributionFeeOnBuy).mul(currentRate).div(100);
        uint256 rMarketingFee = amount.mul(marketingFeeOnBuy).mul(currentRate).div(100);
        uint256 rTransferAmount = rAmount.sub(rLiquidityFee).sub(rHuhdistributionFee).sub(rMarketingFee);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidityFee);
        if (_isExcluded[sender]) _tOwned[sender] = _tOwned[sender].sub(amount);
        if (_isExcluded[recipient]) _tOwned[recipient] = _tOwned[recipient].add(rTransferAmount.div(currentRate));
        if (_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(rLiquidityFee.div(currentRate));

        emit Transfer(sender, recipient, rTransferAmount.div(currentRate));
        emit Transfer(sender, address(this), (rLiquidityFee).div(currentRate));

        _sendToMarketingWallet(sender, rMarketingFee.div(currentRate), rMarketingFee);
        _reflectFee(rHuhdistributionFee, rHuhdistributionFee.div(currentRate));
    }

    function _whitelistedBuy(address sender, address recipient, uint256 amount) private {
        uint256 currentRate = _getRate();
        uint256 rAmount = amount.mul(currentRate);
        uint256 tReferralRewardAmount = amount.mul(referralReward).div(100);
        uint256 rReferralRewardAmount = tReferralRewardAmount.mul(currentRate);
        uint256 rLiquidityFee = amount.mul(liquidityFeeOnWhiteListedBuy).mul(currentRate).div(100);
        uint256 rHuhdistributionFee = amount.mul(HuHdistributionFeeOnBuyWhiteListed).mul(currentRate).div(100);
        uint256 rMarketingFee = amount.mul(marketingFeeOnBuyWhiteListed).mul(currentRate).div(100);
        uint256 rTransferAmount = rAmount.sub(rReferralRewardAmount).sub(rLiquidityFee).sub(rHuhdistributionFee).sub(rMarketingFee);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidityFee);

        if (_isExcluded[sender]) _tOwned[sender] = _tOwned[sender].sub(amount);
        if (_isExcluded[recipient]) _tOwned[recipient] = _tOwned[recipient].add(rTransferAmount.div(currentRate));
        if (_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(rLiquidityFee.div(currentRate));

        emit Transfer(sender, recipient, rTransferAmount.div(currentRate));
        emit Transfer(sender, address(this), rLiquidityFee.div(currentRate));
        
        _sendToRewardDistributor(sender, referParent[recipient], tReferralRewardAmount, rReferralRewardAmount);
        _sendToMarketingWallet(sender, rMarketingFee.div(currentRate), rMarketingFee);
        _reflectFee(rHuhdistributionFee, rHuhdistributionFee.div(currentRate));
    }

    function _normalSell(address sender, address recipient, uint256 amount) private {
        uint256 currentRate = _getRate();
        uint256 rAmount = amount.mul(currentRate);
        uint256 rLiquidityFee = amount.mul(liquidityFeeOnSell).mul(currentRate).div(100);
        uint256 rHuhdistributionFee = amount.mul(HuHdistributionFeeOnSell).mul(currentRate).div(100);
        uint256 rMarketingFee = amount.mul(marketingFeeOnSell).mul(currentRate).div(100);
        uint256 rTransferAmount = rAmount.sub(rLiquidityFee).sub(rHuhdistributionFee).sub(rMarketingFee);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidityFee);
        if (_isExcluded[sender]) _tOwned[sender] = _tOwned[sender].sub(amount);
        if (_isExcluded[recipient]) _tOwned[recipient] = _tOwned[recipient].add(rTransferAmount.div(currentRate));
        if (_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(rLiquidityFee.div(currentRate));

        emit Transfer(sender, recipient, rTransferAmount.div(currentRate));
        emit Transfer(sender, address(this), rLiquidityFee.div(currentRate));

        _sendToMarketingWallet(sender, rMarketingFee.div(currentRate), rMarketingFee);
        _reflectFee(rHuhdistributionFee, rHuhdistributionFee.div(currentRate));
    }

    function _whitelistedSell(address sender, address recipient, uint256 amount) private {
        uint256 currentRate = _getRate();
        uint256 rAmount = amount.mul(currentRate);
        uint256 rLiquidityFee = amount.mul(liquidityFeeOnWhiteListedSell).mul(currentRate).div(1000);
        uint256 rHuhdistributionFee = amount.mul(HuHdistributionFeeOnWhiteListedSell).mul(currentRate).div(1000);
        uint256 rMarketingFee = amount.mul(marketingFeeOnWhiteListedSell).mul(currentRate).div(1000);
        uint256 rTransferAmount = rAmount.sub(rLiquidityFee).sub(rHuhdistributionFee).sub(rMarketingFee);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidityFee);
        if (_isExcluded[sender]) _tOwned[sender] = _tOwned[sender].sub(amount);
        if (_isExcluded[recipient]) _tOwned[recipient] = _tOwned[recipient].add(rTransferAmount.div(currentRate));
        if (_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(rLiquidityFee.div(currentRate));

        emit Transfer(sender, recipient, rTransferAmount.div(currentRate));
        emit Transfer(sender, address(this), rLiquidityFee.div(currentRate));

        _sendToMarketingWallet(sender, rMarketingFee.div(currentRate), rMarketingFee);
        _reflectFee(rHuhdistributionFee, rHuhdistributionFee.div(currentRate));
    }

    function _sendToRewardDistributor(address sender, address rewardRecipient, uint256 tAmount, uint256 rAmount) private {
        _rOwned[address(rewardDistributor)] = _rOwned[address(rewardDistributor)].add(rAmount);
        if (_isExcluded[address(rewardDistributor)]) _tOwned[address(rewardDistributor)] = _tOwned[address(rewardDistributor)].add(tAmount);

        emit Transfer(sender, address(rewardDistributor), tAmount);
        rewardDistributor.addRewardHolderShare(rewardRecipient, tAmount);
        userReferralReward[rewardRecipient] = userReferralReward[rewardRecipient].add(tAmount);
        totalReferralReward = totalReferralReward.add(tAmount);
    }

    function _sendToMarketingWallet(address sender, uint256 tMarketingFee, uint256 rMarketingFee) private {
        _rOwned[marketingWallet] = _rOwned[marketingWallet].add(rMarketingFee);
        if (_isExcluded[marketingWallet]) _tOwned[marketingWallet] = _tOwned[marketingWallet].add(tMarketingFee);
        emit Transfer(sender, marketingWallet, tMarketingFee);
    }

    function _shouldSwapBack() private view returns (bool) {
        return msg.sender != pcsV2Pair
            && launchedAt > 0
            && !_inSwap
            && swapAndLiquifyEnabled
            && balanceOf(address(this)) >= amountOfTokensToAddToLiquidityThreshold;
    }

    function _swapAndAddToLiquidity() private swapping {
        uint256 tokenAmountForLiquidity = amountOfTokensToAddToLiquidityThreshold;
        uint256 amountToSwap = tokenAmountForLiquidity.div(2);
        uint256 amountAnotherHalf = tokenAmountForLiquidity.sub(amountToSwap);

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

        uint256 balanceBefore = address(this).balance;

        pcsV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp.add(30)
        );

        uint256 differenceBnb = address(this).balance.sub(balanceBefore);

        pcsV2Router.addLiquidityETH{value: differenceBnb} (
            address(this),
            amountAnotherHalf,
            0,
            0,
            _DEAD_ADDRESS,
            block.timestamp.add(30)
        );

        emit SwapAndLiquify(differenceBnb, amountToSwap);
    }

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

    function _excludeFromReflection(address account) private {
        // require(account !=  0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude PancakeSwap router.');
        require(!_isExcluded[account], "Account is already excluded");

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

    function _includeInReflection(address account) private {
        require(_isExcluded[account], "Account is already included");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _rOwned[account] = reflectionFromToken(_tOwned[account]);
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _setIsExcludedFromFee(address account, bool flag) private {
        _isExcludedFromFee[account] = flag;
    }

    function _whitelistWithRef(address account, address referee) private {
        isFirstBuy[account] = true;
        isWhitelisted[msg.sender] = true;
        referParent[msg.sender] = referee;
        referralList[referee].push(account);
        userReferralCount[referee] = userReferralCount[referee].add(1);
        emit UserWhitelisted(account, referee);
    }

    function _registerCode(address account, bytes memory code) private {
        referUserForCode[code] = account;
        referCodeForUser[account] = code;
        emit RegisterCode(account, code);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"liquidityFeeOnBuy","type":"uint8"},{"indexed":true,"internalType":"uint8","name":"marketingFeeOnBuy","type":"uint8"},{"indexed":true,"internalType":"uint8","name":"HuHdistributionFeeOnBuy","type":"uint8"}],"name":"ChangeFeesForNormalBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"liquidityFeeOnSell","type":"uint8"},{"indexed":true,"internalType":"uint8","name":"marketingFeeOnSell","type":"uint8"},{"indexed":true,"internalType":"uint8","name":"HuHdistributionFeeOnSell","type":"uint8"}],"name":"ChangeFeesForNormalSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"liquidityFeeOnBuy","type":"uint8"},{"indexed":true,"internalType":"uint8","name":"marketingFeeOnBuy","type":"uint8"},{"indexed":true,"internalType":"uint8","name":"HuHdistributionFeeOnBuy","type":"uint8"}],"name":"ChangeFeesForWhiteListedBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"liquidityFeeOnSell","type":"uint8"},{"indexed":true,"internalType":"uint8","name":"marketingFeeOnSell","type":"uint8"},{"indexed":true,"internalType":"uint8","name":"HuHdistributionFeeOnSell","type":"uint8"}],"name":"ChangeFeesForWhitelistedSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"referralReward","type":"uint8"}],"name":"ChangeReferralReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromReflection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"IncludeInReflection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bytes","name":"code","type":"bytes"}],"name":"RegisterCode","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"flag","type":"bool"}],"name":"SetIsExcludedFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"SetMaxTxPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"referralCodeRegistrator","type":"address"}],"name":"SetReferralCodeRegistrator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amountOfTokensToAddToLiquidityThreshold","type":"uint256"}],"name":"UpdateAmountOfTokensToAddToLiquidityThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"marketingWallet","type":"address"}],"name":"UpdateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pcsV2Router","type":"address"}],"name":"UpdatePancakeSwapRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRewardDistributor","type":"address"}],"name":"UpdateRewardDistributor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"swapAndLiquifyEnabled","type":"bool"}],"name":"UpdateSwapAndLiquifyEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"referee","type":"address"}],"name":"UserWhitelisted","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"HuHdistributionFeeOnBuy","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HuHdistributionFeeOnBuyWhiteListed","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HuHdistributionFeeOnSell","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HuHdistributionFeeOnWhiteListedSell","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountOfTokensToAddToLiquidityThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_marketingFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_HuHdistributionFeeOnBuy","type":"uint8"}],"name":"changeFeesForNormalBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_marketingFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_HuHdistributionFeeOnSell","type":"uint8"}],"name":"changeFeesForNormalSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_marketingFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_HuHdistributionFeeOnBuy","type":"uint8"}],"name":"changeFeesForWhiteListedBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_marketingFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_HuHdistributionFeeOnSell","type":"uint8"}],"name":"changeFeesForWhitelistedSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_referralReward","type":"uint8"}],"name":"changeReferralReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReflection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferralList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCommunityReferralReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCommunityReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalNumberOfCommunityReferral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTotalNumberOfUserReferral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTotalUserReferralReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReflection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReflection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFirstBuy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnBuy","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnSell","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnWhiteListedBuy","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnWhiteListedSell","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOnBuy","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOnBuyWhiteListed","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOnSell","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOnWhiteListedSell","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pcsV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pcsV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referCodeForUser","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referParent","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"referUserForCode","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralCodeRegistrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"referralList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralReward","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"code","type":"string"}],"name":"registerCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"string","name":"code","type":"string"}],"name":"registerCodeForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardDistributor","outputs":[{"internalType":"contract IRewardDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setIsExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_referralCodeRegistrator","type":"address"}],"name":"setReferralCodeRegistrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOfTokensToAddToLiquidityThreshold","type":"uint256"}],"name":"updateAmountOfTokensToAddToLiquidityThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pcsV2Router","type":"address"}],"name":"updatePancakeSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardDistributor","type":"address"}],"name":"updateRewardDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_swapAndLiquifyEnabled","type":"bool"}],"name":"updateSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"refCode","type":"string"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEthInWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a62000991565b620000239064cec0ecb00062000a50565b620000319060001962000aaa565b6200003f9060001962000a72565b6001908155600380546001600160681b0319166c19321905050a0005000505050a179055620000b790606490620000a3906200007e6009600a62000991565b6200008f9064cec0ecb00062000a50565b6200042460201b620028481790919060201c565b6200043b60201b620028541790919060201c565b601a55620000dd6064620000a3600a601a546200042460201b620028481790919060201c565b601b55601c805460ff19166001179055348015620000fa57600080fd5b50620001063362000449565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015957600080fd5b505afa1580156200016e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000194919062000908565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620001dd57600080fd5b505afa158015620001f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000218919062000908565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200026157600080fd5b505af115801562000276573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029c919062000908565b601880546001600160a01b039283166001600160a01b0319918216179091556017805484841690831681178255306000818152600d602081815260408084209584529481528483206000199081905560198054891673c15e89f2149bcc0cbd5fb204c9e77fe878f1e9b29081178255855286852082905580548a16855292825285842096548916845295815284832095909555600a805490961673783f51ef9ac932b323ddb26701ad7897315a2cd517865560018054338452600b875285842055600e909552838220805460ff19908116871790915592825283822080548416861790558054871682528382208054841686179055945486168152919091208054909116909117905554620003b2911662000499565b600a54620003c9906001600160a01b031662000499565b3360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620003fb6009600a62000991565b6200040c9064cec0ecb00062000a50565b60405190815260200160405180910390a35062000aed565b600062000432828462000a50565b90505b92915050565b600062000432828462000931565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381166000908152600f602052604090205460ff1615620005085760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064015b60405180910390fd5b6001600160a01b0381166000908152600b60205260409020541562000565576001600160a01b0381166000908152600b60205260409020546200054b90620005cb565b6001600160a01b0382166000908152600c60205260409020555b6001600160a01b03166000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319169091179055565b6000600154821115620006345760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401620004ff565b60006200064062000663565b90506200065c81846200043b60201b620028541790919060201c565b9392505050565b600080806200067162000696565b915091506200068f81836200043b60201b620028541790919060201c565b9250505090565b600154600090819081620006ad6009600a62000991565b620006be9064cec0ecb00062000a50565b905060005b601054811015620008825782600b600060108481548110620006f557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118062000770575081600c6000601084815481106200074957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15620007a357600154620007876009600a62000991565b620007989064cec0ecb00062000a50565b945094505050509091565b62000806600b600060108481548110620007cd57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352828101939093526040909101902054859162002860620008fa821b17901c565b92506200086b600c6000601084815481106200083257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352828101939093526040909101902054849162002860620008fa821b17901c565b915080620008798162000a8c565b915050620006c3565b50620008bd620008956009600a62000991565b620008a69064cec0ecb00062000a50565b6001546200043b60201b620028541790919060201c565b821015620008f157600154620008d66009600a62000991565b620008e79064cec0ecb00062000a50565b9350935050509091565b90939092509050565b600062000432828462000a72565b6000602082840312156200091a578081fd5b81516001600160a01b03811681146200065c578182fd5b60008262000943576200094362000ad7565b500490565b600181815b80851115620009895781600019048211156200096d576200096d62000ac1565b808516156200097b57918102915b93841c93908002906200094d565b509250929050565b60006200043260ff841683600082620009ad5750600162000435565b81620009bc5750600062000435565b8160018114620009d55760028114620009e05762000a00565b600191505062000435565b60ff841115620009f457620009f462000ac1565b50506001821b62000435565b5060208310610133831016604e8410600b841016171562000a25575081810a62000435565b62000a31838362000948565b806000190482111562000a485762000a4862000ac1565b029392505050565b600081600019048311821515161562000a6d5762000a6d62000ac1565b500290565b60008282101562000a875762000a8762000ac1565b500390565b600060001982141562000aa35762000aa362000ac1565b5060010190565b60008262000abc5762000abc62000ad7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b614b6f8062000afd6000396000f3fe6080604052600436106103ef5760003560e01c806380a44e5511610206578063acc2166a11610117578063e177bb9b116100a5578063f0189c3111610077578063f0189c3114610d31578063f2fde38b14610d51578063f614165114610d71578063fc497a4514610d91578063fe2ec09e14610da657005b8063e177bb9b14610c85578063e31d390c14610ca5578063ea416f6d14610cdb578063ef422a1814610d1157005b8063d12eb0a3116100e9578063d12eb0a314610bbd578063d3edf3b414610bdd578063d543dbeb14610bfe578063dc4c7dbc14610c1e578063dd62ed3e14610c3f57005b8063acc2166a14610b47578063bf56b37114610b67578063c763c97c14610b7d578063caea299514610b9d57005b806395d89b4111610194578063a457c2d711610166578063a457c2d714610aa7578063a469d71714610ac7578063a522ad2514610ae7578063a9059cbb14610b07578063aacebbe314610b2757005b806395d89b41146109f85780639d79cf8e14610a245780639f9a4e7f14610a5a578063a057107514610a7a57005b80638c0b5e22116101d85780638c0b5e22146109825780638c87bbcf146109985780638da1ce5e146109b95780638da5cb5b146109da5780639193cecc146104ac57005b806380a44e55146108cc57806381b13396146108f0578063896c6f5e146109205780638bc9755d1461094157005b80633bae3973116103005780635fc2e5961161028e57806375f0a8741161026057806375f0a874146108145780637b3c83b1146108345780637d459db3146108535780637f68564b1461088c578063809a4b0f146108ac57005b80635fc2e5961461079f578063666bfcbf146107bf57806370a08231146107df578063715018a6146107ff57005b80634ea62093116102d25780634ea62093146106f9578063520e047e1461071b578063521432901461073c57806354927b711461075c5780635f66c04c1461077c57005b80633bae39731461068f578063497cd426146106a55780634a74bb02146106c55780634d683674146106df57005b806327334a081161037d578063313ce5671161034f578063313ce567146105eb57806337680854146105ff578063395093511461061f5780633af32abf1461063f5780633b86ff851461066f57005b806327334a08146105405780632ce86fbf146105605780632d6abf87146105935780632d838119146105cb57005b806313114a9d116103c157806313114a9d146104ac5780631392c086146104cb57806318160ddd146104eb5780631ddfd6091461050057806323b872dd1461052057005b806305f82a45146103f857806306fdde0314610418578063095ea7b31461045c5780630d80bf641461048c57005b366103f657005b005b34801561040457600080fd5b506103f6610413366004614441565b610dbb565b34801561042457600080fd5b50604080518082019091526009815268242aa42faa37b5b2b760b91b60208201525b60405161045391906147b9565b60405180910390f35b34801561046857600080fd5b5061047c610477366004614597565b610e2e565b6040519015158152602001610453565b34801561049857600080fd5b506103f66104a736600461462f565b610e45565b3480156104b857600080fd5b506002545b604051908152602001610453565b3480156104d757600080fd5b506104bd6104e6366004614662565b611090565b3480156104f757600080fd5b506104bd6110ac565b34801561050c57600080fd5b506103f661051b366004614441565b6110ce565b34801561052c57600080fd5b5061047c61053b3660046144dc565b61141d565b34801561054c57600080fd5b506103f661055b366004614441565b611486565b34801561056c57600080fd5b5060035461058190600160381b900460ff1681565b60405160ff9091168152602001610453565b34801561059f57600080fd5b506017546105b3906001600160a01b031681565b6040516001600160a01b039091168152602001610453565b3480156105d757600080fd5b506104bd6105e6366004614662565b6114f0565b3480156105f757600080fd5b506009610581565b34801561060b57600080fd5b506103f661061a3660046146d9565b61156d565b34801561062b57600080fd5b5061047c61063a366004614597565b611673565b34801561064b57600080fd5b5061047c61065a366004614441565b60156020526000908152604090205460ff1681565b34801561067b57600080fd5b506103f661068a3660046146d9565b6116a9565b34801561069b57600080fd5b506104bd601b5481565b3480156106b157600080fd5b506103f66106c0366004614441565b6117c4565b3480156106d157600080fd5b50601c5461047c9060ff1681565b3480156106eb57600080fd5b506003546105819060ff1681565b34801561070557600080fd5b5060035461058190640100000000900460ff1681565b34801561072757600080fd5b5060035461058190600160601b900460ff1681565b34801561074857600080fd5b506018546105b3906001600160a01b031681565b34801561076857600080fd5b506009546105b3906001600160a01b031681565b34801561078857600080fd5b506003546105819065010000000000900460ff1681565b3480156107ab57600080fd5b506003546105819062010000900460ff1681565b3480156107cb57600080fd5b506103f66107da3660046146bf565b61194e565b3480156107eb57600080fd5b506104bd6107fa366004614441565b6119b6565b34801561080b57600080fd5b506103f6611a15565b34801561082057600080fd5b50600a546105b3906001600160a01b031681565b34801561084057600080fd5b5060035461058190610100900460ff1681565b34801561085f57600080fd5b5061047c61086e366004614441565b6001600160a01b03166000908152600f602052604090205460ff1690565b34801561089857600080fd5b506103f66108a7366004614441565b611a4b565b3480156108b857600080fd5b506103f66108c73660046146d9565b611b33565b3480156108d857600080fd5b50600354610581906601000000000000900460ff1681565b3480156108fc57600080fd5b5061047c61090b366004614441565b60166020526000908152604090205460ff1681565b34801561092c57600080fd5b5060035461058190600160581b900460ff1681565b34801561094d57600080fd5b506105b361095c3660046145e1565b80516020818301810180516012825292820191909301209152546001600160a01b031681565b34801561098e57600080fd5b506104bd601a5481565b3480156109a457600080fd5b5060035461058190600160501b900460ff1681565b3480156109c557600080fd5b50600354610581906301000000900460ff1681565b3480156109e657600080fd5b506000546001600160a01b03166105b3565b348015610a0457600080fd5b50604080518082019091526003815262090aa960eb1b6020820152610446565b348015610a3057600080fd5b506105b3610a3f366004614441565b6013602052600090815260409020546001600160a01b031681565b348015610a6657600080fd5b506103f6610a753660046145a9565b611c42565b348015610a8657600080fd5b50610a9a610a95366004614441565b611cfa565b60405161045391906147a6565b348015610ab357600080fd5b5061047c610ac2366004614597565b611d70565b348015610ad357600080fd5b506103f6610ae23660046146d9565b611dbf565b348015610af357600080fd5b506103f6610b023660046144a4565b611ed7565b348015610b1357600080fd5b5061047c610b22366004614597565b6120da565b348015610b3357600080fd5b506103f6610b42366004614441565b6120e7565b348015610b5357600080fd5b506019546105b3906001600160a01b031681565b348015610b7357600080fd5b506104bd60045481565b348015610b8957600080fd5b506103f6610b98366004614549565b6121f5565b348015610ba957600080fd5b506103f6610bb8366004614662565b612367565b348015610bc957600080fd5b506105b3610bd8366004614597565b6123d8565b348015610be957600080fd5b5060035461058190600160481b900460ff1681565b348015610c0a57600080fd5b506103f6610c19366004614662565b612410565b348015610c2a57600080fd5b5060035461058190600160401b900460ff1681565b348015610c4b57600080fd5b506104bd610c5a3660046144a4565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b348015610c9157600080fd5b506103f6610ca036600461462f565b61249b565b348015610cb157600080fd5b506104bd610cc0366004614441565b6001600160a01b031660009081526008602052604090205490565b348015610ce757600080fd5b506104bd610cf6366004614441565b6001600160a01b031660009081526007602052604090205490565b348015610d1d57600080fd5b506103f6610d2c36600461451c565b6125a8565b348015610d3d57600080fd5b506103f6610d4c366004614479565b612626565b348015610d5d57600080fd5b506103f6610d6c366004614441565b612713565b348015610d7d57600080fd5b50610446610d8c366004614441565b6127ae565b348015610d9d57600080fd5b506005546104bd565b348015610db257600080fd5b506006546104bd565b6000546001600160a01b03163314610dee5760405162461bcd60e51b8152600401610de590614803565b60405180910390fd5b610df78161286c565b6040516001600160a01b038216907fbc60ea2907fcdafe53db285c79dc7f5c4871e4d26a2d97a7bb5ae1e61f89099790600090a250565b6000610e3b338484612a52565b5060015b92915050565b80518190610e655760405162461bcd60e51b8152600401610de590614838565b3360009081526015602052604090205460ff1615610ebc5760405162461bcd60e51b8152602060048201526014602482015273416c72656164792077686974656c69737465642160601b6044820152606401610de5565b60006001600160a01b0316601282604051610ed7919061478a565b908152604051908190036020019020546001600160a01b03161415610f2f5760405162461bcd60e51b815260206004820152600e60248201526d4e6f6e207573656420636f64652160901b6044820152606401610de5565b336001600160a01b0316601282604051610f49919061478a565b908152604051908190036020019020546001600160a01b03161415610fb05760405162461bcd60e51b815260206004820152601b60248201527f496e76616c696420636f64652c2041202d3e20412072656665722100000000006044820152606401610de5565b336001600160a01b031660136000601284604051610fce919061478a565b9081526040805160209281900383019020546001600160a01b039081168452918301939093529101600020541614156110495760405162461bcd60e51b815260206004820181905260248201527f496e76616c696420636f64652c2041202d3e2042202d3e2041207265666572216044820152606401610de5565b61107b3360128360405161105d919061478a565b908152604051908190036020019020546001600160a01b0316612b77565b600554611089906001612c55565b6005555050565b6000806110a561109e612c61565b8490612848565b9392505050565b60006110ba6009600a614916565b6110c99064cec0ecb0006149c1565b905090565b6000546001600160a01b031633146110f85760405162461bcd60e51b8152600401610de590614803565b6001600160a01b03811661114e5760405162461bcd60e51b815260206004820152601b60248201527f50616e63616b655377617020526f7574657220496e76616c69642100000000006044820152606401610de5565b6017546001600160a01b03828116911614156111b75760405162461bcd60e51b815260206004820152602260248201527f50616e63616b655377617020526f7574657220616c7265616479206578697374604482015261732160f01b6064820152608401610de5565b306000908152600d60208181526040808420601780546001600160a01b0390811687529184528286208690556019548216865293835281852084548216865283528185209490945582546001600160a01b031916938516938417909255815163c45a015560e01b8152915163c45a0155926004808201939291829003018186803b15801561124457600080fd5b505afa158015611258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127c919061445d565b6001600160a01b031663c9c6539630601760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d957600080fd5b505afa1580156112ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611311919061445d565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561135957600080fd5b505af115801561136d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611391919061445d565b601880546001600160a01b0319166001600160a01b03928316179055306000908152600d60208181526040808420601780548716865290835281852060001990819055601954871686529383528185209054861685529091528083209190915551918316917f538d853badbe94e499a95fc6b54a1269182fc0249f4cf96dd07722eeef686b119190a250565b600061142a848484612c84565b61147c843361147785604051806060016040528060288152602001614acd602891396001600160a01b038a166000908152600d602090815260408083203384529091529020549190612fe3565b612a52565b5060019392505050565b6000546001600160a01b031633146114b05760405162461bcd60e51b8152600401610de590614803565b6114b98161300f565b6040516001600160a01b038216907fb1e6291bd894dac65335f88fa5b41166f1f5d6194503a8b59c1afa98de37942690600090a250565b60006001548211156115575760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610de5565b6000611561612c61565b90506110a58382612854565b6000546001600160a01b031633146115975760405162461bcd60e51b8152600401610de590614803565b60648360ff16106115ba5760405162461bcd60e51b8152600401610de5906147cc565b60648260ff16106115dd5760405162461bcd60e51b8152600401610de5906147cc565b60648160ff16106116005760405162461bcd60e51b8152600401610de5906147cc565b6003805460ff8381166301000000810263ff0000001987841662010000810262ff000019958b1661010081029690961662ffff0019909716969096179590951716179093556040517f7510d0059c69c8b48a31a5ad9daec9757e7d1dcfbdce101689667c9189b3016290600090a4505050565b336000818152600d602090815260408083206001600160a01b03871684529091528120549091610e3b9185906114779086612c55565b6000546001600160a01b031633146116d35760405162461bcd60e51b8152600401610de590614803565b60648360ff16106116f65760405162461bcd60e51b8152600401610de5906147cc565b60648260ff16106117195760405162461bcd60e51b8152600401610de5906147cc565b60648160ff161061173c5760405162461bcd60e51b8152600401610de5906147cc565b6003805460ff838116600160481b810269ff00000000000000000019878416600160401b810268ff000000000000000019958b16600160381b81029690961668ffff0000000000000019909716969096179590951716179093556040517fa00b29898a6a901f1859cc5ae0d8ff55764dc09e1ad4546861d4fa02b1c3a07190600090a4505050565b6000546001600160a01b031633146117ee5760405162461bcd60e51b8152600401610de590614803565b6019546001600160a01b03828116911614156118575760405162461bcd60e51b815260206004820152602260248201527f526577617264204469737472696275746f7220616c7265616479206578697374604482015261732160f01b6064820152608401610de5565b601980546001600160a01b039081166000908152600e60208181526040808420805460ff19908116909155308552600d808452828620885488168752808552838720879055885488168752818552838720601780548a16895290865284882088905589546001600160a01b0319168b8a169081178b5588529085528387206000199081905589548916885291855283872090548816875284528286205586548616855292909152909120805490911660011790559054611917911661300f565b6040516001600160a01b038216907fe8f05b5318006c7ee74017e03adf6ef1347c7f5b18cd28e1efdef72c38c6028490600090a250565b6000546001600160a01b031633146119785760405162461bcd60e51b8152600401610de590614803565b6003805460ff191660ff83169081179091556040517f886c4681a6f2d42e95cb4764287d8cb2cd60b7c64fa821b71fb7ee5625057a2b90600090a250565b6001600160a01b0381166000908152600f602052604081205460ff16156119f357506001600160a01b03166000908152600c602052604090205490565b6001600160a01b0382166000908152600b6020526040902054610e3f906114f0565b6000546001600160a01b03163314611a3f5760405162461bcd60e51b8152600401610de590614803565b611a496000613138565b565b6000546001600160a01b03163314611a755760405162461bcd60e51b8152600401610de590614803565b6001600160a01b038116611ae95760405162461bcd60e51b815260206004820152603560248201527f736574526566657272616c436f64655265676973747261746f723a205a65726f6044820152742061646472657373206e6f7420616c6c6f7765642160581b6064820152608401610de5565b600980546001600160a01b0319166001600160a01b0383169081179091556040517f3b89d2b753e58d7e947f49374edf63cccf876de16e85d8c697239d8716e0b63190600090a250565b6000546001600160a01b03163314611b5d5760405162461bcd60e51b8152600401610de590614803565b6103e88360ff1610611b815760405162461bcd60e51b8152600401610de5906147cc565b6103e88260ff1610611ba55760405162461bcd60e51b8152600401610de5906147cc565b6103e88160ff1610611bc95760405162461bcd60e51b8152600401610de5906147cc565b6003805460ff838116600160601b810260ff60601b19878416600160581b810260ff60581b19958b16600160501b81029690961661ffff60501b19909716969096179590951716179093556040517fb90681984f89581944c1b481ace82b0c4e9da1c1c270576c5a86be0feef01a3690600090a4505050565b6000546001600160a01b03163314611c6c5760405162461bcd60e51b8152600401610de590614803565b601c5460ff1615158115151415611cbd5760405162461bcd60e51b815260206004820152601560248201527456616c756520616c7265616479206578697374732160581b6044820152606401610de5565b601c805460ff19168215159081179091556040517feabf867d58cac10df90423915b338c6913140ae03402727b226deedef8d47c6990600090a250565b6001600160a01b038116600090815260146020908152604091829020805483518184028101840190945280845260609392830182828015611d6457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d46575b50505050509050919050565b6000610e3b338461147785604051806060016040528060258152602001614b1560259139336000908152600d602090815260408083206001600160a01b038d1684529091529020549190612fe3565b6000546001600160a01b03163314611de95760405162461bcd60e51b8152600401610de590614803565b60648360ff1610611e0c5760405162461bcd60e51b8152600401610de5906147cc565b60648260ff1610611e2f5760405162461bcd60e51b8152600401610de5906147cc565b60648160ff1610611e525760405162461bcd60e51b8152600401610de5906147cc565b6003805460ff8381166601000000000000810266ff0000000000001987841665010000000000810265ff000000000019958b1664010000000081029690961665ffff0000000019909716969096179590951716179093556040517ff2d8960ce6d635dc2b3f0309ed0393388af1db2395a3eb2173259d1510bd7f0490600090a4505050565b6000546001600160a01b03163314611f015760405162461bcd60e51b8152600401610de590614803565b6001600160a01b038216611f485760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420546f6b656e2160901b6044820152606401610de5565b6001600160a01b038116611f935760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420526563697069656e742160701b6044820152606401610de5565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015611fd557600080fd5b505afa158015611fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200d919061467a565b905080156120d55760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b15801561205f57600080fd5b505af1158015612073573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209791906145c5565b6120d55760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b6044820152606401610de5565b505050565b6000610e3b338484612c84565b6000546001600160a01b031633146121115760405162461bcd60e51b8152600401610de590614803565b6001600160a01b0381166121675760405162461bcd60e51b815260206004820152601960248201527f5a65726f2061646472657373206e6f7420616c6c6f77656421000000000000006044820152606401610de5565b600a80546001600160a01b039081166000908152600e6020526040808220805460ff1990811690915584546001600160a01b0319168685169081178655835291208054909116600117905590546121be911661300f565b6040516001600160a01b038216907f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090600090a250565b6009546001600160a01b031633148061221857506000546001600160a01b031633145b6122555760405162461bcd60e51b815260206004820152600e60248201526d4e6f74206175746f72697a65642160901b6044820152606401610de5565b805181906122755760405162461bcd60e51b8152600401610de590614838565b60006001600160a01b0316601282604051612290919061478a565b908152604051908190036020019020546001600160a01b0316146122eb5760405162461bcd60e51b8152602060048201526012602482015271436f646520616c726561647920757365642160701b6044820152606401610de5565b6001600160a01b0383166000908152601160205260409020805461230e90614a27565b15905061235d5760405162461bcd60e51b815260206004820152601c60248201527f5573657220616c72656164792067656e65726174656420636f646521000000006044820152606401610de5565b6120d58382613188565b6000546001600160a01b031633146123915760405162461bcd60e51b8152600401610de590614803565b61239d6009600a614916565b6123a790826149c1565b601b5560405181907f770976e2f66426619bfae364435eb739d78cc32d7ba2ead465556f51a10e6a2b90600090a250565b601460205281600052604060002081815481106123f457600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000546001600160a01b0316331461243a5760405162461bcd60e51b8152600401610de590614803565b61246a60646124648361244f6009600a614916565b61245e9064cec0ecb0006149c1565b90612848565b90612854565b601a5560405181907f570636dca93f35bb5dee1663ad99fe3f70745771395df08a5f7732130618b51890600090a250565b805181906124bb5760405162461bcd60e51b8152600401610de590614838565b60006001600160a01b03166012826040516124d6919061478a565b908152604051908190036020019020546001600160a01b0316146125315760405162461bcd60e51b8152602060048201526012602482015271436f646520616c726561647920757365642160701b6044820152606401610de5565b336000908152601160205260409020805461254b90614a27565b15905061259a5760405162461bcd60e51b815260206004820152601c60248201527f5573657220616c72656164792067656e65726174656420636f646521000000006044820152606401610de5565b6125a43382613188565b5050565b6000546001600160a01b031633146125d25760405162461bcd60e51b8152600401610de590614803565b6001600160a01b0382166000818152600e6020526040808220805460ff191685151590811790915590519092917fc444ab4df75bf06253429e3bef0816d6ab100d5e10cc3daafce5f29d48b4d73091a35050565b6000546001600160a01b031633146126505760405162461bcd60e51b8152600401610de590614803565b6001600160a01b03821661269b5760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420526563697069656e742160701b6044820152606401610de5565b600081116126dd5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420416d6f756e742160881b6044820152606401610de5565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156120d5573d6000803e3d6000fd5b6000546001600160a01b0316331461273d5760405162461bcd60e51b8152600401610de590614803565b6001600160a01b0381166127a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610de5565b6127ab81613138565b50565b601160205260009081526040902080546127c790614a27565b80601f01602080910402602001604051908101604052809291908181526020018280546127f390614a27565b80156128405780601f1061281557610100808354040283529160200191612840565b820191906000526020600020905b81548152906001019060200180831161282357829003601f168201915b505050505081565b60006110a582846149c1565b60006110a582846148b3565b60006110a582846149e0565b6001600160a01b0381166000908152600f602052604090205460ff166128d45760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610de5565b60005b6010548110156125a457816001600160a01b03166010828154811061290c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415612a405760108054612937906001906149e0565b8154811061295557634e487b7160e01b600052603260045260246000fd5b600091825260209091200154601080546001600160a01b03909216918390811061298f57634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600c90915260409020546129cf90611090565b6001600160a01b0383166000908152600b6020908152604080832093909355600f905220805460ff191690556010805480612a1a57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80612a4a81614a62565b9150506128d7565b6001600160a01b038316612ab45760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610de5565b6001600160a01b038216612b155760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610de5565b6001600160a01b038381166000818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038083166000818152601660209081526040808320805460ff199081166001908117909255338552601584528285208054909116821790556013835281842080549688166001600160a01b031997881681179091558085526014845282852080548084018255908652848620018054909716909517909555928252600790522054612c0891612c55565b6001600160a01b038083166000818152600760205260408082209490945592519092918516917f4bc18aa4b0095c9a3b5cdf42d2322d5a145591b04045988a995a5da42607545791a35050565b60006110a5828461489b565b6000806000612c6e613230565b9092509050612c7d8282612854565b9250505090565b6001600160a01b038316612ce85760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610de5565b6001600160a01b038216612d4a5760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610de5565b60008111612db35760405162461bcd60e51b815260206004820152603060248201527f42455032303a205472616e7366657220616d6f756e74206d757374206265206760448201526f726561746572207468616e207a65726f60801b6064820152608401610de5565b6000546001600160a01b03848116911614801590612ddf57506000546001600160a01b03838116911614155b15612e4657601a54811115612e465760405162461bcd60e51b815260206004820152602760248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152661e105b5bdd5b9d60ca1b6064820152608401610de5565b601c54610100900460ff1615612e61576120d583838361344e565b612e696135be565b15612e7657612e7661361a565b6001600160a01b0383166000908152600e602052604090205460ff1680612eb557506001600160a01b0382166000908152600e602052604090205460ff165b15612eca57612ec583838361344e565b612fb8565b6018546001600160a01b0383811691161415612f17576001600160a01b03831660009081526015602052604090205460ff1615612f0c57612ec58383836138e0565b612ec5838383613beb565b6018546001600160a01b0384811691161415612fad576001600160a01b03821660009081526015602052604090205460ff168015612f6d57506001600160a01b03821660009081526016602052604090205460ff165b15612fa257612f7d838383613c99565b6001600160a01b0382166000908152601660205260409020805460ff19169055612fb8565b612ec5838383613fd2565b612fb883838361344e565b600454158015612fd557506018546001600160a01b038381169116145b156120d55743600455505050565b600081848411156130075760405162461bcd60e51b8152600401610de591906147b9565b505050900390565b6001600160a01b0381166000908152600f602052604090205460ff16156130785760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610de5565b6001600160a01b0381166000908152600b6020526040902054156130d2576001600160a01b0381166000908152600b60205260409020546130b8906114f0565b6001600160a01b0382166000908152600c60205260409020555b6001600160a01b03166000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319169091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b81601282604051613199919061478a565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039485161790559184166000908152601182529190912082516131e2928401906142fd565b50806040516131f1919061478a565b604051908190038120906001600160a01b038416907f314992e462ed086b71540d0bc426691ff1f210675f007748b118be3560abe3c790600090a35050565b6001546000908190816132456009600a614916565b6132549064cec0ecb0006149c1565b905060005b6010548110156133ee5782600b60006010848154811061328957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613302575081600c6000601084815481106132db57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613330576001546133166009600a614916565b6133259064cec0ecb0006149c1565b945094505050509091565b613384600b60006010848154811061335857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612860565b92506133da600c6000601084815481106133ae57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612860565b9150806133e681614a62565b915050613259565b506134166133fe6009600a614916565b61340d9064cec0ecb0006149c1565b60015490612854565b8210156134455760015461342c6009600a614916565b61343b9064cec0ecb0006149c1565b9350935050509091565b90939092509050565b600061345982611090565b6001600160a01b0385166000908152600b602052604090205490915061347f9082612860565b6001600160a01b038086166000908152600b602052604080822093909355908516815220546134ae9082612c55565b6001600160a01b038085166000908152600b60209081526040808320949094559187168152600f909152205460ff161561351f576001600160a01b0384166000908152600c60205260409020546135059083612860565b6001600160a01b0385166000908152600c60205260409020555b6001600160a01b0383166000908152600f602052604090205460ff161561357d576001600160a01b0383166000908152600c60205260409020546135639083612c55565b6001600160a01b0384166000908152600c60205260409020555b826001600160a01b0316846001600160a01b0316600080516020614af5833981519152846040516135b091815260200190565b60405180910390a350505050565b6018546000906001600160a01b031633148015906135de57506000600454115b80156135f25750601c54610100900460ff16155b80156136005750601c5460ff165b80156110c95750601b54613613306119b6565b1015905090565b601c805461ff001916610100179055601b546000613639826002612854565b905060006136478383612860565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061368f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156136e357600080fd5b505afa1580156136f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061371b919061445d565b8160018151811061373c57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260175447911663791ac947856000853061376d42601e612c55565b6040518663ffffffff1660e01b815260040161378d95949392919061485f565b600060405180830381600087803b1580156137a757600080fd5b505af11580156137bb573d6000803e3d6000fd5b5050505060006137d4824761286090919063ffffffff16565b6017549091506001600160a01b031663f305d71982308760008061dead6137fc42601e612c55565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b15801561386457600080fd5b505af1158015613878573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061389d9190614692565b505060405186915082907f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f838148690600090a35050601c805461ff001916905550505050565b60006138ea612c61565b905060006138f88383612848565b9050600061392b6103e86124648561245e6003600a9054906101000a900460ff1660ff168961284890919063ffffffff16565b9050600061395e6103e86124648661245e6003600c9054906101000a900460ff1660ff168a61284890919063ffffffff16565b905060006139916103e86124648761245e6003600b9054906101000a900460ff1660ff168b61284890919063ffffffff16565b905060006139ab826139a585818989612860565b90612860565b6001600160a01b038a166000908152600b60205260409020549091506139d19086612860565b6001600160a01b03808b166000908152600b602052604080822093909355908a1681522054613a009082612c55565b6001600160a01b0389166000908152600b6020526040808220929092553081522054613a2c9085612c55565b306000908152600b60209081526040808320939093556001600160a01b038c168252600f9052205460ff1615613a99576001600160a01b0389166000908152600c6020526040902054613a7f9088612860565b6001600160a01b038a166000908152600c60205260409020555b6001600160a01b0388166000908152600f602052604090205460ff1615613b0057613ae6613ac78288612854565b6001600160a01b038a166000908152600c602052604090205490612c55565b6001600160a01b0389166000908152600c60205260409020555b306000908152600f602052604090205460ff1615613b4c57613b3b613b258588612854565b306000908152600c602052604090205490612c55565b306000908152600c60205260409020555b6001600160a01b03808916908a16600080516020614af5833981519152613b73848a612854565b60405190815260200160405180910390a3306001600160a01b038a16600080516020614af5833981519152613ba8878a612854565b60405190815260200160405180910390a3613bcd89613bc78489612854565b8461407e565b613be083613bdb8189612854565b61414e565b505050505050505050565b6000613bf5612c61565b90506000613c038383612848565b90506000613c3560646124648561245e600360079054906101000a900460ff1660ff168961284890919063ffffffff16565b90506000613c6760646124648661245e600360099054906101000a900460ff1660ff168a61284890919063ffffffff16565b9050600061399160646124648761245e600360089054906101000a900460ff1660ff168b61284890919063ffffffff16565b6000613ca3612c61565b90506000613cb18383612848565b600354909150600090613ccf9060649061246490879060ff16612848565b90506000613cdd8285612848565b90506000613d0f60646124648761245e600360049054906101000a900460ff1660ff168b61284890919063ffffffff16565b90506000613d4160646124648861245e600360069054906101000a900460ff1660ff168c61284890919063ffffffff16565b90506000613d7360646124648961245e600360059054906101000a900460ff1660ff168d61284890919063ffffffff16565b90506000613d89826139a5858188818d8c612860565b6001600160a01b038c166000908152600b6020526040902054909150613daf9088612860565b6001600160a01b03808d166000908152600b602052604080822093909355908c1681522054613dde9082612c55565b6001600160a01b038b166000908152600b6020526040808220929092553081522054613e0a9085612c55565b306000908152600b60209081526040808320939093556001600160a01b038e168252600f9052205460ff1615613e77576001600160a01b038b166000908152600c6020526040902054613e5d908a612860565b6001600160a01b038c166000908152600c60205260409020555b6001600160a01b038a166000908152600f602052604090205460ff1615613ede57613ec4613ea5828a612854565b6001600160a01b038c166000908152600c602052604090205490612c55565b6001600160a01b038b166000908152600c60205260409020555b306000908152600f602052604090205460ff1615613f1457613f03613b25858a612854565b306000908152600c60205260409020555b6001600160a01b03808b16908c16600080516020614af5833981519152613f3b848c612854565b60405190815260200160405180910390a3306001600160a01b038c16600080516020614af5833981519152613f70878c612854565b60405190815260200160405180910390a36001600160a01b03808b16600090815260136020526040902054613fa9918d91168888614172565b613fb78b613bc7848b612854565b613fc583613bdb818b612854565b5050505050505050505050565b6000613fdc612c61565b90506000613fea8383612848565b9050600061401c60646124648561245e600360019054906101000a900460ff1660ff168961284890919063ffffffff16565b9050600061404c60646124648661245e60038054906101000a900460ff1660ff168a61284890919063ffffffff16565b9050600061399160646124648761245e600360029054906101000a900460ff1660ff168b61284890919063ffffffff16565b600a546001600160a01b03166000908152600b60205260409020546140a39082612c55565b600a80546001600160a01b039081166000908152600b602090815260408083209590955592549091168152600f909152205460ff161561411e57600a546001600160a01b03166000908152600c60205260409020546141029083612c55565b600a546001600160a01b03166000908152600c60205260409020555b600a546040518381526001600160a01b0391821691851690600080516020614af583398151915290602001612b6a565b60015461415b9083612860565b60015560025461416b9082612c55565b6002555050565b6019546001600160a01b03166000908152600b60205260409020546141979082612c55565b601980546001600160a01b039081166000908152600b602090815260408083209590955592549091168152600f909152205460ff1615614212576019546001600160a01b03166000908152600c60205260409020546141f69083612c55565b6019546001600160a01b03166000908152600c60205260409020555b6019546040518381526001600160a01b0391821691861690600080516020614af58339815191529060200160405180910390a3601954604051639ba8dfab60e01b81526001600160a01b0385811660048301526024820185905290911690639ba8dfab90604401600060405180830381600087803b15801561429357600080fd5b505af11580156142a7573d6000803e3d6000fd5b5050506001600160a01b0384166000908152600860205260409020546142ce915083612c55565b6001600160a01b0384166000908152600860205260409020556006546142f49083612c55565b60065550505050565b82805461430990614a27565b90600052602060002090601f01602090048101928261432b5760008555614371565b82601f1061434457805160ff1916838001178555614371565b82800160010185558215614371579182015b82811115614371578251825591602001919060010190614356565b5061437d929150614381565b5090565b5b8082111561437d5760008155600101614382565b600067ffffffffffffffff808411156143b1576143b1614a93565b604051601f8501601f19908116603f011681019082821181831017156143d9576143d9614a93565b816040528093508581528686860111156143f257600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261441c578081fd5b6110a583833560208501614396565b803560ff8116811461443c57600080fd5b919050565b600060208284031215614452578081fd5b81356110a581614aa9565b60006020828403121561446e578081fd5b81516110a581614aa9565b6000806040838503121561448b578081fd5b823561449681614aa9565b946020939093013593505050565b600080604083850312156144b6578182fd5b82356144c181614aa9565b915060208301356144d181614aa9565b809150509250929050565b6000806000606084860312156144f0578081fd5b83356144fb81614aa9565b9250602084013561450b81614aa9565b929592945050506040919091013590565b6000806040838503121561452e578182fd5b823561453981614aa9565b915060208301356144d181614abe565b6000806040838503121561455b578182fd5b823561456681614aa9565b9150602083013567ffffffffffffffff811115614581578182fd5b61458d8582860161440c565b9150509250929050565b6000806040838503121561448b578182fd5b6000602082840312156145ba578081fd5b81356110a581614abe565b6000602082840312156145d6578081fd5b81516110a581614abe565b6000602082840312156145f2578081fd5b813567ffffffffffffffff811115614608578182fd5b8201601f81018413614618578182fd5b61462784823560208401614396565b949350505050565b600060208284031215614640578081fd5b813567ffffffffffffffff811115614656578182fd5b6146278482850161440c565b600060208284031215614673578081fd5b5035919050565b60006020828403121561468b578081fd5b5051919050565b6000806000606084860312156146a6578081fd5b8351925060208401519150604084015190509250925092565b6000602082840312156146d0578081fd5b6110a58261442b565b6000806000606084860312156146ed578081fd5b6146f68461442b565b92506147046020850161442b565b91506147126040850161442b565b90509250925092565b6000815180845260208085019450808401835b838110156147535781516001600160a01b03168752958201959082019060010161472e565b509495945050505050565b600081518084526147768160208601602086016149f7565b601f01601f19169290920160200192915050565b6000825161479c8184602087016149f7565b9190910192915050565b6020815260006110a5602083018461471b565b6020815260006110a5602083018461475e565b6020808252601c908201527f4665652073686f756c64206265206c657373207468616e203130302100000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600d908201526c496e76616c696420636f64652160981b604082015260600190565b85815284602082015260a06040820152600061487e60a083018661471b565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156148ae576148ae614a7d565b500190565b6000826148ce57634e487b7160e01b81526012600452602481fd5b500490565b600181815b8085111561490e5781600019048211156148f4576148f4614a7d565b8085161561490157918102915b93841c93908002906148d8565b509250929050565b60006110a560ff84168360008261492f57506001610e3f565b8161493c57506000610e3f565b8160018114614952576002811461495c57614978565b6001915050610e3f565b60ff84111561496d5761496d614a7d565b50506001821b610e3f565b5060208310610133831016604e8410600b841016171561499b575081810a610e3f565b6149a583836148d3565b80600019048211156149b9576149b9614a7d565b029392505050565b60008160001904831182151516156149db576149db614a7d565b500290565b6000828210156149f2576149f2614a7d565b500390565b60005b83811015614a125781810151838201526020016149fa565b83811115614a21576000848401525b50505050565b600181811c90821680614a3b57607f821691505b60208210811415614a5c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614a7657614a76614a7d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146127ab57600080fd5b80151581146127ab57600080fdfe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef42455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122021c42ce6e7c704984da5c5cfb8aeea4ee9e4495ea2853a1a70563202d1ccceb964736f6c63430008040033

Deployed Bytecode

0x6080604052600436106103ef5760003560e01c806380a44e5511610206578063acc2166a11610117578063e177bb9b116100a5578063f0189c3111610077578063f0189c3114610d31578063f2fde38b14610d51578063f614165114610d71578063fc497a4514610d91578063fe2ec09e14610da657005b8063e177bb9b14610c85578063e31d390c14610ca5578063ea416f6d14610cdb578063ef422a1814610d1157005b8063d12eb0a3116100e9578063d12eb0a314610bbd578063d3edf3b414610bdd578063d543dbeb14610bfe578063dc4c7dbc14610c1e578063dd62ed3e14610c3f57005b8063acc2166a14610b47578063bf56b37114610b67578063c763c97c14610b7d578063caea299514610b9d57005b806395d89b4111610194578063a457c2d711610166578063a457c2d714610aa7578063a469d71714610ac7578063a522ad2514610ae7578063a9059cbb14610b07578063aacebbe314610b2757005b806395d89b41146109f85780639d79cf8e14610a245780639f9a4e7f14610a5a578063a057107514610a7a57005b80638c0b5e22116101d85780638c0b5e22146109825780638c87bbcf146109985780638da1ce5e146109b95780638da5cb5b146109da5780639193cecc146104ac57005b806380a44e55146108cc57806381b13396146108f0578063896c6f5e146109205780638bc9755d1461094157005b80633bae3973116103005780635fc2e5961161028e57806375f0a8741161026057806375f0a874146108145780637b3c83b1146108345780637d459db3146108535780637f68564b1461088c578063809a4b0f146108ac57005b80635fc2e5961461079f578063666bfcbf146107bf57806370a08231146107df578063715018a6146107ff57005b80634ea62093116102d25780634ea62093146106f9578063520e047e1461071b578063521432901461073c57806354927b711461075c5780635f66c04c1461077c57005b80633bae39731461068f578063497cd426146106a55780634a74bb02146106c55780634d683674146106df57005b806327334a081161037d578063313ce5671161034f578063313ce567146105eb57806337680854146105ff578063395093511461061f5780633af32abf1461063f5780633b86ff851461066f57005b806327334a08146105405780632ce86fbf146105605780632d6abf87146105935780632d838119146105cb57005b806313114a9d116103c157806313114a9d146104ac5780631392c086146104cb57806318160ddd146104eb5780631ddfd6091461050057806323b872dd1461052057005b806305f82a45146103f857806306fdde0314610418578063095ea7b31461045c5780630d80bf641461048c57005b366103f657005b005b34801561040457600080fd5b506103f6610413366004614441565b610dbb565b34801561042457600080fd5b50604080518082019091526009815268242aa42faa37b5b2b760b91b60208201525b60405161045391906147b9565b60405180910390f35b34801561046857600080fd5b5061047c610477366004614597565b610e2e565b6040519015158152602001610453565b34801561049857600080fd5b506103f66104a736600461462f565b610e45565b3480156104b857600080fd5b506002545b604051908152602001610453565b3480156104d757600080fd5b506104bd6104e6366004614662565b611090565b3480156104f757600080fd5b506104bd6110ac565b34801561050c57600080fd5b506103f661051b366004614441565b6110ce565b34801561052c57600080fd5b5061047c61053b3660046144dc565b61141d565b34801561054c57600080fd5b506103f661055b366004614441565b611486565b34801561056c57600080fd5b5060035461058190600160381b900460ff1681565b60405160ff9091168152602001610453565b34801561059f57600080fd5b506017546105b3906001600160a01b031681565b6040516001600160a01b039091168152602001610453565b3480156105d757600080fd5b506104bd6105e6366004614662565b6114f0565b3480156105f757600080fd5b506009610581565b34801561060b57600080fd5b506103f661061a3660046146d9565b61156d565b34801561062b57600080fd5b5061047c61063a366004614597565b611673565b34801561064b57600080fd5b5061047c61065a366004614441565b60156020526000908152604090205460ff1681565b34801561067b57600080fd5b506103f661068a3660046146d9565b6116a9565b34801561069b57600080fd5b506104bd601b5481565b3480156106b157600080fd5b506103f66106c0366004614441565b6117c4565b3480156106d157600080fd5b50601c5461047c9060ff1681565b3480156106eb57600080fd5b506003546105819060ff1681565b34801561070557600080fd5b5060035461058190640100000000900460ff1681565b34801561072757600080fd5b5060035461058190600160601b900460ff1681565b34801561074857600080fd5b506018546105b3906001600160a01b031681565b34801561076857600080fd5b506009546105b3906001600160a01b031681565b34801561078857600080fd5b506003546105819065010000000000900460ff1681565b3480156107ab57600080fd5b506003546105819062010000900460ff1681565b3480156107cb57600080fd5b506103f66107da3660046146bf565b61194e565b3480156107eb57600080fd5b506104bd6107fa366004614441565b6119b6565b34801561080b57600080fd5b506103f6611a15565b34801561082057600080fd5b50600a546105b3906001600160a01b031681565b34801561084057600080fd5b5060035461058190610100900460ff1681565b34801561085f57600080fd5b5061047c61086e366004614441565b6001600160a01b03166000908152600f602052604090205460ff1690565b34801561089857600080fd5b506103f66108a7366004614441565b611a4b565b3480156108b857600080fd5b506103f66108c73660046146d9565b611b33565b3480156108d857600080fd5b50600354610581906601000000000000900460ff1681565b3480156108fc57600080fd5b5061047c61090b366004614441565b60166020526000908152604090205460ff1681565b34801561092c57600080fd5b5060035461058190600160581b900460ff1681565b34801561094d57600080fd5b506105b361095c3660046145e1565b80516020818301810180516012825292820191909301209152546001600160a01b031681565b34801561098e57600080fd5b506104bd601a5481565b3480156109a457600080fd5b5060035461058190600160501b900460ff1681565b3480156109c557600080fd5b50600354610581906301000000900460ff1681565b3480156109e657600080fd5b506000546001600160a01b03166105b3565b348015610a0457600080fd5b50604080518082019091526003815262090aa960eb1b6020820152610446565b348015610a3057600080fd5b506105b3610a3f366004614441565b6013602052600090815260409020546001600160a01b031681565b348015610a6657600080fd5b506103f6610a753660046145a9565b611c42565b348015610a8657600080fd5b50610a9a610a95366004614441565b611cfa565b60405161045391906147a6565b348015610ab357600080fd5b5061047c610ac2366004614597565b611d70565b348015610ad357600080fd5b506103f6610ae23660046146d9565b611dbf565b348015610af357600080fd5b506103f6610b023660046144a4565b611ed7565b348015610b1357600080fd5b5061047c610b22366004614597565b6120da565b348015610b3357600080fd5b506103f6610b42366004614441565b6120e7565b348015610b5357600080fd5b506019546105b3906001600160a01b031681565b348015610b7357600080fd5b506104bd60045481565b348015610b8957600080fd5b506103f6610b98366004614549565b6121f5565b348015610ba957600080fd5b506103f6610bb8366004614662565b612367565b348015610bc957600080fd5b506105b3610bd8366004614597565b6123d8565b348015610be957600080fd5b5060035461058190600160481b900460ff1681565b348015610c0a57600080fd5b506103f6610c19366004614662565b612410565b348015610c2a57600080fd5b5060035461058190600160401b900460ff1681565b348015610c4b57600080fd5b506104bd610c5a3660046144a4565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b348015610c9157600080fd5b506103f6610ca036600461462f565b61249b565b348015610cb157600080fd5b506104bd610cc0366004614441565b6001600160a01b031660009081526008602052604090205490565b348015610ce757600080fd5b506104bd610cf6366004614441565b6001600160a01b031660009081526007602052604090205490565b348015610d1d57600080fd5b506103f6610d2c36600461451c565b6125a8565b348015610d3d57600080fd5b506103f6610d4c366004614479565b612626565b348015610d5d57600080fd5b506103f6610d6c366004614441565b612713565b348015610d7d57600080fd5b50610446610d8c366004614441565b6127ae565b348015610d9d57600080fd5b506005546104bd565b348015610db257600080fd5b506006546104bd565b6000546001600160a01b03163314610dee5760405162461bcd60e51b8152600401610de590614803565b60405180910390fd5b610df78161286c565b6040516001600160a01b038216907fbc60ea2907fcdafe53db285c79dc7f5c4871e4d26a2d97a7bb5ae1e61f89099790600090a250565b6000610e3b338484612a52565b5060015b92915050565b80518190610e655760405162461bcd60e51b8152600401610de590614838565b3360009081526015602052604090205460ff1615610ebc5760405162461bcd60e51b8152602060048201526014602482015273416c72656164792077686974656c69737465642160601b6044820152606401610de5565b60006001600160a01b0316601282604051610ed7919061478a565b908152604051908190036020019020546001600160a01b03161415610f2f5760405162461bcd60e51b815260206004820152600e60248201526d4e6f6e207573656420636f64652160901b6044820152606401610de5565b336001600160a01b0316601282604051610f49919061478a565b908152604051908190036020019020546001600160a01b03161415610fb05760405162461bcd60e51b815260206004820152601b60248201527f496e76616c696420636f64652c2041202d3e20412072656665722100000000006044820152606401610de5565b336001600160a01b031660136000601284604051610fce919061478a565b9081526040805160209281900383019020546001600160a01b039081168452918301939093529101600020541614156110495760405162461bcd60e51b815260206004820181905260248201527f496e76616c696420636f64652c2041202d3e2042202d3e2041207265666572216044820152606401610de5565b61107b3360128360405161105d919061478a565b908152604051908190036020019020546001600160a01b0316612b77565b600554611089906001612c55565b6005555050565b6000806110a561109e612c61565b8490612848565b9392505050565b60006110ba6009600a614916565b6110c99064cec0ecb0006149c1565b905090565b6000546001600160a01b031633146110f85760405162461bcd60e51b8152600401610de590614803565b6001600160a01b03811661114e5760405162461bcd60e51b815260206004820152601b60248201527f50616e63616b655377617020526f7574657220496e76616c69642100000000006044820152606401610de5565b6017546001600160a01b03828116911614156111b75760405162461bcd60e51b815260206004820152602260248201527f50616e63616b655377617020526f7574657220616c7265616479206578697374604482015261732160f01b6064820152608401610de5565b306000908152600d60208181526040808420601780546001600160a01b0390811687529184528286208690556019548216865293835281852084548216865283528185209490945582546001600160a01b031916938516938417909255815163c45a015560e01b8152915163c45a0155926004808201939291829003018186803b15801561124457600080fd5b505afa158015611258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127c919061445d565b6001600160a01b031663c9c6539630601760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d957600080fd5b505afa1580156112ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611311919061445d565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561135957600080fd5b505af115801561136d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611391919061445d565b601880546001600160a01b0319166001600160a01b03928316179055306000908152600d60208181526040808420601780548716865290835281852060001990819055601954871686529383528185209054861685529091528083209190915551918316917f538d853badbe94e499a95fc6b54a1269182fc0249f4cf96dd07722eeef686b119190a250565b600061142a848484612c84565b61147c843361147785604051806060016040528060288152602001614acd602891396001600160a01b038a166000908152600d602090815260408083203384529091529020549190612fe3565b612a52565b5060019392505050565b6000546001600160a01b031633146114b05760405162461bcd60e51b8152600401610de590614803565b6114b98161300f565b6040516001600160a01b038216907fb1e6291bd894dac65335f88fa5b41166f1f5d6194503a8b59c1afa98de37942690600090a250565b60006001548211156115575760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610de5565b6000611561612c61565b90506110a58382612854565b6000546001600160a01b031633146115975760405162461bcd60e51b8152600401610de590614803565b60648360ff16106115ba5760405162461bcd60e51b8152600401610de5906147cc565b60648260ff16106115dd5760405162461bcd60e51b8152600401610de5906147cc565b60648160ff16106116005760405162461bcd60e51b8152600401610de5906147cc565b6003805460ff8381166301000000810263ff0000001987841662010000810262ff000019958b1661010081029690961662ffff0019909716969096179590951716179093556040517f7510d0059c69c8b48a31a5ad9daec9757e7d1dcfbdce101689667c9189b3016290600090a4505050565b336000818152600d602090815260408083206001600160a01b03871684529091528120549091610e3b9185906114779086612c55565b6000546001600160a01b031633146116d35760405162461bcd60e51b8152600401610de590614803565b60648360ff16106116f65760405162461bcd60e51b8152600401610de5906147cc565b60648260ff16106117195760405162461bcd60e51b8152600401610de5906147cc565b60648160ff161061173c5760405162461bcd60e51b8152600401610de5906147cc565b6003805460ff838116600160481b810269ff00000000000000000019878416600160401b810268ff000000000000000019958b16600160381b81029690961668ffff0000000000000019909716969096179590951716179093556040517fa00b29898a6a901f1859cc5ae0d8ff55764dc09e1ad4546861d4fa02b1c3a07190600090a4505050565b6000546001600160a01b031633146117ee5760405162461bcd60e51b8152600401610de590614803565b6019546001600160a01b03828116911614156118575760405162461bcd60e51b815260206004820152602260248201527f526577617264204469737472696275746f7220616c7265616479206578697374604482015261732160f01b6064820152608401610de5565b601980546001600160a01b039081166000908152600e60208181526040808420805460ff19908116909155308552600d808452828620885488168752808552838720879055885488168752818552838720601780548a16895290865284882088905589546001600160a01b0319168b8a169081178b5588529085528387206000199081905589548916885291855283872090548816875284528286205586548616855292909152909120805490911660011790559054611917911661300f565b6040516001600160a01b038216907fe8f05b5318006c7ee74017e03adf6ef1347c7f5b18cd28e1efdef72c38c6028490600090a250565b6000546001600160a01b031633146119785760405162461bcd60e51b8152600401610de590614803565b6003805460ff191660ff83169081179091556040517f886c4681a6f2d42e95cb4764287d8cb2cd60b7c64fa821b71fb7ee5625057a2b90600090a250565b6001600160a01b0381166000908152600f602052604081205460ff16156119f357506001600160a01b03166000908152600c602052604090205490565b6001600160a01b0382166000908152600b6020526040902054610e3f906114f0565b6000546001600160a01b03163314611a3f5760405162461bcd60e51b8152600401610de590614803565b611a496000613138565b565b6000546001600160a01b03163314611a755760405162461bcd60e51b8152600401610de590614803565b6001600160a01b038116611ae95760405162461bcd60e51b815260206004820152603560248201527f736574526566657272616c436f64655265676973747261746f723a205a65726f6044820152742061646472657373206e6f7420616c6c6f7765642160581b6064820152608401610de5565b600980546001600160a01b0319166001600160a01b0383169081179091556040517f3b89d2b753e58d7e947f49374edf63cccf876de16e85d8c697239d8716e0b63190600090a250565b6000546001600160a01b03163314611b5d5760405162461bcd60e51b8152600401610de590614803565b6103e88360ff1610611b815760405162461bcd60e51b8152600401610de5906147cc565b6103e88260ff1610611ba55760405162461bcd60e51b8152600401610de5906147cc565b6103e88160ff1610611bc95760405162461bcd60e51b8152600401610de5906147cc565b6003805460ff838116600160601b810260ff60601b19878416600160581b810260ff60581b19958b16600160501b81029690961661ffff60501b19909716969096179590951716179093556040517fb90681984f89581944c1b481ace82b0c4e9da1c1c270576c5a86be0feef01a3690600090a4505050565b6000546001600160a01b03163314611c6c5760405162461bcd60e51b8152600401610de590614803565b601c5460ff1615158115151415611cbd5760405162461bcd60e51b815260206004820152601560248201527456616c756520616c7265616479206578697374732160581b6044820152606401610de5565b601c805460ff19168215159081179091556040517feabf867d58cac10df90423915b338c6913140ae03402727b226deedef8d47c6990600090a250565b6001600160a01b038116600090815260146020908152604091829020805483518184028101840190945280845260609392830182828015611d6457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d46575b50505050509050919050565b6000610e3b338461147785604051806060016040528060258152602001614b1560259139336000908152600d602090815260408083206001600160a01b038d1684529091529020549190612fe3565b6000546001600160a01b03163314611de95760405162461bcd60e51b8152600401610de590614803565b60648360ff1610611e0c5760405162461bcd60e51b8152600401610de5906147cc565b60648260ff1610611e2f5760405162461bcd60e51b8152600401610de5906147cc565b60648160ff1610611e525760405162461bcd60e51b8152600401610de5906147cc565b6003805460ff8381166601000000000000810266ff0000000000001987841665010000000000810265ff000000000019958b1664010000000081029690961665ffff0000000019909716969096179590951716179093556040517ff2d8960ce6d635dc2b3f0309ed0393388af1db2395a3eb2173259d1510bd7f0490600090a4505050565b6000546001600160a01b03163314611f015760405162461bcd60e51b8152600401610de590614803565b6001600160a01b038216611f485760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420546f6b656e2160901b6044820152606401610de5565b6001600160a01b038116611f935760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420526563697069656e742160701b6044820152606401610de5565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015611fd557600080fd5b505afa158015611fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200d919061467a565b905080156120d55760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b15801561205f57600080fd5b505af1158015612073573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209791906145c5565b6120d55760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b6044820152606401610de5565b505050565b6000610e3b338484612c84565b6000546001600160a01b031633146121115760405162461bcd60e51b8152600401610de590614803565b6001600160a01b0381166121675760405162461bcd60e51b815260206004820152601960248201527f5a65726f2061646472657373206e6f7420616c6c6f77656421000000000000006044820152606401610de5565b600a80546001600160a01b039081166000908152600e6020526040808220805460ff1990811690915584546001600160a01b0319168685169081178655835291208054909116600117905590546121be911661300f565b6040516001600160a01b038216907f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090600090a250565b6009546001600160a01b031633148061221857506000546001600160a01b031633145b6122555760405162461bcd60e51b815260206004820152600e60248201526d4e6f74206175746f72697a65642160901b6044820152606401610de5565b805181906122755760405162461bcd60e51b8152600401610de590614838565b60006001600160a01b0316601282604051612290919061478a565b908152604051908190036020019020546001600160a01b0316146122eb5760405162461bcd60e51b8152602060048201526012602482015271436f646520616c726561647920757365642160701b6044820152606401610de5565b6001600160a01b0383166000908152601160205260409020805461230e90614a27565b15905061235d5760405162461bcd60e51b815260206004820152601c60248201527f5573657220616c72656164792067656e65726174656420636f646521000000006044820152606401610de5565b6120d58382613188565b6000546001600160a01b031633146123915760405162461bcd60e51b8152600401610de590614803565b61239d6009600a614916565b6123a790826149c1565b601b5560405181907f770976e2f66426619bfae364435eb739d78cc32d7ba2ead465556f51a10e6a2b90600090a250565b601460205281600052604060002081815481106123f457600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000546001600160a01b0316331461243a5760405162461bcd60e51b8152600401610de590614803565b61246a60646124648361244f6009600a614916565b61245e9064cec0ecb0006149c1565b90612848565b90612854565b601a5560405181907f570636dca93f35bb5dee1663ad99fe3f70745771395df08a5f7732130618b51890600090a250565b805181906124bb5760405162461bcd60e51b8152600401610de590614838565b60006001600160a01b03166012826040516124d6919061478a565b908152604051908190036020019020546001600160a01b0316146125315760405162461bcd60e51b8152602060048201526012602482015271436f646520616c726561647920757365642160701b6044820152606401610de5565b336000908152601160205260409020805461254b90614a27565b15905061259a5760405162461bcd60e51b815260206004820152601c60248201527f5573657220616c72656164792067656e65726174656420636f646521000000006044820152606401610de5565b6125a43382613188565b5050565b6000546001600160a01b031633146125d25760405162461bcd60e51b8152600401610de590614803565b6001600160a01b0382166000818152600e6020526040808220805460ff191685151590811790915590519092917fc444ab4df75bf06253429e3bef0816d6ab100d5e10cc3daafce5f29d48b4d73091a35050565b6000546001600160a01b031633146126505760405162461bcd60e51b8152600401610de590614803565b6001600160a01b03821661269b5760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420526563697069656e742160701b6044820152606401610de5565b600081116126dd5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420416d6f756e742160881b6044820152606401610de5565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156120d5573d6000803e3d6000fd5b6000546001600160a01b0316331461273d5760405162461bcd60e51b8152600401610de590614803565b6001600160a01b0381166127a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610de5565b6127ab81613138565b50565b601160205260009081526040902080546127c790614a27565b80601f01602080910402602001604051908101604052809291908181526020018280546127f390614a27565b80156128405780601f1061281557610100808354040283529160200191612840565b820191906000526020600020905b81548152906001019060200180831161282357829003601f168201915b505050505081565b60006110a582846149c1565b60006110a582846148b3565b60006110a582846149e0565b6001600160a01b0381166000908152600f602052604090205460ff166128d45760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610de5565b60005b6010548110156125a457816001600160a01b03166010828154811061290c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415612a405760108054612937906001906149e0565b8154811061295557634e487b7160e01b600052603260045260246000fd5b600091825260209091200154601080546001600160a01b03909216918390811061298f57634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600c90915260409020546129cf90611090565b6001600160a01b0383166000908152600b6020908152604080832093909355600f905220805460ff191690556010805480612a1a57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80612a4a81614a62565b9150506128d7565b6001600160a01b038316612ab45760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610de5565b6001600160a01b038216612b155760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610de5565b6001600160a01b038381166000818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038083166000818152601660209081526040808320805460ff199081166001908117909255338552601584528285208054909116821790556013835281842080549688166001600160a01b031997881681179091558085526014845282852080548084018255908652848620018054909716909517909555928252600790522054612c0891612c55565b6001600160a01b038083166000818152600760205260408082209490945592519092918516917f4bc18aa4b0095c9a3b5cdf42d2322d5a145591b04045988a995a5da42607545791a35050565b60006110a5828461489b565b6000806000612c6e613230565b9092509050612c7d8282612854565b9250505090565b6001600160a01b038316612ce85760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610de5565b6001600160a01b038216612d4a5760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610de5565b60008111612db35760405162461bcd60e51b815260206004820152603060248201527f42455032303a205472616e7366657220616d6f756e74206d757374206265206760448201526f726561746572207468616e207a65726f60801b6064820152608401610de5565b6000546001600160a01b03848116911614801590612ddf57506000546001600160a01b03838116911614155b15612e4657601a54811115612e465760405162461bcd60e51b815260206004820152602760248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152661e105b5bdd5b9d60ca1b6064820152608401610de5565b601c54610100900460ff1615612e61576120d583838361344e565b612e696135be565b15612e7657612e7661361a565b6001600160a01b0383166000908152600e602052604090205460ff1680612eb557506001600160a01b0382166000908152600e602052604090205460ff165b15612eca57612ec583838361344e565b612fb8565b6018546001600160a01b0383811691161415612f17576001600160a01b03831660009081526015602052604090205460ff1615612f0c57612ec58383836138e0565b612ec5838383613beb565b6018546001600160a01b0384811691161415612fad576001600160a01b03821660009081526015602052604090205460ff168015612f6d57506001600160a01b03821660009081526016602052604090205460ff165b15612fa257612f7d838383613c99565b6001600160a01b0382166000908152601660205260409020805460ff19169055612fb8565b612ec5838383613fd2565b612fb883838361344e565b600454158015612fd557506018546001600160a01b038381169116145b156120d55743600455505050565b600081848411156130075760405162461bcd60e51b8152600401610de591906147b9565b505050900390565b6001600160a01b0381166000908152600f602052604090205460ff16156130785760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610de5565b6001600160a01b0381166000908152600b6020526040902054156130d2576001600160a01b0381166000908152600b60205260409020546130b8906114f0565b6001600160a01b0382166000908152600c60205260409020555b6001600160a01b03166000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319169091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b81601282604051613199919061478a565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039485161790559184166000908152601182529190912082516131e2928401906142fd565b50806040516131f1919061478a565b604051908190038120906001600160a01b038416907f314992e462ed086b71540d0bc426691ff1f210675f007748b118be3560abe3c790600090a35050565b6001546000908190816132456009600a614916565b6132549064cec0ecb0006149c1565b905060005b6010548110156133ee5782600b60006010848154811061328957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613302575081600c6000601084815481106132db57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613330576001546133166009600a614916565b6133259064cec0ecb0006149c1565b945094505050509091565b613384600b60006010848154811061335857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612860565b92506133da600c6000601084815481106133ae57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612860565b9150806133e681614a62565b915050613259565b506134166133fe6009600a614916565b61340d9064cec0ecb0006149c1565b60015490612854565b8210156134455760015461342c6009600a614916565b61343b9064cec0ecb0006149c1565b9350935050509091565b90939092509050565b600061345982611090565b6001600160a01b0385166000908152600b602052604090205490915061347f9082612860565b6001600160a01b038086166000908152600b602052604080822093909355908516815220546134ae9082612c55565b6001600160a01b038085166000908152600b60209081526040808320949094559187168152600f909152205460ff161561351f576001600160a01b0384166000908152600c60205260409020546135059083612860565b6001600160a01b0385166000908152600c60205260409020555b6001600160a01b0383166000908152600f602052604090205460ff161561357d576001600160a01b0383166000908152600c60205260409020546135639083612c55565b6001600160a01b0384166000908152600c60205260409020555b826001600160a01b0316846001600160a01b0316600080516020614af5833981519152846040516135b091815260200190565b60405180910390a350505050565b6018546000906001600160a01b031633148015906135de57506000600454115b80156135f25750601c54610100900460ff16155b80156136005750601c5460ff165b80156110c95750601b54613613306119b6565b1015905090565b601c805461ff001916610100179055601b546000613639826002612854565b905060006136478383612860565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061368f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156136e357600080fd5b505afa1580156136f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061371b919061445d565b8160018151811061373c57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260175447911663791ac947856000853061376d42601e612c55565b6040518663ffffffff1660e01b815260040161378d95949392919061485f565b600060405180830381600087803b1580156137a757600080fd5b505af11580156137bb573d6000803e3d6000fd5b5050505060006137d4824761286090919063ffffffff16565b6017549091506001600160a01b031663f305d71982308760008061dead6137fc42601e612c55565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b15801561386457600080fd5b505af1158015613878573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061389d9190614692565b505060405186915082907f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f838148690600090a35050601c805461ff001916905550505050565b60006138ea612c61565b905060006138f88383612848565b9050600061392b6103e86124648561245e6003600a9054906101000a900460ff1660ff168961284890919063ffffffff16565b9050600061395e6103e86124648661245e6003600c9054906101000a900460ff1660ff168a61284890919063ffffffff16565b905060006139916103e86124648761245e6003600b9054906101000a900460ff1660ff168b61284890919063ffffffff16565b905060006139ab826139a585818989612860565b90612860565b6001600160a01b038a166000908152600b60205260409020549091506139d19086612860565b6001600160a01b03808b166000908152600b602052604080822093909355908a1681522054613a009082612c55565b6001600160a01b0389166000908152600b6020526040808220929092553081522054613a2c9085612c55565b306000908152600b60209081526040808320939093556001600160a01b038c168252600f9052205460ff1615613a99576001600160a01b0389166000908152600c6020526040902054613a7f9088612860565b6001600160a01b038a166000908152600c60205260409020555b6001600160a01b0388166000908152600f602052604090205460ff1615613b0057613ae6613ac78288612854565b6001600160a01b038a166000908152600c602052604090205490612c55565b6001600160a01b0389166000908152600c60205260409020555b306000908152600f602052604090205460ff1615613b4c57613b3b613b258588612854565b306000908152600c602052604090205490612c55565b306000908152600c60205260409020555b6001600160a01b03808916908a16600080516020614af5833981519152613b73848a612854565b60405190815260200160405180910390a3306001600160a01b038a16600080516020614af5833981519152613ba8878a612854565b60405190815260200160405180910390a3613bcd89613bc78489612854565b8461407e565b613be083613bdb8189612854565b61414e565b505050505050505050565b6000613bf5612c61565b90506000613c038383612848565b90506000613c3560646124648561245e600360079054906101000a900460ff1660ff168961284890919063ffffffff16565b90506000613c6760646124648661245e600360099054906101000a900460ff1660ff168a61284890919063ffffffff16565b9050600061399160646124648761245e600360089054906101000a900460ff1660ff168b61284890919063ffffffff16565b6000613ca3612c61565b90506000613cb18383612848565b600354909150600090613ccf9060649061246490879060ff16612848565b90506000613cdd8285612848565b90506000613d0f60646124648761245e600360049054906101000a900460ff1660ff168b61284890919063ffffffff16565b90506000613d4160646124648861245e600360069054906101000a900460ff1660ff168c61284890919063ffffffff16565b90506000613d7360646124648961245e600360059054906101000a900460ff1660ff168d61284890919063ffffffff16565b90506000613d89826139a5858188818d8c612860565b6001600160a01b038c166000908152600b6020526040902054909150613daf9088612860565b6001600160a01b03808d166000908152600b602052604080822093909355908c1681522054613dde9082612c55565b6001600160a01b038b166000908152600b6020526040808220929092553081522054613e0a9085612c55565b306000908152600b60209081526040808320939093556001600160a01b038e168252600f9052205460ff1615613e77576001600160a01b038b166000908152600c6020526040902054613e5d908a612860565b6001600160a01b038c166000908152600c60205260409020555b6001600160a01b038a166000908152600f602052604090205460ff1615613ede57613ec4613ea5828a612854565b6001600160a01b038c166000908152600c602052604090205490612c55565b6001600160a01b038b166000908152600c60205260409020555b306000908152600f602052604090205460ff1615613f1457613f03613b25858a612854565b306000908152600c60205260409020555b6001600160a01b03808b16908c16600080516020614af5833981519152613f3b848c612854565b60405190815260200160405180910390a3306001600160a01b038c16600080516020614af5833981519152613f70878c612854565b60405190815260200160405180910390a36001600160a01b03808b16600090815260136020526040902054613fa9918d91168888614172565b613fb78b613bc7848b612854565b613fc583613bdb818b612854565b5050505050505050505050565b6000613fdc612c61565b90506000613fea8383612848565b9050600061401c60646124648561245e600360019054906101000a900460ff1660ff168961284890919063ffffffff16565b9050600061404c60646124648661245e60038054906101000a900460ff1660ff168a61284890919063ffffffff16565b9050600061399160646124648761245e600360029054906101000a900460ff1660ff168b61284890919063ffffffff16565b600a546001600160a01b03166000908152600b60205260409020546140a39082612c55565b600a80546001600160a01b039081166000908152600b602090815260408083209590955592549091168152600f909152205460ff161561411e57600a546001600160a01b03166000908152600c60205260409020546141029083612c55565b600a546001600160a01b03166000908152600c60205260409020555b600a546040518381526001600160a01b0391821691851690600080516020614af583398151915290602001612b6a565b60015461415b9083612860565b60015560025461416b9082612c55565b6002555050565b6019546001600160a01b03166000908152600b60205260409020546141979082612c55565b601980546001600160a01b039081166000908152600b602090815260408083209590955592549091168152600f909152205460ff1615614212576019546001600160a01b03166000908152600c60205260409020546141f69083612c55565b6019546001600160a01b03166000908152600c60205260409020555b6019546040518381526001600160a01b0391821691861690600080516020614af58339815191529060200160405180910390a3601954604051639ba8dfab60e01b81526001600160a01b0385811660048301526024820185905290911690639ba8dfab90604401600060405180830381600087803b15801561429357600080fd5b505af11580156142a7573d6000803e3d6000fd5b5050506001600160a01b0384166000908152600860205260409020546142ce915083612c55565b6001600160a01b0384166000908152600860205260409020556006546142f49083612c55565b60065550505050565b82805461430990614a27565b90600052602060002090601f01602090048101928261432b5760008555614371565b82601f1061434457805160ff1916838001178555614371565b82800160010185558215614371579182015b82811115614371578251825591602001919060010190614356565b5061437d929150614381565b5090565b5b8082111561437d5760008155600101614382565b600067ffffffffffffffff808411156143b1576143b1614a93565b604051601f8501601f19908116603f011681019082821181831017156143d9576143d9614a93565b816040528093508581528686860111156143f257600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261441c578081fd5b6110a583833560208501614396565b803560ff8116811461443c57600080fd5b919050565b600060208284031215614452578081fd5b81356110a581614aa9565b60006020828403121561446e578081fd5b81516110a581614aa9565b6000806040838503121561448b578081fd5b823561449681614aa9565b946020939093013593505050565b600080604083850312156144b6578182fd5b82356144c181614aa9565b915060208301356144d181614aa9565b809150509250929050565b6000806000606084860312156144f0578081fd5b83356144fb81614aa9565b9250602084013561450b81614aa9565b929592945050506040919091013590565b6000806040838503121561452e578182fd5b823561453981614aa9565b915060208301356144d181614abe565b6000806040838503121561455b578182fd5b823561456681614aa9565b9150602083013567ffffffffffffffff811115614581578182fd5b61458d8582860161440c565b9150509250929050565b6000806040838503121561448b578182fd5b6000602082840312156145ba578081fd5b81356110a581614abe565b6000602082840312156145d6578081fd5b81516110a581614abe565b6000602082840312156145f2578081fd5b813567ffffffffffffffff811115614608578182fd5b8201601f81018413614618578182fd5b61462784823560208401614396565b949350505050565b600060208284031215614640578081fd5b813567ffffffffffffffff811115614656578182fd5b6146278482850161440c565b600060208284031215614673578081fd5b5035919050565b60006020828403121561468b578081fd5b5051919050565b6000806000606084860312156146a6578081fd5b8351925060208401519150604084015190509250925092565b6000602082840312156146d0578081fd5b6110a58261442b565b6000806000606084860312156146ed578081fd5b6146f68461442b565b92506147046020850161442b565b91506147126040850161442b565b90509250925092565b6000815180845260208085019450808401835b838110156147535781516001600160a01b03168752958201959082019060010161472e565b509495945050505050565b600081518084526147768160208601602086016149f7565b601f01601f19169290920160200192915050565b6000825161479c8184602087016149f7565b9190910192915050565b6020815260006110a5602083018461471b565b6020815260006110a5602083018461475e565b6020808252601c908201527f4665652073686f756c64206265206c657373207468616e203130302100000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600d908201526c496e76616c696420636f64652160981b604082015260600190565b85815284602082015260a06040820152600061487e60a083018661471b565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156148ae576148ae614a7d565b500190565b6000826148ce57634e487b7160e01b81526012600452602481fd5b500490565b600181815b8085111561490e5781600019048211156148f4576148f4614a7d565b8085161561490157918102915b93841c93908002906148d8565b509250929050565b60006110a560ff84168360008261492f57506001610e3f565b8161493c57506000610e3f565b8160018114614952576002811461495c57614978565b6001915050610e3f565b60ff84111561496d5761496d614a7d565b50506001821b610e3f565b5060208310610133831016604e8410600b841016171561499b575081810a610e3f565b6149a583836148d3565b80600019048211156149b9576149b9614a7d565b029392505050565b60008160001904831182151516156149db576149db614a7d565b500290565b6000828210156149f2576149f2614a7d565b500390565b60005b83811015614a125781810151838201526020016149fa565b83811115614a21576000848401525b50505050565b600181811c90821680614a3b57607f821691505b60208210811415614a5c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614a7657614a76614a7d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146127ab57600080fd5b80151581146127ab57600080fdfe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef42455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122021c42ce6e7c704984da5c5cfb8aeea4ee9e4495ea2853a1a70563202d1ccceb964736f6c63430008040033

Deployed Bytecode Sourcemap

20920:32851:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28116:157;;;;;;;;;;-1:-1:-1;28116:157:0;;;;;:::i;:::-;;:::i;37773:94::-;;;;;;;;;;-1:-1:-1;37854:5:0;;;;;;;;;;;;-1:-1:-1;;;37854:5:0;;;;37773:94;;;;;;;:::i;:::-;;;;;;;;36597:163;;;;;;;;;;-1:-1:-1;36597:163:0;;;;;:::i;:::-;;:::i;:::-;;;9438:14:1;;9431:22;9413:41;;9401:2;9386:18;36597:163:0;9368:92:1;35783:629:0;;;;;;;;;;-1:-1:-1;35783:629:0;;;;;:::i;:::-;;:::i;38681:89::-;;;;;;;;;;-1:-1:-1;38752:10:0;;38681:89;;;21681:25:1;;;21669:2;21654:18;38681:89:0;21636:76:1;38778:161:0;;;;;;;;;;-1:-1:-1;38778:161:0;;;;;:::i;:::-;;:::i;38083:97::-;;;;;;;;;;;;;:::i;32636:800::-;;;;;;;;;;-1:-1:-1;32636:800:0;;;;;:::i;:::-;;:::i;36768:355::-;;;;;;;;;;-1:-1:-1;36768:355:0;;;;;:::i;:::-;;:::i;27945:163::-;;;;;;;;;;-1:-1:-1;27945:163:0;;;;;:::i;:::-;;:::i;21796:36::-;;;;;;;;;;-1:-1:-1;21796:36:0;;;;-1:-1:-1;;;21796:36:0;;;;;;;;;22476:4:1;22464:17;;;22446:36;;22434:2;22419:18;21796:36:0;22401:87:1;23412:37:0;;;;;;;;;;-1:-1:-1;23412:37:0;;;;-1:-1:-1;;;;;23412:37:0;;;;;;-1:-1:-1;;;;;7763:32:1;;;7745:51;;7733:2;7718:18;23412:37:0;7700:102:1;38947:253:0;;;;;;;;;;-1:-1:-1;38947:253:0;;;;;:::i;:::-;;:::i;37981:94::-;;;;;;;;;;-1:-1:-1;21139:1:0;37981:94;;28472:640;;;;;;;;;;-1:-1:-1;28472:640:0;;;;;:::i;:::-;;:::i;37131:220::-;;;;;;;;;;-1:-1:-1;37131:220:0;;;;;:::i;:::-;;:::i;23309:45::-;;;;;;;;;;-1:-1:-1;23309:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29811:657;;;;;;;;;;-1:-1:-1;29811:657:0;;;;;:::i;:::-;;:::i;23624:87::-;;;;;;;;;;;;;;;;33444:852;;;;;;;;;;-1:-1:-1;33444:852:0;;;;;:::i;:::-;;:::i;23753:40::-;;;;;;;;;;-1:-1:-1;23753:40:0;;;;;;;;21391:32;;;;;;;;;;-1:-1:-1;21391:32:0;;;;;;;;21584:45;;;;;;;;;;-1:-1:-1;21584:45:0;;;;;;;;;;;22122:53;;;;;;;;;;-1:-1:-1;22122:53:0;;;;-1:-1:-1;;;22122:53:0;;;;;;23456:24;;;;;;;;;;-1:-1:-1;23456:24:0;;;;-1:-1:-1;;;;;23456:24:0;;;22521:38;;;;;;;;;;-1:-1:-1;22521:38:0;;;;-1:-1:-1;;;;;22521:38:0;;;21636:45;;;;;;;;;;-1:-1:-1;21636:45:0;;;;;;;;;;;21473:34;;;;;;;;;;-1:-1:-1;21473:34:0;;;;;;;;;;;31319:176;;;;;;;;;;-1:-1:-1;31319:176:0;;;;;:::i;:::-;;:::i;38188:198::-;;;;;;;;;;-1:-1:-1;38188:198:0;;;;;:::i;:::-;;:::i;2446:94::-;;;;;;;;;;;;;:::i;22638:30::-;;;;;;;;;;-1:-1:-1;22638:30:0;;;;-1:-1:-1;;;;;22638:30:0;;;21432:34;;;;;;;;;;-1:-1:-1;21432:34:0;;;;;;;;;;;38547:126;;;;;;;;;;-1:-1:-1;38547:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;38645:20:0;38621:4;38645:20;;;:11;:20;;;;;;;;;38547:126;31931:341;;;;;;;;;;-1:-1:-1;31931:341:0;;;;;:::i;:::-;;:::i;30608:703::-;;;;;;;;;;-1:-1:-1;30608:703:0;;;;;:::i;:::-;;:::i;21688:51::-;;;;;;;;;;-1:-1:-1;21688:51:0;;;;;;;;;;;23361:42;;;;;;;;;;-1:-1:-1;23361:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22038:47;;;;;;;;;;-1:-1:-1;22038:47:0;;;;-1:-1:-1;;;22038:47:0;;;;;;23144:49;;;;;;;;;;-1:-1:-1;23144:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23144:49:0;;;23541:54;;;;;;;;;;;;;;;;21952:47;;;;;;;;;;-1:-1:-1;21952:47:0;;;;-1:-1:-1;;;21952:47:0;;;;;;21514:40;;;;;;;;;;-1:-1:-1;21514:40:0;;;;;;;;;;;1795:87;;;;;;;;;;-1:-1:-1;1841:7:0;1868:6;-1:-1:-1;;;;;1868:6:0;1795:87;;37875:98;;;;;;;;;;-1:-1:-1;37958:7:0;;;;;;;;;;;;-1:-1:-1;;;37958:7:0;;;;37875:98;;23200:46;;;;;;;;;;-1:-1:-1;23200:46:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;23200:46:0;;;34304:309;;;;;;;;;;-1:-1:-1;34304:309:0;;;;;:::i;:::-;;:::i;39575:130::-;;;;;;;;;;-1:-1:-1;39575:130:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37359:311::-;;;;;;;;;;-1:-1:-1;37359:311:0;;;;;:::i;:::-;;:::i;29120:683::-;;;;;;;;;;-1:-1:-1;29120:683:0;;;;;:::i;:::-;;:::i;27430:400::-;;;;;;;;;;-1:-1:-1;27430:400:0;;;;;:::i;:::-;;:::i;36420:169::-;;;;;;;;;;-1:-1:-1;36420:169:0;;;;;:::i;:::-;;:::i;31503:420::-;;;;;;;;;;-1:-1:-1;31503:420:0;;;;;:::i;:::-;;:::i;23489:43::-;;;;;;;;;;-1:-1:-1;23489:43:0;;;;-1:-1:-1;;;;;23489:43:0;;;22237:25;;;;;;;;;;;;;;;;34809:492;;;;;;;;;;-1:-1:-1;34809:492:0;;;;;:::i;:::-;;:::i;32280:348::-;;;;;;;;;;-1:-1:-1;32280:348:0;;;;;:::i;:::-;;:::i;23253:49::-;;;;;;;;;;-1:-1:-1;23253:49:0;;;;;:::i;:::-;;:::i;21881:41::-;;;;;;;;;;-1:-1:-1;21881:41:0;;;;-1:-1:-1;;;21881:41:0;;;;;;34621:180;;;;;;;;;;-1:-1:-1;34621:180:0;;;;;:::i;:::-;;:::i;21839:35::-;;;;;;;;;;-1:-1:-1;21839:35:0;;;;-1:-1:-1;;;21839:35:0;;;;;;38394:145;;;;;;;;;;-1:-1:-1;38394:145:0;;;;;:::i;:::-;-1:-1:-1;;;;;38504:18:0;;;38477:7;38504:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;38394:145;35309:371;;;;;;;;;;-1:-1:-1;35309:371:0;;;;;:::i;:::-;;:::i;39860:138::-;;;;;;;;;;-1:-1:-1;39860:138:0;;;;;:::i;:::-;-1:-1:-1;;;;;39963:27:0;39936:7;39963:27;;;:18;:27;;;;;;;39860:138;39713:139;;;;;;;;;;-1:-1:-1;39713:139:0;;;;;:::i;:::-;-1:-1:-1;;;;;39818:26:0;39791:7;39818:26;;;:17;:26;;;;;;;39713:139;28281:183;;;;;;;;;;-1:-1:-1;28281:183:0;;;;;:::i;:::-;;:::i;26957:247::-;;;;;;;;;;-1:-1:-1;26957:247:0;;;;;:::i;:::-;;:::i;2695:192::-;;;;;;;;;;-1:-1:-1;2695:192:0;;;;;:::i;:::-;;:::i;23088:49::-;;;;;;;;;;-1:-1:-1;23088:49:0;;;;;:::i;:::-;;:::i;39323:116::-;;;;;;;;;;-1:-1:-1;39418:13:0;;39323:116;;39447:120;;;;;;;;;;-1:-1:-1;39540:19:0;;39447:120;;28116:157;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;;;;;;;;;28192:29:::1;28213:7;28192:20;:29::i;:::-;28237:28;::::0;-1:-1:-1;;;;;28237:28:0;::::1;::::0;::::1;::::0;;;::::1;28116:157:::0;:::o;36597:163::-;36674:4;36691:39;751:10;36714:7;36723:6;36691:8;:39::i;:::-;-1:-1:-1;36748:4:0;36597:163;;;;;:::o;35783:629::-;35902:15;;35875:7;;35894:45;;;;-1:-1:-1;;;35894:45:0;;;;;;;:::i;:::-;35973:10;35959:25;;;;:13;:25;;;;;;;;35958:26;35950:59;;;;-1:-1:-1;;;35950:59:0;;16173:2:1;35950:59:0;;;16155:21:1;16212:2;16192:18;;;16185:30;-1:-1:-1;;;16231:18:1;;;16224:50;16291:18;;35950:59:0;16145:170:1;35950:59:0;36066:1;-1:-1:-1;;;;;36028:40:0;:16;36045:8;36028:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;36028:26:0;:40;;36020:67;;;;-1:-1:-1;;;36020:67:0;;15830:2:1;36020:67:0;;;15812:21:1;15869:2;15849:18;;;15842:30;-1:-1:-1;;;15888:18:1;;;15881:44;15942:18;;36020:67:0;15802:164:1;36020:67:0;36136:10;-1:-1:-1;;;;;36106:40:0;:16;36123:8;36106:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;36106:26:0;:40;;36098:80;;;;-1:-1:-1;;;36098:80:0;;18403:2:1;36098:80:0;;;18385:21:1;18442:2;18422:18;;;18415:30;18481:29;18461:18;;;18454:57;18528:18;;36098:80:0;18375:177:1;36098:80:0;36240:10;-1:-1:-1;;;;;36197:53:0;:11;:39;36209:16;36226:8;36209:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36209:26:0;;;36197:39;;;;;;;;;;;-1:-1:-1;36197:39:0;;;:53;;36189:98;;;;-1:-1:-1;;;36189:98:0;;13708:2:1;36189:98:0;;;13690:21:1;;;13727:18;;;13720:30;13786:34;13766:18;;;13759:62;13838:18;;36189:98:0;13680:182:1;36189:98:0;36300:57;36318:10;36330:16;36347:8;36330:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;36330:26:0;36300:17;:57::i;:::-;36384:13;;:20;;36402:1;36384:17;:20::i;:::-;36368:13;:36;-1:-1:-1;;35783:629:0:o;38778:161::-;38845:7;38865:15;38883:23;38895:10;:8;:10::i;:::-;38883:7;;:11;:23::i;:::-;38865:41;38778:161;-1:-1:-1;;;38778:161:0:o;38083:97::-;38138:7;21252:14;21139:1;21252:2;:14;:::i;:::-;21234:33;;:13;:33;:::i;:::-;38158:14;;38083:97;:::o;32636:800::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32729:26:0;::::1;32721:66;;;::::0;-1:-1:-1;;;32721:66:0;;14419:2:1;32721:66:0::1;::::0;::::1;14401:21:1::0;14458:2;14438:18;;;14431:30;14497:29;14477:18;;;14470:57;14544:18;;32721:66:0::1;14391:177:1::0;32721:66:0::1;32814:11;::::0;-1:-1:-1;;;;;32806:36:0;;::::1;32814:11:::0;::::1;32806:36;;32798:83;;;::::0;-1:-1:-1;;;32798:83:0;;11332:2:1;32798:83:0::1;::::0;::::1;11314:21:1::0;11371:2;11351:18;;;11344:30;11410:34;11390:18;;;11383:62;-1:-1:-1;;;11461:18:1;;;11454:32;11503:19;;32798:83:0::1;11304:224:1::0;32798:83:0::1;32912:4;32943:1;32892:26:::0;;;:11:::1;:26;::::0;;;;;;;32927:11:::1;::::0;;-1:-1:-1;;;;;32927:11:0;;::::1;32892:48:::0;;;;;;;;:52;;;32997:17:::1;::::0;;::::1;32977:39:::0;;;;;;;;33025:11;;;::::1;32977:61:::0;;;;;;;:65;;;;33075:46;;-1:-1:-1;;;;;;33075:46:0::1;::::0;;::::1;::::0;;::::1;::::0;;;33162:21;;-1:-1:-1;;;33162:21:0;;;;:19:::1;::::0;:21:::1;::::0;;::::1;::::0;32892:26;33162:21;;;;;;33075:46;33162:21;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33144:51:0::1;;33204:4;33211:11;;;;;;;;;-1:-1:-1::0;;;;;33211:11:0::1;-1:-1:-1::0;;;;;33211:16:0::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33144:86;::::0;-1:-1:-1;;;;;;33144:86:0::1;::::0;;;;;;-1:-1:-1;;;;;8037:15:1;;;33144:86:0::1;::::0;::::1;8019:34:1::0;8089:15;;8069:18;;;8062:43;7954:18;;33144:86:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33132:9;:98:::0;;-1:-1:-1;;;;;;33132:98:0::1;-1:-1:-1::0;;;;;33132:98:0;;::::1;;::::0;;33261:4:::1;-1:-1:-1::0;33241:26:0;;;:11:::1;:26;::::0;;;;;;;33276:11:::1;::::0;;;::::1;33241:48:::0;;;;;;;;-1:-1:-1;;33241:55:0;;;;33327:17:::1;::::0;;::::1;33307:39:::0;;;;;;;;33355:11;;;::::1;33307:61:::0;;;;;;;;:68;;;;33391:37;;;::::1;::::0;::::1;::::0;-1:-1:-1;33391:37:0::1;32636:800:::0;:::o;36768:355::-;36868:4;36885:36;36895:6;36903:9;36914:6;36885:9;:36::i;:::-;36932:161;36955:6;751:10;37003:89;37041:6;37003:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37003:19:0;;;;;;:11;:19;;;;;;;;751:10;37003:33;;;;;;;;;;:37;:89::i;:::-;36932:8;:161::i;:::-;-1:-1:-1;37111:4:0;36768:355;;;;;:::o;27945:163::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;28023:31:::1;28046:7;28023:22;:31::i;:::-;28070:30;::::0;-1:-1:-1;;;;;28070:30:0;::::1;::::0;::::1;::::0;;;::::1;27945:163:::0;:::o;38947:253::-;39014:7;39053;;39042;:18;;39034:73;;;;-1:-1:-1;;;39034:73:0;;12890:2:1;39034:73:0;;;12872:21:1;12929:2;12909:18;;;12902:30;12968:34;12948:18;;;12941:62;-1:-1:-1;;;13019:18:1;;;13012:40;13069:19;;39034:73:0;12862:232:1;39034:73:0;39118:19;39140:10;:8;:10::i;:::-;39118:32;-1:-1:-1;39168:24:0;:7;39118:32;39168:11;:24::i;28472:640::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;28647:3:::1;28626:18;:24;;;28618:65;;;;-1:-1:-1::0;;;28618:65:0::1;;;;;;;:::i;:::-;28723:3;28702:18;:24;;;28694:65;;;;-1:-1:-1::0;;;28694:65:0::1;;;;;;;:::i;:::-;28805:3;28778:24;:30;;;28770:71;;;;-1:-1:-1::0;;;28770:71:0::1;;;;;;;:::i;:::-;28852:17;:38:::0;;::::1;28950:50:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;28901:38:0;;::::1;::::0;;::::1;-1:-1:-1::0;;28852:38:0;;::::1;;::::0;::::1;28901::::0;;;;-1:-1:-1;;28901:38:0;;;;;;;;;;::::1;28950:50;;::::0;;;29016:88:::1;::::0;::::1;::::0;-1:-1:-1;;29016:88:0::1;28472:640:::0;;;:::o;37131:220::-;751:10;37221:4;37270:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;37270:34:0;;;;;;;;;;37221:4;;37238:83;;37261:7;;37270:50;;37309:10;37270:38;:50::i;29811:657::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;29991:3:::1;29969:19;:25;;;29961:66;;;;-1:-1:-1::0;;;29961:66:0::1;;;;;;;:::i;:::-;30068:3;30046:19;:25;;;30038:66;;;;-1:-1:-1::0;;;30038:66:0::1;;;;;;;:::i;:::-;30151:3;30123:25;:31;;;30115:72;;;;-1:-1:-1::0;;;30115:72:0::1;;;;;;;:::i;:::-;30198:18;:40:::0;;::::1;30300:52:::0;;::::1;-1:-1:-1::0;;;30300:52:0;::::1;-1:-1:-1::0;;30249:40:0;;::::1;-1:-1:-1::0;;;30249:40:0;::::1;-1:-1:-1::0;;30198:40:0;;::::1;-1:-1:-1::0;;;30198:40:0;::::1;30249::::0;;;;-1:-1:-1;;30249:40:0;;;;;;;;;;::::1;30300:52;;::::0;;;30368:92:::1;::::0;::::1;::::0;-1:-1:-1;;30368:92:0::1;29811:657:::0;;;:::o;33444:852::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;33551:17:::1;::::0;-1:-1:-1;;;;;33543:48:0;;::::1;33551:17:::0;::::1;33543:48;;33535:95;;;::::0;-1:-1:-1;;;33535:95:0;;12140:2:1;33535:95:0::1;::::0;::::1;12122:21:1::0;12179:2;12159:18;;;12152:30;12218:34;12198:18;;;12191:62;-1:-1:-1;;;12269:18:1;;;12262:32;12311:19;;33535:95:0::1;12112:224:1::0;33535:95:0::1;33668:17;::::0;;-1:-1:-1;;;;;33668:17:0;;::::1;33690:5;33641:46:::0;;;:18:::1;:46;::::0;;;;;;;:54;;-1:-1:-1;;33641:54:0;;::::1;::::0;;;33726:4:::1;33706:26:::0;;:11:::1;:26:::0;;;;;;33741:17;;;::::1;33706:54:::0;;;;;;;;:58;;;33817:17;;;::::1;33797:39:::0;;;;;;;;33845:11:::1;::::0;;;::::1;33797:61:::0;;;;;;;;:65;;;33895:58;;-1:-1:-1;;;;;;33895:58:0::1;::::0;;::::1;::::0;;::::1;::::0;;33964:54;;;;;;;;-1:-1:-1;;33964:61:0;;;;34056:17;;;::::1;34036:39:::0;;;;;;;;34084:11;;;::::1;34036:61:::0;;;;;;;:68;34142:17;;;::::1;34115:46:::0;;;;;;;;;:53;;;;::::1;-1:-1:-1::0;34115:53:0::1;::::0;;34210:17;;34179:50:::1;::::0;34210:17:::1;34179:22;:50::i;:::-;34245:43;::::0;-1:-1:-1;;;;;34245:43:0;::::1;::::0;::::1;::::0;;;::::1;33444:852:::0;:::o;31319:176::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;31402:14:::1;:32:::0;;-1:-1:-1;;31402:32:0::1;;::::0;::::1;::::0;;::::1;::::0;;;31450:37:::1;::::0;::::1;::::0;-1:-1:-1;;31450:37:0::1;31319:176:::0;:::o;38188:198::-;-1:-1:-1;;;;;38278:20:0;;38254:7;38278:20;;;:11;:20;;;;;;;;38274:49;;;-1:-1:-1;;;;;;38307:16:0;;;;;:7;:16;;;;;;;38188:198::o;38274:49::-;-1:-1:-1;;;;;38361:16:0;;;;;;:7;:16;;;;;;38341:37;;:19;:37::i;2446:94::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;2511:21:::1;2529:1;2511:9;:21::i;:::-;2446:94::o:0;31931:341::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32039:38:0;::::1;32031:104;;;::::0;-1:-1:-1;;;32031:104:0;;19814:2:1;32031:104:0::1;::::0;::::1;19796:21:1::0;19853:2;19833:18;;;19826:30;19892:34;19872:18;;;19865:62;-1:-1:-1;;;19943:18:1;;;19936:51;20004:19;;32031:104:0::1;19786:243:1::0;32031:104:0::1;32146:23;:50:::0;;-1:-1:-1;;;;;;32146:50:0::1;-1:-1:-1::0;;;;;32146:50:0;::::1;::::0;;::::1;::::0;;;32212:52:::1;::::0;::::1;::::0;-1:-1:-1;;32212:52:0::1;31931:341:::0;:::o;30608:703::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;30793:4:::1;30771:19;:26;;;30763:67;;;;-1:-1:-1::0;;;30763:67:0::1;;;;;;;:::i;:::-;30871:4;30849:19;:26;;;30841:67;;;;-1:-1:-1::0;;;30841:67:0::1;;;;;;;:::i;:::-;30955:4;30927:25;:32;;;30919:73;;;;-1:-1:-1::0;;;30919:73:0::1;;;;;;;:::i;:::-;31003:29;:51:::0;;::::1;31127:63:::0;;::::1;-1:-1:-1::0;;;31127:63:0;::::1;-1:-1:-1::0;;;;31065:51:0;;::::1;-1:-1:-1::0;;;31065:51:0;::::1;-1:-1:-1::0;;;;31003:51:0;;::::1;-1:-1:-1::0;;;31003:51:0;::::1;31065::::0;;;;-1:-1:-1;;;;31065:51:0;;;;;;;;;;::::1;31127:63;;::::0;;;31206:97:::1;::::0;::::1;::::0;-1:-1:-1;;31206:97:0::1;30608:703:::0;;;:::o;34304:309::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;34408:21:::1;::::0;::::1;;:47;;::::0;::::1;;;;34400:81;;;::::0;-1:-1:-1;;;34400:81:0;;14069:2:1;34400:81:0::1;::::0;::::1;14051:21:1::0;14108:2;14088:18;;;14081:30;-1:-1:-1;;;14127:18:1;;;14120:51;14188:18;;34400:81:0::1;14041:171:1::0;34400:81:0::1;34492:21;:46:::0;;-1:-1:-1;;34492:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;34554:51:::1;::::0;::::1;::::0;-1:-1:-1;;34554:51:0::1;34304:309:::0;:::o;39575:130::-;-1:-1:-1;;;;;39676:21:0;;;;;;:12;:21;;;;;;;;;39669:28;;;;;;;;;;;;;;;;;39640:16;;39669:28;;;39676:21;39669:28;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39669:28:0;;;;;;;;;;;;;;;;;;;;;;;39575:130;;;:::o;37359:311::-;37454:4;37471:169;751:10;37521:7;37543:96;37582:15;37543:96;;;;;;;;;;;;;;;;;751:10;37543:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;37543:34:0;;;;;;;;;;;;:38;:96::i;29120:683::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;29300:3:::1;29279:18;:24;;;29271:65;;;;-1:-1:-1::0;;;29271:65:0::1;;;;;;;:::i;:::-;29376:3;29355:18;:24;;;29347:65;;;;-1:-1:-1::0;;;29347:65:0::1;;;;;;;:::i;:::-;29458:3;29431:24;:30;;;29423:71;;;;-1:-1:-1::0;;;29423:71:0::1;;;;;;;:::i;:::-;29505:28;:49:::0;;::::1;29625:61:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;29565:49:0;;::::1;::::0;;::::1;-1:-1:-1::0;;29505:49:0;;::::1;::::0;;::::1;29565::::0;;;;-1:-1:-1;;29565:49:0;;;;;;;;;;::::1;29625:61;;::::0;;;29702:93:::1;::::0;::::1;::::0;-1:-1:-1;;29702:93:0::1;29120:683:::0;;;:::o;27430:400::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27526:19:0;::::1;27518:46;;;::::0;-1:-1:-1;;;27518:46:0;;20236:2:1;27518:46:0::1;::::0;::::1;20218:21:1::0;20275:2;20255:18;;;20248:30;-1:-1:-1;;;20294:18:1;;;20287:44;20348:18;;27518:46:0::1;20208:164:1::0;27518:46:0::1;-1:-1:-1::0;;;;;27583:23:0;::::1;27575:54;;;::::0;-1:-1:-1;;;27575:54:0;;21390:2:1;27575:54:0::1;::::0;::::1;21372:21:1::0;21429:2;21409:18;;;21402:30;-1:-1:-1;;;21448:18:1;;;21441:48;21506:18;;27575:54:0::1;21362:168:1::0;27575:54:0::1;27660:38;::::0;-1:-1:-1;;;27660:38:0;;27692:4:::1;27660:38;::::0;::::1;7745:51:1::0;27642:15:0::1;::::0;-1:-1:-1;;;;;27660:23:0;::::1;::::0;::::1;::::0;7718:18:1;;27660:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27642:56:::0;-1:-1:-1;27713:11:0;;27709:114:::1;;27749:42;::::0;-1:-1:-1;;;27749:42:0;;-1:-1:-1;;;;;8308:32:1;;;27749:42:0::1;::::0;::::1;8290:51:1::0;8357:18;;;8350:34;;;27749:22:0;::::1;::::0;::::1;::::0;8263:18:1;;27749:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27741:70;;;::::0;-1:-1:-1;;;27741:70:0;;19470:2:1;27741:70:0::1;::::0;::::1;19452:21:1::0;19509:2;19489:18;;;19482:30;-1:-1:-1;;;19528:18:1;;;19521:45;19583:18;;27741:70:0::1;19442:165:1::0;27741:70:0::1;2086:1;27430:400:::0;;:::o;36420:169::-;36500:4;36517:42;751:10;36541:9;36552:6;36517:9;:42::i;31503:420::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31598:30:0;::::1;31590:68;;;::::0;-1:-1:-1;;;31590:68:0;;19116:2:1;31590:68:0::1;::::0;::::1;19098:21:1::0;19155:2;19135:18;;;19128:30;19194:27;19174:18;;;19167:55;19239:18;;31590:68:0::1;19088:175:1::0;31590:68:0::1;31688:15;::::0;;-1:-1:-1;;;;;31688:15:0;;::::1;31707:5;31669:35:::0;;;:18:::1;:35;::::0;;;;;:43;;-1:-1:-1;;31669:43:0;;::::1;::::0;;;31723:34;;-1:-1:-1;;;;;;31723:34:0::1;::::0;;::::1;::::0;;::::1;::::0;;31768:35;;;;:42;;;;::::1;-1:-1:-1::0;31768:42:0::1;::::0;;31844:15;;31821:39:::1;::::0;31844:15:::1;31821:22;:39::i;:::-;31876;::::0;-1:-1:-1;;;;;31876:39:0;::::1;::::0;::::1;::::0;;;::::1;31503:420:::0;:::o;34809:492::-;34918:23;;-1:-1:-1;;;;;34918:23:0;34904:10;:37;;:62;;-1:-1:-1;1841:7:0;1868:6;-1:-1:-1;;;;;1868:6:0;34945:10;:21;34904:62;34896:89;;;;-1:-1:-1;;;34896:89:0;;15487:2:1;34896:89:0;;;15469:21:1;15526:2;15506:18;;;15499:30;-1:-1:-1;;;15545:18:1;;;15538:44;15599:18;;34896:89:0;15459:164:1;34896:89:0;35049:12;;35025:4;;35041:42;;;;-1:-1:-1;;;35041:42:0;;;;;;;:::i;:::-;35137:1;-1:-1:-1;;;;;35102:37:0;:16;35119:5;35102:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;35102:23:0;:37;35094:68;;;;-1:-1:-1;;;35094:68:0;;12543:2:1;35094:68:0;;;12525:21:1;12582:2;12562:18;;;12555:30;-1:-1:-1;;;12601:18:1;;;12594:48;12659:18;;35094:68:0;12515:168:1;35094:68:0;-1:-1:-1;;;;;35181:25:0;;;;;;:16;:25;;;;;:32;;;;;:::i;:::-;:37;;-1:-1:-1;35173:78:0;;;;-1:-1:-1;;;35173:78:0;;18759:2:1;35173:78:0;;;18741:21:1;18798:2;18778:18;;;18771:30;18837;18817:18;;;18810:58;18885:18;;35173:78:0;18731:178:1;35173:78:0;35264:29;35278:7;35287:5;35264:13;:29::i;32280:348::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;32501:15:::1;21139:1;32501:2;:15;:::i;:::-;32457:60;::::0;:40;:60:::1;:::i;:::-;32415:39;:102:::0;32533:87:::1;::::0;32579:40;;32533:87:::1;::::0;;;::::1;32280:348:::0;:::o;23253:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23253:49:0;;-1:-1:-1;23253:49:0;;-1:-1:-1;23253:49:0:o;34621:180::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;34712:36:::1;34742:5;34712:25;34724:12:::0;21252:14:::1;21139:1;21252:2;:14;:::i;:::-;21234:33;::::0;:13:::1;:33;:::i;:::-;34712:11:::0;::::1;:25::i;:::-;:29:::0;::::1;:36::i;:::-;34698:11;:50:::0;34764:29:::1;::::0;34780:12;;34764:29:::1;::::0;;;::::1;34621:180:::0;:::o;35309:371::-;35422:12;;35398:4;;35414:42;;;;-1:-1:-1;;;35414:42:0;;;;;;;:::i;:::-;35510:1;-1:-1:-1;;;;;35475:37:0;:16;35492:5;35475:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;35475:23:0;:37;35467:68;;;;-1:-1:-1;;;35467:68:0;;12543:2:1;35467:68:0;;;12525:21:1;12582:2;12562:18;;;12555:30;-1:-1:-1;;;12601:18:1;;;12594:48;12659:18;;35467:68:0;12515:168:1;35467:68:0;35571:10;35554:28;;;;:16;:28;;;;;:35;;;;;:::i;:::-;:40;;-1:-1:-1;35546:81:0;;;;-1:-1:-1;;;35546:81:0;;18759:2:1;35546:81:0;;;18741:21:1;18798:2;18778:18;;;18771:30;18837;18817:18;;;18810:58;18885:18;;35546:81:0;18731:178:1;35546:81:0;35640:32;35654:10;35666:5;35640:13;:32::i;:::-;35309:371;;:::o;28281:183::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53137:27:0;;;;;;:18;:27;;;;;;:34;;-1:-1:-1;;53137:34:0;;;;;;;;;;28421:35;;53137:34;;:27;28421:35:::1;::::0;::::1;28281:183:::0;;:::o;26957:247::-;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27064:23:0;::::1;27056:54;;;::::0;-1:-1:-1;;;27056:54:0;;21390:2:1;27056:54:0::1;::::0;::::1;21372:21:1::0;21429:2;21409:18;;;21402:30;-1:-1:-1;;;21448:18:1;;;21441:48;21506:18;;27056:54:0::1;21362:168:1::0;27056:54:0::1;27138:1;27129:6;:10;27121:38;;;::::0;-1:-1:-1;;;27121:38:0;;10582:2:1;27121:38:0::1;::::0;::::1;10564:21:1::0;10621:2;10601:18;;;10594:30;-1:-1:-1;;;10640:18:1;;;10633:45;10695:18;;27121:38:0::1;10554:165:1::0;27121:38:0::1;27170:26;::::0;-1:-1:-1;;;;;27170:18:0;::::1;::::0;:26;::::1;;;::::0;27189:6;;27170:26:::1;::::0;;;27189:6;27170:18;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;2695:192:::0;1841:7;1868:6;-1:-1:-1;;;;;1868:6:0;751:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2784:22:0;::::1;2776:73;;;::::0;-1:-1:-1;;;2776:73:0;;13301:2:1;2776:73:0::1;::::0;::::1;13283:21:1::0;13340:2;13320:18;;;13313:30;13379:34;13359:18;;;13352:62;-1:-1:-1;;;13430:18:1;;;13423:36;13476:19;;2776:73:0::1;13273:228:1::0;2776:73:0::1;2860:19;2870:8;2860:9;:19::i;:::-;2695:192:::0;:::o;23088:49::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6514:98::-;6572:7;6599:5;6603:1;6599;:5;:::i;6913:98::-;6971:7;6998:5;7002:1;6998;:5;:::i;6157:98::-;6215:7;6242:5;6246:1;6242;:5;:::i;52544:507::-;-1:-1:-1;;;;;52618:20:0;;;;;;:11;:20;;;;;;;;52610:60;;;;-1:-1:-1;;;52610:60:0;;15131:2:1;52610:60:0;;;15113:21:1;15170:2;15150:18;;;15143:30;15209:29;15189:18;;;15182:57;15256:18;;52610:60:0;15103:177:1;52610:60:0;52686:9;52681:363;52705:9;:16;52701:20;;52681:363;;;52763:7;-1:-1:-1;;;;;52747:23:0;:9;52757:1;52747:12;;;;;;-1:-1:-1;;;52747:12:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52747:12:0;:23;52743:290;;;52806:9;52816:16;;:20;;52835:1;;52816:20;:::i;:::-;52806:31;;;;;;-1:-1:-1;;;52806:31:0;;;;;;;;;;;;;;;;;;;52791:9;:12;;-1:-1:-1;;;;;52806:31:0;;;;52801:1;;52791:12;;;;-1:-1:-1;;;52791:12:0;;;;;;;;;;;;;;;;;;;;;:46;;-1:-1:-1;;;;;;52791:46:0;-1:-1:-1;;;;;52791:46:0;;;;;;52895:16;;;;;:7;:16;;;;;;;52875:37;;:19;:37::i;:::-;-1:-1:-1;;;;;52856:16:0;;;;;;:7;:16;;;;;;;;:56;;;;52931:11;:20;;;:28;;-1:-1:-1;;52931:28:0;;;52978:9;:15;;;;;-1:-1:-1;;;52978:15:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;52978:15:0;;;;;-1:-1:-1;;;;;;52978:15:0;;;;;;35309:371;;:::o;52743:290::-;52723:3;;;;:::i;:::-;;;;52681:363;;40889:337;-1:-1:-1;;;;;40982:19:0;;40974:68;;;;-1:-1:-1;;;40974:68:0;;11735:2:1;40974:68:0;;;11717:21:1;11774:2;11754:18;;;11747:30;11813:34;11793:18;;;11786:62;-1:-1:-1;;;11864:18:1;;;11857:34;11908:19;;40974:68:0;11707:226:1;40974:68:0;-1:-1:-1;;;;;41061:21:0;;41053:68;;;;-1:-1:-1;;;41053:68:0;;20987:2:1;41053:68:0;;;20969:21:1;21026:2;21006:18;;;20999:30;21065:34;21045:18;;;21038:62;-1:-1:-1;;;21116:18:1;;;21109:32;21158:19;;41053:68:0;20959:224:1;41053:68:0;-1:-1:-1;;;;;41134:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;41186:32;;21681:25:1;;;41186:32:0;;21654:18:1;41186:32:0;;;;;;;;40889:337;;;:::o;53187:369::-;-1:-1:-1;;;;;53267:19:0;;;;;;;:10;:19;;;;;;;;:26;;-1:-1:-1;;53267:26:0;;;53289:4;53267:26;;;;;;53318:10;53304:25;;:13;:25;;;;;:32;;;;;;;;;53347:11;:23;;;;;:33;;;;;-1:-1:-1;;;;;;53347:33:0;;;;;;;;53391:21;;;:12;:21;;;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;53466:26;;;:17;:26;;;;:33;;:30;:33::i;:::-;-1:-1:-1;;;;;53437:26:0;;;;;;;:17;:26;;;;;;:62;;;;53515:33;;53437:26;;53515:33;;;;;;;53187:369;;:::o;5776:98::-;5834:7;5861:5;5865:1;5861;:5;:::i;40104:164::-;40146:7;40167:15;40184;40203:19;:17;:19::i;:::-;40166:56;;-1:-1:-1;40166:56:0;-1:-1:-1;40240:20:0;40166:56;;40240:11;:20::i;:::-;40233:27;;;;40104:164;:::o;41234:1638::-;-1:-1:-1;;;;;41331:20:0;;41323:70;;;;-1:-1:-1;;;41323:70:0;;10926:2:1;41323:70:0;;;10908:21:1;10965:2;10945:18;;;10938:30;11004:34;10984:18;;;10977:62;-1:-1:-1;;;11055:18:1;;;11048:35;11100:19;;41323:70:0;10898:227:1;41323:70:0;-1:-1:-1;;;;;41412:23:0;;41404:71;;;;-1:-1:-1;;;41404:71:0;;17999:2:1;41404:71:0;;;17981:21:1;18038:2;18018:18;;;18011:30;18077:34;18057:18;;;18050:62;-1:-1:-1;;;18128:18:1;;;18121:33;18171:19;;41404:71:0;17971:225:1;41404:71:0;41503:1;41494:6;:10;41486:71;;;;-1:-1:-1;;;41486:71:0;;17240:2:1;41486:71:0;;;17222:21:1;17279:2;17259:18;;;17252:30;17318:34;17298:18;;;17291:62;-1:-1:-1;;;17369:18:1;;;17362:46;17425:19;;41486:71:0;17212:238:1;41486:71:0;1841:7;1868:6;-1:-1:-1;;;;;41573:17:0;;;1868:6;;41573:17;;;;:41;;-1:-1:-1;1841:7:0;1868:6;-1:-1:-1;;;;;41594:20:0;;;1868:6;;41594:20;;41573:41;41570:132;;;41647:11;;41637:6;:21;;41629:73;;;;-1:-1:-1;;;41629:73:0;;20579:2:1;41629:73:0;;;20561:21:1;20618:2;20598:18;;;20591:30;20657:34;20637:18;;;20630:62;-1:-1:-1;;;20708:18:1;;;20701:37;20755:19;;41629:73:0;20551:229:1;41629:73:0;41719:7;;;;;;;41715:102;;;41743:41;41758:6;41766:9;41777:6;41743:14;:41::i;41715:102::-;41833:17;:15;:17::i;:::-;41829:60;;;41865:24;:22;:24::i;:::-;-1:-1:-1;;;;;41906:26:0;;;;;;:18;:26;;;;;;;;;:59;;-1:-1:-1;;;;;;41936:29:0;;;;;;:18;:29;;;;;;;;41906:59;41902:852;;;41982:41;41997:6;42005:9;42016:6;41982:14;:41::i;:::-;41902:852;;;42073:9;;-1:-1:-1;;;;;42060:22:0;;;42073:9;;42060:22;42056:687;;;-1:-1:-1;;;;;42107:21:0;;;;;;:13;:21;;;;;;;;42103:200;;;42153:43;42170:6;42178:9;42189:6;42153:16;:43::i;42103:200::-;42245:38;42257:6;42265:9;42276:6;42245:11;:38::i;42056:687::-;42338:9;;-1:-1:-1;;;;;42328:19:0;;;42338:9;;42328:19;42324:419;;;-1:-1:-1;;;;;42372:24:0;;;;;;:13;:24;;;;;;;;:49;;;;-1:-1:-1;;;;;;42400:21:0;;;;;;:10;:21;;;;;;;;42372:49;42368:278;;;42446:42;42462:6;42470:9;42481:6;42446:15;:42::i;:::-;-1:-1:-1;;;;;42511:21:0;;42535:5;42511:21;;;:10;:21;;;;;:29;;-1:-1:-1;;42511:29:0;;;42324:419;;42368:278;42589:37;42600:6;42608:9;42619:6;42589:10;:37::i;42324:419::-;42686:41;42701:6;42709:9;42720:6;42686:14;:41::i;:::-;42770:10;;:15;:41;;;;-1:-1:-1;42802:9:0;;-1:-1:-1;;;;;42789:22:0;;;42802:9;;42789:22;42770:41;42766:99;;;42841:12;42828:10;:25;41234:1638;;;:::o;8055:240::-;8175:7;8236:12;8228:6;;;;8220:29;;;;-1:-1:-1;;;8220:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;8271:5:0;;;8055:240::o;52087:449::-;-1:-1:-1;;;;;52283:20:0;;;;;;:11;:20;;;;;;;;52282:21;52274:61;;;;-1:-1:-1;;;52274:61:0;;14775:2:1;52274:61:0;;;14757:21:1;14814:2;14794:18;;;14787:30;14853:29;14833:18;;;14826:57;14900:18;;52274:61:0;14747:177:1;52274:61:0;-1:-1:-1;;;;;52352:16:0;;52371:1;52352:16;;;:7;:16;;;;;;:20;52348:109;;-1:-1:-1;;;;;52428:16:0;;;;;;:7;:16;;;;;;52408:37;;:19;:37::i;:::-;-1:-1:-1;;;;;52389:16:0;;;;;;:7;:16;;;;;:56;52348:109;-1:-1:-1;;;;;52467:20:0;;;;;:11;:20;;;;;:27;;-1:-1:-1;;52467:27:0;52490:4;52467:27;;;;;;52505:9;:23;;;;;;;;;;;;;;-1:-1:-1;;;;;;52505:23:0;;;;;;52087:449::o;2895:173::-;2951:16;2970:6;;-1:-1:-1;;;;;2987:17:0;;;-1:-1:-1;;;;;;2987:17:0;;;;;;3020:40;;2970:6;;;;;;;3020:40;;2951:16;3020:40;2895:173;;:::o;53564:204::-;53667:7;53642:16;53659:4;53642:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:32;;-1:-1:-1;;;;;;53642:32:0;-1:-1:-1;;;;;53642:32:0;;;;;;53685:25;;;-1:-1:-1;53685:25:0;;;:16;:25;;;;;;:32;;;;;;;;:::i;:::-;;53755:4;53733:27;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;53733:27:0;;;;;;;;53564:204;;:::o;40276:605::-;40374:7;;40327;;;;;21252:14;21139:1;21252:2;:14;:::i;:::-;21234:33;;:13;:33;:::i;:::-;40392:25;;40433:9;40428:308;40452:9;:16;40448:20;;40428:308;;;40518:7;40494;:21;40502:9;40512:1;40502:12;;;;;;-1:-1:-1;;;40502:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40502:12:0;40494:21;;;;;;;;;;;;;:31;;:66;;;40553:7;40529;:21;40537:9;40547:1;40537:12;;;;;;-1:-1:-1;;;40537:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40537:12:0;40529:21;;;;;;;;;;;;;:31;40494:66;40490:114;;;40587:7;;21252:14;21139:1;21252:2;:14;:::i;:::-;21234:33;;:13;:33;:::i;:::-;40579:25;;;;;;;40276:605;;:::o;40490:114::-;40631:34;40643:7;:21;40651:9;40661:1;40651:12;;;;;;-1:-1:-1;;;40651:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40651:12:0;40643:21;;;;;;;;;;;;;40631:7;;:11;:34::i;:::-;40621:44;;40690:34;40702:7;:21;40710:9;40720:1;40710:12;;;;;;-1:-1:-1;;;40710:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40710:12:0;40702:21;;;;;;;;;;;;;40690:7;;:11;:34::i;:::-;40680:44;-1:-1:-1;40470:3:0;;;;:::i;:::-;;;;40428:308;;;-1:-1:-1;40762:20:0;21252:14;21139:1;21252:2;:14;:::i;:::-;21234:33;;:13;:33;:::i;:::-;40762:7;;;:11;:20::i;:::-;40752:7;:30;40748:88;;;40807:7;;21252:14;21139:1;21252:2;:14;:::i;:::-;21234:33;;:13;:33;:::i;:::-;40799:25;;;;;;40276:605;;:::o;40748:88::-;40856:7;;40865;;-1:-1:-1;40276:605:0;-1:-1:-1;40276:605:0:o;42880:491::-;42974:15;42992:27;43012:6;42992:19;:27::i;:::-;-1:-1:-1;;;;;43048:15:0;;;;;;:7;:15;;;;;;42974:45;;-1:-1:-1;43048:28:0;;42974:45;43048:19;:28::i;:::-;-1:-1:-1;;;;;43030:15:0;;;;;;;:7;:15;;;;;;:46;;;;43108:18;;;;;;;:31;;43131:7;43108:22;:31::i;:::-;-1:-1:-1;;;;;43087:18:0;;;;;;;:7;:18;;;;;;;;:52;;;;43154:19;;;;;:11;:19;;;;;;;43150:70;;;-1:-1:-1;;;;;43193:15:0;;;;;;:7;:15;;;;;;:27;;43213:6;43193:19;:27::i;:::-;-1:-1:-1;;;;;43175:15:0;;;;;;:7;:15;;;;;:45;43150:70;-1:-1:-1;;;;;43235:22:0;;;;;;:11;:22;;;;;;;;43231:79;;;-1:-1:-1;;;;;43280:18:0;;;;;;:7;:18;;;;;;:30;;43303:6;43280:22;:30::i;:::-;-1:-1:-1;;;;;43259:18:0;;;;;;:7;:18;;;;;:51;43231:79;43345:9;-1:-1:-1;;;;;43328:35:0;43337:6;-1:-1:-1;;;;;43328:35:0;-1:-1:-1;;;;;;;;;;;43356:6:0;43328:35;;;;21681:25:1;;21669:2;21654:18;;21636:76;43328:35:0;;;;;;;;42880:491;;;;:::o;50579:282::-;50666:9;;50628:4;;-1:-1:-1;;;;;50666:9:0;50652:10;:23;;;;:54;;;50705:1;50692:10;;:14;50652:54;:79;;;;-1:-1:-1;50724:7:0;;;;;;;50723:8;50652:79;:117;;;;-1:-1:-1;50748:21:0;;;;50652:117;:201;;;;;50814:39;;50786:24;50804:4;50786:9;:24::i;:::-;:67;;50645:208;;50579:282;:::o;50869:1055::-;23858:7;:14;;-1:-1:-1;;23858:14:0;;;;;50965:39:::1;::::0;23858:14;51038:30:::1;50965:39:::0;51066:1:::1;51038:27;:30::i;:::-;51015:53:::0;-1:-1:-1;51079:25:0::1;51107:41;:23:::0;51015:53;51107:27:::1;:41::i;:::-;51185:16;::::0;;51199:1:::1;51185:16:::0;;;;;::::1;::::0;;51079:69;;-1:-1:-1;51161:21:0::1;::::0;51185:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;51185:16:0::1;51161:40;;51230:4;51212;51217:1;51212:7;;;;;;-1:-1:-1::0;;;51212:7:0::1;;;;;;;;;-1:-1:-1::0;;;;;51212:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;51256:11:::1;::::0;:18:::1;::::0;;-1:-1:-1;;;51256:18:0;;;;:11;;;::::1;::::0;:16:::1;::::0;:18:::1;::::0;;::::1;::::0;51212:7;;51256:18;;;;;:11;:18;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51246:4;51251:1;51246:7;;;;;;-1:-1:-1::0;;;51246:7:0::1;;;;;;;;;-1:-1:-1::0;;;;;51246:28:0;;::::1;:7;::::0;;::::1;::::0;;;;;:28;51345:11:::1;::::0;51311:21:::1;::::0;51345:11:::1;:62;51422:12:::0;51287:21:::1;51465:4:::0;51492::::1;51512:23;:15;51532:2;51512:19;:23::i;:::-;51345:201;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51559:21;51583:40;51609:13;51583:21;:25;;:40;;;;:::i;:::-;51636:11;::::0;51559:64;;-1:-1:-1;;;;;;51636:11:0::1;:27;51559:64:::0;51709:4:::1;51729:17:::0;51636:11:::1;::::0;22716:42:::1;51821:23;:15;51841:2;51821:19;:23::i;:::-;51636:219;::::0;::::1;::::0;;;-1:-1:-1;;;;;;51636:219:0;;;-1:-1:-1;;;;;8754:15:1;;;51636:219:0::1;::::0;::::1;8736:34:1::0;8786:18;;;8779:34;;;;8829:18;;;8822:34;;;;8872:18;;;8865:34;;;;8936:15;;;8915:19;;;8908:44;8968:19;;;8961:35;;;;8670:19;;51636:219:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;51873:43:0::1;::::0;51903:12;;-1:-1:-1;51888:13:0;;51873:43:::1;::::0;;;::::1;-1:-1:-1::0;;23895:7:0;:15;;-1:-1:-1;;23895:15:0;;;-1:-1:-1;;;;50869:1055:0:o;48040:1473::-;48136:19;48158:10;:8;:10::i;:::-;48136:32;-1:-1:-1;48179:15:0;48197:23;:6;48136:32;48197:10;:23::i;:::-;48179:41;;48231:21;48255:68;48318:4;48255:58;48301:11;48255:41;48266:29;;;;;;;;;;;48255:41;;:6;:10;;:41;;;;:::i;:68::-;48231:92;;48334:27;48364:74;48433:4;48364:64;48416:11;48364:47;48375:35;;;;;;;;;;;48364:47;;:6;:10;;:47;;;;:::i;:74::-;48334:104;;48449:21;48473:68;48536:4;48473:58;48519:11;48473:41;48484:29;;;;;;;;;;;48473:41;;:6;:10;;:41;;;;:::i;:68::-;48449:92;-1:-1:-1;48552:23:0;48578:70;48449:92;48578:51;48609:19;48578:51;:7;48590:13;48578:11;:26::i;:::-;:30;;:51::i;:70::-;-1:-1:-1;;;;;48677:15:0;;;;;;:7;:15;;;;;;48552:96;;-1:-1:-1;48677:28:0;;48697:7;48677:19;:28::i;:::-;-1:-1:-1;;;;;48659:15:0;;;;;;;:7;:15;;;;;;:46;;;;48737:18;;;;;;;:39;;48760:15;48737:22;:39::i;:::-;-1:-1:-1;;;;;48716:18:0;;;;;;:7;:18;;;;;;:60;;;;48828:4;48812:22;;;;:41;;48839:13;48812:26;:41::i;:::-;48803:4;48787:22;;;;:7;:22;;;;;;;;:66;;;;-1:-1:-1;;;;;48868:19:0;;;;:11;:19;;;;;;48864:70;;;-1:-1:-1;;;;;48907:15:0;;;;;;:7;:15;;;;;;:27;;48927:6;48907:19;:27::i;:::-;-1:-1:-1;;;;;48889:15:0;;;;;;:7;:15;;;;;:45;48864:70;-1:-1:-1;;;;;48949:22:0;;;;;;:11;:22;;;;;;;;48945:105;;;48994:56;49017:32;:15;49037:11;49017:19;:32::i;:::-;-1:-1:-1;;;;;48994:18:0;;;;;;:7;:18;;;;;;;:22;:56::i;:::-;-1:-1:-1;;;;;48973:18:0;;;;;;:7;:18;;;;;:77;48945:105;49085:4;49065:26;;;;:11;:26;;;;;;;;49061:115;;;49118:58;49145:30;:13;49163:11;49145:17;:30::i;:::-;49134:4;49118:22;;;;:7;:22;;;;;;;:26;:58::i;:::-;49109:4;49093:22;;;;:7;:22;;;;;:83;49061:115;-1:-1:-1;;;;;49194:61:0;;;;;;-1:-1:-1;;;;;;;;;;;49222:32:0;:15;49242:11;49222:19;:32::i;:::-;49194:61;;21681:25:1;;;21669:2;21654:18;49194:61:0;;;;;;;49296:4;-1:-1:-1;;;;;49271:63:0;;-1:-1:-1;;;;;;;;;;;49303:30:0;:13;49321:11;49303:17;:30::i;:::-;49271:63;;21681:25:1;;;21669:2;21654:18;49271:63:0;;;;;;;49347:77;49370:6;49378:30;:13;49396:11;49378:17;:30::i;:::-;49410:13;49347:22;:77::i;:::-;49435:70;49447:19;49468:36;49447:19;49492:11;49468:23;:36::i;:::-;49435:11;:70::i;:::-;48040:1473;;;;;;;;;:::o;46600:1432::-;46691:19;46713:10;:8;:10::i;:::-;46691:32;-1:-1:-1;46734:15:0;46752:23;:6;46691:32;46752:10;:23::i;:::-;46734:41;;46786:21;46810:56;46862:3;46810:47;46845:11;46810:30;46821:18;;;;;;;;;;;46810:30;;:6;:10;;:30;;;;:::i;:56::-;46786:80;;46877:27;46907:62;46965:3;46907:53;46948:11;46907:36;46918:24;;;;;;;;;;;46907:36;;:6;:10;;:36;;;;:::i;:62::-;46877:92;;46980:21;47004:56;47056:3;47004:47;47039:11;47004:30;47015:18;;;;;;;;;;;47004:30;;:6;:10;;:30;;;;:::i;44817:1775::-;44912:19;44934:10;:8;:10::i;:::-;44912:32;-1:-1:-1;44955:15:0;44973:23;:6;44912:32;44973:10;:23::i;:::-;45050:14;;44955:41;;-1:-1:-1;45007:29:0;;45039:35;;45070:3;;45039:26;;:6;;45050:14;;45039:10;:26::i;:35::-;45007:67;-1:-1:-1;45085:29:0;45117:38;45007:67;45143:11;45117:25;:38::i;:::-;45085:70;;45166:21;45190:66;45252:3;45190:57;45235:11;45190:40;45201:28;;;;;;;;;;;45190:40;;:6;:10;;:40;;;;:::i;:66::-;45166:90;;45267:27;45297:72;45365:3;45297:63;45348:11;45297:46;45308:34;;;;;;;;;;;45297:46;;:6;:10;;:46;;;;:::i;:72::-;45267:102;;45380:21;45404:66;45466:3;45404:57;45449:11;45404:40;45415:28;;;;;;;;;;;45404:40;;:6;:10;;:40;;;;:::i;:66::-;45380:90;-1:-1:-1;45481:23:0;45507:97;45380:90;45507:78;45565:19;45507:78;45546:13;45507:78;:7;45519:21;45507:11;:34::i;:97::-;-1:-1:-1;;;;;45633:15:0;;;;;;:7;:15;;;;;;45481:123;;-1:-1:-1;45633:28:0;;45653:7;45633:19;:28::i;:::-;-1:-1:-1;;;;;45615:15:0;;;;;;;:7;:15;;;;;;:46;;;;45693:18;;;;;;;:39;;45716:15;45693:22;:39::i;:::-;-1:-1:-1;;;;;45672:18:0;;;;;;:7;:18;;;;;;:60;;;;45784:4;45768:22;;;;:41;;45795:13;45768:26;:41::i;:::-;45759:4;45743:22;;;;:7;:22;;;;;;;;:66;;;;-1:-1:-1;;;;;45826:19:0;;;;:11;:19;;;;;;45822:70;;;-1:-1:-1;;;;;45865:15:0;;;;;;:7;:15;;;;;;:27;;45885:6;45865:19;:27::i;:::-;-1:-1:-1;;;;;45847:15:0;;;;;;:7;:15;;;;;:45;45822:70;-1:-1:-1;;;;;45907:22:0;;;;;;:11;:22;;;;;;;;45903:105;;;45952:56;45975:32;:15;45995:11;45975:19;:32::i;:::-;-1:-1:-1;;;;;45952:18:0;;;;;;:7;:18;;;;;;;:22;:56::i;:::-;-1:-1:-1;;;;;45931:18:0;;;;;;:7;:18;;;;;:77;45903:105;46043:4;46023:26;;;;:11;:26;;;;;;;;46019:115;;;46076:58;46103:30;:13;46121:11;46103:17;:30::i;46076:58::-;46067:4;46051:22;;;;:7;:22;;;;;:83;46019:115;-1:-1:-1;;;;;46152:61:0;;;;;;-1:-1:-1;;;;;;;;;;;46180:32:0;:15;46200:11;46180:19;:32::i;:::-;46152:61;;21681:25:1;;;21669:2;21654:18;46152:61:0;;;;;;;46254:4;-1:-1:-1;;;;;46229:63:0;;-1:-1:-1;;;;;;;;;;;46261:30:0;:13;46279:11;46261:17;:30::i;:::-;46229:63;;21681:25:1;;;21669:2;21654:18;46229:63:0;;;;;;;-1:-1:-1;;;;;46346:22:0;;;;;;;:11;:22;;;;;;46313:102;;46338:6;;46346:22;46370:21;46393;46313:24;:102::i;:::-;46426:77;46449:6;46457:30;:13;46475:11;46457:17;:30::i;46426:77::-;46514:70;46526:19;46547:36;46526:19;46571:11;46547:23;:36::i;46514:70::-;44817:1775;;;;;;;;;;;:::o;43379:1430::-;43469:19;43491:10;:8;:10::i;:::-;43469:32;-1:-1:-1;43512:15:0;43530:23;:6;43469:32;43530:10;:23::i;:::-;43512:41;;43564:21;43588:55;43639:3;43588:46;43622:11;43588:29;43599:17;;;;;;;;;;;43588:29;;:6;:10;;:29;;;;:::i;:55::-;43564:79;;43654:27;43684:61;43741:3;43684:52;43724:11;43684:35;43695:23;;;;;;;;;;43684:35;;:6;:10;;:35;;;;:::i;:61::-;43654:91;;43756:21;43780:55;43831:3;43780:46;43814:11;43780:29;43791:17;;;;;;;;;;;43780:29;;:6;:10;;:29;;;;:::i;50201:370::-;50349:15;;-1:-1:-1;;;;;50349:15:0;50341:24;;;;:7;:24;;;;;;:43;;50370:13;50341:28;:43::i;:::-;50322:15;;;-1:-1:-1;;;;;50322:15:0;;;50314:24;;;;:7;:24;;;;;;;;:70;;;;50411:15;;;;;50399:28;;:11;:28;;;;;;;50395:104;;;50464:15;;-1:-1:-1;;;;;50464:15:0;50456:24;;;;:7;:24;;;;;;:43;;50485:13;50456:28;:43::i;:::-;50437:15;;-1:-1:-1;;;;;50437:15:0;50429:24;;;;:7;:24;;;;;:70;50395:104;50532:15;;50515:48;;21681:25:1;;;-1:-1:-1;;;;;50532:15:0;;;;50515:48;;;-1:-1:-1;;;;;;;;;;;50515:48:0;21669:2:1;21654:18;50515:48:0;21636:76:1;51932:147:0;52010:7;;:17;;52022:4;52010:11;:17::i;:::-;52000:7;:27;52051:10;;:20;;52066:4;52051:14;:20::i;:::-;52038:10;:33;-1:-1:-1;;51932:147:0:o;49521:672::-;49703:17;;-1:-1:-1;;;;;49703:17:0;49687:35;;;;:7;:35;;;;;;:48;;49727:7;49687:39;:48::i;:::-;49665:17;;;-1:-1:-1;;;;;49665:17:0;;;49649:35;;;;:7;:35;;;;;;;;:86;;;;49770:17;;;;;49750:39;;:11;:39;;;;;;;49746:131;;;49845:17;;-1:-1:-1;;;;;49845:17:0;49829:35;;;;:7;:35;;;;;;:48;;49869:7;49829:39;:48::i;:::-;49807:17;;-1:-1:-1;;;;;49807:17:0;49791:35;;;;:7;:35;;;;;:86;49746:131;49920:17;;49895:53;;21681:25:1;;;-1:-1:-1;;;;;49920:17:0;;;;49895:53;;;-1:-1:-1;;;;;;;;;;;49895:53:0;21669:2:1;21654:18;49895:53:0;;;;;;;49959:17;;:64;;-1:-1:-1;;;49959:64:0;;-1:-1:-1;;;;;8308:32:1;;;49959:64:0;;;8290:51:1;8357:18;;;8350:34;;;49959:17:0;;;;:38;;8263:18:1;;49959:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;50072:35:0;;;;;;:18;:35;;;;;;:48;;-1:-1:-1;50112:7:0;50072:39;:48::i;:::-;-1:-1:-1;;;;;50034:35:0;;;;;;:18;:35;;;;;:86;50153:19;;:32;;50177:7;50153:23;:32::i;:::-;50131:19;:54;-1:-1:-1;;;;49521:672:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:229::-;693:5;746:3;739:4;731:6;727:17;723:27;713:2;;768:5;761;754:20;713:2;794:79;869:3;860:6;847:20;840:4;832:6;828:17;794:79;:::i;884:156::-;950:20;;1010:4;999:16;;989:27;;979:2;;1030:1;1027;1020:12;979:2;931:109;;;:::o;1045:257::-;1104:6;1157:2;1145:9;1136:7;1132:23;1128:32;1125:2;;;1178:6;1170;1163:22;1125:2;1222:9;1209:23;1241:31;1266:5;1241:31;:::i;1307:261::-;1377:6;1430:2;1418:9;1409:7;1405:23;1401:32;1398:2;;;1451:6;1443;1436:22;1398:2;1488:9;1482:16;1507:31;1532:5;1507:31;:::i;1573:333::-;1649:6;1657;1710:2;1698:9;1689:7;1685:23;1681:32;1678:2;;;1731:6;1723;1716:22;1678:2;1775:9;1762:23;1794:31;1819:5;1794:31;:::i;:::-;1844:5;1896:2;1881:18;;;;1868:32;;-1:-1:-1;;;1668:238:1:o;1911:398::-;1979:6;1987;2040:2;2028:9;2019:7;2015:23;2011:32;2008:2;;;2061:6;2053;2046:22;2008:2;2105:9;2092:23;2124:31;2149:5;2124:31;:::i;:::-;2174:5;-1:-1:-1;2231:2:1;2216:18;;2203:32;2244:33;2203:32;2244:33;:::i;:::-;2296:7;2286:17;;;1998:311;;;;;:::o;2314:466::-;2391:6;2399;2407;2460:2;2448:9;2439:7;2435:23;2431:32;2428:2;;;2481:6;2473;2466:22;2428:2;2525:9;2512:23;2544:31;2569:5;2544:31;:::i;:::-;2594:5;-1:-1:-1;2651:2:1;2636:18;;2623:32;2664:33;2623:32;2664:33;:::i;:::-;2418:362;;2716:7;;-1:-1:-1;;;2770:2:1;2755:18;;;;2742:32;;2418:362::o;2785:392::-;2850:6;2858;2911:2;2899:9;2890:7;2886:23;2882:32;2879:2;;;2932:6;2924;2917:22;2879:2;2976:9;2963:23;2995:31;3020:5;2995:31;:::i;:::-;3045:5;-1:-1:-1;3102:2:1;3087:18;;3074:32;3115:30;3074:32;3115:30;:::i;3182:477::-;3260:6;3268;3321:2;3309:9;3300:7;3296:23;3292:32;3289:2;;;3342:6;3334;3327:22;3289:2;3386:9;3373:23;3405:31;3430:5;3405:31;:::i;:::-;3455:5;-1:-1:-1;3511:2:1;3496:18;;3483:32;3538:18;3527:30;;3524:2;;;3575:6;3567;3560:22;3524:2;3603:50;3645:7;3636:6;3625:9;3621:22;3603:50;:::i;:::-;3593:60;;;3279:380;;;;;:::o;3664:325::-;3732:6;3740;3793:2;3781:9;3772:7;3768:23;3764:32;3761:2;;;3814:6;3806;3799:22;3994:251;4050:6;4103:2;4091:9;4082:7;4078:23;4074:32;4071:2;;;4124:6;4116;4109:22;4071:2;4168:9;4155:23;4187:28;4209:5;4187:28;:::i;4250:255::-;4317:6;4370:2;4358:9;4349:7;4345:23;4341:32;4338:2;;;4391:6;4383;4376:22;4338:2;4428:9;4422:16;4447:28;4469:5;4447:28;:::i;4510:479::-;4578:6;4631:2;4619:9;4610:7;4606:23;4602:32;4599:2;;;4652:6;4644;4637:22;4599:2;4697:9;4684:23;4730:18;4722:6;4719:30;4716:2;;;4767:6;4759;4752:22;4716:2;4795:22;;4848:4;4840:13;;4836:27;-1:-1:-1;4826:2:1;;4882:6;4874;4867:22;4826:2;4910:73;4975:7;4970:2;4957:16;4952:2;4948;4944:11;4910:73;:::i;:::-;4900:83;4589:400;-1:-1:-1;;;;4589:400:1:o;4994:342::-;5063:6;5116:2;5104:9;5095:7;5091:23;5087:32;5084:2;;;5137:6;5129;5122:22;5084:2;5182:9;5169:23;5215:18;5207:6;5204:30;5201:2;;;5252:6;5244;5237:22;5201:2;5280:50;5322:7;5313:6;5302:9;5298:22;5280:50;:::i;5341:190::-;5400:6;5453:2;5441:9;5432:7;5428:23;5424:32;5421:2;;;5474:6;5466;5459:22;5421:2;-1:-1:-1;5502:23:1;;5411:120;-1:-1:-1;5411:120:1:o;5536:194::-;5606:6;5659:2;5647:9;5638:7;5634:23;5630:32;5627:2;;;5680:6;5672;5665:22;5627:2;-1:-1:-1;5708:16:1;;5617:113;-1:-1:-1;5617:113:1:o;5735:316::-;5823:6;5831;5839;5892:2;5880:9;5871:7;5867:23;5863:32;5860:2;;;5913:6;5905;5898:22;5860:2;5947:9;5941:16;5931:26;;5997:2;5986:9;5982:18;5976:25;5966:35;;6041:2;6030:9;6026:18;6020:25;6010:35;;5850:201;;;;;:::o;6056:192::-;6113:6;6166:2;6154:9;6145:7;6141:23;6137:32;6134:2;;;6187:6;6179;6172:22;6134:2;6215:27;6232:9;6215:27;:::i;6253:332::-;6324:6;6332;6340;6393:2;6381:9;6372:7;6368:23;6364:32;6361:2;;;6414:6;6406;6399:22;6361:2;6442:27;6459:9;6442:27;:::i;:::-;6432:37;;6488:36;6520:2;6509:9;6505:18;6488:36;:::i;:::-;6478:46;;6543:36;6575:2;6564:9;6560:18;6543:36;:::i;:::-;6533:46;;6351:234;;;;;:::o;6590:463::-;6643:3;6681:5;6675:12;6708:6;6703:3;6696:19;6734:4;6763:2;6758:3;6754:12;6747:19;;6800:2;6793:5;6789:14;6821:3;6833:195;6847:6;6844:1;6841:13;6833:195;;;6912:13;;-1:-1:-1;;;;;6908:39:1;6896:52;;6968:12;;;;7003:15;;;;6944:1;6862:9;6833:195;;;-1:-1:-1;7044:3:1;;6651:402;-1:-1:-1;;;;;6651:402:1:o;7058:257::-;7099:3;7137:5;7131:12;7164:6;7159:3;7152:19;7180:63;7236:6;7229:4;7224:3;7220:14;7213:4;7206:5;7202:16;7180:63;:::i;:::-;7297:2;7276:15;-1:-1:-1;;7272:29:1;7263:39;;;;7304:4;7259:50;;7107:208;-1:-1:-1;;7107:208:1:o;7320:274::-;7449:3;7487:6;7481:13;7503:53;7549:6;7544:3;7537:4;7529:6;7525:17;7503:53;:::i;:::-;7572:16;;;;;7457:137;-1:-1:-1;;7457:137:1:o;9007:261::-;9186:2;9175:9;9168:21;9149:4;9206:56;9258:2;9247:9;9243:18;9235:6;9206:56;:::i;9465:217::-;9612:2;9601:9;9594:21;9575:4;9632:44;9672:2;9661:9;9657:18;9649:6;9632:44;:::i;16320:352::-;16522:2;16504:21;;;16561:2;16541:18;;;16534:30;16600;16595:2;16580:18;;16573:58;16663:2;16648:18;;16494:178::o;16677:356::-;16879:2;16861:21;;;16898:18;;;16891:30;16957:34;16952:2;16937:18;;16930:62;17024:2;17009:18;;16851:182::o;17455:337::-;17657:2;17639:21;;;17696:2;17676:18;;;17669:30;-1:-1:-1;;;17730:2:1;17715:18;;17708:43;17783:2;17768:18;;17629:163::o;21717:582::-;22016:6;22005:9;21998:25;22059:6;22054:2;22043:9;22039:18;22032:34;22102:3;22097:2;22086:9;22082:18;22075:31;21979:4;22123:57;22175:3;22164:9;22160:19;22152:6;22123:57;:::i;:::-;-1:-1:-1;;;;;22216:32:1;;;;22211:2;22196:18;;22189:60;-1:-1:-1;22280:3:1;22265:19;22258:35;22115:65;21988:311;-1:-1:-1;;;21988:311:1:o;22493:128::-;22533:3;22564:1;22560:6;22557:1;22554:13;22551:2;;;22570:18;;:::i;:::-;-1:-1:-1;22606:9:1;;22541:80::o;22626:217::-;22666:1;22692;22682:2;;-1:-1:-1;;;22717:31:1;;22771:4;22768:1;22761:15;22799:4;22724:1;22789:15;22682:2;-1:-1:-1;22828:9:1;;22672:171::o;22848:422::-;22937:1;22980:5;22937:1;22994:270;23015:7;23005:8;23002:21;22994:270;;;23074:4;23070:1;23066:6;23062:17;23056:4;23053:27;23050:2;;;23083:18;;:::i;:::-;23133:7;23123:8;23119:22;23116:2;;;23153:16;;;;23116:2;23232:22;;;;23192:15;;;;22994:270;;;22998:3;22912:358;;;;;:::o;23275:140::-;23333:5;23362:47;23403:4;23393:8;23389:19;23383:4;23469:5;23499:8;23489:2;;-1:-1:-1;23540:1:1;23554:5;;23489:2;23588:4;23578:2;;-1:-1:-1;23625:1:1;23639:5;;23578:2;23670:4;23688:1;23683:59;;;;23756:1;23751:130;;;;23663:218;;23683:59;23713:1;23704:10;;23727:5;;;23751:130;23788:3;23778:8;23775:17;23772:2;;;23795:18;;:::i;:::-;-1:-1:-1;;23851:1:1;23837:16;;23866:5;;23663:218;;23965:2;23955:8;23952:16;23946:3;23940:4;23937:13;23933:36;23927:2;23917:8;23914:16;23909:2;23903:4;23900:12;23896:35;23893:77;23890:2;;;-1:-1:-1;24002:19:1;;;24034:5;;23890:2;24081:34;24106:8;24100:4;24081:34;:::i;:::-;24151:6;24147:1;24143:6;24139:19;24130:7;24127:32;24124:2;;;24162:18;;:::i;:::-;24200:20;;23479:747;-1:-1:-1;;;23479:747:1:o;24231:168::-;24271:7;24337:1;24333;24329:6;24325:14;24322:1;24319:21;24314:1;24307:9;24300:17;24296:45;24293:2;;;24344:18;;:::i;:::-;-1:-1:-1;24384:9:1;;24283:116::o;24404:125::-;24444:4;24472:1;24469;24466:8;24463:2;;;24477:18;;:::i;:::-;-1:-1:-1;24514:9:1;;24453:76::o;24534:258::-;24606:1;24616:113;24630:6;24627:1;24624:13;24616:113;;;24706:11;;;24700:18;24687:11;;;24680:39;24652:2;24645:10;24616:113;;;24747:6;24744:1;24741:13;24738:2;;;24782:1;24773:6;24768:3;24764:16;24757:27;24738:2;;24587:205;;;:::o;24797:380::-;24876:1;24872:12;;;;24919;;;24940:2;;24994:4;24986:6;24982:17;24972:27;;24940:2;25047;25039:6;25036:14;25016:18;25013:38;25010:2;;;25093:10;25088:3;25084:20;25081:1;25074:31;25128:4;25125:1;25118:15;25156:4;25153:1;25146:15;25010:2;;24852:325;;;:::o;25182:135::-;25221:3;-1:-1:-1;;25242:17:1;;25239:2;;;25262:18;;:::i;:::-;-1:-1:-1;25309:1:1;25298:13;;25229:88::o;25322:127::-;25383:10;25378:3;25374:20;25371:1;25364:31;25414:4;25411:1;25404:15;25438:4;25435:1;25428:15;25454:127;25515:10;25510:3;25506:20;25503:1;25496:31;25546:4;25543:1;25536:15;25570:4;25567:1;25560:15;25586:131;-1:-1:-1;;;;;25661:31:1;;25651:42;;25641:2;;25707:1;25704;25697:12;25722:118;25808:5;25801:13;25794:21;25787:5;25784:32;25774:2;;25830:1;25827;25820:12

Swarm Source

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