HYPE Price: $30.20 (-2.77%)
 

Overview

HYPE Balance

HyperEVM LogoHyperEVM LogoHyperEVM Logo0 HYPE

HYPE Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Withdraw Funds184798022025-11-06 11:54:0087 days ago1762430040IN
0x6553Ed5c...181D3b06a
0 HYPE0.000099241.672
Withdraw Funds184797412025-11-06 11:53:0087 days ago1762429980IN
0x6553Ed5c...181D3b06a
0 HYPE0.000069191.822
Withdraw Funds181289302025-11-02 12:02:0091 days ago1762084920IN
0x6553Ed5c...181D3b06a
0 HYPE0.000197923.335
Withdraw Funds181280762025-11-02 11:48:0091 days ago1762084080IN
0x6553Ed5c...181D3b06a
0 HYPE0.000345164.515
Unlock Tokens168370352025-10-18 19:00:52106 days ago1760814052IN
0x6553Ed5c...181D3b06a
0 HYPE0.00012651.586
Withdraw Funds167135922025-10-17 9:16:00107 days ago1760692560IN
0x6553Ed5c...181D3b06a
0 HYPE0.000775310.14
Withdraw Funds149104922025-09-26 20:33:00128 days ago1758918780IN
0x6553Ed5c...181D3b06a
0 HYPE0.000141541.851
Place Bet148900572025-09-26 14:58:00128 days ago1758898680IN
0x6553Ed5c...181D3b06a
0 HYPE0.002506318.134
Place Bet148899962025-09-26 14:57:00128 days ago1758898620IN
0x6553Ed5c...181D3b06a
0 HYPE0.0036728811.92
Place Bet148896912025-09-26 14:52:00128 days ago1758898320IN
0x6553Ed5c...181D3b06a
0 HYPE0.002745728.911
Place Bet148171752025-09-25 19:03:13129 days ago1758826993IN
0x6553Ed5c...181D3b06a
0 HYPE0.0045567314.78845992
Place Bet148083182025-09-25 16:38:01129 days ago1758818281IN
0x6553Ed5c...181D3b06a
0 HYPE0.0032545410.56230068
Place Bet147921892025-09-25 12:13:37129 days ago1758802417IN
0x6553Ed5c...181D3b06a
0 HYPE0.0140853445.7126458
Place Bet147855642025-09-25 10:25:00129 days ago1758795900IN
0x6553Ed5c...181D3b06a
0 HYPE0.0004931.6
Place Bet147847712025-09-25 10:12:00129 days ago1758795120IN
0x6553Ed5c...181D3b06a
0 HYPE0.001058463.435
Place Bet147847102025-09-25 10:11:00129 days ago1758795060IN
0x6553Ed5c...181D3b06a
0 HYPE0.000338941.1
Place Bet147846492025-09-25 10:10:00129 days ago1758795000IN
0x6553Ed5c...181D3b06a
0 HYPE0.000338941.1
Place Bet147845882025-09-25 10:09:00129 days ago1758794940IN
0x6553Ed5c...181D3b06a
0 HYPE0.000184870.6
Place Bet147845272025-09-25 10:08:00129 days ago1758794880IN
0x6553Ed5c...181D3b06a
0 HYPE0.000530591.722
Place Bet147844662025-09-25 10:07:00129 days ago1758794820IN
0x6553Ed5c...181D3b06a
0 HYPE0.001125283.652
Place Bet147843442025-09-25 10:05:00129 days ago1758794700IN
0x6553Ed5c...181D3b06a
0 HYPE0.001159483.763
Place Bet147842222025-09-25 10:03:00129 days ago1758794580IN
0x6553Ed5c...181D3b06a
0 HYPE0.000544171.888
Place Bet147842222025-09-25 10:03:00129 days ago1758794580IN
0x6553Ed5c...181D3b06a
0 HYPE0.000566951.84
Place Bet145829472025-09-23 3:03:24131 days ago1758596604IN
0x6553Ed5c...181D3b06a
0 HYPE0.015050648.84528944
Place Bet145508172025-09-22 18:16:41132 days ago1758565001IN
0x6553Ed5c...181D3b06a
0 HYPE0.000734252.38296853
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OpenFortune_Edgeless

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hyperevmscan.io on 2025-07-18
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// File: @openzeppelin/contracts/interfaces/IERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)

pragma solidity ^0.8.20;


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


// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

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

// File: @openzeppelin/contracts/interfaces/IERC165.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)

pragma solidity ^0.8.20;


// File: @openzeppelin/contracts/interfaces/IERC1363.sol


// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)

pragma solidity ^0.8.20;



/**
 * @title IERC1363
 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
 *
 * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
 * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
 */
