ETH Price: $2,489.43 (-2.23%)

Token

Shib Warrior ($SWRR)
 

Overview

Max Total Supply

1,000,000 $SWRR

Holders

11

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
18,599.069999998 $SWRR

Value
$0.00
0x31043fc712e13ed748042d03f65dfea8f5c5ef34
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:
ShibWarrior

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**

███████╗██╗  ██╗██╗██████╗     ██╗    ██╗ █████╗ ██████╗ ██████╗ ██╗ ██████╗ ██████╗ 
██╔════╝██║  ██║██║██╔══██╗    ██║    ██║██╔══██╗██╔══██╗██╔══██╗██║██╔═══██╗██╔══██╗
███████╗███████║██║██████╔╝    ██║ █╗ ██║███████║██████╔╝██████╔╝██║██║   ██║██████╔╝
╚════██║██╔══██║██║██╔══██╗    ██║███╗██║██╔══██║██╔══██╗██╔══██╗██║██║   ██║██╔══██╗
███████║██║  ██║██║██████╔╝    ╚███╔███╔╝██║  ██║██║  ██║██║  ██║██║╚██████╔╝██║  ██║
╚══════╝╚═╝  ╚═╝╚═╝╚═════╝      ╚══╝╚══╝ ╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝ ╚═════╝ ╚═╝  ╚═╝
                                                                                     

Shib Warrior

https://shibwarrior.com

https://t.me/ShibWarriorEth

*** SELL TAX HIGHER ON LAUNCH WILL BE LOWERED ***

Total Supply: 1,000,000
Max Wallet: 2% (20,000 Tokens)
Max Buy: 2% (20,000 Tokens)
Max Sell: 2% (20,000 Tokens)
Buy / Sell Tax: 7% 
- 4% Marketing
- 2% LP
- 1% Development


*/

pragma solidity ^0.8.15;

// SPDX-License-Identifier: Unlicensed

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


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

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

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

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

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

    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getamountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getamountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getamountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getamountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}



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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() 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));
    }
}

////////// Contract /////////////

