ETH Price: $2,521.69 (+2.46%)
Gas: 1.06 Gwei

Token

MozzaCheddar (RATATOUILLE)
 

Overview

Max Total Supply

1,000,000,000 RATATOUILLE

Holders

138

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,477,451.734260328 RATATOUILLE

Value
$0.00
0xd16CF6cC98e62786fB5a72B96D41Fd1798241772
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MozzaCheddar

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/*
* 
MozzaCheddar  (RATATOUILLE)

Initial Supply: 1 000 000 000 000 tokens
Max Wallet: 2%
Max Buy 1%

Tax: 10% 
15% sell tax for first two hours

https://twitter.com/MozzaCheddaMoon


*
*/

pragma solidity =0.8.4;

// SPDX-License-Identifier: UNLICENSED

interface IBEP20 {
  function totalSupply() external view returns (uint256);
  function decimals() external view returns (uint8);
  function symbol() external view returns (string memory);
  function name() external view returns (string memory);
  function getOwner() external view returns (address);
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
  function allowance(address _owner, address spender) external view returns (uint256);
  function approve(address spender, uint256 amount) external returns (bool);
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


interface IuniswapV2ERC20 {
    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;
}

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

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

interface IuniswapV2Router01 {
    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 factory() external pure returns (address);
    function WETH() external pure returns (address);
    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;
}



/**
 * @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 {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == msg.sender, "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() external onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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) external onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

//MozzaCheddar Contract /////////////

contract MozzaCheddar is IBEP20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    event ContractChanged(uint256 indexed value);
    event ContractChangedBool(bool indexed value);
    event ContractChangedAddress(address indexed value);
    event antiBotBan(address indexed value);
    
    
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => uint256) private _buyLock;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _isBlacklisted;

    //Token Info
    string private constant _name = 'MozzaCheddar';
    string private constant _symbol = 'RATATOUILLE';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 1000000000 * 10**_decimals;

    //Amount to Swap variable
    uint256 currentAmountToSwap = 1000000 * 10**_decimals;
    //Divider for the MaxBalance based on circulating Supply (2%)
    uint8 public constant BalanceLimitDivider=50;
    //Divider for sellLimit based on circulating Supply (1%))
    uint16 public constant SellLimitDivider=100;
	//Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly
    uint16 public constant MaxBuyLockTime= 9 seconds;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime= 1800;
    //DevWallets
    address public TeamWallet=payable(0x6b6d959d7b67C8E66B7d8b726DBD403a810595F5);
    address public walletTwo=payable(0xbb4bee472c78828aC4EAB49f10ee872646b91789);
    //Uniswap router (Main & Testnet)
    address private uniswapV2Router=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;


    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint256 private _circulatingSupply =InitialSupply;
    uint256 public  balanceLimit = _circulatingSupply;
    uint256 public  sellLimit = _circulatingSupply;
	uint256 private antiWhale = 10000000 * 10**_decimals;

    //Used for anti-bot autoblacklist
    uint256 private tradingEnabledAt; //DO NOT CHANGE, THIS IS FOR HOLDING A TIMESTAMP
	uint256 private autoBanTime = 20; // Set to the amount of time in seconds after enable trading you want addresses to be auto blacklisted if they buy/sell/transfer in this time.
	uint256 private enableAutoBlacklist = 1; //Leave 1 if using, set to 0 if not using.
    
    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;

    uint8 private _burnTax;
    uint8 private _liquidityTax;
    uint8 private _marketingTax;
       
    address private _uniswapV2PairAddress; 
    IuniswapV2Router02 private _uniswapV2Router;

    //Constructor///////////

    constructor () {
        //contract creator gets 90% of the token to create LP-Pair
        uint256 deployerBalance=_circulatingSupply;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);
        // Uniswap Router
        _uniswapV2Router = IuniswapV2Router02(uniswapV2Router);
        //Creates a Uniswap Pair
        _uniswapV2PairAddress = IuniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        
        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;
		
		//Sets buyLockTime
        buyLockTime=0;

        //Set Starting Taxes 
        
        _buyTax=10;
        _sellTax=15;
        _transferTax=15;

        _burnTax=0;
        _liquidityTax=30;
        _marketingTax=70;

        //Team wallets and deployer are excluded from Taxes
        _excluded.add(TeamWallet);
        _excluded.add(walletTwo);
        _excluded.add(msg.sender);
    
    }

    //Transfer functionality///

    //transfer function, every transfer runs through this function
    function _transfer(address sender, address recipient, uint256 amount) private{
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");
        
        //Manually Excluded adresses are transfering tax and lock free
        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));
        
        //Transactions from and to the contract are always tax and lock free
        bool isContractTransfer=(sender==address(this) || recipient==address(this));
        
        //transfers between UniswapRouter and UniswapPair are tax and lock free
        address uniswapV2Router=address(_uniswapV2Router);
        bool isLiquidityTransfer = ((sender == _uniswapV2PairAddress && recipient == uniswapV2Router) 
        || (recipient == _uniswapV2PairAddress && sender == uniswapV2Router));

        //differentiate between buy/sell/transfer to apply different taxes/restrictions
        bool isBuy=sender==_uniswapV2PairAddress|| sender == uniswapV2Router;
        bool isSell=recipient==_uniswapV2PairAddress|| recipient == uniswapV2Router;

        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
        else{ 
            //once trading is enabled, it can't be turned off again
            require(tradingEnabled,"trading not yet enabled");
            _taxedTransfer(sender,recipient,amount,isBuy,isSell);
        }
    }
    //applies taxes, checks for limits, locks generates autoLP
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        uint8 tax;
        if(isSell){
            //Sells can't exceed the sell limit
            require(amount<=sellLimit,"Dump protection");
            require(_isBlacklisted.contains(sender) == false, "Address blacklisted!");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }
            tax=_sellTax;


        } else if(isBuy){
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
			require(amount <= antiWhale,"Tx amount exceeding max buy amount");
            require(_isBlacklisted.contains(recipient) == false, "Address blacklisted!");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(recipient);
                emit antiBotBan(recipient);
            }
            tax=_buyTax;

        } else {//Transfer
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(_isBlacklisted.contains(sender) == false, "Sender address blacklisted!");
            require(_isBlacklisted.contains(recipient) == false, "Recipient address blacklisted!");
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }
            tax=_transferTax;


        }     
        //Swapping AutoLP and MarketingETH is only possible if sender is not uniswapV2 pair, 
        //if its not manually disabled, if its not already swapping and if its a Sell to avoid
        // people from causing a large price impact from repeatedly transfering when theres a large backlog of Tokens
        if((sender!=_uniswapV2PairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier)&&isSell)
            _swapContractToken();
        //Calculates the exact token amount for each tax
        uint256 tokensToBeBurnt=_calculateFee(amount, tax, _burnTax);
        uint256 contractToken=_calculateFee(amount, tax, _marketingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(tokensToBeBurnt + contractToken);

        //Removes token
        _removeToken(sender,amount);
        
        //Adds the taxed tokens to the contract wallet
        _balances[address(this)] += contractToken;
        //Burns tokens
        _circulatingSupply-=tokensToBeBurnt;

        //Adds token
        _addToken(recipient, taxedAmount);
        
        emit Transfer(sender,recipient,taxedAmount);

    }

    //Feeless transfer only transfers
    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        //Removes token
        _removeToken(sender,amount);
        //Adds token
        _addToken(recipient, amount);
        
        emit Transfer(sender,recipient,amount);

    }
    //Calculates the token that should be taxed
    function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) {
        return (amount*tax*taxPercent) / 10000;
    }
  
    //balance that is claimable by the team
    uint256 public marketingBalance;

    //adds Token to balances
    function _addToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]+amount;
        //sets newBalance
        _balances[addr]=newAmount;
    }
    
    
    //removes Token
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
        //sets newBalance
        _balances[addr]=newAmount;
    }

    //Swap Contract Tokens//////////////////////////////////////////////////////////////////////////////////

    //tracks auto generated ETH, useful for ticker etc
    uint256 public totalLPETH;
    //Locks the swap if already swapping
    bool private _isSwappingContractModifier;
    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

    //swaps the token on the contract for Marketing ETH and LP Token.
    //always swaps the sellLimit of token to avoid a large price impact
    function _swapContractToken() private lockTheSwap{
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_marketingTax+_liquidityTax;
        uint256 tokenToSwap = currentAmountToSwap;
        //only swap if contractBalance is larger than tokenToSwap, and totalTax is unequal to 0
        if(contractBalance<tokenToSwap||totalTax==0){
            return;
        }
        //splits the token in TokenForLiquidity and tokenForMarketing
        uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax;
        uint256 tokenForMarketing= tokenToSwap-tokenForLiquidity;

        //splits tokenForLiquidity in 2 halves
        uint256 liqToken=tokenForLiquidity/2;
        uint256 liqETHToken=tokenForLiquidity-liqToken;

        //swaps marktetingToken and the liquidity token half for ETH
        uint256 swapToken=liqETHToken+tokenForMarketing;
        //Gets the initial ETH balance
        uint256 initialETHBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newETH=(address(this).balance - initialETHBalance);
        //calculates the amount of ETH belonging to the LP-Pair and converts them to LP
        uint256 liqETH = (newETH*liqETHToken)/swapToken;
        _addLiquidity(liqToken, liqETH);
        //Get the ETH balance after LP generation to get the
        //exact amount of token left for marketing
        uint256 distributeETH=(address(this).balance - initialETHBalance);
        //distributes remaining BETHNB to Marketing
        marketingBalance+=distributeETH;
    }
    //swaps tokens on the contract for ETH
    function _swapTokenForETH(uint256 amount) private {
        _approve(address(this), address(_uniswapV2Router), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapV2Router.WETH();

        _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    //Adds Liquidity directly to the contract where LP are locked(unlike safemoon forks, that transfer it to the owner)
    function _addLiquidity(uint256 tokenamount, uint256 ethamount) private returns (uint256 tAmountSent, uint256 ethAmountSent) {
        totalLPETH+=ethamount;
        uint256 minETH = (ethamount*75) / 100;
        uint256 minTokens = (tokenamount*75) / 100;
        _approve(address(this), address(_uniswapV2Router), tokenamount);
        _uniswapV2Router.addLiquidityETH{value: ethamount}(
            address(this),
            tokenamount,
            minTokens,
            minETH,
            address(this),
            block.timestamp
        );
        tAmountSent = tokenamount;
        ethAmountSent = ethamount;
        return (tAmountSent, ethAmountSent);
    }

    //public functions /////////////////////////////////////////////////////////////////////////////////////

    function getLiquidityReleaseTimeInSeconds() external view returns (uint256){
        if(block.timestamp<_liquidityUnlockTime){
            return _liquidityUnlockTime-block.timestamp;
        }
        return 0;
    }

    function getBurnedTokens() external view returns(uint256){
        return (InitialSupply-_circulatingSupply)/10**_decimals;
    }

    function getLimits() external view returns(uint256 balance, uint256 sell){
        return(balanceLimit/10**_decimals, sellLimit/10**_decimals);
    }

    function getTaxes() external view returns(uint256 burnTax,uint256 liquidityTax, uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){
        return (_burnTax,_liquidityTax,_marketingTax,_buyTax,_sellTax,_transferTax);
    }
	
    //How long is a given address still locked from buying
	function getAddressBuyLockTimeInSeconds(address AddressToCheck) external view returns (uint256){
       uint256 lockTime=_buyLock[AddressToCheck];
       if(lockTime<=block.timestamp)
       {
           return 0;
       }
       return lockTime-block.timestamp;
    }
    function getBuyLockTimeInSeconds() external view returns(uint256){
        return buyLockTime;
    }
    
    //Functions every wallet can call
	
	//Resets buy lock of caller to the default buyLockTime should something go very wrong
    function AddressResetBuyLock() external{
        _buyLock[msg.sender]=block.timestamp+buyLockTime;
	
    }

    //Settings//////////////////////////////////////////////////////////////////////////////////////////////
 
	bool public buyLockDisabled;
    uint256 public buyLockTime;
    bool public manualConversion; 

    function TeamWithdrawALLMarketingETH() external onlyOwner{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        payable(TeamWallet).transfer((amount*50) / 100);
        payable(walletTwo).transfer((amount-(amount*50) / 100));
        emit Transfer(address(this), TeamWallet, (amount*50) / 100);
        emit Transfer(address(this), walletTwo, (amount-(amount*50) / 100));
    } 
    function TeamWithdrawXMarketingETH(uint256 amount) external onlyOwner{
        require(amount<=marketingBalance,
        "Error: Amount greater than available balance.");
        marketingBalance-=amount;
        payable(TeamWallet).transfer((amount*50) / 100);
        payable(walletTwo).transfer((amount-(amount*50) / 100));
        emit Transfer(address(this), TeamWallet, (amount*50) / 100);
        emit Transfer(address(this), walletTwo, (amount-(amount*50) / 100));
    } 

    //switches autoLiquidity and marketing ETH generation during transfers
    function TeamSwitchManualETHConversion(bool manual) external onlyOwner{
        manualConversion=manual;
        emit ContractChangedBool(manualConversion);
    }
	
	function TeamChangeAntiWhale(uint256 newAntiWhale) external onlyOwner{
      antiWhale=newAntiWhale * 10**_decimals;
      emit ContractChanged(antiWhale);
    }
    
    function TeamChangeTeamWallet(address newTeamWallet) external onlyOwner{
      require(newTeamWallet != address(0),
      "Error: Cannot be 0 address.");
      TeamWallet=payable(newTeamWallet);
      emit ContractChangedAddress(TeamWallet);
    }
    
    function TeamChangeWalletTwo(address newWalletTwo) external onlyOwner{
      require(newWalletTwo != address(0),
      "Error: Cannot be 0 address.");
      walletTwo=payable(newWalletTwo);
      emit ContractChangedAddress(walletTwo);
    }
	
	//Disables the timeLock after buying for everyone
    function TeamDisableBuyLock(bool disabled) external onlyOwner{
        buyLockDisabled=disabled;
        emit ContractChangedBool(buyLockDisabled);
    }
	
	//Sets BuyLockTime, needs to be lower than MaxBuyLockTime
    function TeamSetBuyLockTime(uint256 buyLockSeconds) external onlyOwner{
            require(buyLockSeconds<=MaxBuyLockTime,"Buy Lock time too high");
            buyLockTime=buyLockSeconds;
            emit ContractChanged(buyLockTime);
    } 

    //Allows CA owner to change how much the contract sells to prevent massive contract sells as the token grows.
    function TeamUpdateAmountToSwap(uint256 newSwapAmount) external onlyOwner{
        currentAmountToSwap = newSwapAmount;
        emit ContractChanged(currentAmountToSwap);
    }
    
    //Allows wallet exclusion to be added after launch
    function addWalletExclusion(address exclusionAdd) external onlyOwner{
        _excluded.add(exclusionAdd);
        emit ContractChangedAddress(exclusionAdd);
    }

    //Allows you to remove wallet exclusions after launch
    function removeWalletExclusion(address exclusionRemove) external onlyOwner{
        _excluded.remove(exclusionRemove);
        emit ContractChangedAddress(exclusionRemove);
    }

    //Adds address to blacklist and prevents sells, buys or transfers.
    function addAddressToBlacklist(address blacklistedAddress) external onlyOwner {
        _isBlacklisted.add(blacklistedAddress);
        emit ContractChangedAddress(blacklistedAddress);
    }

    //Remove address from blacklist and allow sells, buys or transfers.
    function removeAddressFromBlacklist(address blacklistedAddress) external onlyOwner {
        _isBlacklisted.remove(blacklistedAddress);
        emit ContractChangedAddress(blacklistedAddress);
    }
    
    //Sets Taxes, is limited by MaxTax(20%) to make it impossible to create honeypot
    function TeamSetTaxes(uint8 burnTaxes, uint8 liquidityTaxes, uint8 marketingTaxes, uint8 buyTax, uint8 sellTax, uint8 transferTax) external onlyOwner{
        uint8 totalTax=burnTaxes+liquidityTaxes+marketingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");
        require(buyTax <= 20,
        "Error: Honeypot prevention prevents buyTax from exceeding 20.");
        require(sellTax <= 20,
        "Error: Honeypot prevention prevents sellTax from exceeding 20.");
        require(transferTax <= 20,
        "Error: Honeypot prevention prevents transferTax from exceeding 20.");

        _burnTax=burnTaxes;
        _liquidityTax=liquidityTaxes;
        _marketingTax=marketingTaxes;
        
        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;

        emit ContractChanged(_burnTax);
        emit ContractChanged(_liquidityTax);
        emit ContractChanged(_buyTax);
        emit ContractChanged(_sellTax);
        emit ContractChanged(_transferTax);
    }

    //manually converts contract token to LP
    function TeamCreateLPandETH() external onlyOwner{
    _swapContractToken();
    }
    
    function teamUpdateUniswapRouter(address newRouter) external onlyOwner {
        require(newRouter != address(0),
        "Error: Cannot be 0 address.");
        uniswapV2Router=newRouter;
        emit ContractChangedAddress(newRouter);
    }
     //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) external onlyOwner{
        //SellLimit needs to be below 1% to avoid a Large Price impact when generating auto LP
        require(newSellLimit<_circulatingSupply/100,
        "Error: New sell limit above 1% of circulating supply.");
        //Adds decimals to limits
        newBalanceLimit=newBalanceLimit*10**_decimals;
        newSellLimit=newSellLimit*10**_decimals;
        //Calculates the target Limits based on supply
        uint256 targetBalanceLimit=_circulatingSupply/BalanceLimitDivider;
        uint256 targetSellLimit=_circulatingSupply/SellLimitDivider;

        require((newBalanceLimit>=targetBalanceLimit), 
        "newBalanceLimit needs to be at least target");
        require((newSellLimit>=targetSellLimit), 
        "newSellLimit needs to be at least target");

        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;
        emit ContractChanged(balanceLimit);
        emit ContractChanged(sellLimit);
    }

    
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    
    bool public tradingEnabled;
    address private _liquidityTokenAddress;
    //Enables trading for everyone
    function SetupEnableTrading() external onlyOwner{
        tradingEnabled=true;
        tradingEnabledAt=block.timestamp;
    }
    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) external onlyOwner{
        require(liquidityTokenAddress != address(0),
        "Error: Cannot be 0 address.");
        _liquidityTokenAddress=liquidityTokenAddress;
    }

    //Liquidity Lock////////////////////////////////////////////////////////////////////////////////////////
    //the timestamp when Liquidity unlocks
    uint256 private _liquidityUnlockTime;

    //Adds time to LP lock in seconds.
    function TeamProlongLiquidityLockInSeconds(uint256 secondsUntilUnlock) external onlyOwner{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
        emit ContractChanged(secondsUntilUnlock+block.timestamp);
    }
    //Adds time to LP lock based on set time.
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime,
        "Error: New unlock time is shorter than old one.");
        _liquidityUnlockTime=newUnlockTime;
        emit ContractChanged(_liquidityUnlockTime);
    }

    //Release Liquidity Tokens once unlock time is over
    function TeamReleaseLiquidity() external onlyOwner returns (address tWAddress, uint256 amountSent) {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        
        IuniswapV2ERC20 liquidityToken = IuniswapV2ERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        //Liquidity release if something goes wrong at start
        liquidityToken.transfer(TeamWallet, amount);
        emit Transfer(address(this), TeamWallet, amount);
        tWAddress = TeamWallet;
        amountSent = amount;
        return (tWAddress, amountSent);
        
    }
    //Removes Liquidity once unlock Time is over, 
    function TeamRemoveLiquidity() external onlyOwner returns (uint256 newBalance) {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        IuniswapV2ERC20 liquidityToken = IuniswapV2ERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        liquidityToken.approve(address(_uniswapV2Router),amount);
        //Removes Liquidity and adds it to marketing Balance
        uint256 initialETHBalance = address(this).balance;
        
        _uniswapV2Router.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            (amount*75) / 100,
            (amount*75) / 100,
            address(this),
            block.timestamp
            );
        uint256 newETHBalance = address(this).balance-initialETHBalance;
        marketingBalance+=newETHBalance;
        newBalance=newETHBalance;
        return newBalance;
    }
    //Releases all remaining ETH on the contract wallet, so ETH wont be burned
    function TeamRemoveRemainingETH() external onlyOwner{
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        (bool sent,) =TeamWallet.call{value: (address(this).balance)}("");
        require(sent,
        "Error: Not sent.");
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //external//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    receive() external payable {}
    fallback() external payable {}
    // IBEP20

    function getOwner() external view override returns (address) {
        return owner();
    }

    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 view override returns (uint256) {
        return _circulatingSupply;
    }

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

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

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

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "Approve from zero");
        require(spender != address(0), "Approve to zero");

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

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");

        _approve(sender, msg.sender, currentAllowance - amount);
        return true;
    }

    // IBEP20 - Helpers

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 currentAllowance = _allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "<0 allowance");

        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

}

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":"uint256","name":"value","type":"uint256"}],"name":"ContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"value","type":"address"}],"name":"ContractChangedAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"ContractChangedBool","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"value","type":"address"}],"name":"antiBotBan","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"AddressResetBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxBuyLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAntiWhale","type":"uint256"}],"name":"TeamChangeAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTeamWallet","type":"address"}],"name":"TeamChangeTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWalletTwo","type":"address"}],"name":"TeamChangeWalletTwo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamCreateLPandETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamProlongLiquidityLockInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamReleaseLiquidity","outputs":[{"internalType":"address","name":"tWAddress","type":"address"},{"internalType":"uint256","name":"amountSent","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamRemoveLiquidity","outputs":[{"internalType":"uint256","name":"newBalance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamRemoveRemainingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyLockSeconds","type":"uint256"}],"name":"TeamSetBuyLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"burnTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"marketingTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"TeamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualETHConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapAmount","type":"uint256"}],"name":"TeamUpdateAmountToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"TeamUpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TeamWithdrawALLMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamWithdrawXMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"addAddressToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exclusionAdd","type":"address"}],"name":"addWalletExclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getAddressBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLimits","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"burnTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"},{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"removeAddressFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exclusionRemove","type":"address"}],"name":"removeWalletExclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"teamUpdateUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalLPETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletTwo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a62000548565b6200002190620f424062000607565b600855600980546001600160a01b0319908116736b6d959d7b67c8e66b7d8b726dbd403a810595f5178255600a8054821673bb4bee472c78828ac4eab49f10ee872646b91789178155600b8054909216737a250d5630b4cf539739df2c5dacb4c659f2488d1790915562000096919062000548565b620000a690633b9aca0062000607565b600c819055600d819055600e55620000c16009600a62000548565b620000d0906298968062000607565b600f5560146011556001601255348015620000ea57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600c54336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600b54601480546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620001cb57600080fd5b505afa158015620001e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002069190620004ae565b6001600160a01b031663c9c6539630601460009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200026457600080fd5b505afa15801562000279573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029f9190620004ae565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002e857600080fd5b505af1158015620002fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003239190620004ae565b601380546001600160a01b0392909216660100000000000002600160301b600160d01b03199092169190911790556032620003616009600a62000548565b6200037190633b9aca0062000607565b6200037d9190620004de565b600d556064620003906009600a62000548565b620003a090633b9aca0062000607565b620003ac9190620004de565b600e5560006018556013805465ffffffffffff191665461e000f0f0a179055600954620003f1906004906001600160a01b03166200043c602090811b620022ed17901c565b50600a5462000418906004906001600160a01b03166200043c602090811b620022ed17901c565b50620004343360046200043c60201b620022ed1790919060201c565b50506200063f565b600062000453836001600160a01b0384166200045c565b90505b92915050565b6000818152600183016020526040812054620004a55750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000456565b50600062000456565b600060208284031215620004c0578081fd5b81516001600160a01b0381168114620004d7578182fd5b9392505050565b600082620004fa57634e487b7160e01b81526012600452602481fd5b500490565b600181815b808511156200054057816000190482111562000524576200052462000629565b808516156200053257918102915b93841c939080029062000504565b509250929050565b60006200045360ff841683600082620005645750600162000456565b81620005735750600062000456565b81600181146200058c57600281146200059757620005b7565b600191505062000456565b60ff841115620005ab57620005ab62000629565b50506001821b62000456565b5060208310610133831016604e8410600b8410161715620005dc575081810a62000456565b620005e88383620004ff565b8060001904821115620005ff57620005ff62000629565b029392505050565b600081600019048311821515161562000624576200062462000629565b500290565b634e487b7160e01b600052601160045260246000fd5b613963806200064f6000396000f3fe6080604052600436106103605760003560e01c8063677a8870116101c45780639fa62d5f116100f6578063d8902ff51161009a578063e803050c1161006c578063e803050c14610a77578063f2c816ae14610a97578063f2fde38b14610ab7578063f9ab736614610ad757005b8063d8902ff5146109d1578063daf9a47a146109f1578063dd62ed3e14610a11578063e2fd002a14610a5757005b8063b766a386116100d3578063b766a38614610967578063c3a3c03214610987578063c3f4f54f1461099c578063d11edf74146109b157005b80639fa62d5f14610907578063a457c2d714610927578063a9059cbb1461094757005b8063828e8b7e11610168578063929dffda1161013a578063929dffda1461087357806395d89b41146108935780639bc845fb146108c75780639bf65770146108e757005b8063828e8b7e1461082657806386d0ada81461083b578063893d20e8146108555780638da5cb5b1461085557005b806370a08231116101a157806370a08231146107b0578063715018a6146107e6578063762bb282146107fb5780637b9e987a1461081157005b8063677a8870146107465780636eb8c7f1146107665780636f89e4091461078657005b806335e82f3a1161029d5780634cbf8e241161024157806358e1df921161021357806358e1df92146106e657806358e55365146106fb5780635c69f6901461071157806361cb27481461072657005b80634cbf8e241461067b5780634cdaf0ae146106905780634f91e48c146106b057806357ad67d1146106c657005b80633cc39b7a1161027a5780633cc39b7a146106105780634476f35a1461062657806344f3c83a146106465780634ada218b1461065c57005b806335e82f3a1461059c57806339509351146105bc5780633c7a309b146105dc57005b806323b872dd116103045780632973ef2d116102e15780632973ef2d146104d75780633054f8a314610542578063311a869714610561578063313ce5671461058857005b806323b872dd1461046a578063243b529a1461048a5780632594b3431461049f57005b80630fd99e161161033d5780630fd99e161461040357806314ddc0951461042b57806318160ddd146104405780631eb25d131461045557005b806306fdde0314610369578063095ea7b3146103b05780630fa5b215146103e057005b3661036757005b005b34801561037557600080fd5b5060408051808201909152600c81526b26b7bd3d30a1b432b23230b960a11b60208201525b6040516103a791906135ba565b60405180910390f35b3480156103bc57600080fd5b506103d06103cb36600461342b565b610af7565b60405190151581526020016103a7565b3480156103ec57600080fd5b506103f5610b0e565b6040519081526020016103a7565b34801561040f57600080fd5b50610418606481565b60405161ffff90911681526020016103a7565b34801561043757600080fd5b506018546103f5565b34801561044c57600080fd5b50600c546103f5565b34801561046157600080fd5b506103f5610d69565b34801561047657600080fd5b506103d06104853660046133eb565b610d86565b34801561049657600080fd5b50610367610e1d565b3480156104ab57600080fd5b50600a546104bf906001600160a01b031681565b6040516001600160a01b0390911681526020016103a7565b3480156104e357600080fd5b506013546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103a7565b34801561054e57600080fd5b506017546103d090610100900460ff1681565b34801561056d57600080fd5b50610576603281565b60405160ff90911681526020016103a7565b34801561059457600080fd5b506009610576565b3480156105a857600080fd5b506103676105b736600461337b565b610e60565b3480156105c857600080fd5b506103d06105d736600461342b565b610eca565b3480156105e857600080fd5b506105f1610f01565b604080516001600160a01b0390931683526020830191909152016103a7565b34801561061c57600080fd5b506103f560165481565b34801561063257600080fd5b5061036761064136600461348e565b6110b4565b34801561065257600080fd5b506103f560185481565b34801561066857600080fd5b506019546103d090610100900460ff1681565b34801561068757600080fd5b506103676112a9565b34801561069c57600080fd5b506103676106ab36600461337b565b61139d565b3480156106bc57600080fd5b506103f5600e5481565b3480156106d257600080fd5b506103676106e136600461350c565b611426565b3480156106f257600080fd5b506103676117bb565b34801561070757600080fd5b506103f560155481565b34801561071d57600080fd5b50610418600981565b34801561073257600080fd5b5061036761074136600461337b565b611819565b34801561075257600080fd5b506009546104bf906001600160a01b031681565b34801561077257600080fd5b5061036761078136600461348e565b61185d565b34801561079257600080fd5b5061079b6118cc565b604080519283526020830191909152016103a7565b3480156107bc57600080fd5b506103f56107cb36600461337b565b6001600160a01b031660009081526001602052604090205490565b3480156107f257600080fd5b50610367611909565b34801561080757600080fd5b506103f5600d5481565b34801561081d57600080fd5b5061036761198c565b34801561083257600080fd5b506103676119da565b34801561084757600080fd5b506019546103d09060ff1681565b34801561086157600080fd5b506000546001600160a01b03166104bf565b34801561087f57600080fd5b5061036761088e36600461337b565b6119fe565b34801561089f57600080fd5b5060408051808201909152600b81526a52415441544f55494c4c4560a81b602082015261039a565b3480156108d357600080fd5b506103676108e236600461337b565b611a95565b3480156108f357600080fd5b50610367610902366004613456565b611b2c565b34801561091357600080fd5b506103676109223660046134be565b611baa565b34801561093357600080fd5b506103d061094236600461342b565b611dc3565b34801561095357600080fd5b506103d061096236600461342b565b611e3f565b34801561097357600080fd5b50610367610982366004613456565b611e4c565b34801561099357600080fd5b506103f5611ed4565b3480156109a857600080fd5b506103f5611ef4565b3480156109bd57600080fd5b506103676109cc36600461348e565b611f33565b3480156109dd57600080fd5b506103676109ec36600461337b565b611f8d565b3480156109fd57600080fd5b50610367610a0c36600461348e565b612024565b348015610a1d57600080fd5b506103f5610a2c3660046133b3565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a6357600080fd5b50610367610a7236600461348e565b612092565b348015610a8357600080fd5b506103f5610a9236600461337b565b612136565b348015610aa357600080fd5b50610367610ab236600461337b565b612170565b348015610ac357600080fd5b50610367610ad236600461337b565b6121b4565b348015610ae357600080fd5b50610367610af236600461337b565b6122ad565b6000610b04338484612302565b5060015b92915050565b600033610b236000546001600160a01b031690565b6001600160a01b031614610b525760405162461bcd60e51b8152600401610b4990613637565b60405180910390fd5b601a54421015610b745760405162461bcd60e51b8152600401610b499061360d565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610bc157600080fd5b505afa158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf991906134a6565b60145460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610c4957600080fd5b505af1158015610c5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c819190613472565b5060145447906001600160a01b031663af2979eb30846064610ca482604b61385e565b610cae9190613750565b6064610cbb88604b61385e565b610cc59190613750565b30426040518763ffffffff1660e01b8152600401610ce89695949392919061357f565b602060405180830381600087803b158015610d0257600080fd5b505af1158015610d16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3a91906134a6565b506000610d47824761387d565b90508060156000828254610d5b9190613713565b909155509094505050505090565b610d756009600a6137b3565b610d8390633b9aca0061385e565b81565b6000610d938484846123f5565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610dfe5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b49565b610e128533610e0d868561387d565b612302565b506001949350505050565b33610e306000546001600160a01b031690565b6001600160a01b031614610e565760405162461bcd60e51b8152600401610b4990613637565b610e5e612652565b565b33610e736000546001600160a01b031690565b6001600160a01b031614610e995760405162461bcd60e51b8152600401610b4990613637565b610ea46006826127a5565b506040516001600160a01b0382169060008051602061390e83398151915290600090a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b04918590610e0d908690613713565b60008033610f176000546001600160a01b031690565b6001600160a01b031614610f3d5760405162461bcd60e51b8152600401610b4990613637565b601a54421015610f5f5760405162461bcd60e51b8152600401610b499061360d565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610fac57600080fd5b505afa158015610fc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe491906134a6565b60095460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561103457600080fd5b505af1158015611048573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106c9190613472565b506009546040518281526001600160a01b039091169030906000805160206138ee8339815191529060200160405180910390a36009546001600160a01b031693509150509091565b336110c76000546001600160a01b031690565b6001600160a01b0316146110ed5760405162461bcd60e51b8152600401610b4990613637565b6015548111156111555760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610b49565b8060156000828254611167919061387d565b90915550506009546001600160a01b03166108fc606461118884603261385e565b6111929190613750565b6040518115909202916000818181858888f193505050501580156111ba573d6000803e3d6000fd5b50600a546001600160a01b03166108fc60646111d784603261385e565b6111e19190613750565b6111eb908461387d565b6040518115909202916000818181858888f19350505050158015611213573d6000803e3d6000fd5b506009546001600160a01b0316306000805160206138ee833981519152606461123d85603261385e565b6112479190613750565b60405190815260200160405180910390a3600a546001600160a01b0316306000805160206138ee833981519152606461128185603261385e565b61128b9190613750565b611295908561387d565b60405190815260200160405180910390a350565b336112bc6000546001600160a01b031690565b6001600160a01b0316146112e25760405162461bcd60e51b8152600401610b4990613637565b601a544210156113045760405162461bcd60e51b8152600401610b499061360d565b6009546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611351576040519150601f19603f3d011682016040523d82523d6000602084013e611356565b606091505b505090508061139a5760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610b49565b50565b336113b06000546001600160a01b031690565b6001600160a01b0316146113d65760405162461bcd60e51b8152600401610b4990613637565b6001600160a01b0381166113fc5760405162461bcd60e51b8152600401610b499061366c565b601980546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336114396000546001600160a01b031690565b6001600160a01b03161461145f5760405162461bcd60e51b8152600401610b4990613637565b60008461146c878961372b565b611476919061372b565b90508060ff166064146114da5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610b49565b60148460ff1611156115545760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610b49565b60148360ff1611156115ce5760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610b49565b60148260ff1611156116535760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610b49565b86601360036101000a81548160ff021916908360ff16021790555085601360046101000a81548160ff021916908360ff16021790555084601360056101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601360016101000a81548160ff021916908360ff16021790555081601360026101000a81548160ff021916908360ff160217905550601360039054906101000a900460ff1660ff166000805160206138ce83398151915260405160405180910390a260135460405164010000000090910460ff16906000805160206138ce83398151915290600090a260135460405160ff909116906000805160206138ce83398151915290600090a260135460405161010090910460ff16906000805160206138ce83398151915290600090a26013546040516201000090910460ff16906000805160206138ce83398151915290600090a250505050505050565b336117ce6000546001600160a01b031690565b6001600160a01b0316146117f45760405162461bcd60e51b8152600401610b4990613637565b6015805460009091556009546001600160a01b03166108fc606461118884603261385e565b3361182c6000546001600160a01b031690565b6001600160a01b0316146118525760405162461bcd60e51b8152600401610b4990613637565b610ea46004826127a5565b336118706000546001600160a01b031690565b6001600160a01b0316146118965760405162461bcd60e51b8152600401610b4990613637565b6118a86118a34283613713565b6127ba565b6118b24282613713565b6040516000805160206138ce83398151915290600090a250565b6000806118db6009600a6137b3565b600d546118e89190613750565b6118f46009600a6137b3565b600e546119019190613750565b915091509091565b3361191c6000546001600160a01b031690565b6001600160a01b0316146119425760405162461bcd60e51b8152600401610b4990613637565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b3361199f6000546001600160a01b031690565b6001600160a01b0316146119c55760405162461bcd60e51b8152600401610b4990613637565b6019805461ff00191661010017905542601055565b6018546119e79042613713565b33600090815260036020526040902055565b905090565b33611a116000546001600160a01b031690565b6001600160a01b031614611a375760405162461bcd60e51b8152600401610b4990613637565b6001600160a01b038116611a5d5760405162461bcd60e51b8152600401610b499061366c565b600b80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390e83398151915290600090a250565b33611aa86000546001600160a01b031690565b6001600160a01b031614611ace5760405162461bcd60e51b8152600401610b4990613637565b6001600160a01b038116611af45760405162461bcd60e51b8152600401610b499061366c565b600980546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390e83398151915290600090a250565b33611b3f6000546001600160a01b031690565b6001600160a01b031614611b655760405162461bcd60e51b8152600401610b4990613637565b6019805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611bbd6000546001600160a01b031690565b6001600160a01b031614611be35760405162461bcd60e51b8152600401610b4990613637565b6064600c54611bf29190613750565b8110611c5e5760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610b49565b611c6a6009600a6137b3565b611c74908361385e565b9150611c826009600a6137b3565b611c8c908261385e565b90506000603260ff16600c54611ca29190613750565b90506000606461ffff16600c54611cb99190613750565b905081841015611d1f5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610b49565b80831015611d805760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610b49565b600d849055600e83905560405184906000805160206138ce83398151915290600090a2600e546040516000805160206138ce83398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611e265760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b49565b611e353385610e0d868561387d565b5060019392505050565b6000610b043384846123f5565b33611e5f6000546001600160a01b031690565b6001600160a01b031614611e855760405162461bcd60e51b8152600401610b4990613637565b6017805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b6000601a54421015611eee5742601a546119f9919061387d565b50600090565b6000611f026009600a6137b3565b600c54611f116009600a6137b3565b611f1f90633b9aca0061385e565b611f29919061387d565b6119f99190613750565b33611f466000546001600160a01b031690565b6001600160a01b031614611f6c5760405162461bcd60e51b8152600401610b4990613637565b600881905560405181906000805160206138ce83398151915290600090a250565b33611fa06000546001600160a01b031690565b6001600160a01b031614611fc65760405162461bcd60e51b8152600401610b4990613637565b6001600160a01b038116611fec5760405162461bcd60e51b8152600401610b499061366c565b600a80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390e83398151915290600090a250565b336120376000546001600160a01b031690565b6001600160a01b03161461205d5760405162461bcd60e51b8152600401610b4990613637565b6120696009600a6137b3565b612073908261385e565b600f8190556040516000805160206138ce83398151915290600090a250565b336120a56000546001600160a01b031690565b6001600160a01b0316146120cb5760405162461bcd60e51b8152600401610b4990613637565b60098111156121155760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610b49565b601881905560405181906000805160206138ce83398151915290600090a250565b6001600160a01b03811660009081526003602052604081205442811161215f5750600092915050565b612169428261387d565b9392505050565b336121836000546001600160a01b031690565b6001600160a01b0316146121a95760405162461bcd60e51b8152600401610b4990613637565b610ea46006826122ed565b336121c76000546001600160a01b031690565b6001600160a01b0316146121ed5760405162461bcd60e51b8152600401610b4990613637565b6001600160a01b0381166122525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b49565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336122c06000546001600160a01b031690565b6001600160a01b0316146122e65760405162461bcd60e51b8152600401610b4990613637565b610ea46004825b6000612169836001600160a01b038416612844565b6001600160a01b03831661234c5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b49565b6001600160a01b0382166123945760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b49565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124405760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b49565b6001600160a01b0382166124895760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b49565b6000612496600485612893565b806124a757506124a7600484612893565b905060006001600160a01b0385163014806124ca57506001600160a01b03841630145b6014546013549192506001600160a01b0390811691600091888116600160301b9092041614801561250c5750816001600160a01b0316866001600160a01b0316145b8061254757506013546001600160a01b03878116600160301b909204161480156125475750816001600160a01b0316876001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125815750826001600160a01b0316886001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125bb5750836001600160a01b0316886001600160a01b0316145b905084806125c65750825b806125ce5750855b156125e3576125de8989896128b5565b612647565b601954610100900460ff1661263a5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b49565b612647898989858561296e565b505050505050505050565b6017805460ff19166001908117909155306000908152602091909152604081205460135490919061269a90640100000000810460ff908116916501000000000090041661372b565b60ff16905060006008549050808310806126b6575061ffff8216155b156126c357505050612799565b60135460009061ffff8416906126e490640100000000900460ff168461385e565b6126ee9190613750565b905060006126fc828461387d565b9050600061270b600284613750565b90506000612719828561387d565b905060006127278483613713565b90504761273382612f28565b600061273f824761387d565b905060008361274e868461385e565b6127589190613750565b905061276486826130ac565b5060009050612773844761387d565b905080601560008282546127879190613713565b90915550505050505050505050505050505b6017805460ff19169055565b6000612169836001600160a01b0384166131b1565b601a5481116128235760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610b49565b601a81905560405181906000805160206138ce83398151915290600090a250565b600081815260018301602052604081205461288b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b08565b506000610b08565b6001600160a01b03811660009081526001830160205260408120541515612169565b6001600160a01b038316600090815260016020526040902054818110156129195760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b49565b61292384836132c8565b61292d838361330d565b826001600160a01b0316846001600160a01b03166000805160206138ee8339815191528460405161296091815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129dc5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b49565b60008315612aef57600e54861115612a285760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610b49565b612a33600689612893565b15612a775760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b49565b601154601054612a879190613713565b4211158015612a9857506012546001145b15612ade57612aa86006896122ed565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601354610100900460ff16612dd5565b8415612c6257600d54612b028785613713565b1115612b435760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b49565b600f54861115612ba05760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610b49565b612bab600688612893565b15612bef5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b49565b601154601054612bff9190613713565b4211158015612c1057506012546001145b15612c5657612c206006886122ed565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135460ff16612dd5565b612c6d600689612893565b15612cba5760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610b49565b612cc5600688612893565b15612d125760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610b49565b600d54612d1f8785613713565b1115612d605760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b49565b601154601054612d709190613713565b4211158015612d8157506012546001145b15612dc757612d916006896122ed565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135462010000900460ff165b6013546001600160a01b03898116600160301b9092041614801590612dfd575060195460ff16155b8015612e0c575060175460ff16155b8015612e155750835b15612e2257612e22612652565b6000612e3e8783601360039054906101000a900460ff16613331565b601354909150600090612e749089908590612e6f9060ff64010000000082048116916501000000000090041661372b565b613331565b90506000612e828284613713565b612e8c908a61387d565b9050612e988b8a6132c8565b3060009081526001602052604081208054849290612eb7908490613713565b9250508190555082600c6000828254612ed0919061387d565b90915550612ee090508a8261330d565b896001600160a01b03168b6001600160a01b03166000805160206138ee83398151915283604051612f1391815260200190565b60405180910390a35050505050505050505050565b601454612f409030906001600160a01b031683612302565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f8357634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612fd757600080fd5b505afa158015612feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300f9190613397565b8160018151811061303057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b815291169063791ac947906130769085906000908690309042906004016136a3565b600060405180830381600087803b15801561309057600080fd5b505af11580156130a4573d6000803e3d6000fd5b505050505050565b60008082601660008282546130c19190613713565b909155506000905060646130d685604b61385e565b6130e09190613750565b9050600060646130f187604b61385e565b6130fb9190613750565b6014549091506131169030906001600160a01b031688612302565b60145460405163f305d71960e01b81526001600160a01b039091169063f305d7199087906131529030908b90879089908490429060040161357f565b6060604051808303818588803b15801561316b57600080fd5b505af115801561317f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131a491906134df565b5096979596505050505050565b600081815260018301602052604081205480156132be5760006131d560018361387d565b85549091506000906131e99060019061387d565b9050600086600001828154811061321057634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061324157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526001890190915260409020849055865487908061328257634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610b08565b6000915050610b08565b6001600160a01b0382166000908152600160205260408120546132ec90839061387d565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b0382166000908152600160205260408120546132ec908390613713565b60006127108260ff168460ff1686613349919061385e565b613353919061385e565b61335d9190613750565b949350505050565b803560ff8116811461337657600080fd5b919050565b60006020828403121561338c578081fd5b8135612169816138aa565b6000602082840312156133a8578081fd5b8151612169816138aa565b600080604083850312156133c5578081fd5b82356133d0816138aa565b915060208301356133e0816138aa565b809150509250929050565b6000806000606084860312156133ff578081fd5b833561340a816138aa565b9250602084013561341a816138aa565b929592945050506040919091013590565b6000806040838503121561343d578182fd5b8235613448816138aa565b946020939093013593505050565b600060208284031215613467578081fd5b8135612169816138bf565b600060208284031215613483578081fd5b8151612169816138bf565b60006020828403121561349f578081fd5b5035919050565b6000602082840312156134b7578081fd5b5051919050565b600080604083850312156134d0578182fd5b50508035926020909101359150565b6000806000606084860312156134f3578283fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c08789031215613524578182fd5b61352d87613365565b955061353b60208801613365565b945061354960408801613365565b935061355760608801613365565b925061356560808801613365565b915061357360a08801613365565b90509295509295509295565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000602080835283518082850152825b818110156135e6578581018301518582016040015282016135ca565b818111156135f75783604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156136f25784516001600160a01b0316835293830193918301916001016136cd565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561372657613726613894565b500190565b600060ff821660ff84168060ff0382111561374857613748613894565b019392505050565b60008261376b57634e487b7160e01b81526012600452602481fd5b500490565b600181815b808511156137ab57816000190482111561379157613791613894565b8085161561379e57918102915b93841c9390800290613775565b509250929050565b600061216960ff8416836000826137cc57506001610b08565b816137d957506000610b08565b81600181146137ef57600281146137f957613815565b6001915050610b08565b60ff84111561380a5761380a613894565b50506001821b610b08565b5060208310610133831016604e8410600b8410161715613838575081810a610b08565b6138428383613770565b806000190482111561385657613856613894565b029392505050565b600081600019048311821515161561387857613878613894565b500290565b60008282101561388f5761388f613894565b500390565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461139a57600080fd5b801515811461139a57600080fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda26469706673582212201f2db35be5ff83326a9abb2f77e409ee16c1e4f8df0818992f4ce9c0003ee4c764736f6c63430008040033

Deployed Bytecode

0x6080604052600436106103605760003560e01c8063677a8870116101c45780639fa62d5f116100f6578063d8902ff51161009a578063e803050c1161006c578063e803050c14610a77578063f2c816ae14610a97578063f2fde38b14610ab7578063f9ab736614610ad757005b8063d8902ff5146109d1578063daf9a47a146109f1578063dd62ed3e14610a11578063e2fd002a14610a5757005b8063b766a386116100d3578063b766a38614610967578063c3a3c03214610987578063c3f4f54f1461099c578063d11edf74146109b157005b80639fa62d5f14610907578063a457c2d714610927578063a9059cbb1461094757005b8063828e8b7e11610168578063929dffda1161013a578063929dffda1461087357806395d89b41146108935780639bc845fb146108c75780639bf65770146108e757005b8063828e8b7e1461082657806386d0ada81461083b578063893d20e8146108555780638da5cb5b1461085557005b806370a08231116101a157806370a08231146107b0578063715018a6146107e6578063762bb282146107fb5780637b9e987a1461081157005b8063677a8870146107465780636eb8c7f1146107665780636f89e4091461078657005b806335e82f3a1161029d5780634cbf8e241161024157806358e1df921161021357806358e1df92146106e657806358e55365146106fb5780635c69f6901461071157806361cb27481461072657005b80634cbf8e241461067b5780634cdaf0ae146106905780634f91e48c146106b057806357ad67d1146106c657005b80633cc39b7a1161027a5780633cc39b7a146106105780634476f35a1461062657806344f3c83a146106465780634ada218b1461065c57005b806335e82f3a1461059c57806339509351146105bc5780633c7a309b146105dc57005b806323b872dd116103045780632973ef2d116102e15780632973ef2d146104d75780633054f8a314610542578063311a869714610561578063313ce5671461058857005b806323b872dd1461046a578063243b529a1461048a5780632594b3431461049f57005b80630fd99e161161033d5780630fd99e161461040357806314ddc0951461042b57806318160ddd146104405780631eb25d131461045557005b806306fdde0314610369578063095ea7b3146103b05780630fa5b215146103e057005b3661036757005b005b34801561037557600080fd5b5060408051808201909152600c81526b26b7bd3d30a1b432b23230b960a11b60208201525b6040516103a791906135ba565b60405180910390f35b3480156103bc57600080fd5b506103d06103cb36600461342b565b610af7565b60405190151581526020016103a7565b3480156103ec57600080fd5b506103f5610b0e565b6040519081526020016103a7565b34801561040f57600080fd5b50610418606481565b60405161ffff90911681526020016103a7565b34801561043757600080fd5b506018546103f5565b34801561044c57600080fd5b50600c546103f5565b34801561046157600080fd5b506103f5610d69565b34801561047657600080fd5b506103d06104853660046133eb565b610d86565b34801561049657600080fd5b50610367610e1d565b3480156104ab57600080fd5b50600a546104bf906001600160a01b031681565b6040516001600160a01b0390911681526020016103a7565b3480156104e357600080fd5b506013546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103a7565b34801561054e57600080fd5b506017546103d090610100900460ff1681565b34801561056d57600080fd5b50610576603281565b60405160ff90911681526020016103a7565b34801561059457600080fd5b506009610576565b3480156105a857600080fd5b506103676105b736600461337b565b610e60565b3480156105c857600080fd5b506103d06105d736600461342b565b610eca565b3480156105e857600080fd5b506105f1610f01565b604080516001600160a01b0390931683526020830191909152016103a7565b34801561061c57600080fd5b506103f560165481565b34801561063257600080fd5b5061036761064136600461348e565b6110b4565b34801561065257600080fd5b506103f560185481565b34801561066857600080fd5b506019546103d090610100900460ff1681565b34801561068757600080fd5b506103676112a9565b34801561069c57600080fd5b506103676106ab36600461337b565b61139d565b3480156106bc57600080fd5b506103f5600e5481565b3480156106d257600080fd5b506103676106e136600461350c565b611426565b3480156106f257600080fd5b506103676117bb565b34801561070757600080fd5b506103f560155481565b34801561071d57600080fd5b50610418600981565b34801561073257600080fd5b5061036761074136600461337b565b611819565b34801561075257600080fd5b506009546104bf906001600160a01b031681565b34801561077257600080fd5b5061036761078136600461348e565b61185d565b34801561079257600080fd5b5061079b6118cc565b604080519283526020830191909152016103a7565b3480156107bc57600080fd5b506103f56107cb36600461337b565b6001600160a01b031660009081526001602052604090205490565b3480156107f257600080fd5b50610367611909565b34801561080757600080fd5b506103f5600d5481565b34801561081d57600080fd5b5061036761198c565b34801561083257600080fd5b506103676119da565b34801561084757600080fd5b506019546103d09060ff1681565b34801561086157600080fd5b506000546001600160a01b03166104bf565b34801561087f57600080fd5b5061036761088e36600461337b565b6119fe565b34801561089f57600080fd5b5060408051808201909152600b81526a52415441544f55494c4c4560a81b602082015261039a565b3480156108d357600080fd5b506103676108e236600461337b565b611a95565b3480156108f357600080fd5b50610367610902366004613456565b611b2c565b34801561091357600080fd5b506103676109223660046134be565b611baa565b34801561093357600080fd5b506103d061094236600461342b565b611dc3565b34801561095357600080fd5b506103d061096236600461342b565b611e3f565b34801561097357600080fd5b50610367610982366004613456565b611e4c565b34801561099357600080fd5b506103f5611ed4565b3480156109a857600080fd5b506103f5611ef4565b3480156109bd57600080fd5b506103676109cc36600461348e565b611f33565b3480156109dd57600080fd5b506103676109ec36600461337b565b611f8d565b3480156109fd57600080fd5b50610367610a0c36600461348e565b612024565b348015610a1d57600080fd5b506103f5610a2c3660046133b3565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a6357600080fd5b50610367610a7236600461348e565b612092565b348015610a8357600080fd5b506103f5610a9236600461337b565b612136565b348015610aa357600080fd5b50610367610ab236600461337b565b612170565b348015610ac357600080fd5b50610367610ad236600461337b565b6121b4565b348015610ae357600080fd5b50610367610af236600461337b565b6122ad565b6000610b04338484612302565b5060015b92915050565b600033610b236000546001600160a01b031690565b6001600160a01b031614610b525760405162461bcd60e51b8152600401610b4990613637565b60405180910390fd5b601a54421015610b745760405162461bcd60e51b8152600401610b499061360d565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610bc157600080fd5b505afa158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf991906134a6565b60145460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610c4957600080fd5b505af1158015610c5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c819190613472565b5060145447906001600160a01b031663af2979eb30846064610ca482604b61385e565b610cae9190613750565b6064610cbb88604b61385e565b610cc59190613750565b30426040518763ffffffff1660e01b8152600401610ce89695949392919061357f565b602060405180830381600087803b158015610d0257600080fd5b505af1158015610d16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3a91906134a6565b506000610d47824761387d565b90508060156000828254610d5b9190613713565b909155509094505050505090565b610d756009600a6137b3565b610d8390633b9aca0061385e565b81565b6000610d938484846123f5565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610dfe5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b49565b610e128533610e0d868561387d565b612302565b506001949350505050565b33610e306000546001600160a01b031690565b6001600160a01b031614610e565760405162461bcd60e51b8152600401610b4990613637565b610e5e612652565b565b33610e736000546001600160a01b031690565b6001600160a01b031614610e995760405162461bcd60e51b8152600401610b4990613637565b610ea46006826127a5565b506040516001600160a01b0382169060008051602061390e83398151915290600090a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b04918590610e0d908690613713565b60008033610f176000546001600160a01b031690565b6001600160a01b031614610f3d5760405162461bcd60e51b8152600401610b4990613637565b601a54421015610f5f5760405162461bcd60e51b8152600401610b499061360d565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610fac57600080fd5b505afa158015610fc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe491906134a6565b60095460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561103457600080fd5b505af1158015611048573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106c9190613472565b506009546040518281526001600160a01b039091169030906000805160206138ee8339815191529060200160405180910390a36009546001600160a01b031693509150509091565b336110c76000546001600160a01b031690565b6001600160a01b0316146110ed5760405162461bcd60e51b8152600401610b4990613637565b6015548111156111555760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610b49565b8060156000828254611167919061387d565b90915550506009546001600160a01b03166108fc606461118884603261385e565b6111929190613750565b6040518115909202916000818181858888f193505050501580156111ba573d6000803e3d6000fd5b50600a546001600160a01b03166108fc60646111d784603261385e565b6111e19190613750565b6111eb908461387d565b6040518115909202916000818181858888f19350505050158015611213573d6000803e3d6000fd5b506009546001600160a01b0316306000805160206138ee833981519152606461123d85603261385e565b6112479190613750565b60405190815260200160405180910390a3600a546001600160a01b0316306000805160206138ee833981519152606461128185603261385e565b61128b9190613750565b611295908561387d565b60405190815260200160405180910390a350565b336112bc6000546001600160a01b031690565b6001600160a01b0316146112e25760405162461bcd60e51b8152600401610b4990613637565b601a544210156113045760405162461bcd60e51b8152600401610b499061360d565b6009546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611351576040519150601f19603f3d011682016040523d82523d6000602084013e611356565b606091505b505090508061139a5760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610b49565b50565b336113b06000546001600160a01b031690565b6001600160a01b0316146113d65760405162461bcd60e51b8152600401610b4990613637565b6001600160a01b0381166113fc5760405162461bcd60e51b8152600401610b499061366c565b601980546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336114396000546001600160a01b031690565b6001600160a01b03161461145f5760405162461bcd60e51b8152600401610b4990613637565b60008461146c878961372b565b611476919061372b565b90508060ff166064146114da5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610b49565b60148460ff1611156115545760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610b49565b60148360ff1611156115ce5760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610b49565b60148260ff1611156116535760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610b49565b86601360036101000a81548160ff021916908360ff16021790555085601360046101000a81548160ff021916908360ff16021790555084601360056101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601360016101000a81548160ff021916908360ff16021790555081601360026101000a81548160ff021916908360ff160217905550601360039054906101000a900460ff1660ff166000805160206138ce83398151915260405160405180910390a260135460405164010000000090910460ff16906000805160206138ce83398151915290600090a260135460405160ff909116906000805160206138ce83398151915290600090a260135460405161010090910460ff16906000805160206138ce83398151915290600090a26013546040516201000090910460ff16906000805160206138ce83398151915290600090a250505050505050565b336117ce6000546001600160a01b031690565b6001600160a01b0316146117f45760405162461bcd60e51b8152600401610b4990613637565b6015805460009091556009546001600160a01b03166108fc606461118884603261385e565b3361182c6000546001600160a01b031690565b6001600160a01b0316146118525760405162461bcd60e51b8152600401610b4990613637565b610ea46004826127a5565b336118706000546001600160a01b031690565b6001600160a01b0316146118965760405162461bcd60e51b8152600401610b4990613637565b6118a86118a34283613713565b6127ba565b6118b24282613713565b6040516000805160206138ce83398151915290600090a250565b6000806118db6009600a6137b3565b600d546118e89190613750565b6118f46009600a6137b3565b600e546119019190613750565b915091509091565b3361191c6000546001600160a01b031690565b6001600160a01b0316146119425760405162461bcd60e51b8152600401610b4990613637565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b3361199f6000546001600160a01b031690565b6001600160a01b0316146119c55760405162461bcd60e51b8152600401610b4990613637565b6019805461ff00191661010017905542601055565b6018546119e79042613713565b33600090815260036020526040902055565b905090565b33611a116000546001600160a01b031690565b6001600160a01b031614611a375760405162461bcd60e51b8152600401610b4990613637565b6001600160a01b038116611a5d5760405162461bcd60e51b8152600401610b499061366c565b600b80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390e83398151915290600090a250565b33611aa86000546001600160a01b031690565b6001600160a01b031614611ace5760405162461bcd60e51b8152600401610b4990613637565b6001600160a01b038116611af45760405162461bcd60e51b8152600401610b499061366c565b600980546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390e83398151915290600090a250565b33611b3f6000546001600160a01b031690565b6001600160a01b031614611b655760405162461bcd60e51b8152600401610b4990613637565b6019805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611bbd6000546001600160a01b031690565b6001600160a01b031614611be35760405162461bcd60e51b8152600401610b4990613637565b6064600c54611bf29190613750565b8110611c5e5760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610b49565b611c6a6009600a6137b3565b611c74908361385e565b9150611c826009600a6137b3565b611c8c908261385e565b90506000603260ff16600c54611ca29190613750565b90506000606461ffff16600c54611cb99190613750565b905081841015611d1f5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610b49565b80831015611d805760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610b49565b600d849055600e83905560405184906000805160206138ce83398151915290600090a2600e546040516000805160206138ce83398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611e265760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b49565b611e353385610e0d868561387d565b5060019392505050565b6000610b043384846123f5565b33611e5f6000546001600160a01b031690565b6001600160a01b031614611e855760405162461bcd60e51b8152600401610b4990613637565b6017805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b6000601a54421015611eee5742601a546119f9919061387d565b50600090565b6000611f026009600a6137b3565b600c54611f116009600a6137b3565b611f1f90633b9aca0061385e565b611f29919061387d565b6119f99190613750565b33611f466000546001600160a01b031690565b6001600160a01b031614611f6c5760405162461bcd60e51b8152600401610b4990613637565b600881905560405181906000805160206138ce83398151915290600090a250565b33611fa06000546001600160a01b031690565b6001600160a01b031614611fc65760405162461bcd60e51b8152600401610b4990613637565b6001600160a01b038116611fec5760405162461bcd60e51b8152600401610b499061366c565b600a80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390e83398151915290600090a250565b336120376000546001600160a01b031690565b6001600160a01b03161461205d5760405162461bcd60e51b8152600401610b4990613637565b6120696009600a6137b3565b612073908261385e565b600f8190556040516000805160206138ce83398151915290600090a250565b336120a56000546001600160a01b031690565b6001600160a01b0316146120cb5760405162461bcd60e51b8152600401610b4990613637565b60098111156121155760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610b49565b601881905560405181906000805160206138ce83398151915290600090a250565b6001600160a01b03811660009081526003602052604081205442811161215f5750600092915050565b612169428261387d565b9392505050565b336121836000546001600160a01b031690565b6001600160a01b0316146121a95760405162461bcd60e51b8152600401610b4990613637565b610ea46006826122ed565b336121c76000546001600160a01b031690565b6001600160a01b0316146121ed5760405162461bcd60e51b8152600401610b4990613637565b6001600160a01b0381166122525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b49565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336122c06000546001600160a01b031690565b6001600160a01b0316146122e65760405162461bcd60e51b8152600401610b4990613637565b610ea46004825b6000612169836001600160a01b038416612844565b6001600160a01b03831661234c5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b49565b6001600160a01b0382166123945760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b49565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124405760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b49565b6001600160a01b0382166124895760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b49565b6000612496600485612893565b806124a757506124a7600484612893565b905060006001600160a01b0385163014806124ca57506001600160a01b03841630145b6014546013549192506001600160a01b0390811691600091888116600160301b9092041614801561250c5750816001600160a01b0316866001600160a01b0316145b8061254757506013546001600160a01b03878116600160301b909204161480156125475750816001600160a01b0316876001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125815750826001600160a01b0316886001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125bb5750836001600160a01b0316886001600160a01b0316145b905084806125c65750825b806125ce5750855b156125e3576125de8989896128b5565b612647565b601954610100900460ff1661263a5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b49565b612647898989858561296e565b505050505050505050565b6017805460ff19166001908117909155306000908152602091909152604081205460135490919061269a90640100000000810460ff908116916501000000000090041661372b565b60ff16905060006008549050808310806126b6575061ffff8216155b156126c357505050612799565b60135460009061ffff8416906126e490640100000000900460ff168461385e565b6126ee9190613750565b905060006126fc828461387d565b9050600061270b600284613750565b90506000612719828561387d565b905060006127278483613713565b90504761273382612f28565b600061273f824761387d565b905060008361274e868461385e565b6127589190613750565b905061276486826130ac565b5060009050612773844761387d565b905080601560008282546127879190613713565b90915550505050505050505050505050505b6017805460ff19169055565b6000612169836001600160a01b0384166131b1565b601a5481116128235760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610b49565b601a81905560405181906000805160206138ce83398151915290600090a250565b600081815260018301602052604081205461288b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b08565b506000610b08565b6001600160a01b03811660009081526001830160205260408120541515612169565b6001600160a01b038316600090815260016020526040902054818110156129195760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b49565b61292384836132c8565b61292d838361330d565b826001600160a01b0316846001600160a01b03166000805160206138ee8339815191528460405161296091815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129dc5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b49565b60008315612aef57600e54861115612a285760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610b49565b612a33600689612893565b15612a775760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b49565b601154601054612a879190613713565b4211158015612a9857506012546001145b15612ade57612aa86006896122ed565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601354610100900460ff16612dd5565b8415612c6257600d54612b028785613713565b1115612b435760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b49565b600f54861115612ba05760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610b49565b612bab600688612893565b15612bef5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b49565b601154601054612bff9190613713565b4211158015612c1057506012546001145b15612c5657612c206006886122ed565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135460ff16612dd5565b612c6d600689612893565b15612cba5760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610b49565b612cc5600688612893565b15612d125760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610b49565b600d54612d1f8785613713565b1115612d605760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b49565b601154601054612d709190613713565b4211158015612d8157506012546001145b15612dc757612d916006896122ed565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135462010000900460ff165b6013546001600160a01b03898116600160301b9092041614801590612dfd575060195460ff16155b8015612e0c575060175460ff16155b8015612e155750835b15612e2257612e22612652565b6000612e3e8783601360039054906101000a900460ff16613331565b601354909150600090612e749089908590612e6f9060ff64010000000082048116916501000000000090041661372b565b613331565b90506000612e828284613713565b612e8c908a61387d565b9050612e988b8a6132c8565b3060009081526001602052604081208054849290612eb7908490613713565b9250508190555082600c6000828254612ed0919061387d565b90915550612ee090508a8261330d565b896001600160a01b03168b6001600160a01b03166000805160206138ee83398151915283604051612f1391815260200190565b60405180910390a35050505050505050505050565b601454612f409030906001600160a01b031683612302565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f8357634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612fd757600080fd5b505afa158015612feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300f9190613397565b8160018151811061303057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b815291169063791ac947906130769085906000908690309042906004016136a3565b600060405180830381600087803b15801561309057600080fd5b505af11580156130a4573d6000803e3d6000fd5b505050505050565b60008082601660008282546130c19190613713565b909155506000905060646130d685604b61385e565b6130e09190613750565b9050600060646130f187604b61385e565b6130fb9190613750565b6014549091506131169030906001600160a01b031688612302565b60145460405163f305d71960e01b81526001600160a01b039091169063f305d7199087906131529030908b90879089908490429060040161357f565b6060604051808303818588803b15801561316b57600080fd5b505af115801561317f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131a491906134df565b5096979596505050505050565b600081815260018301602052604081205480156132be5760006131d560018361387d565b85549091506000906131e99060019061387d565b9050600086600001828154811061321057634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061324157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526001890190915260409020849055865487908061328257634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610b08565b6000915050610b08565b6001600160a01b0382166000908152600160205260408120546132ec90839061387d565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b0382166000908152600160205260408120546132ec908390613713565b60006127108260ff168460ff1686613349919061385e565b613353919061385e565b61335d9190613750565b949350505050565b803560ff8116811461337657600080fd5b919050565b60006020828403121561338c578081fd5b8135612169816138aa565b6000602082840312156133a8578081fd5b8151612169816138aa565b600080604083850312156133c5578081fd5b82356133d0816138aa565b915060208301356133e0816138aa565b809150509250929050565b6000806000606084860312156133ff578081fd5b833561340a816138aa565b9250602084013561341a816138aa565b929592945050506040919091013590565b6000806040838503121561343d578182fd5b8235613448816138aa565b946020939093013593505050565b600060208284031215613467578081fd5b8135612169816138bf565b600060208284031215613483578081fd5b8151612169816138bf565b60006020828403121561349f578081fd5b5035919050565b6000602082840312156134b7578081fd5b5051919050565b600080604083850312156134d0578182fd5b50508035926020909101359150565b6000806000606084860312156134f3578283fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c08789031215613524578182fd5b61352d87613365565b955061353b60208801613365565b945061354960408801613365565b935061355760608801613365565b925061356560808801613365565b915061357360a08801613365565b90509295509295509295565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000602080835283518082850152825b818110156135e6578581018301518582016040015282016135ca565b818111156135f75783604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156136f25784516001600160a01b0316835293830193918301916001016136cd565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561372657613726613894565b500190565b600060ff821660ff84168060ff0382111561374857613748613894565b019392505050565b60008261376b57634e487b7160e01b81526012600452602481fd5b500490565b600181815b808511156137ab57816000190482111561379157613791613894565b8085161561379e57918102915b93841c9390800290613775565b509250929050565b600061216960ff8416836000826137cc57506001610b08565b816137d957506000610b08565b81600181146137ef57600281146137f957613815565b6001915050610b08565b60ff84111561380a5761380a613894565b50506001821b610b08565b5060208310610133831016604e8410600b8410161715613838575081810a610b08565b6138428383613770565b806000190482111561385657613856613894565b029392505050565b600081600019048311821515161561387857613878613894565b500290565b60008282101561388f5761388f613894565b500390565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461139a57600080fd5b801515811461139a57600080fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda26469706673582212201f2db35be5ff83326a9abb2f77e409ee16c1e4f8df0818992f4ce9c0003ee4c764736f6c63430008040033

Deployed Bytecode Sourcemap

27598:28615:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53867:94;;;;;;;;;;-1:-1:-1;53948:5:0;;;;;;;;;;;;-1:-1:-1;;;53948:5:0;;;;53867:94;;;;;;;:::i;:::-;;;;;;;;54752:161;;;;;;;;;;-1:-1:-1;54752:161:0;;;;;:::i;:::-;;:::i;:::-;;;5409:14:1;;5402:22;5384:41;;5372:2;5357:18;54752:161:0;5339:92:1;51968:1015:0;;;;;;;;;;;;;:::i;:::-;;;17297:25:1;;;17285:2;17270:18;51968:1015:0;17252:76:1;28757:43:0;;;;;;;;;;;;28797:3;28757:43;;;;;17132:6:1;17120:19;;;17102:38;;17090:2;17075:18;28757:43:0;17057:89:1;42612:102:0;;;;;;;;;;-1:-1:-1;42695:11:0;;42612:102;;54177:108;;;;;;;;;;-1:-1:-1;54259:18:0;;54177:108;;28411:65;;;;;;;;;;;;;:::i;55226:392::-;;;;;;;;;;-1:-1:-1;55226:392:0;;;;;:::i;:::-;;:::i;48103:83::-;;;;;;;;;;;;;:::i;29239:76::-;;;;;;;;;;-1:-1:-1;29239:76:0;;;;-1:-1:-1;;;;;29239:76:0;;;;;;-1:-1:-1;;;;;4325:32:1;;;4307:51;;4295:2;4280:18;29239:76:0;4262:102:1;42016:249:0;;;;;;;;;;-1:-1:-1;42190:8:0;;42016:249;;;42190:8;;;;;;18861:25:1;;42199:13:0;;;;;18917:2:1;18902:18;;18895:34;42213:13:0;;;;;18945:18:1;;;18938:34;;;;42227:7:0;;;19003:2:1;18988:18;;18981:34;42190:8:0;42235;;;;19046:3:1;19031:19;;19024:35;42244:12:0;;;;;19090:3:1;19075:19;;19068:35;18848:3;18833:19;42016:249:0;18815:294:1;43083:27:0;;;;;;;;;;-1:-1:-1;43083:27:0;;;;;;;;;;;28643:44;;;;;;;;;;;;28685:2;28643:44;;;;;19286:4:1;19274:17;;;19256:36;;19244:2;19229:18;28643:44:0;19211:87:1;54075:94:0;;;;;;;;;;-1:-1:-1;28403:1:0;54075:94;;46702:201;;;;;;;;;;-1:-1:-1;46702:201:0;;;;;:::i;:::-;;:::i;55653:205::-;;;;;;;;;;-1:-1:-1;55653:205:0;;;;;:::i;:::-;;:::i;51215:695::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;4561:32:1;;;4543:51;;4625:2;4610:18;;4603:34;;;;4516:18;51215:695:0;4498:145:1;38057:25:0;;;;;;;;;;;;;;;;43603:486;;;;;;;;;;-1:-1:-1;43603:486:0;;;;;:::i;:::-;;:::i;43117:26::-;;;;;;;;;;;;;;;;49723;;;;;;;;;;-1:-1:-1;49723:26:0;;;;;;;;;;;53069:268;;;;;;;;;;;;;:::i;50032:243::-;;;;;;;;;;-1:-1:-1;50032:243:0;;;;;:::i;:::-;;:::i;29699:46::-;;;;;;;;;;;;;;;;47001:1048;;;;;;;;;;-1:-1:-1;47001:1048:0;;;;;:::i;:::-;;:::i;43188:408::-;;;;;;;;;;;;;:::i;37319:31::-;;;;;;;;;;;;;;;;28937:48;;;;;;;;;;;;28976:9;28937:48;;46167:181;;;;;;;;;;-1:-1:-1;46167:181:0;;;;;:::i;:::-;;:::i;29155:77::-;;;;;;;;;;-1:-1:-1;29155:77:0;;;;-1:-1:-1;;;;;29155:77:0;;;50522:232;;;;;;;;;;-1:-1:-1;50522:232:0;;;;;:::i;:::-;;:::i;41857:151::-;;;;;;;;;;;;;:::i;:::-;;;;18495:25:1;;;18551:2;18536:18;;18529:34;;;;18468:18;41857:151:0;18450:119:1;54293:121:0;;;;;;;;;;-1:-1:-1;54293:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;54388:18:0;54361:7;54388:18;;;:9;:18;;;;;;;54293:121;9451:142;;;;;;;;;;;;;:::i;29643:49::-;;;;;;;;;;;;;;;;49837:129;;;;;;;;;;;;;:::i;42856:109::-;;;;;;;;;;;;;:::i;43150:28::-;;;;;;;;;;-1:-1:-1;43150:28:0;;;;;;;;53765:94;;;;;;;;;;-1:-1:-1;53817:7:0;8875:6;-1:-1:-1;;;;;8875:6:0;53765:94;;48198:247;;;;;;;;;;-1:-1:-1;48198:247:0;;;;;:::i;:::-;;:::i;53969:98::-;;;;;;;;;;-1:-1:-1;54052:7:0;;;;;;;;;;;;-1:-1:-1;;;54052:7:0;;;;53969:98;;44521:252;;;;;;;;;;-1:-1:-1;44521:252:0;;;;;:::i;:::-;;:::i;44174:165::-;;;;;;;;;;-1:-1:-1;44174:165:0;;;;;:::i;:::-;;:::i;48548:1045::-;;;;;;;;;;-1:-1:-1;48548:1045:0;;;;;:::i;:::-;;:::i;55866:342::-;;;;;;;;;;-1:-1:-1;55866:342:0;;;;;:::i;:::-;;:::i;54422:167::-;;;;;;;;;;-1:-1:-1;54422:167:0;;;;;:::i;:::-;;:::i;45092:156::-;;;;;;;;;;-1:-1:-1;45092:156:0;;;;;:::i;:::-;;:::i;41488:222::-;;;;;;;;;;;;;:::i;41718:131::-;;;;;;;;;;;;;:::i;45687:179::-;;;;;;;;;;-1:-1:-1;45687:179:0;;;;;:::i;:::-;;:::i;44785:246::-;;;;;;;;;;-1:-1:-1;44785:246:0;;;;;:::i;:::-;;:::i;44345:164::-;;;;;;;;;;-1:-1:-1;44345:164:0;;;;;:::i;:::-;;:::i;54597:147::-;;;;;;;;;;-1:-1:-1;54597:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;54708:19:0;;;54681:7;54708:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;54597:147;45317:246;;;;;;;;;;-1:-1:-1;45317:246:0;;;;;:::i;:::-;;:::i;42331:275::-;;;;;;;;;;-1:-1:-1;42331:275:0;;;;;:::i;:::-;;:::i;46428:193::-;;;;;;;;;;-1:-1:-1;46428:193:0;;;;;:::i;:::-;;:::i;9748:238::-;;;;;;;;;;-1:-1:-1;9748:238:0;;;;;:::i;:::-;;:::i;45934:166::-;;;;;;;;;;-1:-1:-1;45934:166:0;;;;;:::i;:::-;;:::i;54752:161::-;54829:4;54846:37;54855:10;54867:7;54876:6;54846:8;:37::i;:::-;-1:-1:-1;54901:4:0;54752:161;;;;;:::o;51968:1015::-;52027:18;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;;;;;;;;;52143:20:::1;;52124:15;:39;;52116:68;;;;-1:-1:-1::0;;;52116:68:0::1;;;;;;;:::i;:::-;52244:22;::::0;52295:39:::1;::::0;-1:-1:-1;;;52295:39:0;;52328:4:::1;52295:39;::::0;::::1;4307:51:1::0;52244:22:0;;;::::1;-1:-1:-1::0;;;;;52244:22:0::1;::::0;52195:30:::1;::::0;52244:22;;52295:24:::1;::::0;4280:18:1;;52295:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52378:16;::::0;52347:56:::1;::::0;-1:-1:-1;;;52347:56:0;;-1:-1:-1;;;;;52378:16:0;;::::1;52347:56;::::0;::::1;4543:51:1::0;4610:18;;;4603:34;;;52278:56:0;;-1:-1:-1;52347:22:0;::::1;::::0;::::1;::::0;4516:18:1;;52347:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52546:16:0::1;::::0;52504:21:::1;::::0;-1:-1:-1;;;;;52546:16:0::1;:64;52633:4;52653:6:::0;52688:3:::1;52675:9;52653:6:::0;52682:2:::1;52675:9;:::i;:::-;52674:17;;;;:::i;:::-;52720:3;52707:9;:6:::0;52714:2:::1;52707:9;:::i;:::-;52706:17;;;;:::i;:::-;52746:4;52766:15;52546:250;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52807:21:0::1;52831:39;52853:17:::0;52831:21:::1;:39;:::i;:::-;52807:63;;52899:13;52881:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;52934:13:0;;-1:-1:-1;;;;;51968:1015:0;:::o;28411:65::-;28463:13;28403:1;28463:2;:13;:::i;:::-;28450:26;;:10;:26;:::i;:::-;28411:65;:::o;55226:392::-;55326:4;55343:36;55353:6;55361:9;55372:6;55343:9;:36::i;:::-;-1:-1:-1;;;;;55419:19:0;;55392:24;55419:19;;;:11;:19;;;;;;;;55439:10;55419:31;;;;;;;;55469:26;;;;55461:59;;;;-1:-1:-1;;;55461:59:0;;9996:2:1;55461:59:0;;;9978:21:1;10035:2;10015:18;;;10008:30;-1:-1:-1;;;10054:18:1;;;10047:50;10114:18;;55461:59:0;9968:170:1;55461:59:0;55533:55;55542:6;55550:10;55562:25;55581:6;55562:16;:25;:::i;:::-;55533:8;:55::i;:::-;-1:-1:-1;55606:4:0;;55226:392;-1:-1:-1;;;;55226:392:0:o;48103:83::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;48158:20:::1;:18;:20::i;:::-;48103:83::o:0;46702:201::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;46796:41:::1;:14;46818:18:::0;46796:21:::1;:41::i;:::-;-1:-1:-1::0;46853:42:0::1;::::0;-1:-1:-1;;;;;46853:42:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;46853:42:0;;;::::1;46702:201:::0;:::o;55653:205::-;55761:10;55735:4;55782:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;55782:32:0;;;;;;;;;;55735:4;;55752:76;;55773:7;;55782:45;;55817:10;;55782:45;:::i;51215:695::-;51275:17;;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;51410:20:::1;;51391:15;:39;;51383:68;;;;-1:-1:-1::0;;;51383:68:0::1;;;;;;;:::i;:::-;51521:22;::::0;51572:39:::1;::::0;-1:-1:-1;;;51572:39:0;;51605:4:::1;51572:39;::::0;::::1;4307:51:1::0;51521:22:0;;;::::1;-1:-1:-1::0;;;;;51521:22:0::1;::::0;51472:30:::1;::::0;51521:22;;51572:24:::1;::::0;4280:18:1;;51572:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51710:10;::::0;51686:43:::1;::::0;-1:-1:-1;;;51686:43:0;;-1:-1:-1;;;;;51710:10:0;;::::1;51686:43;::::0;::::1;4543:51:1::0;4610:18;;;4603:34;;;51555:56:0;;-1:-1:-1;51686:23:0;::::1;::::0;::::1;::::0;4516:18:1;;51686:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;51769:10:0::1;::::0;51745:43:::1;::::0;17297:25:1;;;-1:-1:-1;;;;;51769:10:0;;::::1;::::0;51762:4:::1;::::0;-1:-1:-1;;;;;;;;;;;51745:43:0;17285:2:1;17270:18;51745:43:0::1;;;;;;;51811:10;::::0;-1:-1:-1;;;;;51811:10:0::1;::::0;-1:-1:-1;51845:6:0;-1:-1:-1;;51215:695:0;;:::o;43603:486::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;43699:16:::1;;43691:6;:24;;43683:91;;;::::0;-1:-1:-1;;;43683:91:0;;7291:2:1;43683:91:0::1;::::0;::::1;7273:21:1::0;7330:2;7310:18;;;7303:30;7369:34;7349:18;;;7342:62;-1:-1:-1;;;7420:18:1;;;7413:43;7473:19;;43683:91:0::1;7263:235:1::0;43683:91:0::1;43803:6;43785:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43828:10:0::1;::::0;-1:-1:-1;;;;;43828:10:0::1;43820:47;43863:3;43850:9;:6:::0;43857:2:::1;43850:9;:::i;:::-;43849:17;;;;:::i;:::-;43820:47;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43886:9:0::1;::::0;-1:-1:-1;;;;;43886:9:0::1;43878:55;43928:3;43915:9;:6:::0;43922:2:::1;43915:9;:::i;:::-;43914:17;;;;:::i;:::-;43907:24;::::0;:6;:24:::1;:::i;:::-;43878:55;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43973:10:0::1;::::0;-1:-1:-1;;;;;43973:10:0::1;43966:4;-1:-1:-1::0;;;;;;;;;;;43999:3:0::1;43986:9;:6:::0;43993:2:::1;43986:9;:::i;:::-;43985:17;;;;:::i;:::-;43949:54;::::0;17297:25:1;;;17285:2;17270:18;43949:54:0::1;;;;;;;44043:9;::::0;-1:-1:-1;;;;;44043:9:0::1;44036:4;-1:-1:-1::0;;;;;;;;;;;44076:3:0::1;44063:9;:6:::0;44070:2:::1;44063:9;:::i;:::-;44062:17;;;;:::i;:::-;44055:24;::::0;:6;:24:::1;:::i;:::-;44019:62;::::0;17297:25:1;;;17285:2;17270:18;44019:62:0::1;;;;;;;43603:486:::0;:::o;53069:268::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;53159:20:::1;;53140:15;:39;;53132:68;;;;-1:-1:-1::0;;;53132:68:0::1;;;;;;;:::i;:::-;53225:10;::::0;:51:::1;::::0;53212:9:::1;::::0;-1:-1:-1;;;;;53225:10:0::1;::::0;53249:21:::1;::::0;53212:9;53225:51;53212:9;53225:51;53249:21;53225:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53211:65;;;53295:4;53287:42;;;::::0;-1:-1:-1;;;53287:42:0;;13343:2:1;53287:42:0::1;::::0;::::1;13325:21:1::0;13382:2;13362:18;;;13355:30;-1:-1:-1;;;13401:18:1;;;13394:46;13457:18;;53287:42:0::1;13315:166:1::0;53287:42:0::1;9091:1;53069:268::o:0;50032:243::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50136:35:0;::::1;50128:84;;;;-1:-1:-1::0;;;50128:84:0::1;;;;;;;:::i;:::-;50223:22;:44:::0;;-1:-1:-1;;;;;50223:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;50223:44:0;;::::1;::::0;;;::::1;::::0;;50032:243::o;47001:1048::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;47161:14:::1;47201::::0;47176:24:::1;47186:14:::0;47176:9;:24:::1;:::i;:::-;:39;;;;:::i;:::-;47161:54;;47234:8;:13;;47244:3;47234:13;47226:64;;;::::0;-1:-1:-1;;;47226:64:0;;10689:2:1;47226:64:0::1;::::0;::::1;10671:21:1::0;10728:2;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;-1:-1:-1;;;10818:18:1;;;10811:36;10864:19;;47226:64:0::1;10661:228:1::0;47226:64:0::1;47319:2;47309:6;:12;;;;47301:95;;;::::0;-1:-1:-1;;;47301:95:0;;8524:2:1;47301:95:0::1;::::0;::::1;8506:21:1::0;8563:2;8543:18;;;8536:30;8602:34;8582:18;;;8575:62;8673:31;8653:18;;;8646:59;8722:19;;47301:95:0::1;8496:251:1::0;47301:95:0::1;47426:2;47415:7;:13;;;;47407:97;;;::::0;-1:-1:-1;;;47407:97:0;;14033:2:1;47407:97:0::1;::::0;::::1;14015:21:1::0;14072:2;14052:18;;;14045:30;14111:34;14091:18;;;14084:62;14182:32;14162:18;;;14155:60;14232:19;;47407:97:0::1;14005:252:1::0;47407:97:0::1;47538:2;47523:11;:17;;;;47515:105;;;::::0;-1:-1:-1;;;47515:105:0;;14464:2:1;47515:105:0::1;::::0;::::1;14446:21:1::0;14503:2;14483:18;;;14476:30;14542:34;14522:18;;;14515:62;14613:34;14593:18;;;14586:62;-1:-1:-1;;;14664:19:1;;;14657:33;14707:19;;47515:105:0::1;14436:296:1::0;47515:105:0::1;47642:9;47633:8;;:18;;;;;;;;;;;;;;;;;;47676:14;47662:13;;:28;;;;;;;;;;;;;;;;;;47715:14;47701:13;;:28;;;;;;;;;;;;;;;;;;47758:6;47750:7;;:14;;;;;;;;;;;;;;;;;;47784:7;47775:8;;:16;;;;;;;;;;;;;;;;;;47815:11;47802:12;;:24;;;;;;;;;;;;;;;;;;47860:8;;;;;;;;;;;47844:25;;-1:-1:-1::0;;;;;;;;;;;47844:25:0::1;;;;;;;;;47901:13;::::0;47885:30:::1;::::0;47901:13;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;47885:30:0;;;::::1;47947:7;::::0;47931:24:::1;::::0;47947:7:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;47931:24:0;47947:7:::1;::::0;47931:24:::1;47987:8;::::0;47971:25:::1;::::0;47987:8:::1;::::0;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;47971:25:0;;;::::1;48028:12;::::0;48012:29:::1;::::0;48028:12;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48012:29:0;;;::::1;9091:1;47001:1048:::0;;;;;;:::o;43188:408::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;43271:16:::1;::::0;;43256:14:::1;43298:18:::0;;;43335:10:::1;::::0;-1:-1:-1;;;;;43335:10:0::1;43327:47;43370:3;43357:9;43271:16:::0;43364:2:::1;43357:9;:::i;46167:181::-:0;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;46252:33:::1;:9;46269:15:::0;46252:16:::1;:33::i;50522:232::-:0;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;50622:57:::1;50644:34;50663:15;50644:18:::0;:34:::1;:::i;:::-;50622:21;:57::i;:::-;50711:34;50730:15;50711:18:::0;:34:::1;:::i;:::-;50695:51;::::0;-1:-1:-1;;;;;;;;;;;50695:51:0;;;::::1;50522:232:::0;:::o;41857:151::-;41900:15;;41961:13;28403:1;41961:2;:13;:::i;:::-;41948:12;;:26;;;;:::i;:::-;41986:13;28403:1;41986:2;:13;:::i;:::-;41976:9;;:23;;;;:::i;:::-;41941:59;;;;41857:151;;:::o;9451:142::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;9552:1:::1;9536:6:::0;;9515:40:::1;::::0;-1:-1:-1;;;;;9536:6:0;;::::1;::::0;9515:40:::1;::::0;9552:1;;9515:40:::1;9583:1;9566:19:::0;;-1:-1:-1;;;;;;9566:19:0::1;::::0;;9451:142::o;49837:129::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;49896:14:::1;:19:::0;;-1:-1:-1;;49896:19:0::1;;;::::0;;49943:15:::1;49926:16;:32:::0;49837:129::o;42856:109::-;42943:11;;42927:27;;:15;:27;:::i;:::-;42915:10;42906:20;;;;:8;:20;;;;;:48;42856:109::o;53844:7::-;53837:14;;53765:94;:::o;48198:247::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48288:23:0;::::1;48280:72;;;;-1:-1:-1::0;;;48280:72:0::1;;;;;;;:::i;:::-;48363:15;:25:::0;;-1:-1:-1;;;;;;48363:25:0::1;-1:-1:-1::0;;;;;48363:25:0;::::1;::::0;;::::1;::::0;;;48404:33:::1;::::0;-1:-1:-1;;;;;;;;;;;48404:33:0;-1:-1:-1;;48404:33:0::1;48198:247:::0;:::o;44521:252::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44609:27:0;::::1;44601:74;;;;-1:-1:-1::0;;;44601:74:0::1;;;;;;;:::i;:::-;44684:10;:33:::0;;-1:-1:-1;;;;;;44684:33:0::1;-1:-1:-1::0;;;;;44684:33:0;::::1;::::0;;::::1;::::0;;;44731:34:::1;::::0;-1:-1:-1;;;;;;;;;;;44731:34:0;-1:-1:-1;;44731:34:0::1;44521:252:::0;:::o;44174:165::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;44255:16:::1;:23:::0;;-1:-1:-1;;44255:23:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44294:37:::1;::::0;44255:23:::1;44314:16:::0;;;44294:37:::1;;::::0;::::1;::::0;-1:-1:-1;;44294:37:0::1;44174:165:::0;:::o;48548:1045::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;48786:3:::1;48767:18;;:22;;;;:::i;:::-;48754:12;:35;48746:110;;;::::0;-1:-1:-1;;;48746:110:0;;12562:2:1;48746:110:0::1;::::0;::::1;12544:21:1::0;12601:2;12581:18;;;12574:30;12640:34;12620:18;;;12613:62;-1:-1:-1;;;12691:18:1;;;12684:51;12752:19;;48746:110:0::1;12534:243:1::0;48746:110:0::1;48934:13;28403:1;48934:2;:13;:::i;:::-;48918:29;::::0;:15;:29:::1;:::i;:::-;48902:45:::0;-1:-1:-1;48984:13:0::1;28403:1;48984:2;:13;:::i;:::-;48971:26;::::0;:12;:26:::1;:::i;:::-;48958:39;;49064:26;28685:2;49091:38;;:18;;:38;;;;:::i;:::-;49064:65;;49140:23;28797:3;49164:35;;:18;;:35;;;;:::i;:::-;49140:59;;49238:18;49221:15;:35;;49212:103;;;::::0;-1:-1:-1;;;49212:103:0;;8112:2:1;49212:103:0::1;::::0;::::1;8094:21:1::0;8151:2;8131:18;;;8124:30;8190:34;8170:18;;;8163:62;-1:-1:-1;;;8241:18:1;;;8234:41;8292:19;;49212:103:0::1;8084:233:1::0;49212:103:0::1;49349:15;49335:12;:29;;49326:94;;;::::0;-1:-1:-1;;;49326:94:0;;11440:2:1;49326:94:0::1;::::0;::::1;11422:21:1::0;11479:2;11459:18;;;11452:30;11518:34;11498:18;;;11491:62;-1:-1:-1;;;11569:18:1;;;11562:38;11617:19;;49326:94:0::1;11412:230:1::0;49326:94:0::1;49433:12;:30:::0;;;49474:9:::1;:24:::0;;;49514:29:::1;::::0;49448:15;;-1:-1:-1;;;;;;;;;;;49514:29:0;-1:-1:-1;;49514:29:0::1;49575:9;::::0;49559:26:::1;::::0;-1:-1:-1;;;;;;;;;;;49559:26:0;;;::::1;9091:1;;48548:1045:::0;;:::o;55866:342::-;56009:10;55953:4;55997:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;55997:32:0;;;;;;;;;;56048:35;;;;56040:60;;;;-1:-1:-1;;;56040:60:0;;16819:2:1;56040:60:0;;;16801:21:1;16858:2;16838:18;;;16831:30;-1:-1:-1;;;16877:18:1;;;16870:42;16929:18;;56040:60:0;16791:162:1;56040:60:0;56113:65;56122:10;56134:7;56143:34;56162:15;56143:16;:34;:::i;56113:65::-;-1:-1:-1;56196:4:0;;55866:342;-1:-1:-1;;;55866:342:0:o;54422:167::-;54502:4;54519:40;54529:10;54541:9;54552:6;54519:9;:40::i;45092:156::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;45164:15:::1;:24:::0;;-1:-1:-1;;45164:24:0::1;;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;45204:36:::1;::::0;45164:24:::1;45224:15:::0;;;::::1;;45204:36;;::::0;::::1;::::0;-1:-1:-1;;45204:36:0::1;45092:156:::0;:::o;41488:222::-;41555:7;41593:20;;41577:15;:36;41574:110;;;41657:15;41636:20;;:36;;;;:::i;41574:110::-;-1:-1:-1;41701:1:0;;41488:222::o;41718:131::-;41767:7;41828:13;28403:1;41828:2;:13;:::i;:::-;41808:18;;28463:13;28403:1;28463:2;:13;:::i;:::-;28450:26;;:10;:26;:::i;:::-;41794:32;;;;:::i;:::-;41793:48;;;;:::i;45687:179::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;45771:19:::1;:35:::0;;;45822:36:::1;::::0;45793:13;;-1:-1:-1;;;;;;;;;;;45822:36:0;;;::::1;45687:179:::0;:::o;44785:246::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44871:26:0;::::1;44863:73;;;;-1:-1:-1::0;;;44863:73:0::1;;;;;;;:::i;:::-;44945:9;:31:::0;;-1:-1:-1;;;;;;44945:31:0::1;-1:-1:-1::0;;;;;44945:31:0;::::1;::::0;;::::1;::::0;;;44990:33:::1;::::0;-1:-1:-1;;;;;;;;;;;44990:33:0;-1:-1:-1;;44990:33:0::1;44785:246:::0;:::o;44345:164::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;44448:13:::1;28403:1;44448:2;:13;:::i;:::-;44433:28;::::0;:12;:28:::1;:::i;:::-;44423:9;:38:::0;;;44475:26:::1;::::0;-1:-1:-1;;;;;;;;;;;44475:26:0;;;::::1;44345:164:::0;:::o;45317:246::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;28976:9:::1;45410:30:::0;::::1;;45402:64;;;::::0;-1:-1:-1;;;45402:64:0;;9645:2:1;45402:64:0::1;::::0;::::1;9627:21:1::0;9684:2;9664:18;;;9657:30;-1:-1:-1;;;9703:18:1;;;9696:52;9765:18;;45402:64:0::1;9617:172:1::0;45402:64:0::1;45481:11;:26:::0;;;45527:28:::1;::::0;45493:14;;-1:-1:-1;;;;;;;;;;;45527:28:0;;;::::1;45317:246:::0;:::o;42331:275::-;-1:-1:-1;;;;;42453:24:0;;42418:7;42453:24;;;:8;:24;;;;;;42500:15;42490:25;;42487:71;;-1:-1:-1;42546:1:0;;42331:275;-1:-1:-1;;42331:275:0:o;42487:71::-;42574:24;42583:15;42574:8;:24;:::i;:::-;42567:31;42331:275;-1:-1:-1;;;42331:275:0:o;46428:193::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;46517:38:::1;:14;46536:18:::0;46517::::1;:38::i;9748:238::-:0;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9831:22:0;::::1;9823:73;;;::::0;-1:-1:-1;;;9823:73:0;;7705:2:1;9823:73:0::1;::::0;::::1;7687:21:1::0;7744:2;7724:18;;;7717:30;7783:34;7763:18;;;7756:62;-1:-1:-1;;;7834:18:1;;;7827:36;7880:19;;9823:73:0::1;7677:228:1::0;9823:73:0::1;9933:6;::::0;;9912:38:::1;::::0;-1:-1:-1;;;;;9912:38:0;;::::1;::::0;9933:6;::::1;::::0;9912:38:::1;::::0;::::1;9961:6;:17:::0;;-1:-1:-1;;;;;;9961:17:0::1;-1:-1:-1::0;;;;;9961:17:0;;;::::1;::::0;;;::::1;::::0;;9748:238::o;45934:166::-;9033:10;9022:7;8848;8875:6;-1:-1:-1;;;;;8875:6:0;;8810:79;9022:7;-1:-1:-1;;;;;9022:21:0;;9014:66;;;;-1:-1:-1;;;9014:66:0;;;;;;;:::i;:::-;46013:27:::1;:9;46027:12:::0;24501:152;24571:4;24595:50;24600:3;-1:-1:-1;;;;;24620:23:0;;24595:4;:50::i;54919:299::-;-1:-1:-1;;;;;55012:19:0;;55004:49;;;;-1:-1:-1;;;55004:49:0;;8954:2:1;55004:49:0;;;8936:21:1;8993:2;8973:18;;;8966:30;-1:-1:-1;;;9012:18:1;;;9005:47;9069:18;;55004:49:0;8926:167:1;55004:49:0;-1:-1:-1;;;;;55072:21:0;;55064:49;;;;-1:-1:-1;;;55064:49:0;;11096:2:1;55064:49:0;;;11078:21:1;11135:2;11115:18;;;11108:30;-1:-1:-1;;;11154:18:1;;;11147:45;11209:18;;55064:49:0;11068:165:1;55064:49:0;-1:-1:-1;;;;;55126:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;55178:32;;17297:25:1;;;55178:32:0;;17270:18:1;55178:32:0;;;;;;;54919:299;;;:::o;31813:1540::-;-1:-1:-1;;;;;31909:20:0;;31901:51;;;;-1:-1:-1;;;31901:51:0;;6246:2:1;31901:51:0;;;6228:21:1;6285:2;6265:18;;;6258:30;-1:-1:-1;;;6304:18:1;;;6297:48;6362:18;;31901:51:0;6218:168:1;31901:51:0;-1:-1:-1;;;;;31971:23:0;;31963:52;;;;-1:-1:-1;;;31963:52:0;;9300:2:1;31963:52:0;;;9282:21:1;9339:2;9319:18;;;9312:30;-1:-1:-1;;;9358:18:1;;;9351:46;9414:18;;31963:52:0;9272:166:1;31963:52:0;32108:15;32127:26;:9;32146:6;32127:18;:26::i;:::-;:59;;;-1:-1:-1;32157:29:0;:9;32176;32157:18;:29::i;:::-;32108:79;-1:-1:-1;32286:23:0;-1:-1:-1;;;;;32311:21:0;;32327:4;32311:21;;:49;;-1:-1:-1;;;;;;32336:24:0;;32355:4;32336:24;32311:49;32495:16;;32562:21;;32286:75;;-1:-1:-1;;;;;;32495:16:0;;;;32463:23;;32552:31;;;-1:-1:-1;;;32562:21:0;;;;32552:31;:63;;;;;32600:15;-1:-1:-1;;;;;32587:28:0;:9;-1:-1:-1;;;;;32587:28:0;;32552:63;32551:144;;;-1:-1:-1;32644:21:0;;-1:-1:-1;;;;;32631:34:0;;;-1:-1:-1;;;32644:21:0;;;;32631:34;:63;;;;;32679:15;-1:-1:-1;;;;;32669:25:0;:6;-1:-1:-1;;;;;32669:25:0;;32631:63;32817:21;;32523:173;;-1:-1:-1;32798:10:0;;-1:-1:-1;;;;;32809:29:0;;;-1:-1:-1;;;32817:21:0;;;;32809:29;;:57;;;32851:15;-1:-1:-1;;;;;32841:25:0;:6;-1:-1:-1;;;;;32841:25:0;;32809:57;32900:21;;32798:68;;-1:-1:-1;32877:11:0;;-1:-1:-1;;;;;32889:32:0;;;-1:-1:-1;;;32900:21:0;;;;32889:32;;:63;;;32937:15;-1:-1:-1;;;;;32924:28:0;:9;-1:-1:-1;;;;;32924:28:0;;32889:63;32877:75;;32993:18;:41;;;;33015:19;32993:41;:55;;;;33038:10;32993:55;32990:356;;;33064:43;33081:6;33089:9;33100:6;33064:16;:43::i;:::-;32990:356;;;33226:14;;;;;;;33218:49;;;;-1:-1:-1;;;33218:49:0;;12210:2:1;33218:49:0;;;12192:21:1;12249:2;12229:18;;;12222:30;12288:25;12268:18;;;12261:53;12331:18;;33218:49:0;12182:173:1;33218:49:0;33282:52;33297:6;33304:9;33314:6;33321:5;33327:6;33282:14;:52::i;:::-;31813:1540;;;;;;;;;:::o;38462:1582::-;38210:27;:34;;-1:-1:-1;;38210:34:0;38240:4;38210:34;;;;;;38564:4:::1;38210:27:::0;38546:24;;;::::1;::::0;;;;;;;;38611:13:::1;::::0;38546:24;;38210:27;38597::::1;::::0;38611:13;;::::1;38210:34:::0;38611:13;;::::1;::::0;38597;;::::1;;:27;:::i;:::-;38581:43;;;;38635:19;38657;;38635:41;;38803:11;38787:15;:27;:40;;;-1:-1:-1::0;38816:11:0::1;::::0;::::1;::::0;38787:40:::1;38784:77;;;38843:7;;;;;38784:77;38981:13;::::0;38942:25:::1;::::0;38968:36:::1;::::0;::::1;::::0;38969:25:::1;::::0;38981:13;;::::1;;;38969:11:::0;:25:::1;:::i;:::-;38968:36;;;;:::i;:::-;38942:62:::0;-1:-1:-1;39015:25:0::1;39042:29;38942:62:::0;39042:11;:29:::1;:::i;:::-;39015:56:::0;-1:-1:-1;39132:16:0::1;39149:19;39167:1;39149:17:::0;:19:::1;:::i;:::-;39132:36:::0;-1:-1:-1;39179:19:0::1;39199:26;39132:36:::0;39199:17;:26:::1;:::i;:::-;39179:46:::0;-1:-1:-1;39308:17:0::1;39326:29;39338:17:::0;39179:46;39326:29:::1;:::i;:::-;39308:47:::0;-1:-1:-1;39434:21:0::1;39466:27;39308:47:::0;39466:16:::1;:27::i;:::-;39504:14;39520:41;39544:17:::0;39520:21:::1;:41;:::i;:::-;39504:58:::0;-1:-1:-1;39662:14:0::1;39700:9:::0;39680:18:::1;39687:11:::0;39504:58;39680:18:::1;:::i;:::-;39679:30;;;;:::i;:::-;39662:47;;39720:31;39734:8;39744:6;39720:13;:31::i;:::-;-1:-1:-1::0;39876:21:0::1;::::0;-1:-1:-1;39899:41:0::1;39923:17:::0;39899:21:::1;:41;:::i;:::-;39876:65;;40023:13;40005:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;;;;;;38255:1:0::1;38267:27:::0;:35;;-1:-1:-1;;38267:35:0;;;38462:1582::o;24829:158::-;24902:4;24926:53;24934:3;-1:-1:-1;;;;;24954:23:0;;24926:7;:53::i;50807:343::-;50963:20;;50949:13;:34;50941:103;;;;-1:-1:-1;;;50941:103:0;;15295:2:1;50941:103:0;;;15277:21:1;15334:2;15314:18;;;15307:30;15373:34;15353:18;;;15346:62;-1:-1:-1;;;15424:18:1;;;15417:45;15479:19;;50941:103:0;15267:237:1;50941:103:0;51055:20;:34;;;51105:37;;51076:13;;-1:-1:-1;;;;;;;;;;;51105:37:0;;;;50807:343;:::o;19556:414::-;19619:4;21882:19;;;:12;;;:19;;;;;;19636:327;;-1:-1:-1;19679:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;19862:18;;19840:19;;;:12;;;:19;;;;;;:40;;;;19895:11;;19636:327;-1:-1:-1;19946:5:0;19939:12;;25073:167;-1:-1:-1;;;;;25207:23:0;;25153:4;21882:19;;;:12;;;:19;;;;;;:24;;25177:55;21785:129;36653:400;-1:-1:-1;;;;;36772:17:0;;36748:21;36772:17;;;:9;:17;;;;;;36808:23;;;;36800:60;;;;-1:-1:-1;;;36800:60:0;;6938:2:1;36800:60:0;;;6920:21:1;6977:2;6957:18;;;6950:30;-1:-1:-1;;;6996:18:1;;;6989:54;7060:18;;36800:60:0;6910:174:1;36800:60:0;36896:27;36909:6;36916;36896:12;:27::i;:::-;36956:28;36966:9;36977:6;36956:9;:28::i;:::-;37026:9;-1:-1:-1;;;;;37010:33:0;37019:6;-1:-1:-1;;;;;37010:33:0;-1:-1:-1;;;;;;;;;;;37036:6:0;37010:33;;;;17297:25:1;;17285:2;17270:18;;17252:76;37010:33:0;;;;;;;;36653:400;;;;:::o;33423:3183::-;-1:-1:-1;;;;;33566:20:0;;;33539:24;33566:20;;;:9;:20;;;;;;;33621:17;;;;;;;;33657:23;;;;33649:60;;;;-1:-1:-1;;;33649:60:0;;6938:2:1;33649:60:0;;;6920:21:1;6977:2;6957:18;;;6950:30;-1:-1:-1;;;6996:18:1;;;6989:54;7060:18;;33649:60:0;6910:174:1;33649:60:0;33722:9;33745:6;33742:1673;;;33832:9;;33824:6;:17;;33816:44;;;;-1:-1:-1;;;33816:44:0;;10345:2:1;33816:44:0;;;10327:21:1;10384:2;10364:18;;;10357:30;-1:-1:-1;;;10403:18:1;;;10396:45;10458:18;;33816:44:0;10317:165:1;33816:44:0;33883:31;:14;33907:6;33883:23;:31::i;:::-;:40;33875:73;;;;-1:-1:-1;;;33875:73:0;;15711:2:1;33875:73:0;;;15693:21:1;15750:2;15730:18;;;15723:30;-1:-1:-1;;;15769:18:1;;;15762:50;15829:18;;33875:73:0;15683:170:1;33875:73:0;34005:11;;33986:16;;:30;;;;:::i;:::-;33967:15;:49;;:77;;;;;34020:19;;34043:1;34020:24;33967:77;33963:186;;;34065:26;:14;34084:6;34065:18;:26::i;:::-;-1:-1:-1;34115:18:0;;-1:-1:-1;;;;;34115:18:0;;;;;;;;33963:186;-1:-1:-1;34167:8:0;;;;;;;33742:1673;;;34200:5;34197:1218;;;34345:12;;34320:23;34337:6;34320:16;:23;:::i;:::-;:37;;34312:65;;;;-1:-1:-1;;;34312:65:0;;13688:2:1;34312:65:0;;;13670:21:1;13727:2;13707:18;;;13700:30;-1:-1:-1;;;13746:18:1;;;13739:46;13802:18;;34312:65:0;13660:166:1;34312:65:0;34401:9;;34391:6;:19;;34383:65;;;;-1:-1:-1;;;34383:65:0;;16060:2:1;34383:65:0;;;16042:21:1;16099:2;16079:18;;;16072:30;16138:34;16118:18;;;16111:62;-1:-1:-1;;;16189:18:1;;;16182:32;16231:19;;34383:65:0;16032:224:1;34383:65:0;34471:34;:14;34495:9;34471:23;:34::i;:::-;:43;34463:76;;;;-1:-1:-1;;;34463:76:0;;15711:2:1;34463:76:0;;;15693:21:1;15750:2;15730:18;;;15723:30;-1:-1:-1;;;15769:18:1;;;15762:50;15829:18;;34463:76:0;15683:170:1;34463:76:0;34596:11;;34577:16;;:30;;;;:::i;:::-;34558:15;:49;;:77;;;;;34611:19;;34634:1;34611:24;34558:77;34554:192;;;34656:29;:14;34675:9;34656:18;:29::i;:::-;-1:-1:-1;34709:21:0;;-1:-1:-1;;;;;34709:21:0;;;;;;;;34554:192;-1:-1:-1;34764:7:0;;;;34197:1218;;;34915:31;:14;34939:6;34915:23;:31::i;:::-;:40;34907:80;;;;-1:-1:-1;;;34907:80:0;;16463:2:1;34907:80:0;;;16445:21:1;16502:2;16482:18;;;16475:30;16541:29;16521:18;;;16514:57;16588:18;;34907:80:0;16435:177:1;34907:80:0;35010:34;:14;35034:9;35010:23;:34::i;:::-;:43;35002:86;;;;-1:-1:-1;;;35002:86:0;;12984:2:1;35002:86:0;;;12966:21:1;13023:2;13003:18;;;12996:30;13062:32;13042:18;;;13035:60;13112:18;;35002:86:0;12956:180:1;35002:86:0;35136:12;;35111:23;35128:6;35111:16;:23;:::i;:::-;:37;;35103:65;;;;-1:-1:-1;;;35103:65:0;;13688:2:1;35103:65:0;;;13670:21:1;13727:2;13707:18;;;13700:30;-1:-1:-1;;;13746:18:1;;;13739:46;13802:18;;35103:65:0;13660:166:1;35103:65:0;35225:11;;35206:16;;:30;;;;:::i;:::-;35187:15;:49;;:77;;;;;35240:19;;35263:1;35240:24;35187:77;35183:186;;;35285:26;:14;35304:6;35285:18;:26::i;:::-;-1:-1:-1;35335:18:0;;-1:-1:-1;;;;;35335:18:0;;;;;;;;35183:186;-1:-1:-1;35387:12:0;;;;;;;34197:1218;35752:21;;-1:-1:-1;;;;;35744:29:0;;;-1:-1:-1;;;35752:21:0;;;;35744:29;;;;35743:52;;-1:-1:-1;35778:16:0;;;;35777:17;35743:52;:84;;;;-1:-1:-1;35799:27:0;;;;35798:28;35743:84;:92;;;;;35829:6;35743:92;35740:130;;;35850:20;:18;:20::i;:::-;35939:23;35963:36;35977:6;35985:3;35990:8;;;;;;;;;;;35963:13;:36::i;:::-;36073:13;;35939:60;;-1:-1:-1;36010:21:0;;36032:55;;36046:6;;36054:3;;36059:27;;36073:13;;;;;;;36059;;;;:27;:::i;:::-;36032:13;:55::i;:::-;36010:77;-1:-1:-1;36151:19:0;36179:31;36010:77;36179:15;:31;:::i;:::-;36171:40;;:6;:40;:::i;:::-;36151:60;;36249:27;36262:6;36269;36249:12;:27::i;:::-;36371:4;36353:24;;;;:9;:24;;;;;:41;;36381:13;;36353:24;:41;;36381:13;;36353:41;:::i;:::-;;;;;;;;36449:15;36429:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;36499:33:0;;-1:-1:-1;36509:9:0;36520:11;36499:9;:33::i;:::-;36574:9;-1:-1:-1;;;;;36558:38:0;36567:6;-1:-1:-1;;;;;36558:38:0;-1:-1:-1;;;;;;;;;;;36584:11:0;36558:38;;;;17297:25:1;;17285:2;17270:18;;17252:76;36558:38:0;;;;;;;;33423:3183;;;;;;;;;;;:::o;40094:461::-;40187:16;;40155:58;;40172:4;;-1:-1:-1;;;;;40187:16:0;40206:6;40155:8;:58::i;:::-;40248:16;;;40262:1;40248:16;;;;;;;;40224:21;;40248:16;;;;;;;;;;-1:-1:-1;40248:16:0;40224:40;;40293:4;40275;40280:1;40275:7;;;;;;-1:-1:-1;;;40275:7:0;;;;;;;;;-1:-1:-1;;;;;40275:23:0;;;:7;;;;;;;;;;:23;;;;40319:16;;:23;;;-1:-1:-1;;;40319:23:0;;;;:16;;;;;:21;;:23;;;;;40275:7;;40319:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40309:4;40314:1;40309:7;;;;;;-1:-1:-1;;;40309:7:0;;;;;;;;;-1:-1:-1;;;;;40309:33:0;;;:7;;;;;;;;;:33;40355:16;;:192;;-1:-1:-1;;;40355:192:0;;:16;;;:67;;:192;;40437:6;;40355:16;;40474:4;;40501;;40521:15;;40355:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40094:461;;:::o;40682:686::-;40762:19;40783:21;40829:9;40817:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;40849:14:0;;-1:-1:-1;40883:3:0;40867:12;:9;40877:2;40867:12;:::i;:::-;40866:20;;;;:::i;:::-;40849:37;-1:-1:-1;40897:17:0;40936:3;40918:14;:11;40930:2;40918:14;:::i;:::-;40917:22;;;;:::i;:::-;40982:16;;40897:42;;-1:-1:-1;40950:63:0;;40967:4;;-1:-1:-1;;;;;40982:16:0;41001:11;40950:8;:63::i;:::-;41024:16;;:218;;-1:-1:-1;;;41024:218:0;;-1:-1:-1;;;;;41024:16:0;;;;:32;;41064:9;;41024:218;;41097:4;;41117:11;;41143:9;;41167:6;;41097:4;;41216:15;;41024:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41267:11:0;;41305:9;;-1:-1:-1;;;;;;40682:686:0:o;20146:1553::-;20212:4;20351:19;;;:12;;;:19;;;;;;20387:15;;20383:1309;;20749:21;20773:14;20786:1;20773:10;:14;:::i;:::-;20822:18;;20749:38;;-1:-1:-1;20802:17:0;;20822:22;;20843:1;;20822:22;:::i;:::-;20802:42;;21089:17;21109:3;:11;;21121:9;21109:22;;;;;;-1:-1:-1;;;21109:22:0;;;;;;;;;;;;;;;;;21089:42;;21255:9;21226:3;:11;;21238:13;21226:26;;;;;;-1:-1:-1;;;21226:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;21332:23;;;:12;;;:23;;;;;;:36;;;21493:17;;21332:3;;21493:17;;;-1:-1:-1;;;21493:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;21588:3;:12;;:19;21601:5;21588:19;;;;;;;;;;;21581:26;;;21631:4;21624:11;;;;;;;;20383:1309;21675:5;21668:12;;;;;37653:228;-1:-1:-1;;;;;37788:15:0;;37770:17;37788:15;;;:9;:15;;;;;;:22;;37804:6;;37788:22;:::i;:::-;-1:-1:-1;;;;;37848:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;37653:228:0:o;37389:225::-;-1:-1:-1;;;;;37521:15:0;;37503:17;37521:15;;;:9;:15;;;;;;:22;;37537:6;;37521:22;:::i;37108:156::-;37198:7;37251:5;37237:10;37226:21;;37233:3;37226:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;37225:31;;;;:::i;:::-;37218:38;37108:156;-1:-1:-1;;;;37108:156:0:o;14::1:-;80:20;;140:4;129:16;;119:27;;109:2;;160:1;157;150:12;109:2;61:109;;;:::o;175:257::-;234:6;287:2;275:9;266:7;262:23;258:32;255:2;;;308:6;300;293:22;255:2;352:9;339:23;371:31;396:5;371:31;:::i;437:261::-;507:6;560:2;548:9;539:7;535:23;531:32;528:2;;;581:6;573;566:22;528:2;618:9;612:16;637:31;662:5;637:31;:::i;703:398::-;771:6;779;832:2;820:9;811:7;807:23;803:32;800:2;;;853:6;845;838:22;800:2;897:9;884:23;916:31;941:5;916:31;:::i;:::-;966:5;-1:-1:-1;1023:2:1;1008:18;;995:32;1036:33;995:32;1036:33;:::i;:::-;1088:7;1078:17;;;790:311;;;;;:::o;1106:466::-;1183:6;1191;1199;1252:2;1240:9;1231:7;1227:23;1223:32;1220:2;;;1273:6;1265;1258:22;1220:2;1317:9;1304:23;1336:31;1361:5;1336:31;:::i;:::-;1386:5;-1:-1:-1;1443:2:1;1428:18;;1415:32;1456:33;1415:32;1456:33;:::i;:::-;1210:362;;1508:7;;-1:-1:-1;;;1562:2:1;1547:18;;;;1534:32;;1210:362::o;1577:325::-;1645:6;1653;1706:2;1694:9;1685:7;1681:23;1677:32;1674:2;;;1727:6;1719;1712:22;1674:2;1771:9;1758:23;1790:31;1815:5;1790:31;:::i;:::-;1840:5;1892:2;1877:18;;;;1864:32;;-1:-1:-1;;;1664:238:1:o;1907:251::-;1963:6;2016:2;2004:9;1995:7;1991:23;1987:32;1984:2;;;2037:6;2029;2022:22;1984:2;2081:9;2068:23;2100:28;2122:5;2100:28;:::i;2163:255::-;2230:6;2283:2;2271:9;2262:7;2258:23;2254:32;2251:2;;;2304:6;2296;2289:22;2251:2;2341:9;2335:16;2360:28;2382:5;2360:28;:::i;2423:190::-;2482:6;2535:2;2523:9;2514:7;2510:23;2506:32;2503:2;;;2556:6;2548;2541:22;2503:2;-1:-1:-1;2584:23:1;;2493:120;-1:-1:-1;2493:120:1:o;2618:194::-;2688:6;2741:2;2729:9;2720:7;2716:23;2712:32;2709:2;;;2762:6;2754;2747:22;2709:2;-1:-1:-1;2790:16:1;;2699:113;-1:-1:-1;2699:113:1:o;2817:258::-;2885:6;2893;2946:2;2934:9;2925:7;2921:23;2917:32;2914:2;;;2967:6;2959;2952:22;2914:2;-1:-1:-1;;2995:23:1;;;3065:2;3050:18;;;3037:32;;-1:-1:-1;2904:171:1:o;3080:316::-;3168:6;3176;3184;3237:2;3225:9;3216:7;3212:23;3208:32;3205:2;;;3258:6;3250;3243:22;3205:2;3292:9;3286:16;3276:26;;3342:2;3331:9;3327:18;3321:25;3311:35;;3386:2;3375:9;3371:18;3365:25;3355:35;;3195:201;;;;;:::o;3401:545::-;3493:6;3501;3509;3517;3525;3533;3586:3;3574:9;3565:7;3561:23;3557:33;3554:2;;;3608:6;3600;3593:22;3554:2;3636:27;3653:9;3636:27;:::i;:::-;3626:37;;3682:36;3714:2;3703:9;3699:18;3682:36;:::i;:::-;3672:46;;3737:36;3769:2;3758:9;3754:18;3737:36;:::i;:::-;3727:46;;3792:36;3824:2;3813:9;3809:18;3792:36;:::i;:::-;3782:46;;3847:37;3879:3;3868:9;3864:19;3847:37;:::i;:::-;3837:47;;3903:37;3935:3;3924:9;3920:19;3903:37;:::i;:::-;3893:47;;3544:402;;;;;;;;:::o;4648:591::-;-1:-1:-1;;;;;4991:15:1;;;4973:34;;5038:2;5023:18;;5016:34;;;;5081:2;5066:18;;5059:34;;;;5124:2;5109:18;;5102:34;;;;5173:15;;;5167:3;5152:19;;5145:44;4953:3;5205:19;;5198:35;;;;4922:3;4907:19;;4889:350::o;5436:603::-;5548:4;5577:2;5606;5595:9;5588:21;5638:6;5632:13;5681:6;5676:2;5665:9;5661:18;5654:34;5706:4;5719:140;5733:6;5730:1;5727:13;5719:140;;;5828:14;;;5824:23;;5818:30;5794:17;;;5813:2;5790:26;5783:66;5748:10;;5719:140;;;5877:6;5874:1;5871:13;5868:2;;;5947:4;5942:2;5933:6;5922:9;5918:22;5914:31;5907:45;5868:2;-1:-1:-1;6023:2:1;6002:15;-1:-1:-1;;5998:29:1;5983:45;;;;6030:2;5979:54;;5557:482;-1:-1:-1;;;5557:482:1:o;6391:340::-;6593:2;6575:21;;;6632:2;6612:18;;;6605:30;-1:-1:-1;;;6666:2:1;6651:18;;6644:46;6722:2;6707:18;;6565:166::o;11647:356::-;11849:2;11831:21;;;11868:18;;;11861:30;11927:34;11922:2;11907:18;;11900:62;11994:2;11979:18;;11821:182::o;14737:351::-;14939:2;14921:21;;;14978:2;14958:18;;;14951:30;15017:29;15012:2;14997:18;;14990:57;15079:2;15064:18;;14911:177::o;17333:983::-;17595:4;17643:3;17632:9;17628:19;17674:6;17663:9;17656:25;17700:2;17738:6;17733:2;17722:9;17718:18;17711:34;17781:3;17776:2;17765:9;17761:18;17754:31;17805:6;17840;17834:13;17871:6;17863;17856:22;17909:3;17898:9;17894:19;17887:26;;17948:2;17940:6;17936:15;17922:29;;17969:4;17982:195;17996:6;17993:1;17990:13;17982:195;;;18061:13;;-1:-1:-1;;;;;18057:39:1;18045:52;;18152:15;;;;18117:12;;;;18093:1;18011:9;17982:195;;;-1:-1:-1;;;;;;;18233:32:1;;;;18228:2;18213:18;;18206:60;-1:-1:-1;;;18297:3:1;18282:19;18275:35;18194:3;17604:712;-1:-1:-1;;;17604:712:1:o;19303:128::-;19343:3;19374:1;19370:6;19367:1;19364:13;19361:2;;;19380:18;;:::i;:::-;-1:-1:-1;19416:9:1;;19351:80::o;19436:204::-;19474:3;19510:4;19507:1;19503:12;19542:4;19539:1;19535:12;19577:3;19571:4;19567:14;19562:3;19559:23;19556:2;;;19585:18;;:::i;:::-;19621:13;;19482:158;-1:-1:-1;;;19482:158:1:o;19645:217::-;19685:1;19711;19701:2;;-1:-1:-1;;;19736:31:1;;19790:4;19787:1;19780:15;19818:4;19743:1;19808:15;19701:2;-1:-1:-1;19847:9:1;;19691:171::o;19867:422::-;19956:1;19999:5;19956:1;20013:270;20034:7;20024:8;20021:21;20013:270;;;20093:4;20089:1;20085:6;20081:17;20075:4;20072:27;20069:2;;;20102:18;;:::i;:::-;20152:7;20142:8;20138:22;20135:2;;;20172:16;;;;20135:2;20251:22;;;;20211:15;;;;20013:270;;;20017:3;19931:358;;;;;:::o;20294:140::-;20352:5;20381:47;20422:4;20412:8;20408:19;20402:4;20488:5;20518:8;20508:2;;-1:-1:-1;20559:1:1;20573:5;;20508:2;20607:4;20597:2;;-1:-1:-1;20644:1:1;20658:5;;20597:2;20689:4;20707:1;20702:59;;;;20775:1;20770:130;;;;20682:218;;20702:59;20732:1;20723:10;;20746:5;;;20770:130;20807:3;20797:8;20794:17;20791:2;;;20814:18;;:::i;:::-;-1:-1:-1;;20870:1:1;20856:16;;20885:5;;20682:218;;20984:2;20974:8;20971:16;20965:3;20959:4;20956:13;20952:36;20946:2;20936:8;20933:16;20928:2;20922:4;20919:12;20915:35;20912:77;20909:2;;;-1:-1:-1;21021:19:1;;;21053:5;;20909:2;21100:34;21125:8;21119:4;21100:34;:::i;:::-;21170:6;21166:1;21162:6;21158:19;21149:7;21146:32;21143:2;;;21181:18;;:::i;:::-;21219:20;;20498:747;-1:-1:-1;;;20498:747:1:o;21250:168::-;21290:7;21356:1;21352;21348:6;21344:14;21341:1;21338:21;21333:1;21326:9;21319:17;21315:45;21312:2;;;21363:18;;:::i;:::-;-1:-1:-1;21403:9:1;;21302:116::o;21423:125::-;21463:4;21491:1;21488;21485:8;21482:2;;;21496:18;;:::i;:::-;-1:-1:-1;21533:9:1;;21472:76::o;21553:127::-;21614:10;21609:3;21605:20;21602:1;21595:31;21645:4;21642:1;21635:15;21669:4;21666:1;21659:15;21685:131;-1:-1:-1;;;;;21760:31:1;;21750:42;;21740:2;;21806:1;21803;21796:12;21821:118;21907:5;21900:13;21893:21;21886:5;21883:32;21873:2;;21929:1;21926;21919:12

Swarm Source

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