ETH Price: $2,141.76 (-13.13%)

Contract

0xeEa334B302BD8b1b96D4EF73B8f4467a347dA6f0

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Stake Many32292362025-03-04 0:38:161 min ago1741048696IN
0xeEa334B3...a347dA6f0
0 ETH0.000005330.04525
Stake Many32292342025-03-04 0:38:141 min ago1741048694IN
0xeEa334B3...a347dA6f0
0 ETH0.000007950.04525
Stake Many32292212025-03-04 0:38:011 min ago1741048681IN
0xeEa334B3...a347dA6f0
0 ETH0.000005540.04525
Stake Many32291492025-03-04 0:36:493 mins ago1741048609IN
0xeEa334B3...a347dA6f0
0 ETH0.000018020.04525
Stake Many32291112025-03-04 0:36:113 mins ago1741048571IN
0xeEa334B3...a347dA6f0
0 ETH0.000005380.04525
Stake Many32291062025-03-04 0:36:063 mins ago1741048566IN
0xeEa334B3...a347dA6f0
0 ETH0.000005360.04525
Stake Many32290512025-03-04 0:35:114 mins ago1741048511IN
0xeEa334B3...a347dA6f0
0 ETH0.000006450.04525
Stake Many32290202025-03-04 0:34:405 mins ago1741048480IN
0xeEa334B3...a347dA6f0
0 ETH0.000005380.04525
Stake Many32288542025-03-04 0:31:548 mins ago1741048314IN
0xeEa334B3...a347dA6f0
0 ETH0.000005540.04525
Stake Many32286802025-03-04 0:29:0010 mins ago1741048140IN
0xeEa334B3...a347dA6f0
0 ETH0.000005250.04525
Stake Many32286412025-03-04 0:28:2111 mins ago1741048101IN
0xeEa334B3...a347dA6f0
0 ETH0.000007220.04525
Stake Many32284552025-03-04 0:25:0514 mins ago1741047905IN
0xeEa334B3...a347dA6f0
0 ETH0.00000760.04525
Stake Many32282272025-03-04 0:21:1718 mins ago1741047677IN
0xeEa334B3...a347dA6f0
0 ETH0.000005180.04525
Stake Many32280662025-03-04 0:18:3621 mins ago1741047516IN
0xeEa334B3...a347dA6f0
0 ETH0.000005390.04525
Stake Many32280462025-03-04 0:18:1621 mins ago1741047496IN
0xeEa334B3...a347dA6f0
0 ETH0.0000080.04525
Stake Many32279972025-03-04 0:17:2722 mins ago1741047447IN
0xeEa334B3...a347dA6f0
0 ETH0.0000080.04525
Stake Many32279222025-03-04 0:16:1223 mins ago1741047372IN
0xeEa334B3...a347dA6f0
0 ETH0.000007690.04525
Stake Many32278912025-03-04 0:15:4124 mins ago1741047341IN
0xeEa334B3...a347dA6f0
0 ETH0.000008890.04525
Stake Many32278882025-03-04 0:15:2924 mins ago1741047329IN
0xeEa334B3...a347dA6f0
0 ETH0.000005750.04525
Stake Many32276942025-03-04 0:12:1527 mins ago1741047135IN
0xeEa334B3...a347dA6f0
0 ETH0.000005350.04525
Stake Many32275262025-03-04 0:09:2730 mins ago1741046967IN
0xeEa334B3...a347dA6f0
0 ETH0.000020460.04525
Stake Many32274892025-03-04 0:08:5031 mins ago1741046930IN
0xeEa334B3...a347dA6f0
0 ETH0.000005530.04525
Stake Many32274242025-03-04 0:07:4532 mins ago1741046865IN
0xeEa334B3...a347dA6f0
0 ETH0.000009260.04525
Stake Many32273582025-03-04 0:06:3933 mins ago1741046799IN
0xeEa334B3...a347dA6f0
0 ETH0.000006150.04525
Stake Many32271922025-03-04 0:03:4436 mins ago1741046624IN
0xeEa334B3...a347dA6f0
0 ETH0.000006750.04525
View all transactions

Latest 1 internal transaction

Parent Transaction Hash Block From To
32006432025-03-03 16:31:338 hrs ago1741019493  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Endgame

Compiler Version
v0.8.28+commit.7893614a

ZkSolc Version
v1.5.10

Optimization Enabled:
Yes with Mode 3

Other Settings:
cancun EvmVersion
File 1 of 8 : Endgame.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;

import {IERC20} from "./interfaces/IERC20.sol";
import {ILevelingGame} from "./interfaces/ILevelingGame.sol";
import {IERC721} from "./interfaces/IERC721.sol";
import {IGachaToken} from "./interfaces/IGachaToken.sol";
import {IVRFSystem} from "./interfaces/IVRFSystem.sol";
import {Ownable} from "solady/auth/Ownable.sol";
import {DelegateCheckerLib} from "solady/utils/ext/zksync/delegatexyz/DelegateCheckerLib.sol";