contract ShibWarrior is IERC20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;
    
    event antiBotBan(address indexed value);

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

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _excludedFromSellLock;
    EnumerableSet.AddressSet private _excludedFromBuyLock;
    EnumerableSet.AddressSet private _excludedFromStaking;

    EnumerableSet.AddressSet private _isBlacklisted;

    //Token Info
    string public _name = "Shib Warrior";
    string public _symbol = "$SWRR";
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 1000000 * 10**_decimals;//equals 1,000,000 tokens 1000000

    //Used for anti-bot autoblacklist
    uint256 private tradingEnabledAt; //DO NOT CHANGE, THIS IS FOR HOLDING A TIMESTAMP
    uint256 public autoBanTime = 20; // Set to the amount of time in seconds after enable trading you want addresses to be auto blacklisted if they buy/sell/transfer in this time.
    uint256 public enableAutoBlacklist = 0; //Leave 1 if using, set to 0 if not using.
    //Divider for the MaxBalance based on circulating Supply (2%)
    uint8 public constant BalanceLimitDivider=50;
    //Divider for sellLimit based on circulating Supply (2%))
    uint16 public constant SellLimitDivider=50;
    //Sellers get locked for MaxSellLockTime (put in seconds, works better especially if changing later) so they can't dump repeatedly
    uint16 public constant MaxSellLockTime= 0 seconds;
    //Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly
    uint16 public constant MaxBuyLockTime= 0 seconds;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime= 1800;
    //DevWallets
    address public Development=payable(0x2Dcb6E31e206Cd91B601369Fdb601ac4D6233D68);
    address public Marketing=payable(0xf30bb0b3C67c596F770F9cEC66d5D5DB24f94d3C);
    //MainNet
    address private constant UniswapV2Router=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint256 private _circulatingSupply =InitialSupply;
    uint256 public  balanceLimit = _circulatingSupply;
    uint256 public  sellLimit = _circulatingSupply;
    uint256 private MaxBuy = 20000 * 10**_decimals; // 40,000 tokens
    
    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;

    uint8 private _burnTax;
    uint8 private _liquidityTax;
    uint8 private _stakingTax;

       
    address private _uniswapv2PairAddress; 
    IUniswapV2Router02 private  _uniswapv2Router;
    
    //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==Development||addr==Marketing;
    }

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

    constructor () {
        //contract creator gets 90% of the token to create LP-Pair
        uint256 deployerBalance=_circulatingSupply;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);
        // UniswapV2 Router
        _uniswapv2Router = IUniswapV2Router02(UniswapV2Router);
        //Creates a UniswapV2 Pair
        _uniswapv2PairAddress = IUniswapV2Factory(_uniswapv2Router.factory()).createPair(address(this), _uniswapv2Router.WETH());
        
        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;

        //Sets sellLockTime
        sellLockTime=0;
        
        //Sets buyLockTime
        buyLockTime=0;

        //Set Starting Tax 
        
        _buyTax=7;
        _sellTax=14;
        _transferTax=7;

        _burnTax=0;
        _liquidityTax=20;
        _stakingTax=80;

        //Team wallets and deployer are excluded from Taxes
        _excluded.add(Development);
        _excluded.add(Marketing);
        _excluded.add(msg.sender);
        //excludes UniswapV2 Router, pair, contract and burn address from staking
        _excludedFromStaking.add(address(_uniswapv2Router));
        _excludedFromStaking.add(_uniswapv2PairAddress);
        _excludedFromStaking.add(address(this));
        _excludedFromStaking.add(0x000000000000000000000000000000000000dEaD);
    
    }

    //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 UniswapV2Router and UniswapV2Pair are tax and lock free
        address uniswapv2Router=address(_uniswapv2Router);
        bool isLiquidityTransfer = ((sender == _uniswapv2PairAddress && recipient == uniswapv2Router) 
        || (recipient == _uniswapv2PairAddress && sender == uniswapv2Router));

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

        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
        else{ 
            //once trading is enabled, it can't be turned off again
            require(tradingEnabled,"trading not yet enabled");
            _taxedTransfer(sender,recipient,amount,isBuy,isSell);
        }
    }
    //applies taxes, checks for limits, locks generates autoLP and stakingETH, 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");

        uint8 tax;
        if(isSell){
            if(!_excludedFromSellLock.contains(sender)){
                 //If seller sold less than sellLockTime(2h 50m) 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 50 mins by default)
                _sellLock[sender]=block.timestamp+sellLockTime;
            }
            //Sells can't exceed the sell limit(21,000 Tokens at start, can be updated to circulating supply)
            require(amount<=sellLimit,"Dump protection");
            require(_isBlacklisted.contains(sender) == false, "Address blacklisted!");

            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }

            tax=_sellTax;


        } else if(isBuy){
            if(!_excludedFromBuyLock.contains(recipient)){
                 //If buyer bought less than buyLockTime(2h 50m) ago, buy is declined, can be disabled by Team         
                require(_buyLock[recipient]<=block.timestamp||buyLockDisabled,"Buyer in buyLock");
                //Sets the time buyers get locked(2 hours 50 mins by default)
                _buyLock[recipient]=block.timestamp+buyLockTime;
            }
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            require(amount <= MaxBuy,"Tx amount exceeding max buy amount");
            require(_isBlacklisted.contains(recipient) == false, "Address blacklisted!");

            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(recipient);
                emit antiBotBan(recipient);
            }

            tax=_buyTax;

        } else {//Transfer
            //withdraws ETH when sending less or equal to 1 Token
            //that way you can withdraw without connecting to any dApp.
            //might needs higher gas limit
            if(amount<=10**(_decimals)) claimETH(sender);
            //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");
            
            require(_isBlacklisted.contains(sender) == false, "Sender address blacklisted!");
            require(_isBlacklisted.contains(recipient) == false, "Recipient address blacklisted!");

            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }

            tax=_transferTax;

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

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

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

     //ETH Autostake/////////////////////////////////////////////////////////////////////////////////////////
       //Autostake uses the balances of each holder to redistribute auto generated ETH.
    //Each transaction _addToken and _removeToken gets called for the transaction amount
    //WithdrawETH can be used for any holder to withdraw ETH at any time, like true Staking,
    //so unlike MRAT clones you can leave and forget your Token and claim after a while

    //lock for the withdraw
    bool private _isWithdrawing;
    //Multiplier to add some accuracy to profitPerShare
    uint256 private constant DistributionMultiplier = 2**64;
    //profit for each share a holder holds, a share equals a token.
    uint256 public profitPerShare;
    //the total reward distributed through staking, for tracking purposes
    uint256 public totalStakingReward;
    //the total payout through staking, for tracking purposes
    uint256 public totalPayouts;
    
  
    uint8 public marketingShare=100;
    //balance that is claimable by the team
    uint256 public marketingBalance;

    //Mapping of the already paid out(or missed) shares of each staker
    mapping(address => uint256) private alreadyPaidShares;
    //Mapping of shares that are reserved for payout
    mapping(address => uint256) private toBePaid;

    //Contract, uniswapv2 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 isExcludedFromStaking(address addr) public view returns (bool){
        return _excludedFromStaking.contains(addr);
    }

    //Check if address is blacklisted
    function isBlacklisted(address addr) public view returns (bool){
        return _isBlacklisted.contains(addr);
    }
    //Total shares equals circulating supply minus excluded Balances
    function _getTotalShares() public view returns (uint256){
        uint256 shares=_circulatingSupply;
        //substracts all excluded from shares, excluded list is limited to 30
        // to avoid creating a Honeypot through OutOfGas exeption
        for(uint i=0; i<_excludedFromStaking.length(); i++){
            shares-=_balances[_excludedFromStaking.at(i)];
        }
        return shares;
    }

    //adds Token to balances, adds new ETH 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;
        
        if(isExcludedFromStaking(addr)){
           _balances[addr]=newAmount;
           return;
        }
        
        //gets the payout before the change
        uint256 payment=_newDividentsOf(addr);
        //resets dividents to 0 for newAmount
        alreadyPaidShares[addr] = profitPerShare * newAmount;
        //adds dividents to the toBePaid mapping
        toBePaid[addr]+=payment; 
        //sets newBalance
        _balances[addr]=newAmount;
    }
    
    
    //removes Token, adds ETH 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;
        
        if(isExcludedFromStaking(addr)){
           _balances[addr]=newAmount;
           return;
        }
        
        //gets the payout before the change
        uint256 payment=_newDividentsOf(addr);
        //sets newBalance
        _balances[addr]=newAmount;
        //resets dividents to 0 for newAmount
        alreadyPaidShares[addr] = profitPerShare * newAmount;
        //adds dividents to the toBePaid mapping
        toBePaid[addr]+=payment; 
    }
    
    
    //gets the not dividents of a staker that aren't in the toBePaid mapping 
    //returns wrong value for excluded accounts
    function _newDividentsOf(address staker) private view returns (uint256) {
        uint256 fullPayout = profitPerShare * _balances[staker];
        // if theres an overflow for some unexpected reason, return 0, instead of 
        // an exeption to still make trades possible
        if(fullPayout<alreadyPaidShares[staker]) return 0;
        return (fullPayout - alreadyPaidShares[staker]) / DistributionMultiplier;
    }

    //distributes eth between marketing share and dividents 
    function _distributeStake(uint256 ETHamount) private {
        // Deduct marketing Tax
        uint256 marketingSplit = (ETHamount * marketingShare) / 100;
        uint256 amount = ETHamount - marketingSplit;

       marketingBalance+=marketingSplit;
       
        if (amount > 0) {
            totalStakingReward += amount;
            uint256 totalShares=_getTotalShares();
            //when there are 0 shares, add everything to marketing budget
            if (totalShares == 0) {
                marketingBalance += amount;
            }else{
                //Increases profit per share based on current total shares
                profitPerShare += ((amount * DistributionMultiplier) / totalShares);
            }
        }
    }
    event OnWithdrawETH(uint256 amount, address recipient);
    
    //withdraws all dividents of address
    function claimETH(address addr) private{
        require(!_isWithdrawing);
        _isWithdrawing=true;
        uint256 amount;
        if(isExcludedFromStaking(addr)){
            //if excluded just withdraw remaining toBePaid ETH
            amount=toBePaid[addr];
            toBePaid[addr]=0;
        }
        else{
            uint256 newAmount=_newDividentsOf(addr);
            //sets payout mapping to current amount
            alreadyPaidShares[addr] = profitPerShare * _balances[addr];
            //the amount to be paid 
            amount=toBePaid[addr]+newAmount;
            toBePaid[addr]=0;
        }
        if(amount==0){//no withdraw if 0 amount
            _isWithdrawing=false;
            return;
        }


        totalPayouts+=amount;
        address[] memory path = new address[](2);
        path[0] = _uniswapv2Router.WETH(); //ETH
        path[1] = RewardsAddress; //@dev Marketing Share can contribute to Rewards if allocated. Define by editing RewardsAddress=(?)

        _uniswapv2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
        0,
        path,
        addr,
        block.timestamp);
        
        emit OnWithdrawETH(amount, addr);
        _isWithdrawing=false;
    }
        //Launch Rewards Address - Can be Changed - Rewards not enabled at launch.
    address public RewardsAddress=(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); //@ this is the address for USDC USDC
    //Swap Contract Tokens//////////////////////////////////////////////////////////////////////////////////



    //tracks auto generated ETH, useful for ticker etc
    uint256 public totalLPETH;
    //Locks the swap if already swapping
    bool private _isSwappingContractModifier;
    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }
    uint256 currentAmountToSwap = 4000 * 10**_decimals;  // 4,000 tokens (0.4%)
    //swaps the token on the contract for Marketing ETH and LP Token.
    //always swaps the sellLimit of token to avoid a large price impact
    function _swapContractToken() private lockTheSwap{
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_liquidityTax+_stakingTax;
        uint256 tokenToSwap = currentAmountToSwap;
        //only swap if contractBalance is larger than tokenToSwap, and totalTax is unequal to 0
        if(contractBalance<tokenToSwap||totalTax==0){
            return;
        }
        //splits the token in TokenForLiquidity and tokenForMarketing
        uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax;
        uint256 tokenForMarketing= tokenToSwap-tokenForLiquidity;

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

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

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

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

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

    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,_stakingTax,_buyTax,_sellTax,_transferTax);
    }

    //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;
    //}
    
    function getcurrentAmountToSwap() public view returns (uint256){
          return currentAmountToSwap;
    }

    //How long is a given address still locked from buying - not used
    //function getAddressBuyLockTimeInSeconds(address AddressToCheck) public view returns (uint256){
    //   uint256 lockTime=_buyLock[AddressToCheck];
    //   if(lockTime<=block.timestamp)
    //   {
    //       return 0;
    //   }
    //   return lockTime-block.timestamp;
    //}
    //function getBuyLockTimeInSeconds() public view returns(uint256){
    //    return buyLockTime;
    //}
    
    //Functions every wallet can call - no sell lock in isde
    //Resets sell lock of caller to the default sellLockTime should something go very wrong
    //function AddressResetSellLock() public{
    //    _sellLock[msg.sender]=block.timestamp+sellLockTime;
    //}
    
    //Resets buy lock of caller to the default buyLockTime should something go very wrong - no buy lock in usde
 //   function AddressResetBuyLock() public{
 //       _buyLock[msg.sender]=block.timestamp+buyLockTime;
    
 //   }

        //withdraws dividents of sender
    function Rewards() public{
        claimETH(msg.sender);
    }

    function getDividents(address addr) public view returns (uint256){
        if(isExcludedFromStaking(addr)) return toBePaid[addr];
        return _newDividentsOf(addr)+toBePaid[addr];
    }

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

    function CollectMarketingETH() public onlyOwner{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        payable(Development).transfer((amount*50) / 100);
        payable(Marketing).transfer((amount*50) / 100);
    } 
    function TeamCollectXMarketingETH(uint256 amount) public onlyOwner{
        require(amount<=marketingBalance);
        marketingBalance-=amount;
        payable(Development).transfer((amount*50) / 100);
        payable(Marketing).transfer((amount*50) / 100);
    } 

    //switches autoLiquidity and marketing ETH generation during transfers
    function TeamSwitchManualETHConversion(bool manual) public onlyOwner{
        manualConversion=manual;
    }
    
    function TeamChangeMaxBuy(uint256 newMaxBuy) public onlyOwner{
      MaxBuy=newMaxBuy * 10**_decimals;
    }
    
    function TeamChangeDevelopment(address newDevelopment) public onlyOwner{
      Development=payable(newDevelopment);
    }

    function TeamChangeMarketing(address newMarketing) public onlyOwner{
      Marketing=payable(newMarketing);
    }

    function TeamChangeRewardsAddress(address newRewardsAddress) public onlyOwner{
      RewardsAddress=(newRewardsAddress);
    }

    function updateTokenDetails(string memory newName, string memory newSymbol) public onlyOwner {
        _name = newName;
        _symbol = newSymbol;
    }



    //Disables the timeLock after selling for everyone
    function TeamDisableSellLock(bool disabled) public onlyOwner{
        sellLockDisabled=disabled;
    }
    
    //Disables the timeLock after buying for everyone
    function TeamDisableBuyLock(bool disabled) public onlyOwner{
        buyLockDisabled=disabled;
    }

    //Sets SellLockTime, needs to be lower than MaxSellLockTime
    function TeamSetSellLockTime(uint256 sellLockSeconds)public onlyOwner{
            require(sellLockSeconds<=MaxSellLockTime,"Sell Lock time too high");
            sellLockTime=sellLockSeconds;
    } 
    
    //Sets BuyLockTime, needs to be lower than MaxBuyLockTime
    function TeamSetBuyLockTime(uint256 buyLockSeconds)public onlyOwner{
            require(buyLockSeconds<=MaxBuyLockTime,"Buy Lock time too high");
            buyLockTime=buyLockSeconds;
    } 

    //Allows CA owner to change how much the contract sells to prevent massive contract sells as the token grows.
    function TeamUpdateAmountToSwap(uint256 newSwapAmount) public onlyOwner{
        currentAmountToSwap = newSwapAmount;
    }
    
    //Allows wallet exclusion to be added after launch
    function AddWalletExclusion(address exclusionAdd) public onlyOwner{
        _excluded.add(exclusionAdd);
    }
    
    //Sets Taxes
    function TeamSetTaxes(uint8 burnTaxes, uint8 liquidityTaxes, uint8 stakingTaxes,uint8 buyTax, uint8 sellTax, uint8 transferTax) public onlyOwner{
        uint8 totalTax=burnTaxes+liquidityTaxes+stakingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");

        _burnTax=burnTaxes;
        _liquidityTax=liquidityTaxes;
        _stakingTax=stakingTaxes;
        
        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;
    }

    //How much of the staking tax should be allocated for marketing
    function TeamChangeMarketingShare(uint8 newShare) public onlyOwner{
        require(newShare<=100); 
        marketingShare=newShare;
    }
    //manually converts contract token to LP and staking ETH
    function TeamCreateLPandETH() public onlyOwner{
    _swapContractToken();
    }
    
     //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) public onlyOwner{
        //SellLimit needs to be below 1% to avoid a Large Price impact when generating auto LP
        require(newSellLimit<_circulatingSupply/100);
        //Adds decimals to limits
        newBalanceLimit=newBalanceLimit*10**_decimals;
        newSellLimit=newSellLimit*10**_decimals;
        //Calculates the target Limits based on supply
        uint256 targetBalanceLimit=_circulatingSupply/BalanceLimitDivider;
        uint256 targetSellLimit=_circulatingSupply/SellLimitDivider;

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

        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;     
    }

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

    //Remove address from blacklist and allow sells, buys or transfers.
    function removeAddressFromBlacklist(address blacklistedAddress) external onlyOwner {
        _isBlacklisted.remove(blacklistedAddress);
    }
    
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    
    bool public tradingEnabled;
    address private _liquidityTokenAddress;
    //Enables trading for everyone
    function SetupEnableTrading() public onlyOwner{
        tradingEnabled=true;
        tradingEnabledAt=block.timestamp;
    }

    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyOwner{
        _liquidityTokenAddress=liquidityTokenAddress;
    }

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

    function TeamExtendLiquidityLock(uint256 secondsUntilUnlock) public onlyOwner{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
    }
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime);
        _liquidityUnlockTime=newUnlockTime;
    }

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

        //Liquidity release if something goes wrong at start
        liquidityToken.transfer(Development, amount);
        
    }
    //Removes Liquidity once unlock Time is over, 
    function REM(bool addToStaking) public onlyOwner{
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
        IUniswapV2ERC20 liquidityToken = IUniswapV2ERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        liquidityToken.approve(address(_uniswapv2Router),amount);
        //Removes Liquidity and either distributes liquidity ETH to stakers, or 
        // adds them to marketing Balance
        //Token will be converted
        //to Liquidity and Staking ETH again
        uint256 initialETHBalance = address(this).balance;
        _uniswapv2Router.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            0,
            0,
            address(this),
            block.timestamp
            );
        uint256 newETHBalance = address(this).balance-initialETHBalance;
        if(addToStaking){
            _distributeStake(newETHBalance);
        }
        else{
            marketingBalance+=newETHBalance;
        }

    }
    //Releases all remaining ETH on the contract wallet, so ETH wont be burned
    function TeamCollectRemainingETH() public onlyOwner{
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
        (bool sent,) =Development.call{value: (address(this).balance)}("");
        require(sent);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //external//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

    function name() external view override returns (string memory) { 
        return _name; 
    }
    function symbol() external view 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;
    }

    // IERC20 - 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":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"OnWithdrawETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"value","type":"address"}],"name":"antiBotBan","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"exclusionAdd","type":"address"}],"name":"AddWalletExclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CollectMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Development","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Marketing","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxBuyLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSellLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"addToStaking","type":"bool"}],"name":"REM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Rewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"RewardsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDevelopment","type":"address"}],"name":"TeamChangeDevelopment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketing","type":"address"}],"name":"TeamChangeMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"TeamChangeMarketingShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"TeamChangeMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRewardsAddress","type":"address"}],"name":"TeamChangeRewardsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamCollectRemainingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamCollectXMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamCreateLPandETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamExtendLiquidityLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyLockSeconds","type":"uint256"}],"name":"TeamSetBuyLockTime","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":"stakingTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"TeamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualETHConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapAmount","type":"uint256"}],"name":"TeamUpdateAmountToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"TeamUpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_getTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"addAddressToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoBanTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAutoBlacklist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getDividents","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLimits","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"burnTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"},{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getcurrentAmountToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromStaking","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":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"removeAddressFromBlacklist","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLPETH","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":"totalStakingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newName","type":"string"},{"internalType":"string","name":"newSymbol","type":"string"}],"name":"updateTokenDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600c60809081526b29b434b1102bb0b93934b7b960a11b60a052600f906200002d90826200062a565b506040805180820190915260058152641229aba92960d91b60208201526010906200005990826200062a565b5060146012819055600060135580546001600160a01b0319908116732dcb6e31e206cd91b601369fdb601ac4d6233d68179091556015805490911673f30bb0b3c67c596f770f9cec66d5d5db24f94d3c179055620000ba6009600a62000809565b620000c990620f42406200081a565b60168190556017819055601855620000e46009600a62000809565b620000f290614e206200081a565b601955601f805460ff19166064179055602380546001600160a01b03191673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48179055620001366009600a62000809565b6200014490610fa06200081a565b6026553480156200015457600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601654336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3601b80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026891906200083c565b6001600160a01b031663c9c6539630601b60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f191906200083c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200033f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200036591906200083c565b601a80546001600160a01b0392909216660100000000000002600160301b600160d01b03199092169190911790556032620003a36009600a62000809565b620003b290620f42406200081a565b620003be91906200086e565b6017556032620003d16009600a62000809565b620003e090620f42406200081a565b620003ec91906200086e565b60185560006028819055602a55601a805465ffffffffffff191665501400070e0717905560145462000436906005906001600160a01b031662000513602090811b6200219f17901c565b506015546200045d906005906001600160a01b031662000513602090811b6200219f17901c565b50620004793360056200051360201b6200219f1790919060201c565b50601b54620004a090600b906001600160a01b031662000513602090811b6200219f17901c565b50620004d1601a60069054906101000a90046001600160a01b0316600b6200051360201b6200219f1790919060201c565b50620004ed30600b6200051360201b6200219f1790919060201c565b506200050b61dead600b6200051360201b6200219f1790919060201c565b505062000891565b60006200052a836001600160a01b03841662000533565b90505b92915050565b60008181526001830160205260408120546200057c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200052d565b5060006200052d565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620005b057607f821691505b602082108103620005d157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200062557600081815260208120601f850160051c81016020861015620006005750805b601f850160051c820191505b8181101562000621578281556001016200060c565b5050505b505050565b81516001600160401b0381111562000646576200064662000585565b6200065e816200065784546200059b565b84620005d7565b602080601f8311600181146200069657600084156200067d5750858301515b600019600386901b1c1916600185901b17855562000621565b600085815260208120601f198616915b82811015620006c757888601518255948401946001909101908401620006a6565b5085821015620006e65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200074d578160001904821115620007315762000731620006f6565b808516156200073f57918102915b93841c939080029062000711565b509250929050565b60008262000766575060016200052d565b8162000775575060006200052d565b81600181146200078e57600281146200079957620007b9565b60019150506200052d565b60ff841115620007ad57620007ad620006f6565b50506001821b6200052d565b5060208310610133831016604e8410600b8410161715620007de575081810a6200052d565b620007ea83836200070c565b8060001904821115620008015762000801620006f6565b029392505050565b60006200052a60ff84168362000755565b6000816000190483118215151615620008375762000837620006f6565b500290565b6000602082840312156200084f57600080fd5b81516001600160a01b03811681146200086757600080fd5b9392505050565b6000826200088c57634e487b7160e01b600052601260045260246000fd5b500490565b6140fd80620008a16000396000f3fe6080604052600436106104265760003560e01c8063762bb28211610227578063c3a3c0321161012d578063e68f136a116100b0578063f2c816ae11610077578063f2c816ae14610ca9578063f2fde38b14610cc9578063f88b0e4614610ce9578063fe002ec214610cff578063fe575a8714610d1457005b8063e68f136a14610c1e578063e69e03ee14610c3e578063ebddcc1d14610c53578063f00df36514610c73578063f0cc761214610c8957005b8063d28d8852116100f4578063d28d885214610b63578063d51f383b14610b78578063db886f2314610b98578063dd62ed3e14610bb8578063e2fd002a14610bfe57005b8063c3a3c03214610ad9578063c3f4f54f14610aee578063cd979a7e14610b03578063d0291d6614610b23578063d11edf7414610b4357005b8063998a8668116101b5578063b09f12661161017c578063b09f126614610a4f578063b58a56cd14610a64578063b766a38614610a84578063c054f2f414610aa4578063c280895414610ac457005b8063998a8668146109ba5780639bf65770146109cf5780639fa62d5f146109ef578063a457c2d714610a0f578063a9059cbb14610a2f57005b8063887c60fb116101f9578063887c60fb1461091b578063893d20e8146109355780638da5cb5b1461096757806394e8075d1461098557806395d89b41146109a557005b8063762bb282146108c05780637b9e987a146108d65780638650e92a146108eb57806386d0ada81461090157005b80633cc39b7a1161032c5780635b80f625116102ba5780636f89e409116102815780636f89e4091461080b57806370a0823114610835578063715018a61461086b5780637335307b1461088057806373ddf08e146108a057005b80635b80f625146107a15780635c69f690146106695780635ebbc3ca146107b6578063643daaea146107cb5780636ea4caab146107eb57005b80634ada218b116102fe5780634ada218b146107165780634cdaf0ae146107355780634f91e48c1461075557806357ad67d11461076b57806358e553651461078b57005b80633cc39b7a146106be5780633da56f18146106d45780634089b170146106ea57806344f3c83a1461070057005b8063243b529a116103b4578063313ce5671161037b578063313ce5671461063557806332ac487f146106495780633478154b1461066957806335e82f3a1461067e578063395093511461069e57005b8063243b529a14610572578063269a6aae146105875780632973ef2d1461059d5780633054f8a314610606578063311a86971461062057005b80630fd99e16116103f85780630fd99e16146104d657806314e91377146104fe57806318160ddd1461051e5780631eb25d131461053d57806323b872dd1461055257005b80630241047b1461042f57806306fdde031461044f57806309218ee71461047a578063095ea7b3146104a657005b3661042d57005b005b34801561043b57600080fd5b5061042d61044a36600461389b565b610d34565b34801561045b57600080fd5b50610464610e3d565b60405161047191906138b4565b60405180910390f35b34801561048657600080fd5b50601f546104949060ff1681565b60405160ff9091168152602001610471565b3480156104b257600080fd5b506104c66104c136600461391e565b610ecf565b6040519015158152602001610471565b3480156104e257600080fd5b506104eb603281565b60405161ffff9091168152602001610471565b34801561050a57600080fd5b5061042d610519366004613958565b610ee6565b34801561052a57600080fd5b506016545b604051908152602001610471565b34801561054957600080fd5b5061052f610f32565b34801561055e57600080fd5b506104c661056d366004613975565b610f4e565b34801561057e57600080fd5b5061042d610fe5565b34801561059357600080fd5b5061052f60125481565b3480156105a957600080fd5b50601a546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c001610471565b34801561061257600080fd5b506029546104c69060ff1681565b34801561062c57600080fd5b50610494603281565b34801561064157600080fd5b506009610494565b34801561065557600080fd5b5061052f6106643660046139b6565b611028565b34801561067557600080fd5b506104eb600081565b34801561068a57600080fd5b5061042d6106993660046139b6565b611080565b3480156106aa57600080fd5b506104c66106b936600461391e565b6110c4565b3480156106ca57600080fd5b5061052f60245481565b3480156106e057600080fd5b5061052f60135481565b3480156106f657600080fd5b5061052f601e5481565b34801561070c57600080fd5b5061052f602a5481565b34801561072257600080fd5b50602b546104c690610100900460ff1681565b34801561074157600080fd5b5061042d6107503660046139b6565b6110fb565b34801561076157600080fd5b5061052f60185481565b34801561077757600080fd5b5061042d6107863660046139e9565b61115e565b34801561079757600080fd5b5061052f60205481565b3480156107ad57600080fd5b5060265461052f565b3480156107c257600080fd5b5061042d611291565b3480156107d757600080fd5b5061042d6107e636600461389b565b61135e565b3480156107f757600080fd5b5061042d61080636600461389b565b6113a9565b34801561081757600080fd5b506108206113fe565b60408051928352602083019190915201610471565b34801561084157600080fd5b5061052f6108503660046139b6565b6001600160a01b031660009081526001602052604090205490565b34801561087757600080fd5b5061042d61143b565b34801561088c57600080fd5b506104c661089b3660046139b6565b6114be565b3480156108ac57600080fd5b5061042d6108bb366004613a5d565b6114cb565b3480156108cc57600080fd5b5061052f60175481565b3480156108e257600080fd5b5061042d61152b565b3480156108f757600080fd5b5061052f601c5481565b34801561090d57600080fd5b50602b546104c69060ff1681565b34801561092757600080fd5b506027546104c69060ff1681565b34801561094157600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610471565b34801561097357600080fd5b506000546001600160a01b031661094f565b34801561099157600080fd5b5060145461094f906001600160a01b031681565b3480156109b157600080fd5b5061046461157e565b3480156109c657600080fd5b5061042d61158d565b3480156109db57600080fd5b5061042d6109ea366004613958565b6116dc565b3480156109fb57600080fd5b5061042d610a0a366004613a78565b611728565b348015610a1b57600080fd5b506104c6610a2a36600461391e565b6118aa565b348015610a3b57600080fd5b506104c6610a4a36600461391e565b611926565b348015610a5b57600080fd5b50610464611933565b348015610a7057600080fd5b5061042d610a7f3660046139b6565b6119c1565b348015610a9057600080fd5b5061042d610a9f366004613958565b611a1c565b348015610ab057600080fd5b5060235461094f906001600160a01b031681565b348015610ad057600080fd5b5061042d611a68565b348015610ae557600080fd5b5061052f611a71565b348015610afa57600080fd5b5061052f611a91565b348015610b0f57600080fd5b5061042d610b1e3660046139b6565b611acf565b348015610b2f57600080fd5b5061042d610b3e366004613b3d565b611b13565b348015610b4f57600080fd5b5061042d610b5e36600461389b565b611b65565b348015610b6f57600080fd5b50610464611ba3565b348015610b8457600080fd5b5061042d610b9336600461389b565b611bb0565b348015610ba457600080fd5b5060155461094f906001600160a01b031681565b348015610bc457600080fd5b5061052f610bd3366004613ba1565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610c0a57600080fd5b5061042d610c1936600461389b565b611c3c565b348015610c2a57600080fd5b5061042d610c393660046139b6565b611cc1565b348015610c4a57600080fd5b5061052f611d1c565b348015610c5f57600080fd5b5061042d610c6e366004613958565b611d82565b348015610c7f57600080fd5b5061052f601d5481565b348015610c9557600080fd5b5061042d610ca43660046139b6565b611f9c565b348015610cb557600080fd5b5061042d610cc43660046139b6565b611ff7565b348015610cd557600080fd5b5061042d610ce43660046139b6565b61203b565b348015610cf557600080fd5b5061052f60285481565b348015610d0b57600080fd5b5061042d612134565b348015610d2057600080fd5b506104c6610d2f3660046139b6565b612192565b33610d476000546001600160a01b031690565b6001600160a01b031614610d765760405162461bcd60e51b8152600401610d6d90613bda565b60405180910390fd5b602054811115610d8557600080fd5b8060206000828254610d979190613c25565b90915550506014546001600160a01b03166108fc6064610db8846032613c3c565b610dc29190613c5b565b6040518115909202916000818181858888f19350505050158015610dea573d6000803e3d6000fd5b506015546001600160a01b03166108fc6064610e07846032613c3c565b610e119190613c5b565b6040518115909202916000818181858888f19350505050158015610e39573d6000803e3d6000fd5b5050565b6060600f8054610e4c90613c7d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7890613c7d565b8015610ec55780601f10610e9a57610100808354040283529160200191610ec5565b820191906000526020600020905b815481529060010190602001808311610ea857829003601f168201915b5050505050905090565b6000610edc3384846121bb565b5060015b92915050565b33610ef96000546001600160a01b031690565b6001600160a01b031614610f1f5760405162461bcd60e51b8152600401610d6d90613bda565b6027805460ff1916911515919091179055565b610f3e6009600a613d95565b610f4b90620f4240613c3c565b81565b6000610f5b8484846122ae565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610fc65760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610d6d565b610fda8533610fd58685613c25565b6121bb565b506001949350505050565b33610ff86000546001600160a01b031690565b6001600160a01b03161461101e5760405162461bcd60e51b8152600401610d6d90613bda565b61102661250b565b565b6000611033826114be565b1561105457506001600160a01b031660009081526022602052604090205490565b6001600160a01b0382166000908152602260205260409020546110768361264b565b610ee09190613da4565b336110936000546001600160a01b031690565b6001600160a01b0316146110b95760405162461bcd60e51b8152600401610d6d90613bda565b610e39600d826126d1565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610edc918590610fd5908690613da4565b3361110e6000546001600160a01b031690565b6001600160a01b0316146111345760405162461bcd60e51b8152600401610d6d90613bda565b602b80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336111716000546001600160a01b031690565b6001600160a01b0316146111975760405162461bcd60e51b8152600401610d6d90613bda565b6000846111a48789613dbc565b6111ae9190613dbc565b90508060ff166064146112125760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610d6d565b50601a805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b336112a46000546001600160a01b031690565b6001600160a01b0316146112ca5760405162461bcd60e51b8152600401610d6d90613bda565b602c544210156112ec5760405162461bcd60e51b8152600401610d6d90613de1565b6112f861070842613da4565b602c556014546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611348576040519150601f19603f3d011682016040523d82523d6000602084013e61134d565b606091505b505090508061135b57600080fd5b50565b336113716000546001600160a01b031690565b6001600160a01b0316146113975760405162461bcd60e51b8152600401610d6d90613bda565b61135b6113a44283613da4565b6126e6565b336113bc6000546001600160a01b031690565b6001600160a01b0316146113e25760405162461bcd60e51b8152600401610d6d90613bda565b6113ee6009600a613d95565b6113f89082613c3c565b60195550565b60008061140d6009600a613d95565b60175461141a9190613c5b565b6114266009600a613d95565b6018546114339190613c5b565b915091509091565b3361144e6000546001600160a01b031690565b6001600160a01b0316146114745760405162461bcd60e51b8152600401610d6d90613bda565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610ee0600b836126f9565b336114de6000546001600160a01b031690565b6001600160a01b0316146115045760405162461bcd60e51b8152600401610d6d90613bda565b60648160ff16111561151557600080fd5b601f805460ff191660ff92909216919091179055565b3361153e6000546001600160a01b031690565b6001600160a01b0316146115645760405162461bcd60e51b8152600401610d6d90613bda565b602b805461ff00191661010017905542601155565b905090565b606060108054610e4c90613c7d565b336115a06000546001600160a01b031690565b6001600160a01b0316146115c65760405162461bcd60e51b8152600401610d6d90613bda565b602c544210156115e85760405162461bcd60e51b8152600401610d6d90613de1565b602b546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa15801561163a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165e9190613e0b565b60145460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156116b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d79190613e24565b505050565b336116ef6000546001600160a01b031690565b6001600160a01b0316146117155760405162461bcd60e51b8152600401610d6d90613bda565b602b805460ff1916911515919091179055565b3361173b6000546001600160a01b031690565b6001600160a01b0316146117615760405162461bcd60e51b8152600401610d6d90613bda565b60646016546117709190613c5b565b811061177b57600080fd5b6117876009600a613d95565b6117919083613c3c565b915061179f6009600a613d95565b6117a99082613c3c565b90506000603260ff166016546117bf9190613c5b565b90506000603261ffff166016546117d69190613c5b565b90508184101561183c5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610d6d565b8083101561189d5760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610d6d565b5050601791909155601855565b3360009081526002602090815260408083206001600160a01b03861684529091528120548281101561190d5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610d6d565b61191c3385610fd58685613c25565b5060019392505050565b6000610edc3384846122ae565b6010805461194090613c7d565b80601f016020809104026020016040519081016040528092919081815260200182805461196c90613c7d565b80156119b95780601f1061198e576101008083540402835291602001916119b9565b820191906000526020600020905b81548152906001019060200180831161199c57829003601f168201915b505050505081565b336119d46000546001600160a01b031690565b6001600160a01b0316146119fa5760405162461bcd60e51b8152600401610d6d90613bda565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b33611a2f6000546001600160a01b031690565b6001600160a01b031614611a555760405162461bcd60e51b8152600401610d6d90613bda565b6029805460ff1916911515919091179055565b6110263361271b565b6000602c54421015611a8b5742602c546115799190613c25565b50600090565b6000611a9f6009600a613d95565b601654611aae6009600a613d95565b611abb90620f4240613c3c565b611ac59190613c25565b6115799190613c5b565b33611ae26000546001600160a01b031690565b6001600160a01b031614611b085760405162461bcd60e51b8152600401610d6d90613bda565b610e3960058261219f565b33611b266000546001600160a01b031690565b6001600160a01b031614611b4c5760405162461bcd60e51b8152600401610d6d90613bda565b600f611b588382613e87565b5060106116d78282613e87565b33611b786000546001600160a01b031690565b6001600160a01b031614611b9e5760405162461bcd60e51b8152600401610d6d90613bda565b602655565b600f805461194090613c7d565b33611bc36000546001600160a01b031690565b6001600160a01b031614611be95760405162461bcd60e51b8152600401610d6d90613bda565b8015611c375760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610d6d565b602855565b33611c4f6000546001600160a01b031690565b6001600160a01b031614611c755760405162461bcd60e51b8152600401610d6d90613bda565b8015611cbc5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610d6d565b602a55565b33611cd46000546001600160a01b031690565b6001600160a01b031614611cfa5760405162461bcd60e51b8152600401610d6d90613bda565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b601654600090815b611d2e600b6129cc565b811015611d7c5760016000611d44600b846129d6565b6001600160a01b03168152602081019190915260400160002054611d689083613c25565b915080611d7481613f47565b915050611d24565b50919050565b33611d956000546001600160a01b031690565b6001600160a01b031614611dbb5760405162461bcd60e51b8152600401610d6d90613bda565b602c54421015611ddd5760405162461bcd60e51b8152600401610d6d90613de1565b611de961070842613da4565b602c55602b546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611e3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e629190613e0b565b601b5460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edb9190613e24565b50601b5460405163af2979eb60e01b815247916001600160a01b03169063af2979eb90611f179030908690600090819084904290600401613f60565b6020604051808303816000875af1158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a9190613e0b565b506000611f678247613c25565b90508415611f7d57611f78816129e2565b611f95565b8060206000828254611f8f9190613da4565b90915550505b5050505050565b33611faf6000546001600160a01b031690565b6001600160a01b031614611fd55760405162461bcd60e51b8152600401610d6d90613bda565b602380546001600160a01b0319166001600160a01b0392909216919091179055565b3361200a6000546001600160a01b031690565b6001600160a01b0316146120305760405162461bcd60e51b8152600401610d6d90613bda565b610e39600d8261219f565b3361204e6000546001600160a01b031690565b6001600160a01b0316146120745760405162461bcd60e51b8152600401610d6d90613bda565b6001600160a01b0381166120d95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d6d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336121476000546001600160a01b031690565b6001600160a01b03161461216d5760405162461bcd60e51b8152600401610d6d90613bda565b6020805460009091556014546001600160a01b03166108fc6064610db8846032613c3c565b6000610ee0600d836126f9565b60006121b4836001600160a01b038416612aae565b9392505050565b6001600160a01b0383166122055760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610d6d565b6001600160a01b03821661224d5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610d6d565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166122f95760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610d6d565b6001600160a01b0382166123425760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610d6d565b600061234f6005856126f9565b8061236057506123606005846126f9565b905060006001600160a01b03851630148061238357506001600160a01b03841630145b601b54601a549192506001600160a01b0390811691600091888116600160301b909204161480156123c55750816001600160a01b0316866001600160a01b0316145b806124005750601a546001600160a01b03878116600160301b909204161480156124005750816001600160a01b0316876001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b90920416148061243a5750826001600160a01b0316886001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b9092041614806124745750836001600160a01b0316886001600160a01b0316145b9050848061247f5750825b806124875750855b1561249c57612497898989612afd565b612500565b602b54610100900460ff166124f35760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610d6d565b6125008989898585612bc8565b505050505050505050565b6025805460ff191660019081179091553060009081526020919091526040812054601a5490919061255190600160281b810460ff90811691640100000000900416613dbc565b60ff169050600060265490508083108061256d575061ffff8216155b1561257a5750505061263f565b601a5460009061ffff84169061259b90640100000000900460ff1684613c3c565b6125a59190613c5b565b905060006125b38284613c25565b905060006125c2600284613c5b565b905060006125d08285613c25565b905060006125de8483613da4565b9050476125ea82613360565b60006125f68247613c25565b90506000836126058684613c3c565b61260f9190613c5b565b905061261b86826134b9565b60006126278447613c25565b9050612632816129e2565b5050505050505050505050505b6025805460ff19169055565b6001600160a01b038116600090815260016020526040812054601c54829161267291613c3c565b6001600160a01b03841660009081526021602052604090205490915081101561269e5750600092915050565b6001600160a01b038316600090815260216020526040902054600160401b906126c79083613c25565b6121b49190613c5b565b60006121b4836001600160a01b038416613568565b602c5481116126f457600080fd5b602c55565b6001600160a01b038116600090815260018301602052604081205415156121b4565b601b54600160a01b900460ff161561273257600080fd5b601b805460ff60a01b1916600160a01b1790556000612750826114be565b1561277857506001600160a01b038116600090815260226020526040812080549190556127f8565b60006127838361264b565b6001600160a01b038416600090815260016020526040902054601c549192506127ab91613c3c565b6001600160a01b0384166000908152602160209081526040808320939093556022905220546127db908290613da4565b6001600160a01b0384166000908152602260205260408120559150505b80600003612811575050601b805460ff60a01b19169055565b80601e60008282546128239190613da4565b90915550506040805160028082526060820183526000926020830190803683375050601b54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128b69190613f9b565b816000815181106128c9576128c9613fb8565b6001600160a01b0392831660209182029290920101526023548251911690829060019081106128fa576128fa613fb8565b6001600160a01b039283166020918202929092010152601b5460405163b6f9de9560e01b815291169063b6f9de9590849061294090600090869089904290600401614012565b6000604051808303818588803b15801561295957600080fd5b505af115801561296d573d6000803e3d6000fd5b5050604080518681526001600160a01b03881660208201527f80a489adad6e8e00b344a3e9042e6aff0ae286ce1376918078a67bbce8b905b394500191506129b29050565b60405180910390a15050601b805460ff60a01b1916905550565b6000610ee0825490565b60006121b48383613655565b601f546000906064906129f89060ff1684613c3c565b612a029190613c5b565b90506000612a108284613c25565b90508160206000828254612a249190613da4565b909155505080156116d75780601d6000828254612a419190613da4565b9091555060009050612a51611d1c565b905080600003612a78578160206000828254612a6d9190613da4565b90915550612aa89050565b80612a87600160401b84613c3c565b612a919190613c5b565b601c6000828254612aa29190613da4565b90915550505b50505050565b6000818152600183016020526040812054612af557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ee0565b506000610ee0565b6001600160a01b03831660009081526001602052604090205481811015612b615760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d6d565b612b6b84836136db565b612b75838361379c565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612bba91815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612c365760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d6d565b60008315612de957612c496007896126f9565b612cde576001600160a01b03881660009081526003602052604090205442101580612c76575060275460ff165b612cb75760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610d6d565b602854612cc49042613da4565b6001600160a01b0389166000908152600360205260409020555b601854861115612d225760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610d6d565b612d2d600d896126f9565b15612d715760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d6d565b601254601154612d819190613da4565b4211158015612d9257506013546001145b15612dd857612da2600d8961219f565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a54610100900460ff166131fd565b8415612ffa57612dfa6009886126f9565b612e8d576001600160a01b03871660009081526004602052604090205442101580612e27575060295460ff165b612e665760405162461bcd60e51b815260206004820152601060248201526f427579657220696e206275794c6f636b60801b6044820152606401610d6d565b602a54612e739042613da4565b6001600160a01b0388166000908152600460205260409020555b601754612e9a8785613da4565b1115612edb5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d6d565b601954861115612f385760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610d6d565b612f43600d886126f9565b15612f875760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d6d565b601254601154612f979190613da4565b4211158015612fa857506013546001145b15612fee57612fb8600d8861219f565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5460ff166131fd565b6130066009600a613d95565b8611613015576130158861271b565b6017546130228785613da4565b11156130635760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d6d565b61306e6007896126f9565b6130d8576001600160a01b0388166000908152600360205260409020544210158061309b575060275460ff165b6130d85760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610d6d565b6130e3600d896126f9565b156131305760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610d6d565b61313b600d886126f9565b156131885760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610d6d565b6012546011546131989190613da4565b42111580156131a957506013546001145b156131ef576131b9600d8961219f565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5462010000900460ff165b601a546001600160a01b03898116600160301b90920416148015906132255750602b5460ff16155b8015613234575060255460ff16155b801561323d5750835b1561324a5761324a61250b565b60006132668783601a60039054906101000a900460ff16613867565b601a5490915060009061329a90899085906132959060ff6401000000008204811691600160281b900416613dbc565b613867565b905060006132a88284613da4565b6132b2908a613c25565b90506132be8b8a6136db565b30600090815260016020526040812080548492906132dd908490613da4565b9250508190555082601660008282546132f69190613c25565b9091555061330690508a8261379c565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161334b91815260200190565b60405180910390a35050505050505050505050565b601b546133789030906001600160a01b0316836121bb565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106133ad576133ad613fb8565b6001600160a01b03928316602091820292909201810191909152601b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061342a9190613f9b565b8160018151811061343d5761343d613fb8565b6001600160a01b039283166020918202929092010152601b5460405163791ac94760e01b815291169063791ac94790613483908590600090869030904290600401614047565b600060405180830381600087803b15801561349d57600080fd5b505af11580156134b1573d6000803e3d6000fd5b505050505050565b80602460008282546134cb9190613da4565b9091555050601b546134e89030906001600160a01b0316846121bb565b601b5460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906135259030908790600090819084904290600401613f60565b60606040518083038185885af1158015613543573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f959190614083565b6000818152600183016020526040812054801561364b57600061358c600183613c25565b85549091506000906135a090600190613c25565b905060008660000182815481106135b9576135b9613fb8565b90600052602060002001549050808760000184815481106135dc576135dc613fb8565b60009182526020808320909101929092558281526001890190915260409020849055865487908061360f5761360f6140b1565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610ee0565b6000915050610ee0565b815460009082106136b35760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610d6d565b8260000182815481106136c8576136c8613fb8565b9060005260206000200154905092915050565b6001600160a01b0382166000908152600160205260408120546136ff908390613c25565b905061370a836114be565b1561372f576001600160a01b0390921660009081526001602052604090209190915550565b600061373a8461264b565b6001600160a01b0385166000908152600160205260409020839055601c54909150613766908390613c3c565b6001600160a01b038516600090815260216020908152604080832093909355602290529081208054839290612aa2908490613da4565b6001600160a01b0382166000908152600160205260408120546137c0908390613da4565b90506137cb836114be565b156137f0576001600160a01b0390921660009081526001602052604090209190915550565b60006137fb8461264b565b905081601c5461380b9190613c3c565b6001600160a01b038516600090815260216020908152604080832093909355602290529081208054839290613841908490613da4565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006127108260ff168460ff168661387f9190613c3c565b6138899190613c3c565b6138939190613c5b565b949350505050565b6000602082840312156138ad57600080fd5b5035919050565b600060208083528351808285015260005b818110156138e1578581018301518582016040015282016138c5565b818111156138f3576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461135b57600080fd5b6000806040838503121561393157600080fd5b823561393c81613909565b946020939093013593505050565b801515811461135b57600080fd5b60006020828403121561396a57600080fd5b81356121b48161394a565b60008060006060848603121561398a57600080fd5b833561399581613909565b925060208401356139a581613909565b929592945050506040919091013590565b6000602082840312156139c857600080fd5b81356121b481613909565b803560ff811681146139e457600080fd5b919050565b60008060008060008060c08789031215613a0257600080fd5b613a0b876139d3565b9550613a19602088016139d3565b9450613a27604088016139d3565b9350613a35606088016139d3565b9250613a43608088016139d3565b9150613a5160a088016139d3565b90509295509295509295565b600060208284031215613a6f57600080fd5b6121b4826139d3565b60008060408385031215613a8b57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613ac157600080fd5b813567ffffffffffffffff80821115613adc57613adc613a9a565b604051601f8301601f19908116603f01168101908282118183101715613b0457613b04613a9a565b81604052838152866020858801011115613b1d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215613b5057600080fd5b823567ffffffffffffffff80821115613b6857600080fd5b613b7486838701613ab0565b93506020850135915080821115613b8a57600080fd5b50613b9785828601613ab0565b9150509250929050565b60008060408385031215613bb457600080fd5b8235613bbf81613909565b91506020830135613bcf81613909565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613c3757613c37613c0f565b500390565b6000816000190483118215151615613c5657613c56613c0f565b500290565b600082613c7857634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680613c9157607f821691505b602082108103611d7c57634e487b7160e01b600052602260045260246000fd5b600181815b80851115613cec578160001904821115613cd257613cd2613c0f565b80851615613cdf57918102915b93841c9390800290613cb6565b509250929050565b600082613d0357506001610ee0565b81613d1057506000610ee0565b8160018114613d265760028114613d3057613d4c565b6001915050610ee0565b60ff841115613d4157613d41613c0f565b50506001821b610ee0565b5060208310610133831016604e8410600b8410161715613d6f575081810a610ee0565b613d798383613cb1565b8060001904821115613d8d57613d8d613c0f565b029392505050565b60006121b460ff841683613cf4565b60008219821115613db757613db7613c0f565b500190565b600060ff821660ff84168060ff03821115613dd957613dd9613c0f565b019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b600060208284031215613e1d57600080fd5b5051919050565b600060208284031215613e3657600080fd5b81516121b48161394a565b601f8211156116d757600081815260208120601f850160051c81016020861015613e685750805b601f850160051c820191505b818110156134b157828155600101613e74565b815167ffffffffffffffff811115613ea157613ea1613a9a565b613eb581613eaf8454613c7d565b84613e41565b602080601f831160018114613eea5760008415613ed25750858301515b600019600386901b1c1916600185901b1785556134b1565b600085815260208120601f198616915b82811015613f1957888601518255948401946001909101908401613efa565b5085821015613f375787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201613f5957613f59613c0f565b5060010190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208284031215613fad57600080fd5b81516121b481613909565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156140075781516001600160a01b031687529582019590820190600101613fe2565b509495945050505050565b84815260806020820152600061402b6080830186613fce565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a06040820152600061406660a0830186613fce565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561409857600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220997604eed61c7d1d8a7d9436b6bb1791f300e95d4b3d630008e1ee8105e7373c64736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106104265760003560e01c8063762bb28211610227578063c3a3c0321161012d578063e68f136a116100b0578063f2c816ae11610077578063f2c816ae14610ca9578063f2fde38b14610cc9578063f88b0e4614610ce9578063fe002ec214610cff578063fe575a8714610d1457005b8063e68f136a14610c1e578063e69e03ee14610c3e578063ebddcc1d14610c53578063f00df36514610c73578063f0cc761214610c8957005b8063d28d8852116100f4578063d28d885214610b63578063d51f383b14610b78578063db886f2314610b98578063dd62ed3e14610bb8578063e2fd002a14610bfe57005b8063c3a3c03214610ad9578063c3f4f54f14610aee578063cd979a7e14610b03578063d0291d6614610b23578063d11edf7414610b4357005b8063998a8668116101b5578063b09f12661161017c578063b09f126614610a4f578063b58a56cd14610a64578063b766a38614610a84578063c054f2f414610aa4578063c280895414610ac457005b8063998a8668146109ba5780639bf65770146109cf5780639fa62d5f146109ef578063a457c2d714610a0f578063a9059cbb14610a2f57005b8063887c60fb116101f9578063887c60fb1461091b578063893d20e8146109355780638da5cb5b1461096757806394e8075d1461098557806395d89b41146109a557005b8063762bb282146108c05780637b9e987a146108d65780638650e92a146108eb57806386d0ada81461090157005b80633cc39b7a1161032c5780635b80f625116102ba5780636f89e409116102815780636f89e4091461080b57806370a0823114610835578063715018a61461086b5780637335307b1461088057806373ddf08e146108a057005b80635b80f625146107a15780635c69f690146106695780635ebbc3ca146107b6578063643daaea146107cb5780636ea4caab146107eb57005b80634ada218b116102fe5780634ada218b146107165780634cdaf0ae146107355780634f91e48c1461075557806357ad67d11461076b57806358e553651461078b57005b80633cc39b7a146106be5780633da56f18146106d45780634089b170146106ea57806344f3c83a1461070057005b8063243b529a116103b4578063313ce5671161037b578063313ce5671461063557806332ac487f146106495780633478154b1461066957806335e82f3a1461067e578063395093511461069e57005b8063243b529a14610572578063269a6aae146105875780632973ef2d1461059d5780633054f8a314610606578063311a86971461062057005b80630fd99e16116103f85780630fd99e16146104d657806314e91377146104fe57806318160ddd1461051e5780631eb25d131461053d57806323b872dd1461055257005b80630241047b1461042f57806306fdde031461044f57806309218ee71461047a578063095ea7b3146104a657005b3661042d57005b005b34801561043b57600080fd5b5061042d61044a36600461389b565b610d34565b34801561045b57600080fd5b50610464610e3d565b60405161047191906138b4565b60405180910390f35b34801561048657600080fd5b50601f546104949060ff1681565b60405160ff9091168152602001610471565b3480156104b257600080fd5b506104c66104c136600461391e565b610ecf565b6040519015158152602001610471565b3480156104e257600080fd5b506104eb603281565b60405161ffff9091168152602001610471565b34801561050a57600080fd5b5061042d610519366004613958565b610ee6565b34801561052a57600080fd5b506016545b604051908152602001610471565b34801561054957600080fd5b5061052f610f32565b34801561055e57600080fd5b506104c661056d366004613975565b610f4e565b34801561057e57600080fd5b5061042d610fe5565b34801561059357600080fd5b5061052f60125481565b3480156105a957600080fd5b50601a546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c001610471565b34801561061257600080fd5b506029546104c69060ff1681565b34801561062c57600080fd5b50610494603281565b34801561064157600080fd5b506009610494565b34801561065557600080fd5b5061052f6106643660046139b6565b611028565b34801561067557600080fd5b506104eb600081565b34801561068a57600080fd5b5061042d6106993660046139b6565b611080565b3480156106aa57600080fd5b506104c66106b936600461391e565b6110c4565b3480156106ca57600080fd5b5061052f60245481565b3480156106e057600080fd5b5061052f60135481565b3480156106f657600080fd5b5061052f601e5481565b34801561070c57600080fd5b5061052f602a5481565b34801561072257600080fd5b50602b546104c690610100900460ff1681565b34801561074157600080fd5b5061042d6107503660046139b6565b6110fb565b34801561076157600080fd5b5061052f60185481565b34801561077757600080fd5b5061042d6107863660046139e9565b61115e565b34801561079757600080fd5b5061052f60205481565b3480156107ad57600080fd5b5060265461052f565b3480156107c257600080fd5b5061042d611291565b3480156107d757600080fd5b5061042d6107e636600461389b565b61135e565b3480156107f757600080fd5b5061042d61080636600461389b565b6113a9565b34801561081757600080fd5b506108206113fe565b60408051928352602083019190915201610471565b34801561084157600080fd5b5061052f6108503660046139b6565b6001600160a01b031660009081526001602052604090205490565b34801561087757600080fd5b5061042d61143b565b34801561088c57600080fd5b506104c661089b3660046139b6565b6114be565b3480156108ac57600080fd5b5061042d6108bb366004613a5d565b6114cb565b3480156108cc57600080fd5b5061052f60175481565b3480156108e257600080fd5b5061042d61152b565b3480156108f757600080fd5b5061052f601c5481565b34801561090d57600080fd5b50602b546104c69060ff1681565b34801561092757600080fd5b506027546104c69060ff1681565b34801561094157600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610471565b34801561097357600080fd5b506000546001600160a01b031661094f565b34801561099157600080fd5b5060145461094f906001600160a01b031681565b3480156109b157600080fd5b5061046461157e565b3480156109c657600080fd5b5061042d61158d565b3480156109db57600080fd5b5061042d6109ea366004613958565b6116dc565b3480156109fb57600080fd5b5061042d610a0a366004613a78565b611728565b348015610a1b57600080fd5b506104c6610a2a36600461391e565b6118aa565b348015610a3b57600080fd5b506104c6610a4a36600461391e565b611926565b348015610a5b57600080fd5b50610464611933565b348015610a7057600080fd5b5061042d610a7f3660046139b6565b6119c1565b348015610a9057600080fd5b5061042d610a9f366004613958565b611a1c565b348015610ab057600080fd5b5060235461094f906001600160a01b031681565b348015610ad057600080fd5b5061042d611a68565b348015610ae557600080fd5b5061052f611a71565b348015610afa57600080fd5b5061052f611a91565b348015610b0f57600080fd5b5061042d610b1e3660046139b6565b611acf565b348015610b2f57600080fd5b5061042d610b3e366004613b3d565b611b13565b348015610b4f57600080fd5b5061042d610b5e36600461389b565b611b65565b348015610b6f57600080fd5b50610464611ba3565b348015610b8457600080fd5b5061042d610b9336600461389b565b611bb0565b348015610ba457600080fd5b5060155461094f906001600160a01b031681565b348015610bc457600080fd5b5061052f610bd3366004613ba1565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610c0a57600080fd5b5061042d610c1936600461389b565b611c3c565b348015610c2a57600080fd5b5061042d610c393660046139b6565b611cc1565b348015610c4a57600080fd5b5061052f611d1c565b348015610c5f57600080fd5b5061042d610c6e366004613958565b611d82565b348015610c7f57600080fd5b5061052f601d5481565b348015610c9557600080fd5b5061042d610ca43660046139b6565b611f9c565b348015610cb557600080fd5b5061042d610cc43660046139b6565b611ff7565b348015610cd557600080fd5b5061042d610ce43660046139b6565b61203b565b348015610cf557600080fd5b5061052f60285481565b348015610d0b57600080fd5b5061042d612134565b348015610d2057600080fd5b506104c6610d2f3660046139b6565b612192565b33610d476000546001600160a01b031690565b6001600160a01b031614610d765760405162461bcd60e51b8152600401610d6d90613bda565b60405180910390fd5b602054811115610d8557600080fd5b8060206000828254610d979190613c25565b90915550506014546001600160a01b03166108fc6064610db8846032613c3c565b610dc29190613c5b565b6040518115909202916000818181858888f19350505050158015610dea573d6000803e3d6000fd5b506015546001600160a01b03166108fc6064610e07846032613c3c565b610e119190613c5b565b6040518115909202916000818181858888f19350505050158015610e39573d6000803e3d6000fd5b5050565b6060600f8054610e4c90613c7d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7890613c7d565b8015610ec55780601f10610e9a57610100808354040283529160200191610ec5565b820191906000526020600020905b815481529060010190602001808311610ea857829003601f168201915b5050505050905090565b6000610edc3384846121bb565b5060015b92915050565b33610ef96000546001600160a01b031690565b6001600160a01b031614610f1f5760405162461bcd60e51b8152600401610d6d90613bda565b6027805460ff1916911515919091179055565b610f3e6009600a613d95565b610f4b90620f4240613c3c565b81565b6000610f5b8484846122ae565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610fc65760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610d6d565b610fda8533610fd58685613c25565b6121bb565b506001949350505050565b33610ff86000546001600160a01b031690565b6001600160a01b03161461101e5760405162461bcd60e51b8152600401610d6d90613bda565b61102661250b565b565b6000611033826114be565b1561105457506001600160a01b031660009081526022602052604090205490565b6001600160a01b0382166000908152602260205260409020546110768361264b565b610ee09190613da4565b336110936000546001600160a01b031690565b6001600160a01b0316146110b95760405162461bcd60e51b8152600401610d6d90613bda565b610e39600d826126d1565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610edc918590610fd5908690613da4565b3361110e6000546001600160a01b031690565b6001600160a01b0316146111345760405162461bcd60e51b8152600401610d6d90613bda565b602b80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336111716000546001600160a01b031690565b6001600160a01b0316146111975760405162461bcd60e51b8152600401610d6d90613bda565b6000846111a48789613dbc565b6111ae9190613dbc565b90508060ff166064146112125760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610d6d565b50601a805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b336112a46000546001600160a01b031690565b6001600160a01b0316146112ca5760405162461bcd60e51b8152600401610d6d90613bda565b602c544210156112ec5760405162461bcd60e51b8152600401610d6d90613de1565b6112f861070842613da4565b602c556014546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611348576040519150601f19603f3d011682016040523d82523d6000602084013e61134d565b606091505b505090508061135b57600080fd5b50565b336113716000546001600160a01b031690565b6001600160a01b0316146113975760405162461bcd60e51b8152600401610d6d90613bda565b61135b6113a44283613da4565b6126e6565b336113bc6000546001600160a01b031690565b6001600160a01b0316146113e25760405162461bcd60e51b8152600401610d6d90613bda565b6113ee6009600a613d95565b6113f89082613c3c565b60195550565b60008061140d6009600a613d95565b60175461141a9190613c5b565b6114266009600a613d95565b6018546114339190613c5b565b915091509091565b3361144e6000546001600160a01b031690565b6001600160a01b0316146114745760405162461bcd60e51b8152600401610d6d90613bda565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610ee0600b836126f9565b336114de6000546001600160a01b031690565b6001600160a01b0316146115045760405162461bcd60e51b8152600401610d6d90613bda565b60648160ff16111561151557600080fd5b601f805460ff191660ff92909216919091179055565b3361153e6000546001600160a01b031690565b6001600160a01b0316146115645760405162461bcd60e51b8152600401610d6d90613bda565b602b805461ff00191661010017905542601155565b905090565b606060108054610e4c90613c7d565b336115a06000546001600160a01b031690565b6001600160a01b0316146115c65760405162461bcd60e51b8152600401610d6d90613bda565b602c544210156115e85760405162461bcd60e51b8152600401610d6d90613de1565b602b546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa15801561163a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165e9190613e0b565b60145460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156116b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d79190613e24565b505050565b336116ef6000546001600160a01b031690565b6001600160a01b0316146117155760405162461bcd60e51b8152600401610d6d90613bda565b602b805460ff1916911515919091179055565b3361173b6000546001600160a01b031690565b6001600160a01b0316146117615760405162461bcd60e51b8152600401610d6d90613bda565b60646016546117709190613c5b565b811061177b57600080fd5b6117876009600a613d95565b6117919083613c3c565b915061179f6009600a613d95565b6117a99082613c3c565b90506000603260ff166016546117bf9190613c5b565b90506000603261ffff166016546117d69190613c5b565b90508184101561183c5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610d6d565b8083101561189d5760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610d6d565b5050601791909155601855565b3360009081526002602090815260408083206001600160a01b03861684529091528120548281101561190d5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610d6d565b61191c3385610fd58685613c25565b5060019392505050565b6000610edc3384846122ae565b6010805461194090613c7d565b80601f016020809104026020016040519081016040528092919081815260200182805461196c90613c7d565b80156119b95780601f1061198e576101008083540402835291602001916119b9565b820191906000526020600020905b81548152906001019060200180831161199c57829003601f168201915b505050505081565b336119d46000546001600160a01b031690565b6001600160a01b0316146119fa5760405162461bcd60e51b8152600401610d6d90613bda565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b33611a2f6000546001600160a01b031690565b6001600160a01b031614611a555760405162461bcd60e51b8152600401610d6d90613bda565b6029805460ff1916911515919091179055565b6110263361271b565b6000602c54421015611a8b5742602c546115799190613c25565b50600090565b6000611a9f6009600a613d95565b601654611aae6009600a613d95565b611abb90620f4240613c3c565b611ac59190613c25565b6115799190613c5b565b33611ae26000546001600160a01b031690565b6001600160a01b031614611b085760405162461bcd60e51b8152600401610d6d90613bda565b610e3960058261219f565b33611b266000546001600160a01b031690565b6001600160a01b031614611b4c5760405162461bcd60e51b8152600401610d6d90613bda565b600f611b588382613e87565b5060106116d78282613e87565b33611b786000546001600160a01b031690565b6001600160a01b031614611b9e5760405162461bcd60e51b8152600401610d6d90613bda565b602655565b600f805461194090613c7d565b33611bc36000546001600160a01b031690565b6001600160a01b031614611be95760405162461bcd60e51b8152600401610d6d90613bda565b8015611c375760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610d6d565b602855565b33611c4f6000546001600160a01b031690565b6001600160a01b031614611c755760405162461bcd60e51b8152600401610d6d90613bda565b8015611cbc5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610d6d565b602a55565b33611cd46000546001600160a01b031690565b6001600160a01b031614611cfa5760405162461bcd60e51b8152600401610d6d90613bda565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b601654600090815b611d2e600b6129cc565b811015611d7c5760016000611d44600b846129d6565b6001600160a01b03168152602081019190915260400160002054611d689083613c25565b915080611d7481613f47565b915050611d24565b50919050565b33611d956000546001600160a01b031690565b6001600160a01b031614611dbb5760405162461bcd60e51b8152600401610d6d90613bda565b602c54421015611ddd5760405162461bcd60e51b8152600401610d6d90613de1565b611de961070842613da4565b602c55602b546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611e3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e629190613e0b565b601b5460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edb9190613e24565b50601b5460405163af2979eb60e01b815247916001600160a01b03169063af2979eb90611f179030908690600090819084904290600401613f60565b6020604051808303816000875af1158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a9190613e0b565b506000611f678247613c25565b90508415611f7d57611f78816129e2565b611f95565b8060206000828254611f8f9190613da4565b90915550505b5050505050565b33611faf6000546001600160a01b031690565b6001600160a01b031614611fd55760405162461bcd60e51b8152600401610d6d90613bda565b602380546001600160a01b0319166001600160a01b0392909216919091179055565b3361200a6000546001600160a01b031690565b6001600160a01b0316146120305760405162461bcd60e51b8152600401610d6d90613bda565b610e39600d8261219f565b3361204e6000546001600160a01b031690565b6001600160a01b0316146120745760405162461bcd60e51b8152600401610d6d90613bda565b6001600160a01b0381166120d95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d6d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336121476000546001600160a01b031690565b6001600160a01b03161461216d5760405162461bcd60e51b8152600401610d6d90613bda565b6020805460009091556014546001600160a01b03166108fc6064610db8846032613c3c565b6000610ee0600d836126f9565b60006121b4836001600160a01b038416612aae565b9392505050565b6001600160a01b0383166122055760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610d6d565b6001600160a01b03821661224d5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610d6d565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166122f95760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610d6d565b6001600160a01b0382166123425760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610d6d565b600061234f6005856126f9565b8061236057506123606005846126f9565b905060006001600160a01b03851630148061238357506001600160a01b03841630145b601b54601a549192506001600160a01b0390811691600091888116600160301b909204161480156123c55750816001600160a01b0316866001600160a01b0316145b806124005750601a546001600160a01b03878116600160301b909204161480156124005750816001600160a01b0316876001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b90920416148061243a5750826001600160a01b0316886001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b9092041614806124745750836001600160a01b0316886001600160a01b0316145b9050848061247f5750825b806124875750855b1561249c57612497898989612afd565b612500565b602b54610100900460ff166124f35760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610d6d565b6125008989898585612bc8565b505050505050505050565b6025805460ff191660019081179091553060009081526020919091526040812054601a5490919061255190600160281b810460ff90811691640100000000900416613dbc565b60ff169050600060265490508083108061256d575061ffff8216155b1561257a5750505061263f565b601a5460009061ffff84169061259b90640100000000900460ff1684613c3c565b6125a59190613c5b565b905060006125b38284613c25565b905060006125c2600284613c5b565b905060006125d08285613c25565b905060006125de8483613da4565b9050476125ea82613360565b60006125f68247613c25565b90506000836126058684613c3c565b61260f9190613c5b565b905061261b86826134b9565b60006126278447613c25565b9050612632816129e2565b5050505050505050505050505b6025805460ff19169055565b6001600160a01b038116600090815260016020526040812054601c54829161267291613c3c565b6001600160a01b03841660009081526021602052604090205490915081101561269e5750600092915050565b6001600160a01b038316600090815260216020526040902054600160401b906126c79083613c25565b6121b49190613c5b565b60006121b4836001600160a01b038416613568565b602c5481116126f457600080fd5b602c55565b6001600160a01b038116600090815260018301602052604081205415156121b4565b601b54600160a01b900460ff161561273257600080fd5b601b805460ff60a01b1916600160a01b1790556000612750826114be565b1561277857506001600160a01b038116600090815260226020526040812080549190556127f8565b60006127838361264b565b6001600160a01b038416600090815260016020526040902054601c549192506127ab91613c3c565b6001600160a01b0384166000908152602160209081526040808320939093556022905220546127db908290613da4565b6001600160a01b0384166000908152602260205260408120559150505b80600003612811575050601b805460ff60a01b19169055565b80601e60008282546128239190613da4565b90915550506040805160028082526060820183526000926020830190803683375050601b54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128b69190613f9b565b816000815181106128c9576128c9613fb8565b6001600160a01b0392831660209182029290920101526023548251911690829060019081106128fa576128fa613fb8565b6001600160a01b039283166020918202929092010152601b5460405163b6f9de9560e01b815291169063b6f9de9590849061294090600090869089904290600401614012565b6000604051808303818588803b15801561295957600080fd5b505af115801561296d573d6000803e3d6000fd5b5050604080518681526001600160a01b03881660208201527f80a489adad6e8e00b344a3e9042e6aff0ae286ce1376918078a67bbce8b905b394500191506129b29050565b60405180910390a15050601b805460ff60a01b1916905550565b6000610ee0825490565b60006121b48383613655565b601f546000906064906129f89060ff1684613c3c565b612a029190613c5b565b90506000612a108284613c25565b90508160206000828254612a249190613da4565b909155505080156116d75780601d6000828254612a419190613da4565b9091555060009050612a51611d1c565b905080600003612a78578160206000828254612a6d9190613da4565b90915550612aa89050565b80612a87600160401b84613c3c565b612a919190613c5b565b601c6000828254612aa29190613da4565b90915550505b50505050565b6000818152600183016020526040812054612af557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ee0565b506000610ee0565b6001600160a01b03831660009081526001602052604090205481811015612b615760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d6d565b612b6b84836136db565b612b75838361379c565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612bba91815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612c365760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d6d565b60008315612de957612c496007896126f9565b612cde576001600160a01b03881660009081526003602052604090205442101580612c76575060275460ff165b612cb75760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610d6d565b602854612cc49042613da4565b6001600160a01b0389166000908152600360205260409020555b601854861115612d225760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610d6d565b612d2d600d896126f9565b15612d715760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d6d565b601254601154612d819190613da4565b4211158015612d9257506013546001145b15612dd857612da2600d8961219f565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a54610100900460ff166131fd565b8415612ffa57612dfa6009886126f9565b612e8d576001600160a01b03871660009081526004602052604090205442101580612e27575060295460ff165b612e665760405162461bcd60e51b815260206004820152601060248201526f427579657220696e206275794c6f636b60801b6044820152606401610d6d565b602a54612e739042613da4565b6001600160a01b0388166000908152600460205260409020555b601754612e9a8785613da4565b1115612edb5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d6d565b601954861115612f385760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610d6d565b612f43600d886126f9565b15612f875760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d6d565b601254601154612f979190613da4565b4211158015612fa857506013546001145b15612fee57612fb8600d8861219f565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5460ff166131fd565b6130066009600a613d95565b8611613015576130158861271b565b6017546130228785613da4565b11156130635760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d6d565b61306e6007896126f9565b6130d8576001600160a01b0388166000908152600360205260409020544210158061309b575060275460ff165b6130d85760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610d6d565b6130e3600d896126f9565b156131305760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610d6d565b61313b600d886126f9565b156131885760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610d6d565b6012546011546131989190613da4565b42111580156131a957506013546001145b156131ef576131b9600d8961219f565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5462010000900460ff165b601a546001600160a01b03898116600160301b90920416148015906132255750602b5460ff16155b8015613234575060255460ff16155b801561323d5750835b1561324a5761324a61250b565b60006132668783601a60039054906101000a900460ff16613867565b601a5490915060009061329a90899085906132959060ff6401000000008204811691600160281b900416613dbc565b613867565b905060006132a88284613da4565b6132b2908a613c25565b90506132be8b8a6136db565b30600090815260016020526040812080548492906132dd908490613da4565b9250508190555082601660008282546132f69190613c25565b9091555061330690508a8261379c565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161334b91815260200190565b60405180910390a35050505050505050505050565b601b546133789030906001600160a01b0316836121bb565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106133ad576133ad613fb8565b6001600160a01b03928316602091820292909201810191909152601b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061342a9190613f9b565b8160018151811061343d5761343d613fb8565b6001600160a01b039283166020918202929092010152601b5460405163791ac94760e01b815291169063791ac94790613483908590600090869030904290600401614047565b600060405180830381600087803b15801561349d57600080fd5b505af11580156134b1573d6000803e3d6000fd5b505050505050565b80602460008282546134cb9190613da4565b9091555050601b546134e89030906001600160a01b0316846121bb565b601b5460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906135259030908790600090819084904290600401613f60565b60606040518083038185885af1158015613543573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f959190614083565b6000818152600183016020526040812054801561364b57600061358c600183613c25565b85549091506000906135a090600190613c25565b905060008660000182815481106135b9576135b9613fb8565b90600052602060002001549050808760000184815481106135dc576135dc613fb8565b60009182526020808320909101929092558281526001890190915260409020849055865487908061360f5761360f6140b1565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610ee0565b6000915050610ee0565b815460009082106136b35760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610d6d565b8260000182815481106136c8576136c8613fb8565b9060005260206000200154905092915050565b6001600160a01b0382166000908152600160205260408120546136ff908390613c25565b905061370a836114be565b1561372f576001600160a01b0390921660009081526001602052604090209190915550565b600061373a8461264b565b6001600160a01b0385166000908152600160205260409020839055601c54909150613766908390613c3c565b6001600160a01b038516600090815260216020908152604080832093909355602290529081208054839290612aa2908490613da4565b6001600160a01b0382166000908152600160205260408120546137c0908390613da4565b90506137cb836114be565b156137f0576001600160a01b0390921660009081526001602052604090209190915550565b60006137fb8461264b565b905081601c5461380b9190613c3c565b6001600160a01b038516600090815260216020908152604080832093909355602290529081208054839290613841908490613da4565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006127108260ff168460ff168661387f9190613c3c565b6138899190613c3c565b6138939190613c5b565b949350505050565b6000602082840312156138ad57600080fd5b5035919050565b600060208083528351808285015260005b818110156138e1578581018301518582016040015282016138c5565b818111156138f3576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461135b57600080fd5b6000806040838503121561393157600080fd5b823561393c81613909565b946020939093013593505050565b801515811461135b57600080fd5b60006020828403121561396a57600080fd5b81356121b48161394a565b60008060006060848603121561398a57600080fd5b833561399581613909565b925060208401356139a581613909565b929592945050506040919091013590565b6000602082840312156139c857600080fd5b81356121b481613909565b803560ff811681146139e457600080fd5b919050565b60008060008060008060c08789031215613a0257600080fd5b613a0b876139d3565b9550613a19602088016139d3565b9450613a27604088016139d3565b9350613a35606088016139d3565b9250613a43608088016139d3565b9150613a5160a088016139d3565b90509295509295509295565b600060208284031215613a6f57600080fd5b6121b4826139d3565b60008060408385031215613a8b57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613ac157600080fd5b813567ffffffffffffffff80821115613adc57613adc613a9a565b604051601f8301601f19908116603f01168101908282118183101715613b0457613b04613a9a565b81604052838152866020858801011115613b1d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215613b5057600080fd5b823567ffffffffffffffff80821115613b6857600080fd5b613b7486838701613ab0565b93506020850135915080821115613b8a57600080fd5b50613b9785828601613ab0565b9150509250929050565b60008060408385031215613bb457600080fd5b8235613bbf81613909565b91506020830135613bcf81613909565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613c3757613c37613c0f565b500390565b6000816000190483118215151615613c5657613c56613c0f565b500290565b600082613c7857634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680613c9157607f821691505b602082108103611d7c57634e487b7160e01b600052602260045260246000fd5b600181815b80851115613cec578160001904821115613cd257613cd2613c0f565b80851615613cdf57918102915b93841c9390800290613cb6565b509250929050565b600082613d0357506001610ee0565b81613d1057506000610ee0565b8160018114613d265760028114613d3057613d4c565b6001915050610ee0565b60ff841115613d4157613d41613c0f565b50506001821b610ee0565b5060208310610133831016604e8410600b8410161715613d6f575081810a610ee0565b613d798383613cb1565b8060001904821115613d8d57613d8d613c0f565b029392505050565b60006121b460ff841683613cf4565b60008219821115613db757613db7613c0f565b500190565b600060ff821660ff84168060ff03821115613dd957613dd9613c0f565b019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b600060208284031215613e1d57600080fd5b5051919050565b600060208284031215613e3657600080fd5b81516121b48161394a565b601f8211156116d757600081815260208120601f850160051c81016020861015613e685750805b601f850160051c820191505b818110156134b157828155600101613e74565b815167ffffffffffffffff811115613ea157613ea1613a9a565b613eb581613eaf8454613c7d565b84613e41565b602080601f831160018114613eea5760008415613ed25750858301515b600019600386901b1c1916600185901b1785556134b1565b600085815260208120601f198616915b82811015613f1957888601518255948401946001909101908401613efa565b5085821015613f375787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201613f5957613f59613c0f565b5060010190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208284031215613fad57600080fd5b81516121b481613909565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156140075781516001600160a01b031687529582019590820190600101613fe2565b509495945050505050565b84815260806020820152600061402b6080830186613fce565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a06040820152600061406660a0830186613fce565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561409857600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220997604eed61c7d1d8a7d9436b6bb1791f300e95d4b3d630008e1ee8105e7373c64736f6c634300080f0033

