APE Price: $0.58 (+5.85%)

Contract

0x133E11c20240d2aB1F6C8ca57eE132728EDe3104

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo0 APE

APE Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Parent Transaction Hash Block From To
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PrimapePrediction

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license
/**
 *Submitted for verification at apescan.io on 2024-12-13
*/

// File: @thirdweb-dev/contracts/extension/interface/IOwnable.sol


pragma solidity ^0.8.0;

/// @author thirdweb

/**
 *  Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading
 *  who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses
 *  information about who the contract's owner is.
 */

interface IOwnable {
    /// @dev Returns the owner of the contract.
    function owner() external view returns (address);

    /// @dev Lets a module admin set a new owner for the contract. The new owner must be a module admin.
    function setOwner(address _newOwner) external;

    /// @dev Emitted when a new Owner is set.
    event OwnerUpdated(address indexed prevOwner, address indexed newOwner);
}

// File: @thirdweb-dev/contracts/extension/Ownable.sol


pragma solidity ^0.8.0;

/// @author thirdweb


/**
 *  @title   Ownable
 *  @notice  Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading
 *           who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses
 *           information about who the contract's owner is.
 */

abstract contract Ownable is IOwnable {
    /// @dev The sender is not authorized to perform the action
    error OwnableUnauthorized();

    /// @dev Owner of the contract (purpose: OpenSea compatibility)
    address private _owner;

    /// @dev Reverts if caller is not the owner.
    modifier onlyOwner() {
        if (msg.sender != _owner) {
            revert OwnableUnauthorized();
        }
        _;
    }

    /**
     *  @notice Returns the owner of the contract.
     */
    function owner() public view override returns (address) {
        return _owner;
    }

    /**
     *  @notice Lets an authorized wallet set a new owner for the contract.
     *  @param _newOwner The address to set as the new owner of the contract.
     */
    function setOwner(address _newOwner) external override {
        if (!_canSetOwner()) {
            revert OwnableUnauthorized();
        }
        _setupOwner(_newOwner);
    }

    /// @dev Lets a contract admin set a new owner for the contract. The new owner must be a contract admin.
    function _setupOwner(address _newOwner) internal {
        address _prevOwner = _owner;
        _owner = _newOwner;

        emit OwnerUpdated(_prevOwner, _newOwner);
    }

    /// @dev Returns whether owner can be set in the given execution context.
    function _canSetOwner() internal view virtual returns (bool);
}

// File: @thirdweb-dev/contracts/external-deps/openzeppelin/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

// File: contracts/PrimapePredictions.sol


pragma solidity ^0.8.26;



/**
 * @title PrimapePredictionNativeWithFee
 * @dev A multi-outcome prediction market that uses the chain's native token for betting.
 *      Allows for early resolution and includes a platform fee adjustable by the owner.
 */