interface IERC1363 is IERC20, IERC165 {
    /*
     * Note: the ERC-165 identifier for this interface is 0xb0202a11.
     * 0xb0202a11 ===
     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^
     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
     */

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @param data Additional data with no specified format, sent in call to `spender`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.20;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC-20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    /**
     * @dev An operation with an ERC-20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.
     */
    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {
        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.
     */
    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {
        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     *
     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
     * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
     * set here.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            safeTransfer(token, to, value);
        } else if (!token.transferAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferFromAndCallRelaxed(
        IERC1363 token,
        address from,
        address to,
        uint256 value,
        bytes memory data
    ) internal {
        if (to.code.length == 0) {
            safeTransferFrom(token, from, to, value);
        } else if (!token.transferFromAndCall(from, to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
     * once without retrying, and relies on the returned value to be true.
     *
     * Reverts if the returned value is other than `true`.
     */
    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            forceApprove(token, to, value);
        } else if (!token.approveAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            // bubble errors
            if iszero(success) {
                let ptr := mload(0x40)
                returndatacopy(ptr, 0, returndatasize())
                revert(ptr, returndatasize())
            }
            returnSize := returndatasize()
            returnValue := mload(0)
        }

        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        bool success;
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            returnSize := returndatasize()
            returnValue := mload(0)
        }
        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
    }
}

// File: Casino Edgeless.sol



pragma solidity ^0.8.26;




// Proof of Play VRF System interfaces
interface IVRFSystem {
    /**
     * Starts a VRF random number request
     *
     * @param traceId Optional Id to use when tracing the request
     * @return requestId for the random number, will be passed to the callback contract
     */
    function requestRandomNumberWithTraceId(uint256 traceId) external returns (uint256);
}

interface IVRFSystemCallback {
    /**
     * Callback for when a Random Number is delivered
     *
     * @param requestId     Id of the request
     * @param randomNumber   Random number that was generated by the Verified Random Number Generator Tool
     */
    function randomNumberCallback(uint256 requestId, uint256 randomNumber) external;
}

contract OpenFortune_Edgeless is IVRFSystemCallback, ReentrancyGuard {
    using SafeERC20 for IERC20;

    // Custom errors for gas efficiency
    error ModuloOutOfRange();
    error BetAmountOutOfRange();
    error MaskOutOfRange();
    error WinProbabilityOutOfRange();
    error MaxProfitViolation();
    error InsufficientFunds();
    error BetDoesNotExist();
    error BetAlreadySettled();
    error RefundTooEarly();
    error BetMaskTooLarge();
    error InvalidSubscription();
    error InsufficientPoints();
    error LockupNotExpired();
    error NoActiveLockup();
    error OnlyAdmin();
    error InvalidAddress();
    error PointsOverflow();
    error LockupAmountTooLow();    
    error LockupDurationTooShort(); 

    // **FIXED: Proper 20-byte address (40 hex characters)**
    address public constant GAME_TOKEN = 0x0d9316B9fCEbe012e16779690B21BceE5FDDA9E3;

    address public admin;

    modifier onlyAdmin() {
        if (msg.sender != admin) revert OnlyAdmin();
        _;
    }

    // Proof of Play VRF System address
    address public vrfSystemAddress;

    // Points system (adjustable by admin)
    uint256 public requiredPoints = 3630000000000000000000000000000;

    // **NEW: Minimum lockup parameters (adjustable by admin)**
    uint256 public minLockupAmount = 30000000000000000000000;  // Minimum 250k tokens
    uint256 public minLockupDuration = 1210000;   // Minimum 14 days

    // Modulo constants
    uint256 constant MAX_MODULO = 100;
    uint256 constant MAX_MASK_MODULO = 40;
    uint256 constant MAX_BET_MASK = 2 ** MAX_MASK_MODULO;

    // Population count constants
    uint256 constant POPCNT_MULT =
        0x0000000000002000000000100000000008000000000400000000020000000001;
    uint256 constant POPCNT_MASK =
        0x0001041041041041041041041041041041041041041041041041041041041041;
    uint256 constant POPCNT_MODULO = 0x3F;

    // Bet limits
    uint256 public minBetAmount = 1000 ether;
    uint256 public maxBetAmount = 100000 ether;

    // Balance-to-maxProfit ratio
    uint256 public balanceMaxProfitRatio = 5;

    // Funds locked in bets
    uint256 public lockedInBets;

    // Total tokens locked by users for betting privileges
    uint256 public totalUserLockedTokens;

    // **OPTIMIZED: Cache contract balance to reduce expensive operations**
    uint256 private cachedBalance;
    uint256 private lastBalanceUpdate;

    // Lockup information for each user
    struct Lockup {
        uint256 amount;        // Number of tokens locked
        uint256 lockupTime;    // When the lockup started
        uint256 lockupDuration; // How long tokens are locked for
        bool active;           // Whether lockup is active
    }

    // Mapping from user address to their lockup information
    mapping(address => Lockup) public userLockups;

    // Bet structure
    struct Bet {
        uint256 amount;
        uint8 modulo;
        uint8 rollUnder;
        uint40 mask;
        uint256 placeBlockNumber;
        address gambler;
        bool isSettled;
        uint256 outcome;
        uint256 winAmount;
    }

    // Array of bets
    Bet[] public bets;

    // Mapping requestId to bet Id
    mapping(uint256 => uint256) public betMap;

    // House profit tracking
    int256 public houseProfit;

    event AdminTransferred(address indexed previousAdmin, address indexed newAdmin);

    // Events
    event BetPlaced(
        uint256 indexed betId,
        address indexed gambler,
        uint256 amount,
        uint8 indexed modulo,
        uint8 rollUnder,
        uint40 mask,
        uint256 requestId,
        uint256 timestamp
    );

    event BetSettled(
        uint256 indexed betId,
        address indexed gambler,
        uint256 amount,
        uint8 indexed modulo,
        uint8 rollUnder,
        uint40 mask,
        uint256 outcome,
        uint256 winAmount,
        uint256 timestamp
    );

    event BetRefunded(
        uint256 indexed betId,
        address indexed gambler,
        uint256 amount,
        uint256 timestamp
    );

    event RandomnessRequested(uint256 indexed requestId, uint256 indexed betId);
    event RandomnessFulfilled(uint256 indexed requestId, uint256 indexed betId);

    event TokensLocked(
        address indexed user,
        uint256 amount,
        uint256 lockupDuration,
        uint256 lockupTime,
        uint256 points
    );
    
    event TokensUnlocked(
        address indexed user,
        uint256 amount,
        uint256 timestamp
    );

    event RequiredPointsUpdated(uint256 oldPoints, uint256 newPoints);
    event BetLimitsUpdated(uint256 minBet, uint256 maxBet);
    event VRFSystemAddressUpdated(address indexed oldAddress, address indexed newAddress);
    
    // **NEW EVENTS**
    event MinLockupAmountUpdated(uint256 oldAmount, uint256 newAmount);
    event MinLockupDurationUpdated(uint256 oldDuration, uint256 newDuration);

    constructor(
        address _vrfSystemAddress,
        address initialAdmin
    ) {
        vrfSystemAddress = _vrfSystemAddress;
        _transferAdmin(initialAdmin);
        _updateCachedBalance();
    }

    // **OPTIMIZED: Efficient balance caching to reduce expensive operations**
    function _updateCachedBalance() private {
        cachedBalance = IERC20(GAME_TOKEN).balanceOf(address(this));
        lastBalanceUpdate = block.number;
    }

    function _getCachedBalance() private view returns (uint256) {
        // If balance was updated recently (within 5 blocks), use cached value
        if (block.number <= lastBalanceUpdate + 5) {
            return cachedBalance;
        }
        // Otherwise, return fresh balance (but don't update cache in view function)
        return IERC20(GAME_TOKEN).balanceOf(address(this));
    }

    function _getAndUpdateBalance() private returns (uint256) {
        _updateCachedBalance();
        return cachedBalance;
    }

    // Admin management functions
    function transferAdmin(address newAdmin) public onlyAdmin {
        if (newAdmin == address(0)) revert InvalidAddress();
        _transferAdmin(newAdmin);
    }

    function renounceAdmin() public onlyAdmin {
        _transferAdmin(address(0));
    }

    function _transferAdmin(address newAdmin) internal {
        address oldAdmin = admin;
        admin = newAdmin;
        emit AdminTransferred(oldAdmin, newAdmin);
    }

    // **OPTIMIZED: Use cached balance**
    function balance() external view returns (uint256) {
        return _getCachedBalance();
    }

    function maxProfit() public view returns (uint256) {
        return _getCachedBalance() / balanceMaxProfitRatio;
    }

    /**
     * @dev Returns the amount of tokens available for admin withdrawal
     */
    function availableForWithdrawal() public view returns (uint256) {
        uint256 contractBalance = _getCachedBalance();
        uint256 totalReserved = totalUserLockedTokens + lockedInBets;
        
        if (contractBalance <= totalReserved) {
            return 0;
        }
        
        return contractBalance - totalReserved;
    }

    /**
     * @dev Returns detailed balance breakdown for transparency
     */
    function getBalanceBreakdown() external view returns (
        uint256 totalBalance,
        uint256 userLockedTokens,
        uint256 betLockedTokens,
        uint256 availableForAdminWithdrawal
    ) {
        uint256 contractBalance = _getCachedBalance();
        return (
            contractBalance,
            totalUserLockedTokens,
            lockedInBets,
            availableForWithdrawal()
        );
    }

    // **FIXED: Added overflow checks for points calculation**
    function getUserPoints(address user) public view returns (uint256) {
        Lockup storage lockup = userLockups[user];
        if (!lockup.active) {
            return 0;
        }
        
        // Check for overflow before multiplication
        if (lockup.amount > type(uint256).max / lockup.lockupDuration) {
            revert PointsOverflow();
        }
        
        // Points = tokens × lockup duration (in seconds)
        return lockup.amount * lockup.lockupDuration;
    }

    // Check if user has enough points to bet
    function hasEnoughPoints(address user) public view returns (bool) {
        return getUserPoints(user) >= requiredPoints;
    }

    // Check if user can unlock (lockup period has expired)
    function canUnlock(address user) public view returns (bool) {
        Lockup storage lockup = userLockups[user];
        return lockup.active && 
               block.timestamp >= lockup.lockupTime + lockup.lockupDuration;
    }

    // **FIXED: Split getUserLockup to avoid stack too deep**
    function getUserLockupBasic(address user) external view returns (
        uint256 amount,
        uint256 lockupTime,
        uint256 lockupDuration,
        bool active
    ) {
        Lockup storage lockup = userLockups[user];
        return (
            lockup.amount,
            lockup.lockupTime,
            lockup.lockupDuration,
            lockup.active
        );
    }

    function getUserLockupStatus(address user) external view returns (
        uint256 unlockTime,
        uint256 points,
        bool canBet
    ) {
        Lockup storage lockup = userLockups[user];
        uint256 points = getUserPoints(user);
        return (
            lockup.lockupTime + lockup.lockupDuration,
            points,
            points >= requiredPoints
        );
    }

    function getUserCanUnlock(address user) external view returns (bool) {
        return canUnlock(user);
    }

    // **NEW: Get minimum lockup requirements**
    function getMinLockupRequirements() external view returns (
        uint256 minAmount,
        uint256 minDuration
    ) {
        return (minLockupAmount, minLockupDuration);
    }

    // Admin functions
    function setRequiredPoints(uint256 _requiredPoints) external onlyAdmin {
        require(_requiredPoints > 0, "Required points must be greater than 0");
        uint256 oldPoints = requiredPoints;
        requiredPoints = _requiredPoints;
        emit RequiredPointsUpdated(oldPoints, _requiredPoints);
    }

    // **NEW: Admin function to set minimum lockup amount**
    function setMinLockupAmount(uint256 _minLockupAmount) external onlyAdmin {
        require(_minLockupAmount > 0, "Min lockup amount must be greater than 0");
        uint256 oldAmount = minLockupAmount;
        minLockupAmount = _minLockupAmount;
        emit MinLockupAmountUpdated(oldAmount, _minLockupAmount);
    }

    // **NEW: Admin function to set minimum lockup duration**
    function setMinLockupDuration(uint256 _minLockupDuration) external onlyAdmin {
        require(_minLockupDuration > 0, "Min lockup duration must be greater than 0");
        require(_minLockupDuration <= 31560000, "Min lockup duration cannot exceed 1 year");
        uint256 oldDuration = minLockupDuration;
        minLockupDuration = _minLockupDuration;
        emit MinLockupDurationUpdated(oldDuration, _minLockupDuration);
    }

    function setBalanceMaxProfitRatio(uint256 _balanceMaxProfitRatio) external onlyAdmin {
        require(_balanceMaxProfitRatio > 0, "Ratio must be greater than 0");
        balanceMaxProfitRatio = _balanceMaxProfitRatio;
    }

    // Admin function to set VRF system address
    function setVRFSystemAddress(address _vrfSystemAddress) external onlyAdmin {
        require(_vrfSystemAddress != address(0), "Invalid VRF system address");
        address oldAddress = vrfSystemAddress;
        vrfSystemAddress = _vrfSystemAddress;
        emit VRFSystemAddressUpdated(oldAddress, _vrfSystemAddress);
    }

    function setMinBetAmount(uint256 _minBetAmount) external onlyAdmin {
        require(_minBetAmount > 0, "Min bet must be greater than 0");
        minBetAmount = _minBetAmount;
        emit BetLimitsUpdated(_minBetAmount, maxBetAmount);
    }

    function setMaxBetAmount(uint256 _maxBetAmount) external onlyAdmin {
        require(_maxBetAmount >= minBetAmount, "Max bet must be >= min bet");
        maxBetAmount = _maxBetAmount;
        emit BetLimitsUpdated(minBetAmount, _maxBetAmount);
    }

    // **FIXED: Removed reentrancy by updating state before external calls**
    // **UPDATED: Added minimum lockup validations**
    function lockTokens(uint256 amount, uint256 lockupDuration) external nonReentrant {
        require(amount > 0, "Amount must be greater than 0");
        require(lockupDuration > 0, "Lockup duration must be greater than 0");
        require(!userLockups[msg.sender].active, "Already have active lockup");

        // **NEW: Validate minimum lockup requirements**
        if (amount < minLockupAmount) revert LockupAmountTooLow();
        if (lockupDuration < minLockupDuration) revert LockupDurationTooShort();

        // **FIXED: Added overflow check for points calculation**
        if (amount > type(uint256).max / lockupDuration) {
            revert PointsOverflow();
        }

        // **FIXED: Update state before external call**
        totalUserLockedTokens += amount;

        // Record lockup
        userLockups[msg.sender] = Lockup({
            amount: amount,
            lockupTime: block.timestamp,
            lockupDuration: lockupDuration,
            active: true
        });

        // Transfer tokens from user to contract (after state updates)
        IERC20(GAME_TOKEN).safeTransferFrom(msg.sender, address(this), amount);
        _updateCachedBalance();

        emit TokensLocked(
            msg.sender,
            amount,
            lockupDuration,
            block.timestamp,
            amount * lockupDuration
        );
    }

    // **FIXED: Removed reentrancy by updating state before external calls**
    function unlockTokens() external nonReentrant {
        Lockup storage lockup = userLockups[msg.sender];
        
        if (!lockup.active) revert NoActiveLockup();
        if (block.timestamp < lockup.lockupTime + lockup.lockupDuration) revert LockupNotExpired();

        uint256 amount = lockup.amount;
        
        // **FIXED: Update state before external call**
        totalUserLockedTokens -= amount;
        
        // Clear lockup
        lockup.active = false;
        lockup.amount = 0;
        lockup.lockupTime = 0;
        lockup.lockupDuration = 0;

        // Transfer tokens back to user (after state updates)
        IERC20(GAME_TOKEN).safeTransfer(msg.sender, amount);
        _updateCachedBalance();

        emit TokensUnlocked(msg.sender, amount, block.timestamp);
    }

    function placeBet(
        uint256 amount,
        uint256 betMask,
        uint256 modulo
    ) external nonReentrant {
        // Check if user has enough points
        if (!hasEnoughPoints(msg.sender)) revert InsufficientPoints();
        
        // Validate input data
        _validateBetInputs(amount, betMask, modulo);

        // **FIXED: Update cached balance after token transfer**
        IERC20(GAME_TOKEN).safeTransferFrom(msg.sender, address(this), amount);
        _updateCachedBalance();

        // Process bet mask and calculate rollUnder
        (uint256 rollUnder, uint256 mask) = _processBetMask(betMask, modulo);

        // Create and store bet
        uint256 betId = _createBet(amount, modulo, rollUnder, mask);

        // Request randomness and emit events
        _requestRandomnessAndEmit(betId, amount, modulo, rollUnder, mask);
    }

    function _validateBetInputs(uint256 amount, uint256 betMask, uint256 modulo) private view {
        if (vrfSystemAddress == address(0)) revert InvalidSubscription();
        if (modulo <= 1 || modulo > MAX_MODULO) revert ModuloOutOfRange();
        if (amount < minBetAmount || amount > maxBetAmount) revert BetAmountOutOfRange();
        if (betMask == 0 || betMask >= MAX_BET_MASK) revert MaskOutOfRange();
    }

    function _processBetMask(uint256 betMask, uint256 modulo) private pure returns (uint256 rollUnder, uint256 mask) {
        if (modulo <= MAX_MASK_MODULO) {
            rollUnder = ((betMask * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO;
            mask = betMask;
        } else {
            if (betMask == 0 || betMask > modulo) revert BetMaskTooLarge();
            rollUnder = betMask;
            mask = 0;
        }
    }

    function _createBet(uint256 amount, uint256 modulo, uint256 rollUnder, uint256 mask) private returns (uint256 betId) {
        // Winning amount (no house edge)
        uint256 possibleWinAmount = getWinAmount(amount, modulo, rollUnder);

        // Enforce max profit limit
        if (possibleWinAmount > amount + maxProfit()) revert MaxProfitViolation();

        // **OPTIMIZED: Use cached balance**
        if (lockedInBets + possibleWinAmount > cachedBalance) {
            revert InsufficientFunds();
        }

        // Update locked funds
        lockedInBets += possibleWinAmount;

        // Store bet
        betId = bets.length;
        bets.push(
            Bet({
                amount: amount,
                modulo: uint8(modulo),
                rollUnder: uint8(rollUnder),
                mask: uint40(mask),
                placeBlockNumber: block.number,
                gambler: msg.sender,
                isSettled: false,
                outcome: 0,
                winAmount: 0
            })
        );
    }

    function _requestRandomnessAndEmit(
        uint256 betId,
        uint256 amount,
        uint256 modulo,
        uint256 rollUnder,
        uint256 mask
    ) private {
        // Request random number from Proof of Play VRF System
        // Use betId as traceId for tracking
        uint256 requestId = IVRFSystem(vrfSystemAddress).requestRandomNumberWithTraceId(betId);
        betMap[requestId] = betId;

        // Emit events
        emit RandomnessRequested(requestId, betId);
        emit BetPlaced(
            betId,
            msg.sender,
            amount,
            uint8(modulo),
            uint8(rollUnder),
            uint40(mask),
            requestId,
            block.timestamp
        );
    }

    // Calculate win amount (no house edge)
    function getWinAmount(
        uint256 amount,
        uint256 modulo,
        uint256 rollUnder
    ) private pure returns (uint256 winAmount) {
        if (rollUnder == 0 || rollUnder > modulo) revert WinProbabilityOutOfRange();
        winAmount = (amount * modulo) / rollUnder;
    }

    // Proof of Play VRF callback - must be external and only callable by VRF system
    function randomNumberCallback(uint256 requestId, uint256 randomNumber) external {
        require(msg.sender == vrfSystemAddress, "Only VRF system can call this");
        
        // Add entropy to ensure unique random numbers per request
        // Using the recommended hash-based approach from Proof of Play documentation
        uint256 enhancedRandomNumber = uint256(keccak256(abi.encodePacked(blockhash(block.number - (requestId % 256)), randomNumber)));
        
        settleBet(requestId, enhancedRandomNumber);
    }

    // Settle bet
    function settleBet(uint256 requestId, uint256 randomNumber) internal {
        uint256 betId = betMap[requestId];
        Bet storage bet = bets[betId];
        uint256 amount = bet.amount;

        if (amount == 0) revert BetDoesNotExist();
        if (bet.isSettled) revert BetAlreadySettled();

        emit RandomnessFulfilled(requestId, betId);

        uint256 modulo = bet.modulo;
        uint256 rollUnder = bet.rollUnder;
        address gambler = bet.gambler;

        uint256 outcome = randomNumber % modulo;
        uint256 possibleWinAmount = getWinAmount(amount, modulo, rollUnder);
        uint256 winAmount = 0;

        // Determine outcome
        if (modulo <= MAX_MASK_MODULO) {
            if (((2 ** outcome) & bet.mask) != 0) {
                winAmount = possibleWinAmount;
            }
        } else {
            if (outcome < rollUnder) {
                winAmount = possibleWinAmount;
            }
        }

        // Unlock funds
        lockedInBets -= possibleWinAmount;

        // Update bet
        bet.isSettled = true;
        bet.winAmount = winAmount;
        bet.outcome = outcome;

        // Handle payout
        if (winAmount > 0) {
            houseProfit -= int256(winAmount - amount);
            IERC20(GAME_TOKEN).safeTransfer(gambler, winAmount);
            _updateCachedBalance();
        } else {
            houseProfit += int256(amount);
        }

        emit BetSettled(
            betId,
            gambler,
            amount,
            uint8(modulo),
            uint8(rollUnder),
            bet.mask,
            outcome,
            winAmount,
            block.timestamp
        );
    }

    function withdrawFunds(address beneficiary, uint256 withdrawAmount) external onlyAdmin {
        if (beneficiary == address(0)) revert InvalidAddress();
        
        uint256 maxWithdrawable = availableForWithdrawal();
        require(withdrawAmount <= maxWithdrawable, "Withdrawal exceeds available funds");
        
        IERC20(GAME_TOKEN).safeTransfer(beneficiary, withdrawAmount);
        _updateCachedBalance();
    }

    // Refund bet
    function refundBet(uint256 betId) external nonReentrant {
        Bet storage bet = bets[betId];
        uint256 amount = bet.amount;

        if (amount == 0) revert BetDoesNotExist();
        if (bet.isSettled) revert BetAlreadySettled();
        if (block.number <= bet.placeBlockNumber + 21600) revert RefundTooEarly();

        uint256 possibleWinAmount = getWinAmount(amount, bet.modulo, bet.rollUnder);

        lockedInBets -= possibleWinAmount;
        bet.isSettled = true;
        bet.winAmount = amount;

        IERC20(GAME_TOKEN).safeTransfer(bet.gambler, amount);
        _updateCachedBalance();
        emit BetRefunded(betId, bet.gambler, amount, block.timestamp);
    }

    function emergencyWithdraw() external onlyAdmin {
        uint256 contractBalance = _getAndUpdateBalance();
        if (contractBalance > 0) {
            IERC20(GAME_TOKEN).safeTransfer(admin, contractBalance);
            totalUserLockedTokens = 0;
            lockedInBets = 0;
            _updateCachedBalance();
        }
    }

    // **FIXED: Split getBetDetails to avoid stack too deep**
    function getBetBasicInfo(uint256 betId) external view returns (
        uint256 amount,
        uint8 modulo,
        uint8 rollUnder,
        uint40 mask,
        address gambler
    ) {
        require(betId < bets.length, "Bet does not exist");
        Bet storage bet = bets[betId];

        return (
            bet.amount,
            bet.modulo,
            bet.rollUnder,
            bet.mask,
            bet.gambler
        );
    }

    function getBetStatus(uint256 betId) external view returns (
        uint256 placeBlockNumber,
        bool isSettled,
        uint256 outcome,
        uint256 winAmount
    ) {
        require(betId < bets.length, "Bet does not exist");
        Bet storage bet = bets[betId];

        return (
            bet.placeBlockNumber,
            bet.isSettled,
            bet.outcome,
            bet.winAmount
        );
    }


    // **OPTIMIZED: Added function to manually refresh balance cache if needed**
    function refreshBalanceCache() external {
        _updateCachedBalance();
    }

    // Get number of bets
    function getBetsLength() external view returns (uint256) {
        return bets.length;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_vrfSystemAddress","type":"address"},{"internalType":"address","name":"initialAdmin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BetAlreadySettled","type":"error"},{"inputs":[],"name":"BetAmountOutOfRange","type":"error"},{"inputs":[],"name":"BetDoesNotExist","type":"error"},{"inputs":[],"name":"BetMaskTooLarge","type":"error"},{"inputs":[],"name":"InsufficientFunds","type":"error"},{"inputs":[],"name":"InsufficientPoints","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidSubscription","type":"error"},{"inputs":[],"name":"LockupAmountTooLow","type":"error"},{"inputs":[],"name":"LockupDurationTooShort","type":"error"},{"inputs":[],"name":"LockupNotExpired","type":"error"},{"inputs":[],"name":"MaskOutOfRange","type":"error"},{"inputs":[],"name":"MaxProfitViolation","type":"error"},{"inputs":[],"name":"ModuloOutOfRange","type":"error"},{"inputs":[],"name":"NoActiveLockup","type":"error"},{"inputs":[],"name":"OnlyAdmin","type":"error"},{"inputs":[],"name":"PointsOverflow","type":"error"},{"inputs":[],"name":"RefundTooEarly","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"WinProbabilityOutOfRange","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minBet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxBet","type":"uint256"}],"name":"BetLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"},{"indexed":true,"internalType":"address","name":"gambler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint8","name":"modulo","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"rollUnder","type":"uint8"},{"indexed":false,"internalType":"uint40","name":"mask","type":"uint40"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BetPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"},{"indexed":true,"internalType":"address","name":"gambler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BetRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"},{"indexed":true,"internalType":"address","name":"gambler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint8","name":"modulo","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"rollUnder","type":"uint8"},{"indexed":false,"internalType":"uint40","name":"mask","type":"uint40"},{"indexed":false,"internalType":"uint256","name":"outcome","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BetSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"MinLockupAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"MinLockupDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"}],"name":"RandomnessFulfilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"}],"name":"RandomnessRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPoints","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPoints","type":"uint256"}],"name":"RequiredPointsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockupDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockupTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"points","type":"uint256"}],"name":"TokensLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"VRFSystemAddressUpdated","type":"event"},{"inputs":[],"name":"GAME_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableForWithdrawal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceMaxProfitRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"betMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bets","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"modulo","type":"uint8"},{"internalType":"uint8","name":"rollUnder","type":"uint8"},{"internalType":"uint40","name":"mask","type":"uint40"},{"internalType":"uint256","name":"placeBlockNumber","type":"uint256"},{"internalType":"address","name":"gambler","type":"address"},{"internalType":"bool","name":"isSettled","type":"bool"},{"internalType":"uint256","name":"outcome","type":"uint256"},{"internalType":"uint256","name":"winAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"canUnlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBalanceBreakdown","outputs":[{"internalType":"uint256","name":"totalBalance","type":"uint256"},{"internalType":"uint256","name":"userLockedTokens","type":"uint256"},{"internalType":"uint256","name":"betLockedTokens","type":"uint256"},{"internalType":"uint256","name":"availableForAdminWithdrawal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"}],"name":"getBetBasicInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"modulo","type":"uint8"},{"internalType":"uint8","name":"rollUnder","type":"uint8"},{"internalType":"uint40","name":"mask","type":"uint40"},{"internalType":"address","name":"gambler","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"}],"name":"getBetStatus","outputs":[{"internalType":"uint256","name":"placeBlockNumber","type":"uint256"},{"internalType":"bool","name":"isSettled","type":"bool"},{"internalType":"uint256","name":"outcome","type":"uint256"},{"internalType":"uint256","name":"winAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBetsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinLockupRequirements","outputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minDuration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserCanUnlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserLockupBasic","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockupTime","type":"uint256"},{"internalType":"uint256","name":"lockupDuration","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserLockupStatus","outputs":[{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"bool","name":"canBet","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"hasEnoughPoints","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseProfit","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockupDuration","type":"uint256"}],"name":"lockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockedInBets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockupAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockupDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"betMask","type":"uint256"},{"internalType":"uint256","name":"modulo","type":"uint256"}],"name":"placeBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256","name":"randomNumber","type":"uint256"}],"name":"randomNumberCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshBalanceCache","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"}],"name":"refundBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requiredPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_balanceMaxProfitRatio","type":"uint256"}],"name":"setBalanceMaxProfitRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBetAmount","type":"uint256"}],"name":"setMaxBetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBetAmount","type":"uint256"}],"name":"setMinBetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minLockupAmount","type":"uint256"}],"name":"setMinLockupAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minLockupDuration","type":"uint256"}],"name":"setMinLockupDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requiredPoints","type":"uint256"}],"name":"setRequiredPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vrfSystemAddress","type":"address"}],"name":"setVRFSystemAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalUserLockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLockups","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockupTime","type":"uint256"},{"internalType":"uint256","name":"lockupDuration","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vrfSystemAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526c2dd1299fa21e7a5fa1b000000060035569065a4da25d3016c0000060045562127690600555683635c9adc5dea0000060065569152d02c7e14af68000006007556005600855348015610055575f80fd5b506040516146173803806146178339818101604052810190610077919061029e565b60015f819055508160025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506100cd816100e260201b60201c565b6100db6101a560201b60201c565b5050610362565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec660405160405180910390a35050565b730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016101f291906102eb565b602060405180830381865afa15801561020d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102319190610337565b600b8190555043600c81905550565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61026d82610244565b9050919050565b61027d81610263565b8114610287575f80fd5b50565b5f8151905061029881610274565b92915050565b5f80604083850312156102b4576102b3610240565b5b5f6102c18582860161028a565b92505060206102d28582860161028a565b9150509250929050565b6102e581610263565b82525050565b5f6020820190506102fe5f8301846102dc565b92915050565b5f819050919050565b61031681610304565b8114610320575f80fd5b50565b5f815190506103318161030d565b92915050565b5f6020828403121561034c5761034b610240565b5b5f61035984828501610323565b91505092915050565b6142a88061036f5f395ff3fe608060405234801561000f575f80fd5b5060043610610288575f3560e01c80638f561acc1161015a578063d0dad98d116100cc578063e932636011610085578063e9326360146107c9578063e93a242d146107e7578063f061a7a614610805578063f851a44014610821578063f968f4931461083f578063fa968eea1461084957610288565b8063d0dad98d14610704578063db2e21bc14610737578063df88126f14610741578063e1fdb4b41461075f578063e71c96971461077b578063e8c964cc1461079757610288565b8063b69ef8a81161011e578063b69ef8a814610663578063b6b260bd14610681578063c1075329146106a2578063cab11d5d146106be578063cbcbbd05146106dc578063cc4580c8146106e657610288565b80638f561acc146105a95780639f7f12ba146105c5578063aeefe31f146105f9578063b01f3b5314610629578063b539cd551461064557610288565b806361f14f11116101fe5780637690292f116101b75780637690292f1461050d5780637cfbc7a51461052b5780637d4620ed1461054757806388fedd041461056557806389158d8e146105835780638bad0c0a1461059f57610288565b806361f14f111461043557806368174fc4146104685780636c188593146104875780636e12b46e146104a3578063748e91bd146104c157806375829def146104f157610288565b806328f75b111161025057806328f75b111461036357806335ba9af81461037f5780634055f2731461039d5780634296a370146103b957806359e20b68146103e95780635d1837b81461041957610288565b806305b259801461028c5780630d7b2609146102bc57806312fb3175146102da57806322af00fa1461030d57806327b5488914610345575b5f80fd5b6102a660048036038101906102a191906131b4565b610867565b6040516102b391906131ee565b60405180910390f35b6102c461087c565b6040516102d191906131ee565b60405180910390f35b6102f460048036038101906102ef9190613261565b610882565b60405161030494939291906132a6565b60405180910390f35b610327600480360381019061032291906131b4565b6108ba565b60405161033c99989796959493929190613332565b60405180910390f35b61034d610969565b60405161035a91906131ee565b60405180910390f35b61037d600480360381019061037891906131b4565b61096f565b005b610387610a81565b60405161039491906131ee565b60405180910390f35b6103b760048036038101906103b291906131b4565b610ac5565b005b6103d360048036038101906103ce9190613261565b610c1e565b6040516103e091906133bd565b60405180910390f35b61040360048036038101906103fe9190613261565b610c34565b60405161041091906133bd565b60405180910390f35b610433600480360381019061042e91906131b4565b610cad565b005b61044f600480360381019061044a91906131b4565b610d7f565b60405161045f94939291906133d6565b60405180910390f35b610470610e1e565b60405161047e929190613419565b60405180910390f35b6104a1600480360381019061049c91906131b4565b610e2e565b005b6104ab610f3b565b6040516104b891906131ee565b60405180910390f35b6104db60048036038101906104d69190613261565b610f41565b6040516104e891906133bd565b60405180910390f35b61050b60048036038101906105069190613261565b610f52565b005b610515611049565b6040516105229190613440565b60405180910390f35b610545600480360381019061054091906131b4565b611061565b005b61054f611171565b60405161055c91906131ee565b60405180910390f35b61056d611177565b60405161057a9190613471565b60405180910390f35b61059d6004803603810190610598919061348a565b61117d565b005b6105a76114de565b005b6105c360048036038101906105be919061348a565b61156f565b005b6105df60048036038101906105da91906131b4565b611654565b6040516105f09594939291906134c8565b60405180910390f35b610613600480360381019061060e9190613261565b611738565b60405161062091906131ee565b60405180910390f35b610643600480360381019061063e91906131b4565b61181f565b005b61064d611931565b60405161065a91906131ee565b60405180910390f35b61066b61194c565b60405161067891906131ee565b60405180910390f35b61068961195a565b6040516106999493929190613519565b60405180910390f35b6106bc60048036038101906106b7919061355c565b611987565b005b6106c6611b0c565b6040516106d391906131ee565b60405180910390f35b6106e4611b12565b005b6106ee611b1c565b6040516106fb91906131ee565b60405180910390f35b61071e60048036038101906107199190613261565b611b28565b60405161072e94939291906132a6565b60405180910390f35b61073f611b9b565b005b610749611cae565b60405161075691906131ee565b60405180910390f35b610779600480360381019061077491906131b4565b611cb4565b005b6107956004803603810190610790919061359a565b611f11565b005b6107b160048036038101906107ac9190613261565b611fe8565b6040516107c0939291906135ea565b60405180910390f35b6107d1612061565b6040516107de91906131ee565b60405180910390f35b6107ef612067565b6040516107fc9190613440565b60405180910390f35b61081f600480360381019061081a9190613261565b61208c565b005b610829612243565b6040516108369190613440565b60405180910390f35b610847612268565b005b61085161243b565b60405161085e91906131ee565b60405180910390f35b600f602052805f5260405f205f915090505481565b60055481565b600d602052805f5260405f205f91509050805f015490806001015490806002015490806003015f9054906101000a900460ff16905084565b600e81815481106108c9575f80fd5b905f5260205f2090600602015f91509050805f015490806001015f9054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900464ffffffffff1690806002015490806003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160149054906101000a900460ff16908060040154908060050154905089565b60085481565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109f5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e9061369f565b60405180910390fd5b5f6004549050816004819055507f97f998e1af0c17f1ce3cd73ce4c47afac693a5e91d450979f78e444e2f13f4038183604051610a75929190613419565b60405180910390a15050565b5f80610a8b612441565b90505f600954600a54610a9e91906136ea565b9050808211610ab1575f92505050610ac2565b8082610abd919061371d565b925050505b90565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b84906137c0565b60405180910390fd5b6301e19140811115610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061384e565b60405180910390fd5b5f6005549050816005819055507ff837ee41a0c42fad1ee31ed3dadf0ac7de61c94037ec0c2ed109cc89ceda31ed8183604051610c12929190613419565b60405180910390a15050565b5f600354610c2b83611738565b10159050919050565b5f80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806003015f9054906101000a900460ff168015610ca5575080600201548160010154610ca191906136ea565b4210155b915050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d33576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c906138b6565b60405180910390fd5b8060088190555050565b5f805f80600e805490508510610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc19061391e565b60405180910390fd5b5f600e8681548110610ddf57610dde61393c565b5b905f5260205f209060060201905080600201548160030160149054906101000a900460ff16826004015483600501549450945094509450509193509193565b5f80600454600554915091509091565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eb4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906139b3565b60405180910390fd5b806006819055507ff483a8cf66fadba78e10f404e5f1639eb2a336535936e1af01f333d1215378d181600754604051610f30929190613419565b60405180910390a150565b60035481565b5f610f4b82610c34565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fd8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361103d576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611046816124f3565b50565b730d9316b9fcebe012e16779690b21bcee5fdda9e381565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110e7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065481101561112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112390613a1b565b60405180910390fd5b806007819055507ff483a8cf66fadba78e10f404e5f1639eb2a336535936e1af01f333d1215378d160065482604051611166929190613419565b60405180910390a150565b600a5481565b60105481565b6111856125b6565b5f82116111c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111be90613a83565b60405180910390fd5b5f8111611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120090613b11565b60405180910390fd5b600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015f9054906101000a900460ff1615611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90613b79565b60405180910390fd5b6004548210156112d2576040517fd5691c6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055481101561130e576040517fd0954d5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61133a9190613bc4565b821115611373576040517f68101d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600a5f82825461138491906136ea565b92505081905550604051806080016040528083815260200142815260200182815260200160011515815250600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff02191690831515021790555090505061146b333084730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612603909392919063ffffffff16565b611473612685565b3373ffffffffffffffffffffffffffffffffffffffff167fa2e3c0f7de988ae3bbc6bbd90484543ee1f08d1534bb75c6cf1337a7da7d9c5183834285876114ba9190613bf4565b6040516114ca9493929190613519565b60405180910390a26114da612720565b5050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611564576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61156d5f6124f3565b565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613c7f565b60405180910390fd5b5f6101008361160d9190613c9d565b43611618919061371d565b408260405160200161162b929190613d16565b604051602081830303815290604052805190602001205f1c905061164f8382612729565b505050565b5f805f805f600e8054905086106116a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116979061391e565b60405180910390fd5b5f600e87815481106116b5576116b461393c565b5b905f5260205f2090600602019050805f0154816001015f9054906101000a900460ff168260010160019054906101000a900460ff168360010160029054906101000a900464ffffffffff16846003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16955095509550955095505091939590929450565b5f80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806003015f9054906101000a900460ff16611797575f91505061181a565b80600201547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6117c79190613bc4565b815f01541115611803576040517f68101d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020154815f01546118169190613bf4565b9150505b919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118a5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81116118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90613db1565b60405180910390fd5b5f6003549050816003819055507fa46806ff51923197aa41dae804490d6ed998d8285767f20ec8035bb9e0fee1408183604051611925929190613419565b60405180910390a15050565b5f60085461193d612441565b6119479190613bc4565b905090565b5f611955612441565b905090565b5f805f805f611967612441565b905080600a54600954611978610a81565b94509450945094505090919293565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a0d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a72576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611a7b610a81565b905080821115611ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab790613e3f565b60405180910390fd5b611aff8383730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b611b07612685565b505050565b60075481565b611b1a612685565b565b5f600e80549050905090565b5f805f805f600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050805f015481600101548260020154836003015f9054906101000a900460ff169450945094509450509193509193565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c21576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611c2a612ab0565b90505f811115611cab57611c9460015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b5f600a819055505f600981905550611caa612685565b5b50565b60095481565b611cbc6125b6565b5f600e8281548110611cd157611cd061393c565b5b905f5260205f20906006020190505f815f015490505f8103611d1f576040517f7f36fbaa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160030160149054906101000a900460ff1615611d68576040517f05d09e5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6154608260020154611d7a91906136ea565b4311611db2576040517f9403b55e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611de582846001015f9054906101000a900460ff1660ff168560010160019054906101000a900460ff1660ff16612ac1565b90508060095f828254611df8919061371d565b9250508190555060018360030160146101000a81548160ff021916908315150217905550818360050181905550611e87836003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b611e8f612685565b826003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16847fe282fd838bb937af0c0f54e49ba5f86229ed0c90344c3cc4e2135cb673493e698442604051611efb929190613419565b60405180910390a3505050611f0e612720565b50565b611f196125b6565b611f2233610c1e565b611f58576040517f303e7a0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f63838383612b26565b611fa4333085730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612603909392919063ffffffff16565b611fac612685565b5f80611fb88484612c92565b915091505f611fc986858585612d4b565b9050611fd88187868686612f9e565b505050611fe3612720565b505050565b5f805f80600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f61203586611738565b90508160020154826001015461204b91906136ea565b8160035483101594509450945050509193909250565b60045481565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612112576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217790613ea7565b60405180910390fd5b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f40870cc17b6e83c1d34e59c75afe284643dcf63ef40c53964ee3d950441b7e3f60405160405180910390a35050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122706125b6565b5f600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806003015f9054906101000a900460ff166122f7576040517fc51d021e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020154816001015461230b91906136ea565b421015612344576040517fa9c437c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815f0154905080600a5f82825461235c919061371d565b925050819055505f826003015f6101000a81548160ff0219169083151502179055505f825f01819055505f82600101819055505f82600201819055506123d73382730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b6123df612685565b3373ffffffffffffffffffffffffffffffffffffffff167f89882ad382a3742d4db24e4dabc5000c5852aed762904db28442e4e1630a1d078242604051612427929190613419565b60405180910390a25050612439612720565b565b60065481565b5f6005600c5461245191906136ea565b431161246157600b5490506124f0565b730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124ae9190613440565b602060405180830381865afa1580156124c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124ed9190613ed9565b90505b90565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec660405160405180910390a35050565b60025f54036125fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f190613f4e565b60405180910390fd5b60025f81905550565b61267f848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161263893929190613f6c565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e2565b50505050565b730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016126d29190613440565b602060405180830381865afa1580156126ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127119190613ed9565b600b8190555043600c81905550565b60015f81905550565b5f600f5f8481526020019081526020015f205490505f600e82815481106127535761275261393c565b5b905f5260205f20906006020190505f815f015490505f81036127a1576040517f7f36fbaa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160030160149054906101000a900460ff16156127ea576040517f05d09e5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82857f546aca7b2683440b8f02fa95faeb8efc79dd0f16af3d815a002742ea6f76116c60405160405180910390a35f826001015f9054906101000a900460ff1660ff1690505f8360010160019054906101000a900460ff1660ff1690505f846003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f838861287b9190613c9d565b90505f612889868686612ac1565b90505f602886116128ce575f8860010160029054906101000a900464ffffffffff1664ffffffffff168460026128bf91906140d0565b16146128c9578190505b6128db565b848310156128da578190505b5b8160095f8282546128ec919061371d565b9250508190555060018860030160146101000a81548160ff0219169083151502179055508088600501819055508288600401819055505f811115612999578681612936919061371d565b60105f828254612946919061411a565b9250508190555061298c8482730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b612994612685565b6129b2565b8660105f8282546129aa919061415a565b925050819055505b8560ff168473ffffffffffffffffffffffffffffffffffffffff168a7fd0f591278f76a111a452e9ebb7f94d0046d1052df81789eecfb90ff88b0e30138a898d60010160029054906101000a900464ffffffffff16898842604051612a1c9695949392919061419b565b60405180910390a45050505050505050505050565b612aab838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612a649291906141fa565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e2565b505050565b5f612ab9612685565b600b54905090565b5f80821480612acf57508282115b15612b06576040517f0e76f70800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818385612b139190613bf4565b612b1d9190613bc4565b90509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612bac576040517f1f6a65b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181111580612bbc5750606481115b15612bf3576040517f2636c63400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654831080612c04575060075483115b15612c3b576040517fdc2bc7b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f821480612c56575060286002612c5291906140d0565b8210155b15612c8d576040517f83dc422800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f8060288311612cf957603f7e0104104104104104104104104104104104104104104104104104104104104179200000000010000000000800000000040000000002000000000186612ce49190613bf4565b16612cef9190613c9d565b9150839050612d44565b5f841480612d0657508284115b15612d3d576040517fa7323bf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8391505f90505b9250929050565b5f80612d58868686612ac1565b9050612d62611931565b86612d6d91906136ea565b811115612da6576040517ff721498000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5481600954612db791906136ea565b1115612def576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060095f828254612e0091906136ea565b92505081905550600e805490509150600e6040518061012001604052808881526020018760ff1681526020018660ff1681526020018564ffffffffff1681526020014381526020013373ffffffffffffffffffffffffffffffffffffffff1681526020015f151581526020015f81526020015f815250908060018154018082558091505060019003905f5260205f2090600602015f909190919091505f820151815f01556020820151816001015f6101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548164ffffffffff021916908364ffffffffff1602179055506080820151816002015560a0820151816003015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160030160146101000a81548160ff02191690831515021790555060e082015181600401556101008201518160050155505050949350505050565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e3914472876040518263ffffffff1660e01b8152600401612ff991906131ee565b6020604051808303815f875af1158015613015573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130399190613ed9565b905085600f5f8381526020019081526020015f208190555085817f3d94fecedaa4f90b8bd459797adb95f5bb11426025c5541390d9ccc1ad1b60a160405160405180910390a38360ff163373ffffffffffffffffffffffffffffffffffffffff16877f4eda75b3a53e18178b4e5a06bcc37637c5cd4d068710d8686a5d02b4ed5f10b888878787426040516130d2959493929190614221565b60405180910390a4505050505050565b5f8060205f8451602086015f885af180613101576040513d5f823e3d81fd5b3d92505f519150505f821461311a576001811415613135565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561317757836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161316e9190613440565b60405180910390fd5b50505050565b5f80fd5b5f819050919050565b61319381613181565b811461319d575f80fd5b50565b5f813590506131ae8161318a565b92915050565b5f602082840312156131c9576131c861317d565b5b5f6131d6848285016131a0565b91505092915050565b6131e881613181565b82525050565b5f6020820190506132015f8301846131df565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61323082613207565b9050919050565b61324081613226565b811461324a575f80fd5b50565b5f8135905061325b81613237565b92915050565b5f602082840312156132765761327561317d565b5b5f6132838482850161324d565b91505092915050565b5f8115159050919050565b6132a08161328c565b82525050565b5f6080820190506132b95f8301876131df565b6132c660208301866131df565b6132d360408301856131df565b6132e06060830184613297565b95945050505050565b5f60ff82169050919050565b6132fe816132e9565b82525050565b5f64ffffffffff82169050919050565b61331d81613304565b82525050565b61332c81613226565b82525050565b5f610120820190506133465f83018c6131df565b613353602083018b6132f5565b613360604083018a6132f5565b61336d6060830189613314565b61337a60808301886131df565b61338760a0830187613323565b61339460c0830186613297565b6133a160e08301856131df565b6133af6101008301846131df565b9a9950505050505050505050565b5f6020820190506133d05f830184613297565b92915050565b5f6080820190506133e95f8301876131df565b6133f66020830186613297565b61340360408301856131df565b61341060608301846131df565b95945050505050565b5f60408201905061342c5f8301856131df565b61343960208301846131df565b9392505050565b5f6020820190506134535f830184613323565b92915050565b5f819050919050565b61346b81613459565b82525050565b5f6020820190506134845f830184613462565b92915050565b5f80604083850312156134a05761349f61317d565b5b5f6134ad858286016131a0565b92505060206134be858286016131a0565b9150509250929050565b5f60a0820190506134db5f8301886131df565b6134e860208301876132f5565b6134f560408301866132f5565b6135026060830185613314565b61350f6080830184613323565b9695505050505050565b5f60808201905061352c5f8301876131df565b61353960208301866131df565b61354660408301856131df565b61355360608301846131df565b95945050505050565b5f80604083850312156135725761357161317d565b5b5f61357f8582860161324d565b9250506020613590858286016131a0565b9150509250929050565b5f805f606084860312156135b1576135b061317d565b5b5f6135be868287016131a0565b93505060206135cf868287016131a0565b92505060406135e0868287016131a0565b9150509250925092565b5f6060820190506135fd5f8301866131df565b61360a60208301856131df565b6136176040830184613297565b949350505050565b5f82825260208201905092915050565b7f4d696e206c6f636b757020616d6f756e74206d757374206265206772656174655f8201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b5f61368960288361361f565b91506136948261362f565b604082019050919050565b5f6020820190508181035f8301526136b68161367d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6136f482613181565b91506136ff83613181565b9250828201905080821115613717576137166136bd565b5b92915050565b5f61372782613181565b915061373283613181565b925082820390508181111561374a576137496136bd565b5b92915050565b7f4d696e206c6f636b7570206475726174696f6e206d75737420626520677265615f8201527f746572207468616e203000000000000000000000000000000000000000000000602082015250565b5f6137aa602a8361361f565b91506137b582613750565b604082019050919050565b5f6020820190508181035f8301526137d78161379e565b9050919050565b7f4d696e206c6f636b7570206475726174696f6e2063616e6e6f742065786365655f8201527f6420312079656172000000000000000000000000000000000000000000000000602082015250565b5f61383860288361361f565b9150613843826137de565b604082019050919050565b5f6020820190508181035f8301526138658161382c565b9050919050565b7f526174696f206d7573742062652067726561746572207468616e2030000000005f82015250565b5f6138a0601c8361361f565b91506138ab8261386c565b602082019050919050565b5f6020820190508181035f8301526138cd81613894565b9050919050565b7f42657420646f6573206e6f7420657869737400000000000000000000000000005f82015250565b5f61390860128361361f565b9150613913826138d4565b602082019050919050565b5f6020820190508181035f830152613935816138fc565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4d696e20626574206d7573742062652067726561746572207468616e203000005f82015250565b5f61399d601e8361361f565b91506139a882613969565b602082019050919050565b5f6020820190508181035f8301526139ca81613991565b9050919050565b7f4d617820626574206d757374206265203e3d206d696e206265740000000000005f82015250565b5f613a05601a8361361f565b9150613a10826139d1565b602082019050919050565b5f6020820190508181035f830152613a32816139f9565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e20300000005f82015250565b5f613a6d601d8361361f565b9150613a7882613a39565b602082019050919050565b5f6020820190508181035f830152613a9a81613a61565b9050919050565b7f4c6f636b7570206475726174696f6e206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f613afb60268361361f565b9150613b0682613aa1565b604082019050919050565b5f6020820190508181035f830152613b2881613aef565b9050919050565b7f416c7265616479206861766520616374697665206c6f636b75700000000000005f82015250565b5f613b63601a8361361f565b9150613b6e82613b2f565b602082019050919050565b5f6020820190508181035f830152613b9081613b57565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613bce82613181565b9150613bd983613181565b925082613be957613be8613b97565b5b828204905092915050565b5f613bfe82613181565b9150613c0983613181565b9250828202613c1781613181565b91508282048414831517613c2e57613c2d6136bd565b5b5092915050565b7f4f6e6c79205652462073797374656d2063616e2063616c6c20746869730000005f82015250565b5f613c69601d8361361f565b9150613c7482613c35565b602082019050919050565b5f6020820190508181035f830152613c9681613c5d565b9050919050565b5f613ca782613181565b9150613cb283613181565b925082613cc257613cc1613b97565b5b828206905092915050565b5f819050919050565b5f819050919050565b613cf0613ceb82613ccd565b613cd6565b82525050565b5f819050919050565b613d10613d0b82613181565b613cf6565b82525050565b5f613d218285613cdf565b602082019150613d318284613cff565b6020820191508190509392505050565b7f526571756972656420706f696e7473206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f613d9b60268361361f565b9150613da682613d41565b604082019050919050565b5f6020820190508181035f830152613dc881613d8f565b9050919050565b7f5769746864726177616c206578636565647320617661696c61626c652066756e5f8201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b5f613e2960228361361f565b9150613e3482613dcf565b604082019050919050565b5f6020820190508181035f830152613e5681613e1d565b9050919050565b7f496e76616c6964205652462073797374656d20616464726573730000000000005f82015250565b5f613e91601a8361361f565b9150613e9c82613e5d565b602082019050919050565b5f6020820190508181035f830152613ebe81613e85565b9050919050565b5f81519050613ed38161318a565b92915050565b5f60208284031215613eee57613eed61317d565b5b5f613efb84828501613ec5565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613f38601f8361361f565b9150613f4382613f04565b602082019050919050565b5f6020820190508181035f830152613f6581613f2c565b9050919050565b5f606082019050613f7f5f830186613323565b613f8c6020830185613323565b613f9960408301846131df565b949350505050565b5f8160011c9050919050565b5f808291508390505b6001851115613ff657808604811115613fd257613fd16136bd565b5b6001851615613fe15780820291505b8081029050613fef85613fa1565b9450613fb6565b94509492505050565b5f8261400e57600190506140c9565b8161401b575f90506140c9565b8160018114614031576002811461403b5761406a565b60019150506140c9565b60ff84111561404d5761404c6136bd565b5b8360020a915084821115614064576140636136bd565b5b506140c9565b5060208310610133831016604e8410600b841016171561409f5782820a90508381111561409a576140996136bd565b5b6140c9565b6140ac8484846001613fad565b925090508184048111156140c3576140c26136bd565b5b81810290505b9392505050565b5f6140da82613181565b91506140e583613181565b92506141127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613fff565b905092915050565b5f61412482613459565b915061412f83613459565b925082820390508181125f8412168282135f851215161715614154576141536136bd565b5b92915050565b5f61416482613459565b915061416f83613459565b92508282019050828112155f8312168382125f841215161715614195576141946136bd565b5b92915050565b5f60c0820190506141ae5f8301896131df565b6141bb60208301886132f5565b6141c86040830187613314565b6141d560608301866131df565b6141e260808301856131df565b6141ef60a08301846131df565b979650505050505050565b5f60408201905061420d5f830185613323565b61421a60208301846131df565b9392505050565b5f60a0820190506142345f8301886131df565b61424160208301876132f5565b61424e6040830186613314565b61425b60608301856131df565b61426860808301846131df565b969550505050505056fea2646970667358221220a5163d713a6a94ba87179b0ec6b5a69c2c19f00804ac004320089f0434b43be964736f6c634300081a00330000000000000000000000009ec728fce50c77e0bef7d34f1ab28a46409b7af100000000000000000000000016ca3cfbf104b4551073838e4202024ac6f09fb3

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610288575f3560e01c80638f561acc1161015a578063d0dad98d116100cc578063e932636011610085578063e9326360146107c9578063e93a242d146107e7578063f061a7a614610805578063f851a44014610821578063f968f4931461083f578063fa968eea1461084957610288565b8063d0dad98d14610704578063db2e21bc14610737578063df88126f14610741578063e1fdb4b41461075f578063e71c96971461077b578063e8c964cc1461079757610288565b8063b69ef8a81161011e578063b69ef8a814610663578063b6b260bd14610681578063c1075329146106a2578063cab11d5d146106be578063cbcbbd05146106dc578063cc4580c8146106e657610288565b80638f561acc146105a95780639f7f12ba146105c5578063aeefe31f146105f9578063b01f3b5314610629578063b539cd551461064557610288565b806361f14f11116101fe5780637690292f116101b75780637690292f1461050d5780637cfbc7a51461052b5780637d4620ed1461054757806388fedd041461056557806389158d8e146105835780638bad0c0a1461059f57610288565b806361f14f111461043557806368174fc4146104685780636c188593146104875780636e12b46e146104a3578063748e91bd146104c157806375829def146104f157610288565b806328f75b111161025057806328f75b111461036357806335ba9af81461037f5780634055f2731461039d5780634296a370146103b957806359e20b68146103e95780635d1837b81461041957610288565b806305b259801461028c5780630d7b2609146102bc57806312fb3175146102da57806322af00fa1461030d57806327b5488914610345575b5f80fd5b6102a660048036038101906102a191906131b4565b610867565b6040516102b391906131ee565b60405180910390f35b6102c461087c565b6040516102d191906131ee565b60405180910390f35b6102f460048036038101906102ef9190613261565b610882565b60405161030494939291906132a6565b60405180910390f35b610327600480360381019061032291906131b4565b6108ba565b60405161033c99989796959493929190613332565b60405180910390f35b61034d610969565b60405161035a91906131ee565b60405180910390f35b61037d600480360381019061037891906131b4565b61096f565b005b610387610a81565b60405161039491906131ee565b60405180910390f35b6103b760048036038101906103b291906131b4565b610ac5565b005b6103d360048036038101906103ce9190613261565b610c1e565b6040516103e091906133bd565b60405180910390f35b61040360048036038101906103fe9190613261565b610c34565b60405161041091906133bd565b60405180910390f35b610433600480360381019061042e91906131b4565b610cad565b005b61044f600480360381019061044a91906131b4565b610d7f565b60405161045f94939291906133d6565b60405180910390f35b610470610e1e565b60405161047e929190613419565b60405180910390f35b6104a1600480360381019061049c91906131b4565b610e2e565b005b6104ab610f3b565b6040516104b891906131ee565b60405180910390f35b6104db60048036038101906104d69190613261565b610f41565b6040516104e891906133bd565b60405180910390f35b61050b60048036038101906105069190613261565b610f52565b005b610515611049565b6040516105229190613440565b60405180910390f35b610545600480360381019061054091906131b4565b611061565b005b61054f611171565b60405161055c91906131ee565b60405180910390f35b61056d611177565b60405161057a9190613471565b60405180910390f35b61059d6004803603810190610598919061348a565b61117d565b005b6105a76114de565b005b6105c360048036038101906105be919061348a565b61156f565b005b6105df60048036038101906105da91906131b4565b611654565b6040516105f09594939291906134c8565b60405180910390f35b610613600480360381019061060e9190613261565b611738565b60405161062091906131ee565b60405180910390f35b610643600480360381019061063e91906131b4565b61181f565b005b61064d611931565b60405161065a91906131ee565b60405180910390f35b61066b61194c565b60405161067891906131ee565b60405180910390f35b61068961195a565b6040516106999493929190613519565b60405180910390f35b6106bc60048036038101906106b7919061355c565b611987565b005b6106c6611b0c565b6040516106d391906131ee565b60405180910390f35b6106e4611b12565b005b6106ee611b1c565b6040516106fb91906131ee565b60405180910390f35b61071e60048036038101906107199190613261565b611b28565b60405161072e94939291906132a6565b60405180910390f35b61073f611b9b565b005b610749611cae565b60405161075691906131ee565b60405180910390f35b610779600480360381019061077491906131b4565b611cb4565b005b6107956004803603810190610790919061359a565b611f11565b005b6107b160048036038101906107ac9190613261565b611fe8565b6040516107c0939291906135ea565b60405180910390f35b6107d1612061565b6040516107de91906131ee565b60405180910390f35b6107ef612067565b6040516107fc9190613440565b60405180910390f35b61081f600480360381019061081a9190613261565b61208c565b005b610829612243565b6040516108369190613440565b60405180910390f35b610847612268565b005b61085161243b565b60405161085e91906131ee565b60405180910390f35b600f602052805f5260405f205f915090505481565b60055481565b600d602052805f5260405f205f91509050805f015490806001015490806002015490806003015f9054906101000a900460ff16905084565b600e81815481106108c9575f80fd5b905f5260205f2090600602015f91509050805f015490806001015f9054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900464ffffffffff1690806002015490806003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160149054906101000a900460ff16908060040154908060050154905089565b60085481565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109f5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e9061369f565b60405180910390fd5b5f6004549050816004819055507f97f998e1af0c17f1ce3cd73ce4c47afac693a5e91d450979f78e444e2f13f4038183604051610a75929190613419565b60405180910390a15050565b5f80610a8b612441565b90505f600954600a54610a9e91906136ea565b9050808211610ab1575f92505050610ac2565b8082610abd919061371d565b925050505b90565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b84906137c0565b60405180910390fd5b6301e19140811115610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061384e565b60405180910390fd5b5f6005549050816005819055507ff837ee41a0c42fad1ee31ed3dadf0ac7de61c94037ec0c2ed109cc89ceda31ed8183604051610c12929190613419565b60405180910390a15050565b5f600354610c2b83611738565b10159050919050565b5f80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806003015f9054906101000a900460ff168015610ca5575080600201548160010154610ca191906136ea565b4210155b915050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d33576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c906138b6565b60405180910390fd5b8060088190555050565b5f805f80600e805490508510610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc19061391e565b60405180910390fd5b5f600e8681548110610ddf57610dde61393c565b5b905f5260205f209060060201905080600201548160030160149054906101000a900460ff16826004015483600501549450945094509450509193509193565b5f80600454600554915091509091565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eb4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906139b3565b60405180910390fd5b806006819055507ff483a8cf66fadba78e10f404e5f1639eb2a336535936e1af01f333d1215378d181600754604051610f30929190613419565b60405180910390a150565b60035481565b5f610f4b82610c34565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fd8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361103d576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611046816124f3565b50565b730d9316b9fcebe012e16779690b21bcee5fdda9e381565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110e7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065481101561112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112390613a1b565b60405180910390fd5b806007819055507ff483a8cf66fadba78e10f404e5f1639eb2a336535936e1af01f333d1215378d160065482604051611166929190613419565b60405180910390a150565b600a5481565b60105481565b6111856125b6565b5f82116111c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111be90613a83565b60405180910390fd5b5f8111611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120090613b11565b60405180910390fd5b600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015f9054906101000a900460ff1615611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90613b79565b60405180910390fd5b6004548210156112d2576040517fd5691c6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055481101561130e576040517fd0954d5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61133a9190613bc4565b821115611373576040517f68101d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600a5f82825461138491906136ea565b92505081905550604051806080016040528083815260200142815260200182815260200160011515815250600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff02191690831515021790555090505061146b333084730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612603909392919063ffffffff16565b611473612685565b3373ffffffffffffffffffffffffffffffffffffffff167fa2e3c0f7de988ae3bbc6bbd90484543ee1f08d1534bb75c6cf1337a7da7d9c5183834285876114ba9190613bf4565b6040516114ca9493929190613519565b60405180910390a26114da612720565b5050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611564576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61156d5f6124f3565b565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613c7f565b60405180910390fd5b5f6101008361160d9190613c9d565b43611618919061371d565b408260405160200161162b929190613d16565b604051602081830303815290604052805190602001205f1c905061164f8382612729565b505050565b5f805f805f600e8054905086106116a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116979061391e565b60405180910390fd5b5f600e87815481106116b5576116b461393c565b5b905f5260205f2090600602019050805f0154816001015f9054906101000a900460ff168260010160019054906101000a900460ff168360010160029054906101000a900464ffffffffff16846003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16955095509550955095505091939590929450565b5f80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806003015f9054906101000a900460ff16611797575f91505061181a565b80600201547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6117c79190613bc4565b815f01541115611803576040517f68101d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020154815f01546118169190613bf4565b9150505b919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118a5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81116118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90613db1565b60405180910390fd5b5f6003549050816003819055507fa46806ff51923197aa41dae804490d6ed998d8285767f20ec8035bb9e0fee1408183604051611925929190613419565b60405180910390a15050565b5f60085461193d612441565b6119479190613bc4565b905090565b5f611955612441565b905090565b5f805f805f611967612441565b905080600a54600954611978610a81565b94509450945094505090919293565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a0d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a72576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611a7b610a81565b905080821115611ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab790613e3f565b60405180910390fd5b611aff8383730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b611b07612685565b505050565b60075481565b611b1a612685565b565b5f600e80549050905090565b5f805f805f600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050805f015481600101548260020154836003015f9054906101000a900460ff169450945094509450509193509193565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c21576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611c2a612ab0565b90505f811115611cab57611c9460015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b5f600a819055505f600981905550611caa612685565b5b50565b60095481565b611cbc6125b6565b5f600e8281548110611cd157611cd061393c565b5b905f5260205f20906006020190505f815f015490505f8103611d1f576040517f7f36fbaa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160030160149054906101000a900460ff1615611d68576040517f05d09e5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6154608260020154611d7a91906136ea565b4311611db2576040517f9403b55e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611de582846001015f9054906101000a900460ff1660ff168560010160019054906101000a900460ff1660ff16612ac1565b90508060095f828254611df8919061371d565b9250508190555060018360030160146101000a81548160ff021916908315150217905550818360050181905550611e87836003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b611e8f612685565b826003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16847fe282fd838bb937af0c0f54e49ba5f86229ed0c90344c3cc4e2135cb673493e698442604051611efb929190613419565b60405180910390a3505050611f0e612720565b50565b611f196125b6565b611f2233610c1e565b611f58576040517f303e7a0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f63838383612b26565b611fa4333085730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612603909392919063ffffffff16565b611fac612685565b5f80611fb88484612c92565b915091505f611fc986858585612d4b565b9050611fd88187868686612f9e565b505050611fe3612720565b505050565b5f805f80600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f61203586611738565b90508160020154826001015461204b91906136ea565b8160035483101594509450945050509193909250565b60045481565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612112576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217790613ea7565b60405180910390fd5b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f40870cc17b6e83c1d34e59c75afe284643dcf63ef40c53964ee3d950441b7e3f60405160405180910390a35050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122706125b6565b5f600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806003015f9054906101000a900460ff166122f7576040517fc51d021e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020154816001015461230b91906136ea565b421015612344576040517fa9c437c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815f0154905080600a5f82825461235c919061371d565b925050819055505f826003015f6101000a81548160ff0219169083151502179055505f825f01819055505f82600101819055505f82600201819055506123d73382730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b6123df612685565b3373ffffffffffffffffffffffffffffffffffffffff167f89882ad382a3742d4db24e4dabc5000c5852aed762904db28442e4e1630a1d078242604051612427929190613419565b60405180910390a25050612439612720565b565b60065481565b5f6005600c5461245191906136ea565b431161246157600b5490506124f0565b730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124ae9190613440565b602060405180830381865afa1580156124c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124ed9190613ed9565b90505b90565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec660405160405180910390a35050565b60025f54036125fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f190613f4e565b60405180910390fd5b60025f81905550565b61267f848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161263893929190613f6c565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e2565b50505050565b730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016126d29190613440565b602060405180830381865afa1580156126ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127119190613ed9565b600b8190555043600c81905550565b60015f81905550565b5f600f5f8481526020019081526020015f205490505f600e82815481106127535761275261393c565b5b905f5260205f20906006020190505f815f015490505f81036127a1576040517f7f36fbaa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160030160149054906101000a900460ff16156127ea576040517f05d09e5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82857f546aca7b2683440b8f02fa95faeb8efc79dd0f16af3d815a002742ea6f76116c60405160405180910390a35f826001015f9054906101000a900460ff1660ff1690505f8360010160019054906101000a900460ff1660ff1690505f846003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f838861287b9190613c9d565b90505f612889868686612ac1565b90505f602886116128ce575f8860010160029054906101000a900464ffffffffff1664ffffffffff168460026128bf91906140d0565b16146128c9578190505b6128db565b848310156128da578190505b5b8160095f8282546128ec919061371d565b9250508190555060018860030160146101000a81548160ff0219169083151502179055508088600501819055508288600401819055505f811115612999578681612936919061371d565b60105f828254612946919061411a565b9250508190555061298c8482730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b612994612685565b6129b2565b8660105f8282546129aa919061415a565b925050819055505b8560ff168473ffffffffffffffffffffffffffffffffffffffff168a7fd0f591278f76a111a452e9ebb7f94d0046d1052df81789eecfb90ff88b0e30138a898d60010160029054906101000a900464ffffffffff16898842604051612a1c9695949392919061419b565b60405180910390a45050505050505050505050565b612aab838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612a649291906141fa565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e2565b505050565b5f612ab9612685565b600b54905090565b5f80821480612acf57508282115b15612b06576040517f0e76f70800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818385612b139190613bf4565b612b1d9190613bc4565b90509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612bac576040517f1f6a65b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181111580612bbc5750606481115b15612bf3576040517f2636c63400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654831080612c04575060075483115b15612c3b576040517fdc2bc7b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f821480612c56575060286002612c5291906140d0565b8210155b15612c8d576040517f83dc422800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f8060288311612cf957603f7e0104104104104104104104104104104104104104104104104104104104104179200000000010000000000800000000040000000002000000000186612ce49190613bf4565b16612cef9190613c9d565b9150839050612d44565b5f841480612d0657508284115b15612d3d576040517fa7323bf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8391505f90505b9250929050565b5f80612d58868686612ac1565b9050612d62611931565b86612d6d91906136ea565b811115612da6576040517ff721498000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5481600954612db791906136ea565b1115612def576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060095f828254612e0091906136ea565b92505081905550600e805490509150600e6040518061012001604052808881526020018760ff1681526020018660ff1681526020018564ffffffffff1681526020014381526020013373ffffffffffffffffffffffffffffffffffffffff1681526020015f151581526020015f81526020015f815250908060018154018082558091505060019003905f5260205f2090600602015f909190919091505f820151815f01556020820151816001015f6101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548164ffffffffff021916908364ffffffffff1602179055506080820151816002015560a0820151816003015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160030160146101000a81548160ff02191690831515021790555060e082015181600401556101008201518160050155505050949350505050565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e3914472876040518263ffffffff1660e01b8152600401612ff991906131ee565b6020604051808303815f875af1158015613015573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130399190613ed9565b905085600f5f8381526020019081526020015f208190555085817f3d94fecedaa4f90b8bd459797adb95f5bb11426025c5541390d9ccc1ad1b60a160405160405180910390a38360ff163373ffffffffffffffffffffffffffffffffffffffff16877f4eda75b3a53e18178b4e5a06bcc37637c5cd4d068710d8686a5d02b4ed5f10b888878787426040516130d2959493929190614221565b60405180910390a4505050505050565b5f8060205f8451602086015f885af180613101576040513d5f823e3d81fd5b3d92505f519150505f821461311a576001811415613135565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561317757836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161316e9190613440565b60405180910390fd5b50505050565b5f80fd5b5f819050919050565b61319381613181565b811461319d575f80fd5b50565b5f813590506131ae8161318a565b92915050565b5f602082840312156131c9576131c861317d565b5b5f6131d6848285016131a0565b91505092915050565b6131e881613181565b82525050565b5f6020820190506132015f8301846131df565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61323082613207565b9050919050565b61324081613226565b811461324a575f80fd5b50565b5f8135905061325b81613237565b92915050565b5f602082840312156132765761327561317d565b5b5f6132838482850161324d565b91505092915050565b5f8115159050919050565b6132a08161328c565b82525050565b5f6080820190506132b95f8301876131df565b6132c660208301866131df565b6132d360408301856131df565b6132e06060830184613297565b95945050505050565b5f60ff82169050919050565b6132fe816132e9565b82525050565b5f64ffffffffff82169050919050565b61331d81613304565b82525050565b61332c81613226565b82525050565b5f610120820190506133465f83018c6131df565b613353602083018b6132f5565b613360604083018a6132f5565b61336d6060830189613314565b61337a60808301886131df565b61338760a0830187613323565b61339460c0830186613297565b6133a160e08301856131df565b6133af6101008301846131df565b9a9950505050505050505050565b5f6020820190506133d05f830184613297565b92915050565b5f6080820190506133e95f8301876131df565b6133f66020830186613297565b61340360408301856131df565b61341060608301846131df565b95945050505050565b5f60408201905061342c5f8301856131df565b61343960208301846131df565b9392505050565b5f6020820190506134535f830184613323565b92915050565b5f819050919050565b61346b81613459565b82525050565b5f6020820190506134845f830184613462565b92915050565b5f80604083850312156134a05761349f61317d565b5b5f6134ad858286016131a0565b92505060206134be858286016131a0565b9150509250929050565b5f60a0820190506134db5f8301886131df565b6134e860208301876132f5565b6134f560408301866132f5565b6135026060830185613314565b61350f6080830184613323565b9695505050505050565b5f60808201905061352c5f8301876131df565b61353960208301866131df565b61354660408301856131df565b61355360608301846131df565b95945050505050565b5f80604083850312156135725761357161317d565b5b5f61357f8582860161324d565b9250506020613590858286016131a0565b9150509250929050565b5f805f606084860312156135b1576135b061317d565b5b5f6135be868287016131a0565b93505060206135cf868287016131a0565b92505060406135e0868287016131a0565b9150509250925092565b5f6060820190506135fd5f8301866131df565b61360a60208301856131df565b6136176040830184613297565b949350505050565b5f82825260208201905092915050565b7f4d696e206c6f636b757020616d6f756e74206d757374206265206772656174655f8201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b5f61368960288361361f565b91506136948261362f565b604082019050919050565b5f6020820190508181035f8301526136b68161367d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6136f482613181565b91506136ff83613181565b9250828201905080821115613717576137166136bd565b5b92915050565b5f61372782613181565b915061373283613181565b925082820390508181111561374a576137496136bd565b5b92915050565b7f4d696e206c6f636b7570206475726174696f6e206d75737420626520677265615f8201527f746572207468616e203000000000000000000000000000000000000000000000602082015250565b5f6137aa602a8361361f565b91506137b582613750565b604082019050919050565b5f6020820190508181035f8301526137d78161379e565b9050919050565b7f4d696e206c6f636b7570206475726174696f6e2063616e6e6f742065786365655f8201527f6420312079656172000000000000000000000000000000000000000000000000602082015250565b5f61383860288361361f565b9150613843826137de565b604082019050919050565b5f6020820190508181035f8301526138658161382c565b9050919050565b7f526174696f206d7573742062652067726561746572207468616e2030000000005f82015250565b5f6138a0601c8361361f565b91506138ab8261386c565b602082019050919050565b5f6020820190508181035f8301526138cd81613894565b9050919050565b7f42657420646f6573206e6f7420657869737400000000000000000000000000005f82015250565b5f61390860128361361f565b9150613913826138d4565b602082019050919050565b5f6020820190508181035f830152613935816138fc565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4d696e20626574206d7573742062652067726561746572207468616e203000005f82015250565b5f61399d601e8361361f565b91506139a882613969565b602082019050919050565b5f6020820190508181035f8301526139ca81613991565b9050919050565b7f4d617820626574206d757374206265203e3d206d696e206265740000000000005f82015250565b5f613a05601a8361361f565b9150613a10826139d1565b602082019050919050565b5f6020820190508181035f830152613a32816139f9565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e20300000005f82015250565b5f613a6d601d8361361f565b9150613a7882613a39565b602082019050919050565b5f6020820190508181035f830152613a9a81613a61565b9050919050565b7f4c6f636b7570206475726174696f6e206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f613afb60268361361f565b9150613b0682613aa1565b604082019050919050565b5f6020820190508181035f830152613b2881613aef565b9050919050565b7f416c7265616479206861766520616374697665206c6f636b75700000000000005f82015250565b5f613b63601a8361361f565b9150613b6e82613b2f565b602082019050919050565b5f6020820190508181035f830152613b9081613b57565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613bce82613181565b9150613bd983613181565b925082613be957613be8613b97565b5b828204905092915050565b5f613bfe82613181565b9150613c0983613181565b9250828202613c1781613181565b91508282048414831517613c2e57613c2d6136bd565b5b5092915050565b7f4f6e6c79205652462073797374656d2063616e2063616c6c20746869730000005f82015250565b5f613c69601d8361361f565b9150613c7482613c35565b602082019050919050565b5f6020820190508181035f830152613c9681613c5d565b9050919050565b5f613ca782613181565b9150613cb283613181565b925082613cc257613cc1613b97565b5b828206905092915050565b5f819050919050565b5f819050919050565b613cf0613ceb82613ccd565b613cd6565b82525050565b5f819050919050565b613d10613d0b82613181565b613cf6565b82525050565b5f613d218285613cdf565b602082019150613d318284613cff565b6020820191508190509392505050565b7f526571756972656420706f696e7473206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f613d9b60268361361f565b9150613da682613d41565b604082019050919050565b5f6020820190508181035f830152613dc881613d8f565b9050919050565b7f5769746864726177616c206578636565647320617661696c61626c652066756e5f8201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b5f613e2960228361361f565b9150613e3482613dcf565b604082019050919050565b5f6020820190508181035f830152613e5681613e1d565b9050919050565b7f496e76616c6964205652462073797374656d20616464726573730000000000005f82015250565b5f613e91601a8361361f565b9150613e9c82613e5d565b602082019050919050565b5f6020820190508181035f830152613ebe81613e85565b9050919050565b5f81519050613ed38161318a565b92915050565b5f60208284031215613eee57613eed61317d565b5b5f613efb84828501613ec5565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613f38601f8361361f565b9150613f4382613f04565b602082019050919050565b5f6020820190508181035f830152613f6581613f2c565b9050919050565b5f606082019050613f7f5f830186613323565b613f8c6020830185613323565b613f9960408301846131df565b949350505050565b5f8160011c9050919050565b5f808291508390505b6001851115613ff657808604811115613fd257613fd16136bd565b5b6001851615613fe15780820291505b8081029050613fef85613fa1565b9450613fb6565b94509492505050565b5f8261400e57600190506140c9565b8161401b575f90506140c9565b8160018114614031576002811461403b5761406a565b60019150506140c9565b60ff84111561404d5761404c6136bd565b5b8360020a915084821115614064576140636136bd565b5b506140c9565b5060208310610133831016604e8410600b841016171561409f5782820a90508381111561409a576140996136bd565b5b6140c9565b6140ac8484846001613fad565b925090508184048111156140c3576140c26136bd565b5b81810290505b9392505050565b5f6140da82613181565b91506140e583613181565b92506141127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613fff565b905092915050565b5f61412482613459565b915061412f83613459565b925082820390508181125f8412168282135f851215161715614154576141536136bd565b5b92915050565b5f61416482613459565b915061416f83613459565b92508282019050828112155f8312168382125f841215161715614195576141946136bd565b5b92915050565b5f60c0820190506141ae5f8301896131df565b6141bb60208301886132f5565b6141c86040830187613314565b6141d560608301866131df565b6141e260808301856131df565b6141ef60a08301846131df565b979650505050505050565b5f60408201905061420d5f830185613323565b61421a60208301846131df565b9392505050565b5f60a0820190506142345f8301886131df565b61424160208301876132f5565b61424e6040830186613314565b61425b60608301856131df565b61426860808301846131df565b969550505050505056fea2646970667358221220a5163d713a6a94ba87179b0ec6b5a69c2c19f00804ac004320089f0434b43be964736f6c634300081a0033

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