Deployed Bytecode Sourcemap

29184:36934:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55078:269;;;;;;;;;;-1:-1:-1;55078:269:0;;;;;:::i;:::-;;:::i;63776:96::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42583:31;;;;;;;;;;-1:-1:-1;42583:31:0;;;;;;;;;;;973:4:1;961:17;;;943:36;;931:2;916:18;42583:31:0;801:184:1;64657:161:0;;;;;;;;;;-1:-1:-1;64657:161:0;;;;;:::i;:::-;;:::i;:::-;;;1611:14:1;;1604:22;1586:41;;1574:2;1559:18;64657:161:0;1446:187:1;30720:42:0;;;;;;;;;;;;30760:2;30720:42;;;;;1812:6:1;1800:19;;;1782:38;;1770:2;1755:18;30720:42:0;1638:188:1;56291:104:0;;;;;;;;;;-1:-1:-1;56291:104:0;;;;;:::i;:::-;;:::i;64082:108::-;;;;;;;;;;-1:-1:-1;64164:18:0;;64082:108;;;2346:25:1;;;2334:2;2319:18;64082:108:0;2200:177:1;30039:62:0;;;;;;;;;;;;;:::i;65131:392::-;;;;;;;;;;-1:-1:-1;65131:392:0;;;;;:::i;:::-;;:::i;58348:81::-;;;;;;;;;;;;;:::i;30270:31::-;;;;;;;;;;;;;;;;52381:244;;;;;;;;;;-1:-1:-1;52552:8:0;;52381:244;;;52552:8;;;;;;3130:25:1;;52561:13:0;;;;;3186:2:1;3171:18;;3164:34;-1:-1:-1;;;52575:11:0;;;;3214:18:1;;;3207:34;;;;52587:7:0;;;3272:2:1;3257:18;;3250:34;52552:8:0;52595;;;;3315:3:1;3300:19;;3293:35;52604:12:0;;;;;3359:3:1;3344:19;;3337:35;3117:3;3102:19;52381:244:0;2843:535:1;54724:27:0;;;;;;;;;;-1:-1:-1;54724:27:0;;;;;;;;30606:44;;;;;;;;;;;;30648:2;30606:44;;63980:94;;;;;;;;;;-1:-1:-1;30031:1:0;63980:94;;54343:191;;;;;;;;;;-1:-1:-1;54343:191:0;;;;;:::i;:::-;;:::i;30905:49::-;;;;;;;;;;;;30945:9;30905:49;;59729:143;;;;;;;;;;-1:-1:-1;59729:143:0;;;;;:::i;:::-;;:::i;65558:205::-;;;;;;;;;;-1:-1:-1;65558:205:0;;;;;:::i;:::-;;:::i;48588:25::-;;;;;;;;;;;;;;;;30451:38;;;;;;;;;;;;;;;;42539:27;;;;;;;;;;;;;;;;54758:26;;;;;;;;;;;;;;;;60000;;;;;;;;;;-1:-1:-1;60000:26:0;;;;;;;;;;;60309:146;;;;;;;;;;-1:-1:-1;60309:146:0;;;;;:::i;:::-;;:::i;31840:46::-;;;;;;;;;;;;;;;;57569:492;;;;;;;;;;-1:-1:-1;57569:492:0;;;;;:::i;:::-;;:::i;42666:31::-;;;;;;;;;;;;;;;;53111:110;;;;;;;;;;-1:-1:-1;53194:19:0;;53111:110;;62937:311;;;;;;;;;;;;;:::i;60662:153::-;;;;;;;;;;-1:-1:-1;60662:153:0;;;;;:::i;:::-;;:::i;55554:110::-;;;;;;;;;;-1:-1:-1;55554:110:0;;;;;:::i;:::-;;:::i;52224:149::-;;;;;;;;;;;;;:::i;:::-;;;;4510:25:1;;;4566:2;4551:18;;4544:34;;;;4483:18;52224:149:0;4336:248:1;64198:121:0;;;;;;;;;;-1:-1:-1;64198:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;64293:18:0;64266:7;64293:18;;;:9;:18;;;;;;;64198:121;11045:140;;;;;;;;;;;;;:::i;43150:132::-;;;;;;;;;;-1:-1:-1;43150:132:0;;;;;:::i;:::-;;:::i;58138:142::-;;;;;;;;;;-1:-1:-1;58138:142:0;;;;;:::i;:::-;;:::i;31784:49::-;;;;;;;;;;;;;;;;60114:127;;;;;;;;;;;;;:::i;42325:29::-;;;;;;;;;;;;;;;;54791:28;;;;;;;;;;-1:-1:-1;54791:28:0;;;;;;;;54655;;;;;;;;;;-1:-1:-1;54655:28:0;;;;;;;;63674:94;;;;;;;;;;-1:-1:-1;63726:7:0;10469:6;-1:-1:-1;;;;;10469:6:0;63674:94;;;-1:-1:-1;;;;;4940:32:1;;;4922:51;;4910:2;4895:18;63674:94:0;4776:203:1;10404:79:0;;;;;;;;;;-1:-1:-1;10442:7:0;10469:6;-1:-1:-1;;;;;10469:6:0;10404:79;;31312:78;;;;;;;;;;-1:-1:-1;31312:78:0;;;;-1:-1:-1;;;;;31312:78:0;;;63878:96;;;;;;;;;;;;;:::i;61116:466::-;;;;;;;;;;;;;:::i;55432:110::-;;;;;;;;;;-1:-1:-1;55432:110:0;;;;;:::i;:::-;;:::i;58538:895::-;;;;;;;;;;-1:-1:-1;58538:895:0;;;;;:::i;:::-;;:::i;65771:342::-;;;;;;;;;;-1:-1:-1;65771:342:0;;;;;:::i;:::-;;:::i;64327:167::-;;;;;;;;;;-1:-1:-1;64327:167:0;;;;;:::i;:::-;;:::i;29958:31::-;;;;;;;;;;;;;:::i;55807:115::-;;;;;;;;;;-1:-1:-1;55807:115:0;;;;;:::i;:::-;;:::i;56462:102::-;;;;;;;;;;-1:-1:-1;56462:102:0;;;;;:::i;:::-;;:::i;48297:74::-;;;;;;;;;;-1:-1:-1;48297:74:0;;;;-1:-1:-1;;;;;48297:74:0;;;54271:64;;;;;;;;;;;;;:::i;51859:220::-;;;;;;;;;;;;;:::i;52087:129::-;;;;;;;;;;;;;:::i;57427:112::-;;;;;;;;;;-1:-1:-1;57427:112:0;;;;;:::i;:::-;;:::i;56066:157::-;;;;;;;;;;-1:-1:-1;56066:157:0;;;;;:::i;:::-;;:::i;57234:125::-;;;;;;;;;;-1:-1:-1;57234:125:0;;;;;:::i;:::-;;:::i;29915:36::-;;;;;;;;;;;;;:::i;56637:202::-;;;;;;;;;;-1:-1:-1;56637:202:0;;;;;:::i;:::-;;:::i;31397:76::-;;;;;;;;;;-1:-1:-1;31397:76:0;;;;-1:-1:-1;;;;;31397:76:0;;;64502:147;;;;;;;;;;-1:-1:-1;64502:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;64613:19:0;;;64586:7;64613:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;64502:147;56915:195;;;;;;;;;;-1:-1:-1;56915:195:0;;;;;:::i;:::-;;:::i;55676:123::-;;;;;;;;;;-1:-1:-1;55676:123:0;;;;;:::i;:::-;;:::i;43523:411::-;;;;;;;;;;;;;:::i;61640:1211::-;;;;;;;;;;-1:-1:-1;61640:1211:0;;;;;:::i;:::-;;:::i;42436:33::-;;;;;;;;;;;;;;;;55930:128;;;;;;;;;;-1:-1:-1;55930:128:0;;;;;:::i;:::-;;:::i;59513:135::-;;;;;;;;;;-1:-1:-1;59513:135:0;;;;;:::i;:::-;;:::i;11340:236::-;;;;;;;;;;-1:-1:-1;11340:236:0;;;;;:::i;:::-;;:::i;54690:27::-;;;;;;;;;;;;;;;;54829:242;;;;;;;;;;;;;:::i;43329:118::-;;;;;;;;;;-1:-1:-1;43329:118:0;;;;;:::i;:::-;;:::i;55078:269::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;;;;;;;;;55171:16:::1;;55163:6;:24;;55155:33;;;::::0;::::1;;55217:6;55199:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;55242:11:0::1;::::0;-1:-1:-1;;;;;55242:11:0::1;55234:48;55278:3;55265:9;:6:::0;55272:2:::1;55265:9;:::i;:::-;55264:17;;;;:::i;:::-;55234:48;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;55301:9:0::1;::::0;-1:-1:-1;;;;;55301:9:0::1;55293:46;55335:3;55322:9;:6:::0;55329:2:::1;55322:9;:::i;:::-;55321:17;;;;:::i;:::-;55293:46;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;55078:269:::0;:::o;63776:96::-;63824:13;63858:5;63851:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63776:96;:::o;64657:161::-;64734:4;64751:37;64760:10;64772:7;64781:6;64751:8;:37::i;:::-;-1:-1:-1;64806:4:0;64657:161;;;;;:::o;56291:104::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;56362:16:::1;:25:::0;;-1:-1:-1;;56362:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56291:104::o;30039:62::-;30088:13;30031:1;30088:2;:13;:::i;:::-;30078:23;;:7;:23;:::i;:::-;30039:62;:::o;65131:392::-;65231:4;65248:36;65258:6;65266:9;65277:6;65248:9;:36::i;:::-;-1:-1:-1;;;;;65324:19:0;;65297:24;65324:19;;;:11;:19;;;;;;;;65344:10;65324:31;;;;;;;;65374:26;;;;65366:59;;;;-1:-1:-1;;;65366:59:0;;10022:2:1;65366:59:0;;;10004:21:1;10061:2;10041:18;;;10034:30;-1:-1:-1;;;10080:18:1;;;10073:50;10140:18;;65366:59:0;9820:344:1;65366:59:0;65438:55;65447:6;65455:10;65467:25;65486:6;65467:16;:25;:::i;:::-;65438:8;:55::i;:::-;-1:-1:-1;65511:4:0;;65131:392;-1:-1:-1;;;;65131:392:0:o;58348:81::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;58401:20:::1;:18;:20::i;:::-;58348:81::o:0;54343:191::-;54400:7;54422:27;54444:4;54422:21;:27::i;:::-;54419:53;;;-1:-1:-1;;;;;;54458:14:0;;;;;:8;:14;;;;;;;54343:191::o;54419:53::-;-1:-1:-1;;;;;54512:14:0;;;;;;:8;:14;;;;;;54490:21;54521:4;54490:15;:21::i;:::-;:36;;;;:::i;59729:143::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;59823:41:::1;:14;59845:18:::0;59823:21:::1;:41::i;65558:205::-:0;65666:10;65640:4;65687:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;65687:32:0;;;;;;;;;;65640:4;;65657:76;;65678:7;;65687:45;;65722:10;;65687:45;:::i;60309:146::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;60403:22:::1;:44:::0;;-1:-1:-1;;;;;60403:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;60403:44:0;;::::1;::::0;;;::::1;::::0;;60309:146::o;57569:492::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;57724:14:::1;57764:12:::0;57739:24:::1;57749:14:::0;57739:9;:24:::1;:::i;:::-;:37;;;;:::i;:::-;57724:52;;57795:8;:13;;57805:3;57795:13;57787:64;;;::::0;-1:-1:-1;;;57787:64:0;;10713:2:1;57787:64:0::1;::::0;::::1;10695:21:1::0;10752:2;10732:18;;;10725:30;10791:34;10771:18;;;10764:62;-1:-1:-1;;;10842:18:1;;;10835:36;10888:19;;57787:64:0::1;10511:402:1::0;57787:64:0::1;-1:-1:-1::0;57864:8:0::1;:18:::0;;::::1;58029:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;58002:16:0;;::::1;57864:18;58002:16;-1:-1:-1::0;;57932:24:0;;::::1;-1:-1:-1::0;;;57932:24:0::1;58002:16:::0;;;;-1:-1:-1;;57893:28:0;;::::1;::::0;::::1;-1:-1:-1::0;;57864:18:0;;::::1;::::0;::::1;57893:28:::0;;;;-1:-1:-1;;57893:28:0;;;;;;;;;;::::1;58002:16:::0;;;;;;;;57977:14;::::1;58002:16:::0;;;;;;;::::1;58029:24;::::0;;;::::1;::::0;;57569:492::o;62937:311::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;63026:20:::1;;63007:15;:39;;62999:68;;;;-1:-1:-1::0;;;62999:68:0::1;;;;;;;:::i;:::-;63099:40;31283:4;63099:15;:40;:::i;:::-;63078:20;:61:::0;63164:11:::1;::::0;:52:::1;::::0;63151:9:::1;::::0;-1:-1:-1;;;;;63164:11:0::1;::::0;63189:21:::1;::::0;63151:9;63164:52;63151:9;63164:52;63189:21;63164:11;:52:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63150:66;;;63235:4;63227:13;;;::::0;::::1;;62988:260;62937:311::o:0;60662:153::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;60750:57:::1;60772:34;60791:15;60772:18:::0;:34:::1;:::i;:::-;60750:21;:57::i;55554:110::-:0;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;55643:13:::1;30031:1;55643:2;:13;:::i;:::-;55631:25;::::0;:9;:25:::1;:::i;:::-;55624:6;:32:::0;-1:-1:-1;55554:110:0:o;52224:149::-;52265:15;;52326:13;30031:1;52326:2;:13;:::i;:::-;52313:12;;:26;;;;:::i;:::-;52351:13;30031:1;52351:2;:13;:::i;:::-;52341:9;;:23;;;;:::i;:::-;52306:59;;;;52224:149;;:::o;11045:140::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;11144:1:::1;11128:6:::0;;11107:40:::1;::::0;-1:-1:-1;;;;;11128:6:0;;::::1;::::0;11107:40:::1;::::0;11144:1;;11107:40:::1;11175:1;11158:19:::0;;-1:-1:-1;;;;;;11158:19:0::1;::::0;;11045:140::o;43150:132::-;43216:4;43239:35;:20;43269:4;43239:29;:35::i;58138:142::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;58233:3:::1;58223:8;:13;;;;58215:22;;;::::0;::::1;;58249:14;:23:::0;;-1:-1:-1;;58249:23:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;58138:142::o;60114:127::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;60171:14:::1;:19:::0;;-1:-1:-1;;60171:19:0::1;;;::::0;;60218:15:::1;60201:16;:32:::0;60114:127::o;63753:7::-;63746:14;;63674:94;:::o;63878:96::-;63928:13;63958:7;63951:14;;;;;:::i;61116:466::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;61244:20:::1;;61225:15;:39;;61217:68;;;;-1:-1:-1::0;;;61217:68:0::1;;;;;;;:::i;:::-;61355:22;::::0;61406:39:::1;::::0;-1:-1:-1;;;61406:39:0;;61439:4:::1;61406:39;::::0;::::1;4922:51:1::0;61355:22:0;;;::::1;-1:-1:-1::0;;;;;61355:22:0::1;::::0;61306:30:::1;::::0;61355:22;;61406:24:::1;::::0;4895:18:1;;61406:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61544:11;::::0;61520:44:::1;::::0;-1:-1:-1;;;61520:44:0;;-1:-1:-1;;;;;61544:11:0;;::::1;61520:44;::::0;::::1;11836:51:1::0;11903:18;;;11896:34;;;61389:56:0;;-1:-1:-1;61520:23:0;::::1;::::0;::::1;::::0;11809:18:1;;61520:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61148:434;;61116:466::o:0;55432:110::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;55511:16:::1;:23:::0;;-1:-1:-1;;55511:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55432:110::o;58538:895::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;58774:3:::1;58755:18;;:22;;;;:::i;:::-;58742:12;:35;58734:44;;;::::0;::::1;;58856:13;30031:1;58856:2;:13;:::i;:::-;58840:29;::::0;:15;:29:::1;:::i;:::-;58824:45:::0;-1:-1:-1;58906:13:0::1;30031:1;58906:2;:13;:::i;:::-;58893:26;::::0;:12;:26:::1;:::i;:::-;58880:39;;58986:26;30648:2;59013:38;;:18;;:38;;;;:::i;:::-;58986:65;;59062:23;30760:2;59086:35;;:18;;:35;;;;:::i;:::-;59062:59;;59160:18;59143:15;:35;;59134:103;;;::::0;-1:-1:-1;;;59134:103:0;;12393:2:1;59134:103:0::1;::::0;::::1;12375:21:1::0;12432:2;12412:18;;;12405:30;12471:34;12451:18;;;12444:62;-1:-1:-1;;;12522:18:1;;;12515:41;12573:19;;59134:103:0::1;12191:407:1::0;59134:103:0::1;59271:15;59257:12;:29;;59248:94;;;::::0;-1:-1:-1;;;59248:94:0;;12805:2:1;59248:94:0::1;::::0;::::1;12787:21:1::0;12844:2;12824:18;;;12817:30;12883:34;12863:18;;;12856:62;-1:-1:-1;;;12934:18:1;;;12927:38;12982:19;;59248:94:0::1;12603:404:1::0;59248:94:0::1;-1:-1:-1::0;;59355:12:0::1;:30:::0;;;;59396:9:::1;:24:::0;58538:895::o;65771:342::-;65914:10;65858:4;65902:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;65902:32:0;;;;;;;;;;65953:35;;;;65945:60;;;;-1:-1:-1;;;65945:60:0;;13214:2:1;65945:60:0;;;13196:21:1;13253:2;13233:18;;;13226:30;-1:-1:-1;;;13272:18:1;;;13265:42;13324:18;;65945:60:0;13012:336:1;65945:60:0;66018:65;66027:10;66039:7;66048:34;66067:15;66048:16;:34;:::i;66018:65::-;-1:-1:-1;66101:4:0;;65771:342;-1:-1:-1;;;65771:342:0:o;64327:167::-;64407:4;64424:40;64434:10;64446:9;64457:6;64424:9;:40::i;29958:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55807:115::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;55883:9:::1;:31:::0;;-1:-1:-1;;;;;;55883:31:0::1;-1:-1:-1::0;;;;;55883:31:0;;;::::1;::::0;;;::::1;::::0;;55807:115::o;56462:102::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;56532:15:::1;:24:::0;;-1:-1:-1;;56532:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56462:102::o;54271:64::-;54307:20;54316:10;54307:8;:20::i;51859:220::-;51924:7;51962:20;;51946:15;:36;51943:110;;;52026:15;52005:20;;:36;;;;:::i;51943:110::-;-1:-1:-1;52070:1:0;;51859:220::o;52087:129::-;52134:7;52195:13;30031:1;52195:2;:13;:::i;:::-;52175:18;;30088:13;30031:1;30088:2;:13;:::i;:::-;30078:23;;:7;:23;:::i;:::-;52161:32;;;;:::i;:::-;52160:48;;;;:::i;57427:112::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;57504:27:::1;:9;57518:12:::0;57504:13:::1;:27::i;56066:157::-:0;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;56170:5:::1;:15;56178:7:::0;56170:5;:15:::1;:::i;:::-;-1:-1:-1::0;56196:7:0::1;:19;56206:9:::0;56196:7;:19:::1;:::i;57234:125::-:0;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;57316:19:::1;:35:::0;57234:125::o;29915:36::-;;;;;;;:::i;56637:202::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;56729:32;;56721:67:::1;;;::::0;-1:-1:-1;;;56721:67:0;;15759:2:1;56721:67:0::1;::::0;::::1;15741:21:1::0;15798:2;15778:18;;;15771:30;15837:25;15817:18;;;15810:53;15880:18;;56721:67:0::1;15557:347:1::0;56721:67:0::1;56803:12;:28:::0;56637:202::o;56915:195::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;57005:30;;56997:64:::1;;;::::0;-1:-1:-1;;;56997:64:0;;16111:2:1;56997:64:0::1;::::0;::::1;16093:21:1::0;16150:2;16130:18;;;16123:30;-1:-1:-1;;;16169:18:1;;;16162:52;16231:18;;56997:64:0::1;15909:346:1::0;56997:64:0::1;57076:11;:26:::0;56915:195::o;55676:123::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;55756:11:::1;:35:::0;;-1:-1:-1;;;;;;55756:35:0::1;-1:-1:-1::0;;;;;55756:35:0;;;::::1;::::0;;;::::1;::::0;;55676:123::o;43523:411::-;43605:18;;43571:7;;;43780:123;43796:29;:20;:27;:29::i;:::-;43794:1;:31;43780:123;;;43854:9;:37;43864:26;:20;43888:1;43864:23;:26::i;:::-;-1:-1:-1;;;;;43854:37:0;;;;;;;;;;;;-1:-1:-1;43854:37:0;;43846:45;;;;:::i;:::-;;-1:-1:-1;43827:3:0;;;;:::i;:::-;;;;43780:123;;;-1:-1:-1;43920:6:0;43523:411;-1:-1:-1;43523:411:0:o;61640:1211::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;61784:20:::1;;61765:15;:39;;61757:68;;;;-1:-1:-1::0;;;61757:68:0::1;;;;;;;:::i;:::-;61857:40;31283:4;61857:15;:40;:::i;:::-;61836:20;:61:::0;61957:22:::1;::::0;62008:39:::1;::::0;-1:-1:-1;;;62008:39:0;;62041:4:::1;62008:39;::::0;::::1;4922:51:1::0;61957:22:0;;;::::1;-1:-1:-1::0;;;;;61957:22:0::1;::::0;61908:30:::1;::::0;61957:22;;62008:24:::1;::::0;4895:18:1;;62008:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62091:16;::::0;62060:56:::1;::::0;-1:-1:-1;;;62060:56:0;;-1:-1:-1;;;;;62091:16:0;;::::1;62060:56;::::0;::::1;11836:51:1::0;11903:18;;;11896:34;;;61991:56:0;;-1:-1:-1;62060:22:0;::::1;::::0;::::1;::::0;11809:18:1;;62060:56:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;62393:16:0::1;::::0;:218:::1;::::0;-1:-1:-1;;;62393:218:0;;62361:21:::1;::::0;-1:-1:-1;;;;;62393:16:0::1;::::0;:64:::1;::::0;:218:::1;::::0;62480:4:::1;::::0;62500:6;;62333:25:::1;::::0;;;62480:4;;62581:15:::1;::::0;62393:218:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;62622:21:0::1;62646:39;62668:17:::0;62646:21:::1;:39;:::i;:::-;62622:63;;62699:12;62696:146;;;62727:31;62744:13;62727:16;:31::i;:::-;62696:146;;;62817:13;62799:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;62696:146:0::1;61688:1163;;;;61640:1211:::0;:::o;55930:128::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;56016:14:::1;:34:::0;;-1:-1:-1;;;;;;56016:34:0::1;-1:-1:-1::0;;;;;56016:34:0;;;::::1;::::0;;;::::1;::::0;;55930:128::o;59513:135::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;59602:38:::1;:14;59621:18:::0;59602::::1;:38::i;11340:236::-:0;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11421:22:0;::::1;11413:73;;;::::0;-1:-1:-1;;;11413:73:0;;17214:2:1;11413:73:0::1;::::0;::::1;17196:21:1::0;17253:2;17233:18;;;17226:30;17292:34;17272:18;;;17265:62;-1:-1:-1;;;17343:18:1;;;17336:36;17389:19;;11413:73:0::1;17012:402:1::0;11413:73:0::1;11523:6;::::0;;11502:38:::1;::::0;-1:-1:-1;;;;;11502:38:0;;::::1;::::0;11523:6;::::1;::::0;11502:38:::1;::::0;::::1;11551:6;:17:::0;;-1:-1:-1;;;;;;11551:17:0::1;-1:-1:-1::0;;;;;11551:17:0;;;::::1;::::0;;;::::1;::::0;;11340:236::o;54829:242::-;10627:10;10616:7;10442;10469:6;-1:-1:-1;;;;;10469:6:0;;10404:79;10616:7;-1:-1:-1;;;;;10616:21:0;;10608:66;;;;-1:-1:-1;;;10608:66:0;;;;;;;:::i;:::-;54902:16:::1;::::0;;54887:14:::1;54929:18:::0;;;54966:11:::1;::::0;-1:-1:-1;;;;;54966:11:0::1;54958:48;55002:3;54989:9;54902:16:::0;54996:2:::1;54989:9;:::i;43329:118::-:0;43387:4;43410:29;:14;43434:4;43410:23;:29::i;26091:152::-;26161:4;26185:50;26190:3;-1:-1:-1;;;;;26210:23:0;;26185:4;:50::i;:::-;26178:57;26091:152;-1:-1:-1;;;26091:152:0:o;64824:299::-;-1:-1:-1;;;;;64917:19:0;;64909:49;;;;-1:-1:-1;;;64909:49:0;;17621:2:1;64909:49:0;;;17603:21:1;17660:2;17640:18;;;17633:30;-1:-1:-1;;;17679:18:1;;;17672:47;17736:18;;64909:49:0;17419:341:1;64909:49:0;-1:-1:-1;;;;;64977:21:0;;64969:49;;;;-1:-1:-1;;;64969:49:0;;17967:2:1;64969:49:0;;;17949:21:1;18006:2;17986:18;;;17979:30;-1:-1:-1;;;18025:18:1;;;18018:45;18080:18;;64969:49:0;17765:339:1;64969:49:0;-1:-1:-1;;;;;65031:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;65083:32;;2346:25:1;;;65083:32:0;;2319:18:1;65083:32:0;;;;;;;64824:299;;;:::o;34331:1544::-;-1:-1:-1;;;;;34427:20:0;;34419:51;;;;-1:-1:-1;;;34419:51:0;;18311:2:1;34419:51:0;;;18293:21:1;18350:2;18330:18;;;18323:30;-1:-1:-1;;;18369:18:1;;;18362:48;18427:18;;34419:51:0;18109:342:1;34419:51:0;-1:-1:-1;;;;;34489:23:0;;34481:52;;;;-1:-1:-1;;;34481:52:0;;18658:2:1;34481:52:0;;;18640:21:1;18697:2;18677:18;;;18670:30;-1:-1:-1;;;18716:18:1;;;18709:46;18772:18;;34481:52:0;18456:340:1;34481:52:0;34626:15;34645:26;:9;34664:6;34645:18;:26::i;:::-;:59;;;-1:-1:-1;34675:29:0;:9;34694;34675:18;:29::i;:::-;34626:79;-1:-1:-1;34804:23:0;-1:-1:-1;;;;;34829:21:0;;34845:4;34829:21;;:49;;-1:-1:-1;;;;;;34854:24:0;;34873:4;34854:24;34829:49;35017:16;;35084:21;;34804:75;;-1:-1:-1;;;;;;35017:16:0;;;;34985:23;;35074:31;;;-1:-1:-1;;;35084:21:0;;;;35074:31;:63;;;;;35122:15;-1:-1:-1;;;;;35109:28:0;:9;-1:-1:-1;;;;;35109:28:0;;35074:63;35073:144;;;-1:-1:-1;35166:21:0;;-1:-1:-1;;;;;35153:34:0;;;-1:-1:-1;;;35166:21:0;;;;35153:34;:63;;;;;35201:15;-1:-1:-1;;;;;35191:25:0;:6;-1:-1:-1;;;;;35191:25:0;;35153:63;35339:21;;35045:173;;-1:-1:-1;35320:10:0;;-1:-1:-1;;;;;35331:29:0;;;-1:-1:-1;;;35339:21:0;;;;35331:29;;:57;;;35373:15;-1:-1:-1;;;;;35363:25:0;:6;-1:-1:-1;;;;;35363:25:0;;35331:57;35422:21;;35320:68;;-1:-1:-1;35399:11:0;;-1:-1:-1;;;;;35411:32:0;;;-1:-1:-1;;;35422:21:0;;;;35411:32;;:63;;;35459:15;-1:-1:-1;;;;;35446:28:0;:9;-1:-1:-1;;;;;35446:28:0;;35411:63;35399:75;;35515:18;:41;;;;35537:19;35515:41;:55;;;;35560:10;35515:55;35512:356;;;35586:43;35603:6;35611:9;35622:6;35586:16;:43::i;:::-;35512:356;;;35748:14;;;;;;;35740:49;;;;-1:-1:-1;;;35740:49:0;;19003:2:1;35740:49:0;;;18985:21:1;19042:2;19022:18;;;19015:30;19081:25;19061:18;;;19054:53;19124:18;;35740:49:0;18801:347:1;35740:49:0;35804:52;35819:6;35826:9;35836:6;35843:5;35849:6;35804:14;:52::i;:::-;34408:1467;;;;;;34331:1544;;;:::o;49072:1628::-;48741:27;:34;;-1:-1:-1;;48741:34:0;48771:4;48741:34;;;;;;49174:4:::1;48741:27:::0;49156:24;;;::::1;::::0;;;;;;;;49221:11:::1;::::0;49156:24;;48741:27;49207:25:::1;::::0;-1:-1:-1;;;49221:11:0;::::1;48741:34:::0;49221:11;;::::1;::::0;49207:13;;::::1;;:25;:::i;:::-;49191:41;;;;49243:19;49265;;49243:41;;49411:11;49395:15;:27;:40;;;-1:-1:-1::0;49424:11:0::1;::::0;::::1;::::0;49395:40:::1;49392:77;;;49451:7;;;;;49392:77;49589:13;::::0;49550:25:::1;::::0;49576:36:::1;::::0;::::1;::::0;49577:25:::1;::::0;49589:13;;::::1;;;49577:11:::0;:25:::1;:::i;:::-;49576:36;;;;:::i;:::-;49550:62:::0;-1:-1:-1;49623:25:0::1;49650:29;49550:62:::0;49650:11;:29:::1;:::i;:::-;49623:56:::0;-1:-1:-1;49740:16:0::1;49757:19;49775:1;49757:17:::0;:19:::1;:::i;:::-;49740:36:::0;-1:-1:-1;49787:19:0::1;49807:26;49740:36:::0;49807:17;:26:::1;:::i;:::-;49787:46:::0;-1:-1:-1;49916:17:0::1;49934:29;49946:17:::0;49787:46;49934:29:::1;:::i;:::-;49916:47:::0;-1:-1:-1;50078:21:0::1;50110:27;49916:47:::0;50110:16:::1;:27::i;:::-;50148:14;50164:41;50188:17:::0;50164:21:::1;:41;:::i;:::-;50148:58:::0;-1:-1:-1;50306:14:0::1;50344:9:::0;50324:18:::1;50331:11:::0;50148:58;50324:18:::1;:::i;:::-;50323:30;;;;:::i;:::-;50306:47;;50364:31;50378:8;50388:6;50364:13;:31::i;:::-;50518:21;50541:41;50565:17:::0;50541:21:::1;:41;:::i;:::-;50518:65;;50661:31;50678:13;50661:16;:31::i;:::-;49121:1579;;;;;;;;;;;;48786:1;48798:27:::0;:35;;-1:-1:-1;;48798:35:0;;;49072:1628::o;45560:427::-;-1:-1:-1;;;;;45681:17:0;;45623:7;45681:17;;;:9;:17;;;;;;45664:14;;45623:7;;45664:34;;;:::i;:::-;-1:-1:-1;;;;;45861:25:0;;;;;;:17;:25;;;;;;45643:55;;-1:-1:-1;45850:36:0;;45847:49;;;-1:-1:-1;45895:1:0;;45560:427;-1:-1:-1;;45560:427:0:o;45847:49::-;-1:-1:-1;;;;;45928:25:0;;;;;;:17;:25;;;;;;-1:-1:-1;;;42244:5:0;45915:38;;:10;:38;:::i;:::-;45914:65;;;;:::i;26419:158::-;26492:4;26516:53;26524:3;-1:-1:-1;;;;;26544:23:0;;26516:7;:53::i;60821:230::-;60977:20;;60963:13;:34;60955:43;;;;;;61009:20;:34;60821:230::o;26663:167::-;-1:-1:-1;;;;;26797:23:0;;26743:4;23472:19;;;:12;;;:19;;;;;;:24;;26767:55;23375:129;46930:1277;46989:14;;-1:-1:-1;;;46989:14:0;;;;46988:15;46980:24;;;;;;47015:14;:19;;-1:-1:-1;;;;47015:19:0;-1:-1:-1;;;47015:19:0;;;;47073:27;47095:4;47073:21;:27::i;:::-;47070:495;;;-1:-1:-1;;;;;;47187:14:0;;;;;;:8;:14;;;;;;;47216:16;;;47070:495;;;47273:17;47291:21;47307:4;47291:15;:21::i;:::-;-1:-1:-1;;;;;47423:15:0;;;;;;:9;:15;;;;;;47406:14;;47273:39;;-1:-1:-1;47406:32:0;;;:::i;:::-;-1:-1:-1;;;;;47380:23:0;;;;;;:17;:23;;;;;;;;:58;;;;47498:8;:14;;;;:24;;47513:9;;47498:24;:::i;:::-;-1:-1:-1;;;;;47537:14:0;;47552:1;47537:14;;;:8;:14;;;;;:16;47491:31;-1:-1:-1;;47070:495:0;47578:6;47586:1;47578:9;47575:106;;-1:-1:-1;;47628:14:0;:20;;-1:-1:-1;;;;47628:20:0;;;46930:1277::o;47575:106::-;47709:6;47695:12;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;47750:16:0;;;47764:1;47750:16;;;;;;;;47726:21;;47750:16;;;;;;;;-1:-1:-1;;47787:16:0;;:23;;;-1:-1:-1;;;47787:23:0;;;;47726:40;;-1:-1:-1;;;;;;47787:16:0;;;;:21;;-1:-1:-1;47787:23:0;;;;;;;;;;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47777:4;47782:1;47777:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47777:33:0;;;:7;;;;;;;;;:33;47837:14;;47827:7;;47837:14;;;47827:4;;47837:14;;47827:7;;;;;;:::i;:::-;-1:-1:-1;;;;;47827:24:0;;;:7;;;;;;;;;:24;47964:16;;:151;;-1:-1:-1;;;47964:151:0;;:16;;;:67;;48039:6;;47964:151;;:16;;48069:4;;48084;;48099:15;;47964:151;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48141:27:0;;;20696:25:1;;;-1:-1:-1;;;;;20757:32:1;;20752:2;20737:18;;20730:60;48141:27:0;;-1:-1:-1;20669:18:1;;-1:-1:-1;48141:27:0;;-1:-1:-1;20522:274:1;48141:27:0;;;;;;;;-1:-1:-1;;48179:14:0;:20;;-1:-1:-1;;;;48179:20:0;;;-1:-1:-1;46930:1277:0:o;26916:117::-;26979:7;27006:19;27014:3;23673:18;;23590:109;27377:158;27451:7;27502:22;27506:3;27518:5;27502:3;:22::i;46057:758::-;46192:14;;46154:22;;46210:3;;46180:26;;46192:14;;46180:9;:26;:::i;:::-;46179:34;;;;:::i;:::-;46154:59;-1:-1:-1;46224:14:0;46241:26;46154:59;46241:9;:26;:::i;:::-;46224:43;;46297:14;46279:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;46335:10:0;;46331:477;;46384:6;46362:18;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;46405:19:0;;-1:-1:-1;46425:17:0;:15;:17::i;:::-;46405:37;;46536:11;46551:1;46536:16;46532:265;;46593:6;46573:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;46532:265:0;;-1:-1:-1;46532:265:0;;46769:11;46734:31;-1:-1:-1;;;46734:6:0;:31;:::i;:::-;46733:47;;;;:::i;:::-;46714:14;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;;46532:265:0;46347:461;46110:705;;46057:758;:::o;21146:414::-;21209:4;23472:19;;;:12;;;:19;;;;;;21226:327;;-1:-1:-1;21269:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;21452:18;;21430:19;;;:12;;;:19;;;;;;:40;;;;21485:11;;21226:327;-1:-1:-1;21536:5:0;21529:12;;40940:440;-1:-1:-1;;;;;41059:17:0;;41035:21;41059:17;;;:9;:17;;;;;;41095:23;;;;41087:60;;;;-1:-1:-1;;;41087:60:0;;21003:2:1;41087:60:0;;;20985:21:1;21042:2;21022:18;;;21015:30;-1:-1:-1;;;21061:18:1;;;21054:54;21125:18;;41087:60:0;20801:348:1;41087:60:0;41203:27;41216:6;41223;41203:12;:27::i;:::-;41283:28;41293:9;41304:6;41283:9;:28::i;:::-;41353:9;-1:-1:-1;;;;;41337:33:0;41346:6;-1:-1:-1;;;;;41337:33:0;;41363:6;41337:33;;;;2346:25:1;;2334:2;2319:18;;2200:177;41337:33:0;;;;;;;;41024:356;40940:440;;;:::o;35976:4902::-;-1:-1:-1;;;;;36119:20:0;;;36092:24;36119:20;;;:9;:20;;;;;;;36174:17;;;;;;;;36210:23;;;;36202:60;;;;-1:-1:-1;;;36202:60:0;;21003:2:1;36202:60:0;;;20985:21:1;21042:2;21022:18;;;21015:30;-1:-1:-1;;;21061:18:1;;;21054:54;21125:18;;36202:60:0;20801:348:1;36202:60:0;36275:9;36298:6;36295:3257;;;36324:38;:21;36355:6;36324:30;:38::i;:::-;36320:427;;-1:-1:-1;;;;;36512:17:0;;;;;;:9;:17;;;;;;36531:15;-1:-1:-1;36512:34:0;;:52;;-1:-1:-1;36548:16:0;;;;36512:52;36504:82;;;;-1:-1:-1;;;36504:82:0;;21356:2:1;36504:82:0;;;21338:21:1;21395:2;21375:18;;;21368:30;-1:-1:-1;;;21414:18:1;;;21407:48;21472:18;;36504:82:0;21154:342:1;36504:82:0;36719:12;;36703:28;;:15;:28;:::i;:::-;-1:-1:-1;;;;;36685:17:0;;;;;;:9;:17;;;;;:46;36320:427;36888:9;;36880:6;:17;;36872:44;;;;-1:-1:-1;;;36872:44:0;;21703:2:1;36872:44:0;;;21685:21:1;21742:2;21722:18;;;21715:30;-1:-1:-1;;;21761:18:1;;;21754:45;21816:18;;36872:44:0;21501:339:1;36872:44:0;36939:31;:14;36963:6;36939:23;:31::i;:::-;:40;36931:73;;;;-1:-1:-1;;;36931:73:0;;22047:2:1;36931:73:0;;;22029:21:1;22086:2;22066:18;;;22059:30;-1:-1:-1;;;22105:18:1;;;22098:50;22165:18;;36931:73:0;21845:344:1;36931:73:0;37063:11;;37044:16;;:30;;;;:::i;:::-;37025:15;:49;;:77;;;;;37078:19;;37101:1;37078:24;37025:77;37021:186;;;37123:26;:14;37142:6;37123:18;:26::i;:::-;-1:-1:-1;37173:18:0;;-1:-1:-1;;;;;37173:18:0;;;;;;;;37021:186;-1:-1:-1;37227:8:0;;;;;;;36295:3257;;;37260:5;37257:2295;;;37285:40;:20;37315:9;37285:29;:40::i;:::-;37281:427;;-1:-1:-1;;;;;37474:19:0;;;;;;:8;:19;;;;;;37495:15;-1:-1:-1;37474:36:0;;:53;;-1:-1:-1;37512:15:0;;;;37474:53;37466:81;;;;-1:-1:-1;;;37466:81:0;;22396:2:1;37466:81:0;;;22378:21:1;22435:2;22415:18;;;22408:30;-1:-1:-1;;;22454:18:1;;;22447:46;22510:18;;37466:81:0;22194:340:1;37466:81:0;37681:11;;37665:27;;:15;:27;:::i;:::-;-1:-1:-1;;;;;37645:19:0;;;;;;:8;:19;;;;;:47;37281:427;37846:12;;37821:23;37838:6;37821:16;:23;:::i;:::-;:37;;37813:65;;;;-1:-1:-1;;;37813:65:0;;22741:2:1;37813:65:0;;;22723:21:1;22780:2;22760:18;;;22753:30;-1:-1:-1;;;22799:18:1;;;22792:46;22855:18;;37813:65:0;22539:340:1;37813:65:0;37911:6;;37901;:16;;37893:62;;;;-1:-1:-1;;;37893:62:0;;23086:2:1;37893:62:0;;;23068:21:1;23125:2;23105:18;;;23098:30;23164:34;23144:18;;;23137:62;-1:-1:-1;;;23215:18:1;;;23208:32;23257:19;;37893:62:0;22884:398:1;37893:62:0;37978:34;:14;38002:9;37978:23;:34::i;:::-;:43;37970:76;;;;-1:-1:-1;;;37970:76:0;;22047:2:1;37970:76:0;;;22029:21:1;22086:2;22066:18;;;22059:30;-1:-1:-1;;;22105:18:1;;;22098:50;22165:18;;37970:76:0;21845:344:1;37970:76:0;38105:11;;38086:16;;:30;;;;:::i;:::-;38067:15;:49;;:77;;;;;38120:19;;38143:1;38120:24;38067:77;38063:192;;;38165:29;:14;38184:9;38165:18;:29::i;:::-;-1:-1:-1;38218:21:0;;-1:-1:-1;;;;;38218:21:0;;;;;;;;38063:192;-1:-1:-1;38275:7:0;;;;37257:2295;;;38522:15;30031:1;38522:2;:15;:::i;:::-;38514:6;:23;38511:44;;38539:16;38548:6;38539:8;:16::i;:::-;38694:12;;38669:23;38686:6;38669:16;:23;:::i;:::-;:37;;38661:65;;;;-1:-1:-1;;;38661:65:0;;22741:2:1;38661:65:0;;;22723:21:1;22780:2;22760:18;;;22753:30;-1:-1:-1;;;22799:18:1;;;22792:46;22855:18;;38661:65:0;22539:340:1;38661:65:0;38958:38;:21;38989:6;38958:30;:38::i;:::-;38954:139;;-1:-1:-1;;;;;39023:17:0;;;;;;:9;:17;;;;;;39042:15;-1:-1:-1;39023:34:0;;:52;;-1:-1:-1;39059:16:0;;;;39023:52;39015:78;;;;-1:-1:-1;;;39015:78:0;;23489:2:1;39015:78:0;;;23471:21:1;23528:2;23508:18;;;23501:30;-1:-1:-1;;;23547:18:1;;;23540:44;23601:18;;39015:78:0;23287:338:1;39015:78:0;39130:31;:14;39154:6;39130:23;:31::i;:::-;:40;39122:80;;;;-1:-1:-1;;;39122:80:0;;23832:2:1;39122:80:0;;;23814:21:1;23871:2;23851:18;;;23844:30;23910:29;23890:18;;;23883:57;23957:18;;39122:80:0;23630:351:1;39122:80:0;39225:34;:14;39249:9;39225:23;:34::i;:::-;:43;39217:86;;;;-1:-1:-1;;;39217:86:0;;24188:2:1;39217:86:0;;;24170:21:1;24227:2;24207:18;;;24200:30;24266:32;24246:18;;;24239:60;24316:18;;39217:86:0;23986:354:1;39217:86:0;39362:11;;39343:16;;:30;;;;:::i;:::-;39324:15;:49;;:77;;;;;39377:19;;39400:1;39377:24;39324:77;39320:186;;;39422:26;:14;39441:6;39422:18;:26::i;:::-;-1:-1:-1;39472:18:0;;-1:-1:-1;;;;;39472:18:0;;;;;;;;39320:186;-1:-1:-1;39526:12:0;;;;;;;37257:2295;39889:21;;-1:-1:-1;;;;;39881:29:0;;;-1:-1:-1;;;39889:21:0;;;;39881:29;;;;39880:52;;-1:-1:-1;39915:16:0;;;;39914:17;39880:52;:84;;;;-1:-1:-1;39936:27:0;;;;39935:28;39880:84;:92;;;;;39966:6;39880:92;39877:130;;;39987:20;:18;:20::i;:::-;40076:23;40100:36;40114:6;40122:3;40127:8;;;;;;;;;;;40100:13;:36::i;:::-;40305:13;;40076:60;;-1:-1:-1;40244:21:0;;40266:53;;40280:6;;40288:3;;40293:25;;40305:13;;;;;;;-1:-1:-1;;;40293:11:0;;;:25;:::i;:::-;40266:13;:53::i;:::-;40244:75;-1:-1:-1;40383:19:0;40411:31;40244:75;40411:15;:31;:::i;:::-;40403:40;;:6;:40;:::i;:::-;40383:60;;40501:27;40514:6;40521;40501:12;:27::i;:::-;40623:4;40605:24;;;;:9;:24;;;;;:41;;40633:13;;40605:24;:41;;40633:13;;40605:41;:::i;:::-;;;;;;;;40701:15;40681:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;40771:33:0;;-1:-1:-1;40781:9:0;40792:11;40771:9;:33::i;:::-;40846:9;-1:-1:-1;;;;;40830:38:0;40839:6;-1:-1:-1;;;;;40830:38:0;;40856:11;40830:38;;;;2346:25:1;;2334:2;2319:18;;2200:177;40830:38:0;;;;;;;;36081:4797;;;;;;35976:4902;;;;;:::o;50750:461::-;50843:16;;50811:58;;50828:4;;-1:-1:-1;;;;;50843:16:0;50862:6;50811:8;:58::i;:::-;50904:16;;;50918:1;50904:16;;;;;;;;50880:21;;50904:16;;;;;;;;;;-1:-1:-1;50904:16:0;50880:40;;50949:4;50931;50936:1;50931:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50931:23:0;;;:7;;;;;;;;;;:23;;;;50975:16;;:23;;;-1:-1:-1;;;50975:23:0;;;;:16;;;;;:21;;:23;;;;;50931:7;;50975:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50965:4;50970:1;50965:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50965:33:0;;;:7;;;;;;;;;:33;51011:16;;:192;;-1:-1:-1;;;51011:192:0;;:16;;;:67;;:192;;51093:6;;51011:16;;51130:4;;51157;;51177:15;;51011:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50800:411;50750:461;:::o;51338:401::-;51432:9;51420:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;51484:16:0;;51452:63;;51469:4;;-1:-1:-1;;;;;51484:16:0;51503:11;51452:8;:63::i;:::-;51526:16;;:205;;-1:-1:-1;;;51526:205:0;;-1:-1:-1;;;;;51526:16:0;;;;:32;;51566:9;;51526:205;;51599:4;;51619:11;;51526:16;;;;51599:4;;51705:15;;51526:205;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21736:1553::-;21802:4;21941:19;;;:12;;;:19;;;;;;21977:15;;21973:1309;;22339:21;22363:14;22376:1;22363:10;:14;:::i;:::-;22412:18;;22339:38;;-1:-1:-1;22392:17:0;;22412:22;;22433:1;;22412:22;:::i;:::-;22392:42;;22679:17;22699:3;:11;;22711:9;22699:22;;;;;;;;:::i;:::-;;;;;;;;;22679:42;;22845:9;22816:3;:11;;22828:13;22816:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;22922:23;;;:12;;;:23;;;;;;:36;;;23083:17;;22922:3;;23083:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;23178:3;:12;;:19;23191:5;23178:19;;;;;;;;;;;23171:26;;;23221:4;23214:11;;;;;;;;21973:1309;23265:5;23258:12;;;;;24043:204;24138:18;;24110:7;;24138:26;-1:-1:-1;24130:73:0;;;;-1:-1:-1;;;24130:73:0;;25577:2:1;24130:73:0;;;25559:21:1;25616:2;25596:18;;;25589:30;25655:34;25635:18;;;25628:62;-1:-1:-1;;;25706:18:1;;;25699:32;25748:19;;24130:73:0;25375:398:1;24130:73:0;24221:3;:11;;24233:5;24221:18;;;;;;;;:::i;:::-;;;;;;;;;24214:25;;24043:204;;;;:::o;44766:648::-;-1:-1:-1;;;;;44901:15:0;;44883:17;44901:15;;;:9;:15;;;;;;:22;;44917:6;;44901:22;:::i;:::-;44883:40;;44947:27;44969:4;44947:21;:27::i;:::-;44944:102;;;-1:-1:-1;;;;;44989:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;44766:648:0:o;44944:102::-;45111:15;45127:21;45143:4;45127:15;:21::i;:::-;-1:-1:-1;;;;;45186:15:0;;;;;;:9;:15;;;;;:25;;;45295:14;;45111:37;;-1:-1:-1;45295:26:0;;45202:9;;45295:26;:::i;:::-;-1:-1:-1;;;;;45269:23:0;;;;;;:17;:23;;;;;;;;:52;;;;45382:8;:14;;;;;:23;;45398:7;;45269:23;45382;;45398:7;;45382:23;:::i;44029:645::-;-1:-1:-1;;;;;44161:15:0;;44143:17;44161:15;;;:9;:15;;;;;;:22;;44177:6;;44161:22;:::i;:::-;44143:40;;44207:27;44229:4;44207:21;:27::i;:::-;44204:102;;;-1:-1:-1;;;;;44249:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;44029:645:0:o;44204:102::-;44371:15;44387:21;44403:4;44387:15;:21::i;:::-;44371:37;;44509:9;44492:14;;:26;;;;:::i;:::-;-1:-1:-1;;;;;44466:23:0;;;;;;:17;:23;;;;;;;;:52;;;;44579:8;:14;;;;;:23;;44595:7;;44466:23;44579;;44595:7;;44579:23;:::i;:::-;;;;-1:-1:-1;;;;;;;;44641:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;44029:645:0:o;41435:156::-;41525:7;41578:5;41564:10;41553:21;;41560:3;41553:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;41552:31;;;;:::i;:::-;41545:38;41435:156;-1:-1:-1;;;;41435:156:0:o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:597::-;311:4;340:2;369;358:9;351:21;401:6;395:13;444:6;439:2;428:9;424:18;417:34;469:1;479:140;493:6;490:1;487:13;479:140;;;588:14;;;584:23;;578:30;554:17;;;573:2;550:26;543:66;508:10;;479:140;;;637:6;634:1;631:13;628:91;;;707:1;702:2;693:6;682:9;678:22;674:31;667:42;628:91;-1:-1:-1;780:2:1;759:15;-1:-1:-1;;755:29:1;740:45;;;;787:2;736:54;;199:597;-1:-1:-1;;;199:597:1:o;990:131::-;-1:-1:-1;;;;;1065:31:1;;1055:42;;1045:70;;1111:1;1108;1101:12;1126:315;1194:6;1202;1255:2;1243:9;1234:7;1230:23;1226:32;1223:52;;;1271:1;1268;1261:12;1223:52;1310:9;1297:23;1329:31;1354:5;1329:31;:::i;:::-;1379:5;1431:2;1416:18;;;;1403:32;;-1:-1:-1;;;1126:315:1:o;1831:118::-;1917:5;1910:13;1903:21;1896:5;1893:32;1883:60;;1939:1;1936;1929:12;1954:241;2010:6;2063:2;2051:9;2042:7;2038:23;2034:32;2031:52;;;2079:1;2076;2069:12;2031:52;2118:9;2105:23;2137:28;2159:5;2137:28;:::i;2382:456::-;2459:6;2467;2475;2528:2;2516:9;2507:7;2503:23;2499:32;2496:52;;;2544:1;2541;2534:12;2496:52;2583:9;2570:23;2602:31;2627:5;2602:31;:::i;:::-;2652:5;-1:-1:-1;2709:2:1;2694:18;;2681:32;2722:33;2681:32;2722:33;:::i;:::-;2382:456;;2774:7;;-1:-1:-1;;;2828:2:1;2813:18;;;;2800:32;;2382:456::o;3383:247::-;3442:6;3495:2;3483:9;3474:7;3470:23;3466:32;3463:52;;;3511:1;3508;3501:12;3463:52;3550:9;3537:23;3569:31;3594:5;3569:31;:::i;3635:156::-;3701:20;;3761:4;3750:16;;3740:27;;3730:55;;3781:1;3778;3771:12;3730:55;3635:156;;;:::o;3796:535::-;3888:6;3896;3904;3912;3920;3928;3981:3;3969:9;3960:7;3956:23;3952:33;3949:53;;;3998:1;3995;3988:12;3949:53;4021:27;4038:9;4021:27;:::i;:::-;4011:37;;4067:36;4099:2;4088:9;4084:18;4067:36;:::i;:::-;4057:46;;4122:36;4154:2;4143:9;4139:18;4122:36;:::i;:::-;4112:46;;4177:36;4209:2;4198:9;4194:18;4177:36;:::i;:::-;4167:46;;4232:37;4264:3;4253:9;4249:19;4232:37;:::i;:::-;4222:47;;4288:37;4320:3;4309:9;4305:19;4288:37;:::i;:::-;4278:47;;3796:535;;;;;;;;:::o;4589:182::-;4646:6;4699:2;4687:9;4678:7;4674:23;4670:32;4667:52;;;4715:1;4712;4705:12;4667:52;4738:27;4755:9;4738:27;:::i;4984:248::-;5052:6;5060;5113:2;5101:9;5092:7;5088:23;5084:32;5081:52;;;5129:1;5126;5119:12;5081:52;-1:-1:-1;;5152:23:1;;;5222:2;5207:18;;;5194:32;;-1:-1:-1;4984:248:1:o;5237:127::-;5298:10;5293:3;5289:20;5286:1;5279:31;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5369:719;5412:5;5465:3;5458:4;5450:6;5446:17;5442:27;5432:55;;5483:1;5480;5473:12;5432:55;5519:6;5506:20;5545:18;5582:2;5578;5575:10;5572:36;;;5588:18;;:::i;:::-;5663:2;5657:9;5631:2;5717:13;;-1:-1:-1;;5713:22:1;;;5737:2;5709:31;5705:40;5693:53;;;5761:18;;;5781:22;;;5758:46;5755:72;;;5807:18;;:::i;:::-;5847:10;5843:2;5836:22;5882:2;5874:6;5867:18;5928:3;5921:4;5916:2;5908:6;5904:15;5900:26;5897:35;5894:55;;;5945:1;5942;5935:12;5894:55;6009:2;6002:4;5994:6;5990:17;5983:4;5975:6;5971:17;5958:54;6056:1;6049:4;6044:2;6036:6;6032:15;6028:26;6021:37;6076:6;6067:15;;;;;;5369:719;;;;:::o;6093:543::-;6181:6;6189;6242:2;6230:9;6221:7;6217:23;6213:32;6210:52;;;6258:1;6255;6248:12;6210:52;6298:9;6285:23;6327:18;6368:2;6360:6;6357:14;6354:34;;;6384:1;6381;6374:12;6354:34;6407:50;6449:7;6440:6;6429:9;6425:22;6407:50;:::i;:::-;6397:60;;6510:2;6499:9;6495:18;6482:32;6466:48;;6539:2;6529:8;6526:16;6523:36;;;6555:1;6552;6545:12;6523:36;;6578:52;6622:7;6611:8;6600:9;6596:24;6578:52;:::i;:::-;6568:62;;;6093:543;;;;;:::o;6641:388::-;6709:6;6717;6770:2;6758:9;6749:7;6745:23;6741:32;6738:52;;;6786:1;6783;6776:12;6738:52;6825:9;6812:23;6844:31;6869:5;6844:31;:::i;:::-;6894:5;-1:-1:-1;6951:2:1;6936:18;;6923:32;6964:33;6923:32;6964:33;:::i;:::-;7016:7;7006:17;;;6641:388;;;;;:::o;7034:356::-;7236:2;7218:21;;;7255:18;;;7248:30;7314:34;7309:2;7294:18;;7287:62;7381:2;7366:18;;7034:356::o;7395:127::-;7456:10;7451:3;7447:20;7444:1;7437:31;7487:4;7484:1;7477:15;7511:4;7508:1;7501:15;7527:125;7567:4;7595:1;7592;7589:8;7586:34;;;7600:18;;:::i;:::-;-1:-1:-1;7637:9:1;;7527:125::o;7657:168::-;7697:7;7763:1;7759;7755:6;7751:14;7748:1;7745:21;7740:1;7733:9;7726:17;7722:45;7719:71;;;7770:18;;:::i;:::-;-1:-1:-1;7810:9:1;;7657:168::o;7830:217::-;7870:1;7896;7886:132;;7940:10;7935:3;7931:20;7928:1;7921:31;7975:4;7972:1;7965:15;8003:4;8000:1;7993:15;7886:132;-1:-1:-1;8032:9:1;;7830:217::o;8052:380::-;8131:1;8127:12;;;;8174;;;8195:61;;8249:4;8241:6;8237:17;8227:27;;8195:61;8302:2;8294:6;8291:14;8271:18;8268:38;8265:161;;8348:10;8343:3;8339:20;8336:1;8329:31;8383:4;8380:1;8373:15;8411:4;8408:1;8401:15;8437:422;8526:1;8569:5;8526:1;8583:270;8604:7;8594:8;8591:21;8583:270;;;8663:4;8659:1;8655:6;8651:17;8645:4;8642:27;8639:53;;;8672:18;;:::i;:::-;8722:7;8712:8;8708:22;8705:55;;;8742:16;;;;8705:55;8821:22;;;;8781:15;;;;8583:270;;;8587:3;8437:422;;;;;:::o;8864:806::-;8913:5;8943:8;8933:80;;-1:-1:-1;8984:1:1;8998:5;;8933:80;9032:4;9022:76;;-1:-1:-1;9069:1:1;9083:5;;9022:76;9114:4;9132:1;9127:59;;;;9200:1;9195:130;;;;9107:218;;9127:59;9157:1;9148:10;;9171:5;;;9195:130;9232:3;9222:8;9219:17;9216:43;;;9239:18;;:::i;:::-;-1:-1:-1;;9295:1:1;9281:16;;9310:5;;9107:218;;9409:2;9399:8;9396:16;9390:3;9384:4;9381:13;9377:36;9371:2;9361:8;9358:16;9353:2;9347:4;9344:12;9340:35;9337:77;9334:159;;;-1:-1:-1;9446:19:1;;;9478:5;;9334:159;9525:34;9550:8;9544:4;9525:34;:::i;:::-;9595:6;9591:1;9587:6;9583:19;9574:7;9571:32;9568:58;;;9606:18;;:::i;:::-;9644:20;;8864:806;-1:-1:-1;;;8864:806:1:o;9675:140::-;9733:5;9762:47;9803:4;9793:8;9789:19;9783:4;9762:47;:::i;10169:128::-;10209:3;10240:1;10236:6;10233:1;10230:13;10227:39;;;10246:18;;:::i;:::-;-1:-1:-1;10282:9:1;;10169:128::o;10302:204::-;10340:3;10376:4;10373:1;10369:12;10408:4;10405:1;10401:12;10443:3;10437:4;10433:14;10428:3;10425:23;10422:49;;;10451:18;;:::i;:::-;10487:13;;10302:204;-1:-1:-1;;;10302:204:1:o;10918:340::-;11120:2;11102:21;;;11159:2;11139:18;;;11132:30;-1:-1:-1;;;11193:2:1;11178:18;;11171:46;11249:2;11234:18;;10918:340::o;11473:184::-;11543:6;11596:2;11584:9;11575:7;11571:23;11567:32;11564:52;;;11612:1;11609;11602:12;11564:52;-1:-1:-1;11635:16:1;;11473:184;-1:-1:-1;11473:184:1:o;11941:245::-;12008:6;12061:2;12049:9;12040:7;12036:23;12032:32;12029:52;;;12077:1;12074;12067:12;12029:52;12109:9;12103:16;12128:28;12150:5;12128:28;:::i;13479:545::-;13581:2;13576:3;13573:11;13570:448;;;13617:1;13642:5;13638:2;13631:17;13687:4;13683:2;13673:19;13757:2;13745:10;13741:19;13738:1;13734:27;13728:4;13724:38;13793:4;13781:10;13778:20;13775:47;;;-1:-1:-1;13816:4:1;13775:47;13871:2;13866:3;13862:12;13859:1;13855:20;13849:4;13845:31;13835:41;;13926:82;13944:2;13937:5;13934:13;13926:82;;;13989:17;;;13970:1;13959:13;13926:82;;14200:1352;14326:3;14320:10;14353:18;14345:6;14342:30;14339:56;;;14375:18;;:::i;:::-;14404:97;14494:6;14454:38;14486:4;14480:11;14454:38;:::i;:::-;14448:4;14404:97;:::i;:::-;14556:4;;14620:2;14609:14;;14637:1;14632:663;;;;15339:1;15356:6;15353:89;;;-1:-1:-1;15408:19:1;;;15402:26;15353:89;-1:-1:-1;;14157:1:1;14153:11;;;14149:24;14145:29;14135:40;14181:1;14177:11;;;14132:57;15455:81;;14602:944;;14632:663;13426:1;13419:14;;;13463:4;13450:18;;-1:-1:-1;;14668:20:1;;;14786:236;14800:7;14797:1;14794:14;14786:236;;;14889:19;;;14883:26;14868:42;;14981:27;;;;14949:1;14937:14;;;;14816:19;;14786:236;;;14790:3;15050:6;15041:7;15038:19;15035:201;;;15111:19;;;15105:26;-1:-1:-1;;15194:1:1;15190:14;;;15206:3;15186:24;15182:37;15178:42;15163:58;15148:74;;15035:201;-1:-1:-1;;;;;15282:1:1;15266:14;;;15262:22;15249:36;;-1:-1:-1;14200:1352:1:o;16260:135::-;16299:3;16320:17;;;16317:43;;16340:18;;:::i;:::-;-1:-1:-1;16387:1:1;16376:13;;16260:135::o;16400:607::-;-1:-1:-1;;;;;16759:15:1;;;16741:34;;16806:2;16791:18;;16784:34;;;;16849:2;16834:18;;16827:34;;;;16892:2;16877:18;;16870:34;;;;16941:15;;;16935:3;16920:19;;16913:44;16721:3;16973:19;;16966:35;;;;16690:3;16675:19;;16400:607::o;19153:251::-;19223:6;19276:2;19264:9;19255:7;19251:23;19247:32;19244:52;;;19292:1;19289;19282:12;19244:52;19324:9;19318:16;19343:31;19368:5;19343:31;:::i;19409:127::-;19470:10;19465:3;19461:20;19458:1;19451:31;19501:4;19498:1;19491:15;19525:4;19522:1;19515:15;19541:461;19594:3;19632:5;19626:12;19659:6;19654:3;19647:19;19685:4;19714:2;19709:3;19705:12;19698:19;;19751:2;19744:5;19740:14;19772:1;19782:195;19796:6;19793:1;19790:13;19782:195;;;19861:13;;-1:-1:-1;;;;;19857:39:1;19845:52;;19917:12;;;;19952:15;;;;19893:1;19811:9;19782:195;;;-1:-1:-1;19993:3:1;;19541:461;-1:-1:-1;;;;;19541:461:1:o;20007:510::-;20278:6;20267:9;20260:25;20321:3;20316:2;20305:9;20301:18;20294:31;20241:4;20342:57;20394:3;20383:9;20379:19;20371:6;20342:57;:::i;:::-;-1:-1:-1;;;;;20435:32:1;;;;20430:2;20415:18;;20408:60;-1:-1:-1;20499:2:1;20484:18;20477:34;20334:65;20007:510;-1:-1:-1;;20007:510:1:o;24345:582::-;24644:6;24633:9;24626:25;24687:6;24682:2;24671:9;24667:18;24660:34;24730:3;24725:2;24714:9;24710:18;24703:31;24607:4;24751:57;24803:3;24792:9;24788:19;24780:6;24751:57;:::i;:::-;-1:-1:-1;;;;;24844:32:1;;;;24839:2;24824:18;;24817:60;-1:-1:-1;24908:3:1;24893:19;24886:35;24743:65;24345:582;-1:-1:-1;;;24345:582:1:o;24932:306::-;25020:6;25028;25036;25089:2;25077:9;25068:7;25064:23;25060:32;25057:52;;;25105:1;25102;25095:12;25057:52;25134:9;25128:16;25118:26;;25184:2;25173:9;25169:18;25163:25;25153:35;;25228:2;25217:9;25213:18;25207:25;25197:35;;24932:306;;;;;:::o;25243:127::-;25304:10;25299:3;25295:20;25292:1;25285:31;25335:4;25332:1;25325:15;25359:4;25356:1;25349:15

Swarm Source

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