Abstract Testnet

Contract

0xAa3919f0fA63A28B33c45f0d8dbD4a8651d31CbD

Overview

ETH Balance

0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To

There are no matching entries

2 Internal Transactions found.

Latest 2 internal transactions

Parent Transaction Hash Block From To
53855852025-01-29 16:23:4414 days ago1738167824
0xAa3919f0...651d31CbD
0 ETH
53855852025-01-29 16:23:4414 days ago1738167824  Contract Creation0 ETH
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x873Db76a...28bFc8d17
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
GVCAuction

Compiler Version
v0.8.28+commit.7893614a

ZkSolc Version
v1.5.7

Optimization Enabled:
Yes with Mode 3

Other Settings:
cancun EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 7 : GVCAuction.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

//*********************************************************************
// RaffleBidHeap is a library used by RaffleAuctionMinter to store the
// highest bids in a min-heap. The min-heap ensures that we can quickly
// determine the "floor" bid and decide whether a new bid can enter
// the top bids array or be immediately refunded.
//*********************************************************************
import "./RaffleBidHeap.sol";

//*********************************************************************
// Solady libraries for Role-Based Access Control, Pausable, and
// ECDSA cryptography.
//*********************************************************************
import {Ownable} from "solady/auth/Ownable.sol";
import {SafeTransferLib} from "solady/utils/SafeTransferLib.sol";
import {SignatureCheckerLib} from "solady/utils/SignatureCheckerLib.sol";
import {ReentrancyGuard} from "solady/utils/ReentrancyGuard.sol";

import {IGVC} from "./interfaces/IGVC.sol";

/**
 * @title RaffleAuctionMinter
 * @dev This contract handles a raffle-style auction of NFTs.
 *      - Bids are stored in a "min-heap" (lowest winning bid sits at the top).
 *      - Only the highest N bids (N = capacity) remain in the heap; any new, higher
 *        bid can displace the "lowest winning" bid.
 *      - Each participant can place multiple bids, up to a maximum.
 *      - After the auction ends, winners claim their NFTs and automatically get refunds
 *        for the difference (if their winning bid is above the clearing price).
 *      - Non-winning bidders get a full refund of their bids.
 */
contract GVCAuction is Ownable, ReentrancyGuard {
    //*********************************************************************
    // State Variables
    //*********************************************************************
    bool private _paused;
    uint256 private _idCounter;

    //*********************************************************************
    // Events
    //*********************************************************************
    event Paused(address account);
    event Unpaused(address account);

    /**
     * @notice Emitted when a user places a bid.
     * @param buyer The address that placed the bid.
     * @param bidPrice The amount of ETH submitted with the bid.
     */
    event Bid(address indexed buyer, uint256 bidPrice);

    /**
     * @notice Emitted after a user successfully claims their NFTs and/or refund.
     * @param buyer The address that claimed.
     * @param refundAmount The amount refunded to this user (0 if none).
     * @param nftCount The number of NFTs minted to the user.
     */
    event Claim(address indexed buyer, uint256 refundAmount, uint256 nftCount);

    //*********************************************************************
    // Modifiers
    //*********************************************************************
    modifier whenNotPaused() {
        require(!_paused, "GVCAuction: paused");
        _;
    }

    /**
     * @notice The maximum number of bids a single user can place in the auction.
     *         Changing this would require editing the code's constant below, but
     *         that is outside the scope of this demonstration.
     */
    uint256 public constant MAX_BID_PER_USER = 50;

    //*********************************************************************
    // Data Structures
    //*********************************************************************
    /**
     * @dev Contains information about a user's claim:
     *      - hasClaimed: Has the user already claimed their NFTs/refund?
     *      - refundAmount: How much ETH the user is owed back.
     *      - nftCount: How many NFTs the user ended up winning.
     */
    struct ClaimInfo {
        bool hasClaimed;
        uint256 refundAmount;
        uint256 nftCount;
    }

    //*********************************************************************
    // Library Usage
    //*********************************************************************
    using {
        RaffleBidHeap.initialize,
        RaffleBidHeap.tryInsert,
        RaffleBidHeap.minBid,
        RaffleBidHeap.size
    } for RaffleBidHeap.Heap;

    // Keep using isHigherOrEqualBid directly from the library
    using RaffleBidHeap for RaffleBidHeap.Bid;

    //*********************************************************************
    // Internal Heap Data
    //*********************************************************************
    /**
     * @dev `_heap` holds the top bids in a min-heap format. The size of the heap
     *      is capped at `_nftAmount` (passed in constructor).
     */
    RaffleBidHeap.Heap internal _heap;

    //*********************************************************************
    // Key Addresses
    //*********************************************************************
    address public signer; // The signer address
    address public nftAddress; // The address of the NFT that will be minted
    address public paymentRecipient; // Address to receive the final clearing price * capacity

    //*********************************************************************
    // Auction Parameters
    //*********************************************************************
    uint256 public auctionEndTime; // The timestamp when the auction ends
    bool public paymentSent; // Tracks if the final payment to `paymentRecipient` has been sent

    //*********************************************************************
    // Tracking Bidder Data
    //*********************************************************************
    /**
     * @dev userBids maps each user to an array of all their bids (including those
     *      that may no longer be in the top-bids heap).
     */
    mapping(address => RaffleBidHeap.Bid[]) public userBids;

    /**
     * @dev hasClaimed tracks whether a user has already called `claimAndRefund`.
     *      After claiming, a user cannot claim again.
     */
    mapping(address => bool) public hasClaimed;

    /**
     * @dev buyerBidCount tracks how many bids each user has placed that apply
     *      to a specific "buyer limit ID" (limitForBuyerID). This enforces an
     *      external off-chain limit that might apply to certain sets of users.
     */
    mapping(address => mapping(uint256 => uint256)) buyerBidCount;

    //*********************************************************************
    // Highest Bid Price (Not Actively Used in the Core Logic Here)
    //*********************************************************************
    uint256 public highestBidPrice;

    // Add initialization status
    bool private _initialized;

    //*********************************************************************
    // Constructor
    //*********************************************************************
    /**
     * @param _admin The address of the owner and admin
     */
    constructor(address _admin) {
        _initializeOwner(_admin);
        _paused = true; // Start in paused state
    }

    /**
     * @notice Initializes the auction with required parameters. Can only be called once.
     * @param _nftAddress The NFT contract address that will be minted from.
     * @param _paymentRecipient Address to receive the final proceeds.
     * @param _nftAmount The capacity for how many winning bids are accepted.
     * @param _auctionEndTime The timestamp at which the auction ends.
     * @param _signer The address that can sign bids.
     */
    function initialize(
        address _nftAddress,
        address _paymentRecipient,
        uint256 _nftAmount,
        uint256 _auctionEndTime,
        address _signer
    ) external onlyOwner {
        require(!_initialized, "GVCAuction: already initialized");
        require(_nftAddress != address(0), "GVCAuction: invalid NFT address");
        require(
            _paymentRecipient != address(0),
            "GVCAuction: invalid payment recipient"
        );
        require(_signer != address(0), "GVCAuction: invalid signer");
        require(
            _auctionEndTime > block.timestamp,
            "GVCAuction: invalid end time"
        );
        require(_nftAmount > 0, "GVCAuction: invalid NFT amount");

        nftAddress = _nftAddress;
        paymentRecipient = _paymentRecipient;
        auctionEndTime = _auctionEndTime;
        signer = _signer;
        _heap.initialize(_nftAmount);

        _initialized = true;
        _paused = false; // Unpause the contract after initialization
    }

    /**
     * @notice Fallback to accept ETH sent directly (not recommended in real usage).
     */
    receive() external payable {}

    //*********************************************************************
    // Management Functions (Admin / Manager Only)
    //*********************************************************************

    /**
     * @dev Sends the final payment to the paymentRecipient after the auction is over.
     *      This is the sum of (capacity) * (clearing price).
     */
    function sendPayment() external {
        require(
            block.timestamp > auctionEndTime,
            "RaffleAuctionMinter: payment can only be made after the auction has ended"
        );
        require(!paymentSent, "RaffleAuctionMinter: payment already sent");

        // The "minBid()" inside the heap is effectively the "floor" winning bid,
        // also known as the clearing price.
        uint256 value = _heap.size() * _heap.minBid().price;

        (bool success, ) = paymentRecipient.call{value: value}("");
        require(success, "RaffleAuctionMinter: failed to send payment");
        paymentSent = true;
    }

    /**
     * @dev Sets the signer address (requires owner).
     */
    function setSigner(address _s) external onlyOwner {
        signer = _s;
    }

    /**
     * @dev Sets the recipient address (requires owner).
     */
    function setRecipient(address _r) external onlyOwner {
        paymentRecipient = _r;
    }

    /**
     * @dev Sets the NFT address (requires owner).
     */
    function setNftAddress(address _addr) external onlyOwner {
        nftAddress = _addr;
    }

    /**
     * @dev Extend or modify the auction end time, as long as it's in the future
     *      and the auction hasn't ended already (requires owner).
     */
    function setAuctionEndTime(uint256 _t) external onlyOwner {
        require(_t > block.timestamp, "RaffleAuctionMinter: invalid timestamp");
        require(
            block.timestamp <= auctionEndTime,
            "RaffleAuctionMinter: already ended"
        );
        auctionEndTime = _t;
    }

    //*********************************************************************
    // Core Functions
    //*********************************************************************

    /**
     * @dev placeBid allows a user to place a new bid with ETH attached.
     *      Steps:
     *      1) Verify signature to confirm user is allowed to place this bid.
     *      2) Check if the auction is still open.
     *      3) Check user hasn't placed too many bids (MAX_BID_PER_USER).
     *      4) Check user hasn't exceeded the "limitForBuyerAmount" for the specific buyer-limit ID.
     *      5) Insert bid into the min-heap if it qualifies (or discard it if it is too low and capacity is full).
     */
    function placeBid(
        uint256 bidPrice,
        uint256 limitForBuyerID,
        uint256 limitForBuyerAmount,
        uint256 expireTime,
        bytes calldata _sig
    ) external payable whenNotPaused nonReentrant {
        require(_initialized, "GVCAuction: not initialized");
        //=== 1) Signature check ===//
        bytes32 inputHash = _getInputHash(
            bidPrice,
            limitForBuyerID,
            limitForBuyerAmount,
            expireTime
        );
        _checkSigValidity(inputHash, _sig, signer);

        require(
            block.timestamp <= expireTime,
            "RaffleAuctionMinter: signature expired"
        );

        //=== 2) Auction must be open ===//
        require(
            block.timestamp <= auctionEndTime,
            "RaffleAuctionMinter: auction ended"
        );

        //=== 3) Check max bids per user ===//
        require(
            userBids[msg.sender].length < MAX_BID_PER_USER,
            "RaffleAuctionMinter: maximum bid per user reached"
        );

        //=== 4) Check buyer limit for given limitForBuyerID ===//
        require(
            buyerBidCount[msg.sender][limitForBuyerID] < limitForBuyerAmount,
            "RaffleAuctionMinter: buyer limit exceeded"
        );

        //=== 5) Check the payment matches the bidPrice ===//
        require(msg.value == bidPrice, "RaffleAuctionMinter: payment mismatch");

        buyerBidCount[msg.sender][limitForBuyerID] += 1;

        //=== 6) Build the bid struct and attempt to insert in the min-heap ===//
        _incrementCounter();
        RaffleBidHeap.Bid memory newBid = RaffleBidHeap.Bid(
            _currentCount(),
            msg.sender,
            bidPrice,
            block.timestamp,
            generateRandomNumber(_currentCount())
        );

        // Save the bid details in an array for the user
        userBids[msg.sender].push(newBid);

        // The min-heap decides if the new bid displaces the lowest bid (if the heap is full)
        _heap.tryInsert(newBid);

        emit Bid(msg.sender, bidPrice);
    }

    /**
     * @dev placeBatchBids allows a user to place multiple bids at once.
     * @param bidPrices Array of bid prices
     * @param limitForBuyerID Single buyer limit ID for the entire batch
     * @param limitForBuyerAmount Maximum number of bids allowed for this buyer ID
     * @param expireTime Single expiration time for the batch signature
     * @param sig Single signature authorizing the entire batch of bids
     * Requirements:
     * - Total msg.value must equal sum of all bidPrices
     * - Total bids (existing + new) must not exceed MAX_BID_PER_USER
     * - Total bids for limitForBuyerID must not exceed limitForBuyerAmount
     */
    function placeBatchBids(
        uint256[] calldata bidPrices,
        uint256 limitForBuyerID,
        uint256 limitForBuyerAmount,
        uint256 expireTime,
        bytes calldata sig
    ) external payable whenNotPaused nonReentrant {
        require(_initialized, "GVCAuction: not initialized");

        uint256 bidsCount = bidPrices.length;
        require(bidsCount > 0, "GVCAuction: empty batch");

        // Basic checks (same as placeBid)
        bytes32 inputHash = _getInputHash(
            msg.value,
            limitForBuyerID,
            limitForBuyerAmount,
            expireTime
        );
        _checkSigValidity(inputHash, sig, signer);

        require(
            block.timestamp <= expireTime,
            "RaffleAuctionMinter: signature expired"
        );
        require(
            block.timestamp <= auctionEndTime,
            "RaffleAuctionMinter: auction ended"
        );
        require(
            userBids[msg.sender].length + bidsCount <= MAX_BID_PER_USER,
            "GVCAuction: would exceed maximum bids per user"
        );
        require(
            buyerBidCount[msg.sender][limitForBuyerID] + bidsCount <=
                limitForBuyerAmount,
            "GVCAuction: buyer limit exceeded"
        );

        // Validate total payment
        uint256 totalBidAmount;
        for (uint256 i = 0; i < bidsCount; i++) {
            totalBidAmount += bidPrices[i];
        }
        require(msg.value == totalBidAmount, "GVCAuction: payment mismatch");

        // Update bid count once for the batch
        buyerBidCount[msg.sender][limitForBuyerID] += bidsCount;

        // Process bids (same as placeBid)
        for (uint256 i = 0; i < bidsCount; i++) {
            _incrementCounter();
            RaffleBidHeap.Bid memory newBid = RaffleBidHeap.Bid(
                _currentCount(),
                msg.sender,
                bidPrices[i],
                block.timestamp,
                generateRandomNumber(_currentCount())
            );
            userBids[msg.sender].push(newBid);
            _heap.tryInsert(newBid);
            emit Bid(msg.sender, bidPrices[i]);
        }
    }

    /**
     * @dev Returns how many NFTs a user has won and how much ETH they can get refunded.
     *      - If a user's bid is >= the "floorBid" in the final min-heap, that user wins an NFT
     *        and gets refunded (theirBid - floorBid).
     *      - Otherwise, they are refunded their full bid.
     */
    function claimInfo(address _a) public view returns (ClaimInfo memory info) {
        info.hasClaimed = hasClaimed[_a];
        info.refundAmount = 0;
        info.nftCount = 0;
        RaffleBidHeap.Bid memory _floorBid = _heap.minBid();

        // Examine each of this user's bids to compute final outcome
        for (uint256 i = 0; i < userBids[_a].length; i++) {
            // If user's bid is >= floorBid, user is a winner for that bid
            if (RaffleBidHeap.isHigherOrEqualBid(userBids[_a][i], _floorBid)) {
                info.nftCount += 1;
                info.refundAmount += userBids[_a][i].price - _floorBid.price;
            } else {
                // Non-winning bids get fully refunded
                info.refundAmount += userBids[_a][i].price;
            }
        }
    }

    /**
     * @dev claimAndRefund:
     *      1) Auction must be ended.
     *      2) Generate the user's claim info (how many NFTs, how much refund).
     *      3) Mint NFTs to the winner (if they have nftCount > 0).
     *      4) Send ETH refund.
     *      5) Mark user as claimed to prevent double-claiming.
     */
    function claimAndRefund() external {
        require(
            block.timestamp > auctionEndTime,
            "RaffleAuctionMinter: No claims or refunds allowed until auction ends"
        );
        ClaimInfo memory info = claimInfo(msg.sender);

        require(!info.hasClaimed, "RaffleAuctionMinter: has claimed");
        require(
            info.nftCount > 0 || info.refundAmount > 0,
            "RaffleAuctionMinter: nothing to claim"
        );

        hasClaimed[msg.sender] = true;

        // Mint the user's NFTs
        if (info.nftCount > 0) {
            IGVC(nftAddress).vibeMint(msg.sender, info.nftCount);
        }

        // Refund the user
        (bool success, ) = msg.sender.call{value: info.refundAmount}("");
        require(success, "RaffleAuctionMinter: failed to send refund");

        emit Claim(msg.sender, info.refundAmount, info.nftCount);
    }

    //*********************************************************************
    // View / Helper Functions
    //*********************************************************************

    /**
     * @dev tvl (total value locked) returns the ETH currently in the contract.
     */
    function tvl() external view returns (uint256) {
        return address(this).balance;
    }

    /**
     * @dev floorBid returns the current lowest winning bid in the min-heap,
     *      i.e., the clearing price if the auction ended now.
     */
    function floorBid() external view returns (RaffleBidHeap.Bid memory) {
        return _heap.minBid();
    }

    /**
     * @dev getUserClaimInfos helps query claim details for multiple addresses at once.
     */
    function getUserClaimInfos(
        address[] calldata _addresses
    ) external view returns (ClaimInfo[] memory results) {
        results = new ClaimInfo[](_addresses.length);
        for (uint256 i = 0; i < _addresses.length; i++) {
            results[i] = claimInfo(_addresses[i]);
        }
    }

    /**
     * @dev getUserBids returns the array of all bids a user has made.
     */
    function getUserBids(
        address[] calldata _addresses
    ) external view returns (RaffleBidHeap.Bid[][] memory bids) {
        bids = new RaffleBidHeap.Bid[][](_addresses.length);
        for (uint256 i = 0; i < _addresses.length; i++) {
            bids[i] = userBids[_addresses[i]];
        }
    }

    /**
     * @dev getTotalBidsCnt returns the total number of bids placed in the entire auction.
     */
    function getTotalBidsCnt() external view returns (uint256) {
        return _currentCount();
    }

    /**
     * @dev getBidAmtByBuyerId returns how many times a user has bid under a certain limit ID.
     */
    function getBidAmtByBuyerId(
        address _buyer,
        uint256 _limitForBuyerID
    ) external view returns (uint256) {
        return buyerBidCount[_buyer][_limitForBuyerID];
    }

    //*********************************************************************
    // Internal Functions - Signature Validation
    //*********************************************************************

    /**
     * @dev _getInputHash encodes the input parameters into a hash used for signature checking.
     */
    function _getInputHash(
        uint256 bidPrice,
        uint256 limitForBuyerID,
        uint256 limitForBuyerAmount,
        uint256 expireTime
    ) internal view returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(
                    msg.sender,
                    bidPrice,
                    limitForBuyerID,
                    limitForBuyerAmount,
                    expireTime,
                    block.chainid,
                    address(this)
                )
            );
    }

    /**
     * @dev _checkSigValidity recovers the signer from a signature and compares it with
     *      the expected signer (the NFT manager).
     */
    function _checkSigValidity(
        bytes32 hash,
        bytes memory sig,
        address _signer
    ) internal view {
        require(
            SignatureCheckerLib.isValidSignatureNow(
                _signer,
                _getEthSignedMessageHash(hash),
                sig
            ),
            "RaffleAuctionMinter: invalid signature"
        );
    }

    /**
     * @dev _getEthSignedMessageHash transforms a hash into the signed message format used by ECDSA.
     */
    function _getEthSignedMessageHash(
        bytes32 criteriaMessageHash
    ) internal pure returns (bytes32) {
        return SignatureCheckerLib.toEthSignedMessageHash(criteriaMessageHash);
    }

    //*********************************************************************
    // Random Number Generation
    //*********************************************************************

    /**
     * @dev generateRandomNumber can be used for tie-breaking in bids.
     *      It's pseudo-random, using blockhash, timestamp, and userInput as seed.
     */
    function generateRandomNumber(
        uint256 userInput
    ) public view returns (uint256) {
        uint256 randomNumber = uint256(
            keccak256(
                abi.encodePacked(
                    blockhash(block.number - 1), // Use the hash value of the previous block as a seed
                    block.timestamp, // Use the current block's timestamp as a seed
                    userInput // Use the user input as a seed
                )
            )
        );
        return randomNumber;
    }

    function paused() external view returns (bool) {
        return _paused;
    }

    // Add pause/unpause functions
    function pause() external onlyOwner {
        _paused = true;
        emit Paused(msg.sender);
    }

    function unpause() external onlyOwner {
        require(_initialized, "GVCAuction: not initialized");
        _paused = false;
        emit Unpaused(msg.sender);
    }

    function _incrementCounter() internal {
        unchecked {
            _idCounter++;
        }
    }

    function _currentCount() internal view returns (uint256) {
        return _idCounter;
    }
}