/// @dev Contract for staking heroes in dungeons with risk/reward mechanics.
///      Heroes can be staked in 3 different dungeons with varying rewards and risks.
///      Each dungeon has a minimum stake time and entry fee.
///      When unstaking, there's a chance to get rewards or lose the hero.
///
/// @author Onchain-Heroes (https://www.onchainheroes.xyz/)
/// @author atarpara (https://www.github.com/atarpara)
contract Endgame is Ownable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Hero level must be at least 10 to stake.
    error HeroLevelNotMet();

    /// @dev Invalid dungeon type selected.
    error InvalidDungeonType();

    /// @dev Action attempted outside active season window.
    error NotActiveSeason();

    /// @dev Caller is not the owner or delegate of the hero.
    error CallerIsNotOwnerOrDelegateWallet();

    /// @dev Contract is paused.
    error Paused();

    /// @dev Given action is not allowed.
    error NotAllowed();

    /// @dev Contract is not paused.
    error Unpaused();

    /// @dev Minimum stake time not met.
    error CoolDownPeriod(uint256 hero);

    /// @dev Hero has died and cannot be unstaked until season ends.
    error HeroDied();

    /// @dev The hero has not died yet.
    error HeroNotDied();

    /// @dev The season has not ended yet.
    error SeasonNotEnded();

    /// @dev Entropy request already fulfilled
    error AlreadyFulfilled();

    /// @dev Request is not exist.
    error RequestNotExist();

    /// @dev Sum of rewards is not 100.
    error SumOfRewardsIsNotHundred();

    /// @dev Rewards have not been set for dungeon.
    error RewardsNotConfigured();

    /// @dev Unstake request is already in progress.
    error RequestIsAlreadyInProgress(uint256 hero);

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

    /// @dev Emitted when a hero dies in a dungeon.
    event Death(uint256 id);

    /// @dev Emitted when `owner` stakes hero `heroId` in `dungeonType` with `entryFee` and `rewardsChance`.
    event Staked(address indexed owner, uint256 heroId, uint256 entryFee, uint40 rewardsChance, uint8 dungeonType);

    /// @dev Emitted when a reward is granted after successful unstaking.
    event Unstaked(uint256 indexed heroId, address indexed owner, uint256 rewardType, uint8 dungeonType);

    /// @dev Emitted when hero unstake is requested.
    event UnstakeRequested(address indexed user, uint256 id);

    /// @dev Emitted when heroes emergency unstaked.
    event EmergencyUnstaked(uint256[] ids);

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

    /// @dev Minimum level of hero for dungeon1.
    uint256 public constant MIN_LEVEL_OF_HERO_D1 = 10;

    /// @dev Minimum level of hero for dungeon2.
    uint256 public constant MIN_LEVEL_OF_HERO_D2 = 15;

    /// @dev Minimum level of hero for dungeon3.
    uint256 public constant MIN_LEVEL_OF_HERO_D3 = 20;

    /// @dev Address of LevelingGame contract.
    ILevelingGame private constant levelingGame = ILevelingGame(0x06D7Ee1D50828Ca96e11890A1601f6fe61F1e584);

    /// @dev ERC20 token used for $HERO20
    IERC20 private constant hero20 = IERC20(0x33EE11cE309854a45B65368C078616ABcb5c6e3d);

    /// @dev ERC721 token representing heroes.
    IERC721 private constant hero721 = IERC721(0x7c47ea32FD27d1a74Fc6e9F31Ce8162e6Ce070eB);

    /// @dev ERC1155 token representing gachatoken.
    IGachaToken private constant gachaToken = IGachaToken(0xB5EC907d0E80F9A1cA9C1942D69Fb558E01140d4);

    /// @dev Address of vrf contract of pop network.
    IVRFSystem private constant vrf = IVRFSystem(0xBDC8B6eb1840215A22fC1134046f595b7D42C2DE);

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

    /// @dev Stores staking information for each hero.
    struct StakedHero {
        address owner;
        //// @dev Timestamp of stake heroes (Till year 2038)
        uint32 stakeTime;
        /// @dev Minimum stake time in hours
        uint8 minStakeTime;
        /// @dev Rewards probability bit layout
        ///        [0-7] : Chances of getting Bronze Token
        ///       [8-15] : Chances of getting Silver Token
        ///      [16-23] : Chances of getting Gold Token
        ///      [24-31] : Chances of getting Diamond Token
        ///      [32-39] : Chances of hero dying
        uint40 rewardsChance;
        uint8 dungeonType;
        bool isDead;
    }

    /// @dev Stores vrf request data.
    struct RequestData {
        address owner;
        uint48 heroId;
        /// @dev Rewards probability bit layout
        ///        [0-7] : Chances of getting Bronze Token
        ///       [8-15] : Chances of getting Silver Token
        ///      [16-23] : Chances of getting Gold Token
        ///      [24-31] : Chances of getting Diamond Token
        ///      [32-39] : Chances of hero dying
        uint40 rewards;
        bool fulfilled;
    }

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

    /// @dev Maps hero ID to staking information.
    mapping(uint256 => StakedHero) public stakingInformation;

    /// @dev Maps random number `requestId` to request data.
    mapping(uint256 => RequestData) public request;

    /// @dev Minimum stake time in hours for dungeon 1.
    uint8 public MIN_STAKE_TIME_DUNGEON1;

    /// @dev Minimum stake time in hours for dungeon 2.
    uint8 public MIN_STAKE_TIME_DUNGEON2;

    /// @dev Minimum stake time in hours for dungeon 3.
    uint8 public MIN_STAKE_TIME_DUNGEON3;

    /// @dev Season start timestamp.
    uint40 public startSeasonTime;
    /// @dev Season end timestamp.
    uint40 public endSeasonTime;

    /// @dev Reward probabilities for dungeon 1.
    uint40 dungeon1Rewards;
    /// @dev Reward probabilities for dungeon 2.
    uint40 dungeon2Rewards;
    /// @dev Reward probabilities for dungeon 3.
    uint40 dungeon3Rewards;
    /// @dev Pause flag for contract.
    uint8 pauseFlag;

    /// @dev Entry fee for dungeon 1.
    uint256 public dungeon1Fee;
    /// @dev Entry fee for dungeon 2.
    uint256 public dungeon2Fee;
    /// @dev Entry fee for dungeon 3.
    uint256 public dungeon3Fee;

    /// @dev Initializes contract with owner.
    constructor(address _owner) {
        _initializeOwner(_owner);
        startSeasonTime = type(uint40).max;
        endSeasonTime = type(uint40).max;
    }

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

    /// @dev Modifier for the checking season active.
    modifier onlyDuringActiveSeason() {
        if (block.timestamp >= endSeasonTime || block.timestamp < startSeasonTime) {
            revert NotActiveSeason();
        }
        _;
    }

    /// @dev Modifier for the checking contract pause status.
    modifier whenNotPaused() {
        if (pauseFlag != 0) revert Paused();
        _;
    }

    /// @dev Modifier for the checking contract unpause status.
    modifier whenPaused() {
        if (pauseFlag == 0) revert Unpaused();
        _;
    }

    /// @dev Stakes multiple heroes into a specified dungeon type.
    ///
    /// Requirements:
    /// - The caller must owns the heroes.
    /// - The hero level must meet the MIN_LEVEL_OF_HERO.
    function stakeMany(uint256[] calldata ids, uint8 _dungeonsType) external onlyDuringActiveSeason whenNotPaused {
        // cache ids length
        uint256 len = ids.length;

        // get a entryFee and rewards for `_dungeonsType`
        (uint256 entryFee, uint40 rewards, uint8 minStakeTime, uint256 min_level) = getDungeonsData(_dungeonsType);

        if (rewards == 0 || minStakeTime == 0) revert RewardsNotConfigured();

        for (uint256 i; i < len;) {
            uint256 id = ids[i];

            // Retrieve level from staking contract
            uint256 level = levelingGame.stakeI(id) & 0xff;

            // Hero Level at least minimal level for staking dungeon
            if (level < min_level) revert HeroLevelNotMet();

            address owner = hero721.ownerOf(id);

            // Caller must owner of given token id or delegated wallet
            if (owner != msg.sender) {
                // forgefmt: disable-next-item
                if (!(DelegateCheckerLib.checkDelegateForERC721(msg.sender, owner, address(hero721), id)
                    && DelegateCheckerLib.checkDelegateForContract(msg.sender, owner, address(hero20)))) {
                    revert CallerIsNotOwnerOrDelegateWallet();
                }
            }

            // Update staking information
            stakingInformation[id] = StakedHero({
                owner: owner,
                stakeTime: uint32(block.timestamp),
                minStakeTime: minStakeTime,
                rewardsChance: rewards,
                dungeonType: _dungeonsType,
                isDead: false
            });

            hero721.transferFrom(owner, address(this), id);

            // Transfer total entry fees for a staking heroes.
            hero20.transferFrom(owner, address(this), entryFee);

            // Emit a `Staked`.
            emit Staked(owner, id, entryFee, rewards, _dungeonsType);
            ++i;
        }
    }

    /// @dev Initiates unstake request of heroes with vrf for randomized rewards.
    ///
    /// Requirement:
    /// - The caller must owns the heroes.
    /// - The hero must be passed minimum staking period.
    function requestUnstakeMany(uint256[] calldata ids) external payable whenNotPaused {
        // Cache ids length
        uint256 len = ids.length;

        // Cache memory for StakedHero
        StakedHero memory stakeI;

        address owner;

        for (uint256 i; i < len;) {
            uint256 id = ids[i];
            // Get staking data
            stakeI = stakingInformation[id];

            owner = stakeI.owner;

            // Caller must owner of given token id or delegated wallet
            if (owner != msg.sender) {
                if (!DelegateCheckerLib.checkDelegateForERC721(msg.sender, owner, address(hero721), id)) {
                    revert CallerIsNotOwnerOrDelegateWallet();
                }
            }

            // Revert if request is already in progress
            if (stakeI.stakeTime == 0xffffffff) revert RequestIsAlreadyInProgress(id);

            // For unstaking, minimum stake time must have passed
            if (uint256(block.timestamp - stakeI.stakeTime) < uint256(stakeI.minStakeTime) * 3600) {
                revert CoolDownPeriod(id);
            }

            // Cannot unstake dead hero until season ends
            if (stakeI.isDead) revert HeroDied();

            uint256 requestId = vrf.requestRandomNumberWithTraceId(0);

            // Set stakeTime to max value to indicate request is in progress
            stakingInformation[id].stakeTime = type(uint32).max;

            request[requestId] =
                RequestData({owner: owner, heroId: uint48(id), rewards: stakeI.rewardsChance, fulfilled: false});

            emit UnstakeRequested(owner, id);
            ++i;
        }
    }

    /// @dev Recovery mechanisms for retrieving hero when contract paused.
    /// Note: This function doesn't give any pending rewards.
    function emergencyUnstake(uint256[] calldata ids) external whenPaused {
        uint256 len = ids.length;
        for (uint256 i = 0; i < len;) {
            uint256 id = ids[i];
            address owner = stakingInformation[id].owner;

            // Caller must owner of given token id or delegated wallet
            if (owner != msg.sender) {
                if (!DelegateCheckerLib.checkDelegateForERC721(msg.sender, owner, address(hero721), id)) {
                    revert CallerIsNotOwnerOrDelegateWallet();
                }
            }

            // Clear owner staking information
            delete stakingInformation[id];

            // Transfer back to original owner
            hero721.transferFrom(address(this), owner, id);
            ++i;
        }
        emit EmergencyUnstaked(ids);
    }

    /// @dev Unstakes dead heroes after the season has ended.
    function unstakeDiedHeroes(uint256[] calldata ids) external {
        // Cannot unstake dead hero until season ends
        if (block.timestamp < endSeasonTime) revert SeasonNotEnded();

        uint256 len = ids.length;
        StakedHero memory stakeI;

        for (uint256 i; i < len;) {
            uint256 id = ids[i];
            // Get staking data
            stakeI = stakingInformation[id];

            if (!stakeI.isDead) revert HeroNotDied();

            hero721.transferFrom(address(this), stakeI.owner, id);
            emit Unstaked(id, stakeI.owner, 5, stakeI.dungeonType);
            ++i;
        }
    }

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

    /// @dev Processes random number callback and determines unstaking outcome and mint rewards.
    function vrfCallback(uint256 requestId, uint256 randomNumber) internal {
        RequestData memory requestData = request[requestId];

        if (requestData.owner == address(0x00)) revert RequestNotExist();
        if (requestData.fulfilled) revert AlreadyFulfilled();

        request[requestId].fulfilled = true;

        uint256 chance = uint256(keccak256(abi.encode(requestId, randomNumber))) % 100;
        uint40 rewards = requestData.rewards;
        uint256 rewardToken;
        uint256 probability;

        for (uint256 i = 0; true;) {
            uint256 rewardProb = (rewards >> i) & 0xff;
            probability += rewardProb;
            if (chance < probability) {
                rewardToken = (i >> 3) + 1;
                break;
            }
            i += 8;
        }

        // If hero dies, set isDead to true
        // Can't Unstake until season ends
        if (rewardToken == 5) {
            // update stake time to zero
            stakingInformation[requestData.heroId].stakeTime = 0;
            stakingInformation[requestData.heroId].isDead = true;
            emit Death(requestData.heroId);
            return;
        }

        emit Unstaked(
            requestData.heroId, requestData.owner, rewardToken, stakingInformation[requestData.heroId].dungeonType
        );

        // Clear staking information
        delete stakingInformation[requestData.heroId];
        // Transfer hero back to owner
        hero721.transferFrom(address(this), requestData.owner, requestData.heroId);
        // Mint reward token
        gachaToken.mint(requestData.owner, rewardToken, 1);
    }

    /// @dev Returns rewards probabilities in array.
    function _getRewards(uint40 rewards) internal pure returns (uint256[5] memory result) {
        result[0] = uint256(rewards & 0xff);
        result[1] = uint256((rewards >> 8) & 0xff);
        result[2] = uint256((rewards >> 16) & 0xff);
        result[3] = uint256((rewards >> 24) & 0xff);
        result[4] = uint256((rewards >> 32) & 0xff);
    }

    /// @dev Returns entry fee, rewards, minimum stake time and minimum level for specified dungeon type.
    function getDungeonsData(uint8 _type) internal view returns (uint256, uint40, uint8, uint256) {
        if (_type == 0) return (dungeon1Fee, dungeon1Rewards, MIN_STAKE_TIME_DUNGEON1, MIN_LEVEL_OF_HERO_D1);
        if (_type == 1) return (dungeon2Fee, dungeon2Rewards, MIN_STAKE_TIME_DUNGEON2, MIN_LEVEL_OF_HERO_D2);
        if (_type == 2) return (dungeon3Fee, dungeon3Rewards, MIN_STAKE_TIME_DUNGEON3, MIN_LEVEL_OF_HERO_D3);
        revert InvalidDungeonType();
    }

    /// @dev Returns dungeon rewards probabilities.
    function dungeonRewards(uint8 dungeonType) external view returns (uint256[5] memory) {
        if (dungeonType == 0) return _getRewards(dungeon1Rewards);
        if (dungeonType == 1) return _getRewards(dungeon2Rewards);
        if (dungeonType == 2) return _getRewards(dungeon3Rewards);
        revert InvalidDungeonType();
    }

    /// @dev Check if contract is paused
    function isPaused() external view returns (bool) {
        return pauseFlag != 0;
    }

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

    /// @dev Withdraw `HERO20` tokens to `to`.
    /// Note: Half Tokens must be burn.
    function withdrawFee(address to) external onlyOwner {
        uint256 balance = hero20.balanceOf(address(this));
        hero20.transfer(to, balance >> 1);
        hero20.burn(balance - (balance >> 1));
    }

    /// @dev Set season start and end times.
    function setSeasonTime(uint40 _startTime, uint40 _endTime) external onlyOwner {
        if (startSeasonTime != _startTime) {
            // Reverts if season stared.
            if (block.timestamp >= startSeasonTime) revert NotAllowed();
            startSeasonTime = _startTime;
        }

        if (endSeasonTime != _endTime) {
            // Reverts if season ended.
            if (block.timestamp >= endSeasonTime || _endTime < startSeasonTime) {
                revert NotAllowed();
            }
            endSeasonTime = _endTime;
        }
    }

    /// @dev Sets the reward probabilities for a specified dungeon type.
    ///
    /// Requirements:
    // - The caller must be the contract owner.
    // - The sum of the reward probabilities in `_rewards` must equal 100.
    function setDungeonRewards(uint256[5] memory _rewards, uint8 dungeonType) external onlyOwner {
        if (dungeonType > 2) revert InvalidDungeonType();
        // Check rewards sum equals 100
        uint256 sum = _rewards[0] + _rewards[1] + _rewards[2] + _rewards[3] + _rewards[4];

        if (sum != 100) revert SumOfRewardsIsNotHundred();

        uint40 reward =
            uint40(_rewards[4] << 32 | _rewards[3] << 24 | _rewards[2] << 16 | _rewards[1] << 8 | _rewards[0]);

        if (dungeonType == 0) {
            dungeon1Rewards = reward;
        } else if (dungeonType == 1) {
            dungeon2Rewards = reward;
        } else {
            dungeon3Rewards = reward;
        }
    }

    /// @dev Set dungeon entry fees for a specified dungeon type.
    function setDungeonFees(uint256 _dungeon1Fee, uint256 _dungeon2Fee, uint256 _dungeon3Fee) external onlyOwner {
        if (dungeon1Fee != _dungeon1Fee) {
            dungeon1Fee = _dungeon1Fee;
        }
        if (dungeon2Fee != _dungeon2Fee) {
            dungeon2Fee = _dungeon2Fee;
        }
        if (dungeon3Fee != _dungeon3Fee) {
            dungeon3Fee = _dungeon3Fee;
        }
    }

    /// @dev Set minimum stake time in hours for a specified dungeon type.
    function setDungeonStakeTime(uint8 minStakeTime1, uint8 minStakeTime2, uint8 minStakeTime3) external onlyOwner {
        if (MIN_STAKE_TIME_DUNGEON1 != minStakeTime1) {
            MIN_STAKE_TIME_DUNGEON1 = minStakeTime1;
        }
        if (MIN_STAKE_TIME_DUNGEON2 != minStakeTime2) {
            MIN_STAKE_TIME_DUNGEON2 = minStakeTime2;
        }
        if (MIN_STAKE_TIME_DUNGEON3 != minStakeTime3) {
            MIN_STAKE_TIME_DUNGEON3 = minStakeTime3;
        }
    }

    /// @dev Toggle pause state.
    function togglePause() external onlyOwner {
        pauseFlag = pauseFlag == 0 ? 1 : 0;
    }

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

    /// @dev This method is called by Entropy contract of Play-of-proof network.
    function randomNumberCallback(uint256 requestId, uint256 randomNumber) external {
        if (msg.sender != address(vrf)) revert Unauthorized();
        vrfCallback(requestId, randomNumber);
    }
}

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

