ETH Price: $2,753.63 (+4.90%)

Contract

0xeCA08d6e0B1912bCf923B1E244B51F0cE174E32A
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create Pool176561962023-07-09 12:37:47411 days ago1688906267IN
0xeCA08d6e...cE174E32A
0 ETH0.0432779613.88332974
Create Pool173784362023-05-31 11:03:23450 days ago1685531003IN
0xeCA08d6e...cE174E32A
0 ETH0.1283454241.17341123
Create Pool173783882023-05-31 10:53:47450 days ago1685530427IN
0xeCA08d6e...cE174E32A
0 ETH0.0975939631.30516983
Create Pool173783302023-05-31 10:41:47450 days ago1685529707IN
0xeCA08d6e...cE174E32A
0 ETH0.0969467631.09862564
Create Pool173783112023-05-31 10:37:47450 days ago1685529467IN
0xeCA08d6e...cE174E32A
0 ETH0.1085151234.75638306
Create Pool173782922023-05-31 10:33:59450 days ago1685529239IN
0xeCA08d6e...cE174E32A
0 ETH0.1123810436.05024383
Create Pool171129182023-04-24 1:36:23487 days ago1682300183IN
0xeCA08d6e...cE174E32A
0 ETH0.1253030940.19915436
Create Pool166968672023-02-24 7:57:35546 days ago1677225455IN
0xeCA08d6e...cE174E32A
0 ETH0.0841706527.00749172
Create Pool165537182023-02-04 6:45:23566 days ago1675493123IN
0xeCA08d6e...cE174E32A
0 ETH0.0628952620.18305688
Create Pool165038742023-01-28 7:39:11573 days ago1674891551IN
0xeCA08d6e...cE174E32A
0 ETH0.0475660815.26281482
0x60806040164836932023-01-25 11:59:47576 days ago1674647987IN
 Create: FactoryCustomSingleNativeNOPool
0 ETH0.0556710913.73136301

Latest 10 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
176561962023-07-09 12:37:47411 days ago1688906267
0xeCA08d6e...cE174E32A
 Contract Creation0 ETH
173784362023-05-31 11:03:23450 days ago1685531003
0xeCA08d6e...cE174E32A
 Contract Creation0 ETH
173783882023-05-31 10:53:47450 days ago1685530427
0xeCA08d6e...cE174E32A
 Contract Creation0 ETH
173783302023-05-31 10:41:47450 days ago1685529707
0xeCA08d6e...cE174E32A
 Contract Creation0 ETH
173783112023-05-31 10:37:47450 days ago1685529467
0xeCA08d6e...cE174E32A
 Contract Creation0 ETH
173782922023-05-31 10:33:59450 days ago1685529239
0xeCA08d6e...cE174E32A
 Contract Creation0 ETH
171129182023-04-24 1:36:23487 days ago1682300183
0xeCA08d6e...cE174E32A
 Contract Creation0 ETH
166968672023-02-24 7:57:35546 days ago1677225455
0xeCA08d6e...cE174E32A
 Contract Creation0 ETH
165537182023-02-04 6:45:23566 days ago1675493123
0xeCA08d6e...cE174E32A
 Contract Creation0 ETH
165038742023-01-28 7:39:11573 days ago1674891551
0xeCA08d6e...cE174E32A
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FactoryCustomSingleNativeNOPool

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-25
*/

// File: yomiswap-v2/interfaces/IRouter.sol


pragma solidity =0.8.17;

interface IRouter {
    function getIsCollectionApprove(address collection) external returns (bool);

    function getIsBondingCurveApprove(address bondingCurve)
        external
        returns (bool);

    function getIsPaymentTokenApprove(address paymentToken)
        external
        view
        returns (bool);

    function setPool(address _pool, bool _approve) external;
}

// File: yomiswap-v2/lib/FixedPointMathLibFmul.sol


pragma solidity =0.8.17;

library FixedPointMathLibFmul {
    uint256 internal constant WAD = 1e18;

    function fmul(
        uint256 x,
        uint256 y,
        uint256 baseUnit
    ) internal pure returns (uint256 z) {
        assembly {
            // Store x * y in z for now.
            z := mul(x, y)

            // Equivalent to require(x == 0 || (x * y) / x == y)
            if iszero(or(iszero(x), eq(div(z, x), y))) {
                revert(0, 0)
            }

            // If baseUnit is zero this will return zero instead of reverting.
            z := div(z, baseUnit)
        }
    }
}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: yomiswap-v2/bonding-curves/CurveErrorCode.sol


pragma solidity =0.8.17;

contract CurveErrorCodes {
    //@notice OK: No Error
    //@notice INVALID_NUMITEMS: The numItem value is 0
    //@notice SPOT_PRICE_OVERFLOW: The updated spot price doesn't fit into 128 bits
    enum Error {
        OK,
        INVALID_NUMITEMS,
        SPOT_PRICE_OVERFLOW
    }
}

// File: yomiswap-v2/interfaces/ICurve.sol


pragma solidity =0.8.17;


interface ICurve {
    function getBuyInfo(
        uint256 spotPrice,
        uint256 delta,
        uint256 divergence,
        uint256 numItems
    )
        external
        pure
        returns (
            CurveErrorCodes.Error error,
            uint256 newSpotPrice,
            uint256 newDelta,
            uint256 newDivergence,
            uint256 totalFee
        );

    function getSellInfo(
        uint256 spotPrice,
        uint256 delta,
        uint256 divergence,
        uint256 numItems
    )
        external
        pure
        returns (
            CurveErrorCodes.Error error,
            uint256 newSpotPrice,
            uint256 newDelta,
            uint256 newDivergence,
            uint256 totalFee
        );

    function getBuyFeeInfo(
        uint256 spotPrice,
        uint256 delta,
        uint256 spread,
        uint256 numItems,
        uint256 protocolFeeRatio
    ) external pure returns (uint256 lpFee, uint256 protocolFee);

    function getSellFeeInfo(
        uint256 spotPrice,
        uint256 delta,
        uint256 spread,
        uint256 numItems,
        uint256 protocolFeeRatio
    ) external pure returns (uint256 lpFee, uint256 protocolFee);