File 2 of 7 : RaffleBidHeap.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library RaffleBidHeap {
    struct Bid {
        uint256 id;
        address bidder;
        uint256 price;
        uint256 timestamp;
        uint256 nonce;
    }

    struct Heap {
        // These variables should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _maxCapacity;
        Bid[] _tree;
    }

    function initialize(Heap storage heap, uint256 cap) internal {
        require(heap._maxCapacity == 0, "BidHeap: duplicated initialize");
        heap._maxCapacity = cap;
    }

    function isFull(Heap storage heap) internal view returns (bool) {
        return heap._tree.length >= heap._maxCapacity;
    }

    function size(Heap storage heap) internal view returns (uint256) {
        return heap._tree.length;
    }

    function minBid(Heap storage heap) internal view returns (Bid memory) {
        require(heap._tree.length > 0, "BidHeap: heap is empty");
        return heap._tree[0];
    }

    function tryInsert(
        Heap storage heap,
        Bid memory newBid
    ) internal returns (bool) {
        if (isFull(heap)) {
            if (!isHigherOrEqualBid(newBid, heap._tree[0])) {
                return false;
            }
            heap._tree[0] = newBid;
            heapifyDown(heap, 0);
        } else {
            heap._tree.push(newBid);
            heapifyUp(heap, heap._tree.length - 1);
        }
        return true;
    }

    function heapifyUp(Heap storage heap, uint256 index) private {
        while (index > 0) {
            uint256 parentIndex = (index - 1) / 2;
            if (
                isHigherOrEqualBid(heap._tree[index], heap._tree[parentIndex])
            ) {
                break;
            }

            swap(heap, index, parentIndex);
            index = parentIndex;
        }
    }

    function heapifyDown(Heap storage heap, uint256 index) private {
        uint256 smallest = index;

        while (true) {
            uint256 leftChild = 2 * index + 1;
            uint256 rightChild = 2 * index + 2;
            if (
                leftChild < heap._tree.length &&
                isHigherOrEqualBid(heap._tree[smallest], heap._tree[leftChild])
            ) {
                smallest = leftChild;
            }
            if (
                rightChild < heap._tree.length &&
                isHigherOrEqualBid(heap._tree[smallest], heap._tree[rightChild])
            ) {
                smallest = rightChild;
            }
            if (smallest == index) {
                break;
            }
            swap(heap, smallest, index);
            index = smallest;
        }
    }

    function isHigherOrEqualBid(
        Bid memory _b1,
        Bid memory _b2
    ) internal pure returns (bool) {
        return
            _b1.price > _b2.price ||
            (_b1.price == _b2.price && _b1.nonce < _b2.nonce) ||
            (_b1.price == _b2.price &&
                _b1.nonce == _b2.nonce &&
                _b1.id <= _b2.id);
    }

    function swap(Heap storage heap, uint256 index1, uint256 index2) private {
        Bid memory temp = heap._tree[index1];
        heap._tree[index1] = heap._tree[index2];
        heap._tree[index2] = temp;
    }
}

File 3 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Simple single owner authorization mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
///
/// @dev Note:
/// This implementation does NOT auto-initialize the owner to `msg.sender`.
/// You MUST call the `_initializeOwner` in the constructor / initializer.
///
/// While the ownable portion follows
/// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,
/// the nomenclature for the 2-step ownership handover may be unique to this codebase.
abstract contract Ownable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The caller is not authorized to call the function.
    error Unauthorized();

    /// @dev The `newOwner` cannot be the zero address.
    error NewOwnerIsZeroAddress();

    /// @dev The `pendingOwner` does not have a valid handover request.
    error NoHandoverRequest();

    /// @dev Cannot double-initialize.
    error AlreadyInitialized();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           EVENTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The ownership is transferred from `oldOwner` to `newOwner`.
    /// This event is intentionally kept the same as OpenZeppelin's Ownable to be
    /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173),
    /// despite it not being as lightweight as a single argument event.
    event OwnershipTransferred(
        address indexed oldOwner,
        address indexed newOwner
    );

    /// @dev An ownership handover to `pendingOwner` has been requested.
    event OwnershipHandoverRequested(address indexed pendingOwner);

    /// @dev The ownership handover to `pendingOwner` has been canceled.
    event OwnershipHandoverCanceled(address indexed pendingOwner);

    /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.
    uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
        0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;

    /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
        0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;

    /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
        0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The owner slot is given by:
    /// `bytes32(~uint256(uint32(bytes4(keccak256("_OWNER_SLOT_NOT")))))`.
    /// It is intentionally chosen to be a high value
    /// to avoid collision with lower slots.
    /// The choice of manual storage layout is to enable compatibility
    /// with both regular and upgradeable contracts.
    bytes32 internal constant _OWNER_SLOT =
        0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927;

    /// The ownership handover slot of `newOwner` is given by:
    /// ```
    ///     mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED))
    ///     let handoverSlot := keccak256(0x00, 0x20)
    /// ```
    /// It stores the expiry timestamp of the two-step ownership handover.
    uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     INTERNAL FUNCTIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Override to return true to make `_initializeOwner` prevent double-initialization.
    function _guardInitializeOwner()
        internal
        pure
        virtual
        returns (bool guard)
    {}

    /// @dev Initializes the owner directly without authorization guard.
    /// This function must be called upon initialization,
    /// regardless of whether the contract is upgradeable or not.
    /// This is to enable generalization to both regular and upgradeable contracts,
    /// and to save gas in case the initial owner is not the caller.
    /// For performance reasons, this function will not check if there
    /// is an existing owner.
    function _initializeOwner(address newOwner) internal virtual {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                if sload(ownerSlot) {
                    mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`.
                    revert(0x1c, 0x04)
                }
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(_OWNER_SLOT, newOwner)
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
            }
        }
    }

    /// @dev Sets the owner directly without authorization guard.
    function _setOwner(address newOwner) internal virtual {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Emit the {OwnershipTransferred} event.
                log3(
                    0,
                    0,
                    _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE,
                    sload(ownerSlot),
                    newOwner
                )
                // Store the new value.
                sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Emit the {OwnershipTransferred} event.
                log3(
                    0,
                    0,
                    _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE,
                    sload(ownerSlot),
                    newOwner
                )
                // Store the new value.
                sstore(ownerSlot, newOwner)
            }
        }
    }

    /// @dev Throws if the sender is not the owner.
    function _checkOwner() internal view virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // If the caller is not the stored owner, revert.
            if iszero(eq(caller(), sload(_OWNER_SLOT))) {
                mstore(0x00, 0x82b42900) // `Unauthorized()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Returns how long a two-step ownership handover is valid for in seconds.
    /// Override to return a different value if needed.
    /// Made internal to conserve bytecode. Wrap it in a public function if needed.
    function _ownershipHandoverValidFor()
        internal
        view
        virtual
        returns (uint64)
    {
        return 48 * 3600;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  PUBLIC UPDATE FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Allows the owner to transfer the ownership to `newOwner`.
    function transferOwnership(
        address newOwner
    ) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(shl(96, newOwner)) {
                mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.
                revert(0x1c, 0x04)
            }
        }
        _setOwner(newOwner);
    }

    /// @dev Allows the owner to renounce their ownership.
    function renounceOwnership() public payable virtual onlyOwner {
        _setOwner(address(0));
    }

    /// @dev Request a two-step ownership handover to the caller.
    /// The request will automatically expire in 48 hours (172800 seconds) by default.
    function requestOwnershipHandover() public payable virtual {
        unchecked {
            uint256 expires = block.timestamp + _ownershipHandoverValidFor();
            /// @solidity memory-safe-assembly
            assembly {
                // Compute and set the handover slot to `expires`.
                mstore(0x0c, _HANDOVER_SLOT_SEED)
                mstore(0x00, caller())
                sstore(keccak256(0x0c, 0x20), expires)
                // Emit the {OwnershipHandoverRequested} event.
                log2(
                    0,
                    0,
                    _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,
                    caller()
                )
            }
        }
    }

    /// @dev Cancels the two-step ownership handover to the caller, if any.
    function cancelOwnershipHandover() public payable virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, caller())
            sstore(keccak256(0x0c, 0x20), 0)
            // Emit the {OwnershipHandoverCanceled} event.
            log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
        }
    }

    /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`.
    /// Reverts if there is no existing ownership handover requested by `pendingOwner`.
    function completeOwnershipHandover(
        address pendingOwner
    ) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            let handoverSlot := keccak256(0x0c, 0x20)
            // If the handover does not exist, or has expired.
            if gt(timestamp(), sload(handoverSlot)) {
                mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`.
                revert(0x1c, 0x04)
            }
            // Set the handover slot to 0.
            sstore(handoverSlot, 0)
        }
        _setOwner(pendingOwner);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   PUBLIC READ FUNCTIONS                    */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the owner of the contract.
    function owner() public view virtual returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := sload(_OWNER_SLOT)
        }
    }

    /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.
    function ownershipHandoverExpiresAt(
        address pendingOwner
    ) public view virtual returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the handover slot.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            // Load the handover slot.
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         MODIFIERS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Marks a function as only callable by the owner.
    modifier onlyOwner() virtual {
        _checkOwner();
        _;
    }
}

