ETH Price: $2,457.05 (+0.48%)

Token

Mittens (MITTEN)
 

Overview

Max Total Supply

1,000,000,000,000 MITTEN

Holders

293

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
300,629,610.660149399 MITTEN

Value
$0.00
0x5faca3fe769199e2821dbacbdb6c8268e16f567c
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:
Mittens

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 2021-11-07
*/

/**
 *Submitted for verification at Etherscan.io on 2021-11-06
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

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 IPancakeERC20 {
    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 IPancakeFactory {
    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 IPancakeRouter01 {
    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 IPancakeRouter02 is IPancakeRouter01 {
    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() public 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) public 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));
    }
}




////////////////////////////////////////////////////////////////////////////////////////////////////////
//Mittens Contract ////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
contract Mittens is IBEP20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => uint256) private _sellLock;
	mapping (address => bool) public wListed;


    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _whiteList;
    EnumerableSet.AddressSet private _excludedFromSellLock;
    EnumerableSet.AddressSet private _excludedFromRaffle;

    mapping (address => bool) public _blacklist;
    bool isBlacklist = true;

    //Token Info
    string private constant _name = 'Mittens';
    string private constant _symbol = 'MITTEN';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 1000000 * 10**6 * 10**_decimals;//equals 1.000.000.000.000 token

    uint256 swapLimit = 1000 * 10**5 * 10**_decimals;
    bool isSwapPegged = true;

    //Divider for the buyLimit based on circulating Supply (1%)
    uint16 public constant BuyLimitDivider=100;
    //Divider for the MaxBalance based on circulating Supply (1.5%)
    uint8 public constant BalanceLimitDivider=65;
    //Divider for the Whitelist MaxBalance based on initial Supply(1.5%)
    uint16 public constant WhiteListBalanceLimitDivider=65;
    //Divider for sellLimit based on circulating Supply (1%)
    uint16 public constant SellLimitDivider=100;
    //Sellers get locked for MaxSellLockTime so they can't dump repeatedly
    uint16 public constant MaxSellLockTime= 1 seconds;
    // Team wallets
    address public constant TeamWallet=0x87846A5B9304efd296e70c0e8cCd1fd80aAbB89B;
    address public constant SecondTeamWallet=0x25e1884DA68CCc879e561Ef9Cd82b3ABFC2968Ce; //need ell or dev address
    //TODO: Change to Mainnet
    //TestNet
    //address private constant PancakeRouter=0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
    //MainNet
    // 0x10ED43C718714eb63d5aA57B78B54704E256024E
    address private constant PancakeRouter=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 public  buyLimit = _circulatingSupply;
    address[] public triedToDump;

    //Limits max tax, only gets applied for tax changes, doesn't affect inital Tax
    uint8 public constant MaxTax=95;

    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;
    bool botRekt = false;
    uint8 private _burnTax;
    uint8 private _liquidityTax;
    uint8 private _marketingTax;

    bool isTokenSwapManual = true;


    address private _pancakePairAddress;
    IPancakeRouter02 private  _pancakeRouter;

    //modifier for functions only the team can call
    modifier onlyTeam() {
        require(_isTeam(msg.sender), "Caller not in Team");
        _;
    }
    //Checks if address is in Team, is needed to give Team access even if contract is renounced
    //Team doesn't have access to critical Functions that could turn this into a Rugpull(Exept liquidity unlocks)
    function _isTeam(address addr) private view returns (bool){
        return addr==owner()||addr==TeamWallet||addr==SecondTeamWallet;
    }


    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Constructor///////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    constructor () {
        //contract creator gets 90% of the token to create LP-Pair
        uint256 deployerBalance=_circulatingSupply*9/10;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);
        //contract gets 10% of the token to generate LP token and Marketing Budget fase
        //contract will sell token over the first 200 sells to generate maximum LP and BNB
        uint256 injectBalance=_circulatingSupply-deployerBalance;
        _balances[address(this)]=injectBalance;
       emit Transfer(address(0), address(this),injectBalance);

        // Pancake Router
        _pancakeRouter = IPancakeRouter02(PancakeRouter);
        //Creates a Pancake Pair
        _pancakePairAddress = IPancakeFactory(_pancakeRouter.factory()).createPair(address(this), _pancakeRouter.WETH());

        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;
        buyLimit=InitialSupply/BuyLimitDivider;

       //Sets sellLockTime to be 2 seconds by default
        sellLockTime=2 seconds;

        //Set Starting Tax to very high percentage(36%) to achieve maximum burn in the beginning
        //as in the beginning there is the highest token volume
        //any change in tax rate needs to be below maxTax(20%)
        _buyTax=11;
        _sellTax=11;//Sell Tax is lower, as otherwise slippage would be too high to sell
        _transferTax=11;
        //a small percentage gets added to the Contract token as 10% of token are already injected to
        //be converted to LP and MarketingBNB
        _liquidityTax=20;
        _marketingTax=80;
        //Team wallet and deployer are excluded from Taxes
        _excluded.add(TeamWallet);
        _excluded.add(SecondTeamWallet);
        _excluded.add(msg.sender);
        //excludes Pancake Router, pair, contract and burn address from staking
        _excludedFromRaffle.add(address(_pancakeRouter));
        _excludedFromRaffle.add(_pancakePairAddress);
        _excludedFromRaffle.add(address(this));
        _excludedFromRaffle.add(0x000000000000000000000000000000000000dEaD);
        _excludedFromSellLock.add(address(_pancakeRouter));
        _excludedFromSellLock.add(_pancakePairAddress);
        _excludedFromSellLock.add(address(this));
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //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 PancakeRouter and PancakePair are tax and lock free
        address pancakeRouter=address(_pancakeRouter);
        bool isLiquidityTransfer = ((sender == _pancakePairAddress && recipient == pancakeRouter)
        || (recipient == _pancakePairAddress && sender == pancakeRouter));

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

        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
        else{
            //once trading is enabled, it can't be turned off again
            if (!tradingEnabled) {
                if (sender != owner() && recipient != owner()) {
                    if (!wListed[sender] && !wListed[recipient]) {
                        if (botRekt) {
                           emit Transfer(sender,recipient,0);
                           return;
                        }
                        else {
                            require(tradingEnabled,"trading not yet enabled");
                        }
                    }
                }
            }
            if(whiteListTrading){
                _whiteListTransfer(sender,recipient,amount,isBuy,isSell);
            }
            else{
                _taxedTransfer(sender,recipient,amount,isBuy,isSell);
            }
        }
    }
    //if whitelist is active, all taxed transfers run through this
    function _whiteListTransfer(address sender, address recipient,uint256 amount,bool isBuy,bool isSell) private{
        //only apply whitelist restrictions during buys and transfers
        if(!isSell){
            //the recipient needs to be on Whitelist. Works for both buys and transfers.
            //transfers to other whitelisted addresses are allowed.
            require(_whiteList.contains(recipient),"recipient not on whitelist");
            //Limit is 1/500 of initialSupply during whitelist, to allow for a large whitelist without causing a massive
            //price impact of the whitelist
            require((_balances[recipient]+amount<=InitialSupply/WhiteListBalanceLimitDivider),"amount exceeds whitelist max");
        }
        _taxedTransfer(sender,recipient,amount,isBuy,isSell);

    }
    //applies taxes, checks for limits, locks generates autoLP and stakingBNB, and autostakes
    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");


        swapLimit = sellLimit/2;

        uint8 tax;
        if(isSell){
            if(isBlacklist) {
                require(!_blacklist[sender]);
            }
            if(!_excludedFromSellLock.contains(sender)){
                //If seller sold less than sellLockTime(2h) ago, sell is declined, can be disabled by Team
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Seller in sellLock");
                //Sets the time sellers get locked(2 hours by default)
                _sellLock[sender]=block.timestamp+sellLockTime;
            }
            //Sells can't exceed the sell limit(50.000 Tokens at start, can be updated to circulating supply)
            if(amount>sellLimit) {
                triedToDump.push(sender);
            }
            require(amount<=sellLimit,"Dump protection");
            tax=_sellTax;

        } else if(isBuy){
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            require(amount<=buyLimit, "whale protection");
            tax=_buyTax;

        } else {//Transfer
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            //Transfers are disabled in sell lock, this doesn't stop someone from transfering before
            //selling, but there is no satisfying solution for that, and you would need to pax additional tax
            if(!_excludedFromSellLock.contains(sender))
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Sender in Lock");
            tax=_transferTax;

        }
        //Swapping AutoLP and MarketingBNB is only possible if sender is not pancake 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!=_pancakePairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier))
            _swapContractToken(amount);
        //staking and liquidity Tax get treated the same, only during conversion they get split
        uint256 contractToken=_calculateFee(amount, tax, _marketingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(contractToken);

        //Removes token and handles staking
        _removeToken(sender,amount);

        //Adds the taxed tokens to the contract wallet
        _balances[address(this)] += contractToken;

        //Adds token and handles staking
        _addToken(recipient, taxedAmount);

        emit Transfer(sender,recipient,taxedAmount);



    }
    //Feeless transfer only transfers and autostakes
    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        //Removes token and handles staking
        _removeToken(sender,amount);
        //Adds token and handles staking
        _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;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //BNB Autostake/////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Autostake uses the balances of each holder to redistribute auto generated BNB.
    //Each transaction _addToken and _removeToken gets called for the transaction amount
    //WithdrawBNB can be used for any holder to withdraw BNB at any time, like true Staking,
    //so unlike MRAT clones you can leave and forget your Token and claim after a while

    //adds Token to balances, adds new BNB to the toBePaid mapping and resets staking
    function _addToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]+amount;
        _balances[addr]=newAmount;

    }


    //removes Token, adds BNB to the toBePaid mapping and resets staking
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
         _balances[addr]=newAmount;
    }

    //lock for the withdraw
    bool private _isTokenSwaping;
    //the total reward distributed through staking, for tracking purposes
    uint256 public totalTokenSwapGenerated;
    //the total payout through staking, for tracking purposes
    uint256 public totalPayouts;

    //marketing share of the TokenSwap tax
    uint8 public marketingShare=100;
    //balance that is claimable by the team
    uint256 public marketingBalance;

    //Mapping of shares that are reserved for payout
    mapping(address => uint256) private toBePaid;

    //Contract, pancake and burnAddress are excluded, other addresses like CEX
    //can be manually excluded, excluded list is limited to 30 entries to avoid a
    //out of gas exeption during sells
    function isexcludedFromRaffle(address addr) public view returns (bool){
        return _excludedFromRaffle.contains(addr);
    }

    //distributes bnb between marketing share and dividents
    function _distributeFeesBNB(uint256 BNBamount) private {
        // Deduct marketing Tax
        uint256 marketingSplit = (BNBamount * marketingShare) / 100;

        marketingBalance+=marketingSplit;

    }



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

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

    //swaps the token on the contract for Marketing BNB and LP Token.
    //always swaps the sellLimit of token to avoid a large price impact
    function _swapContractToken(uint256 totalMax) private lockTheSwap{
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_liquidityTax+_marketingTax;
        uint256 tokenToSwap=swapLimit;
        if(tokenToSwap > totalMax) {
            if(isSwapPegged) {
                tokenToSwap = totalMax;
            }
        }
        //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 liqBNBToken=tokenForLiquidity-liqToken;

        //swaps marktetingToken and the liquidity token half for BNB
        uint256 swapToken=liqBNBToken+tokenForMarketing;
        //Gets the initial BNB balance, so swap won't touch any staked BNB
        uint256 initialBNBBalance = address(this).balance;
        _swapTokenForBNB(swapToken);
        uint256 newBNB=(address(this).balance - initialBNBBalance);
        //calculates the amount of BNB belonging to the LP-Pair and converts them to LP
        uint256 liqBNB = (newBNB*liqBNBToken)/swapToken;
        _addLiquidity(liqToken, liqBNB);
        //Get the BNB balance after LP generation to get the
        //exact amount of token left for Staking
        uint256 generatedBNB=(address(this).balance - initialBNBBalance);
        //distributes remaining BNB between stakers and Marketing
        _distributeFeesBNB(generatedBNB);
    }
    //swaps tokens on the contract for BNB
    function _swapTokenForBNB(uint256 amount) private {
        _approve(address(this), address(_pancakeRouter), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _pancakeRouter.WETH();

        _pancakeRouter.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 bnbamount) private {
        totalLPBNB+=bnbamount;
        _approve(address(this), address(_pancakeRouter), tokenamount);
        _pancakeRouter.addLiquidityETH{value: bnbamount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

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

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

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

    function getTaxes() public view returns(uint256 burnTax,uint256 liquidityTax,uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){
        return (_burnTax,_liquidityTax,_marketingTax,_buyTax,_sellTax,_transferTax);
    }

    function getWhitelistedStatus(address AddressToCheck) public view returns(bool){
        return _whiteList.contains(AddressToCheck);
    }
    //How long is a given address still locked from selling
    function getAddressSellLockTimeInSeconds(address AddressToCheck) public view returns (uint256){
       uint256 lockTime=_sellLock[AddressToCheck];
       if(lockTime<=block.timestamp)
       {
           return 0;
       }
       return lockTime-block.timestamp;
    }
    function getSellLockTimeInSeconds() public view returns(uint256){
        return sellLockTime;
    }

    //Functions every wallet can call
    //Resets sell lock of caller to the default sellLockTime should something go very wrong
    function AddressResetSellLock() public{
        _sellLock[msg.sender]=block.timestamp+sellLockTime;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Settings//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    bool public sellLockDisabled;
    uint256 public sellLockTime;
    bool public manualConversion;


    function getDumpers() public view returns(address[] memory) {
        return triedToDump;
    }


    function TeamSetWhitelistedAddressAlt(address addy, bool booly) public onlyTeam {
        wListed[addy] = booly;
    }

    function TeamSetWhitelistedAddress(address addy, bool booly) public onlyTeam {
        wListed[addy] = booly;
        _excluded.add(addy);
    }


    function TeamSetWhitelistedAddressesAlt( address[] memory addy, bool booly) public onlyTeam {
        uint256 i;
        for(i=0; i<addy.length; i++) {
            wListed[addy[i]] = booly;
        }
    }

    function TeamSetWhitelistedAddresses( address[] memory addy, bool booly) public onlyTeam {
        uint256 i;
        for(i=0; i<addy.length; i++) {
            wListed[addy[i]] = booly;
            _excluded.add(addy[i]);
        }
    }

    function TeamSetPeggedSwap(bool isPegged) public onlyTeam {
        isSwapPegged = isPegged;
    }


    //Excludes account from Staking
    function TeamExcludeFromRaffle(address addr) public onlyTeam{
        require(!isexcludedFromRaffle(addr));
        _excludedFromRaffle.add(addr);

    }

    //Includes excluded Account to staking
    function TeamIncludeToRaffle(address addr) public onlyTeam{
        require(isexcludedFromRaffle(addr));
        _excludedFromRaffle.remove(addr);
    }

    function TeamWithdrawMarketingBNB() public onlyTeam{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        (bool sent,) =TeamWallet.call{value: (amount)}("");
        require(sent,"withdraw failed");
    }


    //switches autoLiquidity and marketing BNB generation during transfers
    function TeamSwitchManualBNBConversion(bool manual) public onlyTeam{
        manualConversion=manual;
    }
    //Disables the timeLock after selling for everyone
    function TeamDisableSellLock(bool disabled) public onlyTeam{
        sellLockDisabled=disabled;
    }
    //Sets SellLockTime, needs to be lower than MaxSellLockTime
    function TeamSetSellLockTime(uint256 sellLockSeconds)public onlyTeam{
            require(sellLockSeconds<=MaxSellLockTime,"Sell Lock time too high");
            sellLockTime=sellLockSeconds;
    }

    //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) public onlyTeam{
        uint8 totalTax=burnTaxes+liquidityTaxes+marketingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");
        require(buyTax<=MaxTax&&sellTax<=MaxTax&&transferTax<=MaxTax,"taxes higher than max tax");

        _burnTax=burnTaxes;
        _liquidityTax=liquidityTaxes;
        _marketingTax=marketingTaxes;

        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;
    }
    //How much of the staking tax should be allocated for marketing
    function TeamChangeMarketingShare(uint8 newShare) public onlyTeam{
        marketingShare=newShare;
    }
    //manually converts contract token to LP and staking BNB
    function TeamManualGenerateTokenSwapBalance(uint256 _qty) public onlyTeam{
    _swapContractToken(_qty * 10**9);
    }
    //Exclude/Include account from fees (eg. CEX)
    function TeamExcludeAccountFromFees(address account) public onlyTeam {
        _excluded.add(account);
    }
    function TeamIncludeAccountToFees(address account) public onlyTeam {
        _excluded.remove(account);
    }
    //Exclude/Include account from fees (eg. CEX)
    function TeamExcludeAccountFromSellLock(address account) public onlyTeam {
        _excludedFromSellLock.add(account);
    }
    function TeamIncludeAccountToSellLock(address account) public onlyTeam {
        _excludedFromSellLock.remove(account);
    }

     //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) public onlyTeam{
        //Adds decimals to limits
        newBalanceLimit=newBalanceLimit*10**_decimals;
        newSellLimit=newSellLimit*10**_decimals;
        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    bool public tradingEnabled;
    bool public whiteListTrading;
    address private _liquidityTokenAddress;
    //Enables whitelist trading and locks Liquidity for a short time
    function SetupEnableWhitelistTrading() public onlyTeam{
        require(!tradingEnabled);
        //Sets up the excluded from staking list
        tradingEnabled=true;
        whiteListTrading=true;
    }
    //Enables trading for everyone
    function SetupEnableTrading() public onlyTeam{
        require(tradingEnabled&&whiteListTrading);
        whiteListTrading=false;
    }

    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyTeam{
        _liquidityTokenAddress=liquidityTokenAddress;
    }
    //Functions for whitelist
    function SetupAddToWhitelist(address addressToAdd) public onlyTeam{
        _whiteList.add(addressToAdd);
    }
    function SetupAddArrayToWhitelist(address[] memory addressesToAdd) public onlyTeam{
        for(uint i=0; i<addressesToAdd.length; i++){
            _whiteList.add(addressesToAdd[i]);
        }
    }
    function SetupRemoveFromWhitelist(address addressToRemove) public onlyTeam{
        _whiteList.remove(addressToRemove);
    }


    function TeamRescueTokens(address tknAddress) public onlyTeam {
        IBEP20 token = IBEP20(tknAddress);
        uint256 ourBalance = token.balanceOf(address(this));
        require(ourBalance>0, "No tokens in our balance");
        token.transfer(msg.sender, ourBalance);
    }

    // Blacklists

    function setBlacklistEnabled(bool isBlacklistEnabled) public onlyTeam {
        isBlacklist = isBlacklistEnabled;
    }

    function setContractTokenSwapManual(bool manual) public onlyTeam {
        isTokenSwapManual = manual;
    }

    function setBlacklistedAddress(address toBlacklist) public onlyTeam {
        _blacklist[toBlacklist] = true;
    }

    function removeBlacklistedAddress(address toRemove) public onlyTeam {
        _blacklist[toRemove] = false;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Utilities/////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    function TeamAvoidBurning() public onlyTeam{
        (bool sent,) =msg.sender.call{value: (address(this).balance)}("");
        require(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":"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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"AddressResetSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BuyLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSellLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SecondTeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressesToAdd","type":"address[]"}],"name":"SetupAddArrayToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToAdd","type":"address"}],"name":"SetupAddToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SetupEnableWhitelistTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToRemove","type":"address"}],"name":"SetupRemoveFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamAvoidBurning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"TeamChangeMarketingShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamExcludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamExcludeAccountFromSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"TeamExcludeFromRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamIncludeAccountToFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamIncludeAccountToSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"TeamIncludeToRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"TeamManualGenerateTokenSwapBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tknAddress","type":"address"}],"name":"TeamRescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPegged","type":"bool"}],"name":"TeamSetPeggedSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellLockSeconds","type":"uint256"}],"name":"TeamSetSellLockTime","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":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamSetWhitelistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamSetWhitelistedAddressAlt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addy","type":"address[]"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamSetWhitelistedAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addy","type":"address[]"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamSetWhitelistedAddressesAlt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualBNBConversion","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":"TeamWithdrawMarketingBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WhiteListBalanceLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"buyLimit","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":"getAddressSellLockTimeInSeconds","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":"getDumpers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"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":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"AddressToCheck","type":"address"}],"name":"getWhitelistedStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isexcludedFromRaffle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"marketingShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"toRemove","type":"address"}],"name":"removeBlacklistedAddress","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":"sellLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isBlacklistEnabled","type":"bool"}],"name":"setBlacklistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toBlacklist","type":"address"}],"name":"setBlacklistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"setContractTokenSwapManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalLPBNB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayouts","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":"totalTokenSwapGenerated","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"triedToDump","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600e805460ff191660011790556200001f6009600a620006c4565b6200002f906305f5e10062000783565b600f556010805460ff191660011790556200004d6009600a620006c4565b6200005e9064e8d4a5100062000783565b6011819055601281905560138190556014556016805467ff000000ff0000001916670100000000000000179055601a805460ff19166064179055348015620000a557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000600a6011546009620000fc919062000783565b6200010891906200065a565b3360008181526001602052604080822084905551929350909160008051602062003fb183398151915290620001409085815260200190565b60405180910390a36000816011546200015a9190620007a5565b3060008181526001602052604080822084905551929350909160008051602062003fb183398151915290620001929085815260200190565b60405180910390a3601780546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620001fa57600080fd5b505afa1580156200020f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023591906200062a565b6001600160a01b031663c9c6539630601760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200029357600080fd5b505afa158015620002a8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ce91906200062a565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200031757600080fd5b505af11580156200032c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200035291906200062a565b601680546001600160a01b03929092166801000000000000000002600160401b600160e01b03199092169190911790556041620003926009600a620006c4565b620003a39064e8d4a5100062000783565b620003af91906200065a565b6012556064620003c26009600a620006c4565b620003d39064e8d4a5100062000783565b620003df91906200065a565b6013556064620003f26009600a620006c4565b620004039064e8d4a5100062000783565b6200040f91906200065a565b6014556002601f556016805466ffff0000ffffff191666501400000b0b0b1790556200045d60057387846a5b9304efd296e70c0e8ccd1fd80aabb89b620005b8602090811b62001fe717901c565b506200048d7325e1884da68ccc879e561ef9cd82b3abfc2968ce6005620005b860201b62001fe71790919060201c565b50620004a9336005620005b860201b62001fe71790919060201c565b50601754620004d090600b906001600160a01b0316620005b8602090811b62001fe717901c565b5062000501601660089054906101000a90046001600160a01b0316600b620005b860201b62001fe71790919060201c565b506200051d30600b620005b860201b62001fe71790919060201c565b506200053b61dead600b620005b860201b62001fe71790919060201c565b5060175462000562906009906001600160a01b0316620005b8602090811b62001fe717901c565b5062000593601660089054906101000a90046001600160a01b03166009620005b860201b62001fe71790919060201c565b50620005af306009620005b860201b62001fe71790919060201c565b505050620007d5565b6000620005cf836001600160a01b038416620005d8565b90505b92915050565b60008181526001830160205260408120546200062157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005d2565b506000620005d2565b6000602082840312156200063c578081fd5b81516001600160a01b038116811462000653578182fd5b9392505050565b6000826200067657634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115620006bc578160001904821115620006a057620006a0620007bf565b80851615620006ae57918102915b93841c939080029062000680565b509250929050565b6000620005cf60ff841683600082620006e057506001620005d2565b81620006ef57506000620005d2565b8160018114620007085760028114620007135762000733565b6001915050620005d2565b60ff841115620007275762000727620007bf565b50506001821b620005d2565b5060208310610133831016604e8410600b841016171562000758575081810a620005d2565b6200076483836200067b565b80600019048211156200077b576200077b620007bf565b029392505050565b6000816000190483118215151615620007a057620007a0620007bf565b500290565b600082821015620007ba57620007ba620007bf565b500390565b634e487b7160e01b600052601160045260246000fd5b6137cc80620007e56000396000f3fe6080604052600436106104475760003560e01c80636f89e40911610232578063988c5ec91161012d578063d8e8de34116100b0578063e77bf5f811610077578063e77bf5f814610dbd578063eb8e886314610ddd578063f2fde38b14610df2578063f88b0e4614610e12578063f9963ca114610e2857005b8063d8e8de3414610cf7578063da1144d614610d17578063dd62ed3e14610d37578063dff6bcbf14610d7d578063e3aa94b014610d9d57005b8063a9059cbb116100f4578063a9059cbb14610c6d578063b76289b814610c8d578063b85111db14610cad578063c3f4f54f14610cc2578063d51f383b14610cd757005b8063988c5ec914610bbd5780639fa62d5f14610bdd578063a20623ce14610bfd578063a457c2d714610c2d578063a6fc178a14610c4d57005b80638728ecd1116101b55780638da5cb5b1161017c5780638da5cb5b14610ad8578063914e208a14610b2c57806393ab98f214610b4e57806395d89b4114610b6e5780639728c01914610b9d57005b80638728ecd114610a99578063887c60fb14610ab9578063893d20e814610ad85780638d060d7714610af65780638d2c503914610b0c57005b8063762bb282116101f9578063762bb28214610a2a5780637b9e987a14610a405780637f91937314610a5557806386d0ada814610a6a5780638724cc7214610a8457005b80636f89e4091461097557806370a082311461099f578063715018a6146109d557806371ab1f09146109ea57806373ddf08e14610a0a57005b8063311a86971161034257806348e907b7116102c5578063588aeaf21161028c578063588aeaf2146108d1578063589210d9146108f157806358e553651461090757806363b263b31461091d578063677a88701461094d57005b806348e907b7146108465780634ada218b1461085c5780634cdaf0ae1461087b5780634f91e48c1461089b57806357ad67d1146108b157005b80633d8dbf5d116103095780633d8dbf5d146107bb5780633e9be909146107db5780634089b170146107fb5780634607e6921461081157806348e531641461083157005b8063311a86971461073d578063313ce567146107525780633328b721146107665780633478154b14610786578063395093511461079b57005b80631285073c116103ca5780631eb25d13116103915780631eb25d131461065f5780631f8b845e1461056e578063230ffc421461067457806323b872dd146106b45780632973ef2d146106d457005b80631285073c146105cb57806314e91377146105ea5780631732ed7c1461060a57806318160ddd1461062a57806319e880841461063f57005b80630b1daa3e1161040e5780630b1daa3e1461052e5780630fa6c5ff1461054e5780630fd99e161461056e5780631193c691146105965780631201cbd0146105ab57005b8063029a1ecd1461045057806302a89e021461047057806306fdde031461049057806309218ee7146104d2578063095ea7b3146104fe57005b3661044e57005b005b34801561045c57600080fd5b5061044e61046b3660046131ad565b610e48565b34801561047c57600080fd5b5061044e61048b36600461332d565b610e98565b34801561049c57600080fd5b506040805180820190915260078152664d697474656e7360c81b60208201525b6040516104c991906134c6565b60405180910390f35b3480156104de57600080fd5b50601a546104ec9060ff1681565b60405160ff90911681526020016104c9565b34801561050a57600080fd5b5061051e61051936600461328a565b610ee3565b60405190151581526020016104c9565b34801561053a57600080fd5b5061044e6105493660046131ad565b610efa565b34801561055a57600080fd5b5061044e6105693660046131ad565b610f2a565b34801561057a57600080fd5b50610583606481565b60405161ffff90911681526020016104c9565b3480156105a257600080fd5b5061044e610f6c565b3480156105b757600080fd5b5061044e6105c636600461332d565b610fb9565b3480156105d757600080fd5b50601f545b6040519081526020016104c9565b3480156105f657600080fd5b5061044e61060536600461332d565b610ff1565b34801561061657600080fd5b5061044e61062536600461325d565b611030565b34801561063657600080fd5b506011546105dc565b34801561064b57600080fd5b5061044e61065a36600461325d565b611089565b34801561066b57600080fd5b506105dc6110d9565b34801561068057600080fd5b5061069c7325e1884da68ccc879e561ef9cd82b3abfc2968ce81565b6040516001600160a01b0390911681526020016104c9565b3480156106c057600080fd5b5061051e6106cf36600461321d565b6110f7565b3480156106e057600080fd5b506016546040805160ff640100000000840481168252600160281b840481166020830152600160301b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016104c9565b34801561074957600080fd5b506104ec604181565b34801561075e57600080fd5b5060096104ec565b34801561077257600080fd5b5061044e6107813660046131ad565b61118e565b34801561079257600080fd5b50610583600181565b3480156107a757600080fd5b5061051e6107b636600461328a565b6111d4565b3480156107c757600080fd5b5061044e6107d63660046131ad565b61120b565b3480156107e757600080fd5b5061044e6107f63660046132e8565b611254565b34801561080757600080fd5b506105dc60195481565b34801561081d57600080fd5b5061044e61082c366004613365565b6112ee565b34801561083d57600080fd5b5061044e61132c565b34801561085257600080fd5b506105dc60185481565b34801561086857600080fd5b5060205461051e90610100900460ff1681565b34801561088757600080fd5b5061044e6108963660046131ad565b61134b565b3480156108a757600080fd5b506105dc60135481565b3480156108bd57600080fd5b5061044e6108cc3660046133fd565b61139c565b3480156108dd57600080fd5b5061044e6108ec3660046131ad565b611532565b3480156108fd57600080fd5b506105dc60145481565b34801561091357600080fd5b506105dc601b5481565b34801561092957600080fd5b5061051e6109383660046131ad565b60046020526000908152604090205460ff1681565b34801561095957600080fd5b5061069c7387846a5b9304efd296e70c0e8ccd1fd80aabb89b81565b34801561098157600080fd5b5061098a611562565b604080519283526020830191909152016104c9565b3480156109ab57600080fd5b506105dc6109ba3660046131ad565b6001600160a01b031660009081526001602052604090205490565b3480156109e157600080fd5b5061044e61159f565b3480156109f657600080fd5b5060205461051e9062010000900460ff1681565b348015610a1657600080fd5b5061044e610a253660046133e3565b611652565b348015610a3657600080fd5b506105dc60125481565b348015610a4c57600080fd5b5061044e61168d565b348015610a6157600080fd5b5061044e6116e8565b348015610a7657600080fd5b5060205461051e9060ff1681565b348015610a9057600080fd5b50610583604181565b348015610aa557600080fd5b506105dc610ab43660046131ad565b6117b5565b348015610ac557600080fd5b50601e5461051e90610100900460ff1681565b348015610ae457600080fd5b506000546001600160a01b031661069c565b348015610b0257600080fd5b506105dc601d5481565b348015610b1857600080fd5b5061044e610b2736600461332d565b6117f4565b348015610b3857600080fd5b50610b4161182c565b6040516104c991906134b3565b348015610b5a57600080fd5b5061069c610b69366004613365565b61188e565b348015610b7a57600080fd5b5060408051808201909152600681526526a4aa2a22a760d11b60208201526104bc565b348015610ba957600080fd5b5061044e610bb83660046132e8565b6118b8565b348015610bc957600080fd5b5061051e610bd83660046131ad565b61199b565b348015610be957600080fd5b5061044e610bf8366004613395565b6119a8565b348015610c0957600080fd5b5061051e610c183660046131ad565b600d6020526000908152604090205460ff1681565b348015610c3957600080fd5b5061051e610c4836600461328a565b611a07565b348015610c5957600080fd5b5061044e610c6836600461332d565b611a83565b348015610c7957600080fd5b5061051e610c8836600461328a565b611abb565b348015610c9957600080fd5b5061044e610ca83660046131ad565b611ac8565b348015610cb957600080fd5b5061044e611af8565b348015610cce57600080fd5b506105dc611b72565b348015610ce357600080fd5b5061044e610cf2366004613365565b611bb2565b348015610d0357600080fd5b5061051e610d123660046131ad565b611c2d565b348015610d2357600080fd5b5061044e610d323660046132b5565b611c3a565b348015610d4357600080fd5b506105dc610d523660046131e5565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610d8957600080fd5b5061044e610d983660046131ad565b611cb9565b348015610da957600080fd5b5061044e610db83660046131ad565b611ce9565b348015610dc957600080fd5b5061044e610dd83660046131ad565b611e62565b348015610de957600080fd5b506104ec605f81565b348015610dfe57600080fd5b5061044e610e0d3660046131ad565b611e92565b348015610e1e57600080fd5b506105dc601f5481565b348015610e3457600080fd5b5061044e610e433660046131ad565b611fbb565b610e5133611ffc565b610e765760405162461bcd60e51b8152600401610e6d90613519565b60405180910390fd5b610e7f8161199b565b15610e8957600080fd5b610e94600b82611fe7565b5050565b610ea133611ffc565b610ebd5760405162461bcd60e51b8152600401610e6d90613519565b601680549115156701000000000000000267ff0000000000000019909216919091179055565b6000610ef0338484612061565b5060015b92915050565b610f0333611ffc565b610f1f5760405162461bcd60e51b8152600401610e6d90613519565b610e94600982612154565b610f3333611ffc565b610f4f5760405162461bcd60e51b8152600401610e6d90613519565b610f588161199b565b610f6157600080fd5b610e94600b82612154565b610f7533611ffc565b610f915760405162461bcd60e51b8152600401610e6d90613519565b602054610100900460ff1615610fa657600080fd5b6020805462ffff00191662010100179055565b610fc233611ffc565b610fde5760405162461bcd60e51b8152600401610e6d90613519565b600e805460ff1916911515919091179055565b610ffa33611ffc565b6110165760405162461bcd60e51b8152600401610e6d90613519565b601e80549115156101000261ff0019909216919091179055565b61103933611ffc565b6110555760405162461bcd60e51b8152600401610e6d90613519565b6001600160a01b0382166000908152600460205260409020805460ff1916821515179055611084600583611fe7565b505050565b61109233611ffc565b6110ae5760405162461bcd60e51b8152600401610e6d90613519565b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b6110e56009600a61364b565b6110f49064e8d4a510006136f6565b81565b6000611104848484612169565b6001600160a01b03841660009081526002602090815260408083203384529091529020548281101561116f5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610e6d565b611183853361117e8685613715565b612061565b506001949350505050565b61119733611ffc565b6111b35760405162461bcd60e51b8152600401610e6d90613519565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610ef091859061117e9086906135ab565b61121433611ffc565b6112305760405162461bcd60e51b8152600401610e6d90613519565b6001600160a01b03166000908152600d60205260409020805460ff19166001179055565b61125d33611ffc565b6112795760405162461bcd60e51b8152600401610e6d90613519565b60005b82518110156110845781600460008584815181106112aa57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806112e68161372c565b91505061127c565b6112f733611ffc565b6113135760405162461bcd60e51b8152600401610e6d90613519565b61132961132482633b9aca006136f6565b6124d6565b50565b601f5461133990426135ab565b33600090815260036020526040902055565b61135433611ffc565b6113705760405162461bcd60e51b8152600401610e6d90613519565b602080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6113a533611ffc565b6113c15760405162461bcd60e51b8152600401610e6d90613519565b6000846113ce87896135c3565b6113d891906135c3565b90508060ff1660641461143c5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610e6d565b605f60ff8516118015906114545750605f60ff841611155b80156114645750605f60ff831611155b6114b05760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610e6d565b506016805460ff928316620100000262ff0000199484166101000261ffff19978516600160301b029790971666ff00000000ffff19988516600160281b0265ff0000000000199a8616640100000000029a909a1665ffff0000000019909316929092179890981796909616959095179216919091179190911716919091179055565b61153b33611ffc565b6115575760405162461bcd60e51b8152600401610e6d90613519565b610e94600582611fe7565b6000806115716009600a61364b565b60125461157e91906135e8565b61158a6009600a61364b565b60135461159791906135e8565b915091509091565b336115b26000546001600160a01b031690565b6001600160a01b0316146116085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e6d565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61165b33611ffc565b6116775760405162461bcd60e51b8152600401610e6d90613519565b601a805460ff191660ff92909216919091179055565b61169633611ffc565b6116b25760405162461bcd60e51b8152600401610e6d90613519565b602054610100900460ff1680156116d1575060205462010000900460ff165b6116da57600080fd5b6020805462ff000019169055565b6116f133611ffc565b61170d5760405162461bcd60e51b8152600401610e6d90613519565b601b80546000918290556040519091907387846a5b9304efd296e70c0e8ccd1fd80aabb89b9083908381818185875af1925050503d806000811461176d576040519150601f19603f3d011682016040523d82523d6000602084013e611772565b606091505b5050905080610e945760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610e6d565b6001600160a01b0381166000908152600360205260408120544281116117de5750600092915050565b6117e84282613715565b9392505050565b905090565b6117fd33611ffc565b6118195760405162461bcd60e51b8152600401610e6d90613519565b6020805460ff1916911515919091179055565b6060601580548060200260200160405190810160405280929190818152602001828054801561188457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611866575b5050505050905090565b6015818154811061189e57600080fd5b6000918252602090912001546001600160a01b0316905081565b6118c133611ffc565b6118dd5760405162461bcd60e51b8152600401610e6d90613519565b60005b825181101561108457816004600085848151811061190e57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555061198883828151811061197057634e487b7160e01b600052603260045260246000fd5b60200260200101516005611fe790919063ffffffff16565b50806119938161372c565b9150506118e0565b6000610ef4600b8361262b565b6119b133611ffc565b6119cd5760405162461bcd60e51b8152600401610e6d90613519565b6119d96009600a61364b565b6119e390836136f6565b91506119f16009600a61364b565b6119fb90826136f6565b60129290925550601355565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611a6a5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610e6d565b611a79338561117e8685613715565b5060019392505050565b611a8c33611ffc565b611aa85760405162461bcd60e51b8152600401610e6d90613519565b6010805460ff1916911515919091179055565b6000610ef0338484612169565b611ad133611ffc565b611aed5760405162461bcd60e51b8152600401610e6d90613519565b610e94600782611fe7565b611b0133611ffc565b611b1d5760405162461bcd60e51b8152600401610e6d90613519565b604051600090339047908381818185875af1925050503d8060008114611b5f576040519150601f19603f3d011682016040523d82523d6000602084013e611b64565b606091505b505090508061132957600080fd5b6000611b806009600a61364b565b601154611b8f6009600a61364b565b611b9e9064e8d4a510006136f6565b611ba89190613715565b6117ef91906135e8565b611bbb33611ffc565b611bd75760405162461bcd60e51b8152600401610e6d90613519565b6001811115611c285760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610e6d565b601f55565b6000610ef460078361262b565b611c4333611ffc565b611c5f5760405162461bcd60e51b8152600401610e6d90613519565b60005b8151811015610e9457611ca6828281518110611c8e57634e487b7160e01b600052603260045260246000fd5b60200260200101516007611fe790919063ffffffff16565b5080611cb18161372c565b915050611c62565b611cc233611ffc565b611cde5760405162461bcd60e51b8152600401610e6d90613519565b610e94600582612154565b611cf233611ffc565b611d0e5760405162461bcd60e51b8152600401610e6d90613519565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b158015611d5257600080fd5b505afa158015611d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8a919061337d565b905060008111611ddc5760405162461bcd60e51b815260206004820152601860248201527f4e6f20746f6b656e7320696e206f75722062616c616e636500000000000000006044820152606401610e6d565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb90604401602060405180830381600087803b158015611e2457600080fd5b505af1158015611e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5c9190613349565b50505050565b611e6b33611ffc565b611e875760405162461bcd60e51b8152600401610e6d90613519565b610e94600782612154565b33611ea56000546001600160a01b031690565b6001600160a01b031614611efb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e6d565b6001600160a01b038116611f605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e6d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611fc433611ffc565b611fe05760405162461bcd60e51b8152600401610e6d90613519565b610e946009825b60006117e8836001600160a01b03841661264d565b600080546001600160a01b038381169116148061203557506001600160a01b0382167387846a5b9304efd296e70c0e8ccd1fd80aabb89b145b80610ef457506001600160a01b0382167325e1884da68ccc879e561ef9cd82b3abfc2968ce1492915050565b6001600160a01b0383166120ab5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610e6d565b6001600160a01b0382166120f35760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610e6d565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006117e8836001600160a01b03841661269c565b6001600160a01b0383166121b45760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610e6d565b6001600160a01b0382166121fd5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610e6d565b600061220a60058561262b565b8061221b575061221b60058461262b565b905060006001600160a01b03851630148061223e57506001600160a01b03841630145b6017546016549192506001600160a01b0390811691600091888116600160401b909204161480156122805750816001600160a01b0316866001600160a01b0316145b806122bb57506016546001600160a01b03878116600160401b909204161480156122bb5750816001600160a01b0316876001600160a01b0316145b6016549091506000906001600160a01b03898116600160401b9092041614806122f55750826001600160a01b0316886001600160a01b0316145b6016549091506000906001600160a01b03898116600160401b90920416148061232f5750836001600160a01b0316886001600160a01b0316145b9050848061233a5750825b806123425750855b15612357576123528989896127b3565b6124cb565b602054610100900460ff166124a0576000546001600160a01b038a811691161480159061239257506000546001600160a01b03898116911614155b156124a0576001600160a01b03891660009081526004602052604090205460ff161580156123d957506001600160a01b03881660009081526004602052604090205460ff16155b156124a0576016546301000000900460ff161561244957876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600060405161243691815260200190565b60405180910390a3505050505050505050565b602054610100900460ff166124a05760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610e6d565b60205462010000900460ff16156124be57612352898989858561287e565b6124cb8989898585612987565b505050505050505050565b601e805460ff19166001908117909155306000908152602091909152604081205460165490919061251b90600160301b810460ff90811691600160281b9004166135c3565b60ff1690506000600f5490508381111561253d5760105460ff161561253d5750825b8083108061254d575061ffff8216155b1561255a5750505061261e565b60165460009061ffff84169061257a90600160281b900460ff16846136f6565b61258491906135e8565b905060006125928284613715565b905060006125a16002846135e8565b905060006125af8285613715565b905060006125bd84836135ab565b9050476125c982612db9565b60006125d58247613715565b90506000836125e486846136f6565b6125ee91906135e8565b90506125fa8682612f3d565b60006126068447613715565b90506126118161300d565b5050505050505050505050505b50601e805460ff19169055565b6001600160a01b038116600090815260018301602052604081205415156117e8565b600081815260018301602052604081205461269457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ef4565b506000610ef4565b600081815260018301602052604081205480156127a95760006126c0600183613715565b85549091506000906126d490600190613715565b905060008660000182815481106126fb57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061272c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526001890190915260409020849055865487908061276d57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610ef4565b6000915050610ef4565b6001600160a01b038316600090815260016020526040902054818110156128175760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610e6d565b612821848361304a565b61282b838361308f565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161287091815260200190565b60405180910390a350505050565b806129735761288e60078561262b565b6128da5760405162461bcd60e51b815260206004820152601a60248201527f726563697069656e74206e6f74206f6e2077686974656c6973740000000000006044820152606401610e6d565b60416128e86009600a61364b565b6128f79064e8d4a510006136f6565b61290191906135e8565b6001600160a01b0385166000908152600160205260409020546129259085906135ab565b11156129735760405162461bcd60e51b815260206004820152601c60248201527f616d6f756e7420657863656564732077686974656c697374206d6178000000006044820152606401610e6d565b6129808585858585612987565b5050505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129f55760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610e6d565b6002601354612a0491906135e8565b600f5560008315612b9057600e5460ff1615612a40576001600160a01b0388166000908152600d602052604090205460ff1615612a4057600080fd5b612a4b60098961262b565b612ae5576001600160a01b03881660009081526003602052604090205442101580612a7d5750601e54610100900460ff165b612abe5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610e6d565b601f54612acb90426135ab565b6001600160a01b0389166000908152600360205260409020555b601354861115612b3b57601580546001810182556000919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180546001600160a01b0319166001600160a01b038a161790555b601354861115612b7f5760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610e6d565b50601654610100900460ff16612ca2565b8415612bef57601254612ba387856135ab565b1115612bc15760405162461bcd60e51b8152600401610e6d90613545565b601454861115612be35760405162461bcd60e51b8152600401610e6d90613545565b5060165460ff16612ca2565b601254612bfc87856135ab565b1115612c1a5760405162461bcd60e51b8152600401610e6d90613545565b612c2560098961262b565b612c94576001600160a01b03881660009081526003602052604090205442101580612c575750601e54610100900460ff165b612c945760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610e6d565b5060165462010000900460ff165b6016546001600160a01b03898116600160401b9092041614801590612cca575060205460ff16155b8015612cd95750601e5460ff16155b15612ce757612ce7866124d6565b601654600090612d179088908490612d129060ff600160281b8204811691600160301b9004166135c3565b6130b3565b90506000612d258289613715565b9050612d318a8961304a565b3060009081526001602052604081208054849290612d509084906135ab565b90915550612d609050898261308f565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612da591815260200190565b60405180910390a350505050505050505050565b601754612dd19030906001600160a01b031683612061565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612e1457634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612e6857600080fd5b505afa158015612e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea091906131c9565b81600181518110612ec157634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260175460405163791ac94760e01b815291169063791ac94790612f0790859060009086903090429060040161356f565b600060405180830381600087803b158015612f2157600080fd5b505af1158015612f35573d6000803e3d6000fd5b505050505050565b80601d6000828254612f4f91906135ab565b9091555050601754612f6c9030906001600160a01b031684612061565b60175460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b158015612fd457600080fd5b505af1158015612fe8573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061298091906133b6565b601a546000906064906130239060ff16846136f6565b61302d91906135e8565b905080601b600082825461304191906135ab565b90915550505050565b6001600160a01b03821660009081526001602052604081205461306e908390613715565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b03821660009081526001602052604081205461306e9083906135ab565b60006127108260ff168460ff16866130cb91906136f6565b6130d591906136f6565b6130df91906135e8565b949350505050565b80356130f281613773565b919050565b600082601f830112613107578081fd5b8135602067ffffffffffffffff808311156131245761312461375d565b8260051b604051601f19603f830116810181811084821117156131495761314961375d565b60405284815283810192508684018288018501891015613167578687fd5b8692505b858310156131905761317c816130e7565b84529284019260019290920191840161316b565b50979650505050505050565b803560ff811681146130f257600080fd5b6000602082840312156131be578081fd5b81356117e881613773565b6000602082840312156131da578081fd5b81516117e881613773565b600080604083850312156131f7578081fd5b823561320281613773565b9150602083013561321281613773565b809150509250929050565b600080600060608486031215613231578081fd5b833561323c81613773565b9250602084013561324c81613773565b929592945050506040919091013590565b6000806040838503121561326f578182fd5b823561327a81613773565b9150602083013561321281613788565b6000806040838503121561329c578182fd5b82356132a781613773565b946020939093013593505050565b6000602082840312156132c6578081fd5b813567ffffffffffffffff8111156132dc578182fd5b6130df848285016130f7565b600080604083850312156132fa578182fd5b823567ffffffffffffffff811115613310578283fd5b61331c858286016130f7565b925050602083013561321281613788565b60006020828403121561333e578081fd5b81356117e881613788565b60006020828403121561335a578081fd5b81516117e881613788565b600060208284031215613376578081fd5b5035919050565b60006020828403121561338e578081fd5b5051919050565b600080604083850312156133a7578182fd5b50508035926020909101359150565b6000806000606084860312156133ca578283fd5b8351925060208401519150604084015190509250925092565b6000602082840312156133f4578081fd5b6117e88261319c565b60008060008060008060c08789031215613415578384fd5b61341e8761319c565b955061342c6020880161319c565b945061343a6040880161319c565b93506134486060880161319c565b92506134566080880161319c565b915061346460a0880161319c565b90509295509295509295565b6000815180845260208085019450808401835b838110156134a85781516001600160a01b031687529582019590820190600101613483565b509495945050505050565b6020815260006117e86020830184613470565b6000602080835283518082850152825b818110156134f2578581018301518582016040015282016134d6565b818111156135035783604083870101525b50601f01601f1916929092016040019392505050565b60208082526012908201527143616c6c6572206e6f7420696e205465616d60701b604082015260600190565b60208082526010908201526f3bb430b63290383937ba32b1ba34b7b760811b604082015260600190565b85815284602082015260a06040820152600061358e60a0830186613470565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156135be576135be613747565b500190565b600060ff821660ff84168060ff038211156135e0576135e0613747565b019392505050565b60008261360357634e487b7160e01b81526012600452602481fd5b500490565b600181815b8085111561364357816000190482111561362957613629613747565b8085161561363657918102915b93841c939080029061360d565b509250929050565b60006117e860ff84168360008261366457506001610ef4565b8161367157506000610ef4565b81600181146136875760028114613691576136ad565b6001915050610ef4565b60ff8411156136a2576136a2613747565b50506001821b610ef4565b5060208310610133831016604e8410600b84101617156136d0575081810a610ef4565b6136da8383613608565b80600019048211156136ee576136ee613747565b029392505050565b600081600019048311821515161561371057613710613747565b500290565b60008282101561372757613727613747565b500390565b600060001982141561374057613740613747565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461132957600080fd5b801515811461132957600080fdfea26469706673582212201f7194e8f261cc81dcb2af8cb0cd1c5e4bed558dbce368875232980486aaa57964736f6c63430008040033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed Bytecode

0x6080604052600436106104475760003560e01c80636f89e40911610232578063988c5ec91161012d578063d8e8de34116100b0578063e77bf5f811610077578063e77bf5f814610dbd578063eb8e886314610ddd578063f2fde38b14610df2578063f88b0e4614610e12578063f9963ca114610e2857005b8063d8e8de3414610cf7578063da1144d614610d17578063dd62ed3e14610d37578063dff6bcbf14610d7d578063e3aa94b014610d9d57005b8063a9059cbb116100f4578063a9059cbb14610c6d578063b76289b814610c8d578063b85111db14610cad578063c3f4f54f14610cc2578063d51f383b14610cd757005b8063988c5ec914610bbd5780639fa62d5f14610bdd578063a20623ce14610bfd578063a457c2d714610c2d578063a6fc178a14610c4d57005b80638728ecd1116101b55780638da5cb5b1161017c5780638da5cb5b14610ad8578063914e208a14610b2c57806393ab98f214610b4e57806395d89b4114610b6e5780639728c01914610b9d57005b80638728ecd114610a99578063887c60fb14610ab9578063893d20e814610ad85780638d060d7714610af65780638d2c503914610b0c57005b8063762bb282116101f9578063762bb28214610a2a5780637b9e987a14610a405780637f91937314610a5557806386d0ada814610a6a5780638724cc7214610a8457005b80636f89e4091461097557806370a082311461099f578063715018a6146109d557806371ab1f09146109ea57806373ddf08e14610a0a57005b8063311a86971161034257806348e907b7116102c5578063588aeaf21161028c578063588aeaf2146108d1578063589210d9146108f157806358e553651461090757806363b263b31461091d578063677a88701461094d57005b806348e907b7146108465780634ada218b1461085c5780634cdaf0ae1461087b5780634f91e48c1461089b57806357ad67d1146108b157005b80633d8dbf5d116103095780633d8dbf5d146107bb5780633e9be909146107db5780634089b170146107fb5780634607e6921461081157806348e531641461083157005b8063311a86971461073d578063313ce567146107525780633328b721146107665780633478154b14610786578063395093511461079b57005b80631285073c116103ca5780631eb25d13116103915780631eb25d131461065f5780631f8b845e1461056e578063230ffc421461067457806323b872dd146106b45780632973ef2d146106d457005b80631285073c146105cb57806314e91377146105ea5780631732ed7c1461060a57806318160ddd1461062a57806319e880841461063f57005b80630b1daa3e1161040e5780630b1daa3e1461052e5780630fa6c5ff1461054e5780630fd99e161461056e5780631193c691146105965780631201cbd0146105ab57005b8063029a1ecd1461045057806302a89e021461047057806306fdde031461049057806309218ee7146104d2578063095ea7b3146104fe57005b3661044e57005b005b34801561045c57600080fd5b5061044e61046b3660046131ad565b610e48565b34801561047c57600080fd5b5061044e61048b36600461332d565b610e98565b34801561049c57600080fd5b506040805180820190915260078152664d697474656e7360c81b60208201525b6040516104c991906134c6565b60405180910390f35b3480156104de57600080fd5b50601a546104ec9060ff1681565b60405160ff90911681526020016104c9565b34801561050a57600080fd5b5061051e61051936600461328a565b610ee3565b60405190151581526020016104c9565b34801561053a57600080fd5b5061044e6105493660046131ad565b610efa565b34801561055a57600080fd5b5061044e6105693660046131ad565b610f2a565b34801561057a57600080fd5b50610583606481565b60405161ffff90911681526020016104c9565b3480156105a257600080fd5b5061044e610f6c565b3480156105b757600080fd5b5061044e6105c636600461332d565b610fb9565b3480156105d757600080fd5b50601f545b6040519081526020016104c9565b3480156105f657600080fd5b5061044e61060536600461332d565b610ff1565b34801561061657600080fd5b5061044e61062536600461325d565b611030565b34801561063657600080fd5b506011546105dc565b34801561064b57600080fd5b5061044e61065a36600461325d565b611089565b34801561066b57600080fd5b506105dc6110d9565b34801561068057600080fd5b5061069c7325e1884da68ccc879e561ef9cd82b3abfc2968ce81565b6040516001600160a01b0390911681526020016104c9565b3480156106c057600080fd5b5061051e6106cf36600461321d565b6110f7565b3480156106e057600080fd5b506016546040805160ff640100000000840481168252600160281b840481166020830152600160301b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016104c9565b34801561074957600080fd5b506104ec604181565b34801561075e57600080fd5b5060096104ec565b34801561077257600080fd5b5061044e6107813660046131ad565b61118e565b34801561079257600080fd5b50610583600181565b3480156107a757600080fd5b5061051e6107b636600461328a565b6111d4565b3480156107c757600080fd5b5061044e6107d63660046131ad565b61120b565b3480156107e757600080fd5b5061044e6107f63660046132e8565b611254565b34801561080757600080fd5b506105dc60195481565b34801561081d57600080fd5b5061044e61082c366004613365565b6112ee565b34801561083d57600080fd5b5061044e61132c565b34801561085257600080fd5b506105dc60185481565b34801561086857600080fd5b5060205461051e90610100900460ff1681565b34801561088757600080fd5b5061044e6108963660046131ad565b61134b565b3480156108a757600080fd5b506105dc60135481565b3480156108bd57600080fd5b5061044e6108cc3660046133fd565b61139c565b3480156108dd57600080fd5b5061044e6108ec3660046131ad565b611532565b3480156108fd57600080fd5b506105dc60145481565b34801561091357600080fd5b506105dc601b5481565b34801561092957600080fd5b5061051e6109383660046131ad565b60046020526000908152604090205460ff1681565b34801561095957600080fd5b5061069c7387846a5b9304efd296e70c0e8ccd1fd80aabb89b81565b34801561098157600080fd5b5061098a611562565b604080519283526020830191909152016104c9565b3480156109ab57600080fd5b506105dc6109ba3660046131ad565b6001600160a01b031660009081526001602052604090205490565b3480156109e157600080fd5b5061044e61159f565b3480156109f657600080fd5b5060205461051e9062010000900460ff1681565b348015610a1657600080fd5b5061044e610a253660046133e3565b611652565b348015610a3657600080fd5b506105dc60125481565b348015610a4c57600080fd5b5061044e61168d565b348015610a6157600080fd5b5061044e6116e8565b348015610a7657600080fd5b5060205461051e9060ff1681565b348015610a9057600080fd5b50610583604181565b348015610aa557600080fd5b506105dc610ab43660046131ad565b6117b5565b348015610ac557600080fd5b50601e5461051e90610100900460ff1681565b348015610ae457600080fd5b506000546001600160a01b031661069c565b348015610b0257600080fd5b506105dc601d5481565b348015610b1857600080fd5b5061044e610b2736600461332d565b6117f4565b348015610b3857600080fd5b50610b4161182c565b6040516104c991906134b3565b348015610b5a57600080fd5b5061069c610b69366004613365565b61188e565b348015610b7a57600080fd5b5060408051808201909152600681526526a4aa2a22a760d11b60208201526104bc565b348015610ba957600080fd5b5061044e610bb83660046132e8565b6118b8565b348015610bc957600080fd5b5061051e610bd83660046131ad565b61199b565b348015610be957600080fd5b5061044e610bf8366004613395565b6119a8565b348015610c0957600080fd5b5061051e610c183660046131ad565b600d6020526000908152604090205460ff1681565b348015610c3957600080fd5b5061051e610c4836600461328a565b611a07565b348015610c5957600080fd5b5061044e610c6836600461332d565b611a83565b348015610c7957600080fd5b5061051e610c8836600461328a565b611abb565b348015610c9957600080fd5b5061044e610ca83660046131ad565b611ac8565b348015610cb957600080fd5b5061044e611af8565b348015610cce57600080fd5b506105dc611b72565b348015610ce357600080fd5b5061044e610cf2366004613365565b611bb2565b348015610d0357600080fd5b5061051e610d123660046131ad565b611c2d565b348015610d2357600080fd5b5061044e610d323660046132b5565b611c3a565b348015610d4357600080fd5b506105dc610d523660046131e5565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610d8957600080fd5b5061044e610d983660046131ad565b611cb9565b348015610da957600080fd5b5061044e610db83660046131ad565b611ce9565b348015610dc957600080fd5b5061044e610dd83660046131ad565b611e62565b348015610de957600080fd5b506104ec605f81565b348015610dfe57600080fd5b5061044e610e0d3660046131ad565b611e92565b348015610e1e57600080fd5b506105dc601f5481565b348015610e3457600080fd5b5061044e610e433660046131ad565b611fbb565b610e5133611ffc565b610e765760405162461bcd60e51b8152600401610e6d90613519565b60405180910390fd5b610e7f8161199b565b15610e8957600080fd5b610e94600b82611fe7565b5050565b610ea133611ffc565b610ebd5760405162461bcd60e51b8152600401610e6d90613519565b601680549115156701000000000000000267ff0000000000000019909216919091179055565b6000610ef0338484612061565b5060015b92915050565b610f0333611ffc565b610f1f5760405162461bcd60e51b8152600401610e6d90613519565b610e94600982612154565b610f3333611ffc565b610f4f5760405162461bcd60e51b8152600401610e6d90613519565b610f588161199b565b610f6157600080fd5b610e94600b82612154565b610f7533611ffc565b610f915760405162461bcd60e51b8152600401610e6d90613519565b602054610100900460ff1615610fa657600080fd5b6020805462ffff00191662010100179055565b610fc233611ffc565b610fde5760405162461bcd60e51b8152600401610e6d90613519565b600e805460ff1916911515919091179055565b610ffa33611ffc565b6110165760405162461bcd60e51b8152600401610e6d90613519565b601e80549115156101000261ff0019909216919091179055565b61103933611ffc565b6110555760405162461bcd60e51b8152600401610e6d90613519565b6001600160a01b0382166000908152600460205260409020805460ff1916821515179055611084600583611fe7565b505050565b61109233611ffc565b6110ae5760405162461bcd60e51b8152600401610e6d90613519565b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b6110e56009600a61364b565b6110f49064e8d4a510006136f6565b81565b6000611104848484612169565b6001600160a01b03841660009081526002602090815260408083203384529091529020548281101561116f5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610e6d565b611183853361117e8685613715565b612061565b506001949350505050565b61119733611ffc565b6111b35760405162461bcd60e51b8152600401610e6d90613519565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610ef091859061117e9086906135ab565b61121433611ffc565b6112305760405162461bcd60e51b8152600401610e6d90613519565b6001600160a01b03166000908152600d60205260409020805460ff19166001179055565b61125d33611ffc565b6112795760405162461bcd60e51b8152600401610e6d90613519565b60005b82518110156110845781600460008584815181106112aa57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806112e68161372c565b91505061127c565b6112f733611ffc565b6113135760405162461bcd60e51b8152600401610e6d90613519565b61132961132482633b9aca006136f6565b6124d6565b50565b601f5461133990426135ab565b33600090815260036020526040902055565b61135433611ffc565b6113705760405162461bcd60e51b8152600401610e6d90613519565b602080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6113a533611ffc565b6113c15760405162461bcd60e51b8152600401610e6d90613519565b6000846113ce87896135c3565b6113d891906135c3565b90508060ff1660641461143c5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610e6d565b605f60ff8516118015906114545750605f60ff841611155b80156114645750605f60ff831611155b6114b05760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610e6d565b506016805460ff928316620100000262ff0000199484166101000261ffff19978516600160301b029790971666ff00000000ffff19988516600160281b0265ff0000000000199a8616640100000000029a909a1665ffff0000000019909316929092179890981796909616959095179216919091179190911716919091179055565b61153b33611ffc565b6115575760405162461bcd60e51b8152600401610e6d90613519565b610e94600582611fe7565b6000806115716009600a61364b565b60125461157e91906135e8565b61158a6009600a61364b565b60135461159791906135e8565b915091509091565b336115b26000546001600160a01b031690565b6001600160a01b0316146116085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e6d565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61165b33611ffc565b6116775760405162461bcd60e51b8152600401610e6d90613519565b601a805460ff191660ff92909216919091179055565b61169633611ffc565b6116b25760405162461bcd60e51b8152600401610e6d90613519565b602054610100900460ff1680156116d1575060205462010000900460ff165b6116da57600080fd5b6020805462ff000019169055565b6116f133611ffc565b61170d5760405162461bcd60e51b8152600401610e6d90613519565b601b80546000918290556040519091907387846a5b9304efd296e70c0e8ccd1fd80aabb89b9083908381818185875af1925050503d806000811461176d576040519150601f19603f3d011682016040523d82523d6000602084013e611772565b606091505b5050905080610e945760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610e6d565b6001600160a01b0381166000908152600360205260408120544281116117de5750600092915050565b6117e84282613715565b9392505050565b905090565b6117fd33611ffc565b6118195760405162461bcd60e51b8152600401610e6d90613519565b6020805460ff1916911515919091179055565b6060601580548060200260200160405190810160405280929190818152602001828054801561188457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611866575b5050505050905090565b6015818154811061189e57600080fd5b6000918252602090912001546001600160a01b0316905081565b6118c133611ffc565b6118dd5760405162461bcd60e51b8152600401610e6d90613519565b60005b825181101561108457816004600085848151811061190e57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555061198883828151811061197057634e487b7160e01b600052603260045260246000fd5b60200260200101516005611fe790919063ffffffff16565b50806119938161372c565b9150506118e0565b6000610ef4600b8361262b565b6119b133611ffc565b6119cd5760405162461bcd60e51b8152600401610e6d90613519565b6119d96009600a61364b565b6119e390836136f6565b91506119f16009600a61364b565b6119fb90826136f6565b60129290925550601355565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611a6a5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610e6d565b611a79338561117e8685613715565b5060019392505050565b611a8c33611ffc565b611aa85760405162461bcd60e51b8152600401610e6d90613519565b6010805460ff1916911515919091179055565b6000610ef0338484612169565b611ad133611ffc565b611aed5760405162461bcd60e51b8152600401610e6d90613519565b610e94600782611fe7565b611b0133611ffc565b611b1d5760405162461bcd60e51b8152600401610e6d90613519565b604051600090339047908381818185875af1925050503d8060008114611b5f576040519150601f19603f3d011682016040523d82523d6000602084013e611b64565b606091505b505090508061132957600080fd5b6000611b806009600a61364b565b601154611b8f6009600a61364b565b611b9e9064e8d4a510006136f6565b611ba89190613715565b6117ef91906135e8565b611bbb33611ffc565b611bd75760405162461bcd60e51b8152600401610e6d90613519565b6001811115611c285760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610e6d565b601f55565b6000610ef460078361262b565b611c4333611ffc565b611c5f5760405162461bcd60e51b8152600401610e6d90613519565b60005b8151811015610e9457611ca6828281518110611c8e57634e487b7160e01b600052603260045260246000fd5b60200260200101516007611fe790919063ffffffff16565b5080611cb18161372c565b915050611c62565b611cc233611ffc565b611cde5760405162461bcd60e51b8152600401610e6d90613519565b610e94600582612154565b611cf233611ffc565b611d0e5760405162461bcd60e51b8152600401610e6d90613519565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b158015611d5257600080fd5b505afa158015611d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8a919061337d565b905060008111611ddc5760405162461bcd60e51b815260206004820152601860248201527f4e6f20746f6b656e7320696e206f75722062616c616e636500000000000000006044820152606401610e6d565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb90604401602060405180830381600087803b158015611e2457600080fd5b505af1158015611e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5c9190613349565b50505050565b611e6b33611ffc565b611e875760405162461bcd60e51b8152600401610e6d90613519565b610e94600782612154565b33611ea56000546001600160a01b031690565b6001600160a01b031614611efb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e6d565b6001600160a01b038116611f605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e6d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611fc433611ffc565b611fe05760405162461bcd60e51b8152600401610e6d90613519565b610e946009825b60006117e8836001600160a01b03841661264d565b600080546001600160a01b038381169116148061203557506001600160a01b0382167387846a5b9304efd296e70c0e8ccd1fd80aabb89b145b80610ef457506001600160a01b0382167325e1884da68ccc879e561ef9cd82b3abfc2968ce1492915050565b6001600160a01b0383166120ab5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610e6d565b6001600160a01b0382166120f35760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610e6d565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006117e8836001600160a01b03841661269c565b6001600160a01b0383166121b45760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610e6d565b6001600160a01b0382166121fd5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610e6d565b600061220a60058561262b565b8061221b575061221b60058461262b565b905060006001600160a01b03851630148061223e57506001600160a01b03841630145b6017546016549192506001600160a01b0390811691600091888116600160401b909204161480156122805750816001600160a01b0316866001600160a01b0316145b806122bb57506016546001600160a01b03878116600160401b909204161480156122bb5750816001600160a01b0316876001600160a01b0316145b6016549091506000906001600160a01b03898116600160401b9092041614806122f55750826001600160a01b0316886001600160a01b0316145b6016549091506000906001600160a01b03898116600160401b90920416148061232f5750836001600160a01b0316886001600160a01b0316145b9050848061233a5750825b806123425750855b15612357576123528989896127b3565b6124cb565b602054610100900460ff166124a0576000546001600160a01b038a811691161480159061239257506000546001600160a01b03898116911614155b156124a0576001600160a01b03891660009081526004602052604090205460ff161580156123d957506001600160a01b03881660009081526004602052604090205460ff16155b156124a0576016546301000000900460ff161561244957876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600060405161243691815260200190565b60405180910390a3505050505050505050565b602054610100900460ff166124a05760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610e6d565b60205462010000900460ff16156124be57612352898989858561287e565b6124cb8989898585612987565b505050505050505050565b601e805460ff19166001908117909155306000908152602091909152604081205460165490919061251b90600160301b810460ff90811691600160281b9004166135c3565b60ff1690506000600f5490508381111561253d5760105460ff161561253d5750825b8083108061254d575061ffff8216155b1561255a5750505061261e565b60165460009061ffff84169061257a90600160281b900460ff16846136f6565b61258491906135e8565b905060006125928284613715565b905060006125a16002846135e8565b905060006125af8285613715565b905060006125bd84836135ab565b9050476125c982612db9565b60006125d58247613715565b90506000836125e486846136f6565b6125ee91906135e8565b90506125fa8682612f3d565b60006126068447613715565b90506126118161300d565b5050505050505050505050505b50601e805460ff19169055565b6001600160a01b038116600090815260018301602052604081205415156117e8565b600081815260018301602052604081205461269457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ef4565b506000610ef4565b600081815260018301602052604081205480156127a95760006126c0600183613715565b85549091506000906126d490600190613715565b905060008660000182815481106126fb57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061272c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526001890190915260409020849055865487908061276d57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610ef4565b6000915050610ef4565b6001600160a01b038316600090815260016020526040902054818110156128175760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610e6d565b612821848361304a565b61282b838361308f565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161287091815260200190565b60405180910390a350505050565b806129735761288e60078561262b565b6128da5760405162461bcd60e51b815260206004820152601a60248201527f726563697069656e74206e6f74206f6e2077686974656c6973740000000000006044820152606401610e6d565b60416128e86009600a61364b565b6128f79064e8d4a510006136f6565b61290191906135e8565b6001600160a01b0385166000908152600160205260409020546129259085906135ab565b11156129735760405162461bcd60e51b815260206004820152601c60248201527f616d6f756e7420657863656564732077686974656c697374206d6178000000006044820152606401610e6d565b6129808585858585612987565b5050505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129f55760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610e6d565b6002601354612a0491906135e8565b600f5560008315612b9057600e5460ff1615612a40576001600160a01b0388166000908152600d602052604090205460ff1615612a4057600080fd5b612a4b60098961262b565b612ae5576001600160a01b03881660009081526003602052604090205442101580612a7d5750601e54610100900460ff165b612abe5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610e6d565b601f54612acb90426135ab565b6001600160a01b0389166000908152600360205260409020555b601354861115612b3b57601580546001810182556000919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180546001600160a01b0319166001600160a01b038a161790555b601354861115612b7f5760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610e6d565b50601654610100900460ff16612ca2565b8415612bef57601254612ba387856135ab565b1115612bc15760405162461bcd60e51b8152600401610e6d90613545565b601454861115612be35760405162461bcd60e51b8152600401610e6d90613545565b5060165460ff16612ca2565b601254612bfc87856135ab565b1115612c1a5760405162461bcd60e51b8152600401610e6d90613545565b612c2560098961262b565b612c94576001600160a01b03881660009081526003602052604090205442101580612c575750601e54610100900460ff165b612c945760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610e6d565b5060165462010000900460ff165b6016546001600160a01b03898116600160401b9092041614801590612cca575060205460ff16155b8015612cd95750601e5460ff16155b15612ce757612ce7866124d6565b601654600090612d179088908490612d129060ff600160281b8204811691600160301b9004166135c3565b6130b3565b90506000612d258289613715565b9050612d318a8961304a565b3060009081526001602052604081208054849290612d509084906135ab565b90915550612d609050898261308f565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612da591815260200190565b60405180910390a350505050505050505050565b601754612dd19030906001600160a01b031683612061565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612e1457634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612e6857600080fd5b505afa158015612e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea091906131c9565b81600181518110612ec157634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260175460405163791ac94760e01b815291169063791ac94790612f0790859060009086903090429060040161356f565b600060405180830381600087803b158015612f2157600080fd5b505af1158015612f35573d6000803e3d6000fd5b505050505050565b80601d6000828254612f4f91906135ab565b9091555050601754612f6c9030906001600160a01b031684612061565b60175460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b158015612fd457600080fd5b505af1158015612fe8573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061298091906133b6565b601a546000906064906130239060ff16846136f6565b61302d91906135e8565b905080601b600082825461304191906135ab565b90915550505050565b6001600160a01b03821660009081526001602052604081205461306e908390613715565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b03821660009081526001602052604081205461306e9083906135ab565b60006127108260ff168460ff16866130cb91906136f6565b6130d591906136f6565b6130df91906135e8565b949350505050565b80356130f281613773565b919050565b600082601f830112613107578081fd5b8135602067ffffffffffffffff808311156131245761312461375d565b8260051b604051601f19603f830116810181811084821117156131495761314961375d565b60405284815283810192508684018288018501891015613167578687fd5b8692505b858310156131905761317c816130e7565b84529284019260019290920191840161316b565b50979650505050505050565b803560ff811681146130f257600080fd5b6000602082840312156131be578081fd5b81356117e881613773565b6000602082840312156131da578081fd5b81516117e881613773565b600080604083850312156131f7578081fd5b823561320281613773565b9150602083013561321281613773565b809150509250929050565b600080600060608486031215613231578081fd5b833561323c81613773565b9250602084013561324c81613773565b929592945050506040919091013590565b6000806040838503121561326f578182fd5b823561327a81613773565b9150602083013561321281613788565b6000806040838503121561329c578182fd5b82356132a781613773565b946020939093013593505050565b6000602082840312156132c6578081fd5b813567ffffffffffffffff8111156132dc578182fd5b6130df848285016130f7565b600080604083850312156132fa578182fd5b823567ffffffffffffffff811115613310578283fd5b61331c858286016130f7565b925050602083013561321281613788565b60006020828403121561333e578081fd5b81356117e881613788565b60006020828403121561335a578081fd5b81516117e881613788565b600060208284031215613376578081fd5b5035919050565b60006020828403121561338e578081fd5b5051919050565b600080604083850312156133a7578182fd5b50508035926020909101359150565b6000806000606084860312156133ca578283fd5b8351925060208401519150604084015190509250925092565b6000602082840312156133f4578081fd5b6117e88261319c565b60008060008060008060c08789031215613415578384fd5b61341e8761319c565b955061342c6020880161319c565b945061343a6040880161319c565b93506134486060880161319c565b92506134566080880161319c565b915061346460a0880161319c565b90509295509295509295565b6000815180845260208085019450808401835b838110156134a85781516001600160a01b031687529582019590820190600101613483565b509495945050505050565b6020815260006117e86020830184613470565b6000602080835283518082850152825b818110156134f2578581018301518582016040015282016134d6565b818111156135035783604083870101525b50601f01601f1916929092016040019392505050565b60208082526012908201527143616c6c6572206e6f7420696e205465616d60701b604082015260600190565b60208082526010908201526f3bb430b63290383937ba32b1ba34b7b760811b604082015260600190565b85815284602082015260a06040820152600061358e60a0830186613470565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156135be576135be613747565b500190565b600060ff821660ff84168060ff038211156135e0576135e0613747565b019392505050565b60008261360357634e487b7160e01b81526012600452602481fd5b500490565b600181815b8085111561364357816000190482111561362957613629613747565b8085161561363657918102915b93841c939080029061360d565b509250929050565b60006117e860ff84168360008261366457506001610ef4565b8161367157506000610ef4565b81600181146136875760028114613691576136ad565b6001915050610ef4565b60ff8411156136a2576136a2613747565b50506001821b610ef4565b5060208310610133831016604e8410600b84101617156136d0575081810a610ef4565b6136da8383613608565b80600019048211156136ee576136ee613747565b029392505050565b600081600019048311821515161561371057613710613747565b500290565b60008282101561372757613727613747565b500390565b600060001982141561374057613740613747565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461132957600080fd5b801515811461132957600080fdfea26469706673582212201f7194e8f261cc81dcb2af8cb0cd1c5e4bed558dbce368875232980486aaa57964736f6c63430008040033

Deployed Bytecode Sourcemap

27718:32069:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50684:157;;;;;;;;;;-1:-1:-1;50684:157:0;;;;;:::i;:::-;;:::i;56064:110::-;;;;;;;;;;-1:-1:-1;56064:110:0;;;;;:::i;:::-;;:::i;57441:94::-;;;;;;;;;;-1:-1:-1;57522:5:0;;;;;;;;;;;;-1:-1:-1;;;57522:5:0;;;;57441:94;;;;;;;:::i;:::-;;;;;;;;43052:31;;;;;;;;;;-1:-1:-1;43052:31:0;;;;;;;;;;;19256:4:1;19244:17;;;19226:36;;19214:2;19199:18;43052:31:0;19181:87:1;58326:161:0;;;;;;;;;;-1:-1:-1;58326:161:0;;;;;:::i;:::-;;:::i;:::-;;;8711:14:1;;8704:22;8686:41;;8674:2;8659:18;58326:161:0;8641:92:1;53449:127:0;;;;;;;;;;-1:-1:-1;53449:127:0;;;;;:::i;:::-;;:::i;50893:155::-;;;;;;;;;;-1:-1:-1;50893:155:0;;;;;:::i;:::-;;:::i;29172:43::-;;;;;;;;;;;;29212:3;29172:43;;;;;17503:6:1;17491:19;;;17473:38;;17461:2;17446:18;29172:43:0;17428:89:1;54517:209:0;;;;;;;;;;;;;:::i;55935:121::-;;;;;;;;;;-1:-1:-1;55935:121:0;;;;;:::i;:::-;;:::i;48878:102::-;;;;;;;;;;-1:-1:-1;48960:12:0;;48878:102;;;8892:25:1;;;8880:2;8865:18;48878:102:0;8847:76:1;51546:103:0;;;;;;;;;;-1:-1:-1;51546:103:0;;;;;:::i;:::-;;:::i;49910:147::-;;;;;;;;;;-1:-1:-1;49910:147:0;;;;;:::i;:::-;;:::i;57751:108::-;;;;;;;;;;-1:-1:-1;57833:18:0;;57751:108;;49782:120;;;;;;;;;;-1:-1:-1;49782:120:0;;;;;:::i;:::-;;:::i;28542:70::-;;;;;;;;;;;;;:::i;29459:83::-;;;;;;;;;;;;29500:42;29459:83;;;;;-1:-1:-1;;;;;7345:32:1;;;7327:51;;7315:2;7300:18;29459:83:0;7282:102:1;58800:392:0;;;;;;;;;;-1:-1:-1;58800:392:0;;;;;:::i;:::-;;:::i;48136:246::-;;;;;;;;;;-1:-1:-1;48307:8:0;;48136:246;;;48307:8;;;;;;18831:25:1;;-1:-1:-1;;;48316:13:0;;;;18887:2:1;18872:18;;18865:34;-1:-1:-1;;;48330:13:0;;;;18915:18:1;;;18908:34;;;;48344:7:0;;;18973:2:1;18958:18;;18951:34;48307:8:0;48352;;;;19016:3:1;19001:19;;18994:35;48361:12:0;;;;;19060:3:1;19045:19;;19038:35;18818:3;18803:19;48136:246:0;18785:294:1;28924:44:0;;;;;;;;;;;;28966:2;28924:44;;57649:94;;;;;;;;;;-1:-1:-1;28534:1:0;57649:94;;56307:115;;;;;;;;;;-1:-1:-1;56307:115:0;;;;;:::i;:::-;;:::i;29298:49::-;;;;;;;;;;;;29338:9;29298:49;;59227:205;;;;;;;;;;-1:-1:-1;59227:205:0;;;;;:::i;:::-;;:::i;56182:117::-;;;;;;;;;;-1:-1:-1;56182:117:0;;;;;:::i;:::-;;:::i;50067:210::-;;;;;;;;;;-1:-1:-1;50067:210:0;;;;;:::i;:::-;;:::i;42972:27::-;;;;;;;;;;;;;;;;52856:120;;;;;;;;;;-1:-1:-1;52856:120:0;;;;;:::i;:::-;;:::i;49120:107::-;;;;;;;;;;;;;:::i;42864:38::-;;;;;;;;;;;;;;;;54334:26;;;;;;;;;;-1:-1:-1;54334:26:0;;;;;;;;;;;54974:145;;;;;;;;;;-1:-1:-1;54974:145:0;;;;;:::i;:::-;;:::i;30120:46::-;;;;;;;;;;;;;;;;52015:591;;;;;;;;;;-1:-1:-1;52015:591:0;;;;;:::i;:::-;;:::i;53033:110::-;;;;;;;;;;-1:-1:-1;53033:110:0;;;;;:::i;:::-;;:::i;30173:45::-;;;;;;;;;;;;;;;;43135:31;;;;;;;;;;;;;;;;28030:40;;;;;;;;;;-1:-1:-1;28030:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29375:77;;;;;;;;;;;;29410:42;29375:77;;47979:149;;;;;;;;;;;;;:::i;:::-;;;;18465:25:1;;;18521:2;18506:18;;18499:34;;;;18438:18;47979:149:0;18420:119:1;57867:121:0;;;;;;;;;;-1:-1:-1;57867:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;57962:18:0;57935:7;57962:18;;;:9;:18;;;;;;;57867:121;9297:140;;;;;;;;;;;;;:::i;54367:28::-;;;;;;;;;;-1:-1:-1;54367:28:0;;;;;;;;;;;52681:107;;;;;;;;;;-1:-1:-1;52681:107:0;;;;;:::i;:::-;;:::i;30064:49::-;;;;;;;;;;;;;;;;54768:138;;;;;;;;;;;;;:::i;51056:233::-;;;;;;;;;;;;;:::i;49636:28::-;;;;;;;;;;-1:-1:-1;49636:28:0;;;;;;;;29049:54;;;;;;;;;;;;29101:2;29049:54;;48597:275;;;;;;;;;;-1:-1:-1;48597:275:0;;;;;:::i;:::-;;:::i;49567:28::-;;;;;;;;;;-1:-1:-1;49567:28:0;;;;;;;;;;;57339:94;;;;;;;;;;-1:-1:-1;57391:7:0;8721:6;-1:-1:-1;;;;;8721:6:0;57339:94;;44297:25;;;;;;;;;;;;;;;;51375:109;;;;;;;;;;-1:-1:-1;51375:109:0;;;;;:::i;:::-;;:::i;49675:97::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30225:28::-;;;;;;;;;;-1:-1:-1;30225:28:0;;;;;:::i;:::-;;:::i;57543:98::-;;;;;;;;;;-1:-1:-1;57626:7:0;;;;;;;;;;;;-1:-1:-1;;;57626:7:0;;;;57543:98;;50285:244;;;;;;;;;;-1:-1:-1;50285:244:0;;;;;:::i;:::-;;:::i;43485:130::-;;;;;;;;;;-1:-1:-1;43485:130:0;;;;;:::i;:::-;;:::i;53681:313::-;;;;;;;;;;-1:-1:-1;53681:313:0;;;;;:::i;:::-;;:::i;28302:43::-;;;;;;;;;;-1:-1:-1;28302:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59440:342;;;;;;;;;;-1:-1:-1;59440:342:0;;;;;:::i;:::-;;:::i;50537:100::-;;;;;;;;;;-1:-1:-1;50537:100:0;;;;;:::i;:::-;;:::i;57996:167::-;;;;;;;;;;-1:-1:-1;57996:167:0;;;;;:::i;:::-;;:::i;55156:113::-;;;;;;;;;;-1:-1:-1;55156:113:0;;;;;:::i;:::-;;:::i;56762:151::-;;;;;;;;;;;;;:::i;47842:129::-;;;;;;;;;;;;;:::i;51720:201::-;;;;;;;;;;-1:-1:-1;51720:201:0;;;;;:::i;:::-;;:::i;48390:140::-;;;;;;;;;;-1:-1:-1;48390:140:0;;;;;:::i;:::-;;:::i;55275:203::-;;;;;;;;;;-1:-1:-1;55275:203:0;;;;;:::i;:::-;;:::i;58171:147::-;;;;;;;;;;-1:-1:-1;58171:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;58282:19:0;;;58255:7;58282:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;58171:147;53149:111;;;;;;;;;;-1:-1:-1;53149:111:0;;;;;:::i;:::-;;:::i;55621:285::-;;;;;;;;;;-1:-1:-1;55621:285:0;;;;;:::i;:::-;;:::i;55484:127::-;;;;;;;;;;-1:-1:-1;55484:127:0;;;;;:::i;:::-;;:::i;30346:31::-;;;;;;;;;;;;30375:2;30346:31;;9592:236;;;;;;;;;;-1:-1:-1;9592:236:0;;;;;:::i;:::-;;:::i;49602:27::-;;;;;;;;;;;;;;;;53317:126;;;;;;;;;;-1:-1:-1;53317:126:0;;;;;:::i;:::-;;:::i;50684:157::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;;;;;;;;;50764:26:::1;50785:4;50764:20;:26::i;:::-;50763:27;50755:36;;;::::0;::::1;;50802:29;:19;50826:4:::0;50802:23:::1;:29::i;:::-;;50684:157:::0;:::o;56064:110::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;56140:17:::1;:26:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;56140:26:0;;::::1;::::0;;;::::1;::::0;;56064:110::o;58326:161::-;58403:4;58420:37;58429:10;58441:7;58450:6;58420:8;:37::i;:::-;-1:-1:-1;58475:4:0;58326:161;;;;;:::o;53449:127::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;53531:37:::1;:21;53560:7:::0;53531:28:::1;:37::i;50893:155::-:0;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;50970:26:::1;50991:4;50970:20;:26::i;:::-;50962:35;;;::::0;::::1;;51008:32;:19;51035:4:::0;51008:26:::1;:32::i;54517:209::-:0;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;54591:14:::1;::::0;::::1;::::0;::::1;;;54590:15;54582:24;;;::::0;::::1;;54667:14;:19:::0;;-1:-1:-1;;54697:21:0;;;;;54517:209::o;55935:121::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;56016:11:::1;:32:::0;;-1:-1:-1;;56016:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55935:121::o;51546:103::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;51616:16:::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;51616:25:0;;::::1;::::0;;;::::1;::::0;;51546:103::o;49910:147::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49998:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;49998:21:0::1;::::0;::::1;;;::::0;;50030:19:::1;:9;49998:13:::0;50030::::1;:19::i;:::-;;49910:147:::0;;:::o;49782:120::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49873:13:0;;;::::1;;::::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;49873:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49782:120::o;28542:70::-;28599:13;28534:1;28599:2;:13;:::i;:::-;28581:31;;:15;:31;:::i;:::-;28542:70;:::o;58800:392::-;58900:4;58917:36;58927:6;58935:9;58946:6;58917:9;:36::i;:::-;-1:-1:-1;;;;;58993:19:0;;58966:24;58993:19;;;:11;:19;;;;;;;;59013:10;58993:31;;;;;;;;59043:26;;;;59035:59;;;;-1:-1:-1;;;59035:59:0;;11536:2:1;59035:59:0;;;11518:21:1;11575:2;11555:18;;;11548:30;-1:-1:-1;;;11594:18:1;;;11587:50;11654:18;;59035:59:0;11508:170:1;59035:59:0;59107:55;59116:6;59124:10;59136:25;59155:6;59136:16;:25;:::i;:::-;59107:8;:55::i;:::-;-1:-1:-1;59180:4:0;;58800:392;-1:-1:-1;;;;58800:392:0:o;56307:115::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56386:20:0::1;56409:5;56386:20:::0;;;:10:::1;:20;::::0;;;;:28;;-1:-1:-1;;56386:28:0::1;::::0;;56307:115::o;59227:205::-;59335:10;59309:4;59356:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;59356:32:0;;;;;;;;;;59309:4;;59326:76;;59347:7;;59356:45;;59391:10;;59356:45;:::i;56182:117::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56261:23:0::1;;::::0;;;:10:::1;:23;::::0;;;;:30;;-1:-1:-1;;56261:30:0::1;56287:4;56261:30;::::0;;56182:117::o;50067:210::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;50170:9:::1;50190:80;50201:4;:11;50199:1;:13;50190:80;;;50253:5;50234:7;:16;50242:4;50247:1;50242:7;;;;;;-1:-1:-1::0;;;50242:7:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;50234:16:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;50234:16:0;:24;;-1:-1:-1;;50234:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50214:3;::::1;::::0;::::1;:::i;:::-;;;;50190:80;;52856:120:::0;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;52936:32:::1;52955:12;:4:::0;52962:5:::1;52955:12;:::i;:::-;52936:18;:32::i;:::-;52856:120:::0;:::o;49120:107::-;49207:12;;49191:28;;:15;:28;:::i;:::-;49179:10;49169:21;;;;:9;:21;;;;;:50;49120:107::o;54974:145::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;55067:22:::1;:44:::0;;-1:-1:-1;;;;;55067:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;55067:44:0;;::::1;::::0;;;::::1;::::0;;54974:145::o;52015:591::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;52171:14:::1;52211::::0;52186:24:::1;52196:14:::0;52186:9;:24:::1;:::i;:::-;:39;;;;:::i;:::-;52171:54;;52244:8;:13;;52254:3;52244:13;52236:64;;;::::0;-1:-1:-1;;;52236:64:0;;12941:2:1;52236:64:0::1;::::0;::::1;12923:21:1::0;12980:2;12960:18;;;12953:30;13019:34;12999:18;;;12992:62;-1:-1:-1;;;13070:18:1;;;13063:36;13116:19;;52236:64:0::1;12913:228:1::0;52236:64:0::1;30375:2;52319:14;::::0;::::1;;::::0;::::1;::::0;:31:::1;;-1:-1:-1::0;30375:2:0::1;52335:15;::::0;::::1;;;52319:31;:52;;;;-1:-1:-1::0;30375:2:0::1;52352:19;::::0;::::1;;;52319:52;52311:89;;;::::0;-1:-1:-1;;;52311:89:0;;15105:2:1;52311:89:0::1;::::0;::::1;15087:21:1::0;15144:2;15124:18;;;15117:30;15183:27;15163:18;;;15156:55;15228:18;;52311:89:0::1;15077:175:1::0;52311:89:0::1;-1:-1:-1::0;52413:8:0::1;:18:::0;;::::1;52574:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;52547:16:0;;::::1;52413:18;52547:16;-1:-1:-1::0;;52481:28:0;;::::1;-1:-1:-1::0;;;52481:28:0::1;52547:16:::0;;;;-1:-1:-1;;52442:28:0;;::::1;-1:-1:-1::0;;;52442:28:0::1;-1:-1:-1::0;;52413:18:0;;::::1;::::0;::::1;52442:28:::0;;;;-1:-1:-1;;52442:28:0;;;;;;;;;;::::1;52547:16:::0;;;;;;;;52522:14;::::1;52547:16:::0;;;;;;;::::1;52574:24;::::0;;;::::1;::::0;;52015:591::o;53033:110::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;53113:22:::1;:9;53127:7:::0;53113:13:::1;:22::i;47979:149::-:0;48020:15;;48081:13;28534:1;48081:2;:13;:::i;:::-;48068:12;;:26;;;;:::i;:::-;48106:13;28534:1;48106:2;:13;:::i;:::-;48096:9;;:23;;;;:::i;:::-;48061:59;;;;47979:149;;:::o;9297:140::-;8879:10;8868:7;8694;8721:6;-1:-1:-1;;;;;8721:6:0;;8656:79;8868:7;-1:-1:-1;;;;;8868:21:0;;8860:66;;;;-1:-1:-1;;;8860:66:0;;13692:2:1;8860:66:0;;;13674:21:1;;;13711:18;;;13704:30;13770:34;13750:18;;;13743:62;13822:18;;8860:66:0;13664:182:1;8860:66:0;9396:1:::1;9380:6:::0;;9359:40:::1;::::0;-1:-1:-1;;;;;9380:6:0;;::::1;::::0;9359:40:::1;::::0;9396:1;;9359:40:::1;9427:1;9410:19:::0;;-1:-1:-1;;;;;;9410:19:0::1;::::0;;9297:140::o;52681:107::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;52757:14:::1;:23:::0;;-1:-1:-1;;52757:23:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;52681:107::o;54768:138::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;54832:14:::1;::::0;::::1;::::0;::::1;;;:32:::0;::::1;;;-1:-1:-1::0;54848:16:0::1;::::0;;;::::1;;;54832:32;54824:41;;;::::0;::::1;;54876:16;:22:::0;;-1:-1:-1;;54876:22:0::1;::::0;;54768:138::o;51056:233::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;51133:16:::1;::::0;;51118:14:::1;51160:18:::0;;;;51203:36:::1;::::0;51133:16;;51118:14;29410:42:::1;::::0;51133:16;;51118:14;51203:36;51118:14;51203:36;51133:16;29410:42;51203:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51189:50;;;51258:4;51250:31;;;::::0;-1:-1:-1;;;51250:31:0;;16147:2:1;51250:31:0::1;::::0;::::1;16129:21:1::0;16186:2;16166:18;;;16159:30;-1:-1:-1;;;16205:18:1;;;16198:45;16260:18;;51250:31:0::1;16119:165:1::0;48597:275:0;-1:-1:-1;;;;;48718:25:0;;48683:7;48718:25;;;:9;:25;;;;;;48766:15;48756:25;;48753:71;;-1:-1:-1;48812:1:0;;48597:275;-1:-1:-1;;48597:275:0:o;48753:71::-;48840:24;48849:15;48840:8;:24;:::i;:::-;48833:31;48597:275;-1:-1:-1;;;48597:275:0:o;57418:7::-;57411:14;;57339:94;:::o;51375:109::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;51453:16:::1;:23:::0;;-1:-1:-1;;51453:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;51375:109::o;49675:97::-;49717:16;49753:11;49746:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49746:18:0;;;;;;;;;;;;;;;;;;;;;;;49675:97;:::o;30225:28::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30225:28:0;;-1:-1:-1;30225:28:0;:::o;50285:244::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;50385:9:::1;50405:117;50416:4;:11;50414:1;:13;50405:117;;;50468:5;50449:7;:16;50457:4;50462:1;50457:7;;;;;;-1:-1:-1::0;;;50457:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;50449:16:0::1;-1:-1:-1::0;;;;;50449:16:0::1;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;50488:22;50502:4;50507:1;50502:7;;;;;;-1:-1:-1::0;;;50502:7:0::1;;;;;;;;;;;;;;;50488:9;:13;;:22;;;;:::i;:::-;-1:-1:-1::0;50429:3:0;::::1;::::0;::::1;:::i;:::-;;;;50405:117;;43485:130:::0;43550:4;43573:34;:19;43602:4;43573:28;:34::i;53681:313::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;53847:13:::1;28534:1;53847:2;:13;:::i;:::-;53831:29;::::0;:15;:29:::1;:::i;:::-;53815:45:::0;-1:-1:-1;53897:13:0::1;28534:1;53897:2;:13;:::i;:::-;53884:26;::::0;:12;:26:::1;:::i;:::-;53921:12;:30:::0;;;;-1:-1:-1;53962:9:0::1;:24:::0;53681:313::o;59440:342::-;59583:10;59527:4;59571:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;59571:32:0;;;;;;;;;;59622:35;;;;59614:60;;;;-1:-1:-1;;;59614:60:0;;16843:2:1;59614:60:0;;;16825:21:1;16882:2;16862:18;;;16855:30;-1:-1:-1;;;16901:18:1;;;16894:42;16953:18;;59614:60:0;16815:162:1;59614:60:0;59687:65;59696:10;59708:7;59717:34;59736:15;59717:16;:34;:::i;59687:65::-;-1:-1:-1;59770:4:0;;59440:342;-1:-1:-1;;;59440:342:0:o;50537:100::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;50606:12:::1;:23:::0;;-1:-1:-1;;50606:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50537:100::o;57996:167::-;58076:4;58093:40;58103:10;58115:9;58126:6;58093:9;:40::i;55156:113::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;55233:28:::1;:10;55248:12:::0;55233:14:::1;:28::i;56762:151::-:0;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;56830:51:::1;::::0;56817:9:::1;::::0;56830:10:::1;::::0;56854:21:::1;::::0;56817:9;56830:51;56817:9;56830:51;56854:21;56830:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56816:65;;;56900:4;56892:13;;;::::0;::::1;47842:129:::0;47889:7;47950:13;28534:1;47950:2;:13;:::i;:::-;47930:18;;28599:13;28534:1;28599:2;:13;:::i;:::-;28581:31;;:15;:31;:::i;:::-;47916:32;;;;:::i;:::-;47915:48;;;;:::i;51720:201::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;29338:9:::1;51811:32:::0;::::1;;51803:67;;;::::0;-1:-1:-1;;;51803:67:0;;16491:2:1;51803:67:0::1;::::0;::::1;16473:21:1::0;16530:2;16510:18;;;16503:30;16569:25;16549:18;;;16542:53;16612:18;;51803:67:0::1;16463:173:1::0;51803:67:0::1;51885:12;:28:::0;51720:201::o;48390:140::-;48464:4;48487:35;:10;48507:14;48487:19;:35::i;55275:203::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;55372:6:::1;55368:103;55384:14;:21;55382:1;:23;55368:103;;;55426:33;55441:14;55456:1;55441:17;;;;;;-1:-1:-1::0;;;55441:17:0::1;;;;;;;;;;;;;;;55426:10;:14;;:33;;;;:::i;:::-;-1:-1:-1::0;55407:3:0;::::1;::::0;::::1;:::i;:::-;;;;55368:103;;53149:111:::0;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;53227:25:::1;:9;53244:7:::0;53227:16:::1;:25::i;55621:285::-:0;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;55759:30:::1;::::0;-1:-1:-1;;;55759:30:0;;55783:4:::1;55759:30;::::0;::::1;7327:51:1::0;55716:10:0;;55694:12:::1;::::0;-1:-1:-1;;;;;55759:15:0;::::1;::::0;::::1;::::0;7300:18:1;;55759:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55738:51;;55819:1;55808:10;:12;55800:49;;;::::0;-1:-1:-1;;;55800:49:0;;14752:2:1;55800:49:0::1;::::0;::::1;14734:21:1::0;14791:2;14771:18;;;14764:30;14830:26;14810:18;;;14803:54;14874:18;;55800:49:0::1;14724:174:1::0;55800:49:0::1;55860:38;::::0;-1:-1:-1;;;55860:38:0;;55875:10:::1;55860:38;::::0;::::1;7563:51:1::0;7630:18;;;7623:34;;;-1:-1:-1;;;;;55860:14:0;::::1;::::0;::::1;::::0;7536:18:1;;55860:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30964:1;;55621:285:::0;:::o;55484:127::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;55569:34:::1;:10;55587:15:::0;55569:17:::1;:34::i;9592:236::-:0;8879:10;8868:7;8694;8721:6;-1:-1:-1;;;;;8721:6:0;;8656:79;8868:7;-1:-1:-1;;;;;8868:21:0;;8860:66;;;;-1:-1:-1;;;8860:66:0;;13692:2:1;8860:66:0;;;13674:21:1;;;13711:18;;;13704:30;13770:34;13750:18;;;13743:62;13822:18;;8860:66:0;13664:182:1;8860:66:0;-1:-1:-1;;;;;9673:22:0;::::1;9665:73;;;::::0;-1:-1:-1;;;9665:73:0;;10438:2:1;9665:73:0::1;::::0;::::1;10420:21:1::0;10477:2;10457:18;;;10450:30;10516:34;10496:18;;;10489:62;-1:-1:-1;;;10567:18:1;;;10560:36;10613:19;;9665:73:0::1;10410:228:1::0;9665:73:0::1;9775:6;::::0;;9754:38:::1;::::0;-1:-1:-1;;;;;9754:38:0;;::::1;::::0;9775:6;::::1;::::0;9754:38:::1;::::0;::::1;9803:6;:17:::0;;-1:-1:-1;;;;;;9803:17:0::1;-1:-1:-1::0;;;;;9803:17:0;;;::::1;::::0;;;::::1;::::0;;9592:236::o;53317:126::-;30911:19;30919:10;30911:7;:19::i;:::-;30903:50;;;;-1:-1:-1;;;30903:50:0;;;;;;;:::i;:::-;53401:34:::1;:21;53427:7:::0;24343:152;24413:4;24437:50;24442:3;-1:-1:-1;;;;;24462:23:0;;24437:4;:50::i;31191:139::-;31244:4;8721:6;;-1:-1:-1;;;;;31267:13:0;;;8721:6;;31267:13;;:31;;-1:-1:-1;;;;;;31282:16:0;;29410:42;31282:16;31267:31;:55;;;-1:-1:-1;;;;;;31300:22:0;;29500:42;31300:22;31260:62;31191:139;-1:-1:-1;;31191:139:0:o;58493:299::-;-1:-1:-1;;;;;58586:19:0;;58578:49;;;;-1:-1:-1;;;58578:49:0;;10845:2:1;58578:49:0;;;10827:21:1;10884:2;10864:18;;;10857:30;-1:-1:-1;;;10903:18:1;;;10896:47;10960:18;;58578:49:0;10817:167:1;58578:49:0;-1:-1:-1;;;;;58646:21:0;;58638:49;;;;-1:-1:-1;;;58638:49:0;;13348:2:1;58638:49:0;;;13330:21:1;13387:2;13367:18;;;13360:30;-1:-1:-1;;;13406:18:1;;;13399:45;13461:18;;58638:49:0;13320:165:1;58638:49:0;-1:-1:-1;;;;;58700:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;58752:32;;8892:25:1;;;58752:32:0;;8865:18:1;58752:32:0;;;;;;;58493:299;;;:::o;24671:158::-;24744:4;24768:53;24776:3;-1:-1:-1;;;;;24796:23:0;;24768:7;:53::i;34464:2127::-;-1:-1:-1;;;;;34560:20:0;;34552:51;;;;-1:-1:-1;;;34552:51:0;;9738:2:1;34552:51:0;;;9720:21:1;9777:2;9757:18;;;9750:30;-1:-1:-1;;;9796:18:1;;;9789:48;9854:18;;34552:51:0;9710:168:1;34552:51:0;-1:-1:-1;;;;;34622:23:0;;34614:52;;;;-1:-1:-1;;;34614:52:0;;11191:2:1;34614:52:0;;;11173:21:1;11230:2;11210:18;;;11203:30;-1:-1:-1;;;11249:18:1;;;11242:46;11305:18;;34614:52:0;11163:166:1;34614:52:0;34753:15;34772:26;:9;34791:6;34772:18;:26::i;:::-;:59;;;-1:-1:-1;34802:29:0;:9;34821;34802:18;:29::i;:::-;34753:79;-1:-1:-1;34923:23:0;-1:-1:-1;;;;;34948:21:0;;34964:4;34948:21;;:49;;-1:-1:-1;;;;;;34973:24:0;;34992:4;34973:24;34948:49;35122:14;;35187:19;;34923:75;;-1:-1:-1;;;;;;35122:14:0;;;;35092:21;;35177:29;;;-1:-1:-1;;;35187:19:0;;;;35177:29;:59;;;;;35223:13;-1:-1:-1;;;;;35210:26:0;:9;-1:-1:-1;;;;;35210:26:0;;35177:59;35176:135;;;-1:-1:-1;35264:19:0;;-1:-1:-1;;;;;35251:32:0;;;-1:-1:-1;;;35264:19:0;;;;35251:32;:59;;;;;35297:13;-1:-1:-1;;;;;35287:23:0;:6;-1:-1:-1;;;;;35287:23:0;;35251:59;35433:19;;35148:164;;-1:-1:-1;35414:10:0;;-1:-1:-1;;;;;35425:27:0;;;-1:-1:-1;;;35433:19:0;;;;35425:27;;:53;;;35465:13;-1:-1:-1;;;;;35455:23:0;:6;-1:-1:-1;;;;;35455:23:0;;35425:53;35512:19;;35414:64;;-1:-1:-1;35489:11:0;;-1:-1:-1;;;;;35501:30:0;;;-1:-1:-1;;;35512:19:0;;;;35501:30;;:59;;;35547:13;-1:-1:-1;;;;;35534:26:0;:9;-1:-1:-1;;;;;35534:26:0;;35501:59;35489:71;;35601:18;:41;;;;35623:19;35601:41;:55;;;;35646:10;35601:55;35598:986;;;35672:43;35689:6;35697:9;35708:6;35672:16;:43::i;:::-;35598:986;;;35830:14;;;;;;;35825:518;;8694:7;8721:6;-1:-1:-1;;;;;35869:17:0;;;8721:6;;35869:17;;;;:41;;-1:-1:-1;8694:7:0;8721:6;-1:-1:-1;;;;;35890:20:0;;;8721:6;;35890:20;;35869:41;35865:463;;;-1:-1:-1;;;;;35940:15:0;;;;;;:7;:15;;;;;;;;35939:16;:39;;;;-1:-1:-1;;;;;;35960:18:0;;;;;;:7;:18;;;;;;;;35959:19;35939:39;35935:374;;;36011:7;;;;;;;36007:279;;;36071:9;-1:-1:-1;;;;;36055:28:0;36064:6;-1:-1:-1;;;;;36055:28:0;;36081:1;36055:28;;;;8892:25:1;;8880:2;8865:18;;8847:76;36055:28:0;;;;;;;;36113:7;;;;;;34464:2127;;;:::o;36007:279::-;36217:14;;;;;;;36209:49;;;;-1:-1:-1;;;36209:49:0;;14053:2:1;36209:49:0;;;14035:21:1;14092:2;14072:18;;;14065:30;14131:25;14111:18;;;14104:53;14174:18;;36209:49:0;14025:173:1;36209:49:0;36360:16;;;;;;;36357:216;;;36396:56;36415:6;36422:9;36432:6;36439:5;36445:6;36396:18;:56::i;36357:216::-;36505:52;36520:6;36527:9;36537:6;36544:5;36550:6;36505:14;:52::i;:::-;34464:2127;;;;;;;;;:::o;44702:1771::-;44450:27;:34;;-1:-1:-1;;44450:34:0;44480:4;44450:34;;;;;;44820:4:::1;44450:27:::0;44802:24;;;::::1;::::0;;;;;;;;44867:13:::1;::::0;44802:24;;44450:27;44853::::1;::::0;-1:-1:-1;;;44867:13:0;::::1;44450:34:::0;44867:13;;::::1;::::0;-1:-1:-1;;;44853:13:0;::::1;;:27;:::i;:::-;44837:43;;;;44891:19;44911:9;;44891:29;;44948:8;44934:11;:22;44931:127;;;44976:12;::::0;::::1;;44973:74;;;-1:-1:-1::0;45023:8:0;44973:74:::1;45184:11;45168:15;:27;:40;;;-1:-1:-1::0;45197:11:0::1;::::0;::::1;::::0;45168:40:::1;45165:77;;;45224:7;;;;;45165:77;45362:13;::::0;45323:25:::1;::::0;45349:36:::1;::::0;::::1;::::0;45350:25:::1;::::0;-1:-1:-1;;;45362:13:0;::::1;;;45350:11:::0;:25:::1;:::i;:::-;45349:36;;;;:::i;:::-;45323:62:::0;-1:-1:-1;45396:25:0::1;45423:29;45323:62:::0;45423:11;:29:::1;:::i;:::-;45396:56:::0;-1:-1:-1;45513:16:0::1;45530:19;45548:1;45530:17:::0;:19:::1;:::i;:::-;45513:36:::0;-1:-1:-1;45560:19:0::1;45580:26;45513:36:::0;45580:17;:26:::1;:::i;:::-;45560:46:::0;-1:-1:-1;45689:17:0::1;45707:29;45719:17:::0;45560:46;45707:29:::1;:::i;:::-;45689:47:::0;-1:-1:-1;45851:21:0::1;45883:27;45689:47:::0;45883:16:::1;:27::i;:::-;45921:14;45937:41;45961:17:::0;45937:21:::1;:41;:::i;:::-;45921:58:::0;-1:-1:-1;46079:14:0::1;46117:9:::0;46097:18:::1;46104:11:::0;45921:58;46097:18:::1;:::i;:::-;46096:30;;;;:::i;:::-;46079:47;;46137:31;46151:8;46161:6;46137:13;:31::i;:::-;46291:20;46313:41;46337:17:::0;46313:21:::1;:41;:::i;:::-;46291:64;;46433:32;46452:12;46433:18;:32::i;:::-;44495:1;;;;;;;;;;;;;-1:-1:-1::0;44507:27:0;:35;;-1:-1:-1;;44507:35:0;;;44702:1771::o;24915:167::-;-1:-1:-1;;;;;25049:23:0;;24995:4;21724:19;;;:12;;;:19;;;;;;:24;;25019:55;21627:129;19398:414;19461:4;21724:19;;;:12;;;:19;;;;;;19478:327;;-1:-1:-1;19521:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;19704:18;;19682:19;;;:12;;;:19;;;;;;:40;;;;19737:11;;19478:327;-1:-1:-1;19788:5:0;19781:12;;19988:1553;20054:4;20193:19;;;:12;;;:19;;;;;;20229:15;;20225:1309;;20591:21;20615:14;20628:1;20615:10;:14;:::i;:::-;20664:18;;20591:38;;-1:-1:-1;20644:17:0;;20664:22;;20685:1;;20664:22;:::i;:::-;20644:42;;20931:17;20951:3;:11;;20963:9;20951:22;;;;;;-1:-1:-1;;;20951:22:0;;;;;;;;;;;;;;;;;20931:42;;21097:9;21068:3;:11;;21080:13;21068:26;;;;;;-1:-1:-1;;;21068:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;21174:23;;;:12;;;:23;;;;;;:36;;;21335:17;;21174:3;;21335:17;;;-1:-1:-1;;;21335:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;21430:3;:12;;:19;21443:5;21430:19;;;;;;;;;;;21423:26;;;21473:4;21466:11;;;;;;;;20225:1309;21517:5;21510:12;;;;;40804:432;-1:-1:-1;;;;;40923:17:0;;40899:21;40923:17;;;:9;:17;;;;;;40959:23;;;;40951:60;;;;-1:-1:-1;;;40951:60:0;;10085:2:1;40951:60:0;;;10067:21:1;10124:2;10104:18;;;10097:30;-1:-1:-1;;;10143:18:1;;;10136:54;10207:18;;40951:60:0;10057:174:1;40951:60:0;41067:27;41080:6;41087;41067:12;:27::i;:::-;41147:28;41157:9;41168:6;41147:9;:28::i;:::-;41209:9;-1:-1:-1;;;;;41193:33:0;41202:6;-1:-1:-1;;;;;41193:33:0;;41219:6;41193:33;;;;8892:25:1;;8880:2;8865:18;;8847:76;41193:33:0;;;;;;;;40804:432;;;;:::o;36665:822::-;36859:6;36855:560;;37048:30;:10;37068:9;37048:19;:30::i;:::-;37040:68;;;;-1:-1:-1;;;37040:68:0;;12586:2:1;37040:68:0;;;12568:21:1;12625:2;12605:18;;;12598:30;12664:28;12644:18;;;12637:56;12710:18;;37040:68:0;12558:176:1;37040:68:0;29101:2;28599:13;28534:1;28599:2;:13;:::i;:::-;28581:31;;:15;:31;:::i;:::-;37328:42;;;;:::i;:::-;-1:-1:-1;;;;;37299:20:0;;;;;;:9;:20;;;;;;:27;;37320:6;;37299:27;:::i;:::-;:71;;37290:113;;;;-1:-1:-1;;;37290:113:0;;11885:2:1;37290:113:0;;;11867:21:1;11924:2;11904:18;;;11897:30;11963;11943:18;;;11936:58;12011:18;;37290:113:0;11857:178:1;37290:113:0;37425:52;37440:6;37447:9;37457:6;37464:5;37470:6;37425:14;:52::i;:::-;36665:822;;;;;:::o;37588:3156::-;-1:-1:-1;;;;;37731:20:0;;;37704:24;37731:20;;;:9;:20;;;;;;;37786:17;;;;;;;;37822:23;;;;37814:60;;;;-1:-1:-1;;;37814:60:0;;10085:2:1;37814:60:0;;;10067:21:1;10124:2;10104:18;;;10097:30;-1:-1:-1;;;10143:18:1;;;10136:54;10207:18;;37814:60:0;10057:174:1;37814:60:0;37911:1;37901:9;;:11;;;;:::i;:::-;37889:9;:23;37925:9;37945:1712;;;;37973:11;;;;37970:79;;;-1:-1:-1;;;;;38014:18:0;;;;;;:10;:18;;;;;;;;38013:19;38005:28;;;;;;38067:38;:21;38098:6;38067:30;:38::i;:::-;38063:405;;-1:-1:-1;;;;;38241:17:0;;;;;;:9;:17;;;;;;38260:15;-1:-1:-1;38241:34:0;;:52;;-1:-1:-1;38277:16:0;;;;;;;38241:52;38233:82;;;;-1:-1:-1;;;38233:82:0;;17184:2:1;38233:82:0;;;17166:21:1;17223:2;17203:18;;;17196:30;-1:-1:-1;;;17242:18:1;;;17235:48;17300:18;;38233:82:0;17156:168:1;38233:82:0;38440:12;;38424:28;;:15;:28;:::i;:::-;-1:-1:-1;;;;;38406:17:0;;;;;;:9;:17;;;;;:46;38063:405;38603:9;;38596:6;:16;38593:80;;;38633:11;:24;;;;;;;-1:-1:-1;38633:24:0;;;;;;;;-1:-1:-1;;;;;;38633:24:0;-1:-1:-1;;;;;38633:24:0;;;;;38593:80;38703:9;;38695:6;:17;;38687:44;;;;-1:-1:-1;;;38687:44:0;;12242:2:1;38687:44:0;;;12224:21:1;12281:2;12261:18;;;12254:30;-1:-1:-1;;;12300:18:1;;;12293:45;12355:18;;38687:44:0;12214:165:1;38687:44:0;-1:-1:-1;38750:8:0;;;;;;;37945:1712;;;38781:5;38778:879;;;38926:12;;38901:23;38918:6;38901:16;:23;:::i;:::-;:37;;38893:65;;;;-1:-1:-1;;;38893:65:0;;;;;;;:::i;:::-;38989:8;;38981:6;:16;;38973:45;;;;-1:-1:-1;;;38973:45:0;;;;;;;:::i;:::-;-1:-1:-1;39037:7:0;;;;38778:879;;;39213:12;;39188:23;39205:6;39188:16;:23;:::i;:::-;:37;;39180:65;;;;-1:-1:-1;;;39180:65:0;;;;;;;:::i;:::-;39477:38;:21;39508:6;39477:30;:38::i;:::-;39473:139;;-1:-1:-1;;;;;39542:17:0;;;;;;:9;:17;;;;;;39561:15;-1:-1:-1;39542:34:0;;:52;;-1:-1:-1;39578:16:0;;;;;;;39542:52;39534:78;;;;-1:-1:-1;;;39534:78:0;;15804:2:1;39534:78:0;;;15786:21:1;15843:2;15823:18;;;15816:30;-1:-1:-1;;;15862:18:1;;;15855:44;15916:18;;39534:78:0;15776:164:1;39534:78:0;-1:-1:-1;39631:12:0;;;;;;;38778:879;39986:19;;-1:-1:-1;;;;;39978:27:0;;;-1:-1:-1;;;39986:19:0;;;;39978:27;;;;39977:50;;-1:-1:-1;40010:16:0;;;;40009:17;39977:50;:82;;;;-1:-1:-1;40031:27:0;;;;40030:28;39977:82;39974:126;;;40074:26;40093:6;40074:18;:26::i;:::-;40271:13;;40208:21;;40230:55;;40244:6;;40252:3;;40257:27;;40271:13;-1:-1:-1;;;40271:13:0;;;;;-1:-1:-1;;;40257:13:0;;;:27;:::i;:::-;40230:13;:55::i;:::-;40208:77;-1:-1:-1;40349:19:0;40369:22;40208:77;40369:6;:22;:::i;:::-;40349:42;;40449:27;40462:6;40469;40449:12;:27::i;:::-;40563:4;40545:24;;;;:9;:24;;;;;:41;;40573:13;;40545:24;:41;;40573:13;;40545:41;:::i;:::-;;;;-1:-1:-1;40641:33:0;;-1:-1:-1;40651:9:0;40662:11;40641:9;:33::i;:::-;40708:9;-1:-1:-1;;;;;40692:38:0;40701:6;-1:-1:-1;;;;;40692:38:0;;40718:11;40692:38;;;;8892:25:1;;8880:2;8865:18;;8847:76;40692:38:0;;;;;;;;37588:3156;;;;;;;;;;:::o;46523:455::-;46616:14;;46584:56;;46601:4;;-1:-1:-1;;;;;46616:14:0;46633:6;46584:8;:56::i;:::-;46675:16;;;46689:1;46675:16;;;;;;;;46651:21;;46675:16;;;;;;;;;;-1:-1:-1;46675:16:0;46651:40;;46720:4;46702;46707:1;46702:7;;;;;;-1:-1:-1;;;46702:7:0;;;;;;;;;-1:-1:-1;;;;;46702:23:0;;;:7;;;;;;;;;;:23;;;;46746:14;;:21;;;-1:-1:-1;;;46746:21:0;;;;:14;;;;;:19;;:21;;;;;46702:7;;46746:21;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46736:4;46741:1;46736:7;;;;;;-1:-1:-1;;;46736:7:0;;;;;;;;;-1:-1:-1;;;;;46736:31:0;;;:7;;;;;;;;;:31;46780:14;;:190;;-1:-1:-1;;;46780:190:0;;:14;;;:65;;:190;;46860:6;;46780:14;;46897:4;;46924;;46944:15;;46780:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46523:455;;:::o;47105:397::-;47199:9;47187:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;47251:14:0;;47219:61;;47236:4;;-1:-1:-1;;;;;47251:14:0;47268:11;47219:8;:61::i;:::-;47291:14;;:203;;-1:-1:-1;;;47291:203:0;;47362:4;47291:203;;;8009:34:1;;;8059:18;;;8052:34;;;47291:14:0;8102:18:1;;;8095:34;;;8145:18;;;8138:34;8188:19;;;8181:44;47468:15:0;8241:19:1;;;8234:35;-1:-1:-1;;;;;47291:14:0;;;;:30;;47329:9;;7943:19:1;;47291:203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43684:213::-;43821:14;;43783:22;;43839:3;;43809:26;;43821:14;;43809:9;:26;:::i;:::-;43808:34;;;;:::i;:::-;43783:59;;43873:14;43855:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;43684:213:0:o;42515:202::-;-1:-1:-1;;;;;42650:15:0;;42632:17;42650:15;;;:9;:15;;;;;;:22;;42666:6;;42650:22;:::i;:::-;-1:-1:-1;;;;;42684:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;42515:202:0:o;42231:200::-;-1:-1:-1;;;;;42363:15:0;;42345:17;42363:15;;;:9;:15;;;;;;:22;;42379:6;;42363:22;:::i;41291:156::-;41381:7;41434:5;41420:10;41409:21;;41416:3;41409:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;41408:31;;;;:::i;:::-;41401:38;41291:156;-1:-1:-1;;;;41291:156:0:o;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;:::-;63:85;;;:::o;153:939::-;207:5;260:3;253:4;245:6;241:17;237:27;227:2;;282:5;275;268:20;227:2;322:6;309:20;348:4;371:18;408:2;404;401:10;398:2;;;414:18;;:::i;:::-;460:2;457:1;453:10;492:2;486:9;555:2;551:7;546:2;542;538:11;534:25;526:6;522:38;610:6;598:10;595:22;590:2;578:10;575:18;572:46;569:2;;;621:18;;:::i;:::-;657:2;650:22;707:18;;;741:15;;;;-1:-1:-1;776:15:1;;;810;;;806:24;;803:33;-1:-1:-1;800:2:1;;;853:5;846;839:20;800:2;879:5;870:14;;893:169;907:2;904:1;901:9;893:169;;;964:23;983:3;964:23;:::i;:::-;952:36;;1008:12;;;;925:1;918:9;;;;;1040:12;;893:169;;;-1:-1:-1;1080:6:1;217:875;-1:-1:-1;;;;;;;217:875:1:o;1097:156::-;1163:20;;1223:4;1212:16;;1202:27;;1192:2;;1243:1;1240;1233:12;1258:257;1317:6;1370:2;1358:9;1349:7;1345:23;1341:32;1338:2;;;1391:6;1383;1376:22;1338:2;1435:9;1422:23;1454:31;1479:5;1454:31;:::i;1520:261::-;1590:6;1643:2;1631:9;1622:7;1618:23;1614:32;1611:2;;;1664:6;1656;1649:22;1611:2;1701:9;1695:16;1720:31;1745:5;1720:31;:::i;1786:398::-;1854:6;1862;1915:2;1903:9;1894:7;1890:23;1886:32;1883:2;;;1936:6;1928;1921:22;1883:2;1980:9;1967:23;1999:31;2024:5;1999:31;:::i;:::-;2049:5;-1:-1:-1;2106:2:1;2091:18;;2078:32;2119:33;2078:32;2119:33;:::i;:::-;2171:7;2161:17;;;1873:311;;;;;:::o;2189:466::-;2266:6;2274;2282;2335:2;2323:9;2314:7;2310:23;2306:32;2303:2;;;2356:6;2348;2341:22;2303:2;2400:9;2387:23;2419:31;2444:5;2419:31;:::i;:::-;2469:5;-1:-1:-1;2526:2:1;2511:18;;2498:32;2539:33;2498:32;2539:33;:::i;:::-;2293:362;;2591:7;;-1:-1:-1;;;2645:2:1;2630:18;;;;2617:32;;2293:362::o;2660:392::-;2725:6;2733;2786:2;2774:9;2765:7;2761:23;2757:32;2754:2;;;2807:6;2799;2792:22;2754:2;2851:9;2838:23;2870:31;2895:5;2870:31;:::i;:::-;2920:5;-1:-1:-1;2977:2:1;2962:18;;2949:32;2990:30;2949:32;2990:30;:::i;3057:325::-;3125:6;3133;3186:2;3174:9;3165:7;3161:23;3157:32;3154:2;;;3207:6;3199;3192:22;3154:2;3251:9;3238:23;3270:31;3295:5;3270:31;:::i;:::-;3320:5;3372:2;3357:18;;;;3344:32;;-1:-1:-1;;;3144:238:1:o;3387:368::-;3471:6;3524:2;3512:9;3503:7;3499:23;3495:32;3492:2;;;3545:6;3537;3530:22;3492:2;3590:9;3577:23;3623:18;3615:6;3612:30;3609:2;;;3660:6;3652;3645:22;3609:2;3688:61;3741:7;3732:6;3721:9;3717:22;3688:61;:::i;3760:497::-;3850:6;3858;3911:2;3899:9;3890:7;3886:23;3882:32;3879:2;;;3932:6;3924;3917:22;3879:2;3977:9;3964:23;4010:18;4002:6;3999:30;3996:2;;;4047:6;4039;4032:22;3996:2;4075:61;4128:7;4119:6;4108:9;4104:22;4075:61;:::i;:::-;4065:71;;;4186:2;4175:9;4171:18;4158:32;4199:28;4221:5;4199:28;:::i;4262:251::-;4318:6;4371:2;4359:9;4350:7;4346:23;4342:32;4339:2;;;4392:6;4384;4377:22;4339:2;4436:9;4423:23;4455:28;4477:5;4455:28;:::i;4518:255::-;4585:6;4638:2;4626:9;4617:7;4613:23;4609:32;4606:2;;;4659:6;4651;4644:22;4606:2;4696:9;4690:16;4715:28;4737:5;4715:28;:::i;4778:190::-;4837:6;4890:2;4878:9;4869:7;4865:23;4861:32;4858:2;;;4911:6;4903;4896:22;4858:2;-1:-1:-1;4939:23:1;;4848:120;-1:-1:-1;4848:120:1:o;4973:194::-;5043:6;5096:2;5084:9;5075:7;5071:23;5067:32;5064:2;;;5117:6;5109;5102:22;5064:2;-1:-1:-1;5145:16:1;;5054:113;-1:-1:-1;5054:113:1:o;5172:258::-;5240:6;5248;5301:2;5289:9;5280:7;5276:23;5272:32;5269:2;;;5322:6;5314;5307:22;5269:2;-1:-1:-1;;5350:23:1;;;5420:2;5405:18;;;5392:32;;-1:-1:-1;5259:171:1:o;5435:316::-;5523:6;5531;5539;5592:2;5580:9;5571:7;5567:23;5563:32;5560:2;;;5613:6;5605;5598:22;5560:2;5647:9;5641:16;5631:26;;5697:2;5686:9;5682:18;5676:25;5666:35;;5741:2;5730:9;5726:18;5720:25;5710:35;;5550:201;;;;;:::o;5756:192::-;5813:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:2;;;5887:6;5879;5872:22;5834:2;5915:27;5932:9;5915:27;:::i;5953:545::-;6045:6;6053;6061;6069;6077;6085;6138:3;6126:9;6117:7;6113:23;6109:33;6106:2;;;6160:6;6152;6145:22;6106:2;6188:27;6205:9;6188:27;:::i;:::-;6178:37;;6234:36;6266:2;6255:9;6251:18;6234:36;:::i;:::-;6224:46;;6289:36;6321:2;6310:9;6306:18;6289:36;:::i;:::-;6279:46;;6344:36;6376:2;6365:9;6361:18;6344:36;:::i;:::-;6334:46;;6399:37;6431:3;6420:9;6416:19;6399:37;:::i;:::-;6389:47;;6455:37;6487:3;6476:9;6472:19;6455:37;:::i;:::-;6445:47;;6096:402;;;;;;;;:::o;6503:463::-;6556:3;6594:5;6588:12;6621:6;6616:3;6609:19;6647:4;6676:2;6671:3;6667:12;6660:19;;6713:2;6706:5;6702:14;6734:3;6746:195;6760:6;6757:1;6754:13;6746:195;;;6825:13;;-1:-1:-1;;;;;6821:39:1;6809:52;;6881:12;;;;6916:15;;;;6857:1;6775:9;6746:195;;;-1:-1:-1;6957:3:1;;6564:402;-1:-1:-1;;;;;6564:402:1:o;8280:261::-;8459:2;8448:9;8441:21;8422:4;8479:56;8531:2;8520:9;8516:18;8508:6;8479:56;:::i;8928:603::-;9040:4;9069:2;9098;9087:9;9080:21;9130:6;9124:13;9173:6;9168:2;9157:9;9153:18;9146:34;9198:4;9211:140;9225:6;9222:1;9219:13;9211:140;;;9320:14;;;9316:23;;9310:30;9286:17;;;9305:2;9282:26;9275:66;9240:10;;9211:140;;;9369:6;9366:1;9363:13;9360:2;;;9439:4;9434:2;9425:6;9414:9;9410:22;9406:31;9399:45;9360:2;-1:-1:-1;9515:2:1;9494:15;-1:-1:-1;;9490:29:1;9475:45;;;;9522:2;9471:54;;9049:482;-1:-1:-1;;;9049:482:1:o;14203:342::-;14405:2;14387:21;;;14444:2;14424:18;;;14417:30;-1:-1:-1;;;14478:2:1;14463:18;;14456:48;14536:2;14521:18;;14377:168::o;15257:340::-;15459:2;15441:21;;;15498:2;15478:18;;;15471:30;-1:-1:-1;;;15532:2:1;15517:18;;15510:46;15588:2;15573:18;;15431:166::o;17704:582::-;18003:6;17992:9;17985:25;18046:6;18041:2;18030:9;18026:18;18019:34;18089:3;18084:2;18073:9;18069:18;18062:31;17966:4;18110:57;18162:3;18151:9;18147:19;18139:6;18110:57;:::i;:::-;-1:-1:-1;;;;;18203:32:1;;;;18198:2;18183:18;;18176:60;-1:-1:-1;18267:3:1;18252:19;18245:35;18102:65;17975:311;-1:-1:-1;;;17975:311:1:o;19273:128::-;19313:3;19344:1;19340:6;19337:1;19334:13;19331:2;;;19350:18;;:::i;:::-;-1:-1:-1;19386:9:1;;19321:80::o;19406:204::-;19444:3;19480:4;19477:1;19473:12;19512:4;19509:1;19505:12;19547:3;19541:4;19537:14;19532:3;19529:23;19526:2;;;19555:18;;:::i;:::-;19591:13;;19452:158;-1:-1:-1;;;19452:158:1:o;19615:217::-;19655:1;19681;19671:2;;-1:-1:-1;;;19706:31:1;;19760:4;19757:1;19750:15;19788:4;19713:1;19778:15;19671:2;-1:-1:-1;19817:9:1;;19661:171::o;19837:422::-;19926:1;19969:5;19926:1;19983:270;20004:7;19994:8;19991:21;19983:270;;;20063:4;20059:1;20055:6;20051:17;20045:4;20042:27;20039:2;;;20072:18;;:::i;:::-;20122:7;20112:8;20108:22;20105:2;;;20142:16;;;;20105:2;20221:22;;;;20181:15;;;;19983:270;;;19987:3;19901:358;;;;;:::o;20264:140::-;20322:5;20351:47;20392:4;20382:8;20378:19;20372:4;20458:5;20488:8;20478:2;;-1:-1:-1;20529:1:1;20543:5;;20478:2;20577:4;20567:2;;-1:-1:-1;20614:1:1;20628:5;;20567:2;20659:4;20677:1;20672:59;;;;20745:1;20740:130;;;;20652:218;;20672:59;20702:1;20693:10;;20716:5;;;20740:130;20777:3;20767:8;20764:17;20761:2;;;20784:18;;:::i;:::-;-1:-1:-1;;20840:1:1;20826:16;;20855:5;;20652:218;;20954:2;20944:8;20941:16;20935:3;20929:4;20926:13;20922:36;20916:2;20906:8;20903:16;20898:2;20892:4;20889:12;20885:35;20882:77;20879:2;;;-1:-1:-1;20991:19:1;;;21023:5;;20879:2;21070:34;21095:8;21089:4;21070:34;:::i;:::-;21140:6;21136:1;21132:6;21128:19;21119:7;21116:32;21113:2;;;21151:18;;:::i;:::-;21189:20;;20468:747;-1:-1:-1;;;20468:747:1:o;21220:168::-;21260:7;21326:1;21322;21318:6;21314:14;21311:1;21308:21;21303:1;21296:9;21289:17;21285:45;21282:2;;;21333:18;;:::i;:::-;-1:-1:-1;21373:9:1;;21272:116::o;21393:125::-;21433:4;21461:1;21458;21455:8;21452:2;;;21466:18;;:::i;:::-;-1:-1:-1;21503:9:1;;21442:76::o;21523:135::-;21562:3;-1:-1:-1;;21583:17:1;;21580:2;;;21603:18;;:::i;:::-;-1:-1:-1;21650:1:1;21639:13;;21570:88::o;21663:127::-;21724:10;21719:3;21715:20;21712:1;21705:31;21755:4;21752:1;21745:15;21779:4;21776:1;21769:15;21795:127;21856:10;21851:3;21847:20;21844:1;21837:31;21887:4;21884:1;21877:15;21911:4;21908:1;21901:15;21927:131;-1:-1:-1;;;;;22002:31:1;;21992:42;;21982:2;;22048:1;22045;22038:12;22063:118;22149:5;22142:13;22135:21;22128:5;22125:32;22115:2;;22171:1;22168;22161:12

Swarm Source

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