    function getFee(
        uint256 totalFee,
        uint256 spread,
        uint256 protocolFeeRatio
    ) external pure returns (uint256 lpFee, uint256 protocolFee);
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: yomiswap-v2/src/BasePool.sol


pragma solidity =0.8.17;



contract BasePool {
    //@param E18
    uint256 E18 = 1e18;

    //@param bondingCurve: bondingCurve for change buyPrice and sellPrice
    address public bondingCurve;

    //@param collection: only collection address'tokenIds to this pool
    address public collection;

    //@param router: address of router
    address public router;

    //@param owner: creater of this pool
    address public owner;

    //@param paymentToken: use only this address ERC20 or Native
    address public paymentToken;

    //@param protocolFeeRatio: default under 10%
    uint256 public protocolFeeRatio;

    //@param BuyEventNum: num of buyEvent
    uint256 public buyEventNum;

    //@param SellEventNum: num of sellEvent
    uint256 public sellEventNum;

    //@param stakeNFTprice: price of spot staking NFT
    uint256 public stakeNFTprice;

    //@param stakeNFTprice: price of spot staking FT
    uint256 public stakeFTprice;

    //@param isOtherStake: flg of other staking
    bool public isOtherStake;

    //@param isPair: flg of pair
    bool public isPair;

    //@param poolInfo: information of this pool
    PoolInfo internal poolInfo;

    //@param PoolInfo: struct of Pool
    struct PoolInfo {
        uint256 spotPrice;
        uint256 delta;
        uint256 spread;
        uint256 buyNum;
        uint256 sellNum;
    }

    //@param UserInfo: struct of user
    struct UserInfo {
        uint256 initBuyNum;
        uint256 initSellNum;
        uint256 initSellAmount;
        uint256 totalNFTpoint;
        uint256 totalFTpoint;
        uint256 totalNFTprice;
    }

    //@notice only router address
    modifier onlyRouter() {
        require(router == msg.sender, "onlyRouter");
        _;
    }

    //INTERNAL
    //@notice batch nft transfer
    function _sendNFTs(
        uint256[] calldata _tokenIds,
        uint256 _itemNum,
        address _from,
        address _to
    ) internal {
        unchecked {
            for (uint256 i = 0; i < _itemNum; i++) {
                IERC721(collection).safeTransferFrom(
                    _from,
                    _to,
                    _tokenIds[i],
                    ""
                );
            }
        }
    }

    //@notice update poolInfo
    function _updatePoolInfo(
        uint256 _newSpotPrice,
        uint256 _newDelta,
        uint256 _newSpread
    ) internal {
        if (_newSpotPrice != 0 && poolInfo.spotPrice != _newSpotPrice) {
            poolInfo.spotPrice = _newSpotPrice;
        }
        if (_newDelta != 0 && poolInfo.delta != _newDelta) {
            poolInfo.delta = _newDelta;
        }
        if (_newSpread != 0 && poolInfo.spread != _newSpread) {
            poolInfo.spread = _newSpread;
        }
    }

    //GET
    //@notice get pool info
    function getPoolInfo() external view returns (PoolInfo memory) {
        return poolInfo;
    }

    //@notice calculation total buy price
    function getCalcBuyInfo(uint256 _itemNum, uint256 _spotPrice)
        external
        view
        returns (uint256)
    {
        (, , , , uint256 _totalFee) = ICurve(bondingCurve).getBuyInfo(
            _spotPrice,
            poolInfo.delta,
            poolInfo.spread,
            _itemNum
        );
        return _totalFee;
    }

    //@notice calculation total sell price
    function getCalcSellInfo(uint256 _itemNum, uint256 _spotPrice)
        external
        view
        returns (uint256)
    {
        (, , , , uint256 _totalFee) = ICurve(bondingCurve).getSellInfo(
            _spotPrice,
            poolInfo.delta,
            poolInfo.spread,
            _itemNum
        );
        return _totalFee;
    }

    //SET
    //@notice set of Router address
    function setRouter(address _newRouter) external onlyRouter {
        router = _newRouter;
    }

    //@notice set of protocolFee ratio
    function setProtocolFeeRatio(uint256 _newProtocolFeeRatio)
        external
        onlyRouter
    {
        protocolFeeRatio = _newProtocolFeeRatio;
    }

    //RECEIVED
    //@notice receive関数
    function onERC721Received(
        address,
        address,
        uint256,
        bytes memory
    ) public virtual returns (bytes4) {
        return this.onERC721Received.selector;
    }

    //@notice receive関数
    fallback() external payable{}
    receive() external payable {}
}

// File: yomiswap-v2/src/NonOtherPool.sol


pragma solidity =0.8.17;


contract NonOtherPool is BasePool {
    //@param totalFee: totalFee of userFee
    uint256 internal totalFee;

    //@param userInfo: owner's userInfo
    UserInfo internal userInfo;

    modifier onlyNotOtherStake(address _user) {
        require(msg.sender == router, "Not Router");
        require(_user == owner, "Not Owner");
        _;
    }

    //@notice calc profit
    function _calcBuyProfit() internal returns (uint256) {
        if (sellEventNum > 0 && buyEventNum >= sellEventNum) {
            (uint256 lpFee, uint256 protocolFee) = ICurve(bondingCurve)
                .getBuyFeeInfo(
                    poolInfo.spotPrice,
                    poolInfo.delta,
                    poolInfo.spread,
                    sellEventNum,
                    protocolFeeRatio
                );
            totalFee += lpFee;
            buyEventNum -= sellEventNum;
            sellEventNum = 0;
            return protocolFee;
        }
    }

    //GET
    //@notice get userInfo of userInfo
    function getUserInfo() external view returns (UserInfo memory) {
        return userInfo;
    }

    //SET
    //@notice withdraw FT
    function withdrawOtherFT(uint256 _amount, address _user) external payable onlyNotOtherStake(_user) {
      payable(owner).transfer(_amount);
    }

    //@notice withdraw FT
    function withdrawOtherNFT(address _collection, uint256 _tokenId, address _user)external onlyNotOtherStake(_user) {
      IERC721(_collection).safeTransferFrom(address(this),owner,_tokenId);
    }
}

// File: yomiswap-v2/src/NativeNOPool.sol


pragma solidity =0.8.17;


contract NativeNOPool is NonOtherPool {
    //@notice swap FT for NFT
    function swapFTforNFT(uint256[] calldata _tokenIds, address _user)
        external
        payable
        onlyRouter
        returns (uint256 _protocolFee)
    {
        uint256 _itemNum = _tokenIds.length;

        //calc total fee
        (
            CurveErrorCodes.Error error,
            uint256 _newSpotPrice,
            uint256 _newDelta,
            uint256 _newDivergence,
            uint256 _totalFee
        ) = ICurve(bondingCurve).getBuyInfo(
                poolInfo.spotPrice,
                poolInfo.delta,
                poolInfo.spread,
                _itemNum
            );
        require(error == CurveErrorCodes.Error.OK, "BC Error");

        //check
        require(_itemNum <= poolInfo.buyNum, "Not enough liquidity");
        require(msg.value >= _totalFee, "Not enough value");

        //effect
        buyEventNum += _itemNum;
        poolInfo.buyNum -= _itemNum;
        poolInfo.sellNum += _itemNum;
        _protocolFee = 0;
        _updatePoolInfo(_newSpotPrice, _newDelta, _newDivergence);

        //intaraction
        payable(_user).transfer(msg.value - _totalFee);
        payable(router).transfer(_protocolFee);
        _sendNFTs(_tokenIds, _tokenIds.length, address(this), _user);
    }

    //@notice swap NFT for FT
    function swapNFTforFT(
        uint256[] calldata _tokenIds,
        uint256 _minExpectFee,
        address _user
    ) external payable onlyRouter returns (uint256 _protocolFee) {
        uint256 _itemNum = _tokenIds.length;

        //calc total fee
        (
            CurveErrorCodes.Error error,
            uint256 _newSpotPrice,
            uint256 _newDelta,
            uint256 _newDivergence,
            uint256 _totalFee
        ) = ICurve(bondingCurve).getSellInfo(
                poolInfo.spotPrice,
                poolInfo.delta,
                poolInfo.spread,
                _itemNum
            );
        require(error == CurveErrorCodes.Error.OK, "BC Error");

        //check
        require(_itemNum <= poolInfo.sellNum, "Not enough liquidity");
        require(_totalFee >= _minExpectFee, "Not expected value");
        require(address(this).balance >= _totalFee, "Not enough balance");

        //effect
        sellEventNum += _itemNum;
        poolInfo.sellNum -= _itemNum;
        poolInfo.buyNum += _itemNum;
        _protocolFee = _calcBuyProfit();
        _updatePoolInfo(_newSpotPrice, _newDelta, _newDivergence);

        //intaraction
        payable(_user).transfer(_totalFee);
        payable(router).transfer(_protocolFee);
        _sendNFTs(_tokenIds, _itemNum, _user, address(this));
    }
}

// File: yomiswap-v2/pool/CustomSingleNativeNOPool.sol


pragma solidity =0.8.17;




contract CustomSingleNativeNOPool is NativeNOPool {
    using FixedPointMathLibFmul for uint256;

    constructor(
        address _collection,
        address _bondingCurve,
        uint256 _spotPrice,
        uint256 _delta,
        uint256 _spread,
        uint256 _protocolFeeRatio,
        address _router,
        address _creater
    ) {
        collection = _collection;
        bondingCurve = _bondingCurve;
        poolInfo.spotPrice = _spotPrice;
        stakeNFTprice = _spotPrice;
        poolInfo.delta = _delta;
        poolInfo.spread = _spread;
        protocolFeeRatio = _protocolFeeRatio;
        router = _router;
        isOtherStake = false;
        isPair = false;
        paymentToken = address(0);
        owner = _creater;
    }

    //@notice Stake NFT
    function stakeNFT(uint256[] calldata _tokenIds, address _user)
        external
        onlyNotOtherStake(_user)
    {
        uint256 _itemNum = _tokenIds.length;
        require(_itemNum > 0, "Not 0");

        //effect
        userInfo.initBuyNum += _itemNum;
        poolInfo.buyNum += _itemNum;

        //intaraction
        _sendNFTs(_tokenIds, _itemNum, _user, address(this));
    }

    //@notice withdraw NFT
    function withdrawNFT(uint256[] calldata _tokenIds, address _user)
        external
        payable
        onlyNotOtherStake(_user)returns(uint256 _userFee)
    {
        uint256 _itemNum = _tokenIds.length;
        uint256 _userNum = userInfo.initBuyNum;
        _userFee = totalFee;

        //check
        require(poolInfo.buyNum >= _itemNum, "Pool not enough NFT");
        require(
            _userNum == _itemNum || _userNum > _itemNum && poolInfo.buyNum == _itemNum,
            "Something is wrong."
        );

        //effect
        poolInfo.buyNum -= _itemNum;
        userInfo.initBuyNum = 0;
        totalFee = 0;

        //if pool have not liquidity NFT
        if (_userNum > _itemNum) {
            uint256 _subItemNum = _userNum - _itemNum;

            //calc FT instead NFT
            (
                CurveErrorCodes.Error errorStakeNFTprice,
                uint256 _newStakeNFTprice,
                ,
                ,
                uint256 _totalInsteadFee
            ) = ICurve(bondingCurve).getBuyInfo(
                    stakeNFTprice,
                    poolInfo.delta,
                    0,
                    _subItemNum
                );
            require(errorStakeNFTprice == CurveErrorCodes.Error.OK, "BC Error");

            stakeNFTprice = _newStakeNFTprice;
            poolInfo.sellNum -= _subItemNum;
            buyEventNum -= _subItemNum;

            uint256 _protocolFee = _totalInsteadFee.fmul(poolInfo.spread,FixedPointMathLibFmul.WAD);
            uint256 _insteadNFT = _totalInsteadFee - _protocolFee;
            _userFee += _insteadNFT;
            payable(router).transfer(_protocolFee);
        }

        //intaraction
        _sendNFTs(_tokenIds, _itemNum, address(this), _user);
        //TODO 変更点
        if(address(this).balance >= _userFee){
          payable(_user).transfer(_userFee);
        } else {
          payable(_user).transfer(address(this).balance);
        }
    }

    //@notice withdraw part NFT
    function withdrawNFTpart(uint256[] calldata _tokenIds, address _user) external onlyNotOtherStake(_user) {
      uint256 _itemNum = _tokenIds.length;

      //check
      require(_itemNum > 0,"Not 0");
      require(poolInfo.buyNum >= _itemNum, "Pool Not NFT");

      //effect
      poolInfo.buyNum -= _itemNum;
      userInfo.initBuyNum -= _itemNum;

      //interaction
      _sendNFTs(_tokenIds, _itemNum, address(this), _user);
    }

    //@notice withdraw fee
    function withdrawFee(address _user)
        external
        payable
        onlyNotOtherStake(_user)
    {
        uint256 _totalFee = totalFee;

        //check
        require(_totalFee > 0,"Not Fee");

        //effect
        totalFee = 0;

        //intaraction
        //TODO 変更点
        if(address(this).balance >= _totalFee){
          payable(_user).transfer(_totalFee);
        } else {
          payable(_user).transfer(address(this).balance);
        }
    }

    //@notice reset spotPrice delta spread
    function reset(
        address _bondingCurve,
        uint256 _newSpotPrice, 
        uint256 _newDelta, 
        uint256 _newSpread,
        address _user
        )external onlyNotOtherStake(_user)
    {
        //check
        require(poolInfo.sellNum == 0,"Not Change Time");

        //effect
        _updatePoolInfo(_newSpotPrice, _newDelta, _newSpread);
        stakeNFTprice = _newSpotPrice;
        bondingCurve = _bondingCurve;
    }

    //@notice get user stake fee
    function getUserStakeFee() external view returns (uint256) {
        return totalFee;
    }
}

// File: yomiswap-v2/factory/FactoryCustomSingleNativeNOPool.sol


pragma solidity =0.8.17;





contract FactoryCustomSingleNativeNOPool is Ownable {
    address public router;
    uint256 public routerFeeRatio;

    //CONSTRCTOR
    constructor(address _router, uint256 _routerFeeRatio) {
        router = _router;
        routerFeeRatio = _routerFeeRatio;
    }

    //EVENT
    event CreatePool(address indexed pool, address indexed collection);

    //MAIN
    function createPool(
        address _collection,
        address _bondingCurve,
        uint256 _spotPrice,
        uint256 _delta,
        uint256 _spread
    ) external {
        require(
            IERC165(_collection).supportsInterface(type(IERC721).interfaceId),
            "OnlyERC721"
        );
        require(IRouter(router).getIsCollectionApprove(_collection) == true);
        require(
            IRouter(router).getIsBondingCurveApprove(_bondingCurve) == true
        );

        address _pool = address(
            new CustomSingleNativeNOPool(
                _collection,
                _bondingCurve,
                _spotPrice,
                _delta,
                _spread,
                routerFeeRatio,
                router,
                msg.sender
            )
        );
        IRouter(router).setPool(_pool, true);
        emit CreatePool(_pool, _collection);
    }

    //SET
    function setRouterAddress(address _newRouter) public onlyOwner {
        router = _newRouter;
    }

    function setRouterFeeRatio(uint256 _newRouterFeeRatio) public onlyOwner {
        routerFeeRatio = _newRouterFeeRatio;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"uint256","name":"_routerFeeRatio","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":true,"internalType":"address","name":"collection","type":"address"}],"name":"CreatePool","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"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"address","name":"_bondingCurve","type":"address"},{"internalType":"uint256","name":"_spotPrice","type":"uint256"},{"internalType":"uint256","name":"_delta","type":"uint256"},{"internalType":"uint256","name":"_spread","type":"uint256"}],"name":"createPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerFeeRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newRouter","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRouterFeeRatio","type":"uint256"}],"name":"setRouterFeeRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620049cd380380620049cd833981810160405281019062000037919062000218565b620000576200004b620000a760201b60201c565b620000af60201b60201c565b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060028190555050506200025f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001a58262000178565b9050919050565b620001b78162000198565b8114620001c357600080fd5b50565b600081519050620001d781620001ac565b92915050565b6000819050919050565b620001f281620001dd565b8114620001fe57600080fd5b50565b6000815190506200021281620001e7565b92915050565b6000806040838503121562000232576200023162000173565b5b60006200024285828601620001c6565b9250506020620002558582860162000201565b9150509250929050565b61475e806200026f6000396000f3fe60806040523480156200001157600080fd5b5060043610620000945760003560e01c80638da5cb5b11620000635780638da5cb5b1462000105578063f2fde38b1462000127578063f864fa1e1462000147578063f887ea4014620001695762000094565b806341cb87fc14620000995780635f8b2f0e14620000b9578063715018a614620000d957806385ac165a14620000e5575b600080fd5b620000b76004803603810190620000b191906200085b565b6200018b565b005b620000d76004803603810190620000d19190620008c8565b620001d9565b005b620000e3620001ed565b005b620001036004803603810190620000fd9190620008fa565b62000205565b005b6200010f620005b3565b6040516200011e919062000993565b60405180910390f35b6200014560048036038101906200013f91906200085b565b620005dc565b005b6200015162000666565b604051620001609190620009c1565b60405180910390f35b620001736200066c565b60405162000182919062000993565b60405180910390f35b6200019562000692565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620001e362000692565b8060028190555050565b620001f762000692565b62000203600062000717565b565b8473ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f80ac58cd000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040162000260919062000a1b565b602060405180830381865afa1580156200027e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a4919062000a75565b620002e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002dd9062000b08565b60405180910390fd5b60011515600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc5a0df5876040518263ffffffff1660e01b815260040162000347919062000993565b6020604051808303816000875af115801562000367573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200038d919062000a75565b1515146200039a57600080fd5b60011515600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b65bfbf0866040518263ffffffff1660e01b8152600401620003fb919062000993565b6020604051808303816000875af11580156200041b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000441919062000a75565b1515146200044e57600080fd5b60008585858585600254600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16336040516200048a90620007e3565b6200049d98979695949392919062000b2a565b604051809103906000f080158015620004ba573d6000803e3d6000fd5b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166320bec12c8260016040518363ffffffff1660e01b81526004016200051d92919062000bc9565b600060405180830381600087803b1580156200053857600080fd5b505af11580156200054d573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fdbd2a1ea6808362e6adbec4db4969cbc11e3b0b28fb6c74cb342defaaf1daada60405160405180910390a3505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620005e662000692565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000658576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200064f9062000c6c565b60405180910390fd5b620006638162000717565b50565b60025481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6200069c620007db565b73ffffffffffffffffffffffffffffffffffffffff16620006bc620005b3565b73ffffffffffffffffffffffffffffffffffffffff161462000715576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200070c9062000cde565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b613a288062000d0183390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082382620007f6565b9050919050565b620008358162000816565b81146200084157600080fd5b50565b60008135905062000855816200082a565b92915050565b600060208284031215620008745762000873620007f1565b5b6000620008848482850162000844565b91505092915050565b6000819050919050565b620008a2816200088d565b8114620008ae57600080fd5b50565b600081359050620008c28162000897565b92915050565b600060208284031215620008e157620008e0620007f1565b5b6000620008f184828501620008b1565b91505092915050565b600080600080600060a08688031215620009195762000918620007f1565b5b6000620009298882890162000844565b95505060206200093c8882890162000844565b94505060406200094f88828901620008b1565b93505060606200096288828901620008b1565b92505060806200097588828901620008b1565b9150509295509295909350565b6200098d8162000816565b82525050565b6000602082019050620009aa600083018462000982565b92915050565b620009bb816200088d565b82525050565b6000602082019050620009d86000830184620009b0565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000a1581620009de565b82525050565b600060208201905062000a32600083018462000a0a565b92915050565b60008115159050919050565b62000a4f8162000a38565b811462000a5b57600080fd5b50565b60008151905062000a6f8162000a44565b92915050565b60006020828403121562000a8e5762000a8d620007f1565b5b600062000a9e8482850162000a5e565b91505092915050565b600082825260208201905092915050565b7f4f6e6c7945524337323100000000000000000000000000000000000000000000600082015250565b600062000af0600a8362000aa7565b915062000afd8262000ab8565b602082019050919050565b6000602082019050818103600083015262000b238162000ae1565b9050919050565b60006101008201905062000b42600083018b62000982565b62000b51602083018a62000982565b62000b606040830189620009b0565b62000b6f6060830188620009b0565b62000b7e6080830187620009b0565b62000b8d60a0830186620009b0565b62000b9c60c083018562000982565b62000bab60e083018462000982565b9998505050505050505050565b62000bc38162000a38565b82525050565b600060408201905062000be0600083018562000982565b62000bef602083018462000bb8565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062000c5460268362000aa7565b915062000c618262000bf6565b604082019050919050565b6000602082019050818103600083015262000c878162000c45565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000cc660208362000aa7565b915062000cd38262000c8e565b602082019050919050565b6000602082019050818103600083015262000cf98162000cb7565b905091905056fe6080604052670de0b6b3a76400006000553480156200001d57600080fd5b5060405162003a2838038062003a2883398181016040528101906200004391906200029e565b87600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600c600001819055508560098190555084600c6001018190555083600c600201819055508260068190555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff0219169083151502179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050505062000367565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200022b82620001fe565b9050919050565b6200023d816200021e565b81146200024957600080fd5b50565b6000815190506200025d8162000232565b92915050565b6000819050919050565b620002788162000263565b81146200028457600080fd5b50565b60008151905062000298816200026d565b92915050565b600080600080600080600080610100898b031215620002c257620002c1620001f9565b5b6000620002d28b828c016200024c565b9850506020620002e58b828c016200024c565b9750506040620002f88b828c0162000287565b96505060606200030b8b828c0162000287565b95505060806200031e8b828c0162000287565b94505060a0620003318b828c0162000287565b93505060c0620003448b828c016200024c565b92505060e0620003578b828c016200024c565b9150509295985092959890939650565b6136b180620003776000396000f3fe6080604052600436106101c65760003560e01c80637a27d9f6116100f7578063bbd265ab11610095578063f829e9fc11610064578063f829e9fc14610621578063f887ea401461064a578063f968f33b14610675578063fc5ad2df1461069e576101cd565b8063bbd265ab14610586578063c0d78655146105b1578063efb17659146105da578063eff1d50e146105f6576101cd565b806388e5cd1f116100d157806388e5cd1f146104ca578063895af871146105075780638da5cb5b14610532578063a09f32111461055d576101cd565b80637a27d9f6146104495780637b6880ca146104745780637de1e5361461049f576101cd565b80633013ce29116101645780634c4cbac41161013e5780634c4cbac4146103865780635d8d1585146103b657806360246c88146103e157806365b962311461040c576101cd565b80633013ce291461030757806340f607851461033257806341ede57e1461035d576101cd565b8063244117b4116101a0578063244117b4146102535780632767fa4b146102835780632c7e4915146102ae5780632f7e0b2e146102de576101cd565b806302b6b7b3146101cf578063150b7a02146101fa5780631ac3ddeb14610237576101cd565b366101cd57005b005b3480156101db57600080fd5b506101e46106c9565b6040516101f19190612584565b60405180910390f35b34801561020657600080fd5b50610221600480360381019061021c919061278d565b6106dc565b60405161022e919061284b565b60405180910390f35b610251600480360381019061024c9190612866565b6106f0565b005b61026d600480360381019061026891906128f3565b610903565b60405161027a9190612976565b60405180910390f35b34801561028f57600080fd5b50610298610cc6565b6040516102a59190612976565b60405180910390f35b6102c860048036038101906102c39190612991565b610ccc565b6040516102d59190612976565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190612991565b6111b1565b005b34801561031357600080fd5b5061031c611369565b6040516103299190612a00565b60405180910390f35b34801561033e57600080fd5b5061034761138f565b6040516103549190612976565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f9190612a1b565b611399565b005b6103a0600480360381019061039b9190612991565b611433565b6040516103ad9190612976565b60405180910390f35b3480156103c257600080fd5b506103cb6117ba565b6040516103d89190612ad2565b60405180910390f35b3480156103ed57600080fd5b506103f6611810565b6040516104039190612b55565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190612b70565b61185c565b6040516104409190612976565b60405180910390f35b34801561045557600080fd5b5061045e61191b565b60405161046b9190612976565b60405180910390f35b34801561048057600080fd5b50610489611921565b6040516104969190612976565b60405180910390f35b3480156104ab57600080fd5b506104b4611927565b6040516104c19190612a00565b60405180910390f35b3480156104d657600080fd5b506104f160048036038101906104ec9190612b70565b61194d565b6040516104fe9190612976565b60405180910390f35b34801561051357600080fd5b5061051c611a0c565b6040516105299190612976565b60405180910390f35b34801561053e57600080fd5b50610547611a12565b6040516105549190612a00565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190612bb0565b611a38565b005b34801561059257600080fd5b5061059b611bf0565b6040516105a89190612584565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190612866565b611c03565b005b6105f460048036038101906105ef9190612c03565b611cd7565b005b34801561060257600080fd5b5061060b611e66565b6040516106189190612a00565b60405180910390f35b34801561062d57600080fd5b5061064860048036038101906106439190612c43565b611e8c565b005b34801561065657600080fd5b5061065f612050565b60405161066c9190612a00565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190612991565b612076565b005b3480156106aa57600080fd5b506106b3612276565b6040516106c09190612976565b60405180910390f35b600b60019054906101000a900460ff1681565b600063150b7a0260e01b9050949350505050565b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077890612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080890612d87565b60405180910390fd5b600060115490506000811161085b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085290612df3565b60405180910390fd5b60006011819055508047106108b6578273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156108b0573d6000803e3d6000fd5b506108fe565b8273ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156108fc573d6000803e3d6000fd5b505b505050565b60003373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098c90612e5f565b60405180910390fd5b60008585905090506000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed67cc91600c60000154600c60010154600c600201548a6040518563ffffffff1660e01b8152600401610a159493929190612e7f565b60a060405180830381865afa158015610a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a569190612efe565b9450945094509450945060006002811115610a7457610a73612f79565b5b856002811115610a8757610a86612f79565b5b14610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90612ff4565b60405180910390fd5b600c60040154861115610b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0690613060565b60405180910390fd5b88811015610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906130cc565b60405180910390fd5b80471015610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90613138565b60405180910390fd5b8560086000828254610ba79190613187565b9250508190555085600c6004016000828254610bc391906131bb565b9250508190555085600c6003016000828254610bdf9190613187565b92505081905550610bee61227c565b9650610bfb84848461239f565b8773ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c41573d6000803e3d6000fd5b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc889081150290604051600060405180830381858888f19350505050158015610caa573d6000803e3d6000fd5b50610cb88b8b888b30612416565b505050505050949350505050565b60095481565b600081600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5690612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de690612d87565b60405180910390fd5b600085859050905060006012600001549050601154935081600c600301541015610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e459061323b565b60405180910390fd5b81811480610e6b57508181118015610e6a575081600c60030154145b5b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea1906132a7565b60405180910390fd5b81600c6003016000828254610ebf91906131bb565b9250508190555060006012600001819055506000601181905550818111156110ff5760008282610eef91906131bb565b90506000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630320bc4a600954600c600101546000886040518563ffffffff1660e01b8152600401610f5f949392919061330c565b60a060405180830381865afa158015610f7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa09190612efe565b945050509250925060006002811115610fbc57610fbb612f79565b5b836002811115610fcf57610fce612f79565b5b1461100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690612ff4565b60405180910390fd5b8160098190555083600c600401600082825461102b91906131bb565b92505081905550836007600082825461104491906131bb565b92505081905550600061106f600c60020154670de0b6b3a7640000846124e09092919063ffffffff16565b90506000818361107f91906131bb565b9050808a61108d9190613187565b9950600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156110f7573d6000803e3d6000fd5b505050505050505b61110c8787843089612416565b83471061115f578473ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015611159573d6000803e3d6000fd5b506111a7565b8473ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111a5573d6000803e3d6000fd5b505b5050509392505050565b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c990612d87565b60405180910390fd5b60008484905090506000811161131d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113149061339d565b60405180910390fd5b80601260000160008282546113329190613187565b9250508190555080600c600301600082825461134e9190613187565b925050819055506113628585838630612416565b5050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601154905090565b3373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090612e5f565b60405180910390fd5b8060068190555050565b60003373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bc90612e5f565b60405180910390fd5b60008484905090506000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630320bc4a600c60000154600c60010154600c600201548a6040518563ffffffff1660e01b81526004016115459493929190612e7f565b60a060405180830381865afa158015611562573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115869190612efe565b94509450945094509450600060028111156115a4576115a3612f79565b5b8560028111156115b7576115b6612f79565b5b146115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee90612ff4565b60405180910390fd5b600c6003015486111561163f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163690613060565b60405180910390fd5b80341015611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167990613409565b60405180910390fd5b85600760008282546116949190613187565b9250508190555085600c60030160008282546116b091906131bb565b9250508190555085600c60040160008282546116cc9190613187565b92505081905550600096506116e284848461239f565b8773ffffffffffffffffffffffffffffffffffffffff166108fc823461170891906131bb565b9081150290604051600060405180830381858888f19350505050158015611733573d6000803e3d6000fd5b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc889081150290604051600060405180830381858888f1935050505015801561179c573d6000803e3d6000fd5b506117ad8a8a8c8c9050308c612416565b5050505050509392505050565b6117c2612504565b60126040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905090565b61181861253a565b600c6040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905090565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630320bc4a84600c60010154600c60020154886040518563ffffffff1660e01b81526004016118ca9493929190612e7f565b60a060405180830381865afa1580156118e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190b9190612efe565b9450505050508091505092915050565b60065481565b600a5481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed67cc9184600c60010154600c60020154886040518563ffffffff1660e01b81526004016119bb9493929190612e7f565b60a060405180830381865afa1580156119d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fc9190612efe565b9450505050508091505092915050565b60085481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac090612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090612d87565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff166342842e0e30600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518463ffffffff1660e01b8152600401611bb893929190613429565b600060405180830381600087803b158015611bd257600080fd5b505af1158015611be6573d6000803e3d6000fd5b5050505050505050565b600b60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90612e5f565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611def90612d87565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611e60573d6000803e3d6000fd5b50505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1490612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa490612d87565b60405180910390fd5b6000600c6004015414611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec906134ac565b60405180910390fd5b61200085858561239f565b8460098190555085600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fe90612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e90612d87565b60405180910390fd5b6000848490509050600081116121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d99061339d565b60405180910390fd5b80600c60030154101561222a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222190613518565b60405180910390fd5b80600c600301600082825461223f91906131bb565b92505081905550806012600001600082825461225b91906131bb565b9250508190555061226f8585833087612416565b5050505050565b60075481565b600080600854118015612293575060085460075410155b1561239b57600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ea363db5600c60000154600c60010154600c600201546008546006546040518663ffffffff1660e01b8152600401612311959493929190613538565b6040805180830381865afa15801561232d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612351919061358b565b9150915081601160008282546123679190613187565b925050819055506008546007600082825461238291906131bb565b925050819055506000600881905550809250505061239c565b5b90565b600083141580156123b5575082600c6000015414155b156123c55782600c600001819055505b600082141580156123db575081600c6001015414155b156123eb5781600c600101819055505b60008114158015612401575080600c6002015414155b156124115780600c600201819055505b505050565b60005b838110156124d857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde8484898986818110612474576124736135cb565b5b905060200201356040518463ffffffff1660e01b815260040161249993929190613631565b600060405180830381600087803b1580156124b357600080fd5b505af11580156124c7573d6000803e3d6000fd5b505050508080600101915050612419565b505050505050565b6000828402905082848204148415176124f857600080fd5b81810490509392505050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60008115159050919050565b61257e81612569565b82525050565b60006020820190506125996000830184612575565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006125de826125b3565b9050919050565b6125ee816125d3565b81146125f957600080fd5b50565b60008135905061260b816125e5565b92915050565b6000819050919050565b61262481612611565b811461262f57600080fd5b50565b6000813590506126418161261b565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61269a82612651565b810181811067ffffffffffffffff821117156126b9576126b8612662565b5b80604052505050565b60006126cc61259f565b90506126d88282612691565b919050565b600067ffffffffffffffff8211156126f8576126f7612662565b5b61270182612651565b9050602081019050919050565b82818337600083830152505050565b600061273061272b846126dd565b6126c2565b90508281526020810184848401111561274c5761274b61264c565b5b61275784828561270e565b509392505050565b600082601f83011261277457612773612647565b5b813561278484826020860161271d565b91505092915050565b600080600080608085870312156127a7576127a66125a9565b5b60006127b5878288016125fc565b94505060206127c6878288016125fc565b93505060406127d787828801612632565b925050606085013567ffffffffffffffff8111156127f8576127f76125ae565b5b6128048782880161275f565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61284581612810565b82525050565b6000602082019050612860600083018461283c565b92915050565b60006020828403121561287c5761287b6125a9565b5b600061288a848285016125fc565b91505092915050565b600080fd5b600080fd5b60008083601f8401126128b3576128b2612647565b5b8235905067ffffffffffffffff8111156128d0576128cf612893565b5b6020830191508360208202830111156128ec576128eb612898565b5b9250929050565b6000806000806060858703121561290d5761290c6125a9565b5b600085013567ffffffffffffffff81111561292b5761292a6125ae565b5b6129378782880161289d565b9450945050602061294a87828801612632565b925050604061295b878288016125fc565b91505092959194509250565b61297081612611565b82525050565b600060208201905061298b6000830184612967565b92915050565b6000806000604084860312156129aa576129a96125a9565b5b600084013567ffffffffffffffff8111156129c8576129c76125ae565b5b6129d48682870161289d565b935093505060206129e7868287016125fc565b9150509250925092565b6129fa816125d3565b82525050565b6000602082019050612a1560008301846129f1565b92915050565b600060208284031215612a3157612a306125a9565b5b6000612a3f84828501612632565b91505092915050565b612a5181612611565b82525050565b60c082016000820151612a6d6000850182612a48565b506020820151612a806020850182612a48565b506040820151612a936040850182612a48565b506060820151612aa66060850182612a48565b506080820151612ab96080850182612a48565b5060a0820151612acc60a0850182612a48565b50505050565b600060c082019050612ae76000830184612a57565b92915050565b60a082016000820151612b036000850182612a48565b506020820151612b166020850182612a48565b506040820151612b296040850182612a48565b506060820151612b3c6060850182612a48565b506080820151612b4f6080850182612a48565b50505050565b600060a082019050612b6a6000830184612aed565b92915050565b60008060408385031215612b8757612b866125a9565b5b6000612b9585828601612632565b9250506020612ba685828601612632565b9150509250929050565b600080600060608486031215612bc957612bc86125a9565b5b6000612bd7868287016125fc565b9350506020612be886828701612632565b9250506040612bf9868287016125fc565b9150509250925092565b60008060408385031215612c1a57612c196125a9565b5b6000612c2885828601612632565b9250506020612c39858286016125fc565b9150509250929050565b600080600080600060a08688031215612c5f57612c5e6125a9565b5b6000612c6d888289016125fc565b9550506020612c7e88828901612632565b9450506040612c8f88828901612632565b9350506060612ca088828901612632565b9250506080612cb1888289016125fc565b9150509295509295909350565b600082825260208201905092915050565b7f4e6f7420526f7574657200000000000000000000000000000000000000000000600082015250565b6000612d05600a83612cbe565b9150612d1082612ccf565b602082019050919050565b60006020820190508181036000830152612d3481612cf8565b9050919050565b7f4e6f74204f776e65720000000000000000000000000000000000000000000000600082015250565b6000612d71600983612cbe565b9150612d7c82612d3b565b602082019050919050565b60006020820190508181036000830152612da081612d64565b9050919050565b7f4e6f742046656500000000000000000000000000000000000000000000000000600082015250565b6000612ddd600783612cbe565b9150612de882612da7565b602082019050919050565b60006020820190508181036000830152612e0c81612dd0565b9050919050565b7f6f6e6c79526f7574657200000000000000000000000000000000000000000000600082015250565b6000612e49600a83612cbe565b9150612e5482612e13565b602082019050919050565b60006020820190508181036000830152612e7881612e3c565b9050919050565b6000608082019050612e946000830187612967565b612ea16020830186612967565b612eae6040830185612967565b612ebb6060830184612967565b95945050505050565b60038110612ed157600080fd5b50565b600081519050612ee381612ec4565b92915050565b600081519050612ef88161261b565b92915050565b600080600080600060a08688031215612f1a57612f196125a9565b5b6000612f2888828901612ed4565b9550506020612f3988828901612ee9565b9450506040612f4a88828901612ee9565b9350506060612f5b88828901612ee9565b9250506080612f6c88828901612ee9565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4243204572726f72000000000000000000000000000000000000000000000000600082015250565b6000612fde600883612cbe565b9150612fe982612fa8565b602082019050919050565b6000602082019050818103600083015261300d81612fd1565b9050919050565b7f4e6f7420656e6f756768206c6971756964697479000000000000000000000000600082015250565b600061304a601483612cbe565b915061305582613014565b602082019050919050565b600060208201905081810360008301526130798161303d565b9050919050565b7f4e6f742065787065637465642076616c75650000000000000000000000000000600082015250565b60006130b6601283612cbe565b91506130c182613080565b602082019050919050565b600060208201905081810360008301526130e5816130a9565b9050919050565b7f4e6f7420656e6f7567682062616c616e63650000000000000000000000000000600082015250565b6000613122601283612cbe565b915061312d826130ec565b602082019050919050565b6000602082019050818103600083015261315181613115565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061319282612611565b915061319d83612611565b92508282019050808211156131b5576131b4613158565b5b92915050565b60006131c682612611565b91506131d183612611565b92508282039050818111156131e9576131e8613158565b5b92915050565b7f506f6f6c206e6f7420656e6f756768204e465400000000000000000000000000600082015250565b6000613225601383612cbe565b9150613230826131ef565b602082019050919050565b6000602082019050818103600083015261325481613218565b9050919050565b7f536f6d657468696e672069732077726f6e672e00000000000000000000000000600082015250565b6000613291601383612cbe565b915061329c8261325b565b602082019050919050565b600060208201905081810360008301526132c081613284565b9050919050565b6000819050919050565b6000819050919050565b60006132f66132f16132ec846132c7565b6132d1565b612611565b9050919050565b613306816132db565b82525050565b60006080820190506133216000830187612967565b61332e6020830186612967565b61333b60408301856132fd565b6133486060830184612967565b95945050505050565b7f4e6f742030000000000000000000000000000000000000000000000000000000600082015250565b6000613387600583612cbe565b915061339282613351565b602082019050919050565b600060208201905081810360008301526133b68161337a565b9050919050565b7f4e6f7420656e6f7567682076616c756500000000000000000000000000000000600082015250565b60006133f3601083612cbe565b91506133fe826133bd565b602082019050919050565b60006020820190508181036000830152613422816133e6565b9050919050565b600060608201905061343e60008301866129f1565b61344b60208301856129f1565b6134586040830184612967565b949350505050565b7f4e6f74204368616e67652054696d650000000000000000000000000000000000600082015250565b6000613496600f83612cbe565b91506134a182613460565b602082019050919050565b600060208201905081810360008301526134c581613489565b9050919050565b7f506f6f6c204e6f74204e46540000000000000000000000000000000000000000600082015250565b6000613502600c83612cbe565b915061350d826134cc565b602082019050919050565b60006020820190508181036000830152613531816134f5565b9050919050565b600060a08201905061354d6000830188612967565b61355a6020830187612967565b6135676040830186612967565b6135746060830185612967565b6135816080830184612967565b9695505050505050565b600080604083850312156135a2576135a16125a9565b5b60006135b085828601612ee9565b92505060206135c185828601612ee9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b50565b600061361b6000836135fa565b91506136268261360b565b600082019050919050565b600060808201905061364660008301866129f1565b61365360208301856129f1565b6136606040830184612967565b81810360608301526136718161360e565b905094935050505056fea2646970667358221220f9c5ba4aaf56622784420d963ebb5f9f973c9ca074de7cdd18887146bcbe7fd664736f6c63430008110033a2646970667358221220de98f4ac6f3224ab84bb619a36c24453b7cb60d666e55b8a085673c88cb9286864736f6c634300081100330000000000000000000000007cd70b36ba8fcbd888e9c26840b9300ac64d29a900000000000000000000000000000000000000000000000002c68af0bb140000

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620000945760003560e01c80638da5cb5b11620000635780638da5cb5b1462000105578063f2fde38b1462000127578063f864fa1e1462000147578063f887ea4014620001695762000094565b806341cb87fc14620000995780635f8b2f0e14620000b9578063715018a614620000d957806385ac165a14620000e5575b600080fd5b620000b76004803603810190620000b191906200085b565b6200018b565b005b620000d76004803603810190620000d19190620008c8565b620001d9565b005b620000e3620001ed565b005b620001036004803603810190620000fd9190620008fa565b62000205565b005b6200010f620005b3565b6040516200011e919062000993565b60405180910390f35b6200014560048036038101906200013f91906200085b565b620005dc565b005b6200015162000666565b604051620001609190620009c1565b60405180910390f35b620001736200066c565b60405162000182919062000993565b60405180910390f35b6200019562000692565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620001e362000692565b8060028190555050565b620001f762000692565b62000203600062000717565b565b8473ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f80ac58cd000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040162000260919062000a1b565b602060405180830381865afa1580156200027e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a4919062000a75565b620002e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002dd9062000b08565b60405180910390fd5b60011515600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc5a0df5876040518263ffffffff1660e01b815260040162000347919062000993565b6020604051808303816000875af115801562000367573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200038d919062000a75565b1515146200039a57600080fd5b60011515600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b65bfbf0866040518263ffffffff1660e01b8152600401620003fb919062000993565b6020604051808303816000875af11580156200041b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000441919062000a75565b1515146200044e57600080fd5b60008585858585600254600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16336040516200048a90620007e3565b6200049d98979695949392919062000b2a565b604051809103906000f080158015620004ba573d6000803e3d6000fd5b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166320bec12c8260016040518363ffffffff1660e01b81526004016200051d92919062000bc9565b600060405180830381600087803b1580156200053857600080fd5b505af11580156200054d573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fdbd2a1ea6808362e6adbec4db4969cbc11e3b0b28fb6c74cb342defaaf1daada60405160405180910390a3505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620005e662000692565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000658576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200064f9062000c6c565b60405180910390fd5b620006638162000717565b50565b60025481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6200069c620007db565b73ffffffffffffffffffffffffffffffffffffffff16620006bc620005b3565b73ffffffffffffffffffffffffffffffffffffffff161462000715576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200070c9062000cde565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b613a288062000d0183390190565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082382620007f6565b9050919050565b620008358162000816565b81146200084157600080fd5b50565b60008135905062000855816200082a565b92915050565b600060208284031215620008745762000873620007f1565b5b6000620008848482850162000844565b91505092915050565b6000819050919050565b620008a2816200088d565b8114620008ae57600080fd5b50565b600081359050620008c28162000897565b92915050565b600060208284031215620008e157620008e0620007f1565b5b6000620008f184828501620008b1565b91505092915050565b600080600080600060a08688031215620009195762000918620007f1565b5b6000620009298882890162000844565b95505060206200093c8882890162000844565b94505060406200094f88828901620008b1565b93505060606200096288828901620008b1565b92505060806200097588828901620008b1565b9150509295509295909350565b6200098d8162000816565b82525050565b6000602082019050620009aa600083018462000982565b92915050565b620009bb816200088d565b82525050565b6000602082019050620009d86000830184620009b0565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000a1581620009de565b82525050565b600060208201905062000a32600083018462000a0a565b92915050565b60008115159050919050565b62000a4f8162000a38565b811462000a5b57600080fd5b50565b60008151905062000a6f8162000a44565b92915050565b60006020828403121562000a8e5762000a8d620007f1565b5b600062000a9e8482850162000a5e565b91505092915050565b600082825260208201905092915050565b7f4f6e6c7945524337323100000000000000000000000000000000000000000000600082015250565b600062000af0600a8362000aa7565b915062000afd8262000ab8565b602082019050919050565b6000602082019050818103600083015262000b238162000ae1565b9050919050565b60006101008201905062000b42600083018b62000982565b62000b51602083018a62000982565b62000b606040830189620009b0565b62000b6f6060830188620009b0565b62000b7e6080830187620009b0565b62000b8d60a0830186620009b0565b62000b9c60c083018562000982565b62000bab60e083018462000982565b9998505050505050505050565b62000bc38162000a38565b82525050565b600060408201905062000be0600083018562000982565b62000bef602083018462000bb8565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062000c5460268362000aa7565b915062000c618262000bf6565b604082019050919050565b6000602082019050818103600083015262000c878162000c45565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000cc660208362000aa7565b915062000cd38262000c8e565b602082019050919050565b6000602082019050818103600083015262000cf98162000cb7565b905091905056fe6080604052670de0b6b3a76400006000553480156200001d57600080fd5b5060405162003a2838038062003a2883398181016040528101906200004391906200029e565b87600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600c600001819055508560098190555084600c6001018190555083600c600201819055508260068190555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff0219169083151502179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050505062000367565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200022b82620001fe565b9050919050565b6200023d816200021e565b81146200024957600080fd5b50565b6000815190506200025d8162000232565b92915050565b6000819050919050565b620002788162000263565b81146200028457600080fd5b50565b60008151905062000298816200026d565b92915050565b600080600080600080600080610100898b031215620002c257620002c1620001f9565b5b6000620002d28b828c016200024c565b9850506020620002e58b828c016200024c565b9750506040620002f88b828c0162000287565b96505060606200030b8b828c0162000287565b95505060806200031e8b828c0162000287565b94505060a0620003318b828c0162000287565b93505060c0620003448b828c016200024c565b92505060e0620003578b828c016200024c565b9150509295985092959890939650565b6136b180620003776000396000f3fe6080604052600436106101c65760003560e01c80637a27d9f6116100f7578063bbd265ab11610095578063f829e9fc11610064578063f829e9fc14610621578063f887ea401461064a578063f968f33b14610675578063fc5ad2df1461069e576101cd565b8063bbd265ab14610586578063c0d78655146105b1578063efb17659146105da578063eff1d50e146105f6576101cd565b806388e5cd1f116100d157806388e5cd1f146104ca578063895af871146105075780638da5cb5b14610532578063a09f32111461055d576101cd565b80637a27d9f6146104495780637b6880ca146104745780637de1e5361461049f576101cd565b80633013ce29116101645780634c4cbac41161013e5780634c4cbac4146103865780635d8d1585146103b657806360246c88146103e157806365b962311461040c576101cd565b80633013ce291461030757806340f607851461033257806341ede57e1461035d576101cd565b8063244117b4116101a0578063244117b4146102535780632767fa4b146102835780632c7e4915146102ae5780632f7e0b2e146102de576101cd565b806302b6b7b3146101cf578063150b7a02146101fa5780631ac3ddeb14610237576101cd565b366101cd57005b005b3480156101db57600080fd5b506101e46106c9565b6040516101f19190612584565b60405180910390f35b34801561020657600080fd5b50610221600480360381019061021c919061278d565b6106dc565b60405161022e919061284b565b60405180910390f35b610251600480360381019061024c9190612866565b6106f0565b005b61026d600480360381019061026891906128f3565b610903565b60405161027a9190612976565b60405180910390f35b34801561028f57600080fd5b50610298610cc6565b6040516102a59190612976565b60405180910390f35b6102c860048036038101906102c39190612991565b610ccc565b6040516102d59190612976565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190612991565b6111b1565b005b34801561031357600080fd5b5061031c611369565b6040516103299190612a00565b60405180910390f35b34801561033e57600080fd5b5061034761138f565b6040516103549190612976565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f9190612a1b565b611399565b005b6103a0600480360381019061039b9190612991565b611433565b6040516103ad9190612976565b60405180910390f35b3480156103c257600080fd5b506103cb6117ba565b6040516103d89190612ad2565b60405180910390f35b3480156103ed57600080fd5b506103f6611810565b6040516104039190612b55565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190612b70565b61185c565b6040516104409190612976565b60405180910390f35b34801561045557600080fd5b5061045e61191b565b60405161046b9190612976565b60405180910390f35b34801561048057600080fd5b50610489611921565b6040516104969190612976565b60405180910390f35b3480156104ab57600080fd5b506104b4611927565b6040516104c19190612a00565b60405180910390f35b3480156104d657600080fd5b506104f160048036038101906104ec9190612b70565b61194d565b6040516104fe9190612976565b60405180910390f35b34801561051357600080fd5b5061051c611a0c565b6040516105299190612976565b60405180910390f35b34801561053e57600080fd5b50610547611a12565b6040516105549190612a00565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190612bb0565b611a38565b005b34801561059257600080fd5b5061059b611bf0565b6040516105a89190612584565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190612866565b611c03565b005b6105f460048036038101906105ef9190612c03565b611cd7565b005b34801561060257600080fd5b5061060b611e66565b6040516106189190612a00565b60405180910390f35b34801561062d57600080fd5b5061064860048036038101906106439190612c43565b611e8c565b005b34801561065657600080fd5b5061065f612050565b60405161066c9190612a00565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190612991565b612076565b005b3480156106aa57600080fd5b506106b3612276565b6040516106c09190612976565b60405180910390f35b600b60019054906101000a900460ff1681565b600063150b7a0260e01b9050949350505050565b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077890612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080890612d87565b60405180910390fd5b600060115490506000811161085b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085290612df3565b60405180910390fd5b60006011819055508047106108b6578273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156108b0573d6000803e3d6000fd5b506108fe565b8273ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156108fc573d6000803e3d6000fd5b505b505050565b60003373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098c90612e5f565b60405180910390fd5b60008585905090506000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed67cc91600c60000154600c60010154600c600201548a6040518563ffffffff1660e01b8152600401610a159493929190612e7f565b60a060405180830381865afa158015610a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a569190612efe565b9450945094509450945060006002811115610a7457610a73612f79565b5b856002811115610a8757610a86612f79565b5b14610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90612ff4565b60405180910390fd5b600c60040154861115610b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0690613060565b60405180910390fd5b88811015610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906130cc565b60405180910390fd5b80471015610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90613138565b60405180910390fd5b8560086000828254610ba79190613187565b9250508190555085600c6004016000828254610bc391906131bb565b9250508190555085600c6003016000828254610bdf9190613187565b92505081905550610bee61227c565b9650610bfb84848461239f565b8773ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c41573d6000803e3d6000fd5b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc889081150290604051600060405180830381858888f19350505050158015610caa573d6000803e3d6000fd5b50610cb88b8b888b30612416565b505050505050949350505050565b60095481565b600081600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5690612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de690612d87565b60405180910390fd5b600085859050905060006012600001549050601154935081600c600301541015610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e459061323b565b60405180910390fd5b81811480610e6b57508181118015610e6a575081600c60030154145b5b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea1906132a7565b60405180910390fd5b81600c6003016000828254610ebf91906131bb565b9250508190555060006012600001819055506000601181905550818111156110ff5760008282610eef91906131bb565b90506000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630320bc4a600954600c600101546000886040518563ffffffff1660e01b8152600401610f5f949392919061330c565b60a060405180830381865afa158015610f7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa09190612efe565b945050509250925060006002811115610fbc57610fbb612f79565b5b836002811115610fcf57610fce612f79565b5b1461100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690612ff4565b60405180910390fd5b8160098190555083600c600401600082825461102b91906131bb565b92505081905550836007600082825461104491906131bb565b92505081905550600061106f600c60020154670de0b6b3a7640000846124e09092919063ffffffff16565b90506000818361107f91906131bb565b9050808a61108d9190613187565b9950600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156110f7573d6000803e3d6000fd5b505050505050505b61110c8787843089612416565b83471061115f578473ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015611159573d6000803e3d6000fd5b506111a7565b8473ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111a5573d6000803e3d6000fd5b505b5050509392505050565b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c990612d87565b60405180910390fd5b60008484905090506000811161131d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113149061339d565b60405180910390fd5b80601260000160008282546113329190613187565b9250508190555080600c600301600082825461134e9190613187565b925050819055506113628585838630612416565b5050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601154905090565b3373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090612e5f565b60405180910390fd5b8060068190555050565b60003373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bc90612e5f565b60405180910390fd5b60008484905090506000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630320bc4a600c60000154600c60010154600c600201548a6040518563ffffffff1660e01b81526004016115459493929190612e7f565b60a060405180830381865afa158015611562573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115869190612efe565b94509450945094509450600060028111156115a4576115a3612f79565b5b8560028111156115b7576115b6612f79565b5b146115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee90612ff4565b60405180910390fd5b600c6003015486111561163f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163690613060565b60405180910390fd5b80341015611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167990613409565b60405180910390fd5b85600760008282546116949190613187565b9250508190555085600c60030160008282546116b091906131bb565b9250508190555085600c60040160008282546116cc9190613187565b92505081905550600096506116e284848461239f565b8773ffffffffffffffffffffffffffffffffffffffff166108fc823461170891906131bb565b9081150290604051600060405180830381858888f19350505050158015611733573d6000803e3d6000fd5b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc889081150290604051600060405180830381858888f1935050505015801561179c573d6000803e3d6000fd5b506117ad8a8a8c8c9050308c612416565b5050505050509392505050565b6117c2612504565b60126040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905090565b61181861253a565b600c6040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905090565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630320bc4a84600c60010154600c60020154886040518563ffffffff1660e01b81526004016118ca9493929190612e7f565b60a060405180830381865afa1580156118e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190b9190612efe565b9450505050508091505092915050565b60065481565b600a5481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed67cc9184600c60010154600c60020154886040518563ffffffff1660e01b81526004016119bb9493929190612e7f565b60a060405180830381865afa1580156119d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fc9190612efe565b9450505050508091505092915050565b60085481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac090612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090612d87565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff166342842e0e30600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518463ffffffff1660e01b8152600401611bb893929190613429565b600060405180830381600087803b158015611bd257600080fd5b505af1158015611be6573d6000803e3d6000fd5b5050505050505050565b600b60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90612e5f565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611def90612d87565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611e60573d6000803e3d6000fd5b50505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1490612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa490612d87565b60405180910390fd5b6000600c6004015414611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec906134ac565b60405180910390fd5b61200085858561239f565b8460098190555085600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fe90612d1b565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e90612d87565b60405180910390fd5b6000848490509050600081116121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d99061339d565b60405180910390fd5b80600c60030154101561222a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222190613518565b60405180910390fd5b80600c600301600082825461223f91906131bb565b92505081905550806012600001600082825461225b91906131bb565b9250508190555061226f8585833087612416565b5050505050565b60075481565b600080600854118015612293575060085460075410155b1561239b57600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ea363db5600c60000154600c60010154600c600201546008546006546040518663ffffffff1660e01b8152600401612311959493929190613538565b6040805180830381865afa15801561232d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612351919061358b565b9150915081601160008282546123679190613187565b925050819055506008546007600082825461238291906131bb565b925050819055506000600881905550809250505061239c565b5b90565b600083141580156123b5575082600c6000015414155b156123c55782600c600001819055505b600082141580156123db575081600c6001015414155b156123eb5781600c600101819055505b60008114158015612401575080600c6002015414155b156124115780600c600201819055505b505050565b60005b838110156124d857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde8484898986818110612474576124736135cb565b5b905060200201356040518463ffffffff1660e01b815260040161249993929190613631565b600060405180830381600087803b1580156124b357600080fd5b505af11580156124c7573d6000803e3d6000fd5b505050508080600101915050612419565b505050505050565b6000828402905082848204148415176124f857600080fd5b81810490509392505050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60008115159050919050565b61257e81612569565b82525050565b60006020820190506125996000830184612575565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006125de826125b3565b9050919050565b6125ee816125d3565b81146125f957600080fd5b50565b60008135905061260b816125e5565b92915050565b6000819050919050565b61262481612611565b811461262f57600080fd5b50565b6000813590506126418161261b565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61269a82612651565b810181811067ffffffffffffffff821117156126b9576126b8612662565b5b80604052505050565b60006126cc61259f565b90506126d88282612691565b919050565b600067ffffffffffffffff8211156126f8576126f7612662565b5b61270182612651565b9050602081019050919050565b82818337600083830152505050565b600061273061272b846126dd565b6126c2565b90508281526020810184848401111561274c5761274b61264c565b5b61275784828561270e565b509392505050565b600082601f83011261277457612773612647565b5b813561278484826020860161271d565b91505092915050565b600080600080608085870312156127a7576127a66125a9565b5b60006127b5878288016125fc565b94505060206127c6878288016125fc565b93505060406127d787828801612632565b925050606085013567ffffffffffffffff8111156127f8576127f76125ae565b5b6128048782880161275f565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61284581612810565b82525050565b6000602082019050612860600083018461283c565b92915050565b60006020828403121561287c5761287b6125a9565b5b600061288a848285016125fc565b91505092915050565b600080fd5b600080fd5b60008083601f8401126128b3576128b2612647565b5b8235905067ffffffffffffffff8111156128d0576128cf612893565b5b6020830191508360208202830111156128ec576128eb612898565b5b9250929050565b6000806000806060858703121561290d5761290c6125a9565b5b600085013567ffffffffffffffff81111561292b5761292a6125ae565b5b6129378782880161289d565b9450945050602061294a87828801612632565b925050604061295b878288016125fc565b91505092959194509250565b61297081612611565b82525050565b600060208201905061298b6000830184612967565b92915050565b6000806000604084860312156129aa576129a96125a9565b5b600084013567ffffffffffffffff8111156129c8576129c76125ae565b5b6129d48682870161289d565b935093505060206129e7868287016125fc565b9150509250925092565b6129fa816125d3565b82525050565b6000602082019050612a1560008301846129f1565b92915050565b600060208284031215612a3157612a306125a9565b5b6000612a3f84828501612632565b91505092915050565b612a5181612611565b82525050565b60c082016000820151612a6d6000850182612a48565b506020820151612a806020850182612a48565b506040820151612a936040850182612a48565b506060820151612aa66060850182612a48565b506080820151612ab96080850182612a48565b5060a0820151612acc60a0850182612a48565b50505050565b600060c082019050612ae76000830184612a57565b92915050565b60a082016000820151612b036000850182612a48565b506020820151612b166020850182612a48565b506040820151612b296040850182612a48565b506060820151612b3c6060850182612a48565b506080820151612b4f6080850182612a48565b50505050565b600060a082019050612b6a6000830184612aed565b92915050565b60008060408385031215612b8757612b866125a9565b5b6000612b9585828601612632565b9250506020612ba685828601612632565b9150509250929050565b600080600060608486031215612bc957612bc86125a9565b5b6000612bd7868287016125fc565b9350506020612be886828701612632565b9250506040612bf9868287016125fc565b9150509250925092565b60008060408385031215612c1a57612c196125a9565b5b6000612c2885828601612632565b9250506020612c39858286016125fc565b9150509250929050565b600080600080600060a08688031215612c5f57612c5e6125a9565b5b6000612c6d888289016125fc565b9550506020612c7e88828901612632565b9450506040612c8f88828901612632565b9350506060612ca088828901612632565b9250506080612cb1888289016125fc565b9150509295509295909350565b600082825260208201905092915050565b7f4e6f7420526f7574657200000000000000000000000000000000000000000000600082015250565b6000612d05600a83612cbe565b9150612d1082612ccf565b602082019050919050565b60006020820190508181036000830152612d3481612cf8565b9050919050565b7f4e6f74204f776e65720000000000000000000000000000000000000000000000600082015250565b6000612d71600983612cbe565b9150612d7c82612d3b565b602082019050919050565b60006020820190508181036000830152612da081612d64565b9050919050565b7f4e6f742046656500000000000000000000000000000000000000000000000000600082015250565b6000612ddd600783612cbe565b9150612de882612da7565b602082019050919050565b60006020820190508181036000830152612e0c81612dd0565b9050919050565b7f6f6e6c79526f7574657200000000000000000000000000000000000000000000600082015250565b6000612e49600a83612cbe565b9150612e5482612e13565b602082019050919050565b60006020820190508181036000830152612e7881612e3c565b9050919050565b6000608082019050612e946000830187612967565b612ea16020830186612967565b612eae6040830185612967565b612ebb6060830184612967565b95945050505050565b60038110612ed157600080fd5b50565b600081519050612ee381612ec4565b92915050565b600081519050612ef88161261b565b92915050565b600080600080600060a08688031215612f1a57612f196125a9565b5b6000612f2888828901612ed4565b9550506020612f3988828901612ee9565b9450506040612f4a88828901612ee9565b9350506060612f5b88828901612ee9565b9250506080612f6c88828901612ee9565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4243204572726f72000000000000000000000000000000000000000000000000600082015250565b6000612fde600883612cbe565b9150612fe982612fa8565b602082019050919050565b6000602082019050818103600083015261300d81612fd1565b9050919050565b7f4e6f7420656e6f756768206c6971756964697479000000000000000000000000600082015250565b600061304a601483612cbe565b915061305582613014565b602082019050919050565b600060208201905081810360008301526130798161303d565b9050919050565b7f4e6f742065787065637465642076616c75650000000000000000000000000000600082015250565b60006130b6601283612cbe565b91506130c182613080565b602082019050919050565b600060208201905081810360008301526130e5816130a9565b9050919050565b7f4e6f7420656e6f7567682062616c616e63650000000000000000000000000000600082015250565b6000613122601283612cbe565b915061312d826130ec565b602082019050919050565b6000602082019050818103600083015261315181613115565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061319282612611565b915061319d83612611565b92508282019050808211156131b5576131b4613158565b5b92915050565b60006131c682612611565b91506131d183612611565b92508282039050818111156131e9576131e8613158565b5b92915050565b7f506f6f6c206e6f7420656e6f756768204e465400000000000000000000000000600082015250565b6000613225601383612cbe565b9150613230826131ef565b602082019050919050565b6000602082019050818103600083015261325481613218565b9050919050565b7f536f6d657468696e672069732077726f6e672e00000000000000000000000000600082015250565b6000613291601383612cbe565b915061329c8261325b565b602082019050919050565b600060208201905081810360008301526132c081613284565b9050919050565b6000819050919050565b6000819050919050565b60006132f66132f16132ec846132c7565b6132d1565b612611565b9050919050565b613306816132db565b82525050565b60006080820190506133216000830187612967565b61332e6020830186612967565b61333b60408301856132fd565b6133486060830184612967565b95945050505050565b7f4e6f742030000000000000000000000000000000000000000000000000000000600082015250565b6000613387600583612cbe565b915061339282613351565b602082019050919050565b600060208201905081810360008301526133b68161337a565b9050919050565b7f4e6f7420656e6f7567682076616c756500000000000000000000000000000000600082015250565b60006133f3601083612cbe565b91506133fe826133bd565b602082019050919050565b60006020820190508181036000830152613422816133e6565b9050919050565b600060608201905061343e60008301866129f1565b61344b60208301856129f1565b6134586040830184612967565b949350505050565b7f4e6f74204368616e67652054696d650000000000000000000000000000000000600082015250565b6000613496600f83612cbe565b91506134a182613460565b602082019050919050565b600060208201905081810360008301526134c581613489565b9050919050565b7f506f6f6c204e6f74204e46540000000000000000000000000000000000000000600082015250565b6000613502600c83612cbe565b915061350d826134cc565b602082019050919050565b60006020820190508181036000830152613531816134f5565b9050919050565b600060a08201905061354d6000830188612967565b61355a6020830187612967565b6135676040830186612967565b6135746060830185612967565b6135816080830184612967565b9695505050505050565b600080604083850312156135a2576135a16125a9565b5b60006135b085828601612ee9565b92505060206135c185828601612ee9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b50565b600061361b6000836135fa565b91506136268261360b565b600082019050919050565b600060808201905061364660008301866129f1565b61365360208301856129f1565b6136606040830184612967565b81810360608301526136718161360e565b905094935050505056fea2646970667358221220f9c5ba4aaf56622784420d963ebb5f9f973c9ca074de7cdd18887146bcbe7fd664736f6c63430008110033a2646970667358221220de98f4ac6f3224ab84bb619a36c24453b7cb60d666e55b8a085673c88cb9286864736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000007cd70b36ba8fcbd888e9c26840b9300ac64d29a900000000000000000000000000000000000000000000000002c68af0bb140000