File 4 of 7 : SafeTransferLib.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @author Permit2 operations from (https://github.com/Uniswap/permit2/blob/main/src/libraries/Permit2Lib.sol)
///
/// @dev Note:
/// - For ETH transfers, please use `forceSafeTransferETH` for DoS protection.
library SafeTransferLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The ETH transfer has failed.
    error ETHTransferFailed();

    /// @dev The ERC20 `transferFrom` has failed.
    error TransferFromFailed();

    /// @dev The ERC20 `transfer` has failed.
    error TransferFailed();

    /// @dev The ERC20 `approve` has failed.
    error ApproveFailed();

    /// @dev The ERC20 `totalSupply` query has failed.
    error TotalSupplyQueryFailed();

    /// @dev The Permit2 operation has failed.
    error Permit2Failed();

    /// @dev The Permit2 amount must be less than `2**160 - 1`.
    error Permit2AmountOverflow();

    /// @dev The Permit2 approve operation has failed.
    error Permit2ApproveFailed();

    /// @dev The Permit2 lockdown operation has failed.
    error Permit2LockdownFailed();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Suggested gas stipend for contract receiving ETH that disallows any storage writes.
    uint256 internal constant GAS_STIPEND_NO_STORAGE_WRITES = 2300;

    /// @dev Suggested gas stipend for contract receiving ETH to perform a few
    /// storage reads and writes, but low enough to prevent griefing.
    uint256 internal constant GAS_STIPEND_NO_GRIEF = 100000;

    /// @dev The unique EIP-712 domain domain separator for the DAI token contract.
    bytes32 internal constant DAI_DOMAIN_SEPARATOR =
        0xdbb8cf42e1ecb028be3f3dbc922e1d878b963f411dc388ced501601c60f7c6f7;

    /// @dev The address for the WETH9 contract on Ethereum mainnet.
    address internal constant WETH9 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    /// @dev The canonical Permit2 address.
    /// [Github](https://github.com/Uniswap/permit2)
    /// [Etherscan](https://etherscan.io/address/0x000000000022D473030F116dDEE9F6B43aC78BA3)
    address internal constant PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       ETH OPERATIONS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    // If the ETH transfer MUST succeed with a reasonable gas budget, use the force variants.
    //
    // The regular variants:
    // - Forwards all remaining gas to the target.
    // - Reverts if the target reverts.
    // - Reverts if the current contract has insufficient balance.
    //
    // The force variants:
    // - Forwards with an optional gas stipend
    //   (defaults to `GAS_STIPEND_NO_GRIEF`, which is sufficient for most cases).
    // - If the target reverts, or if the gas stipend is exhausted,
    //   creates a temporary contract to force send the ETH via `SELFDESTRUCT`.
    //   Future compatible with `SENDALL`: https://eips.ethereum.org/EIPS/eip-4758.
    // - Reverts if the current contract has insufficient balance.
    //
    // The try variants:
    // - Forwards with a mandatory gas stipend.
    // - Instead of reverting, returns whether the transfer succeeded.

    /// @dev Sends `amount` (in wei) ETH to `to`.
    function safeTransferETH(address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(call(gas(), to, amount, codesize(), 0x00, codesize(), 0x00)) {
                mstore(0x00, 0xb12d13eb) // `ETHTransferFailed()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Sends all the ETH in the current contract to `to`.
    function safeTransferAllETH(address to) internal {
        /// @solidity memory-safe-assembly
        assembly {
            // Transfer all the ETH and check if it succeeded or not.
            if iszero(call(gas(), to, selfbalance(), codesize(), 0x00, codesize(), 0x00)) {
                mstore(0x00, 0xb12d13eb) // `ETHTransferFailed()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Force sends `amount` (in wei) ETH to `to`, with a `gasStipend`.
    function forceSafeTransferETH(address to, uint256 amount, uint256 gasStipend) internal {
        /// @solidity memory-safe-assembly
        assembly {
            if lt(selfbalance(), amount) {
                mstore(0x00, 0xb12d13eb) // `ETHTransferFailed()`.
                revert(0x1c, 0x04)
            }
            if iszero(call(gasStipend, to, amount, codesize(), 0x00, codesize(), 0x00)) {
                mstore(0x00, to) // Store the address in scratch space.
                mstore8(0x0b, 0x73) // Opcode `PUSH20`.
                mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`.
                if iszero(create(amount, 0x0b, 0x16)) { revert(codesize(), codesize()) } // For gas estimation.
            }
        }
    }

    /// @dev Force sends all the ETH in the current contract to `to`, with a `gasStipend`.
    function forceSafeTransferAllETH(address to, uint256 gasStipend) internal {
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(call(gasStipend, to, selfbalance(), codesize(), 0x00, codesize(), 0x00)) {
                mstore(0x00, to) // Store the address in scratch space.
                mstore8(0x0b, 0x73) // Opcode `PUSH20`.
                mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`.
                if iszero(create(selfbalance(), 0x0b, 0x16)) { revert(codesize(), codesize()) } // For gas estimation.
            }
        }
    }

    /// @dev Force sends `amount` (in wei) ETH to `to`, with `GAS_STIPEND_NO_GRIEF`.
    function forceSafeTransferETH(address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            if lt(selfbalance(), amount) {
                mstore(0x00, 0xb12d13eb) // `ETHTransferFailed()`.
                revert(0x1c, 0x04)
            }
            if iszero(call(GAS_STIPEND_NO_GRIEF, to, amount, codesize(), 0x00, codesize(), 0x00)) {
                mstore(0x00, to) // Store the address in scratch space.
                mstore8(0x0b, 0x73) // Opcode `PUSH20`.
                mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`.
                if iszero(create(amount, 0x0b, 0x16)) { revert(codesize(), codesize()) } // For gas estimation.
            }
        }
    }

    /// @dev Force sends all the ETH in the current contract to `to`, with `GAS_STIPEND_NO_GRIEF`.
    function forceSafeTransferAllETH(address to) internal {
        /// @solidity memory-safe-assembly
        assembly {
            // forgefmt: disable-next-item
            if iszero(call(GAS_STIPEND_NO_GRIEF, to, selfbalance(), codesize(), 0x00, codesize(), 0x00)) {
                mstore(0x00, to) // Store the address in scratch space.
                mstore8(0x0b, 0x73) // Opcode `PUSH20`.
                mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`.
                if iszero(create(selfbalance(), 0x0b, 0x16)) { revert(codesize(), codesize()) } // For gas estimation.
            }
        }
    }

    /// @dev Sends `amount` (in wei) ETH to `to`, with a `gasStipend`.
    function trySafeTransferETH(address to, uint256 amount, uint256 gasStipend)
        internal
        returns (bool success)
    {
        /// @solidity memory-safe-assembly
        assembly {
            success := call(gasStipend, to, amount, codesize(), 0x00, codesize(), 0x00)
        }
    }

    /// @dev Sends all the ETH in the current contract to `to`, with a `gasStipend`.
    function trySafeTransferAllETH(address to, uint256 gasStipend)
        internal
        returns (bool success)
    {
        /// @solidity memory-safe-assembly
        assembly {
            success := call(gasStipend, to, selfbalance(), codesize(), 0x00, codesize(), 0x00)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      ERC20 OPERATIONS                      */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Sends `amount` of ERC20 `token` from `from` to `to`.
    /// Reverts upon failure.
    ///
    /// The `from` account must have at least `amount` approved for
    /// the current contract to manage.
    function safeTransferFrom(address token, address from, address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x60, amount) // Store the `amount` argument.
            mstore(0x40, to) // Store the `to` argument.
            mstore(0x2c, shl(96, from)) // Store the `from` argument.
            mstore(0x0c, 0x23b872dd000000000000000000000000) // `transferFrom(address,address,uint256)`.
            let success := call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
            if iszero(and(eq(mload(0x00), 1), success)) {
                if iszero(lt(or(iszero(extcodesize(token)), returndatasize()), success)) {
                    mstore(0x00, 0x7939f424) // `TransferFromFailed()`.
                    revert(0x1c, 0x04)
                }
            }
            mstore(0x60, 0) // Restore the zero slot to zero.
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Sends `amount` of ERC20 `token` from `from` to `to`.
    ///
    /// The `from` account must have at least `amount` approved for the current contract to manage.
    function trySafeTransferFrom(address token, address from, address to, uint256 amount)
        internal
        returns (bool success)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x60, amount) // Store the `amount` argument.
            mstore(0x40, to) // Store the `to` argument.
            mstore(0x2c, shl(96, from)) // Store the `from` argument.
            mstore(0x0c, 0x23b872dd000000000000000000000000) // `transferFrom(address,address,uint256)`.
            success := call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
            if iszero(and(eq(mload(0x00), 1), success)) {
                success := lt(or(iszero(extcodesize(token)), returndatasize()), success)
            }
            mstore(0x60, 0) // Restore the zero slot to zero.
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Sends all of ERC20 `token` from `from` to `to`.
    /// Reverts upon failure.
    ///
    /// The `from` account must have their entire balance approved for the current contract to manage.
    function safeTransferAllFrom(address token, address from, address to)
        internal
        returns (uint256 amount)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x40, to) // Store the `to` argument.
            mstore(0x2c, shl(96, from)) // Store the `from` argument.
            mstore(0x0c, 0x70a08231000000000000000000000000) // `balanceOf(address)`.
            // Read the balance, reverting upon failure.
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    gt(returndatasize(), 0x1f), // At least 32 bytes returned.
                    staticcall(gas(), token, 0x1c, 0x24, 0x60, 0x20)
                )
            ) {
                mstore(0x00, 0x7939f424) // `TransferFromFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(0x00, 0x23b872dd) // `transferFrom(address,address,uint256)`.
            amount := mload(0x60) // The `amount` is already at 0x60. We'll need to return it.
            // Perform the transfer, reverting upon failure.
            let success := call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
            if iszero(and(eq(mload(0x00), 1), success)) {
                if iszero(lt(or(iszero(extcodesize(token)), returndatasize()), success)) {
                    mstore(0x00, 0x7939f424) // `TransferFromFailed()`.
                    revert(0x1c, 0x04)
                }
            }
            mstore(0x60, 0) // Restore the zero slot to zero.
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Sends `amount` of ERC20 `token` from the current contract to `to`.
    /// Reverts upon failure.
    function safeTransfer(address token, address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x14, to) // Store the `to` argument.
            mstore(0x34, amount) // Store the `amount` argument.
            mstore(0x00, 0xa9059cbb000000000000000000000000) // `transfer(address,uint256)`.
            // Perform the transfer, reverting upon failure.
            let success := call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
            if iszero(and(eq(mload(0x00), 1), success)) {
                if iszero(lt(or(iszero(extcodesize(token)), returndatasize()), success)) {
                    mstore(0x00, 0x90b8ec18) // `TransferFailed()`.
                    revert(0x1c, 0x04)
                }
            }
            mstore(0x34, 0) // Restore the part of the free memory pointer that was overwritten.
        }
    }

    /// @dev Sends all of ERC20 `token` from the current contract to `to`.
    /// Reverts upon failure.
    function safeTransferAll(address token, address to) internal returns (uint256 amount) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, 0x70a08231) // Store the function selector of `balanceOf(address)`.
            mstore(0x20, address()) // Store the address of the current contract.
            // Read the balance, reverting upon failure.
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    gt(returndatasize(), 0x1f), // At least 32 bytes returned.
                    staticcall(gas(), token, 0x1c, 0x24, 0x34, 0x20)
                )
            ) {
                mstore(0x00, 0x90b8ec18) // `TransferFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(0x14, to) // Store the `to` argument.
            amount := mload(0x34) // The `amount` is already at 0x34. We'll need to return it.
            mstore(0x00, 0xa9059cbb000000000000000000000000) // `transfer(address,uint256)`.
            // Perform the transfer, reverting upon failure.
            let success := call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
            if iszero(and(eq(mload(0x00), 1), success)) {
                if iszero(lt(or(iszero(extcodesize(token)), returndatasize()), success)) {
                    mstore(0x00, 0x90b8ec18) // `TransferFailed()`.
                    revert(0x1c, 0x04)
                }
            }
            mstore(0x34, 0) // Restore the part of the free memory pointer that was overwritten.
        }
    }

    /// @dev Sets `amount` of ERC20 `token` for `to` to manage on behalf of the current contract.
    /// Reverts upon failure.
    function safeApprove(address token, address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x14, to) // Store the `to` argument.
            mstore(0x34, amount) // Store the `amount` argument.
            mstore(0x00, 0x095ea7b3000000000000000000000000) // `approve(address,uint256)`.
            let success := call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
            if iszero(and(eq(mload(0x00), 1), success)) {
                if iszero(lt(or(iszero(extcodesize(token)), returndatasize()), success)) {
                    mstore(0x00, 0x3e3f8f73) // `ApproveFailed()`.
                    revert(0x1c, 0x04)
                }
            }
            mstore(0x34, 0) // Restore the part of the free memory pointer that was overwritten.
        }
    }

    /// @dev Sets `amount` of ERC20 `token` for `to` to manage on behalf of the current contract.
    /// If the initial attempt to approve fails, attempts to reset the approved amount to zero,
    /// then retries the approval again (some tokens, e.g. USDT, requires this).
    /// Reverts upon failure.
    function safeApproveWithRetry(address token, address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x14, to) // Store the `to` argument.
            mstore(0x34, amount) // Store the `amount` argument.
            mstore(0x00, 0x095ea7b3000000000000000000000000) // `approve(address,uint256)`.
            // Perform the approval, retrying upon failure.
            let success := call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
            if iszero(and(eq(mload(0x00), 1), success)) {
                if iszero(lt(or(iszero(extcodesize(token)), returndatasize()), success)) {
                    mstore(0x34, 0) // Store 0 for the `amount`.
                    mstore(0x00, 0x095ea7b3000000000000000000000000) // `approve(address,uint256)`.
                    pop(call(gas(), token, 0, 0x10, 0x44, codesize(), 0x00)) // Reset the approval.
                    mstore(0x34, amount) // Store back the original `amount`.
                    // Retry the approval, reverting upon failure.
                    success := call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
                    if iszero(and(eq(mload(0x00), 1), success)) {
                        // Check the `extcodesize` again just in case the token selfdestructs lol.
                        if iszero(lt(or(iszero(extcodesize(token)), returndatasize()), success)) {
                            mstore(0x00, 0x3e3f8f73) // `ApproveFailed()`.
                            revert(0x1c, 0x04)
                        }
                    }
                }
            }
            mstore(0x34, 0) // Restore the part of the free memory pointer that was overwritten.
        }
    }

    /// @dev Returns the amount of ERC20 `token` owned by `account`.
    /// Returns zero if the `token` does not exist.
    function balanceOf(address token, address account) internal view returns (uint256 amount) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x14, account) // Store the `account` argument.
            mstore(0x00, 0x70a08231000000000000000000000000) // `balanceOf(address)`.
            amount :=
                mul( // The arguments of `mul` are evaluated from right to left.
                    mload(0x20),
                    and( // The arguments of `and` are evaluated from right to left.
                        gt(returndatasize(), 0x1f), // At least 32 bytes returned.
                        staticcall(gas(), token, 0x10, 0x24, 0x20, 0x20)
                    )
                )
        }
    }

    /// @dev Returns the total supply of the `token`.
    /// Reverts if the token does not exist or does not implement `totalSupply()`.
    function totalSupply(address token) internal view returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, 0x18160ddd) // `totalSupply()`.
            if iszero(
                and(gt(returndatasize(), 0x1f), staticcall(gas(), token, 0x1c, 0x04, 0x00, 0x20))
            ) {
                mstore(0x00, 0x54cd9435) // `TotalSupplyQueryFailed()`.
                revert(0x1c, 0x04)
            }
            result := mload(0x00)
        }
    }

    /// @dev Sends `amount` of ERC20 `token` from `from` to `to`.
    /// If the initial attempt fails, try to use Permit2 to transfer the token.
    /// Reverts upon failure.
    ///
    /// The `from` account must have at least `amount` approved for the current contract to manage.
    function safeTransferFrom2(address token, address from, address to, uint256 amount) internal {
        if (!trySafeTransferFrom(token, from, to, amount)) {
            permit2TransferFrom(token, from, to, amount);
        }
    }

    /// @dev Sends `amount` of ERC20 `token` from `from` to `to` via Permit2.
    /// Reverts upon failure.
    function permit2TransferFrom(address token, address from, address to, uint256 amount)
        internal
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(add(m, 0x74), shr(96, shl(96, token)))
            mstore(add(m, 0x54), amount)
            mstore(add(m, 0x34), to)
            mstore(add(m, 0x20), shl(96, from))
            // `transferFrom(address,address,uint160,address)`.
            mstore(m, 0x36c78516000000000000000000000000)
            let p := PERMIT2
            let exists := eq(chainid(), 1)
            if iszero(exists) { exists := iszero(iszero(extcodesize(p))) }
            if iszero(
                and(
                    call(gas(), p, 0, add(m, 0x10), 0x84, codesize(), 0x00),
                    lt(iszero(extcodesize(token)), exists) // Token has code and Permit2 exists.
                )
            ) {
                mstore(0x00, 0x7939f4248757f0fd) // `TransferFromFailed()` or `Permit2AmountOverflow()`.
                revert(add(0x18, shl(2, iszero(iszero(shr(160, amount))))), 0x04)
            }
        }
    }

    /// @dev Permit a user to spend a given amount of
    /// another user's tokens via native EIP-2612 permit if possible, falling
    /// back to Permit2 if native permit fails or is not implemented on the token.
    function permit2(
        address token,
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        bool success;
        /// @solidity memory-safe-assembly
        assembly {
            for {} shl(96, xor(token, WETH9)) {} {
                mstore(0x00, 0x3644e515) // `DOMAIN_SEPARATOR()`.
                if iszero(
                    and( // The arguments of `and` are evaluated from right to left.
                        lt(iszero(mload(0x00)), eq(returndatasize(), 0x20)), // Returns 1 non-zero word.
                        // Gas stipend to limit gas burn for tokens that don't refund gas when
                        // an non-existing function is called. 5K should be enough for a SLOAD.
                        staticcall(5000, token, 0x1c, 0x04, 0x00, 0x20)
                    )
                ) { break }
                // After here, we can be sure that token is a contract.
                let m := mload(0x40)
                mstore(add(m, 0x34), spender)
                mstore(add(m, 0x20), shl(96, owner))
                mstore(add(m, 0x74), deadline)
                if eq(mload(0x00), DAI_DOMAIN_SEPARATOR) {
                    mstore(0x14, owner)
                    mstore(0x00, 0x7ecebe00000000000000000000000000) // `nonces(address)`.
                    mstore(
                        add(m, 0x94),
                        lt(iszero(amount), staticcall(gas(), token, 0x10, 0x24, add(m, 0x54), 0x20))
                    )
                    mstore(m, 0x8fcbaf0c000000000000000000000000) // `IDAIPermit.permit`.
                    // `nonces` is already at `add(m, 0x54)`.
                    // `amount != 0` is already stored at `add(m, 0x94)`.
                    mstore(add(m, 0xb4), and(0xff, v))
                    mstore(add(m, 0xd4), r)
                    mstore(add(m, 0xf4), s)
                    success := call(gas(), token, 0, add(m, 0x10), 0x104, codesize(), 0x00)
                    break
                }
                mstore(m, 0xd505accf000000000000000000000000) // `IERC20Permit.permit`.
                mstore(add(m, 0x54), amount)
                mstore(add(m, 0x94), and(0xff, v))
                mstore(add(m, 0xb4), r)
                mstore(add(m, 0xd4), s)
                success := call(gas(), token, 0, add(m, 0x10), 0xe4, codesize(), 0x00)
                break
            }
        }
        if (!success) simplePermit2(token, owner, spender, amount, deadline, v, r, s);
    }

    /// @dev Simple permit on the Permit2 contract.
    function simplePermit2(
        address token,
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(m, 0x927da105) // `allowance(address,address,address)`.
            {
                let addressMask := shr(96, not(0))
                mstore(add(m, 0x20), and(addressMask, owner))
                mstore(add(m, 0x40), and(addressMask, token))
                mstore(add(m, 0x60), and(addressMask, spender))
                mstore(add(m, 0xc0), and(addressMask, spender))
            }
            let p := mul(PERMIT2, iszero(shr(160, amount)))
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    gt(returndatasize(), 0x5f), // Returns 3 words: `amount`, `expiration`, `nonce`.
                    staticcall(gas(), p, add(m, 0x1c), 0x64, add(m, 0x60), 0x60)
                )
            ) {
                mstore(0x00, 0x6b836e6b8757f0fd) // `Permit2Failed()` or `Permit2AmountOverflow()`.
                revert(add(0x18, shl(2, iszero(p))), 0x04)
            }
            mstore(m, 0x2b67b570) // `Permit2.permit` (PermitSingle variant).
            // `owner` is already `add(m, 0x20)`.
            // `token` is already at `add(m, 0x40)`.
            mstore(add(m, 0x60), amount)
            mstore(add(m, 0x80), 0xffffffffffff) // `expiration = type(uint48).max`.
            // `nonce` is already at `add(m, 0xa0)`.
            // `spender` is already at `add(m, 0xc0)`.
            mstore(add(m, 0xe0), deadline)
            mstore(add(m, 0x100), 0x100) // `signature` offset.
            mstore(add(m, 0x120), 0x41) // `signature` length.
            mstore(add(m, 0x140), r)
            mstore(add(m, 0x160), s)
            mstore(add(m, 0x180), shl(248, v))
            if iszero( // Revert if token does not have code, or if the call fails.
            mul(extcodesize(token), call(gas(), p, 0, add(m, 0x1c), 0x184, codesize(), 0x00))) {
                mstore(0x00, 0x6b836e6b) // `Permit2Failed()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Approves `spender` to spend `amount` of `token` for `address(this)`.
    function permit2Approve(address token, address spender, uint160 amount, uint48 expiration)
        internal
    {
        /// @solidity memory-safe-assembly
        assembly {
            let addressMask := shr(96, not(0))
            let m := mload(0x40)
            mstore(m, 0x87517c45) // `approve(address,address,uint160,uint48)`.
            mstore(add(m, 0x20), and(addressMask, token))
            mstore(add(m, 0x40), and(addressMask, spender))
            mstore(add(m, 0x60), and(addressMask, amount))
            mstore(add(m, 0x80), and(0xffffffffffff, expiration))
            if iszero(call(gas(), PERMIT2, 0, add(m, 0x1c), 0xa0, codesize(), 0x00)) {
                mstore(0x00, 0x324f14ae) // `Permit2ApproveFailed()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Revokes an approval for `token` and `spender` for `address(this)`.
    function permit2Lockdown(address token, address spender) internal {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(m, 0xcc53287f) // `Permit2.lockdown`.
            mstore(add(m, 0x20), 0x20) // Offset of the `approvals`.
            mstore(add(m, 0x40), 1) // `approvals.length`.
            mstore(add(m, 0x60), shr(96, shl(96, token)))
            mstore(add(m, 0x80), shr(96, shl(96, spender)))
            if iszero(call(gas(), PERMIT2, 0, add(m, 0x1c), 0xa0, codesize(), 0x00)) {
                mstore(0x00, 0x96b3de23) // `Permit2LockdownFailed()`.
                revert(0x1c, 0x04)
            }
        }
    }
}

File 5 of 7 : SignatureCheckerLib.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Signature verification helper that supports both ECDSA signatures from EOAs
/// and ERC1271 signatures from smart contract wallets like Argent and Gnosis safe.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SignatureCheckerLib.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/SignatureChecker.sol)
///
/// @dev Note:
/// - The signature checking functions use the ecrecover precompile (0x1).
/// - The `bytes memory signature` variants use the identity precompile (0x4)
///   to copy memory internally.
/// - Unlike ECDSA signatures, contract signatures are revocable.
/// - As of Solady version 0.0.134, all `bytes signature` variants accept both
///   regular 65-byte `(r, s, v)` and EIP-2098 `(r, vs)` short form signatures.
///   See: https://eips.ethereum.org/EIPS/eip-2098
///   This is for calldata efficiency on smart accounts prevalent on L2s.
///
/// WARNING! Do NOT use signatures as unique identifiers:
/// - Use a nonce in the digest to prevent replay attacks on the same contract.
/// - Use EIP-712 for the digest to prevent replay attacks across different chains and contracts.
///   EIP-712 also enables readable signing of typed data for better user safety.
/// This implementation does NOT check if a signature is non-malleable.
library SignatureCheckerLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*               SIGNATURE CHECKING OPERATIONS                */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns whether `signature` is valid for `signer` and `hash`.
    /// If `signer.code.length == 0`, then validate with `ecrecover`, else
    /// it will validate with ERC1271 on `signer`.
    function isValidSignatureNow(address signer, bytes32 hash, bytes memory signature)
        internal
        view
        returns (bool isValid)
    {
        if (signer == address(0)) return isValid;
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            for {} 1 {} {
                if iszero(extcodesize(signer)) {
                    switch mload(signature)
                    case 64 {
                        let vs := mload(add(signature, 0x40))
                        mstore(0x20, add(shr(255, vs), 27)) // `v`.
                        mstore(0x60, shr(1, shl(1, vs))) // `s`.
                    }
                    case 65 {
                        mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.
                        mstore(0x60, mload(add(signature, 0x40))) // `s`.
                    }
                    default { break }
                    mstore(0x00, hash)
                    mstore(0x40, mload(add(signature, 0x20))) // `r`.
                    let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))
                    isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))
                    mstore(0x60, 0) // Restore the zero slot.
                    mstore(0x40, m) // Restore the free memory pointer.
                    break
                }
                let f := shl(224, 0x1626ba7e)
                mstore(m, f) // `bytes4(keccak256("isValidSignature(bytes32,bytes)"))`.
                mstore(add(m, 0x04), hash)
                let d := add(m, 0x24)
                mstore(d, 0x40) // The offset of the `signature` in the calldata.
                // Copy the `signature` over.
                let n := add(0x20, mload(signature))
                let copied := staticcall(gas(), 4, signature, n, add(m, 0x44), n)
                isValid := staticcall(gas(), signer, m, add(returndatasize(), 0x44), d, 0x20)
                isValid := and(eq(mload(d), f), and(isValid, copied))
                break
            }
        }
    }

    /// @dev Returns whether `signature` is valid for `signer` and `hash`.
    /// If `signer.code.length == 0`, then validate with `ecrecover`, else
    /// it will validate with ERC1271 on `signer`.
    function isValidSignatureNowCalldata(address signer, bytes32 hash, bytes calldata signature)
        internal
        view
        returns (bool isValid)
    {
        if (signer == address(0)) return isValid;
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            for {} 1 {} {
                if iszero(extcodesize(signer)) {
                    switch signature.length
                    case 64 {
                        let vs := calldataload(add(signature.offset, 0x20))
                        mstore(0x20, add(shr(255, vs), 27)) // `v`.
                        mstore(0x40, calldataload(signature.offset)) // `r`.
                        mstore(0x60, shr(1, shl(1, vs))) // `s`.
                    }
                    case 65 {
                        mstore(0x20, byte(0, calldataload(add(signature.offset, 0x40)))) // `v`.
                        calldatacopy(0x40, signature.offset, 0x40) // `r`, `s`.
                    }
                    default { break }
                    mstore(0x00, hash)
                    let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))
                    isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))
                    mstore(0x60, 0) // Restore the zero slot.
                    mstore(0x40, m) // Restore the free memory pointer.
                    break
                }
                let f := shl(224, 0x1626ba7e)
                mstore(m, f) // `bytes4(keccak256("isValidSignature(bytes32,bytes)"))`.
                mstore(add(m, 0x04), hash)
                let d := add(m, 0x24)
                mstore(d, 0x40) // The offset of the `signature` in the calldata.
                mstore(add(m, 0x44), signature.length)
                // Copy the `signature` over.
                calldatacopy(add(m, 0x64), signature.offset, signature.length)
                isValid := staticcall(gas(), signer, m, add(signature.length, 0x64), d, 0x20)
                isValid := and(eq(mload(d), f), isValid)
                break
            }
        }
    }

    /// @dev Returns whether the signature (`r`, `vs`) is valid for `signer` and `hash`.
    /// If `signer.code.length == 0`, then validate with `ecrecover`, else
    /// it will validate with ERC1271 on `signer`.
    function isValidSignatureNow(address signer, bytes32 hash, bytes32 r, bytes32 vs)
        internal
        view
        returns (bool isValid)
    {
        if (signer == address(0)) return isValid;
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            for {} 1 {} {
                if iszero(extcodesize(signer)) {
                    mstore(0x00, hash)
                    mstore(0x20, add(shr(255, vs), 27)) // `v`.
                    mstore(0x40, r) // `r`.
                    mstore(0x60, shr(1, shl(1, vs))) // `s`.
                    let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))
                    isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))
                    mstore(0x60, 0) // Restore the zero slot.
                    mstore(0x40, m) // Restore the free memory pointer.
                    break
                }
                let f := shl(224, 0x1626ba7e)
                mstore(m, f) // `bytes4(keccak256("isValidSignature(bytes32,bytes)"))`.
                mstore(add(m, 0x04), hash)
                let d := add(m, 0x24)
                mstore(d, 0x40) // The offset of the `signature` in the calldata.
                mstore(add(m, 0x44), 65) // Length of the signature.
                mstore(add(m, 0x64), r) // `r`.
                mstore(add(m, 0x84), shr(1, shl(1, vs))) // `s`.
                mstore8(add(m, 0xa4), add(shr(255, vs), 27)) // `v`.
                isValid := staticcall(gas(), signer, m, 0xa5, d, 0x20)
                isValid := and(eq(mload(d), f), isValid)
                break
            }
        }
    }

    /// @dev Returns whether the signature (`v`, `r`, `s`) is valid for `signer` and `hash`.
    /// If `signer.code.length == 0`, then validate with `ecrecover`, else
    /// it will validate with ERC1271 on `signer`.
    function isValidSignatureNow(address signer, bytes32 hash, uint8 v, bytes32 r, bytes32 s)
        internal
        view
        returns (bool isValid)
    {
        if (signer == address(0)) return isValid;
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            for {} 1 {} {
                if iszero(extcodesize(signer)) {
                    mstore(0x00, hash)
                    mstore(0x20, and(v, 0xff)) // `v`.
                    mstore(0x40, r) // `r`.
                    mstore(0x60, s) // `s`.
                    let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))
                    isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))
                    mstore(0x60, 0) // Restore the zero slot.
                    mstore(0x40, m) // Restore the free memory pointer.
                    break
                }
                let f := shl(224, 0x1626ba7e)
                mstore(m, f) // `bytes4(keccak256("isValidSignature(bytes32,bytes)"))`.
                mstore(add(m, 0x04), hash)
                let d := add(m, 0x24)
                mstore(d, 0x40) // The offset of the `signature` in the calldata.
                mstore(add(m, 0x44), 65) // Length of the signature.
                mstore(add(m, 0x64), r) // `r`.
                mstore(add(m, 0x84), s) // `s`.
                mstore8(add(m, 0xa4), v) // `v`.
                isValid := staticcall(gas(), signer, m, 0xa5, d, 0x20)
                isValid := and(eq(mload(d), f), isValid)
                break
            }
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     ERC1271 OPERATIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    // Note: These ERC1271 operations do NOT have an ECDSA fallback.

    /// @dev Returns whether `signature` is valid for `hash` for an ERC1271 `signer` contract.
    function isValidERC1271SignatureNow(address signer, bytes32 hash, bytes memory signature)
        internal
        view
        returns (bool isValid)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            let f := shl(224, 0x1626ba7e)
            mstore(m, f) // `bytes4(keccak256("isValidSignature(bytes32,bytes)"))`.
            mstore(add(m, 0x04), hash)
            let d := add(m, 0x24)
            mstore(d, 0x40) // The offset of the `signature` in the calldata.
            // Copy the `signature` over.
            let n := add(0x20, mload(signature))
            let copied := staticcall(gas(), 4, signature, n, add(m, 0x44), n)
            isValid := staticcall(gas(), signer, m, add(returndatasize(), 0x44), d, 0x20)
            isValid := and(eq(mload(d), f), and(isValid, copied))
        }
    }

    /// @dev Returns whether `signature` is valid for `hash` for an ERC1271 `signer` contract.
    function isValidERC1271SignatureNowCalldata(
        address signer,
        bytes32 hash,
        bytes calldata signature
    ) internal view returns (bool isValid) {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            let f := shl(224, 0x1626ba7e)
            mstore(m, f) // `bytes4(keccak256("isValidSignature(bytes32,bytes)"))`.
            mstore(add(m, 0x04), hash)
            let d := add(m, 0x24)
            mstore(d, 0x40) // The offset of the `signature` in the calldata.
            mstore(add(m, 0x44), signature.length)
            // Copy the `signature` over.
            calldatacopy(add(m, 0x64), signature.offset, signature.length)
            isValid := staticcall(gas(), signer, m, add(signature.length, 0x64), d, 0x20)
            isValid := and(eq(mload(d), f), isValid)
        }
    }

    /// @dev Returns whether the signature (`r`, `vs`) is valid for `hash`
    /// for an ERC1271 `signer` contract.
    function isValidERC1271SignatureNow(address signer, bytes32 hash, bytes32 r, bytes32 vs)
        internal
        view
        returns (bool isValid)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            let f := shl(224, 0x1626ba7e)
            mstore(m, f) // `bytes4(keccak256("isValidSignature(bytes32,bytes)"))`.
            mstore(add(m, 0x04), hash)
            let d := add(m, 0x24)
            mstore(d, 0x40) // The offset of the `signature` in the calldata.
            mstore(add(m, 0x44), 65) // Length of the signature.
            mstore(add(m, 0x64), r) // `r`.
            mstore(add(m, 0x84), shr(1, shl(1, vs))) // `s`.
            mstore8(add(m, 0xa4), add(shr(255, vs), 27)) // `v`.
            isValid := staticcall(gas(), signer, m, 0xa5, d, 0x20)
            isValid := and(eq(mload(d), f), isValid)
        }
    }

    /// @dev Returns whether the signature (`v`, `r`, `s`) is valid for `hash`
    /// for an ERC1271 `signer` contract.
    function isValidERC1271SignatureNow(address signer, bytes32 hash, uint8 v, bytes32 r, bytes32 s)
        internal
        view
        returns (bool isValid)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            let f := shl(224, 0x1626ba7e)
            mstore(m, f) // `bytes4(keccak256("isValidSignature(bytes32,bytes)"))`.
            mstore(add(m, 0x04), hash)
            let d := add(m, 0x24)
            mstore(d, 0x40) // The offset of the `signature` in the calldata.
            mstore(add(m, 0x44), 65) // Length of the signature.
            mstore(add(m, 0x64), r) // `r`.
            mstore(add(m, 0x84), s) // `s`.
            mstore8(add(m, 0xa4), v) // `v`.
            isValid := staticcall(gas(), signer, m, 0xa5, d, 0x20)
            isValid := and(eq(mload(d), f), isValid)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     ERC6492 OPERATIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    // Note: These ERC6492 operations now include an ECDSA fallback at the very end.
    // The calldata variants are excluded for brevity.

    /// @dev Returns whether `signature` is valid for `hash`.
    /// If the signature is postfixed with the ERC6492 magic number, it will attempt to
    /// deploy / prepare the `signer` smart account before doing a regular ERC1271 check.
    /// Note: This function is NOT reentrancy safe.
    /// The verifier must be deployed.
    /// Otherwise, the function will return false if `signer` is not yet deployed / prepared.
    /// See: https://gist.github.com/Vectorized/011d6becff6e0a73e42fe100f8d7ef04
    /// With a dedicated verifier, this function is safe to use in contracts
    /// that have been granted special permissions.
    function isValidERC6492SignatureNowAllowSideEffects(
        address signer,
        bytes32 hash,
        bytes memory signature
    ) internal returns (bool isValid) {
        /// @solidity memory-safe-assembly
        assembly {
            function callIsValidSignature(signer_, hash_, signature_) -> _isValid {
                let m_ := mload(0x40)
                let f_ := shl(224, 0x1626ba7e)
                mstore(m_, f_) // `bytes4(keccak256("isValidSignature(bytes32,bytes)"))`.
                mstore(add(m_, 0x04), hash_)
                let d_ := add(m_, 0x24)
                mstore(d_, 0x40) // The offset of the `signature` in the calldata.
                let n_ := add(0x20, mload(signature_))
                let copied_ := staticcall(gas(), 4, signature_, n_, add(m_, 0x44), n_)
                _isValid := staticcall(gas(), signer_, m_, add(returndatasize(), 0x44), d_, 0x20)
                _isValid := and(eq(mload(d_), f_), and(_isValid, copied_))
            }
            let noCode := iszero(extcodesize(signer))
            let n := mload(signature)
            for {} 1 {} {
                if iszero(eq(mload(add(signature, n)), mul(0x6492, div(not(isValid), 0xffff)))) {
                    if iszero(noCode) { isValid := callIsValidSignature(signer, hash, signature) }
                    break
                }
                if iszero(noCode) {
                    let o := add(signature, 0x20) // Signature bytes.
                    isValid := callIsValidSignature(signer, hash, add(o, mload(add(o, 0x40))))
                    if isValid { break }
                }
                let m := mload(0x40)
                mstore(m, signer)
                mstore(add(m, 0x20), hash)
                pop(
                    call(
                        gas(), // Remaining gas.
                        0x0000bc370E4DC924F427d84e2f4B9Ec81626ba7E, // Non-reverting verifier.
                        0, // Send zero ETH.
                        m, // Start of memory.
                        add(returndatasize(), 0x40), // Length of calldata in memory.
                        staticcall(gas(), 4, add(signature, 0x20), n, add(m, 0x40), n), // 1.
                        0x00 // Length of returndata to write.
                    )
                )
                isValid := returndatasize()
                break
            }
            // Do `ecrecover` fallback if `noCode && !isValid`.
            for {} gt(noCode, isValid) {} {
                switch n
                case 64 {
                    let vs := mload(add(signature, 0x40))
                    mstore(0x20, add(shr(255, vs), 27)) // `v`.
                    mstore(0x60, shr(1, shl(1, vs))) // `s`.
                }
                case 65 {
                    mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.
                    mstore(0x60, mload(add(signature, 0x40))) // `s`.
                }
                default { break }
                let m := mload(0x40)
                mstore(0x00, hash)
                mstore(0x40, mload(add(signature, 0x20))) // `r`.
                let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))
                isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))
                mstore(0x60, 0) // Restore the zero slot.
                mstore(0x40, m) // Restore the free memory pointer.
                break
            }
        }
    }

    /// @dev Returns whether `signature` is valid for `hash`.
    /// If the signature is postfixed with the ERC6492 magic number, it will attempt
    /// to use a reverting verifier to deploy / prepare the `signer` smart account
    /// and do a `isValidSignature` check via the reverting verifier.
    /// Note: This function is reentrancy safe.
    /// The reverting verifier must be deployed.
    /// Otherwise, the function will return false if `signer` is not yet deployed / prepared.
    /// See: https://gist.github.com/Vectorized/846a474c855eee9e441506676800a9ad
    function isValidERC6492SignatureNow(address signer, bytes32 hash, bytes memory signature)
        internal
        returns (bool isValid)
    {
        /// @solidity memory-safe-assembly
        assembly {
            function callIsValidSignature(signer_, hash_, signature_) -> _isValid {
                let m_ := mload(0x40)
                let f_ := shl(224, 0x1626ba7e)
                mstore(m_, f_) // `bytes4(keccak256("isValidSignature(bytes32,bytes)"))`.
                mstore(add(m_, 0x04), hash_)
                let d_ := add(m_, 0x24)
                mstore(d_, 0x40) // The offset of the `signature` in the calldata.
                let n_ := add(0x20, mload(signature_))
                let copied_ := staticcall(gas(), 4, signature_, n_, add(m_, 0x44), n_)
                _isValid := staticcall(gas(), signer_, m_, add(returndatasize(), 0x44), d_, 0x20)
                _isValid := and(eq(mload(d_), f_), and(_isValid, copied_))
            }
            let noCode := iszero(extcodesize(signer))
            let n := mload(signature)
            for {} 1 {} {
                if iszero(eq(mload(add(signature, n)), mul(0x6492, div(not(isValid), 0xffff)))) {
                    if iszero(noCode) { isValid := callIsValidSignature(signer, hash, signature) }
                    break
                }
                if iszero(noCode) {
                    let o := add(signature, 0x20) // Signature bytes.
                    isValid := callIsValidSignature(signer, hash, add(o, mload(add(o, 0x40))))
                    if isValid { break }
                }
                let m := mload(0x40)
                mstore(m, signer)
                mstore(add(m, 0x20), hash)
                let willBeZeroIfRevertingVerifierExists :=
                    call(
                        gas(), // Remaining gas.
                        0x00007bd799e4A591FeA53f8A8a3E9f931626Ba7e, // Reverting verifier.
                        0, // Send zero ETH.
                        m, // Start of memory.
                        add(returndatasize(), 0x40), // Length of calldata in memory.
                        staticcall(gas(), 4, add(signature, 0x20), n, add(m, 0x40), n), // 1.
                        0x00 // Length of returndata to write.
                    )
                isValid := gt(returndatasize(), willBeZeroIfRevertingVerifierExists)
                break
            }
            // Do `ecrecover` fallback if `noCode && !isValid`.
            for {} gt(noCode, isValid) {} {
                switch n
                case 64 {
                    let vs := mload(add(signature, 0x40))
                    mstore(0x20, add(shr(255, vs), 27)) // `v`.
                    mstore(0x60, shr(1, shl(1, vs))) // `s`.
                }
                case 65 {
                    mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.
                    mstore(0x60, mload(add(signature, 0x40))) // `s`.
                }
                default { break }
                let m := mload(0x40)
                mstore(0x00, hash)
                mstore(0x40, mload(add(signature, 0x20))) // `r`.
                let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))
                isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))
                mstore(0x60, 0) // Restore the zero slot.
                mstore(0x40, m) // Restore the free memory pointer.
                break
            }
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     HASHING OPERATIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns an Ethereum Signed Message, created from a `hash`.
    /// This produces a hash corresponding to the one signed with the
    /// [`eth_sign`](https://eth.wiki/json-rpc/API#eth_sign)
    /// JSON-RPC method as part of EIP-191.
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, hash) // Store into scratch space for keccak256.
            mstore(0x00, "\x00\x00\x00\x00\x19Ethereum Signed Message:\n32") // 28 bytes.
            result := keccak256(0x04, 0x3c) // `32 * 2 - (32 - 28) = 60 = 0x3c`.
        }
    }

    /// @dev Returns an Ethereum Signed Message, created from `s`.
    /// This produces a hash corresponding to the one signed with the
    /// [`eth_sign`](https://eth.wiki/json-rpc/API#eth_sign)
    /// JSON-RPC method as part of EIP-191.
    /// Note: Supports lengths of `s` up to 999999 bytes.
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32 result) {
        /// @solidity memory-safe-assembly
        assembly {
            let sLength := mload(s)
            let o := 0x20
            mstore(o, "\x19Ethereum Signed Message:\n") // 26 bytes, zero-right-padded.
            mstore(0x00, 0x00)
            // Convert the `s.length` to ASCII decimal representation: `base10(s.length)`.
            for { let temp := sLength } 1 {} {
                o := sub(o, 1)
                mstore8(o, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                if iszero(temp) { break }
            }
            let n := sub(0x3a, o) // Header length: `26 + 32 - o`.
            // Throw an out-of-offset error (consumes all gas) if the header exceeds 32 bytes.
            returndatacopy(returndatasize(), returndatasize(), gt(n, 0x20))
            mstore(s, or(mload(0x00), mload(n))) // Temporarily store the header.
            result := keccak256(add(s, sub(0x20, n)), add(n, sLength))
            mstore(s, sLength) // Restore the length.
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   EMPTY CALLDATA HELPERS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns an empty calldata bytes.
    function emptySignature() internal pure returns (bytes calldata signature) {
        /// @solidity memory-safe-assembly
        assembly {
            signature.length := 0
        }
    }
}

File 6 of 7 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Reentrancy guard mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ReentrancyGuard.sol)
abstract contract ReentrancyGuard {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Unauthorized reentrant call.
    error Reentrancy();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Equivalent to: `uint72(bytes9(keccak256("_REENTRANCY_GUARD_SLOT")))`.
    /// 9 bytes is large enough to avoid collisions with lower slots,
    /// but not too large to result in excessive bytecode bloat.
    uint256 private constant _REENTRANCY_GUARD_SLOT = 0x929eee149b4bd21268;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      REENTRANCY GUARD                      */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Guards a function from reentrancy.
    modifier nonReentrant() virtual {
        /// @solidity memory-safe-assembly
        assembly {
            if eq(sload(_REENTRANCY_GUARD_SLOT), address()) {
                mstore(0x00, 0xab143c06) // `Reentrancy()`.
                revert(0x1c, 0x04)
            }
            sstore(_REENTRANCY_GUARD_SLOT, address())
        }
        _;
        /// @solidity memory-safe-assembly
        assembly {
            sstore(_REENTRANCY_GUARD_SLOT, codesize())
        }
    }

    /// @dev Guards a view function from read-only reentrancy.
    modifier nonReadReentrant() virtual {
        /// @solidity memory-safe-assembly
        assembly {
            if eq(sload(_REENTRANCY_GUARD_SLOT), address()) {
                mstore(0x00, 0xab143c06) // `Reentrancy()`.
                revert(0x1c, 0x04)
            }
        }
        _;
    }
}

File 7 of 7 : IGVC.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

interface IGVC {
    function vibeMint(address to, uint256 quantity) external;

    function grantMinterRole(address minter) external;
}

Settings
{
  "viaIR": true,
  "codegen": "yul",
  "remappings": [
    "openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
    "forge-std/=lib/forge-std/src/",
    "murky/=lib/murky/src/",
    "openzeppelin-contracts/=lib/murky/lib/openzeppelin-contracts/",
    "solady/=lib/solady/src/"
  ],
  "evmVersion": "cancun",
  "outputSelection": {
    "*": {
      "*": [
        "abi",
        "metadata"
      ],
      "": [
        "ast"
      ]
    }
  },
  "optimizer": {
    "enabled": true,
    "mode": "3",
    "fallback_to_optimizing_for_size": false,
    "disable_system_request_memoization": true
  },
  "metadata": {},
  "libraries": {},
  "enableEraVMExtensions": false,
  "forceEVMLA": false
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"Reentrancy","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"bidPrice","type":"uint256"}],"name":"Bid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"refundAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftCount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_BID_PER_USER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimAndRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_a","type":"address"}],"name":"claimInfo","outputs":[{"components":[{"internalType":"bool","name":"hasClaimed","type":"bool"},{"internalType":"uint256","name":"refundAmount","type":"uint256"},{"internalType":"uint256","name":"nftCount","type":"uint256"}],"internalType":"struct GVCAuction.ClaimInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"floorBid","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct RaffleBidHeap.Bid","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"userInput","type":"uint256"}],"name":"generateRandomNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"uint256","name":"_limitForBuyerID","type":"uint256"}],"name":"getBidAmtByBuyerId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBidsCnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"getUserBids","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct RaffleBidHeap.Bid[][]","name":"bids","type":"tuple[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"getUserClaimInfos","outputs":[{"components":[{"internalType":"bool","name":"hasClaimed","type":"bool"},{"internalType":"uint256","name":"refundAmount","type":"uint256"},{"internalType":"uint256","name":"nftCount","type":"uint256"}],"internalType":"struct GVCAuction.ClaimInfo[]","name":"results","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"highestBidPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"address","name":"_paymentRecipient","type":"address"},{"internalType":"uint256","name":"_nftAmount","type":"uint256"},{"internalType":"uint256","name":"_auctionEndTime","type":"uint256"},{"internalType":"address","name":"_signer","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentSent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"bidPrices","type":"uint256[]"},{"internalType":"uint256","name":"limitForBuyerID","type":"uint256"},{"internalType":"uint256","name":"limitForBuyerAmount","type":"uint256"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"placeBatchBids","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bidPrice","type":"uint256"},{"internalType":"uint256","name":"limitForBuyerID","type":"uint256"},{"internalType":"uint256","name":"limitForBuyerAmount","type":"uint256"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"placeBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"sendPayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_t","type":"uint256"}],"name":"setAuctionEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setNftAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_r","type":"address"}],"name":"setRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_s","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"tvl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userBids","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

Deployed Bytecode

0x0004000000000002000e000000000002000000000801034f0000006003100270000004660130019700030000001803550002000000080355000004660030019d0000000100200190000000230000c13d0000008002000039000000400020043f000000040010008c0000005d0000413d000000000208043b000000e0022002700000046e0020009c000000610000213d000004880020009c000000a90000213d000004950020009c000000ee0000a13d000004960020009c0000021e0000a13d000004970020009c000003b80000613d000004980020009c0000033d0000613d000004990020009c000004410000c13d0000000001000416000000000001004b000004410000c13d0000000c01000039000003810000013d0000000002000416000000000002004b000004410000c13d0000001f0210003900000467022001970000008002200039000000400020043f0000001f0310018f00000468041001980000008002400039000000340000613d0000008005000039000000000608034f000000006706043c0000000005750436000000000025004b000000300000c13d000000000003004b000000410000613d000000000448034f0000000303300210000000000502043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f0000000000320435000000200010008c000004410000413d000000800600043d000004690060009c000004410000213d0000046a01000041000000000061041b0000000001000414000004660010009c0000046601008041000000c0011002100000046b011001c70000800d0200003900000003030000390000046c0400004100000000050000191194118a0000040f0000000100200190000004410000613d000000000200041a000005010120019700000001011001bf000000000010041b0000002001000039000001000010044300000120000004430000046d01000041000011950001042e000000000001004b000004410000c13d0000000001000019000011950001042e0000046f0020009c000000dd0000213d0000047c0020009c0000010c0000a13d0000047d0020009c0000022f0000a13d0000047e0020009c000003ce0000613d0000047f0020009c0000034c0000613d000004800020009c000004410000c13d000000240010008c000004410000413d0000000002000416000000000002004b000004410000c13d0000000402800370000000000202043b000004ad0020009c000004410000213d0000002303200039000000000013004b000004410000813d0000000403200039000000000338034f000000000303043b000200000003001d000004ad0030009c000004410000213d000100240020003d000000020200002900000005022002100000000103200029000000000013004b000004410000213d0000003f01200039000004ae03100197000004af0030009c0000036c0000213d0000008001300039000000400010043f0000000204000029000000800040043f000000000004004b000004df0000c13d00000020020000390000000002210436000000800300043d00000000003204350000004002100039000000000003004b000002e10000613d000000a004000039000000000500001900000000460404340000000087060434000000000007004b0000000007000039000000010700c039000000000772043600000000080804330000000000870435000000400660003900000000060604330000004007200039000000000067043500000060022000390000000105500039000000000035004b000000980000413d000002e10000013d000004890020009c0000011f0000a13d0000048a0020009c0000025e0000a13d0000048b0020009c000003dc0000613d0000048c0020009c000003510000613d0000048d0020009c000004410000c13d000000240010008c000004410000413d0000000001000416000000000001004b000004410000c13d0000000401800370000000000301043b0000046a01000041000000000101041a0000000002000411000000000012004b000004180000c13d000c00000003001d000004a60100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000b440000613d000000000101043b0000000c04000029000000000014004b0000045a0000a13d0000000702000039000000000302041a000000000031004b000004bc0000a13d000000400100043d0000006402100039000004ce0300004100000000003204350000004402100039000004cf03000041000000000032043500000024021000390000002203000039000004630000013d000004700020009c0000013d0000a13d000004710020009c000002670000a13d000004720020009c000004070000613d000004730020009c000003720000613d000004740020009c000004410000c13d0000000001000416000000000001004b000004410000c13d0000003201000039000000800010043f000004a101000041000011950001042e0000049c0020009c0000017a0000213d0000049f0020009c0000029a0000613d000004a00020009c000004410000c13d000000440010008c000004410000413d0000000001000416000000000001004b000004410000c13d0000000401800370000000000101043b000004690010009c000004410000213d000000000010043f0000000b01000039000000200010043f00000040020000390000000001000019000c0000000803531194115e0000040f0000000c0200035f0000002402200370000000000202043b000000000020043f000000200010043f00000000010000190000004002000039000003800000013d000004830020009c000001a60000213d000004860020009c000002ac0000613d000004870020009c000004410000c13d000000240010008c000004410000413d0000000001000416000000000001004b000004410000c13d0000000401800370000000000101043b000c00000001001d000004690010009c000004410000213d11940d090000040f0000000401000039000002a60000013d000004900020009c000001ba0000213d000004930020009c000002b10000613d000004940020009c000004410000c13d000004a2010000410000000c0010043f0000000001000411000000000010043f0000000001000414000004660010009c0000046601008041000000c001100210000004a5011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000001041b0000000001000414000004660010009c0000046601008041000000c0011002100000046b011001c70000800d020000390000000203000039000004fa04000041000001a40000013d000004770020009c000002070000213d0000047a0020009c000002b60000613d0000047b0020009c000004410000c13d000000440010008c000004410000413d0000000001000416000000000001004b000004410000c13d0000000401800370000000000101043b000004690010009c000004410000213d0000002402800370000000000202043b000c00000002001d000000000010043f0000000901000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000201041a0000000c0020006b000004410000813d0000000c0200002911940b670000040f0000000102100039000000000202041a0000000203100039000000000303041a0000000304100039000000000404041a000000000501041a0000000401100039000000000101041a000000400600043d0000008007600039000000000017043500000060016000390000000000410435000000400160003900000000003104350000046901200197000000200260003900000000001204350000000000560435000004660060009c00000466060080410000004001600210000004ac011001c7000011950001042e0000049d0020009c000002ea0000613d0000049e0020009c000004410000c13d000004a2010000410000000c0010043f0000000001000411000000000010043f000004a60100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000b440000613d000000000101043b000c00000001001d0000000001000414000004660010009c0000046601008041000000c001100210000004a5011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b0000000c02000029000004ff0220009a000000000021041b0000000001000414000004660010009c0000046601008041000000c0011002100000046b011001c70000800d020000390000000203000039000005000400004100000000050004110000043e0000013d000004840020009c000002ef0000613d000004850020009c000004410000c13d000000240010008c000004410000413d0000000001000416000000000001004b000004410000c13d0000000401800370000000000101043b000004690010009c000004410000213d000000000010043f0000000a01000039000000200010043f000000400200003900000000010000191194115e0000040f000003360000013d000004910020009c000003040000613d000004920020009c000004410000c13d000000a40010008c000004410000413d0000000402800370000000000202043b000004ad0020009c000004410000213d0000002303200039000000000013004b000004410000813d0000000403200039000000000338034f000000000303043b000c00000003001d000004ad0030009c000004410000213d000b00240020003d0000000c0200002900000005022002100000000b02200029000000000012004b000004410000213d0000006402800370000000000202043b000a00000002001d0000004402800370000000000202043b000800000002001d0000002402800370000000000202043b000900000002001d0000008402800370000000000202043b000004ad0020009c000004410000213d0000002303200039000000000013004b000004410000813d000600040020003d0000000603800360000000000303043b000700000003001d000004ad0030009c000004410000213d0000000702200029000500240020003d000000050010006b000004410000213d000000000100041a000000ff00100190000004b20000c13d000004be01000041000000000201041a0000000003000410000000000032004b0000025a0000613d0000000002000410000000000021041b0000000d01000039000000000101041a000000ff00100190000003c40000613d0000000c0000006b0000085e0000c13d000004bc01000041000000800010043f0000002001000039000000840010043f0000001701000039000000a40010043f000004ef01000041000000c40010043f000004e5010000410000119600010430000004780020009c000003320000613d000004790020009c000004410000c13d000000240010008c000004410000413d0000000001000416000000000001004b000004410000c13d0000000401800370000000000101043b000004690010009c000004410000213d11940bf90000040f000000400200043d000c00000002001d11940b5b0000040f0000000c01000029000004660010009c00000466010080410000004001100210000004aa011001c7000011950001042e0000049a0020009c000003850000613d0000049b0020009c000004410000c13d000000240010008c000004410000413d0000000001000416000000000001004b000004410000c13d0000000401800370000000000101043b000c00000001001d000004690010009c000004410000213d11940d090000040f0000000601000039000002a60000013d000004810020009c0000038a0000613d000004820020009c000004410000c13d000000a40010008c000004410000413d0000006402800370000000000202043b000c00000002001d0000004402800370000000000202043b000a00000002001d0000002402800370000000000202043b000b00000002001d0000000402800370000000000202043b000900000002001d0000008402800370000000000202043b000004ad0020009c000004410000213d0000002303200039000000000013004b000004410000813d000700040020003d0000000703800360000000000303043b000800000003001d000004ad0030009c000004410000213d0000000802200029000600240020003d000000060010006b000004410000213d000000000100041a000000ff00100190000004b20000c13d000004be01000041000000000201041a0000000003000410000000000032004b000004f20000c13d000004f001000041000000000010043f000004a40100004100001196000104300000048e0020009c000003a00000613d0000048f0020009c000004410000c13d0000000001000416000000000001004b000004410000c13d000000000100041a000003370000013d000004750020009c000003a90000613d000004760020009c000004410000c13d000000240010008c000004410000413d0000000401800370000000000101043b000c00000001001d000004690010009c000004410000213d0000046a01000041000000000101041a0000000002000411000000000012004b000004180000c13d000004a2010000410000000c0010043f0000000c01000029000000000010043f0000000001000414000004660010009c0000046601008041000000c001100210000004a5011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000a00000001001d000000000101041a000b00000001001d000004a60100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000b440000613d000000000101043b0000000b0010006c0000056b0000a13d000004a801000041000000000010043f000004a4010000410000119600010430000000240010008c000004410000413d0000000001000416000000000001004b000004410000c13d0000000401800370000000000101043b000c00000001001d000004690010009c000004410000213d11940d090000040f0000000501000039000000000201041a000004c6022001970000000c022001af000000000021041b0000000001000019000011950001042e0000000001000416000000000001004b000004410000c13d0000000101000039000003810000013d0000000001000416000000000001004b000004410000c13d0000000701000039000003810000013d000000240010008c000004410000413d0000000002000416000000000002004b000004410000c13d0000000402800370000000000202043b000004ad0020009c000004410000213d0000002303200039000000000013004b000004410000813d0000000403200039000000000338034f000000000303043b000800000003001d000004ad0030009c000004410000213d000700240020003d000000080200002900000005022002100000000703200029000000000013004b000004410000213d0000003f01200039000004ae01100197000004af0010009c0000036c0000213d0000008001100039000000400010043f0000000803000029000000800030043f000000000003004b000005710000c13d00000020020000390000000002210436000000800300043d0000000000320435000000400410003900000005023002100000000002420019000000000003004b000006440000c13d0000000002120049000004660020009c00000466020080410000006002200210000004660010009c00000466010080410000004001100210000000000112019f000011950001042e0000000001000416000000000001004b000004410000c13d0000000401000039000003a40000013d0000046a01000041000000000501041a0000000001000411000000000051004b000004180000c13d0000000001000414000004660010009c0000046601008041000000c0011002100000046b011001c70000800d0200003900000003030000390000046c0400004100000000060000191194118a0000040f0000000100200190000004410000613d0000046a01000041000000000001041b0000000001000019000011950001042e000000a40010008c000004410000413d0000000001000416000000000001004b000004410000c13d0000000401800370000000000101043b000c00000001001d000004690010009c000004410000213d0000002401800370000000000101043b000004690010009c000004410000213d0000006402800370000000000202043b000b00000002001d0000004402800370000000000202043b000a00000002001d0000008402800370000000000202043b000004690020009c000004410000213d0000046a03000041000000000303041a0000000004000411000000000034004b000004180000c13d0000000d03000039000000000303041a000000ff00300190000005de0000c13d000900000003001d0000000c0000006b0000066b0000c13d000004bc01000041000000800010043f0000002001000039000000840010043f0000001f01000039000000a40010043f000004f901000041000000c40010043f000004e50100004100001196000104300000000001000416000000000001004b000004410000c13d0000000801000039000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f000004a101000041000011950001042e000000240010008c000004410000413d0000000001000416000000000001004b000004410000c13d0000000401800370000000000101043b11940b830000040f000000400200043d0000000000120435000004660020009c00000466020080410000004001200210000004fb011001c7000011950001042e0000000001000416000000000001004b000004410000c13d0000046a01000041000003a40000013d0000000001000416000000000001004b000004410000c13d0000000701000039000000000101041a000c00000001001d000004a60100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000b440000613d000000400200043d000000000101043b0000000c0010006c0000041c0000a13d0000000801000039000000000101041a000000ff001001900000046e0000c13d000004b10020009c000004bf0000a13d000004b901000041000000000010043f0000004101000039000000040010043f000004ba010000410000119600010430000000240010008c000004410000413d0000000001000416000000000001004b000004410000c13d0000000401800370000000000101043b000004690010009c000004410000213d000004a2020000410000000c0020043f000000000010043f0000000c0100003900000020020000391194115e0000040f000000000101041a000000800010043f000004a101000041000011950001042e0000000001000416000000000001004b000004410000c13d0000000601000039000003a40000013d0000000001000416000000000001004b000004410000c13d0000046a01000041000000000101041a0000000002000411000000000012004b000004180000c13d000000000300041a000005010230019700000001022001bf000000000020041b000000800010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ca011001c70000800d020000390000000103000039000004cb040000410000043e0000013d0000000001000416000000000001004b000004410000c13d0000000501000039000000000101041a0000046901100197000000800010043f000004a101000041000011950001042e0000000001000416000000000001004b000004410000c13d0000000001000410000d00000001001d0000800a01000039000000240300003900000000040004150000000d0440008a0000000504400210000004a902000041119411730000040f000000800010043f000004a101000041000011950001042e0000000001000416000000000001004b000004410000c13d0000046a01000041000000000101041a0000000002000411000000000012004b000004180000c13d0000000d02000039000000000202041a000000ff00200190000004320000c13d000004bc01000041000000800010043f0000002001000039000000840010043f0000001b01000039000000a40010043f000004fe01000041000000c40010043f000004e50100004100001196000104300000000001000416000000000001004b000004410000c13d11940be40000040f119410de0000040f000000400200043d000c00000002001d11940b490000040f0000000c01000029000004660010009c00000466010080410000004001100210000004ac011001c7000011950001042e0000000001000416000000000001004b000004410000c13d0000000701000039000000000101041a000c00000001001d000004a60100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000b440000613d000000000101043b0000000c0010006c000004430000a13d000000000100041111940bf90000040f0000000032010434000000000002004b000004810000c13d0000004001100039000c00000001001d0000000001010433000000000001004b000004910000c13d0000000001030433000000000001004b000004910000c13d000000400100043d0000006402100039000004e20300004100000000003204350000004402100039000004e303000041000000000032043500000024021000390000002503000039000004630000013d000000240010008c000004410000413d0000000401800370000000000101043b000004690010009c000004410000213d0000046a02000041000000000202041a0000000003000411000000000023004b000004180000c13d000000000001004b0000056e0000c13d000004a301000041000000000010043f000004a4010000410000119600010430000004fc01000041000000000010043f000004a40100004100001196000104300000008401200039000004d00300004100000000003104350000006401200039000004d10300004100000000003104350000004401200039000004d2030000410000000000310435000000240120003900000049030000390000000000310435000004bc010000410000000000120435000000040120003900000020030000390000000000310435000004660020009c00000466020080410000004001200210000004d3011001c70000119600010430000000000300041a0000050102300197000000000020041b000000800010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ca011001c70000800d020000390000000103000039000004fd040000411194118a0000040f00000001002001900000005f0000c13d00000000010000190000119600010430000000400100043d0000008402100039000004d80300004100000000003204350000006402100039000004d90300004100000000003204350000004402100039000004da030000410000000000320435000000240210003900000044030000390000000000320435000004bc020000410000000000210435000000040210003900000020030000390000000000320435000004660010009c00000466010080410000004001100210000004d3011001c70000119600010430000000400100043d0000006402100039000004cc0300004100000000003204350000004402100039000004cd030000410000000000320435000000240210003900000026030000390000000000320435000004bc020000410000000000210435000000040210003900000020030000390000000000320435000004660010009c00000466010080410000004001100210000004c3011001c700001196000104300000006401200039000004d40300004100000000003104350000004401200039000004d5030000410000000000310435000000240120003900000029030000390000000000310435000004bc010000410000000000120435000000040120003900000020030000390000000000310435000004660020009c00000466020080410000004001200210000004c3011001c70000119600010430000000400100043d0000004402100039000004db030000410000000000320435000004bc02000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000004660010009c00000466010080410000004001100210000004bd011001c70000119600010430000b00000003001d0000000001000411000000000010043f0000000a01000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000201041a000005010220019700000001022001bf000000000021041b0000000c010000290000000001010433000a00000001001d000000000001004b0000060d0000c13d0000000b01000029000000000301043300000000010004140000000002000411000000040020008c000006790000c13d00000001020000390000000101000031000006870000013d000004bc01000041000000800010043f0000002001000039000000840010043f0000001201000039000000a40010043f000004e401000041000000c40010043f000004e5010000410000119600010430000000000042041b0000000001000019000011950001042e0000000303000039000000000103041a000000a004200039000000400040043f000000800420003900000000000404350000006004200039000000000004043500000040042000390000000000040435000000200420003900000000000404350000000000020435000000400200043d000000000001004b000005e80000c13d0000004401200039000004bb030000410000000000310435000000240120003900000016030000390000000000310435000004bc010000410000000000120435000000040120003900000020030000390000000000310435000004660020009c00000466020080410000004001200210000004bd011001c70000119600010430000004b20030009c0000036c0000213d00000000030000190000006004100039000000400040043f00000040041000390000000000040435000000200410003900000000000404350000000000010435000000a00430003900000000001404350000002003300039000000000023004b000006d20000813d000000400100043d000004b30010009c000004e20000a13d0000036c0000013d000000000031041b0000000d01000039000000000101041a000000ff00100190000003c40000613d00000000010004110000006001100210000000a00010043f0000000901000029000000b40010043f0000000b01000029000000d40010043f0000000a01000029000000f40010043f0000000c01000029000001140010043f000004bf0100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000b440000613d000000000101043b000001340010043f00000000010004100000006001100210000001540010043f000000c801000039000000800010043f0000018001000039000000400010043f0000000001000414000004660010009c0000046601008041000000c001100210000004c0011001c700008010020000391194118f0000040f0000000100200190000004410000613d00000008020000290000001f0220003900000502022001970000003f022000390000050203200197000000000101043b000000400200043d0000000004320019000000000024004b00000000030000390000000103004039000004ad0040009c0000036c0000213d00000001003001900000036c0000c13d0000000403000039000000000303041a000000400040043f000000080400002900000000044204360000000607000029000000000070007c000004410000213d000000080700002900000502067001980000001f0770018f0000000005640019000000070800002900000020088000390000000208800367000005440000613d000000000908034f000000000a040019000000009b09043c000000000aba043600000000005a004b000005400000c13d0000046903300197000000000007004b000005520000613d000000000668034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000804400029000000000004043511940d130000040f000004a60100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000b440000613d000000000201043b000800000002001d0000000c0020006c000009160000a13d000000400100043d0000006402100039000004ed0300004100000000003204350000004402100039000004ee03000041000004600000013d0000000a01000029000000000001041b0000000c01000029119411200000040f0000000001000019000011950001042e00000060010000390000000003000019000000a00430003900000000001404350000002003300039000000000023004b000005730000413d0000000002000019000a00000002001d0000000502200210000900000002001d00000007012000290000000201100367000000000101043b000004690010009c000004410000213d000000000010043f0000000901000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000401041a000004ad0040009c0000036c0000213d00000005024002100000003f02200039000004ae02200197000000400500043d0000000002250019000000000052004b00000000030000390000000103004039000004ad0020009c0000036c0000213d00000001003001900000036c0000c13d000000400020043f000c00000005001d0000000000450435000000000010043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c70000801002000039000b00000004001d1194118f0000040f0000000100200190000004410000613d0000000b07000029000000000007004b0000000c08000029000005cf0000613d000000000101043b00000000020000190000000003080019000000400400043d000004b10040009c0000036c0000213d000000a005400039000000400050043f000000000501041a00000000055404360000000106100039000000000606041a000004690660019700000000006504350000000205100039000000000505041a000000400640003900000000005604350000000305100039000000000505041a000000600640003900000000005604350000000405100039000000000505041a000000800640003900000000005604350000002003300039000000000043043500000005011000390000000102200039000000000072004b000005b20000413d000000800100043d0000000a02000029000000000021004b000007f30000a13d0000000901000029000000a0011000390000000000810435000000800100043d000000000021004b000007f30000a13d0000000102200039000000080020006c000005790000413d000000400100043d000002d80000013d000004bc01000041000000800010043f0000002001000039000000840010043f0000001f01000039000000a40010043f000004f101000041000000c40010043f000004e5010000410000119600010430000000000030043f000004b10020009c0000036c0000213d000000a003200039000000400030043f000004b403000041000000000303041a0000000003320436000004b504000041000000000404041a00000469044001970000000000430435000004b603000041000000000403041a00000040032000390000000000430435000004b703000041000000000303041a000000600520003900000000003504350000008002200039000004b803000041000000000303041a000000000032043500000000031400a900000000011300d9000000000014004b000009970000c13d0000000601000039000000000201041a00000000010004140000046904200197000000040040008c000007d80000c13d00000001020000390000000101000031000008010000013d0000000501000039000000000101041a000004dc0200004100000000002004430000046901100197000900000001001d00000004001004430000000001000414000004660010009c0000046601008041000000c001100210000004dd011001c700008002020000391194118f0000040f000000010020019000000b440000613d000000000101043b000000000001004b000004410000613d000000400200043d00000024012000390000000a030000290000000000310435000004de010000410000000000120435000a00000002001d00000004012000390000000002000411000000000021043500000000010004140000000902000029000000040020008c0000063e0000613d0000000a02000029000004660020009c00000466020080410000004002200210000004660010009c0000046601008041000000c001100210000000000121019f000004df011001c700000009020000291194118a0000040f0000006003100270000104660030019d000300000001035500000001002001900000083f0000613d0000000a01000029000004ad0010009c0000036c0000213d0000000a01000029000000400010043f000004a90000013d000000a00500003900000000060000190000064a0000013d0000000106600039000000000036004b000002e10000813d0000000007120049000000400770008a0000000004740436000000005705043400000000080704330000000002820436000000000008004b000006470000613d00000000090000190000002007700039000000000a07043300000000cb0a0434000000000bb20436000000000c0c0433000004690cc001970000000000cb0435000000400ba00039000000000b0b0433000000400c2000390000000000bc0435000000600ba00039000000000b0b0433000000600c2000390000000000bc0435000000800aa00039000000000a0a0433000000800b2000390000000000ab0435000000a0022000390000000109900039000000000089004b000006530000413d000006470000013d000804690010019c000007cc0000c13d000004bc01000041000000800010043f0000002001000039000000840010043f0000002501000039000000a40010043f000004f601000041000000c40010043f000004f701000041000000e40010043f000004f8010000410000119600010430000004660010009c0000046601008041000000c001100210000000000003004b000006820000613d0000046b011001c70000800902000039000000000400041100000000050000191194118a0000040f00030000000103550000006001100270000104660010019d0000046601100197000000000001004b000006a00000c13d000000400100043d0000000100200190000006c90000613d0000000b0200002900000000020204330000000c030000290000000003030433000000200410003900000000003404350000000000210435000004660010009c000004660100804100000040011002100000000002000414000004660020009c0000046602008041000000c002200210000000000112019f000004ab011001c70000800d020000390000000203000039000004e104000041000001a40000013d000004ad0010009c0000036c0000213d0000001f0410003900000502044001970000003f044000390000050205400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000004ad0050009c0000036c0000213d00000001006001900000036c0000c13d000000400050043f000000000614043600000502031001980000001f0410018f00000000013600190000000305000367000006bb0000613d000000000705034f000000007807043c0000000006860436000000000016004b000006b70000c13d000000000004004b000006890000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000006890000013d0000006402100039000004e00300004100000000003204350000004402100039000004d703000041000000000032043500000024021000390000002a03000039000004630000013d0000000002000019000400000002001d0000000502200210000300000002001d00000001012000290000000201100367000000000101043b000b00000001001d000004690010009c000004410000213d000000400100043d000500000001001d000004b30010009c0000036c0000213d00000005020000290000006001200039000000400010043f0000004001200039000800000001001d00000000000104350000000001020436000a00000001001d00000000000104350000000b01000029000000000010043f0000000a01000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000101041a000000ff001001900000000001000039000000010100c039000000050200002900000000001204350000000a01000029000000000001043500000008010000290000000000010435000000400100043d000004b10010009c0000036c0000213d000000a002100039000000400020043f000000800210003900000000000204350000006002100039000000000002043500000040021000390000000000020435000000200210003900000000000204350000000000010435000000400300043d0000000301000039000000000101041a000000000001004b000009480000613d000004b10030009c0000036c0000213d000000a001300039000000400010043f000004b401000041000000000101041a0000000001130436000004b502000041000000000202041a00000469022001970000000000210435000004b601000041000000000101041a0000004002300039000600000002001d0000000000120435000004b701000041000000000101041a00000060023000390000000000120435000700000003001d0000008001300039000004b802000041000000000202041a0000000000210435000c00000000001d0000000b01000029000000000010043f0000000901000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000201041a0000000c0020006b000007bc0000813d000000000010043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000301034f000000400100043d000004b10010009c00000007020000290000036c0000213d0000000c0400002900090005004000cd000000000403043b000000a003100039000000400030043f0000000905400029000000000305041a00000000033104360000000104500039000000000404041a000004690440019700000000004304350000000203500039000000000303041a000000400410003900000000003404350000000303500039000000000303041a000000600410003900000000003404350000000403500039000000000403041a00000080031000390000000000430435119411360000040f000000000001004b000007930000613d00000008010000290000000001010433000000010110003a000009970000613d000000080200002900000000001204350000000b01000029000000000010043f0000000901000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000201041a0000000c0020006c000007f30000a13d000000000010043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b00000009011000290000000201100039000000000101041a00000006020000290000000002020433000000000121004b000007b20000813d000009970000013d0000000b01000029000000000010043f0000000901000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000201041a0000000c0020006c000007f30000a13d000000000010043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b00000009011000290000000201100039000000000101041a0000000a020000290000000002020433000000000012001a000009970000413d00000000011200190000000a0200002900000000001204350000000c01000029000c00010010003d0000072e0000013d000000800100043d000000040010006c000007f30000a13d0000000301000029000000a00110003900000005020000290000000000210435000000800100043d000000040010006c000007f30000a13d00000004020000290000000102200039000000020020006c000006d30000413d000000400100043d0000008f0000013d000704690020019c000007df0000c13d000004bc01000041000000800010043f0000002001000039000000840010043f0000001a01000039000000a40010043f000004f501000041000000c40010043f000004e5010000410000119600010430000004660010009c0000046601008041000000c001100210000000000003004b000007f90000c13d0000000002040019000007fc0000013d000004a60100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000b440000613d000000000101043b0000000b0010006b000008ed0000a13d0000000a0000006b000008f40000c13d000000400100043d0000004402100039000004f403000041000009240000013d000004b901000041000000000010043f0000003201000039000000040010043f000004ba0100004100001196000104300000046b011001c7000080090200003900000000050000191194118a0000040f00030000000103550000006001100270000104660010019d0000046601100197000000000001004b0000080c0000c13d0000000100200190000008350000613d0000000803000039000000000103041a000005010110019700000001011001bf000000000013041b0000000001000019000011950001042e000004ad0010009c0000036c0000213d0000001f0410003900000502044001970000003f044000390000050205400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000004ad0050009c0000036c0000213d00000001006001900000036c0000c13d000000400050043f000000000614043600000502031001980000001f0410018f00000000013600190000000305000367000008270000613d000000000705034f000000007807043c0000000006860436000000000016004b000008230000c13d000000000004004b000008030000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000008030000013d000000400100043d0000006402100039000004d60300004100000000003204350000004402100039000004d703000041000000000032043500000024021000390000002b03000039000004630000013d00000466033001970000001f0530018f0000046806300198000000400200043d00000000046200190000084b0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000008470000c13d000000000005004b000008580000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000004660020009c00000466020080410000004002200210000000000112019f000011960001043000000000010004110000006001100210000000a00010043f0000000001000416000000b40010043f0000000901000029000000d40010043f0000000801000029000000f40010043f0000000a01000029000001140010043f000004bf0100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000b440000613d000000000101043b000001340010043f00000000010004100000006001100210000001540010043f000000c801000039000000800010043f0000018001000039000000400010043f0000000001000414000004660010009c0000046601008041000000c001100210000004c0011001c700008010020000391194118f0000040f0000000100200190000004410000613d00000007020000290000001f0220003900000502022001970000003f022000390000050203200197000000000101043b000000400200043d0000000004320019000000000024004b00000000030000390000000103004039000004ad0040009c0000036c0000213d00000001003001900000036c0000c13d0000000403000039000000000303041a000000400040043f000000070400002900000000044204360000000507000029000000000070007c000004410000213d000000070700002900000502067001980000001f0770018f0000000005640019000000060800002900000020088000390000000208800367000008ab0000613d000000000908034f000000000a040019000000009b09043c000000000aba043600000000005a004b000008a70000c13d0000046903300197000000000007004b000008b90000613d000000000668034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000704400029000000000004043511940d130000040f000004a60100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000b440000613d000000000101043b000200000001001d0000000a0010006c000005640000213d0000000701000039000000000101041a000000020010006b0000091a0000213d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000101041a0000000c0010002a000009970000413d0000000c01100029000000320010008c000009a70000a13d000000400100043d0000006402100039000004ea0300004100000000003204350000004402100039000004eb03000041000000000032043500000024021000390000002e03000039000004630000013d000000400100043d0000004402100039000004f203000041000000000032043500000024021000390000001c03000039000009270000013d0000000501000039000000000201041a000004c6022001970000000c022001af000000000021041b0000000601000039000000000201041a000004c60220019700000008022001af000000000021041b00000007010000390000000b02000029000000000021041b0000000401000039000000000201041a000004c60220019700000007022001af000000000021041b0000000201000039000000000201041a000000000002004b000009210000c13d0000000a02000029000000000021041b000001000100008a000000090210017f00000001022001bf0000000d03000039000000000023041b000000000200041a000000000112016f000000000010041b0000000001000019000011950001042e0000000701000039000000000101041a000000080010006b0000092d0000a13d000000400100043d0000006402100039000004ce0300004100000000003204350000004402100039000004ec03000041000000d90000013d000000400100043d0000004402100039000004f303000041000000000032043500000024021000390000001e030000390000000000320435000004bc020000410000000000210435000000040210003900000020030000390000048b0000013d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000101041a000000320010008c000009580000413d000000400100043d0000006402100039000004c80300004100000000003204350000004402100039000004c903000041000000000032043500000024021000390000003103000039000004630000013d0000004401300039000004bb020000410000000000210435000000240130003900000016020000390000000000210435000004bc010000410000000000130435000000040130003900000020020000390000000000210435000004660030009c00000466030080410000004001300210000004bd011001c700001196000104300000000001000411000000000010043f0000000b01000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b0000000b02000029000000000020043f000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000101041a0000000a0010006c0000099d0000813d0000000002000416000000090020006c000009cc0000c13d0000000001000411000000000010043f0000000b01000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b0000000b02000029000000000020043f000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000201041a000000010220003a000009d30000c13d000004b901000041000000000010043f0000001101000039000000040010043f000004ba010000410000119600010430000000400100043d0000006402100039000004c10300004100000000003204350000004402100039000004c203000041000000000032043500000024021000390000002903000039000004630000013d0000000001000411000000000010043f0000000b01000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000101041a0000000c0010002a000009970000413d0000000c01100029000000080010006c00000a4b0000a13d000000400100043d0000004402100039000004e903000041000004840000013d000000400100043d0000006402100039000004c40300004100000000003204350000004402100039000004c503000041000004030000013d000000000021041b0000000103000039000000000203041a0000000101200039000000000013041b000b00000001001d11940b830000040f000000400200043d000c00000002001d000004b10020009c0000036c0000213d0000000c03000029000000a002300039000000400020043f0000008002300039000a00000002001d000000000012043500000060023000390000000801000029000900000002001d000000000012043500000040023000390000000001000416000800000002001d00000000001204350000000b0100002900000000021304360000000001000411000b00000002001d0000000000120435000000000010043f0000000901000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000201041a000700000002001d000004ad0020009c0000036c0000213d00000007020000290000000102200039000000000021041b000000000010043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000070200002900000005022000c9000000000101043b00000000052100190000000c010000290000000002010433000000000025041b0000000102500039000000000302041a000004c6033001970000000b0400002900000000040404330000046904400197000000000343019f000000000032041b000000080200002900000000020204330000000203500039000000000023041b000000090200002900000000020204330000000303500039000000000023041b00000004035000390000000a020000290000000002020433000000000023041b11940e0e0000040f000000400100043d00000000020004160000000000210435000004660010009c000004660100804100000040011002100000000002000414000004660020009c0000046602008041000000c002200210000000000112019f000004b0011001c70000800d020000390000000203000039000004c70400004100000000050004111194118a0000040f0000000100200190000004410000613d0000000001000412000e00000001001d0000800201000039000000240300003900000000040004150000000e0440008a0000000504400210000004dc02000041119411730000040f000004be02000041000000000012041b0000000001000019000011950001042e0000000201000367000000000300001900000000020000190000000b0500002900000005043002100000000004540019000000000441034f000000000404043b000000000024001a000009970000413d000000000224001900000001033000390000000c0030006c00000a4f0000413d0000000001000416000000000021004b00000b450000c13d0000000001000411000000000010043f0000000b01000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000201041a0000000c0020002a000009970000413d0000000c02200029000000000021041b000900000000001d0000000102000039000000000102041a0000000101100039000800000001001d000000000012041b000000090100002900000005011002100000000b01100029000500000001001d0000000201100367000000000101043b000700000001001d000004e70100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000b440000613d000000000101043b000000000001004b000009970000613d000000400200043d000a00000002001d000004e8020000410000000000200443000000010110008a00000004001004430000000001000414000004660010009c0000046601008041000000c001100210000004dd011001c70000800b020000391194118f0000040f000000010020019000000b440000613d0000000a020000290000002002200039000000000101043b000600000002001d0000000000120435000004a60100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000b440000613d000000000101043b0000000a040000290000006002400039000000080300002900000000003204350000004002400039000000000012043500000060010000390000000000140435000004af0040009c0000036c0000213d0000000a020000290000008001200039000000400010043f0000000601000029000004660010009c000004660100804100000040011002100000000002020433000004660020009c00000466020080410000006002200210000000000112019f0000000002000414000004660020009c0000046602008041000000c002200210000000000112019f0000046b011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000400200043d000a00000002001d000004b10020009c0000036c0000213d000000000101043b0000000a03000029000000a002300039000000400020043f0000008002300039000600000002001d000000000012043500000060023000390000000201000029000400000002001d000000000012043500000040023000390000000701000029000300000002001d0000000000120435000000080100002900000000021304360000000001000411000700000002001d0000000000120435000000000010043f0000000901000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000000101043b000000000201041a000800000002001d000004ad0020009c0000036c0000213d00000008020000290000000102200039000000000021041b000000000010043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000004410000613d000000080200002900000005022000c9000000000101043b00000000052100190000000a010000290000000002010433000000000025041b0000000102500039000000000302041a000004c603300197000000070400002900000000040404330000046904400197000000000343019f000000000032041b000000030200002900000000020204330000000203500039000000000023041b000000040200002900000000020204330000000303500039000000000023041b000000040350003900000006020000290000000002020433000000000023041b11940e0e0000040f00000005010000290000000201100367000000000101043b000000400200043d0000000000120435000004660020009c000004660200804100000040012002100000000002000414000004660020009c0000046602008041000000c002200210000000000112019f000004b0011001c70000800d020000390000000203000039000004c70400004100000000050004111194118a0000040f0000000100200190000004410000613d00000009020000290000000102200039000900000002001d0000000c0020006c00000a7d0000413d00000a3e0000013d000000000001042f000000400100043d0000004402100039000004e603000041000008f00000013d00000000430104340000000003320436000000000404043300000469044001970000000000430435000000400310003900000000030304330000004004200039000000000034043500000060031000390000000003030433000000600420003900000000003404350000008002200039000000800110003900000000010104330000000000120435000000000001042d0000000043010434000000000003004b0000000003000039000000010300c0390000000003320436000000000404043300000000004304350000004002200039000000400110003900000000010104330000000000120435000000000001042d0001000000000002000000000301041a000100000002001d000000000023004b00000b7b0000a13d000000000010043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f000000010020019000000b810000613d000000010200002900000005022000c9000000000101043b0000000001210019000000000001042d000004b901000041000000000010043f0000003201000039000000040010043f000004ba010000410000119600010430000000000100001900001196000104300003000000000002000200000001001d000004e70100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000bd50000613d000000000101043b000000000001004b00000bd60000613d000000400200043d000300000002001d000004e8020000410000000000200443000000010110008a00000004001004430000000001000414000004660010009c0000046601008041000000c001100210000004dd011001c70000800b020000391194118f0000040f000000010020019000000bd50000613d00000003020000290000002002200039000000000101043b000100000002001d0000000000120435000004a60100004100000000001004430000000001000414000004660010009c0000046601008041000000c001100210000004a7011001c70000800b020000391194118f0000040f000000010020019000000bd50000613d000000000101043b00000003040000290000006002400039000000020300002900000000003204350000004002400039000000000012043500000060010000390000000000140435000005030040009c00000bdc0000813d00000003020000290000008001200039000000400010043f0000000101000029000004660010009c000004660100804100000040011002100000000002020433000004660020009c00000466020080410000006002200210000000000112019f0000000002000414000004660020009c0000046602008041000000c002200210000000000112019f0000046b011001c700008010020000391194118f0000040f000000010020019000000be20000613d000000000101043b000000000001042d000000000001042f000004b901000041000000000010043f0000001101000039000000040010043f000004ba010000410000119600010430000004b901000041000000000010043f0000004101000039000000040010043f000004ba01000041000011960001043000000000010000190000119600010430000000400100043d000005040010009c00000bf30000813d000000a002100039000000400020043f000000800210003900000000000204350000006002100039000000000002043500000040021000390000000000020435000000200210003900000000000204350000000000010435000000000001042d000004b901000041000000000010043f0000004101000039000000040010043f000004ba0100004100001196000104300008000000000002000000400200043d000100000002001d000005050020009c00000ced0000813d00000001030000290000006002300039000000400020043f0000004002300039000400000002001d00000000000204350000000002030436000600000002001d00000000000204350000046901100197000700000001001d000000000010043f0000000a01000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f000000010020019000000ceb0000613d000000000101043b000000000101041a000000ff001001900000000001000039000000010100c039000000010200002900000000001204350000000601000029000000000001043500000004010000290000000000010435000000400100043d000004b10010009c00000ced0000213d000000a002100039000000400020043f000000800210003900000000000204350000006002100039000000000002043500000040021000390000000000020435000000200210003900000000000204350000000000010435000000400300043d0000000301000039000000000101041a000000000001004b00000cf90000613d000004b10030009c00000ced0000213d000000a001300039000000400010043f000004b401000041000000000101041a0000000001130436000004b502000041000000000202041a00000469022001970000000000210435000004b601000041000000000101041a0000004002300039000200000002001d0000000000120435000004b701000041000000000101041a00000060023000390000000000120435000300000003001d0000008001300039000004b802000041000000000202041a0000000000210435000800000000001d00000c520000013d000000060200002900000000001204350000000801000029000800010010003d0000000701000029000000000010043f0000000901000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f000000010020019000000ceb0000613d000000000101043b000000000201041a000000080020006b00000ce90000813d000000000010043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f000000010020019000000ceb0000613d000000000301034f000000400100043d000004b10010009c000000030200002900000ced0000213d000000080400002900050005004000cd000000000403043b000000a003100039000000400030043f0000000505400029000000000305041a00000000033104360000000104500039000000000404041a000004690440019700000000004304350000000203500039000000000303041a000000400410003900000000003404350000000303500039000000000303041a000000600410003900000000003404350000000403500039000000000403041a00000080031000390000000000430435119411360000040f000000000001004b00000cbc0000613d00000004010000290000000001010433000000010110003a00000ce30000613d000000040200002900000000001204350000000701000029000000000010043f0000000901000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f000000010020019000000ceb0000613d000000000101043b000000000201041a000000080020006c00000cf30000a13d000000000010043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f000000010020019000000ceb0000613d000000000101043b00000005011000290000000201100039000000000101041a00000002020000290000000002020433000000000121004b00000ce30000413d00000006020000290000000002020433000000000012001a00000ce30000413d000000000112001900000c4e0000013d0000000701000029000000000010043f0000000901000039000000200010043f0000000001000414000004660010009c0000046601008041000000c001100210000004ab011001c700008010020000391194118f0000040f000000010020019000000ceb0000613d000000000101043b000000000201041a000000080020006c00000cf30000a13d000000000010043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f000000010020019000000ceb0000613d000000000101043b00000005011000290000000201100039000000000101041a000000060200002900000000020204330000000001120019000000000021004b00000000020000390000000102004039000000010020008c00000c4e0000c13d000004b901000041000000000010043f0000001101000039000000040010043f000004ba0100004100001196000104300000000101000029000000000001042d00000000010000190000119600010430000004b901000041000000000010043f0000004101000039000000040010043f000004ba010000410000119600010430000004b901000041000000000010043f0000003201000039000000040010043f000004ba0100004100001196000104300000004401300039000004bb020000410000000000210435000000240130003900000016020000390000000000210435000004bc010000410000000000130435000000040130003900000020020000390000000000210435000004660030009c00000466030080410000004001300210000004bd011001c700001196000104300000046a01000041000000000101041a0000000002000411000000000012004b00000d0f0000c13d000000000001042d000004fc01000041000000000010043f000004a40100004100001196000104300004000000000002000400000003001d000300000002001d000000200010043f0000050601000041000000000010043f0000000001000414000004660010009c0000046601008041000000c00110021000000507011001c700008010020000391194118f0000040f000000010020019000000e0b0000613d000000000101043b0000000402000029000004690020019800000df70000613d000200000001001d000000400100043d000100000001001d000004dc01000041000000000010044300000004002004430000000001000414000004660010009c0000046601008041000000c001100210000004dd011001c700008002020000391194118f0000040f000000010020019000000e0d0000613d000000000101043b000000000001004b000000030a00002900000d580000613d000000010800002900000044018000390000002409800039000000040280003900000508030000410000000000380435000000020300002900000000003204350000004002000039000000000029043500000000020a0433000000200220003900000502032001970000001f0220018f00000000001a004b00000d660000813d000000000003004b00000d550000613d00000000052a00190000000004210019000000200440008a000000200550008a0000000006340019000000000735001900000000070704330000000000760435000000200330008c00000d4f0000c13d000000000002004b00000d720000c13d00000d7c0000013d00000000120a0434000000400020008c00000dbb0000613d000000410020008c000000020400002900000df70000c13d000000030300002900000060023000390000000002020433000000f802200270000000200020043f0000004002300039000000000202043300000dc20000013d0000000004310019000000000003004b00000d6e0000613d00000000050a001900000000560504340000000001610436000000000041004b00000d6a0000c13d000000000002004b00000d7c0000613d000000000a3a001900000000010400190000000302200210000000000301043300000000032301cf000000000323022f00000000040a04330000010002200089000000000424022f00000000022401cf000000000232019f0000000000210435000000010400003100000000010004140000000402000029000000040020008c00000d850000c13d00000000010804330000000000190435000000010200003900000db40000013d000004660080009c00000466080080410000004003800210000005090040009c00000509040080410000006004400210000000000334019f000004660010009c0000046601008041000000c001100210000000000113019f0000050a0110009a000400000009001d1194118f0000040f000000040a00002900000060031002700000046603300197000000200030008c000000200400003900000000040340190000001f0540018f000000200640019000000000046a001900000da30000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000048004b00000d9f0000c13d000000000005004b00000db00000613d000000000661034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000000010220018f000100000003001f000300000001035500000000010a0433000005080010009c00000000010000390000000101006039000000000112016f000000000001004b00000df70000613d000000000001042d0000004002a000390000000002020433000000ff032002700000001b03300039000000200030043f0000050b022001970000000204000029000000600020043f000000000040043f0000000001010433000000400010043f0000000001000414000004660010009c0000046601008041000000c0011002100000050c011001c700000001020000391194118f0000040f000000010900003900000060031002700000046603300197000000200030008c000000200400003900000000040340190000001f0540018f000000200640019000000001046001bf00000ddc0000613d000000000701034f000000007807043c0000000009890436000000000049004b00000dd80000c13d000000010220018f000000000005004b00000dea0000613d000000000661034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f00000000005404350003000000010355000100000003001f0000000001020433000000600000043f0000000102000029000000400020043f000000040110014f0000006001100210000000000013004b00000000010000390000000101002039000000000001004b00000dba0000c13d000000400100043d00000064021000390000050d03000041000000000032043500000044021000390000050e030000410000000000320435000000240210003900000026030000390000000000320435000004bc020000410000000000210435000000040210003900000020030000390000000000320435000004660010009c00000466010080410000004001100210000004c3011001c7000011960001043000000000010000190000119600010430000000000001042f000b0000000000020000000302000039000000000402041a0000000203000039000000000303041a000000000034004b000b00000001001d00000f350000813d0000050f0040009c000010d80000813d000a00000004001d0000000101400039000000000012041b000000000020043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d0000000a0200002900000005022000c9000000000101043b00000000012100190000000b050000290000000032050434000000000021041b0000000102100039000000000402041a000004c60440019700000000030304330000046903300197000000000334019f000000000032041b000000400250003900000000020204330000000203100039000000000023041b000000600250003900000000020204330000000303100039000000000023041b000000040110003900000080025000390000000002020433000000000021041b0000000303000039000000000103041a000000000001004b000010c90000613d000000010210008c000010cf0000613d000000000103041a000b00000002001d000000000021004b000010d00000a13d000000000030043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d0000000b02000029000000010220008a000700000002001d0000000102200270000000000101043b000800000001001d0000000303000039000000000103041a000a00000002001d000000000021004b000010d00000a13d000000000030043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d000000000301043b000000400100043d000004b10010009c000010d80000213d0000000b0200002900000005022000c9000900000002001d0000000802200029000000a004100039000000400040043f000000000402041a00000000044104360000000105200039000000000505041a000004690550019700000000005404350000000204200039000000000404041a000000400510003900000000004504350000000304200039000000000404041a0000006005100039000000000045043500000080041000390000000402200039000000000202041a0000000000240435000000400200043d000004b10020009c000010d80000213d0000000a0400002900080005004000cd0000000803300029000000a004200039000000400040043f000000000403041a00000000044204360000000105300039000000000505041a000004690550019700000000005404350000000204300039000000000404041a000000400520003900000000004504350000000304300039000000000404041a000000600520003900000000004504350000000403300039000000000303041a00000080042000390000000000340435119411360000040f000000000001004b00000003020000390000000b03000029000010cf0000c13d000000000102041a000000000031004b000010d00000a13d000000000020043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d000000400300043d000004b10030009c000010d80000213d000000000101043b000000a002300039000000400020043f0000000901100029000000000201041a00000000042304360000000102100039000000000202041a0000046902200197000500000004001d00000000002404350000000202100039000000000202041a0000004004300039000400000004001d00000000002404350000000302100039000000000202041a0000006004300039000200000004001d00000000002404350000000401100039000600000003001d0000008002300039000000000101041a000300000002001d00000000001204350000000303000039000000000103041a0000000a0010006c000010d00000a13d000000000030043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d000000000101043b000100000001001d0000000303000039000000000103041a0000000b0010006c000010d00000a13d000000000030043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d00000001030000290000000802300029000000000101043b0000000901100029000000000021004b00000f080000613d000000000302041a000000000031041b0000000103200039000000000303041a00000469033001970000000104100039000000000504041a000004c605500197000000000335019f000000000034041b0000000203200039000000000303041a0000000204100039000000000034041b0000000303200039000000000303041a0000000304100039000000000034041b00000004011000390000000402200039000000000202041a000000000021041b0000000303000039000000000103041a0000000a0010006c000010d00000a13d000000000030043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d000000000101043b000000080110002900000006020000290000000002020433000000000021041b0000000102100039000000000302041a000004c603300197000000050400002900000000040404330000046904400197000000000343019f000000000032041b000000040200002900000000020204330000000203100039000000000023041b000000020200002900000000020204330000000303100039000000000023041b000000040110003900000003020000290000000002020433000000000021041b0000000701000029000000020010008c0000000a02000029000000030300003900000e450000813d000010cf0000013d000000000004004b000010d00000613d000000000020043f000000400200043d000004b10020009c000010d80000213d000000a003200039000000400030043f000004b403000041000000000303041a0000000004320436000004b503000041000000000303041a000a00000003001d00000469033001970000000000340435000004b603000041000000000403041a00000040032000390000000000430435000004b703000041000000000403041a00000060032000390000000000430435000004b803000041000000000403041a00000080032000390000000000430435119411360000040f000000000001004b0000000303000039000010cf0000613d000000000030043f0000000b050000290000000021050434000004b404000041000000000014041b0000000a01000029000004c60110019700000000020204330000046902200197000000000112019f000004b502000041000000000012041b00000040015000390000000001010433000004b602000041000000000012041b00000060015000390000000001010433000004b702000041000000000012041b00000080015000390000000001010433000004b802000041000000000012041b00000000010000190000050b0010009c000010c90000613d000000010410021000000001064001bf000000000503041a000000000056004b0000000002010019000a00000001001d00000fd40000813d000b00000006001d000900000004001d000800000005001d000000000015004b000010d00000a13d000000000030043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d000000000101043b000700000001001d0000000303000039000000000103041a0000000b0010006c000010d00000a13d000000000030043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d000000000301043b000000400100043d000004b10010009c0000000b06000029000010d80000213d0000000a0200002900000005022000c90000000702200029000000a004100039000000400040043f000000000402041a00000000044104360000000105200039000000000505041a000004690550019700000000005404350000000204200039000000000404041a000000400510003900000000004504350000000304200039000000000404041a0000006005100039000000000045043500000080041000390000000402200039000000000202041a0000000000240435000000400200043d000004b10020009c000010d80000213d00000005046000c90000000003430019000000a004200039000000400040043f000000000403041a00000000044204360000000105300039000000000505041a000004690550019700000000005404350000000204300039000000000404041a000000400520003900000000004504350000000304300039000000000404041a000000600520003900000000004504350000000403300039000000000303041a00000080042000390000000000340435119411360000040f0000000b06000029000000000001004b0000000a010000290000000002010019000000030300003900000009040000290000000805000029000000000206c0190000000204400039000000000054004b000010310000813d000900000004001d000000000103041a000b00000002001d000000000021004b000010d00000a13d000000000030043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d000000000101043b000800000001001d0000000303000039000000000103041a000000090010006c000010d00000a13d000000000030043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d000000000301043b000000400100043d000004b10010009c000010d80000213d0000000b0200002900000005022000c90000000802200029000000a004100039000000400040043f000000000402041a00000000044104360000000105200039000000000505041a000004690550019700000000005404350000000204200039000000000404041a000000400510003900000000004504350000000304200039000000000404041a0000006005100039000000000045043500000080041000390000000402200039000000000202041a0000000000240435000000400200043d000004b10020009c000010d80000213d000000090400002900000005044000c90000000003430019000000a004200039000000400040043f000000000403041a00000000044204360000000105300039000000000505041a000004690550019700000000005404350000000204300039000000000404041a000000400520003900000000004504350000000304300039000000000404041a000000600520003900000000004504350000000403300039000000000303041a00000080042000390000000000340435119411360000040f000000000001004b00000003030000390000000a010000290000000b02000029000000090200c029000000000012004b000010cf0000613d000000000103041a000b00000002001d000000000021004b000010d00000a13d000000000030043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d000000400300043d000004b10030009c000010d80000213d0000000b0200002900090005002000cd000000000101043b000000a002300039000000400020043f0000000901100029000000000201041a00000000042304360000000102100039000000000202041a0000046902200197000700000004001d00000000002404350000000202100039000000000202041a0000004004300039000600000004001d00000000002404350000000302100039000000000202041a0000006004300039000400000004001d00000000002404350000000401100039000800000003001d0000008002300039000000000101041a000500000002001d00000000001204350000000303000039000000000103041a0000000a0010006c000010d00000a13d000000000030043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d000000000101043b000300000001001d0000000303000039000000000103041a0000000b0010006c000010d00000a13d000000000030043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d0000000a0400002900000005024000c9000200000002001d0000000302200029000000000101043b0000000901100029000000000021004b0000109e0000613d000000000302041a000000000031041b0000000103200039000000000303041a00000469033001970000000104100039000000000504041a000004c605500197000000000335019f000000000034041b0000000203200039000000000303041a0000000204100039000000000034041b0000000303200039000000000303041a0000000304100039000000000034041b0000000a0400002900000004011000390000000402200039000000000202041a000000000021041b0000000302000039000000000102041a000000000041004b000010d00000a13d000000000020043f0000000001000414000004660010009c0000046601008041000000c001100210000004b0011001c700008010020000391194118f0000040f0000000100200190000010d60000613d000000000101043b000000020110002900000008020000290000000002020433000000000021041b0000000102100039000000000302041a000004c603300197000000070400002900000000040404330000046904400197000000000343019f000000000032041b000000060200002900000000020204330000000203100039000000000023041b000000040200002900000000020204330000000303100039000000000023041b000000040110003900000005020000290000000002020433000000000021041b0000000b010000290000050b0010009c000000030300003900000f6e0000a13d000004b901000041000000000010043f0000001101000039000000040010043f000004ba010000410000119600010430000000000001042d000004b901000041000000000010043f0000003201000039000000040010043f000004ba01000041000011960001043000000000010000190000119600010430000004b901000041000000000010043f0000004101000039000000040010043f000004ba010000410000119600010430000000400100043d000005040010009c0000110a0000813d000000a002100039000000400020043f000000800210003900000000000204350000006002100039000000000002043500000040021000390000000000020435000000200210003900000000000204350000000000010435000000400100043d0000000302000039000000000302041a000000000003004b000011100000613d000000000020043f000004b10010009c0000110a0000213d000000a002100039000000400020043f000004b402000041000000000202041a0000000002210436000004b503000041000000000303041a00000469033001970000000000320435000004b602000041000000000202041a00000040031000390000000000230435000004b702000041000000000202041a00000060031000390000000000230435000004b802000041000000000202041a00000080031000390000000000230435000000000001042d000004b901000041000000000010043f0000004101000039000000040010043f000004ba0100004100001196000104300000004402100039000004bb030000410000000000320435000000240210003900000016030000390000000000320435000004bc020000410000000000210435000000040210003900000020030000390000000000320435000004660010009c00000466010080410000004001100210000004bd011001c7000011960001043000010000000000020000046a02000041000000000502041a00000000020004140000046906100197000004660020009c0000046602008041000000c0012002100000046b011001c70000800d0200003900000003030000390000046c04000041000100000006001d1194118a0000040f0000000100200190000011340000613d0000046a010000410000000102000029000000000021041b000000000001042d00000000010000190000119600010430000200000000000200000001030000390000004004200039000000000504043300000040041000390000000006040433000000000056004b0000115b0000213d0000000004000415000000010440008a0000000504400210000000000056004b0000000005000019000011580000c13d0000008004200039000000000504043300000080041000390000000006040433000000000056004b0000115b0000413d0000000004000415000000020440008a0000000504400210000000000056004b0000000005000019000011580000c13d00000000020204330000000001010433000000000021004b0000000005000039000000010500a0390000000004000415000000020440008a000000050440021000000005014002700000000101500195000000010350018f0000000001030019000000000001042d000000000001042f000004660010009c00000466010080410000004001100210000004660020009c00000466020080410000006002200210000000000112019f0000000002000414000004660020009c0000046602008041000000c002200210000000000112019f0000046b011001c700008010020000391194118f0000040f0000000100200190000011710000613d000000000101043b000000000001042d0000000001000019000011960001043000000000050100190000000000200443000000040030008c0000117a0000a13d000000050140027000000000010100310000000400100443000004660030009c000004660300804100000060013002100000000002000414000004660020009c0000046602008041000000c002200210000000000112019f00000510011001c700000000020500191194118f0000040f0000000100200190000011890000613d000000000101043b000000000001042d000000000001042f0000118d002104210000000102000039000000000001042d0000000002000019000000000001042d00001192002104230000000102000039000000000001042d0000000002000019000000000001042d0000119400000432000011950001042e0000119600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392702000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e00000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000006a54e82f0000000000000000000000000000000000000000000000000000000096de341f00000000000000000000000000000000000000000000000000000000e5328e0500000000000000000000000000000000000000000000000000000000f2fde38a00000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000fee81cf400000000000000000000000000000000000000000000000000000000feee55d100000000000000000000000000000000000000000000000000000000e5328e0600000000000000000000000000000000000000000000000000000000f04e283e00000000000000000000000000000000000000000000000000000000b99f218d00000000000000000000000000000000000000000000000000000000b99f218e00000000000000000000000000000000000000000000000000000000d97830b10000000000000000000000000000000000000000000000000000000096de34200000000000000000000000000000000000000000000000000000000096ec50c3000000000000000000000000000000000000000000000000000000008456cb58000000000000000000000000000000000000000000000000000000008bbbe1ae000000000000000000000000000000000000000000000000000000008bbbe1af000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000008fafa963000000000000000000000000000000000000000000000000000000008456cb5900000000000000000000000000000000000000000000000000000000886f9ece00000000000000000000000000000000000000000000000000000000715018a500000000000000000000000000000000000000000000000000000000715018a60000000000000000000000000000000000000000000000000000000073b2e80e000000000000000000000000000000000000000000000000000000006a54e830000000000000000000000000000000000000000000000000000000006c19e783000000000000000000000000000000000000000000000000000000004b449cb9000000000000000000000000000000000000000000000000000000005bf8633900000000000000000000000000000000000000000000000000000000607e273600000000000000000000000000000000000000000000000000000000607e2737000000000000000000000000000000000000000000000000000000006720ceb10000000000000000000000000000000000000000000000000000000068e84555000000000000000000000000000000000000000000000000000000005bf8633a000000000000000000000000000000000000000000000000000000005c975abb0000000000000000000000000000000000000000000000000000000057fb25cb0000000000000000000000000000000000000000000000000000000057fb25cc000000000000000000000000000000000000000000000000000000005979ba1a000000000000000000000000000000000000000000000000000000004b449cba0000000000000000000000000000000000000000000000000000000054d1f13d000000000000000000000000000000000000000000000000000000002b1eaf28000000000000000000000000000000000000000000000000000000003f4ba839000000000000000000000000000000000000000000000000000000003f4ba83a000000000000000000000000000000000000000000000000000000004303707e0000000000000000000000000000000000000000000000000000000045cb3f4d000000000000000000000000000000000000000000000000000000002b1eaf29000000000000000000000000000000000000000000000000000000003bbed4a000000000000000000000000000000000000000000000000000000000238ac93200000000000000000000000000000000000000000000000000000000238ac9330000000000000000000000000000000000000000000000000000000025692962000000000000000000000000000000000000000000000000000000000b102d1a0000000000000000000000000000000000000000000000000000000021e6b0d3000000000000000000000000000000000000002000000080000000000000000000000000000000000000000000000000000000000000000000000000389a75e1000000000000000000000000000000000000000000000000000000007448fbae00000000000000000000000000000000000000040000001c000000000000000002000000000000000000000000000000000000200000000c0000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000006f5e88189cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f390000000000000000000000000000000000000060000000000000000000000000020000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f0200000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff5f000000000000000000000000000000000000000000000000ffffffffffffff1f000000000000000000000000000000000000000000000000ffffffffffffff9fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85bc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85cc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85dc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85ec2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f4e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000426964486561703a206865617020697320656d7074790000000000000000000008c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000000000000929eee149b4bd212689a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b02000000000000000000000000000000000000c8000000a000000000000000002065786365656465640000000000000000000000000000000000000000000000526166666c6541756374696f6e4d696e7465723a206275796572206c696d697400000000000000000000000000000000000000840000000000000000000000006d61746368000000000000000000000000000000000000000000000000000000526166666c6541756374696f6e4d696e7465723a207061796d656e74206d6973ffffffffffffffffffffffff0000000000000000000000000000000000000000e684a55f31b79eca403df938249029212a5925ec6be8012e099b45bc1019e5d22070657220757365722072656163686564000000000000000000000000000000526166666c6541756374696f6e4d696e7465723a206d6178696d756d20626964020000000000000000000000000000000000002000000080000000000000000062e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258657374616d700000000000000000000000000000000000000000000000000000526166666c6541756374696f6e4d696e7465723a20696e76616c69642074696d6564000000000000000000000000000000000000000000000000000000000000526166666c6541756374696f6e4d696e7465723a20616c726561647920656e6468617320656e6465640000000000000000000000000000000000000000000000206f6e6c79206265206d616465206166746572207468652061756374696f6e20526166666c6541756374696f6e4d696e7465723a207061796d656e742063616e00000000000000000000000000000000000000a4000000000000000000000000656164792073656e740000000000000000000000000000000000000000000000526166666c6541756374696f6e4d696e7465723a207061796d656e7420616c72656e64207061796d656e74000000000000000000000000000000000000000000526166666c6541756374696f6e4d696e7465723a206661696c656420746f2073656e6473000000000000000000000000000000000000000000000000000000007220726566756e647320616c6c6f77656420756e74696c2061756374696f6e20526166666c6541756374696f6e4d696e7465723a204e6f20636c61696d73206f526166666c6541756374696f6e4d696e7465723a2068617320636c61696d65641806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000002ca1c86e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000656e6420726566756e640000000000000000000000000000000000000000000034fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7636c61696d000000000000000000000000000000000000000000000000000000526166666c6541756374696f6e4d696e7465723a206e6f7468696e6720746f2047564341756374696f6e3a207061757365640000000000000000000000000000000000000000000000000000000000000000006400000080000000000000000047564341756374696f6e3a207061796d656e74206d69736d617463680000000042cbb15ccdc3cad6266b0e7a08c0454b23bf29dc2df74b6f3c209e9336465bd180b41246c05cbb406f874e82aa2faf7db11bba9792fe09929e56ef1eee2c2da347564341756374696f6e3a206275796572206c696d6974206578636565646564206269647320706572207573657200000000000000000000000000000000000047564341756374696f6e3a20776f756c6420657863656564206d6178696d756d526166666c6541756374696f6e4d696e7465723a2061756374696f6e20656e647870697265640000000000000000000000000000000000000000000000000000526166666c6541756374696f6e4d696e7465723a207369676e6174757265206547564341756374696f6e3a20656d70747920626174636800000000000000000000000000000000000000000000000000000000000000000000000000ab143c0647564341756374696f6e3a20616c726561647920696e697469616c697a65640047564341756374696f6e3a20696e76616c696420656e642074696d6500000000426964486561703a206475706c69636174656420696e697469616c697a65000047564341756374696f6e3a20696e76616c6964204e465420616d6f756e74000047564341756374696f6e3a20696e76616c6964207369676e657200000000000047564341756374696f6e3a20696e76616c6964207061796d656e7420726563697069656e74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000080000000000000000047564341756374696f6e3a20696e76616c6964204e4654206164647265737300fa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c9200000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000082b429005db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa47564341756374696f6e3a206e6f7420696e697469616c697a65640000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d00dbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff80000000000000000000000000000000000000000000000000ffffffffffffff60000000000000000000000000000000000000000000000000ffffffffffffffa00000000019457468657265756d205369676e6564204d6573736167653a0a3332020000000000000000000000000000000000003c0000000400000000000000001626ba7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffbbffffffffffffffffffffffffffffffffffffffbc0000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000800000000000000000000000006e61747572650000000000000000000000000000000000000000000000000000526166666c6541756374696f6e4d696e7465723a20696e76616c696420736967000000000000000000000000000000000000000000000001000000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed61ac21916f06bbf7209c3a3556faf9a0152d49a7966f14ddf8d801e50ffa6f

Block Transaction 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
[ 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.