interface IERC20 {
    function mint(address to, uint256 amount) external;

    function transferFrom(address from, address to, uint256 amount) external returns (bool);

    function transfer(address to, uint256 amount) external returns (bool);

    function balanceOf(address to) external returns (uint256);

    function burn(uint256 amount) external;
}

File 3 of 8 : ILevelingGame.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ILevelingGame {
    function stakeI(uint256 id) external returns (uint256);
}

File 4 of 8 : IERC721.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC721 {
    function transferFrom(address from, address to, uint256 amount) external;

    function safeTransferFrom(address from, address to, uint256 amount) external;

    function ownerOf(uint256 tokenId) external view returns (address owner);
}

File 5 of 8 : IGachaToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IGachaToken {
    function mint(address to, uint256 id, uint256 amount) external;
}

File 6 of 8 : IVRFSystem.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IVRFSystem {
    function requestRandomNumberWithTraceId(uint256 traceId) external returns (uint256 requestId);
}

File 7 of 8 : 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 8 of 8 : DelegateCheckerLib.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Library for efficient querying of the delegate registry on ZKsync.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ext/zksync/delegatexyz/DelegateCheckerLib.sol)
library DelegateCheckerLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The canonical delegate registry V2 on ZKsync.
    /// There's no V1 on ZKsync.
    /// See: https://sepolia.abscan.org/address/0x0000000059A24EB229eED07Ac44229DB56C5d797
    address internal constant DELEGATE_REGISTRY_V2 = 0x0000000059A24EB229eED07Ac44229DB56C5d797;

    /// @dev The storage slot to store an override address for the `DELEGATE_REGISTRY_V2`.
    /// If the address is non-zero, it will be used instead.
    /// This is so that you can avoid using `vm.etch` in ZKsync Foundry,
    /// and instead use `vm.store` instead.
    bytes32 internal constant DELEGATE_REGISTRY_V2_OVERRIDE_SLOT =
        0x04ecb0522ab37ca0b278a89c6884dfdbcde83c177150fc939ab02e069068bdef;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                DELEGATE CHECKING OPERATIONS                */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    // Note:
    // - `to` is the delegate. Typically called the "hot wallet".
    // - `from` is the grantor of the delegate rights. Typically called the "cold vault".

    /// @dev Returns if `to` is a delegate of `from`.
    /// ```
    ///     v2.checkDelegateForAll(to, from, "")
    /// ```
    function checkDelegateForAll(address to, address from) internal view returns (bool isValid) {
        address v2 = _delegateRegistryV2();
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            // `0x60` is already 0.
            mstore(0x40, from)
            mstore(0x2c, shl(96, to))
            mstore(0x0c, 0xe839bd53000000000000000000000000) // `checkDelegateForAll(address,address,bytes32)`.
            isValid := eq(mload(staticcall(gas(), v2, 0x1c, 0x64, 0x01, 0x20)), 1)
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Returns if `to` is a delegate of `from`.
    /// ```
    ///     v2.checkDelegateForAll(to, from, rights)
    /// ```
    function checkDelegateForAll(address to, address from, bytes32 rights)
        internal
        view
        returns (bool isValid)
    {
        address v2 = _delegateRegistryV2();
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(0x60, rights)
            mstore(0x40, from)
            mstore(0x2c, shl(96, to))
            mstore(0x0c, 0xe839bd53000000000000000000000000) // `checkDelegateForAll(address,address,bytes32)`.
            isValid := eq(mload(staticcall(gas(), v2, 0x1c, 0x64, 0x01, 0x20)), 1)
            mstore(0x40, m) // Restore the free memory pointer.
            mstore(0x60, 0) // Restore the zero pointer.
        }
    }

    /// @dev Returns if `to` is a delegate of `from` for the specified `contract_`.
    /// ```
    ///     v2.checkDelegateForContract(to, from, contract_, "")
    /// ```
    /// Returns true if `checkDelegateForAll(to, from)` returns true.
    function checkDelegateForContract(address to, address from, address contract_)
        internal
        view
        returns (bool isValid)
    {
        address v2 = _delegateRegistryV2();
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(add(0x80, m), 0)
            mstore(add(0x60, m), contract_)
            mstore(add(0x4c, m), shl(96, from))
            mstore(add(0x2c, m), shl(96, to))
            // `checkDelegateForContract(address,address,address,bytes32)`.
            mstore(add(0x0c, m), 0x8988eea9000000000000000000000000)
            isValid := staticcall(gas(), v2, add(m, 0x1c), 0x84, m, 0x20)
            isValid := and(eq(mload(m), 1), isValid)
        }
    }

    /// @dev Returns if `to` is a delegate of `from` for the specified `contract_`.
    /// ```
    ///     v2.checkDelegateForContract(to, from, contract_, rights)
    /// ```
    /// Returns true if `checkDelegateForAll(to, from, rights)` returns true.
    function checkDelegateForContract(address to, address from, address contract_, bytes32 rights)
        internal
        view
        returns (bool isValid)
    {
        address v2 = _delegateRegistryV2();
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(add(0x80, m), rights)
            mstore(add(0x60, m), contract_)
            mstore(add(0x4c, m), shl(96, from))
            mstore(add(0x2c, m), shl(96, to))
            // `checkDelegateForContract(address,address,address,bytes32)`.
            mstore(add(0x0c, m), 0x8988eea9000000000000000000000000)
            isValid := staticcall(gas(), v2, add(m, 0x1c), 0x84, m, 0x20)
            isValid := and(eq(mload(m), 1), isValid)
        }
    }

    /// @dev Returns if `to` is a delegate of `from` for the specified `contract_` and token `id`.
    /// ```
    ///     v2.checkDelegateForERC721(to, from, contract_, id, "")
    /// ```
    /// Returns true if `checkDelegateForContract(to, from, contract_)` returns true.
    function checkDelegateForERC721(address to, address from, address contract_, uint256 id)
        internal
        view
        returns (bool isValid)
    {
        address v2 = _delegateRegistryV2();
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(add(0xa0, m), 0)
            mstore(add(0x80, m), id)
            mstore(add(0x60, m), contract_)
            mstore(add(0x4c, m), shl(96, from))
            mstore(add(0x2c, m), shl(96, to))
            // `checkDelegateForERC721(address,address,address,uint256,bytes32)`.
            mstore(add(0x0c, m), 0xb9f36874000000000000000000000000)
            isValid := staticcall(gas(), v2, add(m, 0x1c), 0xa4, m, 0x20)
            isValid := and(eq(mload(m), 1), isValid)
        }
    }

    /// @dev Returns if `to` is a delegate of `from` for the specified `contract_` and token `id`.
    /// ```
    ///     v2.checkDelegateForERC721(to, from, contract_, id, rights)
    /// ```
    /// Returns true if `checkDelegateForContract(to, from, contract_, rights)` returns true.
    function checkDelegateForERC721(
        address to,
        address from,
        address contract_,
        uint256 id,
        bytes32 rights
    ) internal view returns (bool isValid) {
        address v2 = _delegateRegistryV2();
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(add(0xa0, m), rights)
            mstore(add(0x80, m), id)
            mstore(add(0x60, m), contract_)
            mstore(add(0x4c, m), shl(96, from))
            mstore(add(0x2c, m), shl(96, to))
            // `checkDelegateForERC721(address,address,address,uint256,bytes32)`.
            mstore(add(0x0c, m), 0xb9f36874000000000000000000000000)
            isValid := staticcall(gas(), v2, add(m, 0x1c), 0xa4, m, 0x20)
            isValid := and(eq(mload(m), 1), isValid)
        }
    }

    /// @dev Returns the amount of an ERC20 token for `contract_`
    /// that `to` is granted rights to act on the behalf of `from`.
    /// ```
    ///     v2.checkDelegateForERC20(to, from, contract_, "")
    /// ```
    /// Returns `type(uint256).max` if `checkDelegateForContract(to, from, contract_)` returns true.
    function checkDelegateForERC20(address to, address from, address contract_)
        internal
        view
        returns (uint256 amount)
    {
        address v2 = _delegateRegistryV2();
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            let o := add(0x80, m)
            mstore(o, 0)
            mstore(add(0x60, m), contract_)
            mstore(add(0x4c, m), shl(96, from))
            mstore(add(0x2c, m), shl(96, to))
            // `checkDelegateForERC20(address,address,address,bytes32)`.
            mstore(add(0x0c, m), 0xba63c817000000000000000000000000)
            amount := staticcall(gas(), v2, add(m, 0x1c), 0x84, o, 0x20)
            amount := mul(mload(o), amount)
        }
    }

    /// @dev Returns the amount of an ERC20 token for `contract_`
    /// that `to` is granted rights to act on the behalf of `from`.
    /// ```
    ///     v2.checkDelegateForERC20(to, from, contract_, rights)
    /// ```
    /// Returns `type(uint256).max` if `checkDelegateForContract(to, from, contract_, rights)` returns true.
    function checkDelegateForERC20(address to, address from, address contract_, bytes32 rights)
        internal
        view
        returns (uint256 amount)
    {
        address v2 = _delegateRegistryV2();
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(0x00, 0)
            mstore(add(0x80, m), rights)
            mstore(add(0x60, m), contract_)
            mstore(add(0x4c, m), shl(96, from))
            mstore(add(0x2c, m), shl(96, to))
            // `checkDelegateForERC20(address,address,address,bytes32)`.
            mstore(add(0x0c, m), 0xba63c817000000000000000000000000)
            amount := staticcall(gas(), v2, add(m, 0x1c), 0x84, 0x00, 0x20)
            amount := mul(mload(0x00), amount)
        }
    }

    /// @dev Returns the amount of an ERC1155 token `id` for `contract_`
    /// that `to` is granted rights to act on the behalf of `from`.
    /// ```
    ///     v2.checkDelegateForERC1155(to, from, contract_, id, "")
    /// ```
    /// Returns `type(uint256).max` if `checkDelegateForContract(to, from, contract_)` returns true.
    function checkDelegateForERC1155(address to, address from, address contract_, uint256 id)
        internal
        view
        returns (uint256 amount)
    {
        address v2 = _delegateRegistryV2();
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            let o := add(0xa0, m)
            mstore(o, 0)
            mstore(add(0x80, m), id)
            mstore(add(0x60, m), contract_)
            mstore(add(0x4c, m), shl(96, from))
            mstore(add(0x2c, m), shl(96, to))
            // `checkDelegateForERC1155(address,address,address,uint256,bytes32)`.
            mstore(add(0x0c, m), 0xb8705875000000000000000000000000)
            amount := staticcall(gas(), v2, add(m, 0x1c), 0xa4, o, 0x20)
            amount := mul(mload(o), amount)
        }
    }

    /// @dev Returns the amount of an ERC1155 token `id` for `contract_`
    /// that `to` is granted rights to act on the behalf of `from`.
    /// ```
    ///     v2.checkDelegateForERC1155(to, from, contract_, id, rights)
    /// ```
    /// Returns `type(uint256).max` if `checkDelegateForContract(to, from, contract_, rights)` returns true.
    function checkDelegateForERC1155(
        address to,
        address from,
        address contract_,
        uint256 id,
        bytes32 rights
    ) internal view returns (uint256 amount) {
        address v2 = _delegateRegistryV2();
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(0x00, 0)
            mstore(add(0xa0, m), rights)
            mstore(add(0x80, m), id)
            mstore(add(0x60, m), contract_)
            mstore(add(0x4c, m), shl(96, from))
            mstore(add(0x2c, m), shl(96, to))
            // `checkDelegateForERC1155(address,address,address,uint256,bytes32)`.
            mstore(add(0x0c, m), 0xb8705875000000000000000000000000)
            amount := staticcall(gas(), v2, add(m, 0x1c), 0xa4, 0x00, 0x20)
            amount := mul(mload(0x00), amount)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      PRIVATE HELPERS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the address of the delegate registry V2.
    function _delegateRegistryV2() private view returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            // Don't worry about it, storage read is cheap on ZKsync VM.
            result := shr(96, shl(96, sload(DELEGATE_REGISTRY_V2_OVERRIDE_SLOT)))
            result := or(mul(DELEGATE_REGISTRY_V2, iszero(result)), result)
        }
    }
}