-----Decoded View---------------
Arg [0] : _router (address): 0x7cD70b36bA8fcBD888E9C26840b9300aC64D29a9
Arg [1] : _routerFeeRatio (uint256): 200000000000000000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007cd70b36ba8fcbd888e9c26840b9300ac64d29a9
Arg [1] : 00000000000000000000000000000000000000000000000002c68af0bb140000


Deployed Bytecode Sourcemap

29637:1575:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30974:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31083:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8594:103;;;:::i;:::-;;30020:935;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7946:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8852:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29724:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29696:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30974:101;7832:13;:11;:13::i;:::-;31057:10:::1;31048:6;;:19;;;;;;;;;;;;;;;;;;30974:101:::0;:::o;31083:126::-;7832:13;:11;:13::i;:::-;31183:18:::1;31166:14;:35;;;;31083:126:::0;:::o;8594:103::-;7832:13;:11;:13::i;:::-;8659:30:::1;8686:1;8659:18;:30::i;:::-;8594:103::o:0;30020:935::-;30239:11;30231:38;;;30270:25;30231:65;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30209:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;30408:4;30353:59;;30361:6;;;;;;;;;;;30353:38;;;30392:11;30353:51;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;30345:68;;;;;;30505:4;30446:63;;30454:6;;;;;;;;;;;30446:40;;;30487:13;30446:55;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;;30424:96;;;;;;30533:13;30618:11;30648:13;30680:10;30709:6;30734:7;30760:14;;30793:6;;;;;;;;;;;30818:10;30571:272;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;30533:321;;30873:6;;;;;;;;;;;30865:23;;;30889:5;30896:4;30865:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30935:11;30917:30;;30928:5;30917:30;;;;;;;;;;;;30198:757;30020:935;;;;;:::o;7946:87::-;7992:7;8019:6;;;;;;;;;;;8012:13;;7946:87;:::o;8852:201::-;7832:13;:11;:13::i;:::-;8961:1:::1;8941:22;;:8;:22;;::::0;8933:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;9017:28;9036:8;9017:18;:28::i;:::-;8852:201:::0;:::o;29724:29::-;;;;:::o;29696:21::-;;;;;;;;;;;;;:::o;8111:132::-;8186:12;:10;:12::i;:::-;8175:23;;:7;:5;:7::i;:::-;:23;;;8167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8111:132::o;9213:191::-;9287:16;9306:6;;;;;;;;;;;9287:25;;9332:8;9323:6;;:17;;;;;;;;;;;;;;;;;;9387:8;9356:40;;9377:8;9356:40;;;;;;;;;;;;9276:128;9213:191;:::o;6497:98::-;6550:7;6577:10;6570:17;;6497:98;:::o;-1:-1:-1:-;;;;;;;;:::o;88:117:1:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:122::-;1332:24;1350:5;1332:24;:::i;:::-;1325:5;1322:35;1312:63;;1371:1;1368;1361:12;1312:63;1259:122;:::o;1387:139::-;1433:5;1471:6;1458:20;1449:29;;1487:33;1514:5;1487:33;:::i;:::-;1387:139;;;;:::o;1532:329::-;1591:6;1640:2;1628:9;1619:7;1615:23;1611:32;1608:119;;;1646:79;;:::i;:::-;1608:119;1766:1;1791:53;1836:7;1827:6;1816:9;1812:22;1791:53;:::i;:::-;1781:63;;1737:117;1532:329;;;;:::o;1867:911::-;1962:6;1970;1978;1986;1994;2043:3;2031:9;2022:7;2018:23;2014:33;2011:120;;;2050:79;;:::i;:::-;2011:120;2170:1;2195:53;2240:7;2231:6;2220:9;2216:22;2195:53;:::i;:::-;2185:63;;2141:117;2297:2;2323:53;2368:7;2359:6;2348:9;2344:22;2323:53;:::i;:::-;2313:63;;2268:118;2425:2;2451:53;2496:7;2487:6;2476:9;2472:22;2451:53;:::i;:::-;2441:63;;2396:118;2553:2;2579:53;2624:7;2615:6;2604:9;2600:22;2579:53;:::i;:::-;2569:63;;2524:118;2681:3;2708:53;2753:7;2744:6;2733:9;2729:22;2708:53;:::i;:::-;2698:63;;2652:119;1867:911;;;;;;;;:::o;2784:118::-;2871:24;2889:5;2871:24;:::i;:::-;2866:3;2859:37;2784:118;;:::o;2908:222::-;3001:4;3039:2;3028:9;3024:18;3016:26;;3052:71;3120:1;3109:9;3105:17;3096:6;3052:71;:::i;:::-;2908:222;;;;:::o;3136:118::-;3223:24;3241:5;3223:24;:::i;:::-;3218:3;3211:37;3136:118;;:::o;3260:222::-;3353:4;3391:2;3380:9;3376:18;3368:26;;3404:71;3472:1;3461:9;3457:17;3448:6;3404:71;:::i;:::-;3260:222;;;;:::o;3488:149::-;3524:7;3564:66;3557:5;3553:78;3542:89;;3488:149;;;:::o;3643:115::-;3728:23;3745:5;3728:23;:::i;:::-;3723:3;3716:36;3643:115;;:::o;3764:218::-;3855:4;3893:2;3882:9;3878:18;3870:26;;3906:69;3972:1;3961:9;3957:17;3948:6;3906:69;:::i;:::-;3764:218;;;;:::o;3988:90::-;4022:7;4065:5;4058:13;4051:21;4040:32;;3988:90;;;:::o;4084:116::-;4154:21;4169:5;4154:21;:::i;:::-;4147:5;4144:32;4134:60;;4190:1;4187;4180:12;4134:60;4084:116;:::o;4206:137::-;4260:5;4291:6;4285:13;4276:22;;4307:30;4331:5;4307:30;:::i;:::-;4206:137;;;;:::o;4349:345::-;4416:6;4465:2;4453:9;4444:7;4440:23;4436:32;4433:119;;;4471:79;;:::i;:::-;4433:119;4591:1;4616:61;4669:7;4660:6;4649:9;4645:22;4616:61;:::i;:::-;4606:71;;4562:125;4349:345;;;;:::o;4700:169::-;4784:11;4818:6;4813:3;4806:19;4858:4;4853:3;4849:14;4834:29;;4700:169;;;;:::o;4875:160::-;5015:12;5011:1;5003:6;4999:14;4992:36;4875:160;:::o;5041:366::-;5183:3;5204:67;5268:2;5263:3;5204:67;:::i;:::-;5197:74;;5280:93;5369:3;5280:93;:::i;:::-;5398:2;5393:3;5389:12;5382:19;;5041:366;;;:::o;5413:419::-;5579:4;5617:2;5606:9;5602:18;5594:26;;5666:9;5660:4;5656:20;5652:1;5641:9;5637:17;5630:47;5694:131;5820:4;5694:131;:::i;:::-;5686:139;;5413:419;;;:::o;5838:997::-;6127:4;6165:3;6154:9;6150:19;6142:27;;6179:71;6247:1;6236:9;6232:17;6223:6;6179:71;:::i;:::-;6260:72;6328:2;6317:9;6313:18;6304:6;6260:72;:::i;:::-;6342;6410:2;6399:9;6395:18;6386:6;6342:72;:::i;:::-;6424;6492:2;6481:9;6477:18;6468:6;6424:72;:::i;:::-;6506:73;6574:3;6563:9;6559:19;6550:6;6506:73;:::i;:::-;6589;6657:3;6646:9;6642:19;6633:6;6589:73;:::i;:::-;6672;6740:3;6729:9;6725:19;6716:6;6672:73;:::i;:::-;6755;6823:3;6812:9;6808:19;6799:6;6755:73;:::i;:::-;5838:997;;;;;;;;;;;:::o;6841:109::-;6922:21;6937:5;6922:21;:::i;:::-;6917:3;6910:34;6841:109;;:::o;6956:320::-;7071:4;7109:2;7098:9;7094:18;7086:26;;7122:71;7190:1;7179:9;7175:17;7166:6;7122:71;:::i;:::-;7203:66;7265:2;7254:9;7250:18;7241:6;7203:66;:::i;:::-;6956:320;;;;;:::o;7282:225::-;7422:34;7418:1;7410:6;7406:14;7399:58;7491:8;7486:2;7478:6;7474:15;7467:33;7282:225;:::o;7513:366::-;7655:3;7676:67;7740:2;7735:3;7676:67;:::i;:::-;7669:74;;7752:93;7841:3;7752:93;:::i;:::-;7870:2;7865:3;7861:12;7854:19;;7513:366;;;:::o;7885:419::-;8051:4;8089:2;8078:9;8074:18;8066:26;;8138:9;8132:4;8128:20;8124:1;8113:9;8109:17;8102:47;8166:131;8292:4;8166:131;:::i;:::-;8158:139;;7885:419;;;:::o;8310:182::-;8450:34;8446:1;8438:6;8434:14;8427:58;8310:182;:::o;8498:366::-;8640:3;8661:67;8725:2;8720:3;8661:67;:::i;:::-;8654:74;;8737:93;8826:3;8737:93;:::i;:::-;8855:2;8850:3;8846:12;8839:19;;8498:366;;;:::o;8870:419::-;9036:4;9074:2;9063:9;9059:18;9051:26;;9123:9;9117:4;9113:20;9109:1;9098:9;9094:17;9087:47;9151:131;9277:4;9151:131;:::i;:::-;9143:139;;8870:419;;;:::o

Swarm Source

ipfs://de98f4ac6f3224ab84bb619a36c24453b7cb60d666e55b8a085673c88cb92868

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.