ETH Price: $3,153.72 (+2.71%)
Gas: 1 Gwei

Token

LuckyToad (TOAD)
 

Overview

Max Total Supply

1,000,000,000,000,000 TOAD

Holders

81

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
5,124,879,642,758.855704633 TOAD

Value
$0.00
0xc386d86aa8d2562d16542a01cfb707deb4591047
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:
LuckyToad

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-05
*/

// Sources flattened with hardhat v2.10.2 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

// -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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");

        (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");

        (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");

        (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");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// -License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]

// -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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


// File @openzeppelin/contracts/interfaces/[email protected]

// -License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;


// File @openzeppelin/contracts/utils/math/[email protected]

// -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]

// -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

pragma solidity >=0.6.2;

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

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

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


// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

pragma solidity >=0.6.2;

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


// File @uniswap/v2-core/contracts/interfaces/[email protected]

pragma solidity >=0.5.0;

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


// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}


// File hardhat/[email protected]

// -License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
	}

	function logUint(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint256 p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
	}

	function log(uint256 p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
	}

	function log(uint256 p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
	}

	function log(uint256 p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
	}

	function log(string memory p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint256 p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}


// File contracts/LuckyToad.sol

/*
 * 
 *  __         __  __     ______     __  __     __  __        ______   ______     ______     _____    
 * /\ \       /\ \/\ \   /\  ___\   /\ \/ /    /\ \_\ \      /\__  _\ /\  __ \   /\  __ \   /\  __-.  
 * \ \ \____  \ \ \_\ \  \ \ \____  \ \  _"-.  \ \____ \     \/_/\ \/ \ \ \/\ \  \ \  __ \  \ \ \/\ \ 
 *  \ \_____\  \ \_____\  \ \_____\  \ \_\ \_\  \/\_____\       \ \_\  \ \_____\  \ \_\ \_\  \ \____- 
 *   \/_____/   \/_____/   \/_____/   \/_/\/_/   \/_____/        \/_/   \/_____/   \/_/\/_/   \/____/ 
 *
 *
 *                                                                                                
 *
 */
//SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.11;
// Seriously if you audit this and ping it for "no safemath used" you're gonna out yourself as an idiot
// SafeMath is by default included in solidity 0.8, I've only included it for the transferFrom

contract LuckyToad is Context, IERC20, Ownable {

    
    using SafeMath for uint256;
    // Constants
    string private constant _name = "LuckyToad";
    string private constant _symbol = "TOAD";
    // 0, 1, 2
    uint8 private constant _bl = 2;
    // Standard decimals 
    uint8 private constant _decimals = 9;
    // 1 quad
    uint256 private constant _tTotal = 1000000000000000 * 10**9;
    
    // Mappings
    mapping(address => uint256) private tokensOwned;
    mapping(address => mapping(address => uint256)) private _allowances;

    struct mappingStructs {
        bool _isExcludedFromFee;
        bool _isExcludedFromRaffle;
        bool _bots;
        bool _isInRaffleList;
        uint32 _lastTxBlock;
        uint32 botBlock;
    }
    mapping(address => mappingStructs) mappedAddresses;

    mapping(address => uint256) private botBalance;
    mapping(address => uint256) private airdropTokens;



    // Arrays
    address[] private airdropPrivateList;
    // List of those excluded from raffles
    address[] private raffleExclusions;
    // Gives us a list of where to put people in the "raffle", basically
    address[] private tokenDistribution;


    // Global variables
  

    // Block of 256 bits
        address payable private _feeAddrWallet1;
        // Storage for opening block
        uint32 private openBlock;
        // Tax controls - how much to swap - .1% by default
        uint32 private swapPerDivisor = 1000;
        // Excess gas that triggers a tax sell
        uint32 private taxGasThreshold = 600000;
    // Storage block closed

    // Block of 256 bits
        address payable private _feeAddrWallet2;
        // Tax distribution ratios
        uint32 private devRatio = 3000;
        uint32 private marketingRatio = 3000;
        bool private cooldownEnabled = false;
        bool private transferCooldownEnabled = false;
        // 16 bits remaining
    // Storage block closed

    // Block of 256 bits
        address payable private _feeAddrWallet3;
        // Another tax disti ratio
        uint32 private creatorRatio = 2000;
        uint32 private raffleBuyTax = 0;
        uint32 private raffleSellTax = 8000;
    // Storage block closed

    // Block of 256 bits
        address private uniswapV2Pair;
        uint32 private buyTax = 8000;
        uint32 private sellTax = 0;
        uint32 private transferTax = 0;
    // Storage block closed

    
    // Block of 256 bits
        address private _controller;
        uint32 private maxTxDivisor = 1;
        uint32 private maxWalletDivisor = 1;
        bool private isBot;
        bool private tradingOpen;
        bool private inSwap = false;
        bool private swapEnabled = false;
    // Storage block closed
    

    IUniswapV2Router02 private uniswapV2Router;

    event MaxTxAmountUpdated(uint256 _maxTxAmount);
    // Jackpot win event
    event JackpotWin(address indexed winner, uint256 indexed amount);

    modifier taxHolderOnly() {
        require(
            _msgSender() == _feeAddrWallet1 ||
            _msgSender() == _feeAddrWallet2 ||
            _msgSender() == _feeAddrWallet3 ||
            _msgSender() == owner()
        );
        _;
    }

    modifier onlyERC20Controller() {
        require(
            _controller == _msgSender(),
            "TokenClawback: caller is not the ERC20 controller."
        );
        _;
    }
    modifier onlyDev() {
        require(_msgSender() == _feeAddrWallet2, "LUCKY: Only developer can set this.");
        _;
    }
    

    constructor() {
        // ERC20 controller
        _controller = payable(0x4Cdd1d9EaF9Ff87ED8235Bb5190c92EA4454D435);
        // Marketing TODO
        _feeAddrWallet1 = payable(0xA1588d0b520d634092bB1a13358c4522bDd6b888);
        // Developer
        _feeAddrWallet2 = payable(0x4Cdd1d9EaF9Ff87ED8235Bb5190c92EA4454D435);
        // Creator TODO
        _feeAddrWallet3 = payable(0x9c9F6c443A67a322e2682b82e720dee187F16263);
        tokensOwned[_msgSender()] = _tTotal;
        // Set the struct values
        mappedAddresses[_msgSender()] = mappingStructs({_isExcludedFromFee: true, _isExcludedFromRaffle: true, _bots: false, _isInRaffleList: false, _lastTxBlock: 0, botBlock: 0});
        mappedAddresses[address(this)] = mappingStructs({_isExcludedFromFee: true, _isExcludedFromRaffle: true, _bots: false, _isInRaffleList: false, _lastTxBlock: 0, botBlock: 0});
        mappedAddresses[_feeAddrWallet1] = mappingStructs({_isExcludedFromFee: true, _isExcludedFromRaffle: true, _bots: false, _isInRaffleList: false, _lastTxBlock: 0, botBlock: 0});
        mappedAddresses[_feeAddrWallet2] = mappingStructs({_isExcludedFromFee: true, _isExcludedFromRaffle: true, _bots: false, _isInRaffleList: false, _lastTxBlock: 0, botBlock: 0});
        mappedAddresses[_feeAddrWallet3] = mappingStructs({_isExcludedFromFee: true, _isExcludedFromRaffle: true, _bots: false, _isInRaffleList: false, _lastTxBlock: 0, botBlock: 0});
        // Push raffle exclusions
        raffleExclusions.push(_msgSender());
        raffleExclusions.push(address(this));
        raffleExclusions.push(_feeAddrWallet1);
        raffleExclusions.push(_feeAddrWallet2);
        raffleExclusions.push(_feeAddrWallet3);
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public pure returns (string memory) {
        return _name;
    }

    function symbol() public pure returns (string memory) {
        return _symbol;
    }

    function decimals() public pure returns (uint8) {
        return _decimals;
    }

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

    function balanceOf(address account) public view override returns (uint256) {
        return abBalance(account);
    }

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

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

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

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

    /// @notice Sets cooldown status. Only callable by owner.
    /// @param onoff The boolean to set.
    function setCooldownEnabled(bool onoff) external onlyOwner {
        cooldownEnabled = onoff;
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }


    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        isBot = false;
        uint32 _taxAmt;
        uint32 _raffleAmt;

        if (
            from != owner() &&
            to != owner() &&
            from != address(this) &&
            !mappedAddresses[to]._isExcludedFromFee &&
            !mappedAddresses[from]._isExcludedFromFee
        ) {
            require(!mappedAddresses[to]._bots && !mappedAddresses[from]._bots, "No bots.");

            // Buys
            if (from == uniswapV2Pair && to != address(uniswapV2Router)) {
                
                
                _taxAmt = buyTax;
                _raffleAmt = raffleBuyTax;
                if(cooldownEnabled) {
                    // Check if last tx occurred this block - prevents sandwich attacks
                    require(mappedAddresses[to]._lastTxBlock != block.number, "LUCKY: One tx per block.");
                    mappedAddresses[to]._lastTxBlock = uint32(block.number);
                }
                // Set it now
                
                if(openBlock + _bl > block.number) {
                    // Bot
                    isBot = true;
                } else {
                    checkTxMax(to, amount);
                }
            } else if (to == uniswapV2Pair && from != address(uniswapV2Router)) {
                // Sells

                // Check max tx - can't do elsewhere
                require(amount <= _tTotal/maxTxDivisor, "LUCKY: Over max transaction amount.");
                // Check if last tx occurred this block - prevents sandwich attacks
                if(cooldownEnabled) {
                    require(mappedAddresses[from]._lastTxBlock != block.number, "LUCKY: One tx per block.");
                    mappedAddresses[from]._lastTxBlock == block.number;
                }
                
                // Check for tax sells

                {
                    uint256 contractTokenBalance = trueBalance(address(this));

                    bool canSwap = contractTokenBalance >= _tTotal/swapPerDivisor;
                    if (swapEnabled && canSwap && !inSwap && taxGasCheck()) {
                        uint32 oldTax = _taxAmt;
                        doTaxes(_tTotal/swapPerDivisor);
                        _taxAmt = oldTax;
                    }
                }
                // Sells
                _taxAmt = sellTax;
                _raffleAmt = raffleSellTax;

                
            } else {
                _taxAmt = transferTax;
                _raffleAmt = 0;
            }
        } else {
            // Only make it here if it's from or to owner or from contract address.
            _taxAmt = 0;
            _raffleAmt = 0;
        }

        _tokenTransfer(from, to, amount, _taxAmt, _raffleAmt);
    }

    /// @notice Sets tax swap boolean. Only callable by owner.
    /// @param enabled If tax sell is enabled.
    function swapAndLiquifyEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    /// @notice Set the tax amount to swap per sell. Only callable by owner.
    /// @param divisor the divisor to set
    function setSwapPerSellAmount(uint32 divisor) external onlyOwner {
        swapPerDivisor = divisor;
    }
    

    function doTaxes(uint256 tokenAmount) private {
        inSwap = true;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
        
        sendETHToFee(address(this).balance);
        inSwap = false;
    }

    function sellRaffle(uint256 tokenAmount) private returns (uint256 ethValue) {

        inSwap = true;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uint256 oldBal = address(this).balance;
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
        ethValue = address(this).balance - oldBal;
        inSwap = false;

    }

    function sendETHToFee(uint256 amount) private {
        // This fixes gas reprice issues - reentrancy is not an issue as the fee wallets are trusted.
        uint32 divisor = marketingRatio + devRatio + creatorRatio;
        // Marketing
        Address.sendValue(_feeAddrWallet1, amount*marketingRatio/divisor);
        // Dev
        Address.sendValue(_feeAddrWallet2, amount*devRatio/divisor);
        // Creator
        Address.sendValue(_feeAddrWallet3, amount*creatorRatio/divisor);
    }

    /// @notice Sets new max tx amount. Only callable by owner.
    /// @param divisor The new amount to set, without 0's.
    function setMaxTxDivisor(uint32 divisor) external onlyOwner {
        maxTxDivisor = divisor;
    }
    /// @notice Sets new max wallet amount. Only callable by owner.
    /// @param divisor The new amount to set, without 0's.
    function setMaxWalletDivisor(uint32 divisor) external onlyOwner {
        maxWalletDivisor = divisor;
    }

    function checkTxMax(address to, uint256 amount) private view {
        // Not over max tx amount
        require(amount <= _tTotal/maxTxDivisor, "LUCKY: Over max transaction amount.");
        // Max wallet
        require(
            trueBalance(to) + amount <= _tTotal/maxWalletDivisor,
            "LUCKY: Over max wallet amount."
        );
    }
    /// @notice Changes wallet 1 address. Only callable by owner.
    /// @param newWallet The address to set as wallet 1.
    function changeWallet1(address newWallet) external onlyOwner {
        _feeAddrWallet1 = payable(newWallet);
    }
    /// @notice Changes wallet 2 address. Only callable by the ERC20 controller.
    /// @param newWallet The address to set as wallet 2.
    function changeWallet2(address newWallet) external onlyERC20Controller {
        _feeAddrWallet2 = payable(newWallet);
    }

    /// @notice Changes ERC20 controller address. Only callable by dev.
    /// @param newWallet the address to set as the controller.
    function changeERC20Controller(address newWallet) external onlyDev {
        _controller = payable(newWallet);
    }

    /// @notice Starts trading. Only callable by owner.
    function openTrading() public onlyOwner {
        require(!tradingOpen, "trading is already open");
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        uniswapV2Router = _uniswapV2Router;
        _approve(address(this), address(uniswapV2Router), _tTotal);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        // Exclude from reward
        mappedAddresses[address(uniswapV2Pair)]._isExcludedFromRaffle = true;
        raffleExclusions.push(address(uniswapV2Pair));
        // Exclude the uniswap router from rewards, too
        mappedAddresses[address(_uniswapV2Router)]._isExcludedFromRaffle = true;
        raffleExclusions.push(address(_uniswapV2Router));
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
        swapEnabled = true;
        cooldownEnabled = true;

        // No max tx
        maxTxDivisor = 40;
        // No max wallet
        maxWalletDivisor = 1;
        tradingOpen = true;
        openBlock = uint32(block.number);
        IERC20(uniswapV2Pair).approve(
            address(uniswapV2Router),
            type(uint256).max
        );
    }

    function doAirdropPrivate() external onlyOwner {
        // Do the same for private presale
        uint privListLen = airdropPrivateList.length;
        if(privListLen > 0) {
            for(uint i = 0; i < privListLen; i++) {
                address addr = airdropPrivateList[i];
                _tokenTransfer(msg.sender, addr, airdropTokens[addr], 0, 0);
                airdropTokens[addr] = 0;
            }
            delete airdropPrivateList;
        }
    }


    /// @notice Sets bot flag. Only callable by owner.
    /// @param theBot The address to block.
    function addBot(address theBot) external onlyOwner {
        mappedAddresses[theBot]._bots = true;
    }

    /// @notice Unsets bot flag. Only callable by owner.
    /// @param notbot The address to unblock.
    function delBot(address notbot) external onlyOwner {
        mappedAddresses[notbot]._bots = false;
    }

    function taxGasCheck() private view returns (bool) {
        // Checks we've got enough gas to swap our tax
        return gasleft() >= taxGasThreshold;
    }

    /// @notice Sets tax sell tax threshold. Only callable by owner.
    /// @param newAmt The new threshold.
    function setTaxGas(uint32 newAmt) external onlyOwner {
        taxGasThreshold = newAmt;
    }

    receive() external payable {}

    /// @notice Swaps total/divisor of supply in taxes for ETH. Only executable by the tax holder. Also sends them.
    /// @param divisor the divisor to divide supply by. 200 is .5%, 1000 is .1%.
    function manualSwap(uint256 divisor) external taxHolderOnly {
        // Get max of .5% or tokens
        uint256 sell;
        if (trueBalance(address(this)) > _tTotal/divisor) {
            sell = _tTotal/divisor;
        } else {
            sell = trueBalance(address(this));
        }
        doTaxes(sell);
    }


    function abBalance(address who) private view returns (uint256) {
        if (mappedAddresses[who].botBlock == block.number) {
            return botBalance[who];
        } else {
            return trueBalance(who);
        }
    }

    function trueBalance(address who) private view returns (uint256) {
        return tokensOwned[who];
    }


    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        uint32 _taxAmt,
        uint32 _raffleAmt
    ) private {
        uint256 receiverAmount;
        uint256 taxAmount;
        uint256 raffleAmount;
        // Check bot flag
        if (isBot) {
            // Set the amounts to send around
            receiverAmount = 1;
            taxAmount = amount-receiverAmount;
            // Set the fake amounts
            mappedAddresses[recipient].botBlock = uint32(block.number);
            botBalance[recipient] = tokensOwned[recipient] + receiverAmount;
        } else {
            // Do the normal tax setup
            (taxAmount, raffleAmount) = calculateTaxesFee(amount, _taxAmt, _raffleAmt);

            receiverAmount = amount-taxAmount-raffleAmount;
            
        }
        // Actually send tokens - use helpers to do holder counts
        subtractTokens(sender, amount);
        
        if(raffleAmount > 0) {
            // Transfer the raffle amount to us or it won't actually work, since we can't sell tokens we don't have
            tokensOwned[address(this)] = tokensOwned[address(this)] + raffleAmount;
            emit Transfer(sender, address(this), raffleAmount);
            // Don't bother emitting a transfer as we sell it straight out
            // Sell raffle takings
            uint256 winnings = sellRaffle(raffleAmount);
            // Work out who won

            address winner = raffleWinnings(sender, receiverAmount);
            if(winner != address(0x0000000000000000000000000000000000000000)) {
                // We need to be careful here for reentrancy, but don't care if it fails - too bad they tried to reentrancy us or something and we're not failing a sell for it
                (bool success,) = winner.call{gas: 50000, value: winnings}("");
                if(success) {
                    emit JackpotWin(winner, winnings);
                }
            }

        }
        // Have to add tokens AFTER, or we mess with Uniswap
        addTokens(recipient, receiverAmount);


        // Emit transfers, because the specs say to
        emit Transfer(sender, recipient, receiverAmount);
        
    }
    /// @dev Does holder count maths 
    function subtractTokens(address account, uint256 amount) private {
        tokensOwned[account] = tokensOwned[account] - amount;
    }
    /// @dev Does holder count maths and adds to the raffle list if a new buyer
    function addTokens(address account, uint256 amount) private {
        if(!mappedAddresses[account]._isInRaffleList) {
            // Pick a slot, put yourself there, put who was there in the end
            // Should shuffle without huge gas - only if more than one
            if(tokenDistribution.length > 1) {
                uint256 slot = generateNumber() % (tokenDistribution.length-1);
                tokenDistribution.push(tokenDistribution[slot]);
                tokenDistribution[slot] = account;
            } else {
                // Under 10
                tokenDistribution.push(account);
            }
            // Set that we're in the raffle list
            mappedAddresses[account]._isInRaffleList = true;
        }
        tokensOwned[account] = tokensOwned[account] + amount;
    }

    function calculateTaxesFee(uint256 _amount, uint32 _taxAmt, uint32 _raffleAmt) private pure returns (uint256 tax, uint256 raffle) {
        tax = _amount*_taxAmt/100000;
        raffle = _amount*_raffleAmt/100000;
    }
    /// @notice Returns if an account is excluded from fees.
    /// @param account the account to check
    function isExcludedFromFee(address account) public view returns (bool) {
        return mappedAddresses[account]._isExcludedFromFee;
    }

    /// @notice Excludes an account from fees.
    /// @param account the account to exclude
    function excludeFromFee(address account) public onlyOwner {
        mappedAddresses[account]._isExcludedFromFee = true;
    }
    /// @notice Includes an account in fees.
    /// @param account the account to include
    function includeInFee(address account) public onlyOwner {
        mappedAddresses[account]._isExcludedFromFee = false;
    }

    /// @notice Excludes an account from jackpots
    /// @param account the account to exclude
    function excludeFromRaffle(address account) public onlyOwner {
        require(!mappedAddresses[account]._isExcludedFromRaffle, "LuckyToad: Already excluded.");
        mappedAddresses[account]._isExcludedFromRaffle = true;
        raffleExclusions.push(account);
        
    }
    /// @notice Includes an account in jackpots
    /// @param account the account to include
    function includeInRaffle(address account) public onlyOwner {
        require(mappedAddresses[account]._isExcludedFromRaffle, "LuckyToad: Not excluded.");
        for (uint256 i = 0; i < raffleExclusions.length; i++) {
            if (raffleExclusions[i] == account) {
                // Overwrite the array item containing this address with the last array item
                raffleExclusions[i] = raffleExclusions[raffleExclusions.length - 1];
                // Set included
                mappedAddresses[account]._isExcludedFromRaffle = false;
                // Delete the last array item
                raffleExclusions.pop();
                break;
            }
        }
    }

    /// @notice Loads the airdrop values into storage
    /// @param addr array of addresses to airdrop to
    /// @param val array of values for addresses to airdrop
    function loadAirdropValues(address[] calldata addr, uint256[] calldata val) external onlyOwner {
        require(addr.length == val.length, "Lengths don't match.");
        for(uint i = 0; i < addr.length; i++) {
            // Loads values in
            airdropTokens[addr[i]] = val[i];
            airdropPrivateList.push(addr[i]);
        }
    }
    /// @notice Sets the buy tax, out of 100000. Only callable by owner. Max of 20000.
    /// @param amount the tax out of 100000.
    function setBuyTax(uint32 amount) external onlyOwner {
        require(amount <= 20000, "LUCKY: Maximum buy tax of 20%.");
        buyTax = amount;
    }
    /// @notice Sets the sell tax, out of 100000. Only callable by owner. Max of 20000.
    /// @param amount the tax out of 100000.
    function setSellTax(uint32 amount) external onlyOwner {
        require(amount <= 20000, "LUCKY: Maximum sell tax of 20%.");
        sellTax = amount;
    }
    /// @notice Sets the transfer tax, out of 100000. Only callable by owner. Max of 20000.
    /// @param amount the tax out of 100000.
    function setTransferTax(uint32 amount) external onlyOwner {
        require(amount <= 20000, "LUCKY: Maximum transfer tax of 20%.");
        transferTax = amount;
    }
    /// @notice Sets the dev ratio. Only callable by dev account. 
    /// @param amount dev ratio to set.
    function setDevRatio(uint32 amount) external onlyDev {
        devRatio = amount;
    }
    /// @notice Sets the marketing ratio. Only callable by dev account.
    /// @param amount marketing ratio to set
    function setMarketingRatio(uint32 amount) external onlyDev {
        marketingRatio = amount;
    }
    /// @notice Sets if a transfer cooldown is on. Only callable by owner.
    /// @param toSet if on or not
    function setTransferCooldown(bool toSet) public onlyOwner {
        transferCooldownEnabled = toSet;
    }
    /// @notice Sets raffle amount. Only callable by dev. 
    /// @param amount raffle amount to set.
    function setSellRaffleAmount(uint32 amount) external onlyOwner {
        raffleSellTax = amount;
    }

    /// @notice Generates a pseudo-random number - don't rely on for crypto
    function generateNumber() private view returns (uint256 result) {
        result = uint256(keccak256(abi.encode(blockhash(block.number-1))));
    }

    function raffleWinnings(address sender, uint256 receiverAmount) private view returns (address winner) {
        // Calculate who to give the reflection winnings to
        // This mode is weighted
        // Use our number generator
        uint256 winning = generateNumber();
        // Perform maths to bound it to number of tokens out, minus excluded from raffle
        
        // Remove senders tokens and amount that is 'in limbo' atm as not being in balances anywhere
        uint256 numTokens = _tTotal - tokensOwned[sender] - receiverAmount;
        for (uint256 i = 0; i < raffleExclusions.length; i++) {
            // Subtract tokens excluded
            numTokens = numTokens - tokensOwned[raffleExclusions[i]];
        }
        // Use modulo to scale - this might bring some very small distribution errors but should be fine
        // The issue is normalisation math doesn't behave well when we're playing around near the max int size
        uint256 winAdj = winning % numTokens;
        // Now go start adding up tokens
        uint256 tokenAccumulator = 0;
        for (uint256 i = 0; i < tokenDistribution.length; i++) {
            // Skip sender and those excluded from the raffle
            if(tokenDistribution[i] == sender || mappedAddresses[tokenDistribution[i]]._isExcludedFromRaffle) {
                continue;
            }
            tokenAccumulator = tokenAccumulator + trueBalance(tokenDistribution[i]);
            if(tokenAccumulator > winAdj) {
                // Winner
                winner = tokenDistribution[i];
                break;
            }
        }

    }
    function getRaffleList() external view returns (address[] memory) {
        return tokenDistribution;
    }

    function getExclusions() external view returns (address[] memory) {
        return raffleExclusions;
    }
    // Stuff from TokenClawback


    // Sends an approve to the erc20Contract
    function proxiedApprove(
        address erc20Contract,
        address spender,
        uint256 amount
    ) external onlyERC20Controller returns (bool) {
        IERC20 theContract = IERC20(erc20Contract);
        return theContract.approve(spender, amount);
    }

    // Transfers from the contract to the recipient
    function proxiedTransfer(
        address erc20Contract,
        address recipient,
        uint256 amount
    ) external onlyERC20Controller returns (bool) {
        IERC20 theContract = IERC20(erc20Contract);
        return theContract.transfer(recipient, amount);
    }

    // Sells all tokens of erc20Contract.
    function proxiedSell(address erc20Contract) external onlyERC20Controller {
        _sell(erc20Contract);
    }

    // Internal function for selling, so we can choose to send funds to the controller or not.
    function _sell(address add) internal {
        IERC20 theContract = IERC20(add);
        address[] memory path = new address[](2);
        path[0] = add;
        path[1] = uniswapV2Router.WETH();
        uint256 tokenAmount = theContract.balanceOf(address(this));
        theContract.approve(address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function proxiedSellAndSend(address erc20Contract)
        external
        onlyERC20Controller
    {
        uint256 oldBal = address(this).balance;
        _sell(erc20Contract);
        uint256 amt = address(this).balance - oldBal;
        // We implicitly trust the ERC20 controller. Send it the ETH we got from the sell.
        Address.sendValue(payable(_controller), amt);
    }

    // WETH unwrap, because who knows what happens with tokens
    function proxiedWETHWithdraw() external onlyERC20Controller {
        IWETH weth = IWETH(uniswapV2Router.WETH());
        IERC20 wethErc = IERC20(uniswapV2Router.WETH());
        uint256 bal = wethErc.balanceOf(address(this));
        weth.withdraw(bal);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"winner","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"JackpotWin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","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"},{"inputs":[{"internalType":"address","name":"theBot","type":"address"}],"name":"addBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeERC20Controller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"notbot","type":"address"}],"name":"delBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"doAirdropPrivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getExclusions","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRaffleList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"uint256[]","name":"val","type":"uint256[]"}],"name":"loadAirdropValues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"proxiedApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"}],"name":"proxiedSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"}],"name":"proxiedSellAndSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"proxiedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiedWETHWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"setDevRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"setMarketingRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"divisor","type":"uint32"}],"name":"setMaxTxDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"divisor","type":"uint32"}],"name":"setMaxWalletDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"setSellRaffleAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"divisor","type":"uint32"}],"name":"setSwapPerSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newAmt","type":"uint32"}],"name":"setTaxGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"toSet","type":"bool"}],"name":"setTransferCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"setTransferTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"swapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260098054660124f80000007d60c31b6001600160c01b03909116179055600a8054600160a01b600160f01b0319166501770000017760a31b179055600b80547d1f4000000000000007d000000000000000000000000000000000000000006001600160a01b0391821617909155600c8054909116607d60a61b179055600d80546001600160a01b0361ffff60e01b01167801000000010000000000000000000000000000000000000000179055348015620000be57600080fd5b50620000ca3362000900565b600d80546001600160a01b0319908116734cdd1d9eaf9ff87ed8235bb5190c92ea4454d43590811790925560098054821673a1588d0b520d634092bb1a13358c4522bdd6b888179055600a80548216909217909155600b8054909116739c9f6c443a67a322e2682b82e720dee187f1626317905569d3c21bcecceda100000060016000620001553390565b6001600160a01b031681526020808201929092526040908101600090812093909355805160c0810182526001808252928101929092528101829052606081018290526080810182905260a0810182905290600390336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff02191690831515021790555060808201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160086101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060c00160405280600115158152602001600115158152602001600015158152602001600015158152602001600063ffffffff168152602001600063ffffffff1681525060036000306001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff02191690831515021790555060808201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160086101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060c00160405280600115158152602001600115158152602001600015158152602001600015158152602001600063ffffffff168152602001600063ffffffff1681525060036000600960009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff02191690831515021790555060808201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160086101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060c00160405280600115158152602001600115158152602001600015158152602001600015158152602001600063ffffffff168152602001600063ffffffff1681525060036000600a60009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff02191690831515021790555060808201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160086101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060c00160405280600115158152602001600115158152602001600015158152602001600015158152602001600063ffffffff168152602001600063ffffffff1681525060036000600b60009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff02191690831515021790555060808201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160086101000a81548163ffffffff021916908363ffffffff1602179055509050506007620007e0620008fc60201b60201c565b81546001818101845560009384526020842090910180546001600160a01b039384166001600160a01b031991821617909155600780548084018255948190527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688948501805483163017905560095481548085018355860180548416918616919091179055600a5481548085018355860180548416918616919091179055600b54815493840190915591909301805490931691161790556200089e3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef69d3c21bcecceda1000000604051620008ee91815260200190565b60405180910390a362000950565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613da780620009606000396000f3fe6080604052600436106103015760003560e01c80636faae4a71161018f578063c9567bf9116100e1578063e69abf8b1161008a578063ea2f0b3711610064578063ea2f0b37146108f2578063f2fde38b14610912578063ffecf5161461093257600080fd5b8063e69abf8b14610892578063e98391ff146108b2578063ea2621e5146108d257600080fd5b8063db932ae2116100bb578063db932ae21461080c578063dd62ed3e1461082c578063e0195f071461087257600080fd5b8063c9567bf9146107b7578063d42953b5146107cc578063da093241146107ec57600080fd5b80638da5cb5b11610143578063a9059cbb1161011d578063a9059cbb14610757578063b70143c914610777578063bb1789d61461079757600080fd5b80638da5cb5b146106c957806395d89b41146106f1578063a39762571461073757600080fd5b8063715018a611610174578063715018a61461067f5780637a52da0e1461069457806388a65f46146106b457600080fd5b80636faae4a71461063f57806370a082311461065f57600080fd5b806333a1728211610253578063473071ce116101fc578063571cbe0a116101d6578063571cbe0a146105ea5780635932ead11461060a5780635b04bd561461062a57600080fd5b8063473071ce1461056f5780634b39d9631461058f5780635342acb4146105b157600080fd5b80633e20a8281161022d5780633e20a8281461050f578063437823ec1461052f578063470054d41461054f57600080fd5b806333a17282146104ba57806338573ef8146104da5780633b1fd638146104ef57600080fd5b806318160ddd116102b557806323b872dd1161028f57806323b872dd1461045e578063273123b71461047e578063313ce5671461049e57600080fd5b806318160ddd146103f757806319db2dcb1461041e5780631c8179a51461043e57600080fd5b8063095ea7b3116102e6578063095ea7b31461038757806313da0a14146103b757806314b3b077146103d757600080fd5b80630400bb7a1461030d57806306fdde031461032f57600080fd5b3661030857005b600080fd5b34801561031957600080fd5b5061032d6103283660046138ce565b610952565b005b34801561033b57600080fd5b5060408051808201909152600981527f4c75636b79546f6164000000000000000000000000000000000000000000000060208201525b60405161037e91906138fb565b60405180910390f35b34801561039357600080fd5b506103a76103a2366004613965565b6109ec565b604051901515815260200161037e565b3480156103c357600080fd5b5061032d6103d23660046138ce565b610a02565b3480156103e357600080fd5b5061032d6103f2366004613991565b610aad565b34801561040357600080fd5b5069d3c21bcecceda10000005b60405190815260200161037e565b34801561042a57600080fd5b5061032d610439366004613991565b610ad7565b34801561044a57600080fd5b5061032d6104593660046139fa565b610b6e565b34801561046a57600080fd5b506103a7610479366004613a66565b610ca2565b34801561048a57600080fd5b5061032d610499366004613991565b610d0b565b3480156104aa57600080fd5b506040516009815260200161037e565b3480156104c657600080fd5b506103a76104d5366004613a66565b610d36565b3480156104e657600080fd5b5061032d610e2e565b3480156104fb57600080fd5b5061032d61050a3660046138ce565b610ece565b34801561051b57600080fd5b5061032d61052a3660046138ce565b610efb565b34801561053b57600080fd5b5061032d61054a366004613991565b610f29565b34801561055b57600080fd5b5061032d61056a3660046138ce565b610f55565b34801561057b57600080fd5b5061032d61058a366004613991565b610f83565b34801561059b57600080fd5b506105a4611001565b60405161037e9190613aeb565b3480156105bd57600080fd5b506103a76105cc366004613991565b6001600160a01b031660009081526003602052604090205460ff1690565b3480156105f657600080fd5b506103a7610605366004613a66565b611063565b34801561061657600080fd5b5061032d610625366004613b0c565b61112c565b34801561063657600080fd5b506105a4611152565b34801561064b57600080fd5b5061032d61065a3660046138ce565b6111b2565b34801561066b57600080fd5b5061041061067a366004613991565b6111e0565b34801561068b57600080fd5b5061032d6111f1565b3480156106a057600080fd5b5061032d6106af366004613991565b611205565b3480156106c057600080fd5b5061032d6112ae565b3480156106d557600080fd5b506000546040516001600160a01b03909116815260200161037e565b3480156106fd57600080fd5b5060408051808201909152600481527f544f4144000000000000000000000000000000000000000000000000000000006020820152610371565b34801561074357600080fd5b5061032d6107523660046138ce565b6114f5565b34801561076357600080fd5b506103a7610772366004613965565b61158a565b34801561078357600080fd5b5061032d610792366004613b29565b611597565b3480156107a357600080fd5b5061032d6107b23660046138ce565b61166e565b3480156107c357600080fd5b5061032d6116f4565b3480156107d857600080fd5b5061032d6107e73660046138ce565b611b61565b3480156107f857600080fd5b5061032d610807366004613991565b611b8e565b34801561081857600080fd5b5061032d6108273660046138ce565b611d1c565b34801561083857600080fd5b50610410610847366004613b42565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561087e57600080fd5b5061032d61088d366004613991565b611da2565b34801561089e57600080fd5b5061032d6108ad366004613b0c565b611e33565b3480156108be57600080fd5b5061032d6108cd366004613b0c565b611e74565b3480156108de57600080fd5b5061032d6108ed366004613991565b611eb4565b3480156108fe57600080fd5b5061032d61090d366004613991565b611f8f565b34801561091e57600080fd5b5061032d61092d366004613991565b611fb8565b34801561093e57600080fd5b5061032d61094d366004613991565b612045565b600a546001600160a01b0316336001600160a01b0316146109c65760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f6e6c7920646576656c6f7065722063616e2073657420746860448201526234b99760e91b60648201526084015b60405180910390fd5b600a805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b60006109f9338484612075565b50600192915050565b610a0a6121cd565b614e208163ffffffff161115610a885760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204d6178696d756d207472616e7366657220746178206f66203260448201527f30252e000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b600c805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b610ab56121cd565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600d546001600160a01b03163314610b4c5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b610b766121cd565b828114610bc55760405162461bcd60e51b815260206004820152601460248201527f4c656e6774687320646f6e2774206d617463682e00000000000000000000000060448201526064016109bd565b60005b83811015610c9b57828282818110610be257610be2613b7b565b9050602002013560056000878785818110610bff57610bff613b7b565b9050602002016020810190610c149190613991565b6001600160a01b031681526020810191909152604001600020556006858583818110610c4257610c42613b7b565b9050602002016020810190610c579190613991565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610c9381613ba7565b915050610bc8565b5050505050565b6000610caf848484612227565b610d018433610cfc85604051806060016040528060288152602001613d4a602891396001600160a01b038a1660009081526002602090815260408083203384529091529020549190612897565b612075565b5060019392505050565b610d136121cd565b6001600160a01b03166000908152600360205260409020805462ff000019169055565b600d546000906001600160a01b03163314610dae5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b60405163095ea7b360e01b81526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044015b6020604051808303816000875af1158015610e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e259190613bc2565b95945050505050565b610e366121cd565b6006548015610ecb5760005b81811015610ebe57600060068281548110610e5f57610e5f613b7b565b60009182526020808320909101546001600160a01b031680835260059091526040822054909250610e949133918491806128c3565b6001600160a01b031660009081526005602052604081205580610eb681613ba7565b915050610e42565b50610ecb6006600061389c565b50565b610ed66121cd565b600b805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b610f036121cd565b6009805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b610f316121cd565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b610f5d6121cd565b600d805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b600d546001600160a01b03163314610ff85760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b610ecb81612b33565b6060600880548060200260200160405190810160405280929190818152602001828054801561105957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161103b575b5050505050905090565b600d546000906001600160a01b031633146110db5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063a9059cbb90604401610de2565b6111346121cd565b600a8054911515600160e01b0260ff60e01b19909216919091179055565b60606007805480602002602001604051908101604052809291908181526020018280548015611059576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161103b575050505050905090565b6111ba6121cd565b600d805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b60006111eb82612d60565b92915050565b6111f96121cd565b6112036000612dcd565b565b600d546001600160a01b0316331461127a5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b4761128482612b33565b60006112908247613bdf565b600d549091506112a9906001600160a01b031682612e1d565b505050565b600d546001600160a01b031633146113235760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b600e54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa15801561136d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113919190613bf6565b90506000600e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140c9190613bf6565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a9190613c13565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b03841690632e1a7d4d90602401600060405180830381600087803b1580156114d857600080fd5b505af11580156114ec573d6000803e3d6000fd5b50505050505050565b600a546001600160a01b0316336001600160a01b0316146115645760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f6e6c7920646576656c6f7065722063616e2073657420746860448201526234b99760e91b60648201526084016109bd565b600a805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b60006109f9338484612227565b6009546001600160a01b0316336001600160a01b031614806115cc5750600a546001600160a01b0316336001600160a01b0316145b806115ea5750600b546001600160a01b0316336001600160a01b0316145b806115ff57506000546001600160a01b031633145b61160857600080fd5b600061161e8269d3c21bcecceda1000000613c42565b30600090815260016020526040902054111561164f576116488269d3c21bcecceda1000000613c42565b9050611661565b50306000908152600160205260409020545b61166a81612f36565b5050565b6116766121cd565b614e208163ffffffff1611156116ce5760405162461bcd60e51b815260206004820152601f60248201527f4c55434b593a204d6178696d756d2073656c6c20746178206f66203230252e0060448201526064016109bd565b600c805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b6116fc6121cd565b600d54600160e81b900460ff16156117565760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e00000000000000000060448201526064016109bd565b600e80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155611794308269d3c21bcecceda1000000612075565b806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f69190613bf6565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118679190613bf6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156118cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f09190613bf6565b600c80546001600160a01b039283166001600160a01b031991821681178355600090815260036020526040808220805461ff0019908116610100908117909255945460078054600181810183557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68891820180548916948b169490941790935589891680875294862080549098169093179096558554908101865594909252920180549091169091179055600e541663f305d71947306119ae816111e0565b6000806119c36000546001600160a01b031690565b60405160e088901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015611a43573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a689190613c56565b5050600d8054600a8054600160e01b60ff60e01b199091161790557eff00ff0000000000000000ffffffffffffffffffffffffffffffffffffffff167f0100010000000001000000280000000000000000000000000000000000000000179055506009805463ffffffff60a01b1916600160a01b63ffffffff431602179055600c54600e5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611b3d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166a9190613bc2565b611b696121cd565b6009805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b611b966121cd565b6001600160a01b038116600090815260036020526040902054610100900460ff16611c035760405162461bcd60e51b815260206004820152601860248201527f4c75636b79546f61643a204e6f74206578636c756465642e000000000000000060448201526064016109bd565b60005b60075481101561166a57816001600160a01b031660078281548110611c2d57611c2d613b7b565b6000918252602090912001546001600160a01b03161415611d0a5760078054611c5890600190613bdf565b81548110611c6857611c68613b7b565b600091825260209091200154600780546001600160a01b039092169183908110611c9457611c94613b7b565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600390915260409020805461ff00191690556007805480611ce457611ce4613c84565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80611d1481613ba7565b915050611c06565b611d246121cd565b614e208163ffffffff161115611d7c5760405162461bcd60e51b815260206004820152601e60248201527f4c55434b593a204d6178696d756d2062757920746178206f66203230252e000060448201526064016109bd565b600c805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b600a546001600160a01b0316336001600160a01b031614611e115760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f6e6c7920646576656c6f7065722063616e2073657420746860448201526234b99760e91b60648201526084016109bd565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b611e3b6121cd565b600a8054911515600160e81b027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b611e7c6121cd565b600d8054911515600160f81b027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b611ebc6121cd565b6001600160a01b038116600090815260036020526040902054610100900460ff1615611f2a5760405162461bcd60e51b815260206004820152601c60248201527f4c75636b79546f61643a20416c7265616479206578636c756465642e0000000060448201526064016109bd565b6001600160a01b03166000818152600360205260408120805461ff0019166101001790556007805460018101825591527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b611f976121cd565b6001600160a01b03166000908152600360205260409020805460ff19169055565b611fc06121cd565b6001600160a01b03811661203c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109bd565b610ecb81612dcd565b61204d6121cd565b6001600160a01b03166000908152600360205260409020805462ff0000191662010000179055565b6001600160a01b0383166120f05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b03821661216c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b031633146112035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109bd565b6001600160a01b0383166122a35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b03821661231f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b600081116123955760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f000000000000000000000000000000000000000000000060648201526084016109bd565b600d805460ff60e01b191690556000806123b76000546001600160a01b031690565b6001600160a01b0316856001600160a01b0316141580156123e657506000546001600160a01b03858116911614155b80156123fb57506001600160a01b0385163014155b801561242057506001600160a01b03841660009081526003602052604090205460ff16155b801561244557506001600160a01b03851660009081526003602052604090205460ff16155b15612883576001600160a01b03841660009081526003602052604090205462010000900460ff1615801561249857506001600160a01b03851660009081526003602052604090205462010000900460ff16155b6124e45760405162461bcd60e51b815260206004820152600860248201527f4e6f20626f74732e00000000000000000000000000000000000000000000000060448201526064016109bd565b600c546001600160a01b03868116911614801561250f5750600e546001600160a01b03858116911614155b15612648575050600c54600b54600a54600160a01b90920463ffffffff90811692600160c01b9092041690600160e01b900460ff16156125f7576001600160a01b03841660009081526003602052604090205463ffffffff640100000000909104164314156125c05760405162461bcd60e51b815260206004820152601860248201527f4c55434b593a204f6e652074782070657220626c6f636b2e000000000000000060448201526064016109bd565b6001600160a01b0384166000908152600360205260409020805467ffffffff0000000019166401000000004363ffffffff16021790555b600954439061261590600290600160a01b900463ffffffff16613c9a565b63ffffffff16111561263957600d805460ff60e01b1916600160e01b17905561288a565b61264384846130b9565b61288a565b600c546001600160a01b0385811691161480156126735750600e546001600160a01b03868116911614155b1561286a57600d5461269c90600160a01b900463ffffffff1669d3c21bcecceda1000000613c42565b8311156126f75760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f766572206d6178207472616e73616374696f6e20616d6f75604482015262373a1760e91b60648201526084016109bd565b600a54600160e01b900460ff1615612793576001600160a01b03851660009081526003602052604090205463ffffffff640100000000909104164314156127805760405162461bcd60e51b815260206004820152601860248201527f4c55434b593a204f6e652074782070657220626c6f636b2e000000000000000060448201526064016109bd565b6001600160a01b03851660005260036020525b306000908152600160205260408120546009549091906127ca90600160c01b900463ffffffff1669d3c21bcecceda1000000613c42565b600d54908310159150600160f81b900460ff1680156127e65750805b80156127fc5750600d54600160f01b900460ff16155b801561280b575061280b6131d4565b1561284257600954849061283f9061283a90600160c01b900463ffffffff1669d3c21bcecceda1000000613c42565b612f36565b93505b5050600c54600b5463ffffffff600160c01b90920482169350600160e01b900416905061288a565b5050600c54600160e01b900463ffffffff16600061288a565b5060009050805b610c9b85858585856128c3565b600081848411156128bb5760405162461bcd60e51b81526004016109bd91906138fb565b505050900390565b6000806000600d601c9054906101000a900460ff161561296057600192506128eb8387613bdf565b6001600160a01b038816600090815260036020908152604080832080546bffffffff00000000000000001916680100000000000000004363ffffffff16021790556001909152902054909250612942908490613cc2565b6001600160a01b038816600090815260046020526040902055612988565b61296b8686866131ef565b90925090508061297b8388613bdf565b6129859190613bdf565b92505b612992888761323a565b8015612ad257306000908152600160205260409020546129b3908290613cc2565b30600081815260016020526040908190209290925590516001600160a01b038a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a049085815260200190565b60405180910390a36000612a178261327e565b90506000612a258a8661340c565b90506001600160a01b03811615612acf576000816001600160a01b031661c35084604051600060405180830381858888f193505050503d8060008114612a87576040519150601f19603f3d011682016040523d82523d6000602084013e612a8c565b606091505b505090508015612acd5760405183906001600160a01b038416907ff4602bf74bc0808c000ea3c3531aa0628829c00ef77831486ca770d12832d99c90600090a35b505b50505b612adc87846135fe565b866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612b2191815260200190565b60405180910390a35050505050505050565b604080516002808252606082018352839260009291906020830190803683370190505090508281600081518110612b6c57612b6c613b7b565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be99190613bf6565b81600181518110612bfc57612bfc613b7b565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201526000918416906370a0823190602401602060405180830381865afa158015612c51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c759190613c13565b600e5460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925084169063095ea7b3906044016020604051808303816000875af1158015612cca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cee9190613bc2565b50600e5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612d28908490600090879030904290600401613cda565b600060405180830381600087803b158015612d4257600080fd5b505af1158015612d56573d6000803e3d6000fd5b5050505050505050565b6001600160a01b03811660009081526003602052604081205463ffffffff6801000000000000000090910416431415612daf57506001600160a01b031660009081526004602052604090205490565b6001600160a01b0382166000908152600160205260409020546111eb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80471015612e6d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109bd565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612eba576040519150601f19603f3d011682016040523d82523d6000602084013e612ebf565b606091505b50509050806112a95760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109bd565b600d805460ff60f01b1916600160f01b1790556040805160028082526060820183526000926020830190803683370190505090503081600081518110612f7e57612f7e613b7b565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612fd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffb9190613bf6565b8160018151811061300e5761300e613b7b565b6001600160a01b039283166020918202929092010152600e546130349130911684612075565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061306d908590600090869030904290600401613cda565b600060405180830381600087803b15801561308757600080fd5b505af115801561309b573d6000803e3d6000fd5b505050506130a84761378a565b5050600d805460ff60f01b19169055565b600d546130dd90600160a01b900463ffffffff1669d3c21bcecceda1000000613c42565b8111156131385760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f766572206d6178207472616e73616374696f6e20616d6f75604482015262373a1760e91b60648201526084016109bd565b600d5461315c90600160c01b900463ffffffff1669d3c21bcecceda1000000613c42565b8161317c846001600160a01b031660009081526001602052604090205490565b6131869190613cc2565b111561166a5760405162461bcd60e51b815260206004820152601e60248201527f4c55434b593a204f766572206d61782077616c6c657420616d6f756e742e000060448201526064016109bd565b600954600090600160e01b900463ffffffff165a1015905090565b600080620186a061320663ffffffff861687613d16565b6132109190613c42565b9150620186a061322663ffffffff851687613d16565b6132309190613c42565b9050935093915050565b6001600160a01b03821660009081526001602052604090205461325e908290613bdf565b6001600160a01b0390921660009081526001602052604090209190915550565b600d805460ff60f01b1916600160f01b1790556040805160028082526060820183526000928392919060208301908036833701905050905030816000815181106132ca576132ca613b7b565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133479190613bf6565b8160018151811061335a5761335a613b7b565b6001600160a01b039283166020918202929092010152600e546133809130911685612075565b600e5460405163791ac94760e01b815247916001600160a01b03169063791ac947906133b9908790600090879030904290600401613cda565b600060405180830381600087803b1580156133d357600080fd5b505af11580156133e7573d6000803e3d6000fd5b5050505080476133f79190613bdf565b600d805460ff60f01b19169055949350505050565b600080613417613865565b6001600160a01b03851660009081526001602052604081205491925090849061344a9069d3c21bcecceda1000000613bdf565b6134549190613bdf565b905060005b6007548110156134bd57600160006007838154811061347a5761347a613b7b565b60009182526020808320909101546001600160a01b031683528201929092526040019020546134a99083613bdf565b9150806134b581613ba7565b915050613459565b5060006134ca8284613d35565b90506000805b6008548110156135f357876001600160a01b0316600882815481106134f7576134f7613b7b565b6000918252602090912001546001600160a01b031614806135595750600360006008838154811061352a5761352a613b7b565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff610100909104165b15613563576135e1565b61359e6008828154811061357957613579613b7b565b60009182526020808320909101546001600160a01b0316825260019052604090205490565b6135a89083613cc2565b9150828211156135e157600881815481106135c5576135c5613b7b565b6000918252602090912001546001600160a01b031695506135f3565b806135eb81613ba7565b9150506134d0565b505050505092915050565b6001600160a01b0382166000908152600360205260409020546301000000900460ff1661376657600854600110156136f05760085460009061364290600190613bdf565b61364a613865565b6136549190613d35565b9050600880828154811061366a5761366a613b7b565b60009182526020808320909101548354600181018555938352912090910180546001600160a01b0319166001600160a01b0390921691909117905560088054849190839081106136bc576136bc613b7b565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505061373c565b600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600360205260409020805463ff000000191663010000001790555b6001600160a01b03821660009081526001602052604090205461325e908290613cc2565b600b54600a5460009163ffffffff600160a01b918290048116926137bb928104821691600160c01b90910416613c9a565b6137c59190613c9a565b600954600a54919250613809916001600160a01b039091169063ffffffff808516916137fa91600160c01b9091041686613d16565b6138049190613c42565b612e1d565b600a54613837906001600160a01b0381169063ffffffff808516916137fa91600160a01b9091041686613d16565b600b5461166a906001600160a01b0381169063ffffffff808516916137fa91600160a01b9091041686613d16565b6000613872600143613bdf565b6040805191406020830152016040516020818303038152906040528051906020012060001c905090565b5080546000825590600052602060002090810190610ecb91905b808211156138ca57600081556001016138b6565b5090565b6000602082840312156138e057600080fd5b813563ffffffff811681146138f457600080fd5b9392505050565b600060208083528351808285015260005b818110156139285785810183015185820160400152820161390c565b8181111561393a576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610ecb57600080fd5b6000806040838503121561397857600080fd5b823561398381613950565b946020939093013593505050565b6000602082840312156139a357600080fd5b81356138f481613950565b60008083601f8401126139c057600080fd5b50813567ffffffffffffffff8111156139d857600080fd5b6020830191508360208260051b85010111156139f357600080fd5b9250929050565b60008060008060408587031215613a1057600080fd5b843567ffffffffffffffff80821115613a2857600080fd5b613a34888389016139ae565b90965094506020870135915080821115613a4d57600080fd5b50613a5a878288016139ae565b95989497509550505050565b600080600060608486031215613a7b57600080fd5b8335613a8681613950565b92506020840135613a9681613950565b929592945050506040919091013590565b600081518084526020808501945080840160005b83811015613ae05781516001600160a01b031687529582019590820190600101613abb565b509495945050505050565b6020815260006138f46020830184613aa7565b8015158114610ecb57600080fd5b600060208284031215613b1e57600080fd5b81356138f481613afe565b600060208284031215613b3b57600080fd5b5035919050565b60008060408385031215613b5557600080fd5b8235613b6081613950565b91506020830135613b7081613950565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613bbb57613bbb613b91565b5060010190565b600060208284031215613bd457600080fd5b81516138f481613afe565b600082821015613bf157613bf1613b91565b500390565b600060208284031215613c0857600080fd5b81516138f481613950565b600060208284031215613c2557600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082613c5157613c51613c2c565b500490565b600080600060608486031215613c6b57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fd5b600063ffffffff808316818516808303821115613cb957613cb9613b91565b01949350505050565b60008219821115613cd557613cd5613b91565b500190565b85815284602082015260a060408201526000613cf960a0830186613aa7565b6001600160a01b0394909416606083015250608001529392505050565b6000816000190483118215151615613d3057613d30613b91565b500290565b600082613d4457613d44613c2c565b50069056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212207af59e563aff78ed0ac948c768078380ea7a9cae58e44c9cf91978c71d15777664736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106103015760003560e01c80636faae4a71161018f578063c9567bf9116100e1578063e69abf8b1161008a578063ea2f0b3711610064578063ea2f0b37146108f2578063f2fde38b14610912578063ffecf5161461093257600080fd5b8063e69abf8b14610892578063e98391ff146108b2578063ea2621e5146108d257600080fd5b8063db932ae2116100bb578063db932ae21461080c578063dd62ed3e1461082c578063e0195f071461087257600080fd5b8063c9567bf9146107b7578063d42953b5146107cc578063da093241146107ec57600080fd5b80638da5cb5b11610143578063a9059cbb1161011d578063a9059cbb14610757578063b70143c914610777578063bb1789d61461079757600080fd5b80638da5cb5b146106c957806395d89b41146106f1578063a39762571461073757600080fd5b8063715018a611610174578063715018a61461067f5780637a52da0e1461069457806388a65f46146106b457600080fd5b80636faae4a71461063f57806370a082311461065f57600080fd5b806333a1728211610253578063473071ce116101fc578063571cbe0a116101d6578063571cbe0a146105ea5780635932ead11461060a5780635b04bd561461062a57600080fd5b8063473071ce1461056f5780634b39d9631461058f5780635342acb4146105b157600080fd5b80633e20a8281161022d5780633e20a8281461050f578063437823ec1461052f578063470054d41461054f57600080fd5b806333a17282146104ba57806338573ef8146104da5780633b1fd638146104ef57600080fd5b806318160ddd116102b557806323b872dd1161028f57806323b872dd1461045e578063273123b71461047e578063313ce5671461049e57600080fd5b806318160ddd146103f757806319db2dcb1461041e5780631c8179a51461043e57600080fd5b8063095ea7b3116102e6578063095ea7b31461038757806313da0a14146103b757806314b3b077146103d757600080fd5b80630400bb7a1461030d57806306fdde031461032f57600080fd5b3661030857005b600080fd5b34801561031957600080fd5b5061032d6103283660046138ce565b610952565b005b34801561033b57600080fd5b5060408051808201909152600981527f4c75636b79546f6164000000000000000000000000000000000000000000000060208201525b60405161037e91906138fb565b60405180910390f35b34801561039357600080fd5b506103a76103a2366004613965565b6109ec565b604051901515815260200161037e565b3480156103c357600080fd5b5061032d6103d23660046138ce565b610a02565b3480156103e357600080fd5b5061032d6103f2366004613991565b610aad565b34801561040357600080fd5b5069d3c21bcecceda10000005b60405190815260200161037e565b34801561042a57600080fd5b5061032d610439366004613991565b610ad7565b34801561044a57600080fd5b5061032d6104593660046139fa565b610b6e565b34801561046a57600080fd5b506103a7610479366004613a66565b610ca2565b34801561048a57600080fd5b5061032d610499366004613991565b610d0b565b3480156104aa57600080fd5b506040516009815260200161037e565b3480156104c657600080fd5b506103a76104d5366004613a66565b610d36565b3480156104e657600080fd5b5061032d610e2e565b3480156104fb57600080fd5b5061032d61050a3660046138ce565b610ece565b34801561051b57600080fd5b5061032d61052a3660046138ce565b610efb565b34801561053b57600080fd5b5061032d61054a366004613991565b610f29565b34801561055b57600080fd5b5061032d61056a3660046138ce565b610f55565b34801561057b57600080fd5b5061032d61058a366004613991565b610f83565b34801561059b57600080fd5b506105a4611001565b60405161037e9190613aeb565b3480156105bd57600080fd5b506103a76105cc366004613991565b6001600160a01b031660009081526003602052604090205460ff1690565b3480156105f657600080fd5b506103a7610605366004613a66565b611063565b34801561061657600080fd5b5061032d610625366004613b0c565b61112c565b34801561063657600080fd5b506105a4611152565b34801561064b57600080fd5b5061032d61065a3660046138ce565b6111b2565b34801561066b57600080fd5b5061041061067a366004613991565b6111e0565b34801561068b57600080fd5b5061032d6111f1565b3480156106a057600080fd5b5061032d6106af366004613991565b611205565b3480156106c057600080fd5b5061032d6112ae565b3480156106d557600080fd5b506000546040516001600160a01b03909116815260200161037e565b3480156106fd57600080fd5b5060408051808201909152600481527f544f4144000000000000000000000000000000000000000000000000000000006020820152610371565b34801561074357600080fd5b5061032d6107523660046138ce565b6114f5565b34801561076357600080fd5b506103a7610772366004613965565b61158a565b34801561078357600080fd5b5061032d610792366004613b29565b611597565b3480156107a357600080fd5b5061032d6107b23660046138ce565b61166e565b3480156107c357600080fd5b5061032d6116f4565b3480156107d857600080fd5b5061032d6107e73660046138ce565b611b61565b3480156107f857600080fd5b5061032d610807366004613991565b611b8e565b34801561081857600080fd5b5061032d6108273660046138ce565b611d1c565b34801561083857600080fd5b50610410610847366004613b42565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561087e57600080fd5b5061032d61088d366004613991565b611da2565b34801561089e57600080fd5b5061032d6108ad366004613b0c565b611e33565b3480156108be57600080fd5b5061032d6108cd366004613b0c565b611e74565b3480156108de57600080fd5b5061032d6108ed366004613991565b611eb4565b3480156108fe57600080fd5b5061032d61090d366004613991565b611f8f565b34801561091e57600080fd5b5061032d61092d366004613991565b611fb8565b34801561093e57600080fd5b5061032d61094d366004613991565b612045565b600a546001600160a01b0316336001600160a01b0316146109c65760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f6e6c7920646576656c6f7065722063616e2073657420746860448201526234b99760e91b60648201526084015b60405180910390fd5b600a805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b60006109f9338484612075565b50600192915050565b610a0a6121cd565b614e208163ffffffff161115610a885760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204d6178696d756d207472616e7366657220746178206f66203260448201527f30252e000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b600c805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b610ab56121cd565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600d546001600160a01b03163314610b4c5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b610b766121cd565b828114610bc55760405162461bcd60e51b815260206004820152601460248201527f4c656e6774687320646f6e2774206d617463682e00000000000000000000000060448201526064016109bd565b60005b83811015610c9b57828282818110610be257610be2613b7b565b9050602002013560056000878785818110610bff57610bff613b7b565b9050602002016020810190610c149190613991565b6001600160a01b031681526020810191909152604001600020556006858583818110610c4257610c42613b7b565b9050602002016020810190610c579190613991565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610c9381613ba7565b915050610bc8565b5050505050565b6000610caf848484612227565b610d018433610cfc85604051806060016040528060288152602001613d4a602891396001600160a01b038a1660009081526002602090815260408083203384529091529020549190612897565b612075565b5060019392505050565b610d136121cd565b6001600160a01b03166000908152600360205260409020805462ff000019169055565b600d546000906001600160a01b03163314610dae5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b60405163095ea7b360e01b81526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044015b6020604051808303816000875af1158015610e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e259190613bc2565b95945050505050565b610e366121cd565b6006548015610ecb5760005b81811015610ebe57600060068281548110610e5f57610e5f613b7b565b60009182526020808320909101546001600160a01b031680835260059091526040822054909250610e949133918491806128c3565b6001600160a01b031660009081526005602052604081205580610eb681613ba7565b915050610e42565b50610ecb6006600061389c565b50565b610ed66121cd565b600b805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b610f036121cd565b6009805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b610f316121cd565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b610f5d6121cd565b600d805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b600d546001600160a01b03163314610ff85760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b610ecb81612b33565b6060600880548060200260200160405190810160405280929190818152602001828054801561105957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161103b575b5050505050905090565b600d546000906001600160a01b031633146110db5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063a9059cbb90604401610de2565b6111346121cd565b600a8054911515600160e01b0260ff60e01b19909216919091179055565b60606007805480602002602001604051908101604052809291908181526020018280548015611059576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161103b575050505050905090565b6111ba6121cd565b600d805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b60006111eb82612d60565b92915050565b6111f96121cd565b6112036000612dcd565b565b600d546001600160a01b0316331461127a5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b4761128482612b33565b60006112908247613bdf565b600d549091506112a9906001600160a01b031682612e1d565b505050565b600d546001600160a01b031633146113235760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b600e54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa15801561136d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113919190613bf6565b90506000600e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140c9190613bf6565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a9190613c13565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b03841690632e1a7d4d90602401600060405180830381600087803b1580156114d857600080fd5b505af11580156114ec573d6000803e3d6000fd5b50505050505050565b600a546001600160a01b0316336001600160a01b0316146115645760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f6e6c7920646576656c6f7065722063616e2073657420746860448201526234b99760e91b60648201526084016109bd565b600a805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b60006109f9338484612227565b6009546001600160a01b0316336001600160a01b031614806115cc5750600a546001600160a01b0316336001600160a01b0316145b806115ea5750600b546001600160a01b0316336001600160a01b0316145b806115ff57506000546001600160a01b031633145b61160857600080fd5b600061161e8269d3c21bcecceda1000000613c42565b30600090815260016020526040902054111561164f576116488269d3c21bcecceda1000000613c42565b9050611661565b50306000908152600160205260409020545b61166a81612f36565b5050565b6116766121cd565b614e208163ffffffff1611156116ce5760405162461bcd60e51b815260206004820152601f60248201527f4c55434b593a204d6178696d756d2073656c6c20746178206f66203230252e0060448201526064016109bd565b600c805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b6116fc6121cd565b600d54600160e81b900460ff16156117565760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e00000000000000000060448201526064016109bd565b600e80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155611794308269d3c21bcecceda1000000612075565b806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f69190613bf6565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118679190613bf6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156118cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f09190613bf6565b600c80546001600160a01b039283166001600160a01b031991821681178355600090815260036020526040808220805461ff0019908116610100908117909255945460078054600181810183557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68891820180548916948b169490941790935589891680875294862080549098169093179096558554908101865594909252920180549091169091179055600e541663f305d71947306119ae816111e0565b6000806119c36000546001600160a01b031690565b60405160e088901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015611a43573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a689190613c56565b5050600d8054600a8054600160e01b60ff60e01b199091161790557eff00ff0000000000000000ffffffffffffffffffffffffffffffffffffffff167f0100010000000001000000280000000000000000000000000000000000000000179055506009805463ffffffff60a01b1916600160a01b63ffffffff431602179055600c54600e5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611b3d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166a9190613bc2565b611b696121cd565b6009805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b611b966121cd565b6001600160a01b038116600090815260036020526040902054610100900460ff16611c035760405162461bcd60e51b815260206004820152601860248201527f4c75636b79546f61643a204e6f74206578636c756465642e000000000000000060448201526064016109bd565b60005b60075481101561166a57816001600160a01b031660078281548110611c2d57611c2d613b7b565b6000918252602090912001546001600160a01b03161415611d0a5760078054611c5890600190613bdf565b81548110611c6857611c68613b7b565b600091825260209091200154600780546001600160a01b039092169183908110611c9457611c94613b7b565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600390915260409020805461ff00191690556007805480611ce457611ce4613c84565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80611d1481613ba7565b915050611c06565b611d246121cd565b614e208163ffffffff161115611d7c5760405162461bcd60e51b815260206004820152601e60248201527f4c55434b593a204d6178696d756d2062757920746178206f66203230252e000060448201526064016109bd565b600c805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b600a546001600160a01b0316336001600160a01b031614611e115760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f6e6c7920646576656c6f7065722063616e2073657420746860448201526234b99760e91b60648201526084016109bd565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b611e3b6121cd565b600a8054911515600160e81b027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b611e7c6121cd565b600d8054911515600160f81b027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b611ebc6121cd565b6001600160a01b038116600090815260036020526040902054610100900460ff1615611f2a5760405162461bcd60e51b815260206004820152601c60248201527f4c75636b79546f61643a20416c7265616479206578636c756465642e0000000060448201526064016109bd565b6001600160a01b03166000818152600360205260408120805461ff0019166101001790556007805460018101825591527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b611f976121cd565b6001600160a01b03166000908152600360205260409020805460ff19169055565b611fc06121cd565b6001600160a01b03811661203c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109bd565b610ecb81612dcd565b61204d6121cd565b6001600160a01b03166000908152600360205260409020805462ff0000191662010000179055565b6001600160a01b0383166120f05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b03821661216c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b031633146112035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109bd565b6001600160a01b0383166122a35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b03821661231f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b600081116123955760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f000000000000000000000000000000000000000000000060648201526084016109bd565b600d805460ff60e01b191690556000806123b76000546001600160a01b031690565b6001600160a01b0316856001600160a01b0316141580156123e657506000546001600160a01b03858116911614155b80156123fb57506001600160a01b0385163014155b801561242057506001600160a01b03841660009081526003602052604090205460ff16155b801561244557506001600160a01b03851660009081526003602052604090205460ff16155b15612883576001600160a01b03841660009081526003602052604090205462010000900460ff1615801561249857506001600160a01b03851660009081526003602052604090205462010000900460ff16155b6124e45760405162461bcd60e51b815260206004820152600860248201527f4e6f20626f74732e00000000000000000000000000000000000000000000000060448201526064016109bd565b600c546001600160a01b03868116911614801561250f5750600e546001600160a01b03858116911614155b15612648575050600c54600b54600a54600160a01b90920463ffffffff90811692600160c01b9092041690600160e01b900460ff16156125f7576001600160a01b03841660009081526003602052604090205463ffffffff640100000000909104164314156125c05760405162461bcd60e51b815260206004820152601860248201527f4c55434b593a204f6e652074782070657220626c6f636b2e000000000000000060448201526064016109bd565b6001600160a01b0384166000908152600360205260409020805467ffffffff0000000019166401000000004363ffffffff16021790555b600954439061261590600290600160a01b900463ffffffff16613c9a565b63ffffffff16111561263957600d805460ff60e01b1916600160e01b17905561288a565b61264384846130b9565b61288a565b600c546001600160a01b0385811691161480156126735750600e546001600160a01b03868116911614155b1561286a57600d5461269c90600160a01b900463ffffffff1669d3c21bcecceda1000000613c42565b8311156126f75760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f766572206d6178207472616e73616374696f6e20616d6f75604482015262373a1760e91b60648201526084016109bd565b600a54600160e01b900460ff1615612793576001600160a01b03851660009081526003602052604090205463ffffffff640100000000909104164314156127805760405162461bcd60e51b815260206004820152601860248201527f4c55434b593a204f6e652074782070657220626c6f636b2e000000000000000060448201526064016109bd565b6001600160a01b03851660005260036020525b306000908152600160205260408120546009549091906127ca90600160c01b900463ffffffff1669d3c21bcecceda1000000613c42565b600d54908310159150600160f81b900460ff1680156127e65750805b80156127fc5750600d54600160f01b900460ff16155b801561280b575061280b6131d4565b1561284257600954849061283f9061283a90600160c01b900463ffffffff1669d3c21bcecceda1000000613c42565b612f36565b93505b5050600c54600b5463ffffffff600160c01b90920482169350600160e01b900416905061288a565b5050600c54600160e01b900463ffffffff16600061288a565b5060009050805b610c9b85858585856128c3565b600081848411156128bb5760405162461bcd60e51b81526004016109bd91906138fb565b505050900390565b6000806000600d601c9054906101000a900460ff161561296057600192506128eb8387613bdf565b6001600160a01b038816600090815260036020908152604080832080546bffffffff00000000000000001916680100000000000000004363ffffffff16021790556001909152902054909250612942908490613cc2565b6001600160a01b038816600090815260046020526040902055612988565b61296b8686866131ef565b90925090508061297b8388613bdf565b6129859190613bdf565b92505b612992888761323a565b8015612ad257306000908152600160205260409020546129b3908290613cc2565b30600081815260016020526040908190209290925590516001600160a01b038a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a049085815260200190565b60405180910390a36000612a178261327e565b90506000612a258a8661340c565b90506001600160a01b03811615612acf576000816001600160a01b031661c35084604051600060405180830381858888f193505050503d8060008114612a87576040519150601f19603f3d011682016040523d82523d6000602084013e612a8c565b606091505b505090508015612acd5760405183906001600160a01b038416907ff4602bf74bc0808c000ea3c3531aa0628829c00ef77831486ca770d12832d99c90600090a35b505b50505b612adc87846135fe565b866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612b2191815260200190565b60405180910390a35050505050505050565b604080516002808252606082018352839260009291906020830190803683370190505090508281600081518110612b6c57612b6c613b7b565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be99190613bf6565b81600181518110612bfc57612bfc613b7b565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201526000918416906370a0823190602401602060405180830381865afa158015612c51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c759190613c13565b600e5460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925084169063095ea7b3906044016020604051808303816000875af1158015612cca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cee9190613bc2565b50600e5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612d28908490600090879030904290600401613cda565b600060405180830381600087803b158015612d4257600080fd5b505af1158015612d56573d6000803e3d6000fd5b5050505050505050565b6001600160a01b03811660009081526003602052604081205463ffffffff6801000000000000000090910416431415612daf57506001600160a01b031660009081526004602052604090205490565b6001600160a01b0382166000908152600160205260409020546111eb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80471015612e6d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109bd565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612eba576040519150601f19603f3d011682016040523d82523d6000602084013e612ebf565b606091505b50509050806112a95760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109bd565b600d805460ff60f01b1916600160f01b1790556040805160028082526060820183526000926020830190803683370190505090503081600081518110612f7e57612f7e613b7b565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612fd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffb9190613bf6565b8160018151811061300e5761300e613b7b565b6001600160a01b039283166020918202929092010152600e546130349130911684612075565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061306d908590600090869030904290600401613cda565b600060405180830381600087803b15801561308757600080fd5b505af115801561309b573d6000803e3d6000fd5b505050506130a84761378a565b5050600d805460ff60f01b19169055565b600d546130dd90600160a01b900463ffffffff1669d3c21bcecceda1000000613c42565b8111156131385760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f766572206d6178207472616e73616374696f6e20616d6f75604482015262373a1760e91b60648201526084016109bd565b600d5461315c90600160c01b900463ffffffff1669d3c21bcecceda1000000613c42565b8161317c846001600160a01b031660009081526001602052604090205490565b6131869190613cc2565b111561166a5760405162461bcd60e51b815260206004820152601e60248201527f4c55434b593a204f766572206d61782077616c6c657420616d6f756e742e000060448201526064016109bd565b600954600090600160e01b900463ffffffff165a1015905090565b600080620186a061320663ffffffff861687613d16565b6132109190613c42565b9150620186a061322663ffffffff851687613d16565b6132309190613c42565b9050935093915050565b6001600160a01b03821660009081526001602052604090205461325e908290613bdf565b6001600160a01b0390921660009081526001602052604090209190915550565b600d805460ff60f01b1916600160f01b1790556040805160028082526060820183526000928392919060208301908036833701905050905030816000815181106132ca576132ca613b7b565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133479190613bf6565b8160018151811061335a5761335a613b7b565b6001600160a01b039283166020918202929092010152600e546133809130911685612075565b600e5460405163791ac94760e01b815247916001600160a01b03169063791ac947906133b9908790600090879030904290600401613cda565b600060405180830381600087803b1580156133d357600080fd5b505af11580156133e7573d6000803e3d6000fd5b5050505080476133f79190613bdf565b600d805460ff60f01b19169055949350505050565b600080613417613865565b6001600160a01b03851660009081526001602052604081205491925090849061344a9069d3c21bcecceda1000000613bdf565b6134549190613bdf565b905060005b6007548110156134bd57600160006007838154811061347a5761347a613b7b565b60009182526020808320909101546001600160a01b031683528201929092526040019020546134a99083613bdf565b9150806134b581613ba7565b915050613459565b5060006134ca8284613d35565b90506000805b6008548110156135f357876001600160a01b0316600882815481106134f7576134f7613b7b565b6000918252602090912001546001600160a01b031614806135595750600360006008838154811061352a5761352a613b7b565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff610100909104165b15613563576135e1565b61359e6008828154811061357957613579613b7b565b60009182526020808320909101546001600160a01b0316825260019052604090205490565b6135a89083613cc2565b9150828211156135e157600881815481106135c5576135c5613b7b565b6000918252602090912001546001600160a01b031695506135f3565b806135eb81613ba7565b9150506134d0565b505050505092915050565b6001600160a01b0382166000908152600360205260409020546301000000900460ff1661376657600854600110156136f05760085460009061364290600190613bdf565b61364a613865565b6136549190613d35565b9050600880828154811061366a5761366a613b7b565b60009182526020808320909101548354600181018555938352912090910180546001600160a01b0319166001600160a01b0390921691909117905560088054849190839081106136bc576136bc613b7b565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505061373c565b600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600360205260409020805463ff000000191663010000001790555b6001600160a01b03821660009081526001602052604090205461325e908290613cc2565b600b54600a5460009163ffffffff600160a01b918290048116926137bb928104821691600160c01b90910416613c9a565b6137c59190613c9a565b600954600a54919250613809916001600160a01b039091169063ffffffff808516916137fa91600160c01b9091041686613d16565b6138049190613c42565b612e1d565b600a54613837906001600160a01b0381169063ffffffff808516916137fa91600160a01b9091041686613d16565b600b5461166a906001600160a01b0381169063ffffffff808516916137fa91600160a01b9091041686613d16565b6000613872600143613bdf565b6040805191406020830152016040516020818303038152906040528051906020012060001c905090565b5080546000825590600052602060002090810190610ecb91905b808211156138ca57600081556001016138b6565b5090565b6000602082840312156138e057600080fd5b813563ffffffff811681146138f457600080fd5b9392505050565b600060208083528351808285015260005b818110156139285785810183015185820160400152820161390c565b8181111561393a576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610ecb57600080fd5b6000806040838503121561397857600080fd5b823561398381613950565b946020939093013593505050565b6000602082840312156139a357600080fd5b81356138f481613950565b60008083601f8401126139c057600080fd5b50813567ffffffffffffffff8111156139d857600080fd5b6020830191508360208260051b85010111156139f357600080fd5b9250929050565b60008060008060408587031215613a1057600080fd5b843567ffffffffffffffff80821115613a2857600080fd5b613a34888389016139ae565b90965094506020870135915080821115613a4d57600080fd5b50613a5a878288016139ae565b95989497509550505050565b600080600060608486031215613a7b57600080fd5b8335613a8681613950565b92506020840135613a9681613950565b929592945050506040919091013590565b600081518084526020808501945080840160005b83811015613ae05781516001600160a01b031687529582019590820190600101613abb565b509495945050505050565b6020815260006138f46020830184613aa7565b8015158114610ecb57600080fd5b600060208284031215613b1e57600080fd5b81356138f481613afe565b600060208284031215613b3b57600080fd5b5035919050565b60008060408385031215613b5557600080fd5b8235613b6081613950565b91506020830135613b7081613950565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613bbb57613bbb613b91565b5060010190565b600060208284031215613bd457600080fd5b81516138f481613afe565b600082821015613bf157613bf1613b91565b500390565b600060208284031215613c0857600080fd5b81516138f481613950565b600060208284031215613c2557600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082613c5157613c51613c2c565b500490565b600080600060608486031215613c6b57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fd5b600063ffffffff808316818516808303821115613cb957613cb9613b91565b01949350505050565b60008219821115613cd557613cd5613b91565b500190565b85815284602082015260a060408201526000613cf960a0830186613aa7565b6001600160a01b0394909416606083015250608001529392505050565b6000816000190483118215151615613d3057613d30613b91565b500290565b600082613d4457613d44613c2c565b50069056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212207af59e563aff78ed0ac948c768078380ea7a9cae58e44c9cf91978c71d15777664736f6c634300080b0033