Settings
{
  "viaIR": false,
  "codegen": "yul",
  "remappings": [
    "@limitbreak/permit-c/=lib/creator-token-standards/lib/PermitC/src/",
    "@opensea/tstorish/=lib/creator-token-standards/lib/tstorish/src/",
    "@openzeppelin/=lib/creator-token-standards/lib/openzeppelin-contracts/",
    "@rari-capital/solmate/=lib/creator-token-standards/lib/PermitC/lib/solmate/",
    "ERC721A/=lib/ERC721A/contracts/",
    "PermitC/=lib/creator-token-standards/lib/PermitC/",
    "creator-token-standards/=lib/creator-token-standards/",
    "delegate-registry/=lib/delegate-registry/",
    "ds-test/=lib/creator-token-standards/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/delegate-registry/lib/openzeppelin-contracts/lib/erc4626-tests/",
    "erc721a/=lib/creator-token-standards/lib/ERC721A/",
    "forge-gas-metering/=lib/creator-token-standards/lib/PermitC/lib/forge-gas-metering/",
    "forge-std/=lib/forge-std/src/",
    "forge-zksync-std/=lib/forge-zksync-std/src/",
    "murky/=lib/creator-token-standards/lib/murky/",
    "openzeppelin-contracts/=lib/creator-token-standards/lib/openzeppelin-contracts/",
    "openzeppelin/=lib/delegate-registry/lib/openzeppelin-contracts/contracts/",
    "solady/=lib/solady/src/",
    "solmate/=lib/creator-token-standards/lib/PermitC/lib/solmate/src/",
    "tstorish/=lib/creator-token-standards/lib/tstorish/src/"
  ],
  "evmVersion": "cancun",
  "outputSelection": {
    "*": {
      "*": [
        "abi"
      ]
    }
  },
  "optimizer": {
    "enabled": true,
    "mode": "3",
    "fallback_to_optimizing_for_size": false,
    "disable_system_request_memoization": true
  },
  "metadata": {},
  "libraries": {},
  "enableEraVMExtensions": false,
  "forceEVMLA": false
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyFulfilled","type":"error"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"CallerIsNotOwnerOrDelegateWallet","type":"error"},{"inputs":[{"internalType":"uint256","name":"hero","type":"uint256"}],"name":"CoolDownPeriod","type":"error"},{"inputs":[],"name":"HeroDied","type":"error"},{"inputs":[],"name":"HeroLevelNotMet","type":"error"},{"inputs":[],"name":"HeroNotDied","type":"error"},{"inputs":[],"name":"InvalidDungeonType","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"NotActiveSeason","type":"error"},{"inputs":[],"name":"NotAllowed","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"inputs":[{"internalType":"uint256","name":"hero","type":"uint256"}],"name":"RequestIsAlreadyInProgress","type":"error"},{"inputs":[],"name":"RequestNotExist","type":"error"},{"inputs":[],"name":"RewardsNotConfigured","type":"error"},{"inputs":[],"name":"SeasonNotEnded","type":"error"},{"inputs":[],"name":"SumOfRewardsIsNotHundred","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"Unpaused","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Death","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"EmergencyUnstaked","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":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"heroId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"entryFee","type":"uint256"},{"indexed":false,"internalType":"uint40","name":"rewardsChance","type":"uint40"},{"indexed":false,"internalType":"uint8","name":"dungeonType","type":"uint8"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"UnstakeRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"heroId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardType","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"dungeonType","type":"uint8"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"MIN_LEVEL_OF_HERO_D1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_LEVEL_OF_HERO_D2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_LEVEL_OF_HERO_D3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_STAKE_TIME_DUNGEON1","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_STAKE_TIME_DUNGEON2","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_STAKE_TIME_DUNGEON3","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"dungeon1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dungeon2Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dungeon3Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"dungeonType","type":"uint8"}],"name":"dungeonRewards","outputs":[{"internalType":"uint256[5]","name":"","type":"uint256[5]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"emergencyUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endSeasonTime","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256","name":"randomNumber","type":"uint256"}],"name":"randomNumberCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"request","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint48","name":"heroId","type":"uint48"},{"internalType":"uint40","name":"rewards","type":"uint40"},{"internalType":"bool","name":"fulfilled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"requestUnstakeMany","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dungeon1Fee","type":"uint256"},{"internalType":"uint256","name":"_dungeon2Fee","type":"uint256"},{"internalType":"uint256","name":"_dungeon3Fee","type":"uint256"}],"name":"setDungeonFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[5]","name":"_rewards","type":"uint256[5]"},{"internalType":"uint8","name":"dungeonType","type":"uint8"}],"name":"setDungeonRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"minStakeTime1","type":"uint8"},{"internalType":"uint8","name":"minStakeTime2","type":"uint8"},{"internalType":"uint8","name":"minStakeTime3","type":"uint8"}],"name":"setDungeonStakeTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint40","name":"_startTime","type":"uint40"},{"internalType":"uint40","name":"_endTime","type":"uint40"}],"name":"setSeasonTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint8","name":"_dungeonsType","type":"uint8"}],"name":"stakeMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingInformation","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"stakeTime","type":"uint32"},{"internalType":"uint8","name":"minStakeTime","type":"uint8"},{"internalType":"uint40","name":"rewardsChance","type":"uint40"},{"internalType":"uint8","name":"dungeonType","type":"uint8"},{"internalType":"bool","name":"isDead","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startSeasonTime","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"unstakeDiedHeroes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]

9c4d535b0000000000000000000000000000000000000000000000000000000000000000010003a76db4fb83d9cc82eeca25b0283f183a62eadb3e82a58ce270a4f21dad000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000001b2c84dd7957b1e207cd7b01ded77984ec16fdef

Deployed Bytecode

