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

Token

Ape Intelligence (ApeIn)
 

Overview

Max Total Supply

100,000,000 ApeIn

Holders

99

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
zakk-chad.eth
Balance
0.19 ApeIn

Value
$0.00
0x8dd9b6187aec29de92a33947136508e11cad358b
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:
ApeIntelligence

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : apein.sol
pragma solidity ^0.8.17;

interface IUniswapRouter01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapRouter02 is IUniswapRouter01 {

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

interface IFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

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

    function allPairs(uint256) external view returns (address pair);

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

}

abstract contract Context {
    //function _msgSender() internal view virtual returns (address payable) {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(
                oldAllowance >= value,
                "SafeERC20: decreased allowance below zero"
            );
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(
                token,
                abi.encodeWithSelector(
                    token.approve.selector,
                    spender,
                    newAllowance
                )
            );
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(msg.sender, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            msg.sender,
            spender,
            allowance(msg.sender, spender) + addedValue
        );
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        uint256 currentAllowance = allowance(msg.sender, spender);
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(msg.sender, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

interface IUniswapV2Pair {
    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );
}

contract ApeIntelligence is ERC20, Ownable {
    address payable public marketingFeeAddress;
    address payable public devFeeAddress;

    mapping(address => bool) public isExcludedFromFee;

    uint16 public buyLiquidityFee = 10;
    uint16 public buyMarketingFee = 35;
    uint16 public buyDevFee = 5;

    uint16 public sellLiquidityFee = 100;
    uint16 public sellMarketingFee = 600;
    uint16 public sellDevFee = 299;

    uint256 private _liquidityTokensToSwap;
    uint256 private _marketingFeeTokensToSwap;
    uint256 private _devFeeTokens;

    uint256 private lpTokens;
    address deployer;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) public botWallet;
    uint256 public minLpBeforeSwapping;

    IUniswapRouter02 public immutable uniswapRouter;
    address public immutable uniswapPair;

    bool inSwapAndLiquify;

    uint256 public maxWallet;

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    // for handling stuck eth/tokens on the contract after renouncing ownership
    modifier onlyDeployer() {
        require(msg.sender == deployer, "You are not the deployer");
        _;
    }

    constructor() ERC20("Ape Intelligence", "ApeIn") {
        uint256 startingSupply = 1e8 * 10**decimals(); // 1e8 = 8 zeroes, which is 100,000,000
        _mint(msg.sender, startingSupply);
        maxWallet = startingSupply / 100; // 1% of total supply

        marketingFeeAddress = payable(
            0x63fE8B48e2b050a54B7B31c1DA7071BaEB35b40E
        );
        devFeeAddress = payable(0x0fb9A6A9df829f9c107Fad679dF6E90504032602);

        minLpBeforeSwapping = 100; // this means: 100 / 10000 = 1% of the liquidity pool is the threshold before swapping
        // uniswap v2 router
        address routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        uniswapRouter = IUniswapRouter02(payable(routerAddress));

        uniswapPair = IFactory(uniswapRouter.factory()).createPair(
            address(this),
            uniswapRouter.WETH()
        );

        isExcludedFromFee[msg.sender] = true;
        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[marketingFeeAddress] = true;
        isExcludedFromFee[devFeeAddress] = true;
        isExcludedFromFee[routerAddress] = true;

        deployer = msg.sender;
        _approve(msg.sender, routerAddress, ~uint256(0));
        _setAutomatedMarketMakerPair(uniswapPair, true);
        _approve(address(this), address(uniswapRouter), type(uint256).max);
    }

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

    function addBotWallet(address wallet) external onlyOwner {
        require(!botWallet[wallet], "Wallet already added");
        botWallet[wallet] = true;
    }

    function addBotWalletBulk(address[] calldata wallets) external onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            botWallet[wallets[i]] = true;
        }
    }

    function removeBotWallet(address wallet) external onlyOwner {
        require(botWallet[wallet], "Wallet not added");
        botWallet[wallet] = false;
    }

    function updateMaxWallet(uint256 maxWallet_) external onlyOwner {
        maxWallet = maxWallet_;
    }

    function burn(uint256 amount) external {
        _burn(msg.sender, amount);
    }

    function updateMinLpBeforeSwapping(uint256 minLpBeforeSwapping_)
        external
        onlyOwner
    {
        minLpBeforeSwapping = minLpBeforeSwapping_;
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        external
        onlyOwner
    {
        require(pair != uniswapPair, "The pair cannot be removed");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;
    }

    function excludeFromFee(address account) external onlyOwner {
        isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) external onlyOwner {
        isExcludedFromFee[account] = false;
    }

    function updateBuyFee(
        uint16 _buyLiquidityFee,
        uint16 _buyMarketingFee,
        uint16 _buyDevFee
    ) external onlyOwner {
        buyLiquidityFee = _buyLiquidityFee;
        buyMarketingFee = _buyMarketingFee;
        buyDevFee = _buyDevFee;
    }

    function updateSellFee(
        uint16 _sellLiquidityFee,
        uint16 _sellMarketingFee,
        uint16 _sellDevFee
    ) external onlyOwner {
        sellLiquidityFee = _sellLiquidityFee;
        sellMarketingFee = _sellMarketingFee;
        sellDevFee = _sellDevFee;
    }

    function updateMarketingAddress(address marketingFeeAddress_)
        external
        onlyOwner
    {
        require(marketingFeeAddress_ != address(0), "Can't set 0");
        marketingFeeAddress = payable(marketingFeeAddress_);
    }

    function updateDevAddress(address devFeeAddress_)
        external
        onlyOwner
    {
        require(devFeeAddress_ != address(0), "Can't set 0");
        devFeeAddress = payable(devFeeAddress_);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(!botWallet[from] && !botWallet[to], "Bot wallet");
        checkLiquidity();

        if (
            hasLiquidity && !inSwapAndLiquify && automatedMarketMakerPairs[to]
        ) {
            uint256 contractTokenBalance = balanceOf(address(this));
            uint256 threshold = (lpTokens * minLpBeforeSwapping) / 10000;
            if (contractTokenBalance >= threshold) takeFee(threshold);
        }

        uint256 _liquidityFee;
        uint256 _marketingFee;
        uint256 _devFee;

        if (!isExcludedFromFee[from] && !isExcludedFromFee[to]) {
            // Buy
            if (automatedMarketMakerPairs[from]) {
                _liquidityFee = (amount * buyLiquidityFee) / 1000;
                _marketingFee = (amount * buyMarketingFee) / 1000;
                _devFee = (amount * buyDevFee) / 1000;
                require(
                    balanceOf(to) + amount <= maxWallet,
                    "Amount exceeds maxWallet"
                );
            }
            // Sell
            else if (automatedMarketMakerPairs[to]) {
                _liquidityFee = (amount * sellLiquidityFee) / 1000;
                _marketingFee = (amount * sellMarketingFee) / 1000;
                _devFee = (amount * sellDevFee) / 1000;
            } else {
                require(
                    balanceOf(to) + amount <= maxWallet,
                    "Amount exceeds maxWallet"
                );
            }
        }

        uint256 _feeTotal =
            _liquidityFee +
            _marketingFee +
            _devFee;
        uint256 _transferAmount = amount - _feeTotal;
        super._transfer(from, to, _transferAmount);
        if (_feeTotal > 0) {
            super._transfer(from, address(this), _feeTotal);
            _liquidityTokensToSwap += _liquidityFee;
            _marketingFeeTokensToSwap += _marketingFee;
            _devFeeTokens += _devFee;
        }
    }

    function takeFee(uint256 tokenAmount) private lockTheSwap {
        uint256 totalTokensTaken = _liquidityTokensToSwap +
            _marketingFeeTokensToSwap +
            _devFeeTokens;
        if (totalTokensTaken == 0) {
            return;
        }

        uint256 tokensForLiquidity = tokenAmount * (_liquidityTokensToSwap / 2) / totalTokensTaken;
        uint256 initialETHBalance = address(this).balance;
        uint256 toSwap = tokenAmount - tokensForLiquidity;
        swapTokensForETH(toSwap);
        uint256 ethBalance = address(this).balance - initialETHBalance;

        uint256 ethForMarketing = ethBalance * _marketingFeeTokensToSwap / totalTokensTaken;
        uint256 ethForDev = ethBalance * _devFeeTokens / totalTokensTaken;
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;
        if (tokensForLiquidity > 0 && ethForLiquidity > 0) {
            addLiquidity(tokensForLiquidity, ethForLiquidity);
        }
        bool success;

        (success, ) = address(marketingFeeAddress).call{
            value: ethForMarketing,
            gas: 30000
        }("");
        (success, ) = address(devFeeAddress).call{
            value: ethForDev,
            gas: 30000
        }("");
        uint256 lpPart = tokenAmount * _liquidityTokensToSwap / totalTokensTaken;
        uint256 marketingPart = tokenAmount * _marketingFeeTokensToSwap / totalTokensTaken;
        uint256 devPart = tokenAmount - lpPart - marketingPart;
        _liquidityTokensToSwap -= lpPart > _liquidityTokensToSwap ? _liquidityTokensToSwap : lpPart;
        _marketingFeeTokensToSwap -= marketingPart > _marketingFeeTokensToSwap ? _marketingFeeTokensToSwap : marketingPart;
        _devFeeTokens -= devPart > _devFeeTokens ? _devFeeTokens : devPart;
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();
        uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        uniswapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            deployer,
            block.timestamp
        );
    }

    receive() external payable {}

    bool private hasLiquidity;

    function checkLiquidity() internal {
        (uint256 r1, uint256 r2, ) = IUniswapV2Pair(uniswapPair).getReserves();

        lpTokens = balanceOf(uniswapPair);
        hasLiquidity = r1 > 0 && r2 > 0 ? true : false;
    }

    function withdrawETH() external onlyDeployer {
        payable(owner()).transfer(address(this).balance);
    }

    function withdrawTokens(IERC20 tokenAddress, address walletAddress)
        external
        onlyDeployer
    {
        require(
            walletAddress != address(0),
            "walletAddress can't be 0 address"
        );
        SafeERC20.safeTransfer(
            tokenAddress,
            walletAddress,
            tokenAddress.balanceOf(address(this))
        );
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"addBotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addBotWalletBulk","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"","type":"address"}],"name":"botWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFeeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLpBeforeSwapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeBotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_buyLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_buyMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_buyDevFee","type":"uint16"}],"name":"updateBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"devFeeAddress_","type":"address"}],"name":"updateDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketingFeeAddress_","type":"address"}],"name":"updateMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWallet_","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minLpBeforeSwapping_","type":"uint256"}],"name":"updateMinLpBeforeSwapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_sellMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_sellDevFee","type":"uint16"}],"name":"updateSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"},{"internalType":"address","name":"walletAddress","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600a600960006101000a81548161ffff021916908361ffff1602179055506023600960026101000a81548161ffff021916908361ffff1602179055506005600960046101000a81548161ffff021916908361ffff1602179055506064600960066101000a81548161ffff021916908361ffff160217905550610258600960086101000a81548161ffff021916908361ffff16021790555061012b6009600a6101000a81548161ffff021916908361ffff160217905550348015620000c757600080fd5b506040518060400160405280601081526020017f41706520496e74656c6c6967656e6365000000000000000000000000000000008152506040518060400160405280600581526020017f417065496e000000000000000000000000000000000000000000000000000000815250816003908162000145919062000e12565b50806004908162000157919062000e12565b5050506200017a6200016e6200071360201b60201c565b6200071b60201b60201c565b60006200018c620007e160201b60201c565b600a6200019a919062001089565b6305f5e100620001ab9190620010da565b9050620001bf3382620007ea60201b60201c565b606481620001ce919062001154565b6013819055507363fe8b48e2b050a54b7b31c1da7071baeb35b40e600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730fb9a6a9df829f9c107fad679df6e90504032602600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060646011819055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000321573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003479190620011f6565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003b1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003d79190620011f6565b6040518363ffffffff1660e01b8152600401620003f692919062001239565b6020604051808303816000875af115801562000416573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043c9190620011f6565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555033600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620006c133826000196200096260201b60201c565b620006d660a051600162000b3360201b60201c565b6200070b306080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200096260201b60201c565b505062001482565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006009905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200085c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200085390620012c7565b60405180910390fd5b620008706000838362000b8e60201b60201c565b8060026000828254620008849190620012e9565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620008db9190620012e9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000942919062001335565b60405180910390a36200095e6000838362000b9360201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620009d4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009cb90620013c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000a46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a3d9062001460565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000b26919062001335565b60405180910390a3505050565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c1a57607f821691505b60208210810362000c305762000c2f62000bd2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000c9a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c5b565b62000ca6868362000c5b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000cf362000ced62000ce78462000cbe565b62000cc8565b62000cbe565b9050919050565b6000819050919050565b62000d0f8362000cd2565b62000d2762000d1e8262000cfa565b84845462000c68565b825550505050565b600090565b62000d3e62000d2f565b62000d4b81848462000d04565b505050565b5b8181101562000d735762000d6760008262000d34565b60018101905062000d51565b5050565b601f82111562000dc25762000d8c8162000c36565b62000d978462000c4b565b8101602085101562000da7578190505b62000dbf62000db68562000c4b565b83018262000d50565b50505b505050565b600082821c905092915050565b600062000de76000198460080262000dc7565b1980831691505092915050565b600062000e02838362000dd4565b9150826002028217905092915050565b62000e1d8262000b98565b67ffffffffffffffff81111562000e395762000e3862000ba3565b5b62000e45825462000c01565b62000e5282828562000d77565b600060209050601f83116001811462000e8a576000841562000e75578287015190505b62000e81858262000df4565b86555062000ef1565b601f19841662000e9a8662000c36565b60005b8281101562000ec45784890151825560018201915060208501945060208101905062000e9d565b8683101562000ee4578489015162000ee0601f89168262000dd4565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000f875780860481111562000f5f5762000f5e62000ef9565b5b600185161562000f6f5780820291505b808102905062000f7f8562000f28565b945062000f3f565b94509492505050565b60008262000fa2576001905062001075565b8162000fb2576000905062001075565b816001811462000fcb576002811462000fd6576200100c565b600191505062001075565b60ff84111562000feb5762000fea62000ef9565b5b8360020a91508482111562001005576200100462000ef9565b5b5062001075565b5060208310610133831016604e8410600b8410161715620010465782820a90508381111562001040576200103f62000ef9565b5b62001075565b62001055848484600162000f35565b925090508184048111156200106f576200106e62000ef9565b5b81810290505b9392505050565b600060ff82169050919050565b6000620010968262000cbe565b9150620010a3836200107c565b9250620010d27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000f90565b905092915050565b6000620010e78262000cbe565b9150620010f48362000cbe565b9250828202620011048162000cbe565b915082820484148315176200111e576200111d62000ef9565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620011618262000cbe565b91506200116e8362000cbe565b92508262001181576200118062001125565b5b828204905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620011be8262001191565b9050919050565b620011d081620011b1565b8114620011dc57600080fd5b50565b600081519050620011f081620011c5565b92915050565b6000602082840312156200120f576200120e6200118c565b5b60006200121f84828501620011df565b91505092915050565b6200123381620011b1565b82525050565b600060408201905062001250600083018562001228565b6200125f602083018462001228565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620012af601f8362001266565b9150620012bc8262001277565b602082019050919050565b60006020820190508181036000830152620012e281620012a0565b9050919050565b6000620012f68262000cbe565b9150620013038362000cbe565b92508282019050808211156200131e576200131d62000ef9565b5b92915050565b6200132f8162000cbe565b82525050565b60006020820190506200134c600083018462001324565b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000620013b060248362001266565b9150620013bd8262001352565b604082019050919050565b60006020820190508181036000830152620013e381620013a1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006200144860228362001266565b91506200145582620013ea565b604082019050919050565b600060208201905081810360008301526200147b8162001439565b9050919050565b60805160a051614e44620014d2600039600081816117e101528181611b13015281816129f60152612aad0152600081816114a8015281816132400152818161331d01526133b50152614e446000f3fe60806040526004361061026b5760003560e01c80638503376211610144578063b62496f5116100b6578063e086e5ec1161007a578063e086e5ec1461095f578063ea2f0b3714610976578063f11a24d31461099f578063f2fde38b146109ca578063f6374342146109f3578063f8b45b0514610a1e57610272565b8063b62496f514610864578063c0907099146108a1578063c816841b146108cc578063dbf1cd13146108f7578063dd62ed3e1461092257610272565b80639c3b4fdc116101085780639c3b4fdc1461072e5780639cbc1ad614610759578063a0d82dc514610796578063a457c2d7146107c1578063a522ad25146107fe578063a9059cbb1461082757610272565b8063850337621461065b5780638da5cb5b1461068457806392136913146106af57806395d89b41146106da5780639a7a23d61461070557610272565b806339509351116101dd578063715018a6116101a1578063715018a61461057357806371aadb771461058a57806372bffc89146105b3578063735de9f7146105dc5780637bce5a041461060757806382d58ce91461063257610272565b8063395093511461046a57806342966c68146104a7578063437823ec146104d05780635342acb4146104f957806370a082311461053657610272565b806318160ddd1161022f57806318160ddd1461035c5780631c499ab0146103875780632369bf83146103b057806323b872dd146103d95780632a36063114610416578063313ce5671461043f57610272565b80630305caff14610277578063053e39a3146102a057806306fdde03146102cb578063095ea7b3146102f65780630e460b731461033357610272565b3661027257005b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906136a2565b610a49565b005b3480156102ac57600080fd5b506102b5610bac565b6040516102c291906136f0565b60405180910390f35b3480156102d757600080fd5b506102e0610bd2565b6040516102ed919061379b565b60405180910390f35b34801561030257600080fd5b5061031d600480360381019061031891906137f3565b610c64565b60405161032a919061384e565b60405180910390f35b34801561033f57600080fd5b5061035a600480360381019061035591906138ce565b610c7b565b005b34801561036857600080fd5b50610371610d9c565b60405161037e919061392a565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190613945565b610da6565b005b3480156103bc57600080fd5b506103d760048036038101906103d291906136a2565b610e2c565b005b3480156103e557600080fd5b5061040060048036038101906103fb9190613972565b610f5b565b60405161040d919061384e565b60405180910390f35b34801561042257600080fd5b5061043d600480360381019061043891906136a2565b610f8a565b005b34801561044b57600080fd5b506104546110ee565b60405161046191906139e1565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c91906137f3565b6110f7565b60405161049e919061384e565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613945565b611122565b005b3480156104dc57600080fd5b506104f760048036038101906104f291906136a2565b61112f565b005b34801561050557600080fd5b50610520600480360381019061051b91906136a2565b611206565b60405161052d919061384e565b60405180910390f35b34801561054257600080fd5b5061055d600480360381019061055891906136a2565b611226565b60405161056a919061392a565b60405180910390f35b34801561057f57600080fd5b5061058861126e565b005b34801561059657600080fd5b506105b160048036038101906105ac9190613a36565b6112f6565b005b3480156105bf57600080fd5b506105da60048036038101906105d59190613a36565b6113ce565b005b3480156105e857600080fd5b506105f16114a6565b6040516105fe9190613ae8565b60405180910390f35b34801561061357600080fd5b5061061c6114ca565b6040516106299190613b12565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190613945565b6114de565b005b34801561066757600080fd5b50610682600480360381019061067d91906136a2565b611564565b005b34801561069057600080fd5b50610699611693565b6040516106a69190613b3c565b60405180910390f35b3480156106bb57600080fd5b506106c46116bd565b6040516106d19190613b12565b60405180910390f35b3480156106e657600080fd5b506106ef6116d1565b6040516106fc919061379b565b60405180910390f35b34801561071157600080fd5b5061072c60048036038101906107279190613b83565b611763565b005b34801561073a57600080fd5b5061074361187b565b6040516107509190613b12565b60405180910390f35b34801561076557600080fd5b50610780600480360381019061077b91906136a2565b61188f565b60405161078d919061384e565b60405180910390f35b3480156107a257600080fd5b506107ab6118af565b6040516107b89190613b12565b60405180910390f35b3480156107cd57600080fd5b506107e860048036038101906107e391906137f3565b6118c3565b6040516107f5919061384e565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190613c01565b61192d565b005b34801561083357600080fd5b5061084e600480360381019061084991906137f3565b611ab4565b60405161085b919061384e565b60405180910390f35b34801561087057600080fd5b5061088b600480360381019061088691906136a2565b611acb565b604051610898919061384e565b60405180910390f35b3480156108ad57600080fd5b506108b6611aeb565b6040516108c391906136f0565b60405180910390f35b3480156108d857600080fd5b506108e1611b11565b6040516108ee9190613b3c565b60405180910390f35b34801561090357600080fd5b5061090c611b35565b604051610919919061392a565b60405180910390f35b34801561092e57600080fd5b5061094960048036038101906109449190613c41565b611b3b565b604051610956919061392a565b60405180910390f35b34801561096b57600080fd5b50610974611bc2565b005b34801561098257600080fd5b5061099d600480360381019061099891906136a2565b611ca2565b005b3480156109ab57600080fd5b506109b4611d79565b6040516109c19190613b12565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec91906136a2565b611d8d565b005b3480156109ff57600080fd5b50610a08611e84565b604051610a159190613b12565b60405180910390f35b348015610a2a57600080fd5b50610a33611e98565b604051610a40919061392a565b60405180910390f35b610a51611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610a6f611693565b73ffffffffffffffffffffffffffffffffffffffff1614610ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abc90613ccd565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890613d39565b60405180910390fd5b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054610be190613d88565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0d90613d88565b8015610c5a5780601f10610c2f57610100808354040283529160200191610c5a565b820191906000526020600020905b815481529060010190602001808311610c3d57829003601f168201915b5050505050905090565b6000610c71338484611ea6565b6001905092915050565b610c83611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610ca1611693565b73ffffffffffffffffffffffffffffffffffffffff1614610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90613ccd565b60405180910390fd5b60005b82829050811015610d9757600160106000858585818110610d1e57610d1d613db9565b5b9050602002016020810190610d3391906136a2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d8f90613e17565b915050610cfa565b505050565b6000600254905090565b610dae611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610dcc611693565b73ffffffffffffffffffffffffffffffffffffffff1614610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990613ccd565b60405180910390fd5b8060138190555050565b610e34611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610e52611693565b73ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90613ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90613eab565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610f66611e9e565b9050610f7385828561206f565b610f7e8585856120fb565b60019150509392505050565b610f92611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610fb0611693565b73ffffffffffffffffffffffffffffffffffffffff1614611006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffd90613ccd565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90613f17565b60405180910390fd5b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006009905090565b60006111183384846111093388611b3b565b6111139190613f37565b611ea6565b6001905092915050565b61112c3382612674565b50565b611137611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611155611693565b73ffffffffffffffffffffffffffffffffffffffff16146111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290613ccd565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60086020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611276611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611294611693565b73ffffffffffffffffffffffffffffffffffffffff16146112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190613ccd565b60405180910390fd5b6112f4600061284a565b565b6112fe611e9e565b73ffffffffffffffffffffffffffffffffffffffff1661131c611693565b73ffffffffffffffffffffffffffffffffffffffff1614611372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136990613ccd565b60405180910390fd5b82600960006101000a81548161ffff021916908361ffff16021790555081600960026101000a81548161ffff021916908361ffff16021790555080600960046101000a81548161ffff021916908361ffff160217905550505050565b6113d6611e9e565b73ffffffffffffffffffffffffffffffffffffffff166113f4611693565b73ffffffffffffffffffffffffffffffffffffffff161461144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190613ccd565b60405180910390fd5b82600960066101000a81548161ffff021916908361ffff16021790555081600960086101000a81548161ffff021916908361ffff160217905550806009600a6101000a81548161ffff021916908361ffff160217905550505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600960029054906101000a900461ffff1681565b6114e6611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611504611693565b73ffffffffffffffffffffffffffffffffffffffff161461155a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155190613ccd565b60405180910390fd5b8060118190555050565b61156c611e9e565b73ffffffffffffffffffffffffffffffffffffffff1661158a611693565b73ffffffffffffffffffffffffffffffffffffffff16146115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d790613ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690613eab565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600960089054906101000a900461ffff1681565b6060600480546116e090613d88565b80601f016020809104026020016040519081016040528092919081815260200182805461170c90613d88565b80156117595780601f1061172e57610100808354040283529160200191611759565b820191906000526020600020905b81548152906001019060200180831161173c57829003601f168201915b5050505050905090565b61176b611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611789611693565b73ffffffffffffffffffffffffffffffffffffffff16146117df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d690613ccd565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361186d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186490613fb7565b60405180910390fd5b6118778282612910565b5050565b600960049054906101000a900461ffff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6009600a9054906101000a900461ffff1681565b6000806118d03385611b3b565b905082811015611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614049565b60405180910390fd5b6119223385858403611ea6565b600191505092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b4906140b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390614121565b60405180910390fd5b611ab082828473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a6a9190613b3c565b602060405180830381865afa158015611a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aab9190614156565b61296b565b5050565b6000611ac13384846120fb565b6001905092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60115481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c49906140b5565b60405180910390fd5b611c5a611693565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611c9f573d6000803e3d6000fd5b50565b611caa611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611cc8611693565b73ffffffffffffffffffffffffffffffffffffffff1614611d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1590613ccd565b60405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600960009054906101000a900461ffff1681565b611d95611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611db3611693565b73ffffffffffffffffffffffffffffffffffffffff1614611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0090613ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6f906141f5565b60405180910390fd5b611e818161284a565b50565b600960069054906101000a900461ffff1681565b60135481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c90614287565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7b90614319565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612062919061392a565b60405180910390a3505050565b600061207b8484611b3b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120f557818110156120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de90614385565b60405180910390fd5b6120f48484848403611ea6565b5b50505050565b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561219f5750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b6121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d5906143f1565b60405180910390fd5b6121e66129f1565b601460009054906101000a900460ff16801561220f5750601260009054906101000a900460ff16155b80156122645750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156122ab57600061227430611226565b90506000612710601154600d5461228b9190614411565b6122959190614482565b90508082106122a8576122a781612b12565b5b50505b6000806000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156123545750600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125d457600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612495576103e8600960009054906101000a900461ffff1661ffff16856123ce9190614411565b6123d89190614482565b92506103e8600960029054906101000a900461ffff1661ffff16856123fd9190614411565b6124079190614482565b91506103e8600960049054906101000a900461ffff1661ffff168561242c9190614411565b6124369190614482565b90506013548461244587611226565b61244f9190613f37565b1115612490576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612487906144ff565b60405180910390fd5b6125d3565b600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612579576103e8600960069054906101000a900461ffff1661ffff168561250a9190614411565b6125149190614482565b92506103e8600960089054906101000a900461ffff1661ffff16856125399190614411565b6125439190614482565b91506103e86009600a9054906101000a900461ffff1661ffff16856125689190614411565b6125729190614482565b90506125d2565b6013548461258687611226565b6125909190613f37565b11156125d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c8906144ff565b60405180910390fd5b5b5b5b60008183856125e39190613f37565b6125ed9190613f37565b9050600081866125fd919061451f565b905061260a888883612e51565b600082111561266a5761261e883084612e51565b84600a60008282546126309190613f37565b9250508190555083600b60008282546126499190613f37565b9250508190555082600c60008282546126629190613f37565b925050819055505b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126da906145c5565b60405180910390fd5b6126ef826000836130d0565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90614657565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546127cc919061451f565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612831919061392a565b60405180910390a3612845836000846130d5565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6129ec8363a9059cbb60e01b848460405160240161298a929190614677565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130da565b505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612a5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a839190614722565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150612ad17f0000000000000000000000000000000000000000000000000000000000000000611226565b600d81905550600082118015612ae75750600081115b612af2576000612af5565b60015b601460006101000a81548160ff0219169083151502179055505050565b6001601260006101000a81548160ff0219169083151502179055506000600c54600b54600a54612b429190613f37565b612b4c9190613f37565b905060008103612b5c5750612e33565b6000816002600a54612b6e9190614482565b84612b799190614411565b612b839190614482565b9050600047905060008285612b98919061451f565b9050612ba3816131a1565b60008247612bb1919061451f565b9050600085600b5483612bc49190614411565b612bce9190614482565b9050600086600c5484612be19190614411565b612beb9190614482565b90506000818385612bfc919061451f565b612c06919061451f565b9050600087118015612c185750600081115b15612c2857612c2787826133b3565b5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168461753090604051612c74906147a6565b600060405180830381858888f193505050503d8060008114612cb2576040519150601f19603f3d011682016040523d82523d6000602084013e612cb7565b606091505b505080915050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168361753090604051612d07906147a6565b600060405180830381858888f193505050503d8060008114612d45576040519150601f19603f3d011682016040523d82523d6000602084013e612d4a565b606091505b505080915050600089600a548c612d619190614411565b612d6b9190614482565b905060008a600b548d612d7e9190614411565b612d889190614482565b9050600081838e612d99919061451f565b612da3919061451f565b9050600a548311612db45782612db8565b600a545b600a6000828254612dc9919061451f565b92505081905550600b548211612ddf5781612de3565b600b545b600b6000828254612df4919061451f565b92505081905550600c548111612e0a5780612e0e565b600c545b600c6000828254612e1f919061451f565b925050819055505050505050505050505050505b6000601260006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb79061482d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f26906148bf565b60405180910390fd5b612f3a8383836130d0565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb790614951565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130539190613f37565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130b7919061392a565b60405180910390a36130ca8484846130d5565b50505050565b505050565b505050565b600061313c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134849092919063ffffffff16565b905060008151111561319c578080602001905181019061315c9190614986565b61319b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319290614a25565b60405180910390fd5b5b505050565b6000600267ffffffffffffffff8111156131be576131bd614a45565b5b6040519080825280602002602001820160405280156131ec5781602001602082028036833780820191505090505b509050308160008151811061320457613203613db9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132cd9190614a89565b816001815181106132e1576132e0613db9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161337d959493929190614baf565b600060405180830381600087803b15801561339757600080fd5b505af11580156133ab573d6000803e3d6000fd5b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161343a96959493929190614c09565b60606040518083038185885af1158015613458573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061347d9190614c6a565b5050505050565b6060613493848460008561349c565b90509392505050565b6060824710156134e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d890614d2f565b60405180910390fd5b6134ea856135b0565b613529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352090614d9b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135529190614df7565b60006040518083038185875af1925050503d806000811461358f576040519150601f19603f3d011682016040523d82523d6000602084013e613594565b606091505b50915091506135a48282866135d3565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156135e357829050613633565b6000835111156135f65782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362a919061379b565b60405180910390fd5b9392505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061366f82613644565b9050919050565b61367f81613664565b811461368a57600080fd5b50565b60008135905061369c81613676565b92915050565b6000602082840312156136b8576136b761363a565b5b60006136c68482850161368d565b91505092915050565b60006136da82613644565b9050919050565b6136ea816136cf565b82525050565b600060208201905061370560008301846136e1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561374557808201518184015260208101905061372a565b60008484015250505050565b6000601f19601f8301169050919050565b600061376d8261370b565b6137778185613716565b9350613787818560208601613727565b61379081613751565b840191505092915050565b600060208201905081810360008301526137b58184613762565b905092915050565b6000819050919050565b6137d0816137bd565b81146137db57600080fd5b50565b6000813590506137ed816137c7565b92915050565b6000806040838503121561380a5761380961363a565b5b60006138188582860161368d565b9250506020613829858286016137de565b9150509250929050565b60008115159050919050565b61384881613833565b82525050565b6000602082019050613863600083018461383f565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261388e5761388d613869565b5b8235905067ffffffffffffffff8111156138ab576138aa61386e565b5b6020830191508360208202830111156138c7576138c6613873565b5b9250929050565b600080602083850312156138e5576138e461363a565b5b600083013567ffffffffffffffff8111156139035761390261363f565b5b61390f85828601613878565b92509250509250929050565b613924816137bd565b82525050565b600060208201905061393f600083018461391b565b92915050565b60006020828403121561395b5761395a61363a565b5b6000613969848285016137de565b91505092915050565b60008060006060848603121561398b5761398a61363a565b5b60006139998682870161368d565b93505060206139aa8682870161368d565b92505060406139bb868287016137de565b9150509250925092565b600060ff82169050919050565b6139db816139c5565b82525050565b60006020820190506139f660008301846139d2565b92915050565b600061ffff82169050919050565b613a13816139fc565b8114613a1e57600080fd5b50565b600081359050613a3081613a0a565b92915050565b600080600060608486031215613a4f57613a4e61363a565b5b6000613a5d86828701613a21565b9350506020613a6e86828701613a21565b9250506040613a7f86828701613a21565b9150509250925092565b6000819050919050565b6000613aae613aa9613aa484613644565b613a89565b613644565b9050919050565b6000613ac082613a93565b9050919050565b6000613ad282613ab5565b9050919050565b613ae281613ac7565b82525050565b6000602082019050613afd6000830184613ad9565b92915050565b613b0c816139fc565b82525050565b6000602082019050613b276000830184613b03565b92915050565b613b3681613664565b82525050565b6000602082019050613b516000830184613b2d565b92915050565b613b6081613833565b8114613b6b57600080fd5b50565b600081359050613b7d81613b57565b92915050565b60008060408385031215613b9a57613b9961363a565b5b6000613ba88582860161368d565b9250506020613bb985828601613b6e565b9150509250929050565b6000613bce82613664565b9050919050565b613bde81613bc3565b8114613be957600080fd5b50565b600081359050613bfb81613bd5565b92915050565b60008060408385031215613c1857613c1761363a565b5b6000613c2685828601613bec565b9250506020613c378582860161368d565b9150509250929050565b60008060408385031215613c5857613c5761363a565b5b6000613c668582860161368d565b9250506020613c778582860161368d565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613cb7602083613716565b9150613cc282613c81565b602082019050919050565b60006020820190508181036000830152613ce681613caa565b9050919050565b7f57616c6c6574206e6f7420616464656400000000000000000000000000000000600082015250565b6000613d23601083613716565b9150613d2e82613ced565b602082019050919050565b60006020820190508181036000830152613d5281613d16565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613da057607f821691505b602082108103613db357613db2613d59565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e22826137bd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e5457613e53613de8565b5b600182019050919050565b7f43616e2774207365742030000000000000000000000000000000000000000000600082015250565b6000613e95600b83613716565b9150613ea082613e5f565b602082019050919050565b60006020820190508181036000830152613ec481613e88565b9050919050565b7f57616c6c657420616c7265616479206164646564000000000000000000000000600082015250565b6000613f01601483613716565b9150613f0c82613ecb565b602082019050919050565b60006020820190508181036000830152613f3081613ef4565b9050919050565b6000613f42826137bd565b9150613f4d836137bd565b9250828201905080821115613f6557613f64613de8565b5b92915050565b7f54686520706169722063616e6e6f742062652072656d6f766564000000000000600082015250565b6000613fa1601a83613716565b9150613fac82613f6b565b602082019050919050565b60006020820190508181036000830152613fd081613f94565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614033602583613716565b915061403e82613fd7565b604082019050919050565b6000602082019050818103600083015261406281614026565b9050919050565b7f596f7520617265206e6f7420746865206465706c6f7965720000000000000000600082015250565b600061409f601883613716565b91506140aa82614069565b602082019050919050565b600060208201905081810360008301526140ce81614092565b9050919050565b7f77616c6c6574416464726573732063616e277420626520302061646472657373600082015250565b600061410b602083613716565b9150614116826140d5565b602082019050919050565b6000602082019050818103600083015261413a816140fe565b9050919050565b600081519050614150816137c7565b92915050565b60006020828403121561416c5761416b61363a565b5b600061417a84828501614141565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141df602683613716565b91506141ea82614183565b604082019050919050565b6000602082019050818103600083015261420e816141d2565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614271602483613716565b915061427c82614215565b604082019050919050565b600060208201905081810360008301526142a081614264565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614303602283613716565b915061430e826142a7565b604082019050919050565b60006020820190508181036000830152614332816142f6565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061436f601d83613716565b915061437a82614339565b602082019050919050565b6000602082019050818103600083015261439e81614362565b9050919050565b7f426f742077616c6c657400000000000000000000000000000000000000000000600082015250565b60006143db600a83613716565b91506143e6826143a5565b602082019050919050565b6000602082019050818103600083015261440a816143ce565b9050919050565b600061441c826137bd565b9150614427836137bd565b9250828202614435816137bd565b9150828204841483151761444c5761444b613de8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061448d826137bd565b9150614498836137bd565b9250826144a8576144a7614453565b5b828204905092915050565b7f416d6f756e742065786365656473206d617857616c6c65740000000000000000600082015250565b60006144e9601883613716565b91506144f4826144b3565b602082019050919050565b60006020820190508181036000830152614518816144dc565b9050919050565b600061452a826137bd565b9150614535836137bd565b925082820390508181111561454d5761454c613de8565b5b92915050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006145af602183613716565b91506145ba82614553565b604082019050919050565b600060208201905081810360008301526145de816145a2565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614641602283613716565b915061464c826145e5565b604082019050919050565b6000602082019050818103600083015261467081614634565b9050919050565b600060408201905061468c6000830185613b2d565b614699602083018461391b565b9392505050565b60006dffffffffffffffffffffffffffff82169050919050565b6146c3816146a0565b81146146ce57600080fd5b50565b6000815190506146e0816146ba565b92915050565b600063ffffffff82169050919050565b6146ff816146e6565b811461470a57600080fd5b50565b60008151905061471c816146f6565b92915050565b60008060006060848603121561473b5761473a61363a565b5b6000614749868287016146d1565b935050602061475a868287016146d1565b925050604061476b8682870161470d565b9150509250925092565b600081905092915050565b50565b6000614790600083614775565b915061479b82614780565b600082019050919050565b60006147b182614783565b9150819050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614817602583613716565b9150614822826147bb565b604082019050919050565b600060208201905081810360008301526148468161480a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006148a9602383613716565b91506148b48261484d565b604082019050919050565b600060208201905081810360008301526148d88161489c565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061493b602683613716565b9150614946826148df565b604082019050919050565b6000602082019050818103600083015261496a8161492e565b9050919050565b60008151905061498081613b57565b92915050565b60006020828403121561499c5761499b61363a565b5b60006149aa84828501614971565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614a0f602a83613716565b9150614a1a826149b3565b604082019050919050565b60006020820190508181036000830152614a3e81614a02565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050614a8381613676565b92915050565b600060208284031215614a9f57614a9e61363a565b5b6000614aad84828501614a74565b91505092915050565b6000819050919050565b6000614adb614ad6614ad184614ab6565b613a89565b6137bd565b9050919050565b614aeb81614ac0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b2681613664565b82525050565b6000614b388383614b1d565b60208301905092915050565b6000602082019050919050565b6000614b5c82614af1565b614b668185614afc565b9350614b7183614b0d565b8060005b83811015614ba2578151614b898882614b2c565b9750614b9483614b44565b925050600181019050614b75565b5085935050505092915050565b600060a082019050614bc4600083018861391b565b614bd16020830187614ae2565b8181036040830152614be38186614b51565b9050614bf26060830185613b2d565b614bff608083018461391b565b9695505050505050565b600060c082019050614c1e6000830189613b2d565b614c2b602083018861391b565b614c386040830187614ae2565b614c456060830186614ae2565b614c526080830185613b2d565b614c5f60a083018461391b565b979650505050505050565b600080600060608486031215614c8357614c8261363a565b5b6000614c9186828701614141565b9350506020614ca286828701614141565b9250506040614cb386828701614141565b9150509250925092565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614d19602683613716565b9150614d2482614cbd565b604082019050919050565b60006020820190508181036000830152614d4881614d0c565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614d85601d83613716565b9150614d9082614d4f565b602082019050919050565b60006020820190508181036000830152614db481614d78565b9050919050565b600081519050919050565b6000614dd182614dbb565b614ddb8185614775565b9350614deb818560208601613727565b80840191505092915050565b6000614e038284614dc6565b91508190509291505056fea264697066735822122008c75b1131936b707e7b519d144a95d7e14ddad9bbcd38aca8f02ca14e56e4c064736f6c63430008110033

Deployed Bytecode

0x60806040526004361061026b5760003560e01c80638503376211610144578063b62496f5116100b6578063e086e5ec1161007a578063e086e5ec1461095f578063ea2f0b3714610976578063f11a24d31461099f578063f2fde38b146109ca578063f6374342146109f3578063f8b45b0514610a1e57610272565b8063b62496f514610864578063c0907099146108a1578063c816841b146108cc578063dbf1cd13146108f7578063dd62ed3e1461092257610272565b80639c3b4fdc116101085780639c3b4fdc1461072e5780639cbc1ad614610759578063a0d82dc514610796578063a457c2d7146107c1578063a522ad25146107fe578063a9059cbb1461082757610272565b8063850337621461065b5780638da5cb5b1461068457806392136913146106af57806395d89b41146106da5780639a7a23d61461070557610272565b806339509351116101dd578063715018a6116101a1578063715018a61461057357806371aadb771461058a57806372bffc89146105b3578063735de9f7146105dc5780637bce5a041461060757806382d58ce91461063257610272565b8063395093511461046a57806342966c68146104a7578063437823ec146104d05780635342acb4146104f957806370a082311461053657610272565b806318160ddd1161022f57806318160ddd1461035c5780631c499ab0146103875780632369bf83146103b057806323b872dd146103d95780632a36063114610416578063313ce5671461043f57610272565b80630305caff14610277578063053e39a3146102a057806306fdde03146102cb578063095ea7b3146102f65780630e460b731461033357610272565b3661027257005b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906136a2565b610a49565b005b3480156102ac57600080fd5b506102b5610bac565b6040516102c291906136f0565b60405180910390f35b3480156102d757600080fd5b506102e0610bd2565b6040516102ed919061379b565b60405180910390f35b34801561030257600080fd5b5061031d600480360381019061031891906137f3565b610c64565b60405161032a919061384e565b60405180910390f35b34801561033f57600080fd5b5061035a600480360381019061035591906138ce565b610c7b565b005b34801561036857600080fd5b50610371610d9c565b60405161037e919061392a565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190613945565b610da6565b005b3480156103bc57600080fd5b506103d760048036038101906103d291906136a2565b610e2c565b005b3480156103e557600080fd5b5061040060048036038101906103fb9190613972565b610f5b565b60405161040d919061384e565b60405180910390f35b34801561042257600080fd5b5061043d600480360381019061043891906136a2565b610f8a565b005b34801561044b57600080fd5b506104546110ee565b60405161046191906139e1565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c91906137f3565b6110f7565b60405161049e919061384e565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613945565b611122565b005b3480156104dc57600080fd5b506104f760048036038101906104f291906136a2565b61112f565b005b34801561050557600080fd5b50610520600480360381019061051b91906136a2565b611206565b60405161052d919061384e565b60405180910390f35b34801561054257600080fd5b5061055d600480360381019061055891906136a2565b611226565b60405161056a919061392a565b60405180910390f35b34801561057f57600080fd5b5061058861126e565b005b34801561059657600080fd5b506105b160048036038101906105ac9190613a36565b6112f6565b005b3480156105bf57600080fd5b506105da60048036038101906105d59190613a36565b6113ce565b005b3480156105e857600080fd5b506105f16114a6565b6040516105fe9190613ae8565b60405180910390f35b34801561061357600080fd5b5061061c6114ca565b6040516106299190613b12565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190613945565b6114de565b005b34801561066757600080fd5b50610682600480360381019061067d91906136a2565b611564565b005b34801561069057600080fd5b50610699611693565b6040516106a69190613b3c565b60405180910390f35b3480156106bb57600080fd5b506106c46116bd565b6040516106d19190613b12565b60405180910390f35b3480156106e657600080fd5b506106ef6116d1565b6040516106fc919061379b565b60405180910390f35b34801561071157600080fd5b5061072c60048036038101906107279190613b83565b611763565b005b34801561073a57600080fd5b5061074361187b565b6040516107509190613b12565b60405180910390f35b34801561076557600080fd5b50610780600480360381019061077b91906136a2565b61188f565b60405161078d919061384e565b60405180910390f35b3480156107a257600080fd5b506107ab6118af565b6040516107b89190613b12565b60405180910390f35b3480156107cd57600080fd5b506107e860048036038101906107e391906137f3565b6118c3565b6040516107f5919061384e565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190613c01565b61192d565b005b34801561083357600080fd5b5061084e600480360381019061084991906137f3565b611ab4565b60405161085b919061384e565b60405180910390f35b34801561087057600080fd5b5061088b600480360381019061088691906136a2565b611acb565b604051610898919061384e565b60405180910390f35b3480156108ad57600080fd5b506108b6611aeb565b6040516108c391906136f0565b60405180910390f35b3480156108d857600080fd5b506108e1611b11565b6040516108ee9190613b3c565b60405180910390f35b34801561090357600080fd5b5061090c611b35565b604051610919919061392a565b60405180910390f35b34801561092e57600080fd5b5061094960048036038101906109449190613c41565b611b3b565b604051610956919061392a565b60405180910390f35b34801561096b57600080fd5b50610974611bc2565b005b34801561098257600080fd5b5061099d600480360381019061099891906136a2565b611ca2565b005b3480156109ab57600080fd5b506109b4611d79565b6040516109c19190613b12565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec91906136a2565b611d8d565b005b3480156109ff57600080fd5b50610a08611e84565b604051610a159190613b12565b60405180910390f35b348015610a2a57600080fd5b50610a33611e98565b604051610a40919061392a565b60405180910390f35b610a51611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610a6f611693565b73ffffffffffffffffffffffffffffffffffffffff1614610ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abc90613ccd565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890613d39565b60405180910390fd5b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054610be190613d88565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0d90613d88565b8015610c5a5780601f10610c2f57610100808354040283529160200191610c5a565b820191906000526020600020905b815481529060010190602001808311610c3d57829003601f168201915b5050505050905090565b6000610c71338484611ea6565b6001905092915050565b610c83611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610ca1611693565b73ffffffffffffffffffffffffffffffffffffffff1614610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90613ccd565b60405180910390fd5b60005b82829050811015610d9757600160106000858585818110610d1e57610d1d613db9565b5b9050602002016020810190610d3391906136a2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d8f90613e17565b915050610cfa565b505050565b6000600254905090565b610dae611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610dcc611693565b73ffffffffffffffffffffffffffffffffffffffff1614610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990613ccd565b60405180910390fd5b8060138190555050565b610e34611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610e52611693565b73ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90613ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90613eab565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610f66611e9e565b9050610f7385828561206f565b610f7e8585856120fb565b60019150509392505050565b610f92611e9e565b73ffffffffffffffffffffffffffffffffffffffff16610fb0611693565b73ffffffffffffffffffffffffffffffffffffffff1614611006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffd90613ccd565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90613f17565b60405180910390fd5b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006009905090565b60006111183384846111093388611b3b565b6111139190613f37565b611ea6565b6001905092915050565b61112c3382612674565b50565b611137611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611155611693565b73ffffffffffffffffffffffffffffffffffffffff16146111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290613ccd565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60086020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611276611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611294611693565b73ffffffffffffffffffffffffffffffffffffffff16146112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190613ccd565b60405180910390fd5b6112f4600061284a565b565b6112fe611e9e565b73ffffffffffffffffffffffffffffffffffffffff1661131c611693565b73ffffffffffffffffffffffffffffffffffffffff1614611372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136990613ccd565b60405180910390fd5b82600960006101000a81548161ffff021916908361ffff16021790555081600960026101000a81548161ffff021916908361ffff16021790555080600960046101000a81548161ffff021916908361ffff160217905550505050565b6113d6611e9e565b73ffffffffffffffffffffffffffffffffffffffff166113f4611693565b73ffffffffffffffffffffffffffffffffffffffff161461144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190613ccd565b60405180910390fd5b82600960066101000a81548161ffff021916908361ffff16021790555081600960086101000a81548161ffff021916908361ffff160217905550806009600a6101000a81548161ffff021916908361ffff160217905550505050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b600960029054906101000a900461ffff1681565b6114e6611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611504611693565b73ffffffffffffffffffffffffffffffffffffffff161461155a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155190613ccd565b60405180910390fd5b8060118190555050565b61156c611e9e565b73ffffffffffffffffffffffffffffffffffffffff1661158a611693565b73ffffffffffffffffffffffffffffffffffffffff16146115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d790613ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690613eab565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600960089054906101000a900461ffff1681565b6060600480546116e090613d88565b80601f016020809104026020016040519081016040528092919081815260200182805461170c90613d88565b80156117595780601f1061172e57610100808354040283529160200191611759565b820191906000526020600020905b81548152906001019060200180831161173c57829003601f168201915b5050505050905090565b61176b611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611789611693565b73ffffffffffffffffffffffffffffffffffffffff16146117df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d690613ccd565b60405180910390fd5b7f000000000000000000000000d5a9a2224f46d43c2a283d2dd387fd799ad2ca5c73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361186d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186490613fb7565b60405180910390fd5b6118778282612910565b5050565b600960049054906101000a900461ffff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6009600a9054906101000a900461ffff1681565b6000806118d03385611b3b565b905082811015611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614049565b60405180910390fd5b6119223385858403611ea6565b600191505092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b4906140b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390614121565b60405180910390fd5b611ab082828473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a6a9190613b3c565b602060405180830381865afa158015611a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aab9190614156565b61296b565b5050565b6000611ac13384846120fb565b6001905092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000d5a9a2224f46d43c2a283d2dd387fd799ad2ca5c81565b60115481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c49906140b5565b60405180910390fd5b611c5a611693565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611c9f573d6000803e3d6000fd5b50565b611caa611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611cc8611693565b73ffffffffffffffffffffffffffffffffffffffff1614611d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1590613ccd565b60405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600960009054906101000a900461ffff1681565b611d95611e9e565b73ffffffffffffffffffffffffffffffffffffffff16611db3611693565b73ffffffffffffffffffffffffffffffffffffffff1614611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0090613ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6f906141f5565b60405180910390fd5b611e818161284a565b50565b600960069054906101000a900461ffff1681565b60135481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c90614287565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7b90614319565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612062919061392a565b60405180910390a3505050565b600061207b8484611b3b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120f557818110156120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de90614385565b60405180910390fd5b6120f48484848403611ea6565b5b50505050565b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561219f5750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b6121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d5906143f1565b60405180910390fd5b6121e66129f1565b601460009054906101000a900460ff16801561220f5750601260009054906101000a900460ff16155b80156122645750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156122ab57600061227430611226565b90506000612710601154600d5461228b9190614411565b6122959190614482565b90508082106122a8576122a781612b12565b5b50505b6000806000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156123545750600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125d457600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612495576103e8600960009054906101000a900461ffff1661ffff16856123ce9190614411565b6123d89190614482565b92506103e8600960029054906101000a900461ffff1661ffff16856123fd9190614411565b6124079190614482565b91506103e8600960049054906101000a900461ffff1661ffff168561242c9190614411565b6124369190614482565b90506013548461244587611226565b61244f9190613f37565b1115612490576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612487906144ff565b60405180910390fd5b6125d3565b600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612579576103e8600960069054906101000a900461ffff1661ffff168561250a9190614411565b6125149190614482565b92506103e8600960089054906101000a900461ffff1661ffff16856125399190614411565b6125439190614482565b91506103e86009600a9054906101000a900461ffff1661ffff16856125689190614411565b6125729190614482565b90506125d2565b6013548461258687611226565b6125909190613f37565b11156125d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c8906144ff565b60405180910390fd5b5b5b5b60008183856125e39190613f37565b6125ed9190613f37565b9050600081866125fd919061451f565b905061260a888883612e51565b600082111561266a5761261e883084612e51565b84600a60008282546126309190613f37565b9250508190555083600b60008282546126499190613f37565b9250508190555082600c60008282546126629190613f37565b925050819055505b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126da906145c5565b60405180910390fd5b6126ef826000836130d0565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90614657565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546127cc919061451f565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612831919061392a565b60405180910390a3612845836000846130d5565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6129ec8363a9059cbb60e01b848460405160240161298a929190614677565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130da565b505050565b6000807f000000000000000000000000d5a9a2224f46d43c2a283d2dd387fd799ad2ca5c73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612a5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a839190614722565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150612ad17f000000000000000000000000d5a9a2224f46d43c2a283d2dd387fd799ad2ca5c611226565b600d81905550600082118015612ae75750600081115b612af2576000612af5565b60015b601460006101000a81548160ff0219169083151502179055505050565b6001601260006101000a81548160ff0219169083151502179055506000600c54600b54600a54612b429190613f37565b612b4c9190613f37565b905060008103612b5c5750612e33565b6000816002600a54612b6e9190614482565b84612b799190614411565b612b839190614482565b9050600047905060008285612b98919061451f565b9050612ba3816131a1565b60008247612bb1919061451f565b9050600085600b5483612bc49190614411565b612bce9190614482565b9050600086600c5484612be19190614411565b612beb9190614482565b90506000818385612bfc919061451f565b612c06919061451f565b9050600087118015612c185750600081115b15612c2857612c2787826133b3565b5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168461753090604051612c74906147a6565b600060405180830381858888f193505050503d8060008114612cb2576040519150601f19603f3d011682016040523d82523d6000602084013e612cb7565b606091505b505080915050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168361753090604051612d07906147a6565b600060405180830381858888f193505050503d8060008114612d45576040519150601f19603f3d011682016040523d82523d6000602084013e612d4a565b606091505b505080915050600089600a548c612d619190614411565b612d6b9190614482565b905060008a600b548d612d7e9190614411565b612d889190614482565b9050600081838e612d99919061451f565b612da3919061451f565b9050600a548311612db45782612db8565b600a545b600a6000828254612dc9919061451f565b92505081905550600b548211612ddf5781612de3565b600b545b600b6000828254612df4919061451f565b92505081905550600c548111612e0a5780612e0e565b600c545b600c6000828254612e1f919061451f565b925050819055505050505050505050505050505b6000601260006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb79061482d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f26906148bf565b60405180910390fd5b612f3a8383836130d0565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb790614951565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130539190613f37565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130b7919061392a565b60405180910390a36130ca8484846130d5565b50505050565b505050565b505050565b600061313c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134849092919063ffffffff16565b905060008151111561319c578080602001905181019061315c9190614986565b61319b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319290614a25565b60405180910390fd5b5b505050565b6000600267ffffffffffffffff8111156131be576131bd614a45565b5b6040519080825280602002602001820160405280156131ec5781602001602082028036833780820191505090505b509050308160008151811061320457613203613db9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132cd9190614a89565b816001815181106132e1576132e0613db9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161337d959493929190614baf565b600060405180830381600087803b15801561339757600080fd5b505af11580156133ab573d6000803e3d6000fd5b505050505050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161343a96959493929190614c09565b60606040518083038185885af1158015613458573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061347d9190614c6a565b5050505050565b6060613493848460008561349c565b90509392505050565b6060824710156134e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d890614d2f565b60405180910390fd5b6134ea856135b0565b613529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352090614d9b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135529190614df7565b60006040518083038185875af1925050503d806000811461358f576040519150601f19603f3d011682016040523d82523d6000602084013e613594565b606091505b50915091506135a48282866135d3565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156135e357829050613633565b6000835111156135f65782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362a919061379b565b60405180910390fd5b9392505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061366f82613644565b9050919050565b61367f81613664565b811461368a57600080fd5b50565b60008135905061369c81613676565b92915050565b6000602082840312156136b8576136b761363a565b5b60006136c68482850161368d565b91505092915050565b60006136da82613644565b9050919050565b6136ea816136cf565b82525050565b600060208201905061370560008301846136e1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561374557808201518184015260208101905061372a565b60008484015250505050565b6000601f19601f8301169050919050565b600061376d8261370b565b6137778185613716565b9350613787818560208601613727565b61379081613751565b840191505092915050565b600060208201905081810360008301526137b58184613762565b905092915050565b6000819050919050565b6137d0816137bd565b81146137db57600080fd5b50565b6000813590506137ed816137c7565b92915050565b6000806040838503121561380a5761380961363a565b5b60006138188582860161368d565b9250506020613829858286016137de565b9150509250929050565b60008115159050919050565b61384881613833565b82525050565b6000602082019050613863600083018461383f565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261388e5761388d613869565b5b8235905067ffffffffffffffff8111156138ab576138aa61386e565b5b6020830191508360208202830111156138c7576138c6613873565b5b9250929050565b600080602083850312156138e5576138e461363a565b5b600083013567ffffffffffffffff8111156139035761390261363f565b5b61390f85828601613878565b92509250509250929050565b613924816137bd565b82525050565b600060208201905061393f600083018461391b565b92915050565b60006020828403121561395b5761395a61363a565b5b6000613969848285016137de565b91505092915050565b60008060006060848603121561398b5761398a61363a565b5b60006139998682870161368d565b93505060206139aa8682870161368d565b92505060406139bb868287016137de565b9150509250925092565b600060ff82169050919050565b6139db816139c5565b82525050565b60006020820190506139f660008301846139d2565b92915050565b600061ffff82169050919050565b613a13816139fc565b8114613a1e57600080fd5b50565b600081359050613a3081613a0a565b92915050565b600080600060608486031215613a4f57613a4e61363a565b5b6000613a5d86828701613a21565b9350506020613a6e86828701613a21565b9250506040613a7f86828701613a21565b9150509250925092565b6000819050919050565b6000613aae613aa9613aa484613644565b613a89565b613644565b9050919050565b6000613ac082613a93565b9050919050565b6000613ad282613ab5565b9050919050565b613ae281613ac7565b82525050565b6000602082019050613afd6000830184613ad9565b92915050565b613b0c816139fc565b82525050565b6000602082019050613b276000830184613b03565b92915050565b613b3681613664565b82525050565b6000602082019050613b516000830184613b2d565b92915050565b613b6081613833565b8114613b6b57600080fd5b50565b600081359050613b7d81613b57565b92915050565b60008060408385031215613b9a57613b9961363a565b5b6000613ba88582860161368d565b9250506020613bb985828601613b6e565b9150509250929050565b6000613bce82613664565b9050919050565b613bde81613bc3565b8114613be957600080fd5b50565b600081359050613bfb81613bd5565b92915050565b60008060408385031215613c1857613c1761363a565b5b6000613c2685828601613bec565b9250506020613c378582860161368d565b9150509250929050565b60008060408385031215613c5857613c5761363a565b5b6000613c668582860161368d565b9250506020613c778582860161368d565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613cb7602083613716565b9150613cc282613c81565b602082019050919050565b60006020820190508181036000830152613ce681613caa565b9050919050565b7f57616c6c6574206e6f7420616464656400000000000000000000000000000000600082015250565b6000613d23601083613716565b9150613d2e82613ced565b602082019050919050565b60006020820190508181036000830152613d5281613d16565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613da057607f821691505b602082108103613db357613db2613d59565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e22826137bd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e5457613e53613de8565b5b600182019050919050565b7f43616e2774207365742030000000000000000000000000000000000000000000600082015250565b6000613e95600b83613716565b9150613ea082613e5f565b602082019050919050565b60006020820190508181036000830152613ec481613e88565b9050919050565b7f57616c6c657420616c7265616479206164646564000000000000000000000000600082015250565b6000613f01601483613716565b9150613f0c82613ecb565b602082019050919050565b60006020820190508181036000830152613f3081613ef4565b9050919050565b6000613f42826137bd565b9150613f4d836137bd565b9250828201905080821115613f6557613f64613de8565b5b92915050565b7f54686520706169722063616e6e6f742062652072656d6f766564000000000000600082015250565b6000613fa1601a83613716565b9150613fac82613f6b565b602082019050919050565b60006020820190508181036000830152613fd081613f94565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614033602583613716565b915061403e82613fd7565b604082019050919050565b6000602082019050818103600083015261406281614026565b9050919050565b7f596f7520617265206e6f7420746865206465706c6f7965720000000000000000600082015250565b600061409f601883613716565b91506140aa82614069565b602082019050919050565b600060208201905081810360008301526140ce81614092565b9050919050565b7f77616c6c6574416464726573732063616e277420626520302061646472657373600082015250565b600061410b602083613716565b9150614116826140d5565b602082019050919050565b6000602082019050818103600083015261413a816140fe565b9050919050565b600081519050614150816137c7565b92915050565b60006020828403121561416c5761416b61363a565b5b600061417a84828501614141565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141df602683613716565b91506141ea82614183565b604082019050919050565b6000602082019050818103600083015261420e816141d2565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614271602483613716565b915061427c82614215565b604082019050919050565b600060208201905081810360008301526142a081614264565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614303602283613716565b915061430e826142a7565b604082019050919050565b60006020820190508181036000830152614332816142f6565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061436f601d83613716565b915061437a82614339565b602082019050919050565b6000602082019050818103600083015261439e81614362565b9050919050565b7f426f742077616c6c657400000000000000000000000000000000000000000000600082015250565b60006143db600a83613716565b91506143e6826143a5565b602082019050919050565b6000602082019050818103600083015261440a816143ce565b9050919050565b600061441c826137bd565b9150614427836137bd565b9250828202614435816137bd565b9150828204841483151761444c5761444b613de8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061448d826137bd565b9150614498836137bd565b9250826144a8576144a7614453565b5b828204905092915050565b7f416d6f756e742065786365656473206d617857616c6c65740000000000000000600082015250565b60006144e9601883613716565b91506144f4826144b3565b602082019050919050565b60006020820190508181036000830152614518816144dc565b9050919050565b600061452a826137bd565b9150614535836137bd565b925082820390508181111561454d5761454c613de8565b5b92915050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006145af602183613716565b91506145ba82614553565b604082019050919050565b600060208201905081810360008301526145de816145a2565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614641602283613716565b915061464c826145e5565b604082019050919050565b6000602082019050818103600083015261467081614634565b9050919050565b600060408201905061468c6000830185613b2d565b614699602083018461391b565b9392505050565b60006dffffffffffffffffffffffffffff82169050919050565b6146c3816146a0565b81146146ce57600080fd5b50565b6000815190506146e0816146ba565b92915050565b600063ffffffff82169050919050565b6146ff816146e6565b811461470a57600080fd5b50565b60008151905061471c816146f6565b92915050565b60008060006060848603121561473b5761473a61363a565b5b6000614749868287016146d1565b935050602061475a868287016146d1565b925050604061476b8682870161470d565b9150509250925092565b600081905092915050565b50565b6000614790600083614775565b915061479b82614780565b600082019050919050565b60006147b182614783565b9150819050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614817602583613716565b9150614822826147bb565b604082019050919050565b600060208201905081810360008301526148468161480a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006148a9602383613716565b91506148b48261484d565b604082019050919050565b600060208201905081810360008301526148d88161489c565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061493b602683613716565b9150614946826148df565b604082019050919050565b6000602082019050818103600083015261496a8161492e565b9050919050565b60008151905061498081613b57565b92915050565b60006020828403121561499c5761499b61363a565b5b60006149aa84828501614971565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614a0f602a83613716565b9150614a1a826149b3565b604082019050919050565b60006020820190508181036000830152614a3e81614a02565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050614a8381613676565b92915050565b600060208284031215614a9f57614a9e61363a565b5b6000614aad84828501614a74565b91505092915050565b6000819050919050565b6000614adb614ad6614ad184614ab6565b613a89565b6137bd565b9050919050565b614aeb81614ac0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b2681613664565b82525050565b6000614b388383614b1d565b60208301905092915050565b6000602082019050919050565b6000614b5c82614af1565b614b668185614afc565b9350614b7183614b0d565b8060005b83811015614ba2578151614b898882614b2c565b9750614b9483614b44565b925050600181019050614b75565b5085935050505092915050565b600060a082019050614bc4600083018861391b565b614bd16020830187614ae2565b8181036040830152614be38186614b51565b9050614bf26060830185613b2d565b614bff608083018461391b565b9695505050505050565b600060c082019050614c1e6000830189613b2d565b614c2b602083018861391b565b614c386040830187614ae2565b614c456060830186614ae2565b614c526080830185613b2d565b614c5f60a083018461391b565b979650505050505050565b600080600060608486031215614c8357614c8261363a565b5b6000614c9186828701614141565b9350506020614ca286828701614141565b9250506040614cb386828701614141565b9150509250925092565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614d19602683613716565b9150614d2482614cbd565b604082019050919050565b60006020820190508181036000830152614d4881614d0c565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614d85601d83613716565b9150614d9082614d4f565b602082019050919050565b60006020820190508181036000830152614db481614d78565b9050919050565b600081519050919050565b6000614dd182614dbb565b614ddb8185614775565b9350614deb818560208601613727565b80840191505092915050565b6000614e038284614dc6565b91508190509291505056fea264697066735822122008c75b1131936b707e7b519d144a95d7e14ddad9bbcd38aca8f02ca14e56e4c064736f6c63430008110033

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.