Deployed Bytecode Sourcemap

95094:30572:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120533:89;;;;;;;;;;-1:-1:-1;120533:89:0;;;;;:::i;:::-;;:::i;:::-;;100511:83;;;;;;;;;;-1:-1:-1;100581:5:0;;;;;;;;;;;;;;;;;100511:83;;;;;;;:::i;:::-;;;;;;;;101417:193;;;;;;;;;;-1:-1:-1;101417:193:0;;;;;:::i;:::-;;:::i;:::-;;;1541:14:1;;1534:22;1516:41;;1504:2;1489:18;101417:193:0;1376:187:1;120247:171:0;;;;;;;;;;-1:-1:-1;120247:171:0;;;;;:::i;:::-;;:::i;108981:116::-;;;;;;;;;;-1:-1:-1;108981:116:0;;;;;:::i;:::-;;:::i;100788:95::-;;;;;;;;;;-1:-1:-1;95477:24:0;100788:95;;;1966:25:1;;;1954:2;1939:18;100788:95:0;1820:177:1;109243:126:0;;;;;;;;;;-1:-1:-1;109243:126:0;;;;;:::i;:::-;;:::i;119149:357::-;;;;;;;;;;-1:-1:-1;119149:357:0;;;;;:::i;:::-;;:::i;101618:446::-;;;;;;;;;;-1:-1:-1;101618:446:0;;;;;:::i;:::-;;:::i;111971:107::-;;;;;;;;;;-1:-1:-1;111971:107:0;;;;;:::i;:::-;;:::i;100697:83::-;;;;;;;;;;-1:-1:-1;100697:83:0;;95419:1;3755:36:1;;3743:2;3728:18;100697:83:0;3613:184:1;123492:273:0;;;;;;;;;;-1:-1:-1;123492:273:0;;;;;:::i;:::-;;:::i;111162:479::-;;;;;;;;;;;;;:::i;121184:104::-;;;;;;;;;;-1:-1:-1;121184:104:0;;;;;:::i;:::-;;:::i;106149:108::-;;;;;;;;;;-1:-1:-1;106149:108:0;;;;;:::i;:::-;;:::i;117427:127::-;;;;;;;;;;-1:-1:-1;117427:127:0;;;;;:::i;:::-;;:::i;108374:109::-;;;;;;;;;;-1:-1:-1;108374:109:0;;;;;:::i;:::-;;:::i;124156:112::-;;;;;;;;;;-1:-1:-1;124156:112:0;;;;;:::i;:::-;;:::i;123178:109::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;117184:140::-;;;;;;;;;;-1:-1:-1;117184:140:0;;;;;:::i;:::-;-1:-1:-1;;;;;117273:24:0;117249:4;117273:24;;;:15;:24;;;;;:43;;;;117184:140;123826:279;;;;;;;;;;-1:-1:-1;123826:279:0;;;;;:::i;:::-;;:::i;102177:101::-;;;;;;;;;;-1:-1:-1;102177:101:0;;;;;:::i;:::-;;:::i;123295:108::-;;;;;;;;;;;;;:::i;108138:101::-;;;;;;;;;;-1:-1:-1;108138:101:0;;;;;:::i;:::-;;:::i;100891:119::-;;;;;;;;;;-1:-1:-1;100891:119:0;;;;;:::i;:::-;;:::i;21667:103::-;;;;;;;;;;;;;:::i;124931:393::-;;;;;;;;;;-1:-1:-1;124931:393:0;;;;;:::i;:::-;;:::i;125396:265::-;;;;;;;;;;;;;:::i;21019:87::-;;;;;;;;;;-1:-1:-1;21065:7:0;21092:6;21019:87;;-1:-1:-1;;;;;21092:6:0;;;5072:74:1;;5060:2;5045:18;21019:87:0;4926:226:1;100602:87:0;;;;;;;;;;-1:-1:-1;100674:7:0;;;;;;;;;;;;;;;;;100602:87;;120747:101;;;;;;;;;;-1:-1:-1;120747:101:0;;;;;:::i;:::-;;:::i;101018:199::-;;;;;;;;;;-1:-1:-1;101018:199:0;;;;;:::i;:::-;;:::i;112707:327::-;;;;;;;;;;-1:-1:-1;112707:327:0;;;;;:::i;:::-;;:::i;119943:159::-;;;;;;;;;;-1:-1:-1;119943:159:0;;;;;:::i;:::-;;:::i;109697:1457::-;;;;;;;;;;;;;:::i;112367:96::-;;;;;;;;;;-1:-1:-1;112367:96:0;;;;;:::i;:::-;;:::i;118270:701::-;;;;;;;;;;-1:-1:-1;118270:701:0;;;;;:::i;:::-;;:::i;119646:156::-;;;;;;;;;;-1:-1:-1;119646:156:0;;;;;:::i;:::-;;:::i;101225:184::-;;;;;;;;;;-1:-1:-1;101225:184:0;;;;;:::i;:::-;-1:-1:-1;;;;;101374:18:0;;;101342:7;101374:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;101225:184;109514:118;;;;;;;;;;-1:-1:-1;109514:118:0;;;;;:::i;:::-;;:::i;120965:108::-;;;;;;;;;;-1:-1:-1;120965:108:0;;;;;:::i;:::-;;:::i;105916:104::-;;;;;;;;;;-1:-1:-1;105916:104:0;;;;;:::i;:::-;;:::i;117885:283::-;;;;;;;;;;-1:-1:-1;117885:283:0;;;;;:::i;:::-;;:::i;117653:126::-;;;;;;;;;;-1:-1:-1;117653:126:0;;;;;:::i;:::-;;:::i;21925:201::-;;;;;;;;;;-1:-1:-1;21925:201:0;;;;;:::i;:::-;;:::i;111752:106::-;;;;;;;;;;-1:-1:-1;111752:106:0;;;;;:::i;:::-;;:::i;120533:89::-;98639:15;;-1:-1:-1;;;;;98639:15:0;9445:10;-1:-1:-1;;;;;98623:31:0;;98615:79;;;;-1:-1:-1;;;98615:79:0;;5937:2:1;98615:79:0;;;5919:21:1;5976:2;5956:18;;;5949:30;6015:34;5995:18;;;5988:62;-1:-1:-1;;;6066:18:1;;;6059:33;6109:19;;98615:79:0;;;;;;;;;120597:8:::1;:17:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;120597:17:0::1;-1:-1:-1::0;;;;120597:17:0;;::::1;::::0;;;::::1;::::0;;120533:89::o;101417:193::-;101519:4;101541:39;9445:10;101564:7;101573:6;101541:8;:39::i;:::-;-1:-1:-1;101598:4:0;101417:193;;;;:::o;120247:171::-;20905:13;:11;:13::i;:::-;120334:5:::1;120324:6;:15;;;;120316:63;;;::::0;-1:-1:-1;;;120316:63:0;;6341:2:1;120316:63:0::1;::::0;::::1;6323:21:1::0;6380:2;6360:18;;;6353:30;6419:34;6399:18;;;6392:62;6490:5;6470:18;;;6463:33;6513:19;;120316:63:0::1;6139:399:1::0;120316:63:0::1;120390:11;:20:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;120390:20:0::1;-1:-1:-1::0;;;;;120390:20:0;;::::1;::::0;;;::::1;::::0;;120247:171::o;108981:116::-;20905:13;:11;:13::i;:::-;109053:15:::1;:36:::0;;-1:-1:-1;;;;;;109053:36:0::1;-1:-1:-1::0;;;;;109053:36:0;;;::::1;::::0;;;::::1;::::0;;108981:116::o;109243:126::-;98454:11;;-1:-1:-1;;;;;98454:11:0;9445:10;98454:27;98432:127;;;;-1:-1:-1;;;98432:127:0;;6745:2:1;98432:127:0;;;6727:21:1;6784:2;6764:18;;;6757:30;6823:34;6803:18;;;6796:62;-1:-1:-1;;;6874:18:1;;;6867:48;6932:19;;98432:127:0;6543:414:1;98432:127:0;109325:15:::1;:36:::0;;-1:-1:-1;;;;;;109325:36:0::1;-1:-1:-1::0;;;;;109325:36:0;;;::::1;::::0;;;::::1;::::0;;109243:126::o;119149:357::-;20905:13;:11;:13::i;:::-;119263:25;;::::1;119255:58;;;::::0;-1:-1:-1;;;119255:58:0;;7164:2:1;119255:58:0::1;::::0;::::1;7146:21:1::0;7203:2;7183:18;;;7176:30;7242:22;7222:18;;;7215:50;7282:18;;119255:58:0::1;6962:344:1::0;119255:58:0::1;119328:6;119324:175;119340:15:::0;;::::1;119324:175;;;119434:3;;119438:1;119434:6;;;;;;;:::i;:::-;;;;;;;119409:13;:22;119423:4;;119428:1;119423:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;119409:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;119409:22:0;:31;119455:18:::1;119479:4:::0;;119484:1;119479:7;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;119455:32:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;119455:32:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;119455:32:0::1;-1:-1:-1::0;;;;;119455:32:0;;::::1;::::0;;;::::1;::::0;;119357:3;::::1;::::0;::::1;:::i;:::-;;;;119324:175;;;;119149:357:::0;;;;:::o;101618:446::-;101750:4;101767:36;101777:6;101785:9;101796:6;101767:9;:36::i;:::-;101814:220;101837:6;9445:10;101885:138;101941:6;101885:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;101885:19:0;;;;;;:11;:19;;;;;;;;9445:10;101885:33;;;;;;;;;;:37;:138::i;:::-;101814:8;:220::i;:::-;-1:-1:-1;102052:4:0;101618:446;;;;;:::o;111971:107::-;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;112033:23:0::1;112065:5;112033:23:::0;;;:15:::1;:23;::::0;;;;:37;;-1:-1:-1;;112033:37:0::1;::::0;;111971:107::o;123492:273::-;98454:11;;123644:4;;-1:-1:-1;;;;;98454:11:0;9445:10;98454:27;98432:127;;;;-1:-1:-1;;;98432:127:0;;6745:2:1;98432:127:0;;;6727:21:1;6784:2;6764:18;;;6757:30;6823:34;6803:18;;;6796:62;-1:-1:-1;;;6874:18:1;;;6867:48;6932:19;;98432:127:0;6543:414:1;98432:127:0;123721:36:::1;::::0;-1:-1:-1;;;123721:36:0;;-1:-1:-1;;;;;8021:55:1;;;123721:36:0::1;::::0;::::1;8003:74:1::0;8093:18;;;8086:34;;;123689:13:0;;123721:19;;::::1;::::0;::::1;::::0;7976:18:1;;123721:36:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;123714:43:::0;123492:273;-1:-1:-1;;;;;123492:273:0:o;111162:479::-;20905:13;:11;:13::i;:::-;111283:18:::1;:25:::0;111322:15;;111319:315:::1;;111358:6;111354:229;111374:11;111370:1;:15;111354:229;;;111411:12;111426:18;111445:1;111426:21;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;111426:21:0::1;111499:19:::0;;;:13:::1;:19:::0;;;;;;;111426:21;;-1:-1:-1;111466:59:0::1;::::0;111481:10:::1;::::0;111426:21;;;111466:14:::1;:59::i;:::-;-1:-1:-1::0;;;;;111544:19:0::1;111566:1;111544:19:::0;;;:13:::1;:19;::::0;;;;:23;111387:3;::::1;::::0;::::1;:::i;:::-;;;;111354:229;;;-1:-1:-1::0;111597:25:0::1;111604:18;;111597:25;:::i;:::-;111209:432;111162:479::o:0;121184:104::-;20905:13;:11;:13::i;:::-;121258::::1;:22:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;121258:22:0::1;-1:-1:-1::0;;;;;121258:22:0;;::::1;::::0;;;::::1;::::0;;121184:104::o;106149:108::-;20905:13;:11;:13::i;:::-;106225:14:::1;:24:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;106225:24:0::1;-1:-1:-1::0;;;;106225:24:0;;::::1;::::0;;;::::1;::::0;;106149:108::o;117427:127::-;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;117496:24:0::1;;::::0;;;:15:::1;:24;::::0;;;;:50;;-1:-1:-1;;117496:50:0::1;117542:4;117496:50;::::0;;117427:127::o;108374:109::-;20905:13;:11;:13::i;:::-;108449:16:::1;:26:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;108449:26:0::1;-1:-1:-1::0;;;;108449:26:0;;::::1;::::0;;;::::1;::::0;;108374:109::o;124156:112::-;98454:11;;-1:-1:-1;;;;;98454:11:0;9445:10;98454:27;98432:127;;;;-1:-1:-1;;;98432:127:0;;6745:2:1;98432:127:0;;;6727:21:1;6784:2;6764:18;;;6757:30;6823:34;6803:18;;;6796:62;-1:-1:-1;;;6874:18:1;;;6867:48;6932:19;;98432:127:0;6543:414:1;98432:127:0;124240:20:::1;124246:13;124240:5;:20::i;123178:109::-:0;123226:16;123262:17;123255:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;123255:24:0;;;;;;;;;;;;;;;;;;;;;;;123178:109;:::o;123826:279::-;98454:11;;123981:4;;-1:-1:-1;;;;;98454:11:0;9445:10;98454:27;98432:127;;;;-1:-1:-1;;;98432:127:0;;6745:2:1;98432:127:0;;;6727:21:1;6784:2;6764:18;;;6757:30;6823:34;6803:18;;;6796:62;-1:-1:-1;;;6874:18:1;;;6867:48;6932:19;;98432:127:0;6543:414:1;98432:127:0;124058:39:::1;::::0;;;;-1:-1:-1;;;;;8021:55:1;;;124058:39:0::1;::::0;::::1;8003:74:1::0;8093:18;;;8086:34;;;124026:13:0;;124058:20;;::::1;::::0;::::1;::::0;7976:18:1;;124058:39:0::1;7829:297:1::0;102177:101:0;20905:13;:11;:13::i;:::-;102247:15:::1;:23:::0;;;::::1;;-1:-1:-1::0;;;102247:23:0::1;-1:-1:-1::0;;;;102247:23:0;;::::1;::::0;;;::::1;::::0;;102177:101::o;123295:108::-;123343:16;123379;123372:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;123372:23:0;;;;;;;;;;;;;;;;;;;;;;123295:108;:::o;108138:101::-;20905:13;:11;:13::i;:::-;108209:12:::1;:22:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;108209:22:0::1;-1:-1:-1::0;;;;108209:22:0;;::::1;::::0;;;::::1;::::0;;108138:101::o;100891:119::-;100957:7;100984:18;100994:7;100984:9;:18::i;:::-;100977:25;100891:119;-1:-1:-1;;100891:119:0:o;21667:103::-;20905:13;:11;:13::i;:::-;21732:30:::1;21759:1;21732:18;:30::i;:::-;21667:103::o:0;124931:393::-;98454:11;;-1:-1:-1;;;;;98454:11:0;9445:10;98454:27;98432:127;;;;-1:-1:-1;;;98432:127:0;;6745:2:1;98432:127:0;;;6727:21:1;6784:2;6764:18;;;6757:30;6823:34;6803:18;;;6796:62;-1:-1:-1;;;6874:18:1;;;6867:48;6932:19;;98432:127:0;6543:414:1;98432:127:0;125062:21:::1;125094:20;125100:13:::0;125094:5:::1;:20::i;:::-;125125:11;125139:30;125163:6:::0;125139:21:::1;:30;:::i;:::-;125298:11;::::0;125125:44;;-1:-1:-1;125272:44:0::1;::::0;-1:-1:-1;;;;;125298:11:0::1;125125:44:::0;125272:17:::1;:44::i;:::-;125034:290;;124931:393:::0;:::o;125396:265::-;98454:11;;-1:-1:-1;;;;;98454:11:0;9445:10;98454:27;98432:127;;;;-1:-1:-1;;;98432:127:0;;6745:2:1;98432:127:0;;;6727:21:1;6784:2;6764:18;;;6757:30;6823:34;6803:18;;;6796:62;-1:-1:-1;;;6874:18:1;;;6867:48;6932:19;;98432:127:0;6543:414:1;98432:127:0;125486:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;125486:22:0;;;;125467:10:::1;::::0;-1:-1:-1;;;;;125486:15:0::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;125467:42;;125520:14;125544:15;;;;;;;;;-1:-1:-1::0;;;;;125544:15:0::1;-1:-1:-1::0;;;;;125544:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;125592:32;::::0;-1:-1:-1;;;125592:32:0;;125618:4:::1;125592:32;::::0;::::1;5072:74:1::0;125520:47:0;;-1:-1:-1;125578:11:0::1;::::0;-1:-1:-1;;;;;125592:17:0;::::1;::::0;::::1;::::0;5045:18:1;;125592:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;125635:18;::::0;;;;::::1;::::0;::::1;1966:25:1::0;;;125578:46:0;;-1:-1:-1;;;;;;125635:13:0;::::1;::::0;::::1;::::0;1939:18:1;;125635::0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;125456:205;;;125396:265::o:0;120747:101::-;98639:15;;-1:-1:-1;;;;;98639:15:0;9445:10;-1:-1:-1;;;;;98623:31:0;;98615:79;;;;-1:-1:-1;;;98615:79:0;;5937:2:1;98615:79:0;;;5919:21:1;5976:2;5956:18;;;5949:30;6015:34;5995:18;;;5988:62;-1:-1:-1;;;6066:18:1;;;6059:33;6109:19;;98615:79:0;5735:399:1;98615:79:0;120817:14:::1;:23:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;120817:23:0::1;-1:-1:-1::0;;;;120817:23:0;;::::1;::::0;;;::::1;::::0;;120747:101::o;101018:199::-;101123:4;101145:42;9445:10;101169:9;101180:6;101145:9;:42::i;112707:327::-;98200:15;;-1:-1:-1;;;;;98200:15:0;9445:10;-1:-1:-1;;;;;98184:31:0;;:79;;;-1:-1:-1;98248:15:0;;-1:-1:-1;;;;;98248:15:0;9445:10;-1:-1:-1;;;;;98232:31:0;;98184:79;:127;;;-1:-1:-1;98296:15:0;;-1:-1:-1;;;;;98296:15:0;9445:10;-1:-1:-1;;;;;98280:31:0;;98184:127;:167;;;-1:-1:-1;21065:7:0;21092:6;-1:-1:-1;;;;;21092:6:0;9445:10;98328:23;98184:167;98162:200;;;;;;112815:12:::1;112871:15;112879:7:::0;95477:24:::1;112871:15;:::i;:::-;112862:4;113345:7:::0;113372:16;;;:11;:16;;;;;;112842:44:::1;112838:165;;;112910:15;112918:7:::0;95477:24:::1;112910:15;:::i;:::-;112903:22;;112838:165;;;-1:-1:-1::0;112985:4:0::1;113345:7:::0;113372:16;;;:11;:16;;;;;;112838:165:::1;113013:13;113021:4;113013:7;:13::i;:::-;112767:267;112707:327:::0;:::o;119943:159::-;20905:13;:11;:13::i;:::-;120026:5:::1;120016:6;:15;;;;120008:59;;;::::0;-1:-1:-1;;;120008:59:0;;9472:2:1;120008:59:0::1;::::0;::::1;9454:21:1::0;9511:2;9491:18;;;9484:30;9550:33;9530:18;;;9523:61;9601:18;;120008:59:0::1;9270:355:1::0;120008:59:0::1;120078:7;:16:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;120078:16:0::1;-1:-1:-1::0;;;;120078:16:0;;::::1;::::0;;;::::1;::::0;;119943:159::o;109697:1457::-;20905:13;:11;:13::i;:::-;109757:11:::1;::::0;-1:-1:-1;;;109757:11:0;::::1;;;109756:12;109748:48;;;::::0;-1:-1:-1;;;109748:48:0;;9832:2:1;109748:48:0::1;::::0;::::1;9814:21:1::0;9871:2;9851:18;;;9844:30;9910:25;9890:18;;;9883:53;9953:18;;109748:48:0::1;9630:347:1::0;109748:48:0::1;109942:15;:34:::0;;-1:-1:-1;;;;;;109942:34:0::1;109878:42;109942:34:::0;;::::1;::::0;;;109987:58:::1;110004:4;109878:42:::0;95477:24:::1;109987:8;:58::i;:::-;110090:16;-1:-1:-1::0;;;;;110090:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;110072:70:0::1;;110151:4;110158:16;-1:-1:-1::0;;;;;110158:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;110072:110;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;10235:15:1;;;110072:110:0::1;::::0;::::1;10217:34:1::0;10287:15;;10267:18;;;10260:43;10129:18;;110072:110:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;110056:13;:126:::0;;-1:-1:-1;;;;;110056:126:0;;::::1;-1:-1:-1::0;;;;;;110056:126:0;;::::1;::::0;::::1;::::0;;:13:::1;110225:39:::0;;;:15:::1;:39;::::0;;;;;:68;;-1:-1:-1;;110225:68:0;;::::1;110056:126;110225:68:::0;;::::1;::::0;;;110334:13;;110304:16:::1;:45:::0;;110056:126;110304:45;;::::1;::::0;;;;;::::1;::::0;;;::::1;110334:13:::0;;::::1;110304:45:::0;;;::::1;::::0;;;110417:42;;::::1;::::0;;;;;;:71;;;;::::1;::::0;;::::1;::::0;;;110499:48;;;;::::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;110558:15:::1;::::0;::::1;:31;110597:21;110642:4;110662:24;110642:4:::0;110662:9:::1;:24::i;:::-;110701:1;110717::::0;110733:7:::1;21065::::0;21092:6;-1:-1:-1;;;;;21092:6:0;;21019:87;110733:7:::1;110558:223;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;10696:15:1;;;110558:223:0::1;::::0;::::1;10678:34:1::0;10728:18;;;10721:34;;;;10771:18;;;10764:34;;;;10814:18;;;10807:34;10878:15;;;10857:19;;;10850:44;110755:15:0::1;10910:19:1::0;;;10903:35;10589:19;;110558:223:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;110792:11:0::1;:18:::0;;110821:15:::1;:22:::0;;-1:-1:-1;;;;;;;110821:22:0;;::::1;;::::0;;110963:18;;;;;;-1:-1:-1;110992:9:0::1;:32:::0;;-1:-1:-1;;;;110992:32:0::1;-1:-1:-1::0;;;110878:17:0::1;111011:12;110992:32;;;::::0;;111042:13:::1;::::0;111087:15:::1;::::0;111035:111:::1;::::0;-1:-1:-1;;;111035:111:0;;-1:-1:-1;;;;;111087:15:0;;::::1;-1:-1:-1::0;111035:111:0;::::1;8003:74:1::0;-1:-1:-1;;8093:18:1;;;8086:34;111042:13:0;::::1;::::0;111035:29:::1;::::0;7976:18:1;;111035:111:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;112367:96::-:0;20905:13;:11;:13::i;:::-;112431:15:::1;:24:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;112431:24:0::1;-1:-1:-1::0;;;;;112431:24:0;;::::1;::::0;;;::::1;::::0;;112367:96::o;118270:701::-;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;118348:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;:46;::::1;::::0;::::1;;;118340:83;;;::::0;-1:-1:-1;;;118340:83:0;;11462:2:1;118340:83:0::1;::::0;::::1;11444:21:1::0;11501:2;11481:18;;;11474:30;11540:26;11520:18;;;11513:54;11584:18;;118340:83:0::1;11260:348:1::0;118340:83:0::1;118439:9;118434:530;118458:16;:23:::0;118454:27;::::1;118434:530;;;118530:7;-1:-1:-1::0;;;;;118507:30:0::1;:16;118524:1;118507:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;118507:19:0::1;:30;118503:450;;;118674:16;118691:23:::0;;:27:::1;::::0;118717:1:::1;::::0;118691:27:::1;:::i;:::-;118674:45;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;118652:16:::1;:19:::0;;-1:-1:-1;;;;;118674:45:0;;::::1;::::0;118669:1;;118652:19;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:67:::0;;-1:-1:-1;;;;;;118652:67:0::1;-1:-1:-1::0;;;;;118652:67:0;;::::1;;::::0;;118771:24;;::::1;::::0;;:15:::1;:24:::0;;;;;;:54;;-1:-1:-1;;118771:54:0::1;::::0;;118891:16:::1;:22:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;118891:22:0;;;;;-1:-1:-1;;;;;;118891:22:0::1;::::0;;;;;112767:267:::1;112707:327:::0;:::o;118503:450::-:1;118483:3:::0;::::1;::::0;::::1;:::i;:::-;;;;118434:530;;119646:156:::0;20905:13;:11;:13::i;:::-;119728:5:::1;119718:6;:15;;;;119710:58;;;::::0;-1:-1:-1;;;119710:58:0;;12004:2:1;119710:58:0::1;::::0;::::1;11986:21:1::0;12043:2;12023:18;;;12016:30;12082:32;12062:18;;;12055:60;12132:18;;119710:58:0::1;11802:354:1::0;119710:58:0::1;119779:6;:15:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;119779:15:0::1;-1:-1:-1::0;;;;119779:15:0;;::::1;::::0;;;::::1;::::0;;119646:156::o;109514:118::-;98639:15;;-1:-1:-1;;;;;98639:15:0;9445:10;-1:-1:-1;;;;;98623:31:0;;98615:79;;;;-1:-1:-1;;;98615:79:0;;5937:2:1;98615:79:0;;;5919:21:1;5976:2;5956:18;;;5949:30;6015:34;5995:18;;;5988:62;-1:-1:-1;;;6066:18:1;;;6059:33;6109:19;;98615:79:0;5735:399:1;98615:79:0;109592:11:::1;:32:::0;;-1:-1:-1;;;;;;109592:32:0::1;-1:-1:-1::0;;;;;109592:32:0;;;::::1;::::0;;;::::1;::::0;;109514:118::o;120965:108::-;20905:13;:11;:13::i;:::-;121034:23:::1;:31:::0;;;::::1;;-1:-1:-1::0;;;121034:31:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;120965:108::o;105916:104::-;20905:13;:11;:13::i;:::-;105991:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;105991:21:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;105916:104::o;117885:283::-;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;117966:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;:46;::::1;::::0;::::1;;;117965:47;117957:88;;;::::0;-1:-1:-1;;;117957:88:0;;12363:2:1;117957:88:0::1;::::0;::::1;12345:21:1::0;12402:2;12382:18;;;12375:30;12441;12421:18;;;12414:58;12489:18;;117957:88:0::1;12161:352:1::0;117957:88:0::1;-1:-1:-1::0;;;;;118056:24:0::1;;::::0;;;:15:::1;:24;::::0;;;;:53;;-1:-1:-1;;118056:53:0::1;;;::::0;;118120:16:::1;:30:::0;;118105:4:::1;118120:30:::0;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;118120:30:0::1;::::0;;::::1;::::0;;117885:283::o;117653:126::-;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;117720:24:0::1;117766:5;117720:24:::0;;;:15:::1;:24;::::0;;;;:51;;-1:-1:-1;;117720:51:0::1;::::0;;117653:126::o;21925:201::-;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;22014:22:0;::::1;22006:73;;;::::0;-1:-1:-1;;;22006:73:0;;12720:2:1;22006:73:0::1;::::0;::::1;12702:21:1::0;12759:2;12739:18;;;12732:30;12798:34;12778:18;;;12771:62;12869:8;12849:18;;;12842:36;12895:19;;22006:73:0::1;12518:402:1::0;22006:73:0::1;22090:28;22109:8;22090:18;:28::i;111752:106::-:0;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;111814:23:0::1;;::::0;;;:15:::1;:23;::::0;;;;:36;;-1:-1:-1;;111814:36:0::1;::::0;::::1;::::0;;111752:106::o;102286:369::-;-1:-1:-1;;;;;102413:19:0;;102405:68;;;;-1:-1:-1;;;102405:68:0;;13127:2:1;102405:68:0;;;13109:21:1;13166:2;13146:18;;;13139:30;13205:34;13185:18;;;13178:62;13276:6;13256:18;;;13249:34;13300:19;;102405:68:0;12925:400:1;102405:68:0;-1:-1:-1;;;;;102492:21:0;;102484:68;;;;-1:-1:-1;;;102484:68:0;;13532:2:1;102484:68:0;;;13514:21:1;13571:2;13551:18;;;13544:30;13610:34;13590:18;;;13583:62;13681:4;13661:18;;;13654:32;13703:19;;102484:68:0;13330:398:1;102484:68:0;-1:-1:-1;;;;;102563:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;102615:32;;1966:25:1;;;102615:32:0;;1939:18:1;102615:32:0;;;;;;;102286:369;;;:::o;21184:132::-;21065:7;21092:6;-1:-1:-1;;;;;21092:6:0;9445:10;21248:23;21240:68;;;;-1:-1:-1;;;21240:68:0;;13935:2:1;21240:68:0;;;13917:21:1;;;13954:18;;;13947:30;14013:34;13993:18;;;13986:62;14065:18;;21240:68:0;13733:356:1;102665:3131:0;-1:-1:-1;;;;;102787:18:0;;102779:68;;;;-1:-1:-1;;;102779:68:0;;14296:2:1;102779:68:0;;;14278:21:1;14335:2;14315:18;;;14308:30;14374:34;14354:18;;;14347:62;14445:7;14425:18;;;14418:35;14470:19;;102779:68:0;14094:401:1;102779:68:0;-1:-1:-1;;;;;102866:16:0;;102858:64;;;;-1:-1:-1;;;102858:64:0;;14702:2:1;102858:64:0;;;14684:21:1;14741:2;14721:18;;;14714:30;14780:34;14760:18;;;14753:62;14851:5;14831:18;;;14824:33;14874:19;;102858:64:0;14500:399:1;102858:64:0;102950:1;102941:6;:10;102933:64;;;;-1:-1:-1;;;102933:64:0;;15106:2:1;102933:64:0;;;15088:21:1;15145:2;15125:18;;;15118:30;15184:34;15164:18;;;15157:62;15255:11;15235:18;;;15228:39;15284:19;;102933:64:0;14904:405:1;102933:64:0;103008:5;:13;;-1:-1:-1;;;;103008:13:0;;;103016:5;;103113:7;21065;21092:6;-1:-1:-1;;;;;21092:6:0;;21019:87;103113:7;-1:-1:-1;;;;;103105:15:0;:4;-1:-1:-1;;;;;103105:15:0;;;:45;;;;-1:-1:-1;21065:7:0;21092:6;-1:-1:-1;;;;;103137:13:0;;;21092:6;;103137:13;;103105:45;:83;;;;-1:-1:-1;;;;;;103167:21:0;;103183:4;103167:21;;103105:83;:139;;;;-1:-1:-1;;;;;;103206:19:0;;;;;;:15;:19;;;;;:38;;;103205:39;103105:139;:197;;;;-1:-1:-1;;;;;;103262:21:0;;;;;;:15;:21;;;;;:40;;;103261:41;103105:197;103087:2636;;;-1:-1:-1;;;;;103338:19:0;;;;;;:15;:19;;;;;:25;;;;;;103337:26;:58;;;;-1:-1:-1;;;;;;103368:21:0;;;;;;:15;:21;;;;;:27;;;;;;103367:28;103337:58;103329:79;;;;-1:-1:-1;;;103329:79:0;;15516:2:1;103329:79:0;;;15498:21:1;15555:1;15535:18;;;15528:29;15593:10;15573:18;;;15566:38;15621:18;;103329:79:0;15314:331:1;103329:79:0;103458:13;;-1:-1:-1;;;;;103450:21:0;;;103458:13;;103450:21;:55;;;;-1:-1:-1;103489:15:0;;-1:-1:-1;;;;;103475:30:0;;;103489:15;;103475:30;;103450:55;103446:2108;;;-1:-1:-1;;103572:6:0;;103610:12;;103644:15;;-1:-1:-1;;;103572:6:0;;;;;;;;-1:-1:-1;;;103610:12:0;;;;;-1:-1:-1;;;103644:15:0;;;;103641:315;;;-1:-1:-1;;;;;103781:19:0;;;;;;:15;:19;;;;;:32;;;;;;;103817:12;103781:48;;103773:85;;;;-1:-1:-1;;;103773:85:0;;15852:2:1;103773:85:0;;;15834:21:1;15891:2;15871:18;;;15864:30;15930:26;15910:18;;;15903:54;15974:18;;103773:85:0;15650:348:1;103773:85:0;-1:-1:-1;;;;;103881:19:0;;;;;;:15;:19;;;;;:55;;-1:-1:-1;;103881:55:0;;103923:12;103881:55;;;;;;103641:315;104026:9;;104044:12;;104026:15;;95349:1;;-1:-1:-1;;;104026:9:0;;;;:15;:::i;:::-;:30;;;104023:189;;;104109:5;:12;;-1:-1:-1;;;;104109:12:0;-1:-1:-1;;;104109:12:0;;;103087:2636;;104023:189;104170:22;104181:2;104185:6;104170:10;:22::i;:::-;103087:2636;;103446:2108;104243:13;;-1:-1:-1;;;;;104237:19:0;;;104243:13;;104237:19;:55;;;;-1:-1:-1;104276:15:0;;-1:-1:-1;;;;;104260:32:0;;;104276:15;;104260:32;;104237:55;104233:1321;;;104421:12;;104413:20;;-1:-1:-1;;;104421:12:0;;;;95477:24;104413:20;:::i;:::-;104403:6;:30;;104395:78;;;;-1:-1:-1;;;104395:78:0;;16438:2:1;104395:78:0;;;16420:21:1;16477:2;16457:18;;;16450:30;16516:34;16496:18;;;16489:62;-1:-1:-1;;;16567:18:1;;;16560:33;16610:19;;104395:78:0;16236:399:1;104395:78:0;104580:15;;-1:-1:-1;;;104580:15:0;;;;104577:223;;;-1:-1:-1;;;;;104628:21:0;;;;;;:15;:21;;;;;:34;;;;;;;104666:12;104628:50;;104620:87;;;;-1:-1:-1;;;104620:87:0;;15852:2:1;104620:87:0;;;15834:21:1;15891:2;15871:18;;;15864:30;15930:26;15910:18;;;15903:54;15974:18;;104620:87:0;15650:348:1;104620:87:0;-1:-1:-1;;;;;104730:21:0;;;;:15;:21;;104577:223;104952:4;104901:28;113372:16;;;:11;:16;;;;;;105030:14;;113372:16;;104901:28;105022:22;;-1:-1:-1;;;105030:14:0;;;;95477:24;105022:22;:::i;:::-;105071:11;;104998:46;;;;;-1:-1:-1;;;;105071:11:0;;;;:22;;;;;105086:7;105071:22;:33;;;;-1:-1:-1;105098:6:0;;-1:-1:-1;;;105098:6:0;;;;105097:7;105071:33;:50;;;;;105108:13;:11;:13::i;:::-;105067:231;;;105216:14;;105166:7;;105200:31;;105208:22;;-1:-1:-1;;;105216:14:0;;;;95477:24;105208:22;:::i;:::-;105200:7;:31::i;:::-;105268:6;-1:-1:-1;105067:231:0;-1:-1:-1;;105371:7:0;;105410:13;;105371:7;-1:-1:-1;;;105371:7:0;;;;;;-1:-1:-1;;;;105410:13:0;;;;-1:-1:-1;103087:2636:0;;104233:1321;-1:-1:-1;;105494:11:0;;-1:-1:-1;;;105494:11:0;;;;105537:1;103087:2636;;;-1:-1:-1;105681:1:0;;-1:-1:-1;105681:1:0;103087:2636;105735:53;105750:4;105756:2;105760:6;105768:7;105777:10;105735:14;:53::i;17865:240::-;17985:7;18046:12;18038:6;;;;18030:29;;;;-1:-1:-1;;;18030:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;18081:5:0;;;17865:240::o;113479:2270::-;113660:22;113693:17;113721:20;113783:5;;;;;;;;;;;113779:563;;;113869:1;;-1:-1:-1;113897:21:0;113869:1;113897:6;:21;:::i;:::-;-1:-1:-1;;;;;113970:26:0;;;;;;:15;:26;;;;;;;;:58;;-1:-1:-1;;113970:58:0;;114015:12;113970:58;;;;;;-1:-1:-1;114067:22:0;;;;;;113885:33;;-1:-1:-1;114067:39:0;;114092:14;;114067:39;:::i;:::-;-1:-1:-1;;;;;114043:21:0;;;;;;:10;:21;;;;;:63;113779:563;;;114207:46;114225:6;114233:7;114242:10;114207:17;:46::i;:::-;114179:74;;-1:-1:-1;114179:74:0;-1:-1:-1;114179:74:0;114287:16;114179:74;114287:6;:16;:::i;:::-;:29;;;;:::i;:::-;114270:46;;113779:563;114419:30;114434:6;114442;114419:14;:30::i;:::-;114473:16;;114470:1037;;114672:4;114652:26;;;;:11;:26;;;;;;:41;;114681:12;;114652:41;:::i;:::-;114643:4;114623:26;;;;:11;:26;;;;;;;:70;;;;114713:45;;-1:-1:-1;;;;;114713:45:0;;;;;;;114745:12;1966:25:1;;1954:2;1939:18;;1820:177;114713:45:0;;;;;;;;114885:16;114904:24;114915:12;114904:10;:24::i;:::-;114885:43;;114978:14;114995:38;115010:6;115018:14;114995;:38::i;:::-;114978:55;-1:-1:-1;;;;;;115051:61:0;;;115048:446;;115311:12;115328:6;-1:-1:-1;;;;;115328:11:0;115345:5;115359:8;115328:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;115310:62;;;115394:7;115391:88;;;115431:28;;115450:8;;-1:-1:-1;;;;;115431:28:0;;;;;;;;115391:88;115114:380;115048:446;114491:1016;;114470:1037;115579:36;115589:9;115600:14;115579:9;:36::i;:::-;115705:9;-1:-1:-1;;;;;115688:43:0;115697:6;-1:-1:-1;;;;;115688:43:0;;115716:14;115688:43;;;;1966:25:1;;1954:2;1939:18;;1820:177;115688:43:0;;;;;;;;113649:2100;;;113479:2270;;;;;:::o;124372:551::-;124487:16;;;124501:1;124487:16;;;;;;;;124448:3;;124420:18;;124487:16;124501:1;124487:16;;;;;;;;;;-1:-1:-1;124487:16:0;124463:40;;124524:3;124514:4;124519:1;124514:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;124514:13:0;;;:7;;;;;;;;;;:13;;;;124548:15;;:22;;;-1:-1:-1;;;124548:22:0;;;;:15;;;;;:20;;:22;;;;;124514:7;;124548:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;124538:4;124543:1;124538:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;124538:32:0;;;:7;;;;;;;;;:32;124603:36;;-1:-1:-1;;;124603:36:0;;124633:4;124603:36;;;5072:74:1;124581:19:0;;124603:21;;;;;5045:18:1;;124603:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;124678:15;;124650:58;;-1:-1:-1;;;124650:58:0;;-1:-1:-1;;;;;124678:15:0;;;124650:58;;;8003:74:1;8093:18;;;8086:34;;;124581:58:0;;-1:-1:-1;124650:19:0;;;;;7976:18:1;;124650:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;124719:15:0;;:196;;-1:-1:-1;;;124719:196:0;;-1:-1:-1;;;;;124719:15:0;;;;:66;;:196;;124800:11;;124719:15;;124842:4;;124869;;124889:15;;124719:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124409:514;;;124372:551;:::o;113044:237::-;-1:-1:-1;;;;;113122:20:0;;113098:7;113122:20;;;:15;:20;;;;;:29;;;;;;;113155:12;113122:45;113118:156;;;-1:-1:-1;;;;;;113191:15:0;;;;;:10;:15;;;;;;;113044:237::o;113118:156::-;-1:-1:-1;;;;;113372:16:0;;113345:7;113372:16;;;:11;:16;;;;;;113246;113289:107;22286:191;22360:16;22379:6;;-1:-1:-1;;;;;22396:17:0;;;-1:-1:-1;;;;;;22396:17:0;;;;;;22429:40;;22379:6;;;;;;;22429:40;;22360:16;22429:40;22349:128;22286:191;:::o;2592:317::-;2707:6;2682:21;:31;;2674:73;;;;-1:-1:-1;;;2674:73:0;;17984:2:1;2674:73:0;;;17966:21:1;18023:2;18003:18;;;17996:30;18062:31;18042:18;;;18035:59;18111:18;;2674:73:0;17782:353:1;2674:73:0;2761:12;2779:9;-1:-1:-1;;;;;2779:14:0;2801:6;2779:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2760:52;;;2831:7;2823:78;;;;-1:-1:-1;;;2823:78:0;;18342:2:1;2823:78:0;;;18324:21:1;18381:2;18361:18;;;18354:30;18420:34;18400:18;;;18393:62;18491:28;18471:18;;;18464:56;18537:19;;2823:78:0;18140:422:1;106271:569:0;106328:6;:13;;-1:-1:-1;;;;106328:13:0;-1:-1:-1;;;106328:13:0;;;106376:16;;;106390:1;106376:16;;;;;;;;-1:-1:-1;;106376:16:0;;;;;;;;;;-1:-1:-1;106376:16:0;106352:40;;106421:4;106403;106408:1;106403:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;106403:23:0;;;:7;;;;;;;;;;:23;;;;106447:15;;:22;;;-1:-1:-1;;;106447:22:0;;;;:15;;;;;:20;;:22;;;;;106403:7;;106447:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106437:4;106442:1;106437:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;106437:32:0;;;:7;;;;;;;;;:32;106512:15;;106480:62;;106497:4;;106512:15;106530:11;106480:8;:62::i;:::-;106555:15;;:196;;-1:-1:-1;;;106555:196:0;;-1:-1:-1;;;;;106555:15:0;;;;:66;;:196;;106636:11;;106555:15;;106678:4;;106705;;106725:15;;106555:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106772:35;106785:21;106772:12;:35::i;:::-;-1:-1:-1;;106818:6:0;:14;;-1:-1:-1;;;;106818:14:0;;;106271:569::o;108491:359::-;108624:12;;108616:20;;-1:-1:-1;;;108624:12:0;;;;95477:24;108616:20;:::i;:::-;108606:6;:30;;108598:78;;;;-1:-1:-1;;;108598:78:0;;16438:2:1;108598:78:0;;;16420:21:1;16477:2;16457:18;;;16450:30;16516:34;16496:18;;;16489:62;-1:-1:-1;;;16567:18:1;;;16560:33;16610:19;;108598:78:0;16236:399:1;108598:78:0;108768:16;;108760:24;;-1:-1:-1;;;108768:16:0;;;;95477:24;108760;:::i;:::-;108750:6;108732:15;108744:2;-1:-1:-1;;;;;113372:16:0;113345:7;113372:16;;;:11;:16;;;;;;;113289:107;108732:15;:24;;;;:::i;:::-;:52;;108710:132;;;;-1:-1:-1;;;108710:132:0;;18769:2:1;108710:132:0;;;18751:21:1;18808:2;18788:18;;;18781:30;18847:32;18827:18;;;18820:60;18897:18;;108710:132:0;18567:354:1;112086:161:0;112224:15;;112131:4;;-1:-1:-1;;;112224:15:0;;;;112211:9;:28;;112204:35;;112086:161;:::o;116849:222::-;116950:11;;117012:6;116996:15;;;;:7;:15;:::i;:::-;:22;;;;:::i;:::-;116990:28;-1:-1:-1;117057:6:0;117038:18;;;;:7;:18;:::i;:::-;:25;;;;:::i;:::-;117029:34;;116849:222;;;;;;:::o;115794:136::-;-1:-1:-1;;;;;115893:20:0;;;;;;:11;:20;;;;;;:29;;115916:6;;115893:29;:::i;:::-;-1:-1:-1;;;;;115870:20:0;;;;;;;:11;:20;;;;;:52;;;;-1:-1:-1;115794:136:0:o;106848:646::-;106937:6;:13;;-1:-1:-1;;;;106937:13:0;-1:-1:-1;;;106937:13:0;;;106985:16;;;106999:1;106985:16;;;;;;;;-1:-1:-1;;;;106985:16:0;106999:1;106985:16;;;;;;;;;;-1:-1:-1;106985:16:0;106961:40;;107030:4;107012;107017:1;107012:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;107012:23:0;;;:7;;;;;;;;;;:23;;;;107056:15;;:22;;;-1:-1:-1;;;107056:22:0;;;;:15;;;;;:20;;:22;;;;;107012:7;;107056:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;107046:4;107051:1;107046:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;107046:32:0;;;:7;;;;;;;;;:32;107121:15;;107089:62;;107106:4;;107121:15;107139:11;107089:8;:62::i;:::-;107211:15;;:196;;-1:-1:-1;;;107211:196:0;;107179:21;;-1:-1:-1;;;;;107211:15:0;;:66;;:196;;107292:11;;107162:14;;107334:4;;107361;;107381:15;;107211:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107453:6;107429:21;:30;;;;:::i;:::-;107470:6;:14;;-1:-1:-1;;;;107470:14:0;;;107418:41;106848:646;-1:-1:-1;;;;106848:646:0:o;121530:1642::-;121616:14;121775:15;121793:16;:14;:16::i;:::-;-1:-1:-1;;;;;122052:19:0;;122022:17;122052:19;;;:11;:19;;;;;;121775:34;;-1:-1:-1;122022:17:0;122074:14;;122042:29;;95477:24;122042:29;:::i;:::-;:46;;;;:::i;:::-;122022:66;;122104:9;122099:178;122123:16;:23;122119:27;;122099:178;;;122233:11;:32;122245:16;122262:1;122245:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;122245:19:0;122233:32;;;;;;;;;;;;;122221:44;;:9;:44;:::i;:::-;122209:56;-1:-1:-1;122148:3:0;;;;:::i;:::-;;;;122099:178;;;-1:-1:-1;122505:14:0;122522:19;122532:9;122522:7;:19;:::i;:::-;122505:36;;122594:24;122638:9;122633:530;122657:17;:24;122653:28;;122633:530;;;122793:6;-1:-1:-1;;;;;122769:30:0;:17;122787:1;122769:20;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;122769:20:0;:30;;:93;;;122803:15;:37;122819:17;122837:1;122819:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;122819:20:0;122803:37;;;;;;;;;;;;:59;;122819:20;122803:59;;;;122769:93;122766:141;;;122883:8;;122766:141;122959:33;122971:17;122989:1;122971:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;122971:20:0;113372:16;;:11;:16;;;;;;;113289:107;122959:33;122940:52;;:16;:52;:::i;:::-;122921:71;;123029:6;123010:16;:25;123007:145;;;123092:17;123110:1;123092:20;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;123092:20:0;;-1:-1:-1;123131:5:0;;123007:145;122683:3;;;;:::i;:::-;;;;122633:530;;;;121632:1540;;;;121530:1642;;;;:::o;116017:824::-;-1:-1:-1;;;;;116092:24:0;;;;;;:15;:24;;;;;:40;;;;;;116088:683;;116302:17;:24;116329:1;-1:-1:-1;116299:349:0;;;116386:17;:24;116351:12;;116386:26;;116411:1;;116386:26;:::i;:::-;116366:16;:14;:16::i;:::-;:47;;;;:::i;:::-;116351:62;;116432:17;116455;116473:4;116455:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;116432:47;;116455:23;116432:47;;;;;;;;;;;;;;-1:-1:-1;;;;;;116432:47:0;-1:-1:-1;;;;;116455:23:0;;;116432:47;;;;;;116498:17;:23;;116524:7;;116498:17;116516:4;;116498:23;;;;;;:::i;:::-;;;;;;;;;:33;;;;;-1:-1:-1;;;;;116498:33:0;;;;;-1:-1:-1;;;;;116498:33:0;;;;;;116332:215;116299:349;;;116601:17;:31;;;;;;;-1:-1:-1;116601:31:0;;;;;;;;-1:-1:-1;;;;;;116601:31:0;-1:-1:-1;;;;;116601:31:0;;;;;116299:349;-1:-1:-1;;;;;116712:24:0;;;;;;:15;:24;;;;;:47;;-1:-1:-1;;116712:47:0;;;;;116088:683;-1:-1:-1;;;;;116804:20:0;;;;;;:11;:20;;;;;;:29;;116827:6;;116804:29;:::i;107502:503::-;107707:12;;107696:8;;107662:14;;107707:12;-1:-1:-1;;;107707:12:0;;;;;;;107679:25;;107696:8;;;;;-1:-1:-1;;;107679:14:0;;;;:25;:::i;:::-;:40;;;;:::i;:::-;107770:15;;107794:14;;107662:57;;-1:-1:-1;107752:65:0;;-1:-1:-1;;;;;107770:15:0;;;;107787:29;;;;;:21;;-1:-1:-1;;;107794:14:0;;;;107787:6;:21;:::i;:::-;:29;;;;:::i;:::-;107752:17;:65::i;:::-;107862:15;;107844:59;;-1:-1:-1;;;;;107862:15:0;;;107879:23;;;;;:15;;-1:-1:-1;;;107886:8:0;;;;107879:6;:15;:::i;107844:59::-;107952:15;;107934:63;;-1:-1:-1;;;;;107952:15:0;;;107969:27;;;;;:19;;-1:-1:-1;;;107976:12:0;;;;107969:6;:19;:::i;121373:149::-;121421:14;121496;121509:1;121496:12;:14;:::i;:::-;121475:37;;;121486:25;;121475:37;;;1966:25:1;1939:18;121475:37:0;;;;;;;;;;;;121465:48;;;;;;121457:57;;121448:66;;121373:149;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:276:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;199:61;279:5;14:276;-1:-1:-1;;;14:276:1:o;295:597::-;407:4;436:2;465;454:9;447:21;497:6;491:13;540:6;535:2;524:9;520:18;513:34;565:1;575:140;589:6;586:1;583:13;575:140;;;684:14;;;680:23;;674:30;650:17;;;669:2;646:26;639:66;604:10;;575:140;;;733:6;730:1;727:13;724:91;;;803:1;798:2;789:6;778:9;774:22;770:31;763:42;724:91;-1:-1:-1;876:2:1;855:15;-1:-1:-1;;851:29:1;836:45;;;;883:2;832:54;;295:597;-1:-1:-1;;;295:597:1:o;897:154::-;-1:-1:-1;;;;;976:5:1;972:54;965:5;962:65;952:93;;1041:1;1038;1031:12;1056:315;1124:6;1132;1185:2;1173:9;1164:7;1160:23;1156:32;1153:52;;;1201:1;1198;1191:12;1153:52;1240:9;1227:23;1259:31;1284:5;1259:31;:::i;:::-;1309:5;1361:2;1346:18;;;;1333:32;;-1:-1:-1;;;1056:315:1:o;1568:247::-;1627:6;1680:2;1668:9;1659:7;1655:23;1651:32;1648:52;;;1696:1;1693;1686:12;1648:52;1735:9;1722:23;1754:31;1779:5;1754:31;:::i;2002:367::-;2065:8;2075:6;2129:3;2122:4;2114:6;2110:17;2106:27;2096:55;;2147:1;2144;2137:12;2096:55;-1:-1:-1;2170:20:1;;2213:18;2202:30;;2199:50;;;2245:1;2242;2235:12;2199:50;2282:4;2274:6;2270:17;2258:29;;2342:3;2335:4;2325:6;2322:1;2318:14;2310:6;2306:27;2302:38;2299:47;2296:67;;;2359:1;2356;2349:12;2296:67;2002:367;;;;;:::o;2374:773::-;2496:6;2504;2512;2520;2573:2;2561:9;2552:7;2548:23;2544:32;2541:52;;;2589:1;2586;2579:12;2541:52;2629:9;2616:23;2658:18;2699:2;2691:6;2688:14;2685:34;;;2715:1;2712;2705:12;2685:34;2754:70;2816:7;2807:6;2796:9;2792:22;2754:70;:::i;:::-;2843:8;;-1:-1:-1;2728:96:1;-1:-1:-1;2931:2:1;2916:18;;2903:32;;-1:-1:-1;2947:16:1;;;2944:36;;;2976:1;2973;2966:12;2944:36;;3015:72;3079:7;3068:8;3057:9;3053:24;3015:72;:::i;:::-;2374:773;;;;-1:-1:-1;3106:8:1;-1:-1:-1;;;;2374:773:1:o;3152:456::-;3229:6;3237;3245;3298:2;3286:9;3277:7;3273:23;3269:32;3266:52;;;3314:1;3311;3304:12;3266:52;3353:9;3340:23;3372:31;3397:5;3372:31;:::i;:::-;3422:5;-1:-1:-1;3479:2:1;3464:18;;3451:32;3492:33;3451:32;3492:33;:::i;:::-;3152:456;;3544:7;;-1:-1:-1;;;3598:2:1;3583:18;;;;3570:32;;3152:456::o;3802:484::-;3855:3;3893:5;3887:12;3920:6;3915:3;3908:19;3946:4;3975:2;3970:3;3966:12;3959:19;;4012:2;4005:5;4001:14;4033:1;4043:218;4057:6;4054:1;4051:13;4043:218;;;4122:13;;-1:-1:-1;;;;;4118:62:1;4106:75;;4201:12;;;;4236:15;;;;4079:1;4072:9;4043:218;;;-1:-1:-1;4277:3:1;;3802:484;-1:-1:-1;;;;;3802:484:1:o;4291:261::-;4470:2;4459:9;4452:21;4433:4;4490:56;4542:2;4531:9;4527:18;4519:6;4490:56;:::i;4557:118::-;4643:5;4636:13;4629:21;4622:5;4619:32;4609:60;;4665:1;4662;4655:12;4680:241;4736:6;4789:2;4777:9;4768:7;4764:23;4760:32;4757:52;;;4805:1;4802;4795:12;4757:52;4844:9;4831:23;4863:28;4885:5;4863:28;:::i;5157:180::-;5216:6;5269:2;5257:9;5248:7;5244:23;5240:32;5237:52;;;5285:1;5282;5275:12;5237:52;-1:-1:-1;5308:23:1;;5157:180;-1:-1:-1;5157:180:1:o;5342:388::-;5410:6;5418;5471:2;5459:9;5450:7;5446:23;5442:32;5439:52;;;5487:1;5484;5477:12;5439:52;5526:9;5513:23;5545:31;5570:5;5545:31;:::i;:::-;5595:5;-1:-1:-1;5652:2:1;5637:18;;5624:32;5665:33;5624:32;5665:33;:::i;:::-;5717:7;5707:17;;;5342:388;;;;;:::o;7311:184::-;-1:-1:-1;;;7360:1:1;7353:88;7460:4;7457:1;7450:15;7484:4;7481:1;7474:15;7500:184;-1:-1:-1;;;7549:1:1;7542:88;7649:4;7646:1;7639:15;7673:4;7670:1;7663:15;7689:135;7728:3;-1:-1:-1;;7749:17:1;;7746:43;;;7769:18;;:::i;:::-;-1:-1:-1;7816:1:1;7805:13;;7689:135::o;8131:245::-;8198:6;8251:2;8239:9;8230:7;8226:23;8222:32;8219:52;;;8267:1;8264;8257:12;8219:52;8299:9;8293:16;8318:28;8340:5;8318:28;:::i;8381:125::-;8421:4;8449:1;8446;8443:8;8440:34;;;8454:18;;:::i;:::-;-1:-1:-1;8491:9:1;;8381:125::o;8511:251::-;8581:6;8634:2;8622:9;8613:7;8609:23;8605:32;8602:52;;;8650:1;8647;8640:12;8602:52;8682:9;8676:16;8701:31;8726:5;8701:31;:::i;8767:184::-;8837:6;8890:2;8878:9;8869:7;8865:23;8861:32;8858:52;;;8906:1;8903;8896:12;8858:52;-1:-1:-1;8929:16:1;;8767:184;-1:-1:-1;8767:184:1:o;8956:::-;-1:-1:-1;;;9005:1:1;8998:88;9105:4;9102:1;9095:15;9129:4;9126:1;9119:15;9145:120;9185:1;9211;9201:35;;9216:18;;:::i;:::-;-1:-1:-1;9250:9:1;;9145:120::o;10949:306::-;11037:6;11045;11053;11106:2;11094:9;11085:7;11081:23;11077:32;11074:52;;;11122:1;11119;11112:12;11074:52;11151:9;11145:16;11135:26;;11201:2;11190:9;11186:18;11180:25;11170:35;;11245:2;11234:9;11230:18;11224:25;11214:35;;10949:306;;;;;:::o;11613:184::-;-1:-1:-1;;;11662:1:1;11655:88;11762:4;11759:1;11752:15;11786:4;11783:1;11776:15;16003:228;16042:3;16070:10;16107:2;16104:1;16100:10;16137:2;16134:1;16130:10;16168:3;16164:2;16160:12;16155:3;16152:21;16149:47;;;16176:18;;:::i;:::-;16212:13;;16003:228;-1:-1:-1;;;;16003:228:1:o;16640:128::-;16680:3;16711:1;16707:6;16704:1;16701:13;16698:39;;;16717:18;;:::i;:::-;-1:-1:-1;16753:9:1;;16640:128::o;17172:605::-;17471:6;17460:9;17453:25;17514:6;17509:2;17498:9;17494:18;17487:34;17557:3;17552:2;17541:9;17537:18;17530:31;17434:4;17578:57;17630:3;17619:9;17615:19;17607:6;17578:57;:::i;:::-;-1:-1:-1;;;;;17671:55:1;;;;17666:2;17651:18;;17644:83;-1:-1:-1;17758:3:1;17743:19;17736:35;17570:65;17172:605;-1:-1:-1;;;17172:605:1:o;18926:168::-;18966:7;19032:1;19028;19024:6;19020:14;19017:1;19014:21;19009:1;19002:9;18995:17;18991:45;18988:71;;;19039:18;;:::i;:::-;-1:-1:-1;19079:9:1;;18926:168::o;19099:112::-;19131:1;19157;19147:35;;19162:18;;:::i;:::-;-1:-1:-1;19196:9:1;;19099:112::o

Swarm Source

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