contract PrimapePrediction is Ownable, ReentrancyGuard {
    struct Market {
        string question;
        uint256 endTime;
        bool resolved;
        uint256 winningOptionIndex; // If unresolved, set to type(uint256).max
    }

    uint256 public marketCount;
    mapping(uint256 => Market) public markets;

    // Market outcomes
    mapping(uint256 => string[]) public marketOptions;

    // Total shares per option: marketId => optionIndex => total amount staked
    mapping(uint256 => mapping(uint256 => uint256)) public totalSharesPerOption;

    // User shares per option: marketId => user => optionIndex => shares
    mapping(uint256 => mapping(address => mapping(uint256 => uint256))) public userSharesPerOption;

    // Track if a user has claimed winnings: marketId => user => bool
    mapping(uint256 => mapping(address => bool)) public hasClaimed;

    // Fee in basis points (BPS). 1% = 100 BPS, 0.5% = 50 BPS, etc.
    uint256 public feeBps = 100; // Default 1% fee

    // Accumulated platform fees
    uint256 public platformBalance;

    /// @notice Emitted when a new market is created.
    event MarketCreated(
        uint256 indexed marketId,
        string question,
        string[] options,
        uint256 endTime
    );

    /// @notice Emitted when shares are purchased in a market.
    event SharesPurchased(
        uint256 indexed marketId,
        address indexed buyer,
        uint256 optionIndex,
        uint256 amount
    );

    /// @notice Emitted when a market is resolved with a winning option.
    event MarketResolved(uint256 indexed marketId, uint256 winningOptionIndex);

    /// @notice Emitted when winnings are claimed by a user.
    event Claimed(uint256 indexed marketId, address indexed user, uint256 amount);

    /// @notice Emitted when the platform fee BPS is updated.
    event FeeUpdated(uint256 newFeeBps);

    /// @notice Emitted when platform fees are withdrawn.
    event FeesWithdrawn(uint256 amount, address indexed recipient);

    constructor() {
        _setupOwner(msg.sender);
    }

    /**
     * @dev Required override for Ownable extension.
     * @return True if the caller is the contract owner.
     */
    function _canSetOwner() internal view virtual override returns (bool) {
        return msg.sender == owner();
    }

    /**
     * @notice Creates a new prediction market with multiple outcomes.
     * @param _question The question/prompt for the market.
     * @param _options Array of outcome strings.
     * @param _duration Duration in seconds for which the market is active.
     * @return marketId ID of the newly created market.
     */
    function createMarket(
        string memory _question,
        string[] memory _options,
        uint256 _duration
    ) external returns (uint256) {
        require(msg.sender == owner(), "Only owner can create markets");
        require(_duration > 0, "Duration must be positive");
        require(_options.length >= 2, "At least two outcomes required");

        uint256 marketId = marketCount++;
        Market storage market = markets[marketId];

        market.question = _question;
        market.endTime = block.timestamp + _duration;
        market.resolved = false;
        market.winningOptionIndex = type(uint256).max; // unresolved

        for (uint256 i = 0; i < _options.length; i++) {
            marketOptions[marketId].push(_options[i]);
        }

        emit MarketCreated(marketId, _question, _options, market.endTime);
        return marketId;
    }

    /**
     * @notice Buy shares in a specific option of a market using native token.
     * @param _marketId The ID of the market.
     * @param _optionIndex The index of the chosen outcome.
     */
    function buyShares(
        uint256 _marketId,
        uint256 _optionIndex
    ) external payable {
        Market storage market = markets[_marketId];
        require(block.timestamp < market.endTime, "Market trading period ended");
        require(!market.resolved, "Market already resolved");
        require(_optionIndex < marketOptions[_marketId].length, "Invalid option");
        require(msg.value > 0, "No funds sent");

        // Calculate fee and net amount
        uint256 feeAmount = (msg.value * feeBps) / 10000;
        uint256 netAmount = msg.value - feeAmount;
        
        platformBalance += feeAmount;

        userSharesPerOption[_marketId][msg.sender][_optionIndex] += netAmount;
        totalSharesPerOption[_marketId][_optionIndex] += netAmount;

        emit SharesPurchased(_marketId, msg.sender, _optionIndex, netAmount);
    }

    /**
     * @notice Resolve a market by specifying the winning option.
     * @dev Owner can resolve early, no time check is enforced.
     * @param _marketId The ID of the market to resolve.
     * @param _winningOptionIndex The index of the winning outcome.
     */
    function resolveMarket(
        uint256 _marketId,
        uint256 _winningOptionIndex
    ) external {
        require(msg.sender == owner(), "Only owner can resolve");
        Market storage market = markets[_marketId];
        require(!market.resolved, "Already resolved");
        require(_winningOptionIndex < marketOptions[_marketId].length, "Invalid outcome");

        // Early resolution allowed. No requirement on block.timestamp.
        market.winningOptionIndex = _winningOptionIndex;
        market.resolved = true;

        emit MarketResolved(_marketId, _winningOptionIndex);
    }

    /**
     * @notice Claim winnings after a market is resolved.
     * @param _marketId The ID of the market.
     */
    function claimWinnings(uint256 _marketId) external nonReentrant {
        Market storage market = markets[_marketId];
        require(market.resolved, "Market not resolved");
        require(!hasClaimed[_marketId][msg.sender], "Already claimed");

        uint256 winningOption = market.winningOptionIndex;
        uint256 userShares = userSharesPerOption[_marketId][msg.sender][winningOption];
        require(userShares > 0, "No winnings");

        uint256 winningShares = totalSharesPerOption[_marketId][winningOption];
        uint256 losingShares;
        uint256 optionCount = marketOptions[_marketId].length;

        for (uint256 i = 0; i < optionCount; i++) {
            if (i != winningOption) {
                losingShares += totalSharesPerOption[_marketId][i];
            }
        }

        // Calculate user's winnings: original stake + proportional share of losing pool
        uint256 rewardRatio = 0;
        if (winningShares > 0) {
            rewardRatio = (losingShares * 1e18) / winningShares;
        }
        uint256 winnings = userShares + (userShares * rewardRatio) / 1e18;

        // Reset user shares and mark claimed
        userSharesPerOption[_marketId][msg.sender][winningOption] = 0;
        hasClaimed[_marketId][msg.sender] = true;

        (bool success, ) = payable(msg.sender).call{value: winnings}("");
        require(success, "Transfer failed");

        emit Claimed(_marketId, msg.sender, winnings);
    }

    /**
     * @notice Batch claim winnings for multiple users.
     * @param _marketId The ID of the market.
     * @param _users The array of user addresses to claim for.
     */
    function batchClaimWinnings(
        uint256 _marketId,
        address[] calldata _users
    ) external nonReentrant {
        Market storage market = markets[_marketId];
        require(market.resolved, "Market not resolved yet");

        uint256 winningOption = market.winningOptionIndex;
        uint256 winningShares = totalSharesPerOption[_marketId][winningOption];
        uint256 losingShares;
        uint256 optionCount = marketOptions[_marketId].length;

        for (uint256 i = 0; i < optionCount; i++) {
            if (i != winningOption) {
                losingShares += totalSharesPerOption[_marketId][i];
            }
        }

        uint256 rewardRatio = 0;
        if (winningShares > 0) {
            rewardRatio = (losingShares * 1e18) / winningShares;
        }

        for (uint256 i = 0; i < _users.length; i++) {
            address user = _users[i];
            if (hasClaimed[_marketId][user]) {
                continue;
            }

            uint256 userShares = userSharesPerOption[_marketId][user][winningOption];
            if (userShares == 0) {
                continue;
            }

            uint256 winnings = userShares + (userShares * rewardRatio) / 1e18;

            hasClaimed[_marketId][user] = true;
            userSharesPerOption[_marketId][user][winningOption] = 0;

            (bool success, ) = payable(user).call{value: winnings}("");
            require(success, "Transfer failed");
            emit Claimed(_marketId, user, winnings);
        }
    }

    /**
     * @notice Get the basic info of a market.
     * @param _marketId The ID of the market.
     * @return question The market's question.
     * @return endTime The market's end time.
     * @return resolved Whether the market has been resolved.
     * @return winningOptionIndex The index of the winning option (or max uint if unresolved).
     */
    function getMarketInfo(
        uint256 _marketId
    )
        external
        view
        returns (
            string memory question,
            uint256 endTime,
            bool resolved,
            uint256 winningOptionIndex
        )
    {
        Market storage market = markets[_marketId];
        return (
            market.question,
            market.endTime,
            market.resolved,
            market.winningOptionIndex
        );
    }

    /**
     * @notice Get the options of a market.
     * @param _marketId The ID of the market.
     * @return An array of outcome option strings.
     */
    function getMarketOptions(uint256 _marketId) external view returns (string[] memory) {
        string[] memory opts = new string[](marketOptions[_marketId].length);
        for (uint256 i = 0; i < marketOptions[_marketId].length; i++) {
            opts[i] = marketOptions[_marketId][i];
        }
        return opts;
    }

    /**
     * @notice Get user shares for each option in a market.
     * @param _marketId The ID of the market.
     * @param _user The user address.
     * @return balances Array of user shares per option.
     */
    function getUserShares(
        uint256 _marketId,
        address _user
    ) external view returns (uint256[] memory balances) {
        uint256 optionCount = marketOptions[_marketId].length;
        balances = new uint256[](optionCount);
        for (uint256 i = 0; i < optionCount; i++) {
            balances[i] = userSharesPerOption[_marketId][_user][i];
        }
    }

    /**
     * @notice Update the fee in basis points.
     * @param _feeBps The new fee in basis points. For example, 100 = 1%.
     */
    function setFeeBps(uint256 _feeBps) external onlyOwner {
        require(_feeBps <= 1000, "Fee too high"); // max 10%
        feeBps = _feeBps;
        emit FeeUpdated(_feeBps);
    }

    /**
     * @notice Owner can withdraw accumulated platform fees.
     * @param _recipient The address to receive the withdrawn fees.
     * @param _amount The amount of fees to withdraw (in wei).
     */
    function withdrawFees(address payable _recipient, uint256 _amount) external onlyOwner nonReentrant {
        require(_amount <= platformBalance, "Not enough fees");
        platformBalance -= _amount;

        (bool success, ) = _recipient.call{value: _amount}("");
        require(success, "Withdraw failed");

        emit FeesWithdrawn(_amount, _recipient);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"OwnableUnauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFeeBps","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"FeesWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"string","name":"question","type":"string"},{"indexed":false,"internalType":"string[]","name":"options","type":"string[]"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"MarketCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winningOptionIndex","type":"uint256"}],"name":"MarketResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"prevOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"optionIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SharesPurchased","type":"event"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"},{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"batchClaimWinnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"},{"internalType":"uint256","name":"_optionIndex","type":"uint256"}],"name":"buyShares","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"claimWinnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_question","type":"string"},{"internalType":"string[]","name":"_options","type":"string[]"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"createMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"getMarketInfo","outputs":[{"internalType":"string","name":"question","type":"string"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bool","name":"resolved","type":"bool"},{"internalType":"uint256","name":"winningOptionIndex","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"getMarketOptions","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getUserShares","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketOptions","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"markets","outputs":[{"internalType":"string","name":"question","type":"string"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bool","name":"resolved","type":"bool"},{"internalType":"uint256","name":"winningOptionIndex","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"},{"internalType":"uint256","name":"_winningOptionIndex","type":"uint256"}],"name":"resolveMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeBps","type":"uint256"}],"name":"setFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalSharesPerOption","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userSharesPerOption","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260646008553480156013575f80fd5b5060018055601f336023565b6072565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a35050565b611d9c8061007f5f395ff3fe60806040526004361061011b575f3560e01c806372c27b621161009d578063ad3b1b4711610062578063ad3b1b4714610391578063b1283e77146103b0578063beebc5da146103cf578063ec979082146103e2578063fbc529cb146103f7575f80fd5b806372c27b621461029b578063835dc40b146102ba578063873f6f9e146102e65780638da5cb5b1461032f578063ad2b69bc14610355575f80fd5b80633ec79193116100e35780633ec79193146101e357806356d3340414610212578063605573331461024857806362a5dbbc14610267578063677bd9ff1461027c575f80fd5b806305d45d5f1461011f57806313af40351461015457806324a9d8531461017557806327536b28146101985780633bdfa982146101b7575b5f80fd5b34801561012a575f80fd5b5061013e6101393660046116d8565b610416565b60405161014b9190611777565b60405180910390f35b34801561015f575f80fd5b5061017361016e3660046117a4565b610567565b005b348015610180575f80fd5b5061018a60085481565b60405190815260200161014b565b3480156101a3575f80fd5b506101736101b23660046117bf565b61059d565b3480156101c2575f80fd5b506101d66101d1366004611839565b61090c565b60405161014b9190611859565b3480156101ee575f80fd5b506102026101fd3660046116d8565b6109bd565b60405161014b949392919061186b565b34801561021d575f80fd5b5061018a61022c366004611839565b600560209081525f928352604080842090915290825290205481565b348015610253575f80fd5b50610173610262366004611839565b610a87565b348015610272575f80fd5b5061018a60095481565b348015610287575f80fd5b506101736102963660046116d8565b610bd3565b3480156102a6575f80fd5b506101736102b53660046116d8565b610ed4565b3480156102c5575f80fd5b506102d96102d4366004611899565b610f7a565b60405161014b91906118c7565b3480156102f1575f80fd5b5061031f610300366004611899565b600760209081525f928352604080842090915290825290205460ff1681565b604051901515815260200161014b565b34801561033a575f80fd5b505f546040516001600160a01b03909116815260200161014b565b348015610360575f80fd5b5061018a61036f366004611909565b600660209081525f938452604080852082529284528284209052825290205481565b34801561039c575f80fd5b506101736103ab36600461193e565b611033565b3480156103bb575f80fd5b506102026103ca3660046116d8565b6111ba565b6101736103dd366004611839565b61126d565b3480156103ed575f80fd5b5061018a60025481565b348015610402575f80fd5b5061018a610411366004611a19565b611495565b5f818152600460205260408120546060919067ffffffffffffffff81111561044057610440611968565b60405190808252806020026020018201604052801561047357816020015b606081526020019060019003908161045e5790505b5090505f5b5f84815260046020526040902054811015610560575f8481526004602052604090208054829081106104ac576104ac611b19565b905f5260205f200180546104bf90611b2d565b80601f01602080910402602001604051908101604052809291908181526020018280546104eb90611b2d565b80156105365780601f1061050d57610100808354040283529160200191610536565b820191905f5260205f20905b81548152906001019060200180831161051957829003601f168201915b505050505082828151811061054d5761054d611b19565b6020908102919091010152600101610478565b5092915050565b5f546001600160a01b03163314610591576040516316ccb9cb60e11b815260040160405180910390fd5b61059a81611689565b50565b6002600154036105c85760405162461bcd60e51b81526004016105bf90611b65565b60405180910390fd5b600260018190555f8481526003602052604090209081015460ff1661062f5760405162461bcd60e51b815260206004820152601760248201527f4d61726b6574206e6f74207265736f6c7665642079657400000000000000000060448201526064016105bf565b60038101545f8581526005602090815260408083208484528252808320548884526004909252822054909190815b8181101561069a57848114610692575f89815260056020908152604080832084845290915290205461068f9084611bb0565b92505b60010161065d565b505f83156106c257836106b584670de0b6b3a7640000611bc9565b6106bf9190611be0565b90505b5f5b878110156108fc575f8989838181106106df576106df611b19565b90506020020160208101906106f491906117a4565b5f8c81526007602090815260408083206001600160a01b038516845290915290205490915060ff161561072757506108f4565b5f8b81526006602090815260408083206001600160a01b038516845282528083208a8452909152812054908190036107605750506108f4565b5f670de0b6b3a76400006107748684611bc9565b61077e9190611be0565b6107889083611bb0565b9050600160075f8f81526020019081526020015f205f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60065f8f81526020019081526020015f205f856001600160a01b03166001600160a01b031681526020019081526020015f205f8b81526020019081526020015f20819055505f836001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610863576040519150601f19603f3d011682016040523d82523d5f602084013e610868565b606091505b50509050806108ab5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016105bf565b836001600160a01b03168e7f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed026846040516108e791815260200190565b60405180910390a3505050505b6001016106c4565b5050600180555050505050505050565b6004602052815f5260405f208181548110610925575f80fd5b905f5260205f20015f9150915050805461093e90611b2d565b80601f016020809104026020016040519081016040528092919081815260200182805461096a90611b2d565b80156109b55780601f1061098c576101008083540402835291602001916109b5565b820191905f5260205f20905b81548152906001019060200180831161099857829003601f168201915b505050505081565b5f818152600360208190526040822060018101546002820154928201548254606095948594859490938493919260ff169184906109f990611b2d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2590611b2d565b8015610a705780601f10610a4757610100808354040283529160200191610a70565b820191905f5260205f20905b815481529060010190602001808311610a5357829003601f168201915b505050505093509450945094509450509193509193565b5f546001600160a01b03163314610ad95760405162461bcd60e51b81526020600482015260166024820152754f6e6c79206f776e65722063616e207265736f6c766560501b60448201526064016105bf565b5f828152600360205260409020600281015460ff1615610b2e5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c995cdbdb1d995960821b60448201526064016105bf565b5f838152600460205260409020548210610b7c5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206f7574636f6d6560881b60448201526064016105bf565b6003810182905560028101805460ff1916600117905560405183907f6dfc24f0f2fb42e49fb4fa3ffa8abb148cab908a1fb8335b3f128a08b2594af190610bc69085815260200190565b60405180910390a2505050565b600260015403610bf55760405162461bcd60e51b81526004016105bf90611b65565b600260018190555f8281526003602052604090209081015460ff16610c525760405162461bcd60e51b815260206004820152601360248201527213585c9ad95d081b9bdd081c995cdbdb1d9959606a1b60448201526064016105bf565b5f82815260076020908152604080832033845290915290205460ff1615610cad5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016105bf565b60038101545f838152600660209081526040808320338452825280832084845290915290205480610d0e5760405162461bcd60e51b815260206004820152600b60248201526a4e6f2077696e6e696e677360a81b60448201526064016105bf565b5f8481526005602090815260408083208584528252808320548784526004909252822054909190815b81811015610d7457858114610d6c575f888152600560209081526040808320848452909152902054610d699084611bb0565b92505b600101610d37565b505f8315610d9c5783610d8f84670de0b6b3a7640000611bc9565b610d999190611be0565b90505b5f670de0b6b3a7640000610db08388611bc9565b610dba9190611be0565b610dc49087611bb0565b5f8a8152600660209081526040808320338085529083528184208c855283528184208490558d845260078352818420818552909252808320805460ff1916600117905551929350909183908381818185875af1925050503d805f8114610e45576040519150601f19603f3d011682016040523d82523d5f602084013e610e4a565b606091505b5050905080610e8d5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016105bf565b60405182815233908b907f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed0269060200160405180910390a35050600180555050505050505050565b5f546001600160a01b03163314610efe576040516316ccb9cb60e11b815260040160405180910390fd5b6103e8811115610f3f5760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b60448201526064016105bf565b60088190556040518181527f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c769060200160405180910390a150565b5f828152600460205260409020546060908067ffffffffffffffff811115610fa457610fa4611968565b604051908082528060200260200182016040528015610fcd578160200160208202803683370190505b5091505f5b8181101561102b575f8581526006602090815260408083206001600160a01b03881684528252808320848452909152902054835184908390811061101857611018611b19565b6020908102919091010152600101610fd2565b505092915050565b5f546001600160a01b0316331461105d576040516316ccb9cb60e11b815260040160405180910390fd5b60026001540361107f5760405162461bcd60e51b81526004016105bf90611b65565b60026001556009548111156110c85760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768206665657360881b60448201526064016105bf565b8060095f8282546110d99190611bff565b90915550506040515f906001600160a01b0384169083908381818185875af1925050503d805f8114611126576040519150601f19603f3d011682016040523d82523d5f602084013e61112b565b606091505b505090508061116e5760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b60448201526064016105bf565b826001600160a01b03167f812bcf6853ebc81dc0a1d2323893eedad6cd086a4398311a699e0a7acdf187b3836040516111a991815260200190565b60405180910390a250506001805550565b60036020525f90815260409020805481906111d490611b2d565b80601f016020809104026020016040519081016040528092919081815260200182805461120090611b2d565b801561124b5780601f106112225761010080835404028352916020019161124b565b820191905f5260205f20905b81548152906001019060200180831161122e57829003601f168201915b50505050600183015460028401546003909401549293909260ff909116915084565b5f828152600360205260409020600181015442106112cd5760405162461bcd60e51b815260206004820152601b60248201527f4d61726b65742074726164696e6720706572696f6420656e646564000000000060448201526064016105bf565b600281015460ff16156113225760405162461bcd60e51b815260206004820152601760248201527f4d61726b657420616c7265616479207265736f6c76656400000000000000000060448201526064016105bf565b5f83815260046020526040902054821061136f5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21037b83a34b7b760911b60448201526064016105bf565b5f34116113ae5760405162461bcd60e51b815260206004820152600d60248201526c139bc8199d5b991cc81cd95b9d609a1b60448201526064016105bf565b5f612710600854346113c09190611bc9565b6113ca9190611be0565b90505f6113d78234611bff565b90508160095f8282546113ea9190611bb0565b90915550505f85815260066020908152604080832033845282528083208784529091528120805483929061141f908490611bb0565b90915550505f8581526005602090815260408083208784529091528120805483929061144c908490611bb0565b90915550506040805185815260208101839052339187917fce81571c08c76465bdf390ad1abe80af8c51c6c4566e3485f9395f13d5ad6328910160405180910390a35050505050565b5f80546001600160a01b031633146114ef5760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79206f776e65722063616e20637265617465206d61726b65747300000060448201526064016105bf565b5f821161153e5760405162461bcd60e51b815260206004820152601960248201527f4475726174696f6e206d75737420626520706f7369746976650000000000000060448201526064016105bf565b6002835110156115905760405162461bcd60e51b815260206004820152601e60248201527f4174206c656173742074776f206f7574636f6d6573207265717569726564000060448201526064016105bf565b600280545f91826115a083611c12565b909155505f818152600360205260409020909150806115bf8782611c76565b506115ca8442611bb0565b600182015560028101805460ff191690555f1960038201555f5b855181101561163f575f838152600460205260409020865187908390811061160e5761160e611b19565b60209081029190910181015182546001810184555f9384529190922001906116369082611c76565b506001016115e4565b50817fdb6ae5c511cd814e8b6d7dd1f64d32f3bd488e4361486cdcfa2e2debaeddca878787846001015460405161167893929190611d31565b60405180910390a250949350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a35050565b5f602082840312156116e8575f80fd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f82825180855260208501945060208160051b830101602085015f5b8381101561176b57601f198584030188526117558383516116ef565b6020988901989093509190910190600101611739565b50909695505050505050565b602081525f611789602083018461171d565b9392505050565b6001600160a01b038116811461059a575f80fd5b5f602082840312156117b4575f80fd5b813561178981611790565b5f805f604084860312156117d1575f80fd5b83359250602084013567ffffffffffffffff8111156117ee575f80fd5b8401601f810186136117fe575f80fd5b803567ffffffffffffffff811115611814575f80fd5b8660208260051b8401011115611828575f80fd5b939660209190910195509293505050565b5f806040838503121561184a575f80fd5b50508035926020909101359150565b602081525f61178960208301846116ef565b608081525f61187d60808301876116ef565b6020830195909552509115156040830152606090910152919050565b5f80604083850312156118aa575f80fd5b8235915060208301356118bc81611790565b809150509250929050565b602080825282518282018190525f918401906040840190835b818110156118fe5783518352602093840193909201916001016118e0565b509095945050505050565b5f805f6060848603121561191b575f80fd5b83359250602084013561192d81611790565b929592945050506040919091013590565b5f806040838503121561194f575f80fd5b823561195a81611790565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156119a5576119a5611968565b604052919050565b5f82601f8301126119bc575f80fd5b813567ffffffffffffffff8111156119d6576119d6611968565b6119e9601f8201601f191660200161197c565b8181528460208386010111156119fd575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f60608486031215611a2b575f80fd5b833567ffffffffffffffff811115611a41575f80fd5b611a4d868287016119ad565b935050602084013567ffffffffffffffff811115611a69575f80fd5b8401601f81018613611a79575f80fd5b803567ffffffffffffffff811115611a9357611a93611968565b8060051b611aa36020820161197c565b91825260208184018101929081019089841115611abe575f80fd5b6020850192505b83831015611b0457823567ffffffffffffffff811115611ae3575f80fd5b611af28b6020838901016119ad565b83525060209283019290910190611ac5565b96999698505050506040949094013593505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680611b4157607f821691505b602082108103611b5f57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611bc357611bc3611b9c565b92915050565b8082028115828204841417611bc357611bc3611b9c565b5f82611bfa57634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115611bc357611bc3611b9c565b5f60018201611c2357611c23611b9c565b5060010190565b601f821115611c7157805f5260205f20601f840160051c81016020851015611c4f5750805b601f840160051c820191505b81811015611c6e575f8155600101611c5b565b50505b505050565b815167ffffffffffffffff811115611c9057611c90611968565b611ca481611c9e8454611b2d565b84611c2a565b6020601f821160018114611cd6575f8315611cbf5750848201515b5f19600385901b1c1916600184901b178455611c6e565b5f84815260208120601f198516915b82811015611d055787850151825560209485019460019092019101611ce5565b5084821015611d2257868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b606081525f611d4360608301866116ef565b8281036020840152611d55818661171d565b91505082604083015294935050505056fea26469706673582212207bd209c9e0f23275f4d16d1ef4721f2cc4c2564b049c272733e16ea66538208b64736f6c634300081a0033

Deployed Bytecode

0x60806040526004361061011b575f3560e01c806372c27b621161009d578063ad3b1b4711610062578063ad3b1b4714610391578063b1283e77146103b0578063beebc5da146103cf578063ec979082146103e2578063fbc529cb146103f7575f80fd5b806372c27b621461029b578063835dc40b146102ba578063873f6f9e146102e65780638da5cb5b1461032f578063ad2b69bc14610355575f80fd5b80633ec79193116100e35780633ec79193146101e357806356d3340414610212578063605573331461024857806362a5dbbc14610267578063677bd9ff1461027c575f80fd5b806305d45d5f1461011f57806313af40351461015457806324a9d8531461017557806327536b28146101985780633bdfa982146101b7575b5f80fd5b34801561012a575f80fd5b5061013e6101393660046116d8565b610416565b60405161014b9190611777565b60405180910390f35b34801561015f575f80fd5b5061017361016e3660046117a4565b610567565b005b348015610180575f80fd5b5061018a60085481565b60405190815260200161014b565b3480156101a3575f80fd5b506101736101b23660046117bf565b61059d565b3480156101c2575f80fd5b506101d66101d1366004611839565b61090c565b60405161014b9190611859565b3480156101ee575f80fd5b506102026101fd3660046116d8565b6109bd565b60405161014b949392919061186b565b34801561021d575f80fd5b5061018a61022c366004611839565b600560209081525f928352604080842090915290825290205481565b348015610253575f80fd5b50610173610262366004611839565b610a87565b348015610272575f80fd5b5061018a60095481565b348015610287575f80fd5b506101736102963660046116d8565b610bd3565b3480156102a6575f80fd5b506101736102b53660046116d8565b610ed4565b3480156102c5575f80fd5b506102d96102d4366004611899565b610f7a565b60405161014b91906118c7565b3480156102f1575f80fd5b5061031f610300366004611899565b600760209081525f928352604080842090915290825290205460ff1681565b604051901515815260200161014b565b34801561033a575f80fd5b505f546040516001600160a01b03909116815260200161014b565b348015610360575f80fd5b5061018a61036f366004611909565b600660209081525f938452604080852082529284528284209052825290205481565b34801561039c575f80fd5b506101736103ab36600461193e565b611033565b3480156103bb575f80fd5b506102026103ca3660046116d8565b6111ba565b6101736103dd366004611839565b61126d565b3480156103ed575f80fd5b5061018a60025481565b348015610402575f80fd5b5061018a610411366004611a19565b611495565b5f818152600460205260408120546060919067ffffffffffffffff81111561044057610440611968565b60405190808252806020026020018201604052801561047357816020015b606081526020019060019003908161045e5790505b5090505f5b5f84815260046020526040902054811015610560575f8481526004602052604090208054829081106104ac576104ac611b19565b905f5260205f200180546104bf90611b2d565b80601f01602080910402602001604051908101604052809291908181526020018280546104eb90611b2d565b80156105365780601f1061050d57610100808354040283529160200191610536565b820191905f5260205f20905b81548152906001019060200180831161051957829003601f168201915b505050505082828151811061054d5761054d611b19565b6020908102919091010152600101610478565b5092915050565b5f546001600160a01b03163314610591576040516316ccb9cb60e11b815260040160405180910390fd5b61059a81611689565b50565b6002600154036105c85760405162461bcd60e51b81526004016105bf90611b65565b60405180910390fd5b600260018190555f8481526003602052604090209081015460ff1661062f5760405162461bcd60e51b815260206004820152601760248201527f4d61726b6574206e6f74207265736f6c7665642079657400000000000000000060448201526064016105bf565b60038101545f8581526005602090815260408083208484528252808320548884526004909252822054909190815b8181101561069a57848114610692575f89815260056020908152604080832084845290915290205461068f9084611bb0565b92505b60010161065d565b505f83156106c257836106b584670de0b6b3a7640000611bc9565b6106bf9190611be0565b90505b5f5b878110156108fc575f8989838181106106df576106df611b19565b90506020020160208101906106f491906117a4565b5f8c81526007602090815260408083206001600160a01b038516845290915290205490915060ff161561072757506108f4565b5f8b81526006602090815260408083206001600160a01b038516845282528083208a8452909152812054908190036107605750506108f4565b5f670de0b6b3a76400006107748684611bc9565b61077e9190611be0565b6107889083611bb0565b9050600160075f8f81526020019081526020015f205f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60065f8f81526020019081526020015f205f856001600160a01b03166001600160a01b031681526020019081526020015f205f8b81526020019081526020015f20819055505f836001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610863576040519150601f19603f3d011682016040523d82523d5f602084013e610868565b606091505b50509050806108ab5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016105bf565b836001600160a01b03168e7f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed026846040516108e791815260200190565b60405180910390a3505050505b6001016106c4565b5050600180555050505050505050565b6004602052815f5260405f208181548110610925575f80fd5b905f5260205f20015f9150915050805461093e90611b2d565b80601f016020809104026020016040519081016040528092919081815260200182805461096a90611b2d565b80156109b55780601f1061098c576101008083540402835291602001916109b5565b820191905f5260205f20905b81548152906001019060200180831161099857829003601f168201915b505050505081565b5f818152600360208190526040822060018101546002820154928201548254606095948594859490938493919260ff169184906109f990611b2d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2590611b2d565b8015610a705780601f10610a4757610100808354040283529160200191610a70565b820191905f5260205f20905b815481529060010190602001808311610a5357829003601f168201915b505050505093509450945094509450509193509193565b5f546001600160a01b03163314610ad95760405162461bcd60e51b81526020600482015260166024820152754f6e6c79206f776e65722063616e207265736f6c766560501b60448201526064016105bf565b5f828152600360205260409020600281015460ff1615610b2e5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c995cdbdb1d995960821b60448201526064016105bf565b5f838152600460205260409020548210610b7c5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206f7574636f6d6560881b60448201526064016105bf565b6003810182905560028101805460ff1916600117905560405183907f6dfc24f0f2fb42e49fb4fa3ffa8abb148cab908a1fb8335b3f128a08b2594af190610bc69085815260200190565b60405180910390a2505050565b600260015403610bf55760405162461bcd60e51b81526004016105bf90611b65565b600260018190555f8281526003602052604090209081015460ff16610c525760405162461bcd60e51b815260206004820152601360248201527213585c9ad95d081b9bdd081c995cdbdb1d9959606a1b60448201526064016105bf565b5f82815260076020908152604080832033845290915290205460ff1615610cad5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016105bf565b60038101545f838152600660209081526040808320338452825280832084845290915290205480610d0e5760405162461bcd60e51b815260206004820152600b60248201526a4e6f2077696e6e696e677360a81b60448201526064016105bf565b5f8481526005602090815260408083208584528252808320548784526004909252822054909190815b81811015610d7457858114610d6c575f888152600560209081526040808320848452909152902054610d699084611bb0565b92505b600101610d37565b505f8315610d9c5783610d8f84670de0b6b3a7640000611bc9565b610d999190611be0565b90505b5f670de0b6b3a7640000610db08388611bc9565b610dba9190611be0565b610dc49087611bb0565b5f8a8152600660209081526040808320338085529083528184208c855283528184208490558d845260078352818420818552909252808320805460ff1916600117905551929350909183908381818185875af1925050503d805f8114610e45576040519150601f19603f3d011682016040523d82523d5f602084013e610e4a565b606091505b5050905080610e8d5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016105bf565b60405182815233908b907f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed0269060200160405180910390a35050600180555050505050505050565b5f546001600160a01b03163314610efe576040516316ccb9cb60e11b815260040160405180910390fd5b6103e8811115610f3f5760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b60448201526064016105bf565b60088190556040518181527f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c769060200160405180910390a150565b5f828152600460205260409020546060908067ffffffffffffffff811115610fa457610fa4611968565b604051908082528060200260200182016040528015610fcd578160200160208202803683370190505b5091505f5b8181101561102b575f8581526006602090815260408083206001600160a01b03881684528252808320848452909152902054835184908390811061101857611018611b19565b6020908102919091010152600101610fd2565b505092915050565b5f546001600160a01b0316331461105d576040516316ccb9cb60e11b815260040160405180910390fd5b60026001540361107f5760405162461bcd60e51b81526004016105bf90611b65565b60026001556009548111156110c85760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768206665657360881b60448201526064016105bf565b8060095f8282546110d99190611bff565b90915550506040515f906001600160a01b0384169083908381818185875af1925050503d805f8114611126576040519150601f19603f3d011682016040523d82523d5f602084013e61112b565b606091505b505090508061116e5760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b60448201526064016105bf565b826001600160a01b03167f812bcf6853ebc81dc0a1d2323893eedad6cd086a4398311a699e0a7acdf187b3836040516111a991815260200190565b60405180910390a250506001805550565b60036020525f90815260409020805481906111d490611b2d565b80601f016020809104026020016040519081016040528092919081815260200182805461120090611b2d565b801561124b5780601f106112225761010080835404028352916020019161124b565b820191905f5260205f20905b81548152906001019060200180831161122e57829003601f168201915b50505050600183015460028401546003909401549293909260ff909116915084565b5f828152600360205260409020600181015442106112cd5760405162461bcd60e51b815260206004820152601b60248201527f4d61726b65742074726164696e6720706572696f6420656e646564000000000060448201526064016105bf565b600281015460ff16156113225760405162461bcd60e51b815260206004820152601760248201527f4d61726b657420616c7265616479207265736f6c76656400000000000000000060448201526064016105bf565b5f83815260046020526040902054821061136f5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21037b83a34b7b760911b60448201526064016105bf565b5f34116113ae5760405162461bcd60e51b815260206004820152600d60248201526c139bc8199d5b991cc81cd95b9d609a1b60448201526064016105bf565b5f612710600854346113c09190611bc9565b6113ca9190611be0565b90505f6113d78234611bff565b90508160095f8282546113ea9190611bb0565b90915550505f85815260066020908152604080832033845282528083208784529091528120805483929061141f908490611bb0565b90915550505f8581526005602090815260408083208784529091528120805483929061144c908490611bb0565b90915550506040805185815260208101839052339187917fce81571c08c76465bdf390ad1abe80af8c51c6c4566e3485f9395f13d5ad6328910160405180910390a35050505050565b5f80546001600160a01b031633146114ef5760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79206f776e65722063616e20637265617465206d61726b65747300000060448201526064016105bf565b5f821161153e5760405162461bcd60e51b815260206004820152601960248201527f4475726174696f6e206d75737420626520706f7369746976650000000000000060448201526064016105bf565b6002835110156115905760405162461bcd60e51b815260206004820152601e60248201527f4174206c656173742074776f206f7574636f6d6573207265717569726564000060448201526064016105bf565b600280545f91826115a083611c12565b909155505f818152600360205260409020909150806115bf8782611c76565b506115ca8442611bb0565b600182015560028101805460ff191690555f1960038201555f5b855181101561163f575f838152600460205260409020865187908390811061160e5761160e611b19565b60209081029190910181015182546001810184555f9384529190922001906116369082611c76565b506001016115e4565b50817fdb6ae5c511cd814e8b6d7dd1f64d32f3bd488e4361486cdcfa2e2debaeddca878787846001015460405161167893929190611d31565b60405180910390a250949350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a35050565b5f602082840312156116e8575f80fd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f82825180855260208501945060208160051b830101602085015f5b8381101561176b57601f198584030188526117558383516116ef565b6020988901989093509190910190600101611739565b50909695505050505050565b602081525f611789602083018461171d565b9392505050565b6001600160a01b038116811461059a575f80fd5b5f602082840312156117b4575f80fd5b813561178981611790565b5f805f604084860312156117d1575f80fd5b83359250602084013567ffffffffffffffff8111156117ee575f80fd5b8401601f810186136117fe575f80fd5b803567ffffffffffffffff811115611814575f80fd5b8660208260051b8401011115611828575f80fd5b939660209190910195509293505050565b5f806040838503121561184a575f80fd5b50508035926020909101359150565b602081525f61178960208301846116ef565b608081525f61187d60808301876116ef565b6020830195909552509115156040830152606090910152919050565b5f80604083850312156118aa575f80fd5b8235915060208301356118bc81611790565b809150509250929050565b602080825282518282018190525f918401906040840190835b818110156118fe5783518352602093840193909201916001016118e0565b509095945050505050565b5f805f6060848603121561191b575f80fd5b83359250602084013561192d81611790565b929592945050506040919091013590565b5f806040838503121561194f575f80fd5b823561195a81611790565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156119a5576119a5611968565b604052919050565b5f82601f8301126119bc575f80fd5b813567ffffffffffffffff8111156119d6576119d6611968565b6119e9601f8201601f191660200161197c565b8181528460208386010111156119fd575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f60608486031215611a2b575f80fd5b833567ffffffffffffffff811115611a41575f80fd5b611a4d868287016119ad565b935050602084013567ffffffffffffffff811115611a69575f80fd5b8401601f81018613611a79575f80fd5b803567ffffffffffffffff811115611a9357611a93611968565b8060051b611aa36020820161197c565b91825260208184018101929081019089841115611abe575f80fd5b6020850192505b83831015611b0457823567ffffffffffffffff811115611ae3575f80fd5b611af28b6020838901016119ad565b83525060209283019290910190611ac5565b96999698505050506040949094013593505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680611b4157607f821691505b602082108103611b5f57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611bc357611bc3611b9c565b92915050565b8082028115828204841417611bc357611bc3611b9c565b5f82611bfa57634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115611bc357611bc3611b9c565b5f60018201611c2357611c23611b9c565b5060010190565b601f821115611c7157805f5260205f20601f840160051c81016020851015611c4f5750805b601f840160051c820191505b81811015611c6e575f8155600101611c5b565b50505b505050565b815167ffffffffffffffff811115611c9057611c90611968565b611ca481611c9e8454611b2d565b84611c2a565b6020601f821160018114611cd6575f8315611cbf5750848201515b5f19600385901b1c1916600184901b178455611c6e565b5f84815260208120601f198516915b82811015611d055787850151825560209485019460019092019101611ce5565b5084821015611d2257868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b606081525f611d4360608301866116ef565b8281036020840152611d55818661171d565b91505082604083015294935050505056fea26469706673582212207bd209c9e0f23275f4d16d1ef4721f2cc4c2564b049c272733e16ea66538208b64736f6c634300081a0033

Deployed Bytecode Sourcemap

4042:11883:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14045:330;;;;;;;;;;-1:-1:-1;14045:330:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2120:182;;;;;;;;;;-1:-1:-1;2120:182:0;;;;;:::i;:::-;;:::i;:::-;;5007:27;;;;;;;;;;;;;;;;;;;1942:25:1;;;1930:2;1915:18;5007:27:0;1796:177:1;11457:1564:0;;;;;;;;;;-1:-1:-1;11457:1564:0;;;;;:::i;:::-;;:::i;4397:49::-;;;;;;;;;;-1:-1:-1;4397:49:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;13396:479::-;;;;;;;;;;-1:-1:-1;13396:479:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;4535:75::-;;;;;;;;;;-1:-1:-1;4535:75:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;9031:611;;;;;;;;;;-1:-1:-1;9031:611:0;;;;;:::i;:::-;;:::i;5095:30::-;;;;;;;;;;;;;;;;9774:1489;;;;;;;;;;-1:-1:-1;9774:1489:0;;;;;:::i;:::-;;:::i;15140:187::-;;;;;;;;;;-1:-1:-1;15140:187:0;;;;;:::i;:::-;;:::i;14606:385::-;;;;;;;;;;-1:-1:-1;14606:385:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4867:62::-;;;;;;;;;;-1:-1:-1;4867:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4886:14:1;;4879:22;4861:41;;4849:2;4834:18;4867:62:0;4721:187:1;1850:88:0;;;;;;;;;;-1:-1:-1;1897:7:0;1924:6;1850:88;;-1:-1:-1;;;;;1924:6:0;;;5059:51:1;;5047:2;5032:18;1850:88:0;4913:203:1;4693:94:0;;;;;;;;;;-1:-1:-1;4693:94:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15548:374;;;;;;;;;;-1:-1:-1;15548:374:0;;;;;:::i;:::-;;:::i;4323:41::-;;;;;;;;;;-1:-1:-1;4323:41:0;;;;;:::i;:::-;;:::i;7868:878::-;;;;;;:::i;:::-;;:::i;4290:26::-;;;;;;;;;;;;;;;;6757:897;;;;;;;;;;-1:-1:-1;6757:897:0;;;;;:::i;:::-;;:::i;14045:330::-;14141:20;14177:24;;;:13;:24;;;;;:31;14113:15;;14141:20;14164:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14141:68;;14225:9;14220:126;14244:24;;;;:13;:24;;;;;:31;14240:35;;14220:126;;;14307:24;;;;:13;:24;;;;;:27;;14332:1;;14307:27;;;;;;:::i;:::-;;;;;;;;14297:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;14302:1;14297:7;;;;;;;;:::i;:::-;;;;;;;;;;:37;14277:3;;14220:126;;;-1:-1:-1;14363:4:0;14045:330;-1:-1:-1;;14045:330:0:o;2120:182::-;6361:4;1924:6;-1:-1:-1;;;;;1924:6:0;6385:10;:21;2186:76;;2229:21;;-1:-1:-1;;;2229:21:0;;;;;;;;;;;2186:76;2272:22;2284:9;2272:11;:22::i;:::-;2120:182;:::o;11457:1564::-;3065:1;3381:7;;:19;3373:63;;;;-1:-1:-1;;;3373:63:0;;;;;;;:::i;:::-;;;;;;;;;3065:1;3514:7;:18;;;11589:21:::1;11613:18:::0;;;:7:::1;:18;::::0;;;;11650:15;;::::1;::::0;::::1;;11642:51;;;::::0;-1:-1:-1;;;11642:51:0;;9486:2:1;11642:51:0::1;::::0;::::1;9468:21:1::0;9525:2;9505:18;;;9498:30;9564:25;9544:18;;;9537:53;9607:18;;11642:51:0::1;9284:347:1::0;11642:51:0::1;11730:25;::::0;::::1;::::0;11706:21:::1;11790:31:::0;;;:20:::1;:31;::::0;;;;;;;:46;;;;;;;;;11900:24;;;:13:::1;:24:::0;;;;;:31;11790:46;;11706:21;;11944:177:::1;11968:11;11964:1;:15;11944:177;;;12010:13;12005:1;:18;12001:109;;12060:31;::::0;;;:20:::1;:31;::::0;;;;;;;:34;;;;;;;;;12044:50:::1;::::0;;::::1;:::i;:::-;;;12001:109;11981:3;;11944:177;;;-1:-1:-1::0;12133:19:0::1;12171:17:::0;;12167:101:::1;;12243:13:::0;12220:19:::1;:12:::0;12235:4:::1;12220:19;:::i;:::-;12219:37;;;;:::i;:::-;12205:51;;12167:101;12285:9;12280:734;12300:17:::0;;::::1;12280:734;;;12339:12;12354:6;;12361:1;12354:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;12382:21;::::0;;;:10:::1;:21;::::0;;;;;;;-1:-1:-1;;;;;12382:27:0;::::1;::::0;;;;;;;;12339:24;;-1:-1:-1;12382:27:0::1;;12378:76;;;12430:8;;;12378:76;12470:18;12491:30:::0;;;:19:::1;:30;::::0;;;;;;;-1:-1:-1;;;;;12491:36:0;::::1;::::0;;;;;;;:51;;;;;;;;;;12561:15;;;12557:64:::1;;12597:8;;;;12557:64;12637:16;12698:4;12670:24;12683:11:::0;12670:10;:24:::1;:::i;:::-;12669:33;;;;:::i;:::-;12656:46;::::0;:10;:46:::1;:::i;:::-;12637:65;;12749:4;12719:10;:21;12730:9;12719:21;;;;;;;;;;;:27;12741:4;-1:-1:-1::0;;;;;12719:27:0::1;-1:-1:-1::0;;;;;12719:27:0::1;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;12822:1;12768:19;:30;12788:9;12768:30;;;;;;;;;;;:36;12799:4;-1:-1:-1::0;;;;;12768:36:0::1;-1:-1:-1::0;;;;;12768:36:0::1;;;;;;;;;;;;:51;12805:13;12768:51;;;;;;;;;;;:55;;;;12841:12;12867:4;-1:-1:-1::0;;;;;12859:18:0::1;12885:8;12859:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12840:58;;;12921:7;12913:35;;;::::0;-1:-1:-1;;;12913:35:0;;10705:2:1;12913:35:0::1;::::0;::::1;10687:21:1::0;10744:2;10724:18;;;10717:30;-1:-1:-1;;;10763:18:1;;;10756:45;10818:18;;12913:35:0::1;10503:339:1::0;12913:35:0::1;12987:4;-1:-1:-1::0;;;;;12968:34:0::1;12976:9;12968:34;12993:8;12968:34;;;;1942:25:1::0;;1930:2;1915:18;;1796:177;12968:34:0::1;;;;;;;;12324:690;;;;12280:734;12319:3;;12280:734;;;-1:-1:-1::0;;3021:1:0;3693:22;;-1:-1:-1;;;;;;;;11457:1564:0:o;4397:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13396:479::-;13555:15;13691:18;;;:7;:18;;;;;;;13772:14;;;;13801:15;;;;13831:25;;;;13720:147;;13518:22;;13555:15;;;;;13691:18;;;;13772:14;;13801:15;;;13691:18;;13720:147;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13396:479;;;;;:::o;9031:611::-;1897:7;1924:6;-1:-1:-1;;;;;1924:6:0;9155:10;:21;9147:56;;;;-1:-1:-1;;;9147:56:0;;11049:2:1;9147:56:0;;;11031:21:1;11088:2;11068:18;;;11061:30;-1:-1:-1;;;11107:18:1;;;11100:52;11169:18;;9147:56:0;10847:346:1;9147:56:0;9214:21;9238:18;;;:7;:18;;;;;9276:15;;;;;;9275:16;9267:45;;;;-1:-1:-1;;;9267:45:0;;11400:2:1;9267:45:0;;;11382:21:1;11439:2;11419:18;;;11412:30;-1:-1:-1;;;11458:18:1;;;11451:46;11514:18;;9267:45:0;11198:340:1;9267:45:0;9353:24;;;;:13;:24;;;;;:31;9331:53;;9323:81;;;;-1:-1:-1;;;9323:81:0;;11745:2:1;9323:81:0;;;11727:21:1;11784:2;11764:18;;;11757:30;-1:-1:-1;;;11803:18:1;;;11796:45;11858:18;;9323:81:0;11543:339:1;9323:81:0;9490:25;;;:47;;;9548:15;;;:22;;-1:-1:-1;;9548:22:0;9566:4;9548:22;;;9588:46;;9603:9;;9588:46;;;;9518:19;1942:25:1;;1930:2;1915:18;;1796:177;9588:46:0;;;;;;;;9136:506;9031:611;;:::o;9774:1489::-;3065:1;3381:7;;:19;3373:63;;;;-1:-1:-1;;;3373:63:0;;;;;;;:::i;:::-;3065:1;3514:7;:18;;;9849:21:::1;9873:18:::0;;;:7:::1;:18;::::0;;;;9910:15;;::::1;::::0;::::1;;9902:47;;;::::0;-1:-1:-1;;;9902:47:0;;12089:2:1;9902:47:0::1;::::0;::::1;12071:21:1::0;12128:2;12108:18;;;12101:30;-1:-1:-1;;;12147:18:1;;;12140:49;12206:18;;9902:47:0::1;11887:343:1::0;9902:47:0::1;9969:21;::::0;;;:10:::1;:21;::::0;;;;;;;9991:10:::1;9969:33:::0;;;;;;;;::::1;;9968:34;9960:62;;;::::0;-1:-1:-1;;;9960:62:0;;12437:2:1;9960:62:0::1;::::0;::::1;12419:21:1::0;12476:2;12456:18;;;12449:30;-1:-1:-1;;;12495:18:1;;;12488:45;12550:18;;9960:62:0::1;12235:339:1::0;9960:62:0::1;10059:25;::::0;::::1;::::0;10035:21:::1;10116:30:::0;;;:19:::1;:30;::::0;;;;;;;10147:10:::1;10116:42:::0;;;;;;;:57;;;;;;;;;10192:14;10184:38:::1;;;::::0;-1:-1:-1;;;10184:38:0;;12781:2:1;10184:38:0::1;::::0;::::1;12763:21:1::0;12820:2;12800:18;;;12793:30;-1:-1:-1;;;12839:18:1;;;12832:41;12890:18;;10184:38:0::1;12579:335:1::0;10184:38:0::1;10235:21;10259:31:::0;;;:20:::1;:31;::::0;;;;;;;:46;;;;;;;;;10369:24;;;:13:::1;:24:::0;;;;;:31;10259:46;;10235:21;;10413:177:::1;10437:11;10433:1;:15;10413:177;;;10479:13;10474:1;:18;10470:109;;10529:31;::::0;;;:20:::1;:31;::::0;;;;;;;:34;;;;;;;;;10513:50:::1;::::0;;::::1;:::i;:::-;;;10470:109;10450:3;;10413:177;;;-1:-1:-1::0;10692:19:0::1;10730:17:::0;;10726:101:::1;;10802:13:::0;10779:19:::1;:12:::0;10794:4:::1;10779:19;:::i;:::-;10778:37;;;;:::i;:::-;10764:51;;10726:101;10837:16;10898:4;10870:24;10883:11:::0;10870:10;:24:::1;:::i;:::-;10869:33;;;;:::i;:::-;10856:46;::::0;:10;:46:::1;:::i;:::-;11022:1;10962:30:::0;;;:19:::1;:30;::::0;;;;;;;10993:10:::1;10962:42:::0;;;;;;;;;:57;;;;;;;;:61;;;11034:21;;;:10:::1;:21:::0;;;;;:33;;;;;;;;;:40;;-1:-1:-1;;11034:40:0::1;11070:4;11034:40;::::0;;11106:45;10837:65;;-1:-1:-1;11022:1:0;;10837:65;;11022:1;11106:45;11022:1;11106:45;10837:65;10993:10;11106:45:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11087:64;;;11170:7;11162:35;;;::::0;-1:-1:-1;;;11162:35:0;;10705:2:1;11162:35:0::1;::::0;::::1;10687:21:1::0;10744:2;10724:18;;;10717:30;-1:-1:-1;;;10763:18:1;;;10756:45;10818:18;;11162:35:0::1;10503:339:1::0;11162:35:0::1;11215:40;::::0;1942:25:1;;;11234:10:0::1;::::0;11223:9;;11215:40:::1;::::0;1930:2:1;1915:18;11215:40:0::1;;;;;;;-1:-1:-1::0;;3021:1:0;3693:22;;-1:-1:-1;;;;;;;;9774:1489:0:o;15140:187::-;1690:6;;-1:-1:-1;;;;;1690:6:0;1676:10;:20;1672:81;;1720:21;;-1:-1:-1;;;1720:21:0;;;;;;;;;;;1672:81;15225:4:::1;15214:7;:15;;15206:40;;;::::0;-1:-1:-1;;;15206:40:0;;13121:2:1;15206:40:0::1;::::0;::::1;13103:21:1::0;13160:2;13140:18;;;13133:30;-1:-1:-1;;;13179:18:1;;;13172:42;13231:18;;15206:40:0::1;12919:336:1::0;15206:40:0::1;15268:6;:16:::0;;;15300:19:::1;::::0;1942:25:1;;;15300:19:0::1;::::0;1930:2:1;1915:18;15300:19:0::1;;;;;;;15140:187:::0;:::o;14606:385::-;14749:19;14771:24;;;:13;:24;;;;;:31;14711:25;;14771:31;14824:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14824:26:0;;14813:37;;14866:9;14861:123;14885:11;14881:1;:15;14861:123;;;14932:30;;;;:19;:30;;;;;;;;-1:-1:-1;;;;;14932:37:0;;;;;;;;;:40;;;;;;;;;14918:11;;:8;;14970:1;;14918:11;;;;;;:::i;:::-;;;;;;;;;;:54;14898:3;;14861:123;;;;14738:253;14606:385;;;;:::o;15548:374::-;1690:6;;-1:-1:-1;;;;;1690:6:0;1676:10;:20;1672:81;;1720:21;;-1:-1:-1;;;1720:21:0;;;;;;;;;;;1672:81;3065:1:::1;3381:7;;:19:::0;3373:63:::1;;;;-1:-1:-1::0;;;3373:63:0::1;;;;;;;:::i;:::-;3065:1;3514:7;:18:::0;15677:15:::2;::::0;15666:26;::::2;;15658:54;;;::::0;-1:-1:-1;;;15658:54:0;;13462:2:1;15658:54:0::2;::::0;::::2;13444:21:1::0;13501:2;13481:18;;;13474:30;-1:-1:-1;;;13520:18:1;;;13513:45;13575:18;;15658:54:0::2;13260:339:1::0;15658:54:0::2;15742:7;15723:15;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;15781:35:0::2;::::0;15763:12:::2;::::0;-1:-1:-1;;;;;15781:15:0;::::2;::::0;15804:7;;15763:12;15781:35;15763:12;15781:35;15804:7;15781:15;:35:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15762:54;;;15835:7;15827:35;;;::::0;-1:-1:-1;;;15827:35:0;;13939:2:1;15827:35:0::2;::::0;::::2;13921:21:1::0;13978:2;13958:18;;;13951:30;-1:-1:-1;;;13997:18:1;;;13990:45;14052:18;;15827:35:0::2;13737:339:1::0;15827:35:0::2;15903:10;-1:-1:-1::0;;;;;15880:34:0::2;;15894:7;15880:34;;;;1942:25:1::0;;1930:2;1915:18;;1796:177;15880:34:0::2;;;;;;;;-1:-1:-1::0;;3021:1:0::1;3693:22:::0;;-1:-1:-1;15548:374:0:o;4323:41::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;4323:41:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4323:41:0;:::o;7868:878::-;7981:21;8005:18;;;:7;:18;;;;;8060:14;;;;8042:15;:32;8034:72;;;;-1:-1:-1;;;8034:72:0;;14283:2:1;8034:72:0;;;14265:21:1;14322:2;14302:18;;;14295:30;14361:29;14341:18;;;14334:57;14408:18;;8034:72:0;14081:351:1;8034:72:0;8126:15;;;;;;8125:16;8117:52;;;;-1:-1:-1;;;8117:52:0;;14639:2:1;8117:52:0;;;14621:21:1;14678:2;14658:18;;;14651:30;14717:25;14697:18;;;14690:53;14760:18;;8117:52:0;14437:347:1;8117:52:0;8203:24;;;;:13;:24;;;;;:31;8188:46;;8180:73;;;;-1:-1:-1;;;8180:73:0;;14991:2:1;8180:73:0;;;14973:21:1;15030:2;15010:18;;;15003:30;-1:-1:-1;;;15049:18:1;;;15042:44;15103:18;;8180:73:0;14789:338:1;8180:73:0;8284:1;8272:9;:13;8264:39;;;;-1:-1:-1;;;8264:39:0;;15334:2:1;8264:39:0;;;15316:21:1;15373:2;15353:18;;;15346:30;-1:-1:-1;;;15392:18:1;;;15385:43;15445:18;;8264:39:0;15132:337:1;8264:39:0;8357:17;8400:5;8390:6;;8378:9;:18;;;;:::i;:::-;8377:28;;;;:::i;:::-;8357:48;-1:-1:-1;8416:17:0;8436:21;8357:48;8436:9;:21;:::i;:::-;8416:41;;8497:9;8478:15;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;8519:30:0;;;;:19;:30;;;;;;;;8550:10;8519:42;;;;;;;:56;;;;;;;;:69;;8579:9;;8519:30;:69;;8579:9;;8519:69;:::i;:::-;;;;-1:-1:-1;;8599:31:0;;;;:20;:31;;;;;;;;:45;;;;;;;;:58;;8648:9;;8599:31;:58;;8648:9;;8599:58;:::i;:::-;;;;-1:-1:-1;;8675:63:0;;;15648:25:1;;;15704:2;15689:18;;15682:34;;;8702:10:0;;8691:9;;8675:63;;15621:18:1;8675:63:0;;;;;;;7970:776;;;7868:878;;:::o;6757:897::-;6901:7;1924:6;;-1:-1:-1;;;;;1924:6:0;6929:10;:21;6921:63;;;;-1:-1:-1;;;6921:63:0;;15929:2:1;6921:63:0;;;15911:21:1;15968:2;15948:18;;;15941:30;16007:31;15987:18;;;15980:59;16056:18;;6921:63:0;15727:353:1;6921:63:0;7015:1;7003:9;:13;6995:51;;;;-1:-1:-1;;;6995:51:0;;16287:2:1;6995:51:0;;;16269:21:1;16326:2;16306:18;;;16299:30;16365:27;16345:18;;;16338:55;16410:18;;6995:51:0;16085:349:1;6995:51:0;7084:1;7065:8;:15;:20;;7057:63;;;;-1:-1:-1;;;7057:63:0;;16641:2:1;7057:63:0;;;16623:21:1;16680:2;16660:18;;;16653:30;16719:32;16699:18;;;16692:60;16769:18;;7057:63:0;16439:354:1;7057:63:0;7152:11;:13;;7133:16;;;7152:13;;;:::i;:::-;;;;-1:-1:-1;7176:21:0;7200:17;;;:7;:17;;;;;7133:32;;-1:-1:-1;7200:17:0;7230:27;7248:9;7200:17;7230:27;:::i;:::-;-1:-1:-1;7285:27:0;7303:9;7285:15;:27;:::i;:::-;7268:14;;;:44;7323:15;;;:23;;-1:-1:-1;;7323:23:0;;;-1:-1:-1;;7357:25:0;;;:45;7341:5;7429:114;7453:8;:15;7449:1;:19;7429:114;;;7490:23;;;;:13;:23;;;;;7519:11;;:8;;7528:1;;7519:11;;;;;;:::i;:::-;;;;;;;;;;;;7490:41;;;;;;;-1:-1:-1;7490:41:0;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;7470:3:0;;7429:114;;;;7574:8;7560:60;7584:9;7595:8;7605:6;:14;;;7560:60;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;7638:8:0;6757:897;-1:-1:-1;;;;6757:897:0:o;2420:177::-;2480:18;2501:6;;-1:-1:-1;;;;;2518:18:0;;;-1:-1:-1;;;;;;2518:18:0;;;;;;2554:35;;2501:6;;;;;;;2554:35;;2480:18;2554:35;2469:128;2420:177;:::o;14:226:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;187:23:1;;14:226;-1:-1:-1;14:226:1:o;245:289::-;287:3;325:5;319:12;352:6;347:3;340:19;408:6;401:4;394:5;390:16;383:4;378:3;374:14;368:47;460:1;453:4;444:6;439:3;435:16;431:27;424:38;523:4;516:2;512:7;507:2;499:6;495:15;491:29;486:3;482:39;478:50;471:57;;;245:289;;;;:::o;539:579::-;591:3;622;654:5;648:12;681:6;676:3;669:19;713:4;708:3;704:14;697:21;;771:4;761:6;758:1;754:14;747:5;743:26;739:37;810:4;803:5;799:16;833:1;843:249;857:6;854:1;851:13;843:249;;;944:2;940:7;932:5;926:4;922:16;918:30;913:3;906:43;970:38;1003:4;994:6;988:13;970:38;:::i;:::-;1043:4;1068:14;;;;962:46;;-1:-1:-1;1031:17:1;;;;;879:1;872:9;843:249;;;-1:-1:-1;1108:4:1;;539:579;-1:-1:-1;;;;;;539:579:1:o;1123:280::-;1322:2;1311:9;1304:21;1285:4;1342:55;1393:2;1382:9;1378:18;1370:6;1342:55;:::i;:::-;1334:63;1123:280;-1:-1:-1;;;1123:280:1:o;1408:131::-;-1:-1:-1;;;;;1483:31:1;;1473:42;;1463:70;;1529:1;1526;1519:12;1544:247;1603:6;1656:2;1644:9;1635:7;1631:23;1627:32;1624:52;;;1672:1;1669;1662:12;1624:52;1711:9;1698:23;1730:31;1755:5;1730:31;:::i;1978:724::-;2073:6;2081;2089;2142:2;2130:9;2121:7;2117:23;2113:32;2110:52;;;2158:1;2155;2148:12;2110:52;2203:23;;;-1:-1:-1;2301:2:1;2286:18;;2273:32;2328:18;2317:30;;2314:50;;;2360:1;2357;2350:12;2314:50;2383:22;;2436:4;2428:13;;2424:27;-1:-1:-1;2414:55:1;;2465:1;2462;2455:12;2414:55;2505:2;2492:16;2531:18;2523:6;2520:30;2517:50;;;2563:1;2560;2553:12;2517:50;2616:7;2611:2;2601:6;2598:1;2594:14;2590:2;2586:23;2582:32;2579:45;2576:65;;;2637:1;2634;2627:12;2576:65;1978:724;;2668:2;2660:11;;;;;-1:-1:-1;2690:6:1;;-1:-1:-1;;;1978:724:1:o;2707:346::-;2775:6;2783;2836:2;2824:9;2815:7;2811:23;2807:32;2804:52;;;2852:1;2849;2842:12;2804:52;-1:-1:-1;;2897:23:1;;;3017:2;3002:18;;;2989:32;;-1:-1:-1;2707:346:1:o;3058:220::-;3207:2;3196:9;3189:21;3170:4;3227:45;3268:2;3257:9;3253:18;3245:6;3227:45;:::i;3283:445::-;3510:3;3499:9;3492:22;3473:4;3531:46;3572:3;3561:9;3557:19;3549:6;3531:46;:::i;:::-;3608:2;3593:18;;3586:34;;;;-1:-1:-1;3663:14:1;;3656:22;3651:2;3636:18;;3629:50;3710:2;3695:18;;;3688:34;3523:54;3283:445;-1:-1:-1;3283:445:1:o;3733:367::-;3801:6;3809;3862:2;3850:9;3841:7;3837:23;3833:32;3830:52;;;3878:1;3875;3868:12;3830:52;3923:23;;;-1:-1:-1;4022:2:1;4007:18;;3994:32;4035:33;3994:32;4035:33;:::i;:::-;4087:7;4077:17;;;3733:367;;;;;:::o;4105:611::-;4295:2;4307:21;;;4377:13;;4280:18;;;4399:22;;;4247:4;;4478:15;;;4452:2;4437:18;;;4247:4;4521:169;4535:6;4532:1;4529:13;4521:169;;;4596:13;;4584:26;;4639:2;4665:15;;;;4630:12;;;;4557:1;4550:9;4521:169;;;-1:-1:-1;4707:3:1;;4105:611;-1:-1:-1;;;;;4105:611:1:o;5121:487::-;5198:6;5206;5214;5267:2;5255:9;5246:7;5242:23;5238:32;5235:52;;;5283:1;5280;5273:12;5235:52;5328:23;;;-1:-1:-1;5427:2:1;5412:18;;5399:32;5440:33;5399:32;5440:33;:::i;:::-;5121:487;;5492:7;;-1:-1:-1;;;5572:2:1;5557:18;;;;5544:32;;5121:487::o;5613:375::-;5689:6;5697;5750:2;5738:9;5729:7;5725:23;5721:32;5718:52;;;5766:1;5763;5756:12;5718:52;5805:9;5792:23;5824:31;5849:5;5824:31;:::i;:::-;5874:5;5952:2;5937:18;;;;5924:32;;-1:-1:-1;;;5613:375:1:o;5993:127::-;6054:10;6049:3;6045:20;6042:1;6035:31;6085:4;6082:1;6075:15;6109:4;6106:1;6099:15;6125:275;6196:2;6190:9;6261:2;6242:13;;-1:-1:-1;;6238:27:1;6226:40;;6296:18;6281:34;;6317:22;;;6278:62;6275:88;;;6343:18;;:::i;:::-;6379:2;6372:22;6125:275;;-1:-1:-1;6125:275:1:o;6405:559::-;6448:5;6501:3;6494:4;6486:6;6482:17;6478:27;6468:55;;6519:1;6516;6509:12;6468:55;6559:6;6546:20;6589:18;6581:6;6578:30;6575:56;;;6611:18;;:::i;:::-;6655:59;6702:2;6679:17;;-1:-1:-1;;6675:31:1;6708:4;6671:42;6655:59;:::i;:::-;6739:6;6730:7;6723:23;6793:3;6786:4;6777:6;6769;6765:19;6761:30;6758:39;6755:59;;;6810:1;6807;6800:12;6755:59;6875:6;6868:4;6860:6;6856:17;6849:4;6840:7;6836:18;6823:59;6931:1;6902:20;;;6924:4;6898:31;6891:42;;;;6906:7;6405:559;-1:-1:-1;;;6405:559:1:o;6969:1433::-;7091:6;7099;7107;7160:2;7148:9;7139:7;7135:23;7131:32;7128:52;;;7176:1;7173;7166:12;7128:52;7216:9;7203:23;7249:18;7241:6;7238:30;7235:50;;;7281:1;7278;7271:12;7235:50;7304;7346:7;7337:6;7326:9;7322:22;7304:50;:::i;:::-;7294:60;;;7407:2;7396:9;7392:18;7379:32;7436:18;7426:8;7423:32;7420:52;;;7468:1;7465;7458:12;7420:52;7491:24;;7546:4;7538:13;;7534:27;-1:-1:-1;7524:55:1;;7575:1;7572;7565:12;7524:55;7615:2;7602:16;7641:18;7633:6;7630:30;7627:56;;;7663:18;;:::i;:::-;7709:6;7706:1;7702:14;7736:28;7760:2;7756;7752:11;7736:28;:::i;:::-;7798:19;;;7842:2;7872:11;;;7868:20;;;7833:12;;;;7900:19;;;7897:39;;;7932:1;7929;7922:12;7897:39;7964:2;7960;7956:11;7945:22;;7976:299;7992:6;7987:3;7984:15;7976:299;;;8078:3;8065:17;8114:18;8101:11;8098:35;8095:55;;;8146:1;8143;8136:12;8095:55;8175:57;8224:7;8219:2;8205:11;8201:2;8197:20;8193:29;8175:57;:::i;:::-;8163:70;;-1:-1:-1;8262:2:1;8009:12;;;;8253;;;;7976:299;;;6969:1433;;8294:5;;-1:-1:-1;;;;8368:2:1;8353:18;;;;8340:32;;-1:-1:-1;;;6969:1433:1:o;8407:127::-;8468:10;8463:3;8459:20;8456:1;8449:31;8499:4;8496:1;8489:15;8523:4;8520:1;8513:15;8539:380;8618:1;8614:12;;;;8661;;;8682:61;;8736:4;8728:6;8724:17;8714:27;;8682:61;8789:2;8781:6;8778:14;8758:18;8755:38;8752:161;;8835:10;8830:3;8826:20;8823:1;8816:31;8870:4;8867:1;8860:15;8898:4;8895:1;8888:15;8752:161;;8539:380;;;:::o;8924:355::-;9126:2;9108:21;;;9165:2;9145:18;;;9138:30;9204:33;9199:2;9184:18;;9177:61;9270:2;9255:18;;8924:355::o;9636:127::-;9697:10;9692:3;9688:20;9685:1;9678:31;9728:4;9725:1;9718:15;9752:4;9749:1;9742:15;9768:125;9833:9;;;9854:10;;;9851:36;;;9867:18;;:::i;:::-;9768:125;;;;:::o;9898:168::-;9971:9;;;10002;;10019:15;;;10013:22;;9999:37;9989:71;;10040:18;;:::i;10071:217::-;10111:1;10137;10127:132;;10181:10;10176:3;10172:20;10169:1;10162:31;10216:4;10213:1;10206:15;10244:4;10241:1;10234:15;10127:132;-1:-1:-1;10273:9:1;;10071:217::o;13604:128::-;13671:9;;;13692:11;;;13689:37;;;13706:18;;:::i;16798:135::-;16837:3;16858:17;;;16855:43;;16878:18;;:::i;:::-;-1:-1:-1;16925:1:1;16914:13;;16798:135::o;17064:518::-;17166:2;17161:3;17158:11;17155:421;;;17202:5;17199:1;17192:16;17246:4;17243:1;17233:18;17316:2;17304:10;17300:19;17297:1;17293:27;17287:4;17283:38;17352:4;17340:10;17337:20;17334:47;;;-1:-1:-1;17375:4:1;17334:47;17430:2;17425:3;17421:12;17418:1;17414:20;17408:4;17404:31;17394:41;;17485:81;17503:2;17496:5;17493:13;17485:81;;;17562:1;17548:16;;17529:1;17518:13;17485:81;;;17489:3;;17155:421;17064:518;;;:::o;17758:1299::-;17884:3;17878:10;17911:18;17903:6;17900:30;17897:56;;;17933:18;;:::i;:::-;17962:97;18052:6;18012:38;18044:4;18038:11;18012:38;:::i;:::-;18006:4;17962:97;:::i;:::-;18108:4;18139:2;18128:14;;18156:1;18151:649;;;;18844:1;18861:6;18858:89;;;-1:-1:-1;18913:19:1;;;18907:26;18858:89;-1:-1:-1;;17715:1:1;17711:11;;;17707:24;17703:29;17693:40;17739:1;17735:11;;;17690:57;18960:81;;18121:930;;18151:649;17011:1;17004:14;;;17048:4;17035:18;;-1:-1:-1;;18187:20:1;;;18305:222;18319:7;18316:1;18313:14;18305:222;;;18401:19;;;18395:26;18380:42;;18508:4;18493:20;;;;18461:1;18449:14;;;;18335:12;18305:222;;;18309:3;18555:6;18546:7;18543:19;18540:201;;;18616:19;;;18610:26;-1:-1:-1;;18699:1:1;18695:14;;;18711:3;18691:24;18687:37;18683:42;18668:58;18653:74;;18540:201;-1:-1:-1;;;;18787:1:1;18771:14;;;18767:22;18754:36;;-1:-1:-1;17758:1299:1:o;19062:514::-;19337:2;19326:9;19319:21;19300:4;19363:45;19404:2;19393:9;19389:18;19381:6;19363:45;:::i;:::-;19456:9;19448:6;19444:22;19439:2;19428:9;19424:18;19417:50;19484:43;19520:6;19512;19484:43;:::i;:::-;19476:51;;;19563:6;19558:2;19547:9;19543:18;19536:34;19062:514;;;;;;:::o

Swarm Source

ipfs://7bd209c9e0f23275f4d16d1ef4721f2cc4c2564b049c272733e16ea66538208b

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits

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.