0000000000000000000000009ec728fce50c77e0bef7d34f1ab28a46409b7af100000000000000000000000016ca3cfbf104b4551073838e4202024ac6f09fb3

-----Decoded View---------------
Arg [0] : _vrfSystemAddress (address): 0x9eC728Fce50c77e0BeF7d34F1ab28a46409b7aF1
Arg [1] : initialAdmin (address): 0x16Ca3cFBF104b4551073838E4202024AC6f09Fb3

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000009ec728fce50c77e0bef7d34f1ab28a46409b7af1
Arg [1] : 00000000000000000000000016ca3cfbf104b4551073838e4202024ac6f09fb3


Deployed Bytecode Sourcemap

22965:24037:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26229:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24353:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25806:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;26167:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;25054:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33455:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29872:351;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33849:439;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31376:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31574:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34296:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46259:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;32855:186;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;34918:246;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24129:63;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32688:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29060:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23784:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35172:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25228:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26309:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35566:1402;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29231:87;;;:::i;:::-;;41918:536;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45792:459;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;30818:503;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33073:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29653:120;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29549:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30314:432;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;44206:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24968:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46789:81;;;:::i;:::-;;46905:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31877:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;45381:340;;;:::i;:::-;;25132:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44669:704;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37883:889;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32279:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;24266:56;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24045:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34581:329;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23872:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37054:821;;;:::i;:::-;;24921:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26229:41;;;;;;;;;;;;;;;;;:::o;24353:42::-;;;;:::o;25806:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26167:17::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25054:40::-;;;;:::o;33455:323::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;33566:1:::1;33547:16;:20;33539:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33623:17;33643:15;;33623:35;;33687:16;33669:15;:34;;;;33719:51;33742:9;33753:16;33719:51;;;;;;;:::i;:::-;;;;;;;;33528:250;33455:323:::0;:::o;29872:351::-;29927:7;29947:23;29973:19;:17;:19::i;:::-;29947:45;;30003:21;30051:12;;30027:21;;:36;;;;:::i;:::-;30003:60;;30107:13;30088:15;:32;30084:73;;30144:1;30137:8;;;;;;30084:73;30202:13;30184:15;:31;;;;:::i;:::-;30177:38;;;;29872:351;;:::o;33849:439::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;33966:1:::1;33945:18;:22;33937:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;34055:8;34033:18;:30;;34025:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;34119:19;34141:17;;34119:39;;34189:18;34169:17;:38;;;;34223:57;34248:11;34261:18;34223:57;;;;;;;:::i;:::-;;;;;;;;33926:362;33849:439:::0;:::o;31376:129::-;31436:4;31483:14;;31460:19;31474:4;31460:13;:19::i;:::-;:37;;31453:44;;31376:129;;;:::o;31574:232::-;31628:4;31645:21;31669:11;:17;31681:4;31669:17;;;;;;;;;;;;;;;31645:41;;31704:6;:13;;;;;;;;;;;;:94;;;;;31777:6;:21;;;31757:6;:17;;;:41;;;;:::i;:::-;31738:15;:60;;31704:94;31697:101;;;31574:232;;;:::o;34296:228::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;34425:1:::1;34400:22;:26;34392:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34494:22;34470:21;:46;;;;34296:228:::0;:::o;46259:438::-;46329:24;46364:14;46389:15;46415:17;46467:4;:11;;;;46459:5;:19;46451:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;46512:15;46530:4;46535:5;46530:11;;;;;;;;:::i;:::-;;;;;;;;;;;;46512:29;;46576:3;:20;;;46611:3;:13;;;;;;;;;;;;46639:3;:11;;;46665:3;:13;;;46554:135;;;;;;;;;46259:438;;;;;:::o;32855:186::-;32924:17;32952:19;32998:15;;33015:17;;32990:43;;;;32855:186;;:::o;34918:246::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;35020:1:::1;35004:13;:17;34996:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;35082:13;35067:12;:28;;;;35111:45;35128:13;35143:12;;35111:45;;;;;;;:::i;:::-;;;;;;;;34918:246:::0;:::o;24129:63::-;;;;:::o;32688:110::-;32751:4;32775:15;32785:4;32775:9;:15::i;:::-;32768:22;;32688:110;;;:::o;29060:163::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;29153:1:::1;29133:22;;:8;:22;;::::0;29129:51:::1;;29164:16;;;;;;;;;;;;;;29129:51;29191:24;29206:8;29191:14;:24::i;:::-;29060:163:::0;:::o;23784:79::-;23821:42;23784:79;:::o;35172:254::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;35275:12:::1;;35258:13;:29;;35250:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35344:13;35329:12;:28;;;;35373:45;35390:12;;35404:13;35373:45;;;;;;;:::i;:::-;;;;;;;;35172:254:::0;:::o;25228:36::-;;;;:::o;26309:25::-;;;;:::o;35566:1402::-;2378:21;:19;:21::i;:::-;35676:1:::1;35667:6;:10;35659:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;35747:1;35730:14;:18;35722:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;35811:11;:23;35823:10;35811:23;;;;;;;;;;;;;;;:30;;;;;;;;;;;;35810:31;35802:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;35956:15;;35947:6;:24;35943:57;;;35980:20;;;;;;;;;;;;;;35943:57;36032:17;;36015:14;:34;36011:71;;;36058:24;;;;;;;;;;;;;;36011:71;36195:14;36175:17;:34;;;;:::i;:::-;36166:6;:43;36162:99;;;36233:16;;;;;;;;;;;;;;36162:99;36355:6;36330:21;;:31;;;;;;;:::i;:::-;;;;;;;;36426:162;;;;;;;;36456:6;36426:162;;;;36489:15;36426:162;;;;36535:14;36426:162;;;;36572:4;36426:162;;;;::::0;36400:11:::1;:23;36412:10;36400:23;;;;;;;;;;;;;;;:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36673:70;36709:10;36729:4;36736:6;23821:42;36673:35;;;;:70;;;;;;:::i;:::-;36754:22;:20;:22::i;:::-;36821:10;36794:166;;;36846:6;36867:14;36896:15;36935:14;36926:6;:23;;;;:::i;:::-;36794:166;;;;;;;;;:::i;:::-;;;;;;;;2422:20:::0;:18;:20::i;:::-;35566:1402;;:::o;29231:87::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;29284:26:::1;29307:1;29284:14;:26::i;:::-;29231:87::o:0;41918:536::-;42031:16;;;;;;;;;;;42017:30;;:10;:30;;;42009:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;42257:28;42361:3;42349:9;:15;;;;:::i;:::-;42333:12;:32;;;;:::i;:::-;42323:43;42368:12;42306:75;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42296:86;;;;;;42288:95;;42257:126;;42404:42;42414:9;42425:20;42404:9;:42::i;:::-;41998:456;41918:536;;:::o;45792:459::-;45865:14;45890:12;45913:15;45939:11;45961:15;46011:4;:11;;;;46003:5;:19;45995:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;46056:15;46074:4;46079:5;46074:11;;;;;;;;:::i;:::-;;;;;;;;;;;;46056:29;;46120:3;:10;;;46145:3;:10;;;;;;;;;;;;46170:3;:13;;;;;;;;;;;;46198:3;:8;;;;;;;;;;;;46221:3;:11;;;;;;;;;;;;46098:145;;;;;;;;;;;45792:459;;;;;;;:::o;30818:503::-;30876:7;30896:21;30920:11;:17;30932:4;30920:17;;;;;;;;;;;;;;;30896:41;;30953:6;:13;;;;;;;;;;;;30948:55;;30990:1;30983:8;;;;;30948:55;31116:6;:21;;;31096:17;:41;;;;:::i;:::-;31080:6;:13;;;:57;31076:113;;;31161:16;;;;;;;;;;;;;;31076:113;31292:6;:21;;;31276:6;:13;;;:37;;;;:::i;:::-;31269:44;;;30818:503;;;;:::o;33073:313::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;33181:1:::1;33163:15;:19;33155:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;33236:17;33256:14;;33236:34;;33298:15;33281:14;:32;;;;33329:49;33351:9;33362:15;33329:49;;;;;;;:::i;:::-;;;;;;;;33144:242;33073:313:::0;:::o;29653:120::-;29695:7;29744:21;;29722:19;:17;:19::i;:::-;:43;;;;:::i;:::-;29715:50;;29653:120;:::o;29549:96::-;29591:7;29618:19;:17;:19::i;:::-;29611:26;;29549:96;:::o;30314:432::-;30378:20;30409:24;30444:23;30478:35;30532:23;30558:19;:17;:19::i;:::-;30532:45;;30610:15;30640:21;;30676:12;;30703:24;:22;:24::i;:::-;30588:150;;;;;;;;;30314:432;;;;:::o;44206:436::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;44331:1:::1;44308:25;;:11;:25;;::::0;44304:54:::1;;44342:16;;;;;;;;;;;;;;44304:54;44379:23;44405:24;:22;:24::i;:::-;44379:50;;44466:15;44448:14;:33;;44440:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;44541:60;44573:11;44586:14;23821:42;44541:31;;;;:60;;;;;:::i;:::-;44612:22;:20;:22::i;:::-;44293:349;44206:436:::0;;:::o;24968:42::-;;;;:::o;46789:81::-;46840:22;:20;:22::i;:::-;46789:81::o;46905:94::-;46953:7;46980:4;:11;;;;46973:18;;46905:94;:::o;31877:394::-;31952:14;31977:18;32006:22;32039:11;32069:21;32093:11;:17;32105:4;32093:17;;;;;;;;;;;;;;;32069:41;;32143:6;:13;;;32171:6;:17;;;32203:6;:21;;;32239:6;:13;;;;;;;;;;;;32121:142;;;;;;;;;31877:394;;;;;:::o;45381:340::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;45440:23:::1;45466:22;:20;:22::i;:::-;45440:48;;45521:1;45503:15;:19;45499:215;;;45539:55;45571:5;;;;;;;;;;;45578:15;23821:42;45539:31;;;;:55;;;;;:::i;:::-;45633:1;45609:21;:25;;;;45664:1;45649:12;:16;;;;45680:22;:20;:22::i;:::-;45499:215;45429:292;45381:340::o:0;25132:27::-;;;;:::o;44669:704::-;2378:21;:19;:21::i;:::-;44736:15:::1;44754:4;44759:5;44754:11;;;;;;;;:::i;:::-;;;;;;;;;;;;44736:29;;44776:14;44793:3;:10;;;44776:27;;44830:1;44820:6;:11:::0;44816:41:::1;;44840:17;;;;;;;;;;;;;;44816:41;44872:3;:13;;;;;;;;;;;;44868:45;;;44894:19;;;;;;;;;;;;;;44868:45;44967:5;44944:3;:20;;;:28;;;;:::i;:::-;44928:12;:44;44924:73;;44981:16;;;;;;;;;;;;;;44924:73;45010:25;45038:47;45051:6;45059:3;:10;;;;;;;;;;;;45038:47;;45071:3;:13;;;;;;;;;;;;45038:47;;:12;:47::i;:::-;45010:75;;45114:17;45098:12;;:33;;;;;;;:::i;:::-;;;;;;;;45158:4;45142:3;:13;;;:20;;;;;;;;;;;;;;;;;;45189:6;45173:3;:13;;:22;;;;45208:52;45240:3;:11;;;;;;;;;;;;45253:6;23821:42;45208:31;;;;:52;;;;;:::i;:::-;45271:22;:20;:22::i;:::-;45328:3;:11;;;;;;;;;;;;45309:56;;45321:5;45309:56;45341:6;45349:15;45309:56;;;;;;;:::i;:::-;;;;;;;;44725:648;;;2422:20:::0;:18;:20::i;:::-;44669:704;:::o;37883:889::-;2378:21;:19;:21::i;:::-;38066:27:::1;38082:10;38066:15;:27::i;:::-;38061:61;;38102:20;;;;;;;;;;;;;;38061:61;38175:43;38194:6;38202:7;38211:6;38175:18;:43::i;:::-;38297:70;38333:10;38353:4;38360:6;23821:42;38297:35;;;;:70;;;;;;:::i;:::-;38378:22;:20;:22::i;:::-;38467:17;38486:12:::0;38502:32:::1;38518:7;38527:6;38502:15;:32::i;:::-;38466:68;;;;38580:13;38596:43;38607:6;38615;38623:9;38634:4;38596:10;:43::i;:::-;38580:59;;38699:65;38725:5;38732:6;38740;38748:9;38759:4;38699:25;:65::i;:::-;38006:766;;;2422:20:::0;:18;:20::i;:::-;37883:889;;;:::o;32279:401::-;32355:18;32384:14;32409:11;32439:21;32463:11;:17;32475:4;32463:17;;;;;;;;;;;;;;;32439:41;;32491:14;32508:19;32522:4;32508:13;:19::i;:::-;32491:36;;32580:6;:21;;;32560:6;:17;;;:41;;;;:::i;:::-;32616:6;32647:14;;32637:6;:24;;32538:134;;;;;;;;32279:401;;;;;:::o;24266:56::-;;;;:::o;24045:31::-;;;;;;;;;;;;;:::o;34581:329::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;34704:1:::1;34675:31;;:17;:31;;::::0;34667:70:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;34748:18;34769:16;;;;;;;;;;;34748:37;;34815:17;34796:16;;:36;;;;;;;;;;;;;;;;;;34884:17;34848:54;;34872:10;34848:54;;;;;;;;;;;;34656:254;34581:329:::0;:::o;23872:20::-;;;;;;;;;;;;;:::o;37054:821::-;2378:21;:19;:21::i;:::-;37111::::1;37135:11;:23;37147:10;37135:23;;;;;;;;;;;;;;;37111:47;;37184:6;:13;;;;;;;;;;;;37179:43;;37206:16;;;;;;;;;;;;;;37179:43;37275:6;:21;;;37255:6;:17;;;:41;;;;:::i;:::-;37237:15;:59;37233:90;;;37305:18;;;;;;;;;;;;;;37233:90;37336:14;37353:6;:13;;;37336:30;;37469:6;37444:21;;:31;;;;;;;:::i;:::-;;;;;;;;37537:5;37521:6;:13;;;:21;;;;;;;;;;;;;;;;;;37569:1;37553:6;:13;;:17;;;;37601:1;37581:6;:17;;:21;;;;37637:1;37613:6;:21;;:25;;;;37714:51;37746:10;37758:6;23821:42;37714:31;;;;:51;;;;;:::i;:::-;37776:22;:20;:22::i;:::-;37831:10;37816:51;;;37843:6;37851:15;37816:51;;;;;;;:::i;:::-;;;;;;;;37100:775;;2422:20:::0;:18;:20::i;:::-;37054:821::o;24921:40::-;;;;:::o;28484:395::-;28535:7;28675:1;28655:17;;:21;;;;:::i;:::-;28639:12;:37;28635:90;;28700:13;;28693:20;;;;28635:90;23821:42;28828:28;;;28865:4;28828:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28821:50;;28484:395;;:::o;29326:173::-;29388:16;29407:5;;;;;;;;;;;29388:24;;29431:8;29423:5;;:16;;;;;;;;;;;;;;;;;;29482:8;29455:36;;29472:8;29455:36;;;;;;;;;;;;29377:122;29326:173;:::o;2458:293::-;1860:1;2592:7;;:19;2584:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1860:1;2725:7;:18;;;;2458:293::o;13521:190::-;13622:81;13642:5;13664;:18;;;13685:4;13691:2;13695:5;13649:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13622:19;:81::i;:::-;13521:190;;;;:::o;28315:161::-;23821:42;28382:28;;;28419:4;28382:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28366:13;:59;;;;28456:12;28436:17;:32;;;;28315:161::o;2759:213::-;1816:1;2942:7;:22;;;;2759:213::o;42481:1717::-;42561:13;42577:6;:17;42584:9;42577:17;;;;;;;;;;;;42561:33;;42605:15;42623:4;42628:5;42623:11;;;;;;;;:::i;:::-;;;;;;;;;;;;42605:29;;42645:14;42662:3;:10;;;42645:27;;42699:1;42689:6;:11;42685:41;;42709:17;;;;;;;;;;;;;;42685:41;42741:3;:13;;;;;;;;;;;;42737:45;;;42763:19;;;;;;;;;;;;;;42737:45;42831:5;42820:9;42800:37;;;;;;;;;;42850:14;42867:3;:10;;;;;;;;;;;;42850:27;;;;42888:17;42908:3;:13;;;;;;;;;;;;42888:33;;;;42932:15;42950:3;:11;;;;;;;;;;;;42932:29;;42974:15;43007:6;42992:12;:21;;;;:::i;:::-;42974:39;;43024:25;43052:39;43065:6;43073;43081:9;43052:12;:39::i;:::-;43024:67;;43102:17;24525:2;43170:6;:25;43166:280;;43247:1;43234:3;:8;;;;;;;;;;;;43217:25;;43223:7;43218:1;:12;;;;:::i;:::-;43217:25;43216:32;43212:102;;43281:17;43269:29;;43212:102;43166:280;;;43360:9;43350:7;:19;43346:89;;;43402:17;43390:29;;43346:89;43166:280;43499:17;43483:12;;:33;;;;;;;:::i;:::-;;;;;;;;43568:4;43552:3;:13;;;:20;;;;;;;;;;;;;;;;;;43599:9;43583:3;:13;;:25;;;;43633:7;43619:3;:11;;:21;;;;43695:1;43683:9;:13;43679:252;;;43747:6;43735:9;:18;;;;:::i;:::-;43713:11;;:41;;;;;;;:::i;:::-;;;;;;;;43769:51;43801:7;43810:9;23821:42;43769:31;;;;:51;;;;;:::i;:::-;43835:22;:20;:22::i;:::-;43679:252;;;43912:6;43890:11;;:29;;;;;;;:::i;:::-;;;;;;;;43679:252;44042:6;43948:242;;43993:7;43948:242;;43973:5;43948:242;44015:6;44070:9;44095:3;:8;;;;;;;;;;;;44118:7;44140:9;44164:15;43948:242;;;;;;;;;;;:::i;:::-;;;;;;;;42550:1648;;;;;;;;;42481:1717;;:::o;13114:162::-;13197:71;13217:5;13239;:14;;;13256:2;13260:5;13224:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13197:19;:71::i;:::-;13114:162;;;:::o;28887:130::-;28936:7;28956:22;:20;:22::i;:::-;28996:13;;28989:20;;28887:130;:::o;41530:294::-;41659:17;41706:1;41693:9;:14;:36;;;;41723:6;41711:9;:18;41693:36;41689:75;;;41738:26;;;;;;;;;;;;;;41689:75;41807:9;41797:6;41788;:15;;;;:::i;:::-;41787:29;;;;:::i;:::-;41775:41;;41530:294;;;;;:::o;38780:419::-;38913:1;38885:30;;:16;;;;;;;;;;;:30;;;38881:64;;38924:21;;;;;;;;;;;;;;38881:64;38970:1;38960:6;:11;;:34;;;;24480:3;38975:6;:19;38960:34;38956:65;;;39003:18;;;;;;;;;;;;;;38956:65;39045:12;;39036:6;:21;:46;;;;39070:12;;39061:6;:21;39036:46;39032:80;;;39091:21;;;;;;;;;;;;;;39032:80;39138:1;39127:7;:12;:39;;;;24525:2;24566:1;:20;;;;:::i;:::-;39143:7;:23;;39127:39;39123:68;;;39175:16;;;;;;;;;;;;;;39123:68;38780:419;;;:::o;39207:437::-;39287:17;39306:12;24525:2;39335:6;:25;39331:306;;24889:4;24783:66;24670;39391:7;:21;;;;:::i;:::-;39390:37;39389:55;;;;:::i;:::-;39377:67;;39466:7;39459:14;;39331:306;;;39521:1;39510:7;:12;:32;;;;39536:6;39526:7;:16;39510:32;39506:62;;;39551:17;;;;;;;;;;;;;;39506:62;39595:7;39583:19;;39624:1;39617:8;;39331:306;39207:437;;;;;:::o;39652:1070::-;39754:13;39823:25;39851:39;39864:6;39872;39880:9;39851:12;:39::i;:::-;39823:67;;39973:11;:9;:11::i;:::-;39964:6;:20;;;;:::i;:::-;39944:17;:40;39940:73;;;39993:20;;;;;;;;;;;;;;39940:73;40111:13;;40091:17;40076:12;;:32;;;;:::i;:::-;:48;40072:107;;;40148:19;;;;;;;;;;;;;;40072:107;40239:17;40223:12;;:33;;;;;;;:::i;:::-;;;;;;;;40299:4;:11;;;;40291:19;;40321:4;40345:358;;;;;;;;40376:6;40345:358;;;;40415:6;40345:358;;;;;;40458:9;40345:358;;;;;;40500:4;40345:358;;;;;;40542:12;40345:358;;;;40582:10;40345:358;;;;;;40622:5;40345:358;;;;;;40655:1;40345:358;;;;40686:1;40345:358;;;40321:393;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39769:953;39652:1070;;;;;;:::o;40730:747::-;41026:17;41057:16;;;;;;;;;;;41046:59;;;41106:5;41046:66;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41026:86;;41143:5;41123:6;:17;41130:9;41123:17;;;;;;;;;;;:25;;;;41221:5;41210:9;41190:37;;;;;;;;;;41339:6;41243:226;;41287:10;41243:226;;41267:5;41243:226;41312:6;41367:9;41399:4;41419:9;41443:15;41243:226;;;;;;;;;;:::i;:::-;;;;;;;;40905:572;40730:747;;;;;:::o;20405:738::-;20486:18;20515:19;20655:4;20652:1;20645:4;20639:11;20632:4;20626;20622:15;20619:1;20612:5;20605;20600:60;20714:7;20704:180;;20759:4;20753:11;20805:16;20802:1;20797:3;20782:40;20852:16;20847:3;20840:29;20704:180;20912:16;20898:30;;20963:1;20957:8;20942:23;;20570:406;21006:1;20992:10;:15;:68;;21059:1;21044:11;:16;;20992:68;;;21040:1;21018:5;21010:26;;;:31;20992:68;20988:148;;;21117:5;21084:40;;;;;;;;;;;:::i;:::-;;;;;;;;20988:148;20475:668;;20405:738;;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:118::-;1112:24;1130:5;1112:24;:::i;:::-;1107:3;1100:37;1025:118;;:::o;1149:222::-;1242:4;1280:2;1269:9;1265:18;1257:26;;1293:71;1361:1;1350:9;1346:17;1337:6;1293:71;:::i;:::-;1149:222;;;;:::o;1377:126::-;1414:7;1454:42;1447:5;1443:54;1432:65;;1377:126;;;:::o;1509:96::-;1546:7;1575:24;1593:5;1575:24;:::i;:::-;1564:35;;1509:96;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:329::-;1943:6;1992:2;1980:9;1971:7;1967:23;1963:32;1960:119;;;1998:79;;:::i;:::-;1960:119;2118:1;2143:53;2188:7;2179:6;2168:9;2164:22;2143:53;:::i;:::-;2133:63;;2089:117;1884:329;;;;:::o;2219:90::-;2253:7;2296:5;2289:13;2282:21;2271:32;;2219:90;;;:::o;2315:109::-;2396:21;2411:5;2396:21;:::i;:::-;2391:3;2384:34;2315:109;;:::o;2430:541::-;2601:4;2639:3;2628:9;2624:19;2616:27;;2653:71;2721:1;2710:9;2706:17;2697:6;2653:71;:::i;:::-;2734:72;2802:2;2791:9;2787:18;2778:6;2734:72;:::i;:::-;2816;2884:2;2873:9;2869:18;2860:6;2816:72;:::i;:::-;2898:66;2960:2;2949:9;2945:18;2936:6;2898:66;:::i;:::-;2430:541;;;;;;;:::o;2977:86::-;3012:7;3052:4;3045:5;3041:16;3030:27;;2977:86;;;:::o;3069:112::-;3152:22;3168:5;3152:22;:::i;:::-;3147:3;3140:35;3069:112;;:::o;3187:95::-;3223:7;3263:12;3256:5;3252:24;3241:35;;3187:95;;;:::o;3288:115::-;3373:23;3390:5;3373:23;:::i;:::-;3368:3;3361:36;3288:115;;:::o;3409:118::-;3496:24;3514:5;3496:24;:::i;:::-;3491:3;3484:37;3409:118;;:::o;3533:1076::-;3834:4;3872:3;3861:9;3857:19;3849:27;;3886:71;3954:1;3943:9;3939:17;3930:6;3886:71;:::i;:::-;3967:68;4031:2;4020:9;4016:18;4007:6;3967:68;:::i;:::-;4045;4109:2;4098:9;4094:18;4085:6;4045:68;:::i;:::-;4123:70;4189:2;4178:9;4174:18;4165:6;4123:70;:::i;:::-;4203:73;4271:3;4260:9;4256:19;4247:6;4203:73;:::i;:::-;4286;4354:3;4343:9;4339:19;4330:6;4286:73;:::i;:::-;4369:67;4431:3;4420:9;4416:19;4407:6;4369:67;:::i;:::-;4446:73;4514:3;4503:9;4499:19;4490:6;4446:73;:::i;:::-;4529;4597:3;4586:9;4582:19;4573:6;4529:73;:::i;:::-;3533:1076;;;;;;;;;;;;:::o;4615:210::-;4702:4;4740:2;4729:9;4725:18;4717:26;;4753:65;4815:1;4804:9;4800:17;4791:6;4753:65;:::i;:::-;4615:210;;;;:::o;4831:541::-;5002:4;5040:3;5029:9;5025:19;5017:27;;5054:71;5122:1;5111:9;5107:17;5098:6;5054:71;:::i;:::-;5135:66;5197:2;5186:9;5182:18;5173:6;5135:66;:::i;:::-;5211:72;5279:2;5268:9;5264:18;5255:6;5211:72;:::i;:::-;5293;5361:2;5350:9;5346:18;5337:6;5293:72;:::i;:::-;4831:541;;;;;;;:::o;5378:332::-;5499:4;5537:2;5526:9;5522:18;5514:26;;5550:71;5618:1;5607:9;5603:17;5594:6;5550:71;:::i;:::-;5631:72;5699:2;5688:9;5684:18;5675:6;5631:72;:::i;:::-;5378:332;;;;;:::o;5716:222::-;5809:4;5847:2;5836:9;5832:18;5824:26;;5860:71;5928:1;5917:9;5913:17;5904:6;5860:71;:::i;:::-;5716:222;;;;:::o;5944:76::-;5980:7;6009:5;5998:16;;5944:76;;;:::o;6026:115::-;6111:23;6128:5;6111:23;:::i;:::-;6106:3;6099:36;6026:115;;:::o;6147:218::-;6238:4;6276:2;6265:9;6261:18;6253:26;;6289:69;6355:1;6344:9;6340:17;6331:6;6289:69;:::i;:::-;6147:218;;;;:::o;6371:474::-;6439:6;6447;6496:2;6484:9;6475:7;6471:23;6467:32;6464:119;;;6502:79;;:::i;:::-;6464:119;6622:1;6647:53;6692:7;6683:6;6672:9;6668:22;6647:53;:::i;:::-;6637:63;;6593:117;6749:2;6775:53;6820:7;6811:6;6800:9;6796:22;6775:53;:::i;:::-;6765:63;;6720:118;6371:474;;;;;:::o;6851:644::-;7046:4;7084:3;7073:9;7069:19;7061:27;;7098:71;7166:1;7155:9;7151:17;7142:6;7098:71;:::i;:::-;7179:68;7243:2;7232:9;7228:18;7219:6;7179:68;:::i;:::-;7257;7321:2;7310:9;7306:18;7297:6;7257:68;:::i;:::-;7335:70;7401:2;7390:9;7386:18;7377:6;7335:70;:::i;:::-;7415:73;7483:3;7472:9;7468:19;7459:6;7415:73;:::i;:::-;6851:644;;;;;;;;:::o;7501:553::-;7678:4;7716:3;7705:9;7701:19;7693:27;;7730:71;7798:1;7787:9;7783:17;7774:6;7730:71;:::i;:::-;7811:72;7879:2;7868:9;7864:18;7855:6;7811:72;:::i;:::-;7893;7961:2;7950:9;7946:18;7937:6;7893:72;:::i;:::-;7975;8043:2;8032:9;8028:18;8019:6;7975:72;:::i;:::-;7501:553;;;;;;;:::o;8060:474::-;8128:6;8136;8185:2;8173:9;8164:7;8160:23;8156:32;8153:119;;;8191:79;;:::i;:::-;8153:119;8311:1;8336:53;8381:7;8372:6;8361:9;8357:22;8336:53;:::i;:::-;8326:63;;8282:117;8438:2;8464:53;8509:7;8500:6;8489:9;8485:22;8464:53;:::i;:::-;8454:63;;8409:118;8060:474;;;;;:::o;8540:619::-;8617:6;8625;8633;8682:2;8670:9;8661:7;8657:23;8653:32;8650:119;;;8688:79;;:::i;:::-;8650:119;8808:1;8833:53;8878:7;8869:6;8858:9;8854:22;8833:53;:::i;:::-;8823:63;;8779:117;8935:2;8961:53;9006:7;8997:6;8986:9;8982:22;8961:53;:::i;:::-;8951:63;;8906:118;9063:2;9089:53;9134:7;9125:6;9114:9;9110:22;9089:53;:::i;:::-;9079:63;;9034:118;8540:619;;;;;:::o;9165:430::-;9308:4;9346:2;9335:9;9331:18;9323:26;;9359:71;9427:1;9416:9;9412:17;9403:6;9359:71;:::i;:::-;9440:72;9508:2;9497:9;9493:18;9484:6;9440:72;:::i;:::-;9522:66;9584:2;9573:9;9569:18;9560:6;9522:66;:::i;:::-;9165:430;;;;;;:::o;9601:169::-;9685:11;9719:6;9714:3;9707:19;9759:4;9754:3;9750:14;9735:29;;9601:169;;;;:::o;9776:227::-;9916:34;9912:1;9904:6;9900:14;9893:58;9985:10;9980:2;9972:6;9968:15;9961:35;9776:227;:::o;10009:366::-;10151:3;10172:67;10236:2;10231:3;10172:67;:::i;:::-;10165:74;;10248:93;10337:3;10248:93;:::i;:::-;10366:2;10361:3;10357:12;10350:19;;10009:366;;;:::o;10381:419::-;10547:4;10585:2;10574:9;10570:18;10562:26;;10634:9;10628:4;10624:20;10620:1;10609:9;10605:17;10598:47;10662:131;10788:4;10662:131;:::i;:::-;10654:139;;10381:419;;;:::o;10806:180::-;10854:77;10851:1;10844:88;10951:4;10948:1;10941:15;10975:4;10972:1;10965:15;10992:191;11032:3;11051:20;11069:1;11051:20;:::i;:::-;11046:25;;11085:20;11103:1;11085:20;:::i;:::-;11080:25;;11128:1;11125;11121:9;11114:16;;11149:3;11146:1;11143:10;11140:36;;;11156:18;;:::i;:::-;11140:36;10992:191;;;;:::o;11189:194::-;11229:4;11249:20;11267:1;11249:20;:::i;:::-;11244:25;;11283:20;11301:1;11283:20;:::i;:::-;11278:25;;11327:1;11324;11320:9;11312:17;;11351:1;11345:4;11342:11;11339:37;;;11356:18;;:::i;:::-;11339:37;11189:194;;;;:::o;11389:229::-;11529:34;11525:1;11517:6;11513:14;11506:58;11598:12;11593:2;11585:6;11581:15;11574:37;11389:229;:::o;11624:366::-;11766:3;11787:67;11851:2;11846:3;11787:67;:::i;:::-;11780:74;;11863:93;11952:3;11863:93;:::i;:::-;11981:2;11976:3;11972:12;11965:19;;11624:366;;;:::o;11996:419::-;12162:4;12200:2;12189:9;12185:18;12177:26;;12249:9;12243:4;12239:20;12235:1;12224:9;12220:17;12213:47;12277:131;12403:4;12277:131;:::i;:::-;12269:139;;11996:419;;;:::o;12421:227::-;12561:34;12557:1;12549:6;12545:14;12538:58;12630:10;12625:2;12617:6;12613:15;12606:35;12421:227;:::o;12654:366::-;12796:3;12817:67;12881:2;12876:3;12817:67;:::i;:::-;12810:74;;12893:93;12982:3;12893:93;:::i;:::-;13011:2;13006:3;13002:12;12995:19;;12654:366;;;:::o;13026:419::-;13192:4;13230:2;13219:9;13215:18;13207:26;;13279:9;13273:4;13269:20;13265:1;13254:9;13250:17;13243:47;13307:131;13433:4;13307:131;:::i;:::-;13299:139;;13026:419;;;:::o;13451:178::-;13591:30;13587:1;13579:6;13575:14;13568:54;13451:178;:::o;13635:366::-;13777:3;13798:67;13862:2;13857:3;13798:67;:::i;:::-;13791:74;;13874:93;13963:3;13874:93;:::i;:::-;13992:2;13987:3;13983:12;13976:19;;13635:366;;;:::o;14007:419::-;14173:4;14211:2;14200:9;14196:18;14188:26;;14260:9;14254:4;14250:20;14246:1;14235:9;14231:17;14224:47;14288:131;14414:4;14288:131;:::i;:::-;14280:139;;14007:419;;;:::o;14432:168::-;14572:20;14568:1;14560:6;14556:14;14549:44;14432:168;:::o;14606:366::-;14748:3;14769:67;14833:2;14828:3;14769:67;:::i;:::-;14762:74;;14845:93;14934:3;14845:93;:::i;:::-;14963:2;14958:3;14954:12;14947:19;;14606:366;;;:::o;14978:419::-;15144:4;15182:2;15171:9;15167:18;15159:26;;15231:9;15225:4;15221:20;15217:1;15206:9;15202:17;15195:47;15259:131;15385:4;15259:131;:::i;:::-;15251:139;;14978:419;;;:::o;15403:180::-;15451:77;15448:1;15441:88;15548:4;15545:1;15538:15;15572:4;15569:1;15562:15;15589:180;15729:32;15725:1;15717:6;15713:14;15706:56;15589:180;:::o;15775:366::-;15917:3;15938:67;16002:2;15997:3;15938:67;:::i;:::-;15931:74;;16014:93;16103:3;16014:93;:::i;:::-;16132:2;16127:3;16123:12;16116:19;;15775:366;;;:::o;16147:419::-;16313:4;16351:2;16340:9;16336:18;16328:26;;16400:9;16394:4;16390:20;16386:1;16375:9;16371:17;16364:47;16428:131;16554:4;16428:131;:::i;:::-;16420:139;;16147:419;;;:::o;16572:176::-;16712:28;16708:1;16700:6;16696:14;16689:52;16572:176;:::o;16754:366::-;16896:3;16917:67;16981:2;16976:3;16917:67;:::i;:::-;16910:74;;16993:93;17082:3;16993:93;:::i;:::-;17111:2;17106:3;17102:12;17095:19;;16754:366;;;:::o;17126:419::-;17292:4;17330:2;17319:9;17315:18;17307:26;;17379:9;17373:4;17369:20;17365:1;17354:9;17350:17;17343:47;17407:131;17533:4;17407:131;:::i;:::-;17399:139;;17126:419;;;:::o;17551:179::-;17691:31;17687:1;17679:6;17675:14;17668:55;17551:179;:::o;17736:366::-;17878:3;17899:67;17963:2;17958:3;17899:67;:::i;:::-;17892:74;;17975:93;18064:3;17975:93;:::i;:::-;18093:2;18088:3;18084:12;18077:19;;17736:366;;;:::o;18108:419::-;18274:4;18312:2;18301:9;18297:18;18289:26;;18361:9;18355:4;18351:20;18347:1;18336:9;18332:17;18325:47;18389:131;18515:4;18389:131;:::i;:::-;18381:139;;18108:419;;;:::o;18533:225::-;18673:34;18669:1;18661:6;18657:14;18650:58;18742:8;18737:2;18729:6;18725:15;18718:33;18533:225;:::o;18764:366::-;18906:3;18927:67;18991:2;18986:3;18927:67;:::i;:::-;18920:74;;19003:93;19092:3;19003:93;:::i;:::-;19121:2;19116:3;19112:12;19105:19;;18764:366;;;:::o;19136:419::-;19302:4;19340:2;19329:9;19325:18;19317:26;;19389:9;19383:4;19379:20;19375:1;19364:9;19360:17;19353:47;19417:131;19543:4;19417:131;:::i;:::-;19409:139;;19136:419;;;:::o;19561:176::-;19701:28;19697:1;19689:6;19685:14;19678:52;19561:176;:::o;19743:366::-;19885:3;19906:67;19970:2;19965:3;19906:67;:::i;:::-;19899:74;;19982:93;20071:3;19982:93;:::i;:::-;20100:2;20095:3;20091:12;20084:19;;19743:366;;;:::o;20115:419::-;20281:4;20319:2;20308:9;20304:18;20296:26;;20368:9;20362:4;20358:20;20354:1;20343:9;20339:17;20332:47;20396:131;20522:4;20396:131;:::i;:::-;20388:139;;20115:419;;;:::o;20540:180::-;20588:77;20585:1;20578:88;20685:4;20682:1;20675:15;20709:4;20706:1;20699:15;20726:185;20766:1;20783:20;20801:1;20783:20;:::i;:::-;20778:25;;20817:20;20835:1;20817:20;:::i;:::-;20812:25;;20856:1;20846:35;;20861:18;;:::i;:::-;20846:35;20903:1;20900;20896:9;20891:14;;20726:185;;;;:::o;20917:410::-;20957:7;20980:20;20998:1;20980:20;:::i;:::-;20975:25;;21014:20;21032:1;21014:20;:::i;:::-;21009:25;;21069:1;21066;21062:9;21091:30;21109:11;21091:30;:::i;:::-;21080:41;;21270:1;21261:7;21257:15;21254:1;21251:22;21231:1;21224:9;21204:83;21181:139;;21300:18;;:::i;:::-;21181:139;20965:362;20917:410;;;;:::o;21333:179::-;21473:31;21469:1;21461:6;21457:14;21450:55;21333:179;:::o;21518:366::-;21660:3;21681:67;21745:2;21740:3;21681:67;:::i;:::-;21674:74;;21757:93;21846:3;21757:93;:::i;:::-;21875:2;21870:3;21866:12;21859:19;;21518:366;;;:::o;21890:419::-;22056:4;22094:2;22083:9;22079:18;22071:26;;22143:9;22137:4;22133:20;22129:1;22118:9;22114:17;22107:47;22171:131;22297:4;22171:131;:::i;:::-;22163:139;;21890:419;;;:::o;22315:176::-;22347:1;22364:20;22382:1;22364:20;:::i;:::-;22359:25;;22398:20;22416:1;22398:20;:::i;:::-;22393:25;;22437:1;22427:35;;22442:18;;:::i;:::-;22427:35;22483:1;22480;22476:9;22471:14;;22315:176;;;;:::o;22497:77::-;22534:7;22563:5;22552:16;;22497:77;;;:::o;22580:79::-;22619:7;22648:5;22637:16;;22580:79;;;:::o;22665:157::-;22770:45;22790:24;22808:5;22790:24;:::i;:::-;22770:45;:::i;:::-;22765:3;22758:58;22665:157;;:::o;22828:79::-;22867:7;22896:5;22885:16;;22828:79;;;:::o;22913:157::-;23018:45;23038:24;23056:5;23038:24;:::i;:::-;23018:45;:::i;:::-;23013:3;23006:58;22913:157;;:::o;23076:397::-;23216:3;23231:75;23302:3;23293:6;23231:75;:::i;:::-;23331:2;23326:3;23322:12;23315:19;;23344:75;23415:3;23406:6;23344:75;:::i;:::-;23444:2;23439:3;23435:12;23428:19;;23464:3;23457:10;;23076:397;;;;;:::o;23479:225::-;23619:34;23615:1;23607:6;23603:14;23596:58;23688:8;23683:2;23675:6;23671:15;23664:33;23479:225;:::o;23710:366::-;23852:3;23873:67;23937:2;23932:3;23873:67;:::i;:::-;23866:74;;23949:93;24038:3;23949:93;:::i;:::-;24067:2;24062:3;24058:12;24051:19;;23710:366;;;:::o;24082:419::-;24248:4;24286:2;24275:9;24271:18;24263:26;;24335:9;24329:4;24325:20;24321:1;24310:9;24306:17;24299:47;24363:131;24489:4;24363:131;:::i;:::-;24355:139;;24082:419;;;:::o;24507:221::-;24647:34;24643:1;24635:6;24631:14;24624:58;24716:4;24711:2;24703:6;24699:15;24692:29;24507:221;:::o;24734:366::-;24876:3;24897:67;24961:2;24956:3;24897:67;:::i;:::-;24890:74;;24973:93;25062:3;24973:93;:::i;:::-;25091:2;25086:3;25082:12;25075:19;;24734:366;;;:::o;25106:419::-;25272:4;25310:2;25299:9;25295:18;25287:26;;25359:9;25353:4;25349:20;25345:1;25334:9;25330:17;25323:47;25387:131;25513:4;25387:131;:::i;:::-;25379:139;;25106:419;;;:::o;25531:176::-;25671:28;25667:1;25659:6;25655:14;25648:52;25531:176;:::o;25713:366::-;25855:3;25876:67;25940:2;25935:3;25876:67;:::i;:::-;25869:74;;25952:93;26041:3;25952:93;:::i;:::-;26070:2;26065:3;26061:12;26054:19;;25713:366;;;:::o;26085:419::-;26251:4;26289:2;26278:9;26274:18;26266:26;;26338:9;26332:4;26328:20;26324:1;26313:9;26309:17;26302:47;26366:131;26492:4;26366:131;:::i;:::-;26358:139;;26085:419;;;:::o;26510:143::-;26567:5;26598:6;26592:13;26583:22;;26614:33;26641:5;26614:33;:::i;:::-;26510:143;;;;:::o;26659:351::-;26729:6;26778:2;26766:9;26757:7;26753:23;26749:32;26746:119;;;26784:79;;:::i;:::-;26746:119;26904:1;26929:64;26985:7;26976:6;26965:9;26961:22;26929:64;:::i;:::-;26919:74;;26875:128;26659:351;;;;:::o;27016:181::-;27156:33;27152:1;27144:6;27140:14;27133:57;27016:181;:::o;27203:366::-;27345:3;27366:67;27430:2;27425:3;27366:67;:::i;:::-;27359:74;;27442:93;27531:3;27442:93;:::i;:::-;27560:2;27555:3;27551:12;27544:19;;27203:366;;;:::o;27575:419::-;27741:4;27779:2;27768:9;27764:18;27756:26;;27828:9;27822:4;27818:20;27814:1;27803:9;27799:17;27792:47;27856:131;27982:4;27856:131;:::i;:::-;27848:139;;27575:419;;;:::o;28000:442::-;28149:4;28187:2;28176:9;28172:18;28164:26;;28200:71;28268:1;28257:9;28253:17;28244:6;28200:71;:::i;:::-;28281:72;28349:2;28338:9;28334:18;28325:6;28281:72;:::i;:::-;28363;28431:2;28420:9;28416:18;28407:6;28363:72;:::i;:::-;28000:442;;;;;;:::o;28448:102::-;28490:8;28537:5;28534:1;28530:13;28509:34;;28448:102;;;:::o;28556:848::-;28617:5;28624:4;28648:6;28639:15;;28672:5;28663:14;;28686:712;28707:1;28697:8;28694:15;28686:712;;;28802:4;28797:3;28793:14;28787:4;28784:24;28781:50;;;28811:18;;:::i;:::-;28781:50;28861:1;28851:8;28847:16;28844:451;;;29276:4;29269:5;29265:16;29256:25;;28844:451;29326:4;29320;29316:15;29308:23;;29356:32;29379:8;29356:32;:::i;:::-;29344:44;;28686:712;;;28556:848;;;;;;;:::o;29410:1073::-;29464:5;29655:8;29645:40;;29676:1;29667:10;;29678:5;;29645:40;29704:4;29694:36;;29721:1;29712:10;;29723:5;;29694:36;29790:4;29838:1;29833:27;;;;29874:1;29869:191;;;;29783:277;;29833:27;29851:1;29842:10;;29853:5;;;29869:191;29914:3;29904:8;29901:17;29898:43;;;29921:18;;:::i;:::-;29898:43;29970:8;29967:1;29963:16;29954:25;;30005:3;29998:5;29995:14;29992:40;;;30012:18;;:::i;:::-;29992:40;30045:5;;;29783:277;;30169:2;30159:8;30156:16;30150:3;30144:4;30141:13;30137:36;30119:2;30109:8;30106:16;30101:2;30095:4;30092:12;30088:35;30072:111;30069:246;;;30225:8;30219:4;30215:19;30206:28;;30260:3;30253:5;30250:14;30247:40;;;30267:18;;:::i;:::-;30247:40;30300:5;;30069:246;30340:42;30378:3;30368:8;30362:4;30359:1;30340:42;:::i;:::-;30325:57;;;;30414:4;30409:3;30405:14;30398:5;30395:25;30392:51;;;30423:18;;:::i;:::-;30392:51;30472:4;30465:5;30461:16;30452:25;;29410:1073;;;;;;:::o;30489:285::-;30549:5;30573:23;30591:4;30573:23;:::i;:::-;30565:31;;30617:27;30635:8;30617:27;:::i;:::-;30605:39;;30663:104;30700:66;30690:8;30684:4;30663:104;:::i;:::-;30654:113;;30489:285;;;;:::o;30780:372::-;30819:4;30839:19;30856:1;30839:19;:::i;:::-;30834:24;;30872:19;30889:1;30872:19;:::i;:::-;30867:24;;30915:1;30912;30908:9;30900:17;;31109:1;31103:4;31099:12;31095:1;31092;31088:9;31084:28;31067:1;31061:4;31057:12;31052:1;31049;31045:9;31038:17;31034:36;31018:104;31015:130;;;31125:18;;:::i;:::-;31015:130;30780:372;;;;:::o;31158:375::-;31197:3;31216:19;31233:1;31216:19;:::i;:::-;31211:24;;31249:19;31266:1;31249:19;:::i;:::-;31244:24;;31291:1;31288;31284:9;31277:16;;31489:1;31484:3;31480:11;31473:19;31469:1;31466;31462:9;31458:35;31441:1;31436:3;31432:11;31427:1;31424;31420:9;31413:17;31409:35;31393:110;31390:136;;;31506:18;;:::i;:::-;31390:136;31158:375;;;;:::o;31539:763::-;31766:4;31804:3;31793:9;31789:19;31781:27;;31818:71;31886:1;31875:9;31871:17;31862:6;31818:71;:::i;:::-;31899:68;31963:2;31952:9;31948:18;31939:6;31899:68;:::i;:::-;31977:70;32043:2;32032:9;32028:18;32019:6;31977:70;:::i;:::-;32057:72;32125:2;32114:9;32110:18;32101:6;32057:72;:::i;:::-;32139:73;32207:3;32196:9;32192:19;32183:6;32139:73;:::i;:::-;32222;32290:3;32279:9;32275:19;32266:6;32222:73;:::i;:::-;31539:763;;;;;;;;;:::o;32308:332::-;32429:4;32467:2;32456:9;32452:18;32444:26;;32480:71;32548:1;32537:9;32533:17;32524:6;32480:71;:::i;:::-;32561:72;32629:2;32618:9;32614:18;32605:6;32561:72;:::i;:::-;32308:332;;;;;:::o;32646:652::-;32845:4;32883:3;32872:9;32868:19;32860:27;;32897:71;32965:1;32954:9;32950:17;32941:6;32897:71;:::i;:::-;32978:68;33042:2;33031:9;33027:18;33018:6;32978:68;:::i;:::-;33056:70;33122:2;33111:9;33107:18;33098:6;33056:70;:::i;:::-;33136:72;33204:2;33193:9;33189:18;33180:6;33136:72;:::i;:::-;33218:73;33286:3;33275:9;33271:19;33262:6;33218:73;:::i;:::-;32646:652;;;;;;;;:::o

Swarm Source

ipfs://a5163d713a6a94ba87179b0ec6b5a69c2c19f00804ac004320089f0434b43be9

Block Transaction Gas Used Reward
view all blocks ##produced##

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

Validator Index Block Amount
View All Withdrawals

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

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.