0x0001000000000002001200000000000200000000000103550000006003100270000003010330019700000001002001900000002b0000c13d0000008006000039000000400060043f000000040030008c000005810000413d000000000201043b000000e0022002700000030a0020009c000000650000a13d0000030b0020009c0000011a0000a13d0000030c0020009c000001540000a13d0000030d0020009c0000018d0000a13d0000030e0020009c0000057b0000613d0000030f0020009c000002ab0000613d000003100020009c000005810000c13d000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000401100370000000000101043b000003040010009c000005810000213d0000033a020000410000000c0020043f000000000010043f0000000c0100003900000020020000390bfe0bdf0000040f000002c60000013d0000000002000416000000000002004b000005810000c13d0000001f0230003900000302022001970000008002200039000000400020043f0000001f0430018f000003030530019800000080025000390000003c0000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b000000380000c13d000000000004004b000000490000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000200030008c000005810000413d000000800600043d000003040060009c000005810000213d0000030501000041000000000061041b0000000001000414000003010010009c0000030101008041000000c00110021000000306011001c70000800d020000390000000303000039000003070400004100000000050000190bfe0bf40000040f0000000100200190000005810000613d0000000201000039000000000201041a00000308022001c7000000000021041b000000200100003900000100001004430000012000000443000003090100004100000bff0001042e000003230020009c000001450000213d0000032f0020009c000001610000213d000003350020009c000001c00000213d000003380020009c000002b40000613d000003390020009c000005810000c13d000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000401100370000000000101043b001200000001001d000003040010009c000005810000213d0000030501000041000000000101041a0000000002000411000000000012004b000005920000c13d0000039c01000041000000800010043f0000000001000410000000840010043f0000000001000414000003010010009c0000030101008041000000c0011002100000039d011001c70000038d020000410bfe0bf40000040f00000060031002700000030103300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000000980000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000000940000c13d000000000006004b000000a50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500000001002001900000059c0000613d0000001f01400039000000600110018f00000080021001bf001100000002001d000000400020043f000000200030008c000005810000413d00000012020000290000030402200197000000800400043d0000039e030000410000001105000029000000000035043500000084031001bf0000000000230435000000a401100039001200000004001d0000000102400270001000000002001d00000000002104350000000001000414000003010010009c0000030101008041000000c0011002100000004002500210000000000121019f0000039f011001c70000038d020000410bfe0bf40000040f00000060031002700000030103300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000001105700029000000d30000613d000000000801034f0000001109000029000000008a08043c0000000009a90436000000000059004b000000cf0000c13d000000000006004b000000e00000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500000001002001900000065f0000613d0000001f01400039000000600110018f0000001101100029000000400010043f000000200030008c000005810000413d00000011010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b000005810000c13d0000035f0100004100000000001004430000038d0100004100000004001004430000000001000414000003010010009c0000030101008041000000c00110021000000360011001c700008002020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000000001004b000005810000613d00000010020000290000001201200069000000400300043d000003a002000041000000000023043500000004023000390000000000120435000003010030009c001200000003001d0000030101000041000000000103401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000352011001c70000038d020000410bfe0bf40000040f00000001002001900000088e0000613d000000120100002900000000020000190bfe0bac0000040f000000000100001900000bff0001042e000003180020009c000001710000213d0000031e0020009c000001fd0000213d000003210020009c000002b90000613d000003220020009c000005810000c13d000000440030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000002000411000003530020009c000005830000c13d0000002402100370000000000202043b001100000002001d0000000401100370000000000101043b001200000001001d000000000010043f0000000101000039000000200010043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000400400043d000003550040009c000005ba0000a13d0000037301000041000000000010043f0000004101000039000000040010043f000003520100004100000c0000010430000003240020009c000001820000213d0000032a0020009c000002080000213d0000032d0020009c000002c20000613d0000032e0020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000201000039000000000101041a00000018011002700000016d0000013d000003130020009c0000024d0000213d000003160020009c000002ca0000613d000003170020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000f01000039000000800010043f0000033b0100004100000bff0001042e000003300020009c000002580000213d000003330020009c000004290000613d000003340020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000201000039000000000101041a00000040011002700000034301100197000000800010043f0000033b0100004100000bff0001042e000003190020009c0000028e0000213d0000031c0020009c000004500000613d0000031d0020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000201000039000000000101041a00000347001001980000000001000039000000010100c039000000800010043f0000033b0100004100000bff0001042e000003250020009c000002a00000213d000003280020009c0000046e0000613d000003290020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000401000039000002c60000013d000003110020009c0000048d0000613d000003120020009c000005810000c13d000000240030008c000005810000413d0000000401100370000000000101043b001200000001001d000003040010009c000005810000213d0000030501000041000000000101041a0000000002000411000000000012004b000005920000c13d0000033a010000410000000c0010043f0000001201000029000000000010043f0000000001000414000003010010009c0000030101008041000000c0011002100000033e011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b001000000001001d000000000101041a001100000001001d0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000110010006c0000066b0000a13d0000034101000041000000000010043f0000033d0100004100000c0000010430000003360020009c000004940000613d000003370020009c000005810000c13d000000440030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000402100370000000000202043b000003460020009c000005810000213d0000002304200039000000000034004b000005810000813d0000000404200039000000000441034f000000000404043b000500000004001d000003460040009c000005810000213d000400240020003d000000050200002900000005022002100000000402200029000000000032004b000005810000213d0000002401100370000000000101043b000e00000001001d000000ff0010008c000005810000213d0000000201000039000000000101041a001200000001001d0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000120300002900000040023002700000034302200197000000000021004b000001f90000813d00000018023002700000034302200197000000000021004b000008090000813d0000039901000041000000000010043f000003500100004100000c00000104300000031f0020009c000004b50000613d000003200020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000201000039000000000101041a0000001001100270000002b00000013d0000032b0020009c000004db0000613d0000032c0020009c000005810000c13d000000440030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000402100370000000000202043b001200000002001d000003430020009c000005810000213d0000002401100370000000000101043b001100000001001d000003430010009c000005810000213d0000030501000041000000000101041a0000000002000411000000000012004b000005920000c13d000000120100002900000343011001970000000202000039000000000302041a00000018023002700000034302200197000000000012004b000006140000c13d00000011010000290000034302100197001000000003001d00000040013002700000034301100197000f00000002001d001200000001001d000000000021004b000004f60000613d0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000120010006c0000001002000029000007fa0000813d000000180120027000000343011001970000000f0010006b000007fa0000413d0000037d01200197000000110200002900000040022002100000037e02200197000000000121019f0000000202000039000000000012041b000000000100001900000bff0001042e000003140020009c000004f80000613d000003150020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000201000039000000000101041a0000000801100270000002b00000013d000003310020009c000005140000613d000003320020009c000005810000c13d000000640030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000402100370000000000502043b000000ff0050008c000005810000213d0000002402100370000000000302043b000000ff0030008c000005810000213d0000004401100370000000000101043b000000ff0010008c000005810000213d0000030502000041000000000202041a0000000004000411000000000024004b000005920000c13d0000000202000039000000000402041a000000ff0640018f000000000056004b0000027a0000613d000003a104400197000000000454019f000000000042041b0000000805400270000000000535013f000000ff00500190000002830000613d000003a20440019700000008033002100000ff000330018f000000000434019f000000000042041b0000001003400270000000000313013f000000ff00300190000004f60000613d000003810340019700000010011002100000038201100197000000000113019f000000000012041b000000000100001900000bff0001042e0000031a0020009c000005440000613d0000031b0020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0bfe0bbe0000040f0000000201000039000000000201041a0000035d03200197000003470020019800000000020000190000035e02006041000000000232019f000000000021041b000000000100001900000bff0001042e000003260020009c000005660000613d000003270020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000a01000039000000800010043f0000033b0100004100000bff0001042e0000000001000416000000000001004b000005810000c13d0000000201000039000000000101041a000000ff0110018f000000800010043f0000033b0100004100000bff0001042e0000000001000416000000000001004b000005810000c13d0000000501000039000002c60000013d0000000001000416000000000001004b000005810000c13d0000030501000041000000000101041a0000030401100197000000800010043f0000033b0100004100000bff0001042e0000000001000416000000000001004b000005810000c13d0000000301000039000000000101041a000000800010043f0000033b0100004100000bff0001042e000000240030008c000005810000413d0000000402100370000000000202043b000003460020009c000005810000213d0000002304200039000000000034004b000005810000813d0000000404200039000000000141034f000000000101043b000a00000001001d000003460010009c000005810000213d000900240020003d0000000a0100002900000005011002100000000901100029000000000031004b000005810000213d0000000201000039000000000101041a0000034700100198000008190000c13d0000014001000039000000400010043f000000800000043f000000a00000043f000000c00000043f000000e00000043f000001000000043f000001200000043f0000000a0000006b000004f60000613d001000000000001d0000001001000029000000050110021000000009011000290000000001100367000000000101043b001200000001001d000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000400200043d000003490020009c0000013f0000213d000000000101043b000000c003200039000000400030043f000000000101041a000000f003100270000000ff0330018f00000080042000390000000000340435000000a004200039000003440010009c00000000030000390000000103002039000d00000004001d0000000000340435000000c80310027000000343033001970000006004200039000c00000004001d0000000000340435000000c003100270000000ff0330018f0000004004200039000e00000004001d000000000034043500000304031001970000000004320436000000a001100270000003010110019700000000001404350000000002000411001100000003001d000000000023004b0000036d0000613d000b00000004001d0000034a01000041000000000101041a000000400400043d000f00000004001d00000060024000390000034b030000410000000000320435000000800240003900000012030000290000000000320435000000000200041100000060022002100000002c0340003900000000002304350000000c024000390000034c030000410000000000320435000000110200002900000060022002100000004c034000390000000000230435000000a0024000390000000000020435000003040110019800000000020000190000034d02006041000000000212019f0000001c01400039000003010010009c000003010100804100000040011002100000000003000414000003010030009c0000030103008041000000c003300210000000000113019f0000034e011001c70bfe0bf90000040f0000000f0900002900000060031002700000030105300197000000200050008c000000200500803900000020045001900000000003490019000003580000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000003540000c13d0000001f05500190000003650000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000003a3012001670000000002090433000000010020008c000000010110c1bf000000010010019000000a9b0000c13d0000000b0100002900000000010104330000030101100197000f00000001001d000003010010009c000008390000613d0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b0000000f0110006c000007f40000413d0000000e020000290000000002020433000000ff0220018f00000e10022000c9000000000021004b0000083b0000413d0000000d010000290000000001010433000000000001004b000008410000c13d000000400200043d000f00000002001d0000035101000041000000000012043500000004012000390000000000010435000003010020009c0000030101000041000000000102401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000352011001c700000353020000410bfe0bf40000040f0000000f0a00002900000060031002700000030103300197000000200030008c00000020040000390000000004034019000000200640019000000000056a0019000003aa0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b000003a60000c13d0000001f07400190000003b70000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000100200190000008450000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000003460010009c0000013f0000213d00000001002001900000013f0000c13d000000400010043f000000200030008c000005810000413d00000000010a0433000f00000001001d0000001201000029000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000201041a00000354022001c7000000000021041b000000400300043d000003550030009c0000013f0000213d0000000c0100002900000000010104330000008002300039000000400020043f00000343011001970000004002300039000d00000002001d0000000000120435000000120100002900000342011001970000002002300039000b00000002001d000000000012043500000011010000290000000000130435000e00000003001d0000006001300039000c00000001001d00000000000104350000000f01000029000000000010043f0000000101000039000000200010043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d0000000e02000029000000000202043300000304022001970000000b030000290000000003030433000000a0033002100000035603300197000000000223019f0000000d030000290000000003030433000000d0033002100000035703300197000000000232019f0000000c030000290000000003030433000000000003004b00000358030000410000000003006019000000000232019f000000000101043b000000000021041b000000400100043d00000012020000290000000000210435000003010010009c000003010100804100000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000359011001c70000800d0200003900000002030000390000035a0400004100000011050000290bfe0bf40000040f0000000100200190000005810000613d00000010020000290000000102200039001000000002001d0000000a0020006c000002ee0000413d000004f60000013d0000033a010000410000000c0010043f0000000001000411000000000010043f0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b001200000001001d0000000001000414000003010010009c0000030101008041000000c0011002100000033e011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b0000001202000029000003850220009a000000000021041b0000000001000414000003010010009c0000030101008041000000c00110021000000306011001c70000800d0200003900000002030000390000038604000041000004f20000013d000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000402100370000000000402043b000000ff0040008c000005810000213d000000000131034f0000012002000039000000400020043f0000008003000039000000000501034f000000005605043c0000000003630436000001200030008c0000045e0000c13d000000ff03400190000005d10000613d000000020030008c000005960000613d000000010030008c000004d70000c13d000000b003000039000000a804000039000000a00500003900000098060000390000009007000039000005d60000013d000000640030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000004402100370000000000202043b0000002403100370000000000303043b0000000401100370000000000101043b0000030504000041000000000404041a0000000005000411000000000045004b000005920000c13d0000000304000039000000000504041a000000000015004b000004830000613d000000000014041b0000000401000039000000000401041a000000000034004b000004880000613d000000000031041b0000000501000039000000000301041a000000000023004b0000029d0000c13d000004f60000013d0000000001000416000000000001004b000005810000c13d0000001401000039000000800010043f0000033b0100004100000bff0001042e000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000401100370000000000101043b000000000010043f000000200000043f000000400200003900000000010000190bfe0bdf0000040f000000000101041a0000030402100197000000800020043f000000a0021002700000030102200197000000a00020043f000000c002100270000000ff0220018f000000c00020043f000000c8021002700000034302200197000000e00020043f000000f002100270000000ff0220018f000001000020043f000003440010009c00000000010000390000000101002039000001200010043f0000039a0100004100000bff0001042e000000c40030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000012002000039000000400020043f0000000402100370000000000202043b000000800020043f0000002403100370000000000303043b000000a00030043f0000004404100370000000000404043b000000c00040043f0000006405100370000000000505043b000000e00050043f0000008406100370000000000606043b000001000060043f000000a401100370000000000101043b000000ff0010008c000005810000213d0000030507000041000000000707041a0000000008000411000000000078004b000005920000c13d000000ff0110018f000000020010008c000005f40000a13d0000039801000041000000000010043f000003500100004100000c00000104300000033a010000410000000c0010043f0000000001000411000000000010043f0000000001000414000003010010009c0000030101008041000000c0011002100000033e011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000001041b0000000001000414000003010010009c0000030101008041000000c00110021000000306011001c70000800d020000390000000203000039000003800400004100000000050004110bfe0bf40000040f0000000100200190000005810000613d000000000100001900000bff0001042e000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000401100370000000000101043b000000000010043f0000000101000039000000200010043f000000400200003900000000010000190bfe0bdf0000040f000000000101041a0000030402100197000000800020043f000000a0021002700000034202200197000000a00020043f000000d0021002700000034302200197000000c00020043f000003440010009c00000000010000390000000101002039000000e00010043f000003450100004100000bff0001042e000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000402100370000000000202043b000003460020009c000005810000213d0000002304200039000000000034004b000005810000813d0000000404200039000000000141034f000000000101043b000b00000001001d000003460010009c000005810000213d000a00240020003d0000000b0100002900000005011002100000000a01100029000000000031004b000005810000213d0000000201000039000000000101041a001200000001001d0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000120200002900000040022002700000034302200197000000000021004b000006710000813d0000038401000041000000000010043f000003500100004100000c0000010430000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000402100370000000000202043b000003460020009c000005810000213d0000002304200039000000000034004b000005810000813d000b00040020003d0000000b04100360000000000404043b000f00000004001d000003460040009c000005810000213d00000024042000390000000f020000290000000502200210000a00000002001d000e00000004001d0000000002420019000000000032004b000005810000213d0000000202000039000000000202041a00000347002001980000062d0000c13d0000036801000041000000000010043f000003500100004100000c00000104300000030501000041000000000501041a0000000001000411000000000051004b000005920000c13d0000000001000414000003010010009c0000030101008041000000c00110021000000306011001c70000800d020000390000000303000039000003070400004100000000060000190bfe0bf40000040f0000000100200190000005810000613d0000030501000041000000000001041b000000000100001900000bff0001042e000000240030008c000005810000413d0000000401100370000000000101043b000003040010009c000005870000a13d000000000100001900000c00000104300000037101000041000000000010043f000003500100004100000c00000104300000030502000041000000000202041a0000000003000411000000000023004b000005920000c13d000000000001004b0000066e0000c13d0000033c01000041000000000010043f0000033d0100004100000c00000104300000039b01000041000000000010043f0000033d0100004100000c0000010430000000d803000039000000d004000039000000c805000039000000c006000039000000b807000039000005d60000013d0000001f0530018f0000030306300198000000400200043d0000000004620019000005a70000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005a30000c13d000000000005004b000005b40000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000003010020009c00000301020080410000004002200210000000000112019f00000c0000010430000000000101043b0000008002400039000000400020043f000000000101041a0000006002400039000003440010009c000000000300003900000001030020390000000000320435000000d00210027000000343022001970000004005400039000000000025043500000304021001980000000003240436000000a00210027000000342022001970000000000230435000006520000c13d0000037a01000041000000000010043f000003500100004100000c0000010430000000880300003900000080040000390000007805000039000000700600003900000068070000390000000208000039000000000808041a000001c009000039000000400090043f000000000778022f000000001901043c0000000002920436000001c00020008c000005db0000c13d000000000138022f000000000248022f000000000358022f000000000468022f000000ff0570018f000001200050043f000000ff0440018f000001400040043f000000ff0330018f000001600030043f000000ff0220018f000001800020043f000000ff0110018f000001a00010043f000001c00050043f000001e00040043f000002000030043f000002200020043f000002400010043f000003690100004100000bff0001042e000000000023001a000007f40000413d0000000007230019000000000074001a000007f40000413d0000000007740019000000000075001a000007f40000413d0000000007750019000000000076001a000007f40000413d0000000007760019000000640070008c0000065b0000c13d00000010044002100000000803300210000000000343019f0000001804500210000000000343019f0000002004600210000000000343019f000000000323019f0000000202000039000000000402041a000000000001004b000007fe0000613d000000010010008c000008020000c13d0000036b0140019700000090033002100000036c03300197000008050000013d000f00000002001d001000000003001d0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b0000000f0010006c0000001001000029000007fa0000813d0000037b01100197000000120200002900000018022002100000037c02200197000000000321019f0000000201000039000000000031041b000002280000013d0000000f0000006b000007060000c13d0000002002000039000000800020043f000000a00000043f0000000a040000290000001f0240018f000000000004004b0000063f0000613d0000000b030000290000002003300039000000000131034f00000040036000390000000004430019000000001501043c0000000003530436000000000043004b0000063b0000c13d000000000002004b0000000f020000290000006501200210000003640110009a000003650020009c0000036601008041000003010060009c00000301060080410000004002600210000000000112019f0000000002000414000003010020009c0000030102008041000000c00220021000000000012100190000800d0200003900000001030000390000036704000041000004f30000013d001000000005001d000f00000003001d000e00000004001d000003580010009c000007b00000413d0000037901000041000000000010043f000003500100004100000c00000104300000036a01000041000000000010043f000003500100004100000c00000104300000001f0530018f0000030306300198000000400200043d0000000004620019000005a70000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000006660000c13d000005a70000013d0000001001000029000000000001041b00000012010000290bfe0bc80000040f000000000100001900000bff0001042e000000400100043d000003490010009c0000013f0000213d000000c002100039000000400020043f000000a00210003900000000000204350000008002100039000000000002043500000060021000390000000000020435000000400210003900000000000204350000002002100039000000000002043500000000000104350000000b0000006b000004f60000613d0000000001000410000903040010019b001200000000001d000000120100002900000005011002100000000a011000290000000001100367000000000101043b001100000001001d000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000400400043d000003490040009c0000013f0000213d000000000101043b000000c002400039000000400020043f000000000101041a000000a002400039000003440010009c000000000300003900000001030020390000000000320435000000c802100270000003430220019700000060034000390000000000230435000000c002100270000000ff0220018f00000040034000390000000000230435000000a0021002700000030102200197000000200340003900000000002304350000030402100197001000000002001d0000000000240435000f00000004001d0000008002400039000000f001100270000000ff0110018f000e00000002001d000000000012043500000b4c0000a13d0000035f0100004100000000001004430000034b0100004100000004001004430000000001000414000003010010009c0000030101008041000000c00110021000000360011001c700008002020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000000001004b000005810000613d000000400300043d00000044013000390000001102000029000000000021043500000024013000390000001002000029000000000021043500000361010000410000000001130436000c00000001001d000000040130003900000009020000290000000000210435000003010030009c001000000003001d00000301010000410000000001034019000d0040001002180000000001000414000003010010009c0000030101008041000000c0011002100000000d011001af00000362011001c70000034b020000410bfe0bf40000040f000000010020019000000b500000613d0000001004000029000003460040009c0000000f010000290000013f0000213d000000400040043f00000000020104330000000e01000029000000000101043300000005030000390000000000340435000000ff0110018f0000000c0300002900000000001304350000000001000414000003010010009c0000030101008041000000c0011002100000000d011001af00000348011001c700000304062001970000800d020000390000000303000039000003740400004100000011050000290bfe0bf40000040f0000000100200190000005810000613d00000012020000290000000102200039001200000002001d0000000b0020006c000006860000413d000004f60000013d0000000001000410000d03040010019b0000000002000019001000000002001d00000005012002100000000e011000290000000001100367000000000101043b001200000001001d000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000101041a001103040010019b0000000001000411000000110010006b000007670000613d0000034a01000041000000000101041a000000400400043d000c00000004001d00000060024000390000034b030000410000000000320435000000800240003900000012030000290000000000320435000000000200041100000060022002100000002c0340003900000000002304350000000c024000390000034c030000410000000000320435000000110200002900000060022002100000004c034000390000000000230435000000a0024000390000000000020435000003040110019800000000020000190000034d02006041000000000212019f0000001c01400039000003010010009c000003010100804100000040011002100000000003000414000003010030009c0000030103008041000000c003300210000000000113019f0000034e011001c70bfe0bf90000040f0000000c0900002900000060031002700000030105300197000000200050008c000000200500803900000020045001900000000003490019000007540000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000007500000c13d0000001f05500190000007610000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000003a3012001670000000002090433000000010020008c000000010110c1bf000000010010019000000a9b0000c13d0000001201000029000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000001041b0000035f0100004100000000001004430000034b0100004100000004001004430000000001000414000003010010009c0000030101008041000000c00110021000000360011001c700008002020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000000001004b000005810000613d000000400300043d0000004401300039000000120200002900000000002104350000002401300039000000110200002900000000002104350000036101000041000000000013043500000004013000390000000d020000290000000000210435000003010030009c001200000003001d0000030101000041000000000103401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000362011001c70000034b020000410bfe0bf40000040f00000001002001900000081d0000613d0000001206000029000003460060009c00000010020000290000013f0000213d000000400060043f00000001022000390000000f0020006c000007090000413d000000200100003900000000011604360000000f020000290000000000210435000003630020009c000005810000213d0000000001000367000006320000013d0000001201000029000000000010043f0000000101000039000000200010043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000201041a000003440220019700000358022001c7000000000021041b000000400100043d0000004002100039000000110300002900000000003204350000004002000039000000000221043600000012030000290000000000320435000003720010009c0000013f0000213d0000006003100039000000400030043f000003010020009c000003010200804100000040022002100000000001010433000003010010009c00000301010080410000006001100210000000000121019f0000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000306011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d00000010020000290000000003020433000000ff0230018f0000034303300197000000000101043b000000641010011a0000000004000019000000000021004b000008510000413d000000080540003a000007f40000613d000000000653022f000000ff0660018f000000f70040008c0000000006002019000000000026001a00000000022600190000000004050019000007f40000413d000007e70000013d0000037301000041000000000010043f0000001101000039000000040010043f000003520100004100000c00000104300000037f01000041000000000010043f000003500100004100000c00000104300000036d0140019700000068033002100000036e03300197000008050000013d0000036f01400197000000b8033002100000037003300197000000000131019f000000000012041b000000000100001900000bff0001042e0000034700300198000008190000c13d0000000e02000029000000ff0220018f000000020020008c0000089b0000613d000000010020008c000008a20000613d000000000002004b000004d70000c13d0003000a0000003d00000003020000390000000203000039000000000303041a0000006804300270000008a80000013d0000038701000041000000000010043f000003500100004100000c000001043000000060061002700000001f0460018f0000030305600198000000400200043d0000000003520019000008290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000008250000c13d0000030106600197000000000004004b000008370000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000005b50000013d0000035c010000410000083c0000013d0000035b01000041000000000010043f0000001201000029000000040010043f000003520100004100000c00000104300000034f01000041000000000010043f000003500100004100000c00000104300000001f0530018f0000030306300198000000400200043d0000000004620019000005a70000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000084c0000c13d000005a70000013d0000000f010000290000000001010433001203420010019b00000003014002700000000101100039001100000001001d000000050010008c00000aa30000c13d0000001201000029000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000201041a0000037702200197000000000021041b0000000f0100002900000000010104330000034201100197000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000201041a000003440220019700000358022001c7000000000021041b0000000f0100002900000000010104330000034201100197000000400200043d0000000000120435000003010020009c000003010200804100000040012002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000359011001c70000800d0200003900000001030000390000037804000041000004f30000013d00000060061002700000001f0460018f0000030305600198000000400200043d0000000003520019000008290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000008960000c13d000008290000013d000300140000003d00000005020000390000000203000039000000000403041a0000001003400270000000b804400270000008a80000013d0003000f0000003d00000004020000390000000203000039000000000403041a00000008034002700000009004400270000d03430040019c00000a9f0000613d000200ff0030019400000a9f0000613d000000050000006b000004f60000613d000000000202041a000b00000002001d000103010010019b0000000001000410000c03040010019b001000000000001d0000001001000029000000050110021000000004011000290000000001100367000000000201043b000000400300043d001100000003001d000003880100004100000000001304350000000401300039001200000002001d0000000000210435000003010030009c0000030101000041000000000103401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000352011001c700000389020000410bfe0bf40000040f000000110a00002900000060031002700000030103300197000000200030008c00000020040000390000000004034019000000200640019000000000056a0019000008db0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b000008d70000c13d0000001f07400190000008e80000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000010020019000000b5d0000613d0000001f01400039000000600110018f0000000004a10019000000000014004b00000000010000390000000101004039000003460040009c0000013f0000213d00000001001001900000013f0000c13d000000400040043f000000200030008c000005810000413d00000000010a0433000000ff0110018f000000030010006c00000b690000413d0000038a010000410000000000140435000000040140003900000012020000290000000000210435000003010040009c0000030101000041000000000104401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000352011001c70000034b02000041001100000004001d0bfe0bf90000040f000000110a00002900000060031002700000030103300197000000200030008c00000020040000390000000004034019000000200640019000000000056a00190000091c0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b000009180000c13d0000001f07400190000009290000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000010020019000000b6d0000613d0000001f01400039000000600110018f0000000006a10019000003460060009c0000013f0000213d000000400060043f000000200030008c000005810000413d00000000050a0433000003040050009c001100000005001d000005810000213d0000000004000411000000000045004b000009c50000613d0000034a01000041000000000101041a00000060026000390000034b0300004100000000003204350000008002600039000000120300002900000000003204350000000c026000390000034c03000041000000000032043500000060034002100000002c02600039000900000003001d000000000032043500000060035002100000004c02600039000a00000003001d0000000000320435000000a0026000390000000000020435000003040110019800000000020000190000034d02006041000000000212019f0000038b0060009c0000038b01000041000000000106401900000040011002100000000003000414000003010030009c0000030103008041000000c003300210000000000131019f0000038c0110009a000f00000006001d0bfe0bf90000040f0000000f0900002900000060031002700000030105300197000000200050008c0000002005008039000000200450019000000000034900190000096d0000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000009690000c13d0000001f055001900000097a0000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000001090433000000010010008c00000000010000390000000101006039000000000112016f000000010010019000000a9b0000613d0000034a01000041000000000101041a000000400400043d000f00000004001d00000060024000390000038d0300004100000000003204350000002c02400039000000090300002900000000003204350000000c024000390000038e0300004100000000003204350000004c024000390000000a03000029000000000032043500000080024000390000000000020435000003040110019800000000020000190000034d02006041000000000212019f0000001c01400039000003010010009c000003010100804100000040011002100000000003000414000003010030009c0000030103008041000000c003300210000000000113019f0000038f011001c70bfe0bf90000040f0000000f0900002900000060031002700000030105300197000000200050008c000000200500803900000020045001900000000003490019000009b00000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000009ac0000c13d0000001f05500190000009bd0000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000003a3012001670000000002090433000000010020008c000000010110c1bf000000010010019000000a9b0000c13d000000400600043d0000001105000029000003490060009c0000013f0000213d000000c001600039000000400010043f00000080026000390000000e01000029000a00000002001d000000000012043500000060026000390000000d01000029000800000002001d000000000012043500000040026000390000000201000029000700000002001d000000000012043500000020026000390000000101000029000600000002001d00000000001204350000000000560435000000a001600039000900000001001d00000000000104350000001201000029000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c70000801002000039000f00000006001d0bfe0bf90000040f0000000f030000290000000100200190000005810000613d0000000002030433000003040220019700000006030000290000000003030433000000a0033002100000035403300197000000000232019f00000007030000290000000003030433000000c0033002100000039103300197000000000232019f00000008030000290000000003030433000000c8033002100000039203300197000000000232019f0000000a030000290000000003030433000000f0033002100000039303300197000000000232019f00000009030000290000000003030433000000000003004b00000358030000410000000003006019000000000232019f000000000101043b000000000021041b0000035f0100004100000000001004430000034b0100004100000004001004430000000001000414000003010010009c0000030101008041000000c00110021000000360011001c700008002020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000000001004b0000001102000029000005810000613d000000400400043d0000036101000041000000000014043500000044034000390000001201000029000a00000003001d00000000001304350000000401400039000800000001001d000000000021043500000024024000390000000c01000029000700000002001d0000000000120435000003010040009c000f00000004001d0000030101000041000000000104401900090040001002180000000001000414000003010010009c0000030101008041000000c00110021000000009011001af00000362011001c70000034b020000410bfe0bf40000040f000000010020019000000b790000613d0000000f03000029000003460030009c00000011020000290000013f0000213d000000400030043f00000361010000410000000000130435000000080100002900000000002104350000000c01000029000000070200002900000000001204350000000b010000290000000a0200002900000000001204350000000001000414000003010010009c0000030101008041000000c00110021000000009011001af00000362011001c70000038d020000410bfe0bf40000040f0000000f0a00002900000060031002700000030103300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000a5d0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000a590000c13d0000001f0740019000000a6a0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000010020019000000b860000613d0000001f01400039000000600110018f0000000001a10019000003460010009c00000011050000290000013f0000213d000000400010043f000000200030008c000005810000413d00000000020a0433000000000002004b0000000003000039000000010300c039000000000032004b000005810000c13d00000060021000390000000e03000029000000000032043500000040021000390000000d03000029000000000032043500000020021000390000000b03000029000000000032043500000012020000290000000000210435000003010010009c000003010100804100000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000394011001c70000800d02000039000000020300003900000395040000410bfe0bf40000040f0000000100200190000005810000613d00000010020000290000000102200039001000000002001d000000050020006c000008b40000413d000004f60000013d0000039001000041000000000010043f000003500100004100000c00000104300000039701000041000000000010043f000003500100004100000c00000104300000000e010000290000000001010433001000000001001d0000001201000029000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000101041a000000f001100270000000ff0110018f000000400200043d0000002003200039000000000013043500000011010000290000000000120435000003010020009c000003010200804100000040012002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f0000001002000029000003040620019700000348011001c70000800d020000390000000303000039000003740400004100000012050000290bfe0bf40000040f0000000100200190000005810000613d0000000f0100002900000000010104330000034201100197000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000001041b0000000e010000290000000001010433001200000001001d0000000f010000290000000001010433001000000001001d0000035f0100004100000000001004430000034b0100004100000004001004430000000001000414000003010010009c0000030101008041000000c00110021000000360011001c700008002020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000000001004b000005810000613d0000001001000029000003420110019700000012020000290000030402200197000000400400043d000000440340003900000000001304350000002401400039000000000021043500000361010000410000000000140435000000040140003900000000020004100000000000210435000003010040009c001200000004001d0000030101000041000000000104401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000362011001c70000034b020000410bfe0bf40000040f000000010020019000000b920000613d0000001201000029000003460010009c0000000e010000290000013f0000213d0000001202000029000000400020043f0000000001010433001200000001001d0000035f010000410000000000100443000003750100004100000004001004430000000001000414000003010010009c0000030101008041000000c00110021000000360011001c700008002020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000000001004b000005810000613d00000012010000290000030401100197000000400400043d0000004402400039000000010300003900000000003204350000002402400039000000110300002900000000003204350000037602000041000000000024043500000004024000390000000000120435000003010040009c001200000004001d0000030101000041000000000104401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000362011001c700000375020000410bfe0bf40000040f000000010020019000000b9f0000613d0000001201000029000003460010009c0000013f0000213d0000001201000029000000400010043f000000000100001900000bff0001042e000000000001042f0000038301000041000000000010043f000003500100004100000c000001043000000060061002700000001f0460018f0000030305600198000000400200043d0000000003520019000008290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00000b580000c13d000008290000013d0000001f0530018f0000030306300198000000400200043d0000000004620019000005a70000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b640000c13d000005a70000013d0000039601000041000000000010043f000003500100004100000c00000104300000001f0530018f0000030306300198000000400200043d0000000004620019000005a70000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b740000c13d000005a70000013d00000060061002700000001f0460018f0000030305600198000000400200043d0000000003520019000008290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00000b810000c13d000008290000013d0000001f0530018f0000030306300198000000400200043d0000000004620019000005a70000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b8d0000c13d000005a70000013d00000060061002700000001f0460018f0000030305600198000000400200043d0000000003520019000008290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00000b9a0000c13d000008290000013d00000060061002700000001f0460018f0000030305600198000000400200043d0000000003520019000008290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00000ba70000c13d000008290000013d0000001f02200039000003a4022001970000000001120019000000000021004b00000000020000390000000102004039000003460010009c00000bb80000213d000000010020019000000bb80000c13d000000400010043f000000000001042d0000037301000041000000000010043f0000004101000039000000040010043f000003520100004100000c00000104300000030501000041000000000101041a0000000002000411000000000012004b00000bc40000c13d000000000001042d0000039b01000041000000000010043f0000033d0100004100000c000001043000010000000000020000030502000041000000000502041a00000000020004140000030406100197000003010020009c0000030102008041000000c00120021000000306011001c70000800d0200003900000003030000390000030704000041000100000006001d0bfe0bf40000040f000000010020019000000bdc0000613d00000305010000410000000102000029000000000021041b000000000001042d000000000100001900000c0000010430000000000001042f000003010010009c00000301010080410000004001100210000003010020009c00000301020080410000006002200210000000000112019f0000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000306011001c700008010020000390bfe0bf90000040f000000010020019000000bf20000613d000000000101043b000000000001042d000000000100001900000c000001043000000bf7002104210000000102000039000000000001042d0000000002000019000000000001042d00000bfc002104230000000102000039000000000001042d0000000002000019000000000001042d00000bfe0000043200000bff0001042e00000c000001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392702000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e000000000000000000000000000000000000000ffffffffffffffffffff0000000000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000008da5cb5a00000000000000000000000000000000000000000000000000000000c63db6bc00000000000000000000000000000000000000000000000000000000e7cf5c3e00000000000000000000000000000000000000000000000000000000f2fde38a00000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000fa32c22500000000000000000000000000000000000000000000000000000000fee81cf400000000000000000000000000000000000000000000000000000000e7cf5c3f00000000000000000000000000000000000000000000000000000000f04e283e00000000000000000000000000000000000000000000000000000000d845a4b200000000000000000000000000000000000000000000000000000000d845a4b300000000000000000000000000000000000000000000000000000000d9801d0200000000000000000000000000000000000000000000000000000000c63db6bd00000000000000000000000000000000000000000000000000000000d58fe1a9000000000000000000000000000000000000000000000000000000009ecd177800000000000000000000000000000000000000000000000000000000bf0e5b9400000000000000000000000000000000000000000000000000000000bf0e5b9500000000000000000000000000000000000000000000000000000000c4ae3168000000000000000000000000000000000000000000000000000000009ecd177900000000000000000000000000000000000000000000000000000000b187bd2600000000000000000000000000000000000000000000000000000000900ac86e00000000000000000000000000000000000000000000000000000000900ac86f00000000000000000000000000000000000000000000000000000000922c3dc6000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000008f561acc0000000000000000000000000000000000000000000000000000000036d3d35400000000000000000000000000000000000000000000000000000000600b269a00000000000000000000000000000000000000000000000000000000715018a500000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000008765431500000000000000000000000000000000000000000000000000000000600b269b000000000000000000000000000000000000000000000000000000006b1d4b730000000000000000000000000000000000000000000000000000000054d1f13c0000000000000000000000000000000000000000000000000000000054d1f13d0000000000000000000000000000000000000000000000000000000056d49d4d0000000000000000000000000000000000000000000000000000000036d3d355000000000000000000000000000000000000000000000000000000004ccabce80000000000000000000000000000000000000000000000000000000025692961000000000000000000000000000000000000000000000000000000002e48af04000000000000000000000000000000000000000000000000000000002e48af05000000000000000000000000000000000000000000000000000000003146afb80000000000000000000000000000000000000000000000000000000025692962000000000000000000000000000000000000000000000000000000002ae9b92f000000000000000000000000000000000000000000000000000000001e7e0658000000000000000000000000000000000000000000000000000000001e7e06590000000000000000000000000000000000000000000000000000000022b46e42000000000000000000000000000000000000000000000000000000000c08f561000000000000000000000000000000000000000000000000000000001ac3ddeb00000000000000000000000000000000000000000000000000000000389a75e10000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000000000007448fbae00000000000000000000000000000000000000040000001c000000000000000002000000000000000000000000000000000000200000000c0000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000006f5e88180000000000000000000000000000000000000000000000000000ffffffffffff000000000000000000000000000000000000000000000000000000ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000080000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff000000ff000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f04ecb0522ab37ca0b278a89c6884dfdbcde83c177150fc939ab02e069068bdef0000000000000000000000007c47ea32fd27d1a74fc6e9f31ce8162e6ce070eb00000000000000000000000000000000b9f368740000000000000000000000000000000000000000000000000000000059a24eb229eed07ac44229db56c5d79700000000000000000000000000000000000000a4000000000000000000000000398c2f8d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000e3914472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000bdc8b6eb1840215a22fc1134046f595b7d42c2de0000000000000000ffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f000000000000ffffffffffff000000000000000000000000000000000000000000ffffffffff000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000020000000000000000000000000828764c21e74c28710e19919735825aba966621c95cbd913f8ed65a2d298f48c100457d1000000000000000000000000000000000000000000000000000000008bb622df00000000000000000000000000000000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000001000000000000000000000000000000000000000000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdffffffffffffffffffffffffffffffffffffc00000000000000000000000000000000000000000000000000000000000000000000000000000000007fffffe02000000000000000000000000000000ffffffff000000000000000000000000d9c5497a30353b28bf488a3294eccc71a7ff8a5987d7661a375cfa45f36e6304a45f47fd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000001c00000000000000000d9115c9900000000000000000000000000000000000000000000000000000000ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff0000000000000000000000000000ffffffffff00000000000000000000000000ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff000000000000000000000000000000000000000000000082b4290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f4e487b7100000000000000000000000000000000000000000000000000000000873410c46aa8a6fe816a84b97786814582c2255f6e7595f576a0e7f31677a073000000000000000000000000b5ec907d0e80f9a1ca9c1942d69fb558e01140d4156e29f600000000000000000000000000000000000000000000000000000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffa9fe216aa4cb184f064a3f32d75e5d26ad2e159e070218c325ae228c82fc88304a4117f900000000000000000000000000000000000000000000000000000000f9fbb6c000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff000000000000000000000000000000000000000000000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff00000000000000000000000000000000000000ffffffffff00000000000000003d693ada00000000000000000000000000000000000000000000000000000000fa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff0000000000000000000000000000000000000000000000000000000000ff0000343a7f89000000000000000000000000000000000000000000000000000000007221b37b00000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d00dbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d9e87fac800000000000000000000000000000000000000000000000000000000f3388ee30000000000000000000000000000000000000000000000000000000000000000000000000000000006d7ee1d50828ca96e11890a1601f6fe61f1e5846352211e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe3ffffffffffffffffffffffffffffffffffffff5bffffffe4000000000000000000000000000000000000000033ee11ce309854a45b65368c078616abcb5c6e3d000000000000000000000000000000008988eea90000000000000000000000000000000000000000000000000000000000000084000000000000000000000000eab52f840000000000000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000ffffffffff0000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000080000000000000000000000000492fb617aa0beefaf90753cefe981e45c21bf4d879116af6c361798d8589dc218858011300000000000000000000000000000000000000000000000000000000b0f9b99500000000000000000000000000000000000000000000000000000000eb0831bd00000000000000000000000000000000000000000000000000000000e0bbc9fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000008000000000000000000000000000000000000000000000000000000000000000000000000082b4290070a08231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000800000000000000000a9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004400000000000000000000000042966c6800000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000001356c7f2e9bcc442f4edb13333e3eb7e37cf6a88bb1506a03910fb0fb833d6e0

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

0000000000000000000000001b2c84dd7957b1e207cd7b01ded77984ec16fdef

-----Decoded View---------------
Arg [0] : _owner (address): 0x1B2C84dd7957b1e207Cd7b01Ded77984eC16fDEf

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001b2c84dd7957b1e207cd7b01ded77984ec16fdef


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  ]
[ 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.