Contract 0xEFF188Bd11384f9007a6c8a5D196A967f62EaAA8

Contract Overview

Balance:
315.36 MATIC

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x388149de2fa2026f35eee296351f656abfe8fe681c7ce6b3db38724a2c121e55Play Game264263802022-05-23 3:50:29135 days 14 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa86 MATIC0.0607239 100
0x34b6149210868ec0120e7379896095cdfbbb9a74f26d653fd9e4ea85da2e9bb9Play Game263315092022-05-16 4:19:12142 days 13 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa86 MATIC0.0607239 100
0xfbf3bd88f08ba75c66cec242e5f3e2ba3ea6af56ca2d52841cd016578276012aPlay Game263024782022-05-13 4:20:35145 days 13 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa86 MATIC0.0607239 100
0xbb075b447e277e24c97413a732de84d7ed21c458497b3b88691eca80ef815acbPlay Game262815692022-05-11 4:11:12147 days 13 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa86 MATIC0.0607239 100
0xe8ae9cf11e1ec99e9c2745c48a3761c556d5e0830a166ec61cfa23d9c939d120Play Game261944542022-05-04 3:42:00154 days 14 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa86 MATIC0.0607239 100
0x5fa65b3f0c53b3e64cf59e4833fc2d94d142f2631ab136795cfd0752b6e07101Play Game261832412022-05-03 9:53:06155 days 7 hrs ago0xbc89597718c4abb1a7e0dfdca895b13bf38da9af IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa82 MATIC0.000662927102 2.42500001
0xfc3ec79242a9784ea79ec7919ca5c9b3460e997e990cff2b646a70f157785184Play Game261832242022-05-03 9:51:40155 days 8 hrs ago0xbc89597718c4abb1a7e0dfdca895b13bf38da9af IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa82 MATIC0.004889986953 2.738019009
0x816ef6aa9fccfa20c7176531f1b5cd858cfcecec8183d36c1414524483c0ed30Play Game261798192022-05-03 3:59:52155 days 13 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa86 MATIC0.0607239 100
0xf7c70df93099944ce03c40bd98b072deb16df2f0a4e119e0af7b789fb39bbe43Play Game261665222022-05-02 3:31:06156 days 14 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa82 MATIC0.0631842 100
0xd64f6382e3421bea1550802cf6a0d5daade59c3731c4b3bccc1a7dcbf7822476Play Game261307432022-04-29 11:03:18159 days 6 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa820 MATIC0.0293542 100
0xab7ae209df1a98021420f5b689884587c7597167ba26028bfc9ecba3cf85c36ePlay Game261307182022-04-29 11:01:13159 days 6 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa86 MATIC0.0650218 100
0xd52bb86c3be84ff1462bf93a6411505ea4eba54ba87c17fa5e6be7140332c847Play Game261306792022-04-29 10:57:53159 days 6 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa820 MATIC0.0607239 100
0x303a04332c86d014e749e67c4af995eafe0248c45c3f384ae74d446cd34ae999Play Game261306552022-04-29 10:55:53159 days 6 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa86 MATIC0.0607239 100
0xce104d41f1edad8e5d6f2356a5e9ca8e593ad7ded5f45c6b286803ab50b2517ePlay Game261298712022-04-29 9:30:09159 days 8 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa86 MATIC0.077062 100
0x7cfb24a37abb7b304bcf5df0e343575e765938fb9e9e46353886a17d881012a5Play Game261298242022-04-29 9:24:53159 days 8 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa820 MATIC0.0607239 100
0x520e5ccf0a271cfe67ac74e35b1cfc00634cb62d4f236a9971c2add8a0f2f72ePlay Game261297722022-04-29 9:20:32159 days 8 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa810 MATIC0.0293542 100
0xe46d780228725681df703ff706c89d73847c98a7cdf7a37156d78aee832ab6c1Play Game261297522022-04-29 9:18:52159 days 8 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa82 MATIC0.0273372 100
0x0b0dc660ea68d48076886679af757efc9e55c1e82467b00c7209a88c2db327c4Play Game261297012022-04-29 9:14:32159 days 8 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa86 MATIC0.0607239 100
0x1a77adb045d6ff4f32ea4cb8928aab618620a605396d241ba1f8307c1fa599e3Play Game261296712022-04-29 9:12:02159 days 8 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa86 MATIC0.0650218 100
0xdf878b782ab4a97ff04666c96c0ae5e860c95b8b3e40c2370a336559cf4e2c7cPlay Game261295652022-04-29 8:57:46159 days 8 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa820 MATIC0.076782 100
0xa3050dc90b2372e707ae3e472ab4c038b1bf5b92d871c05c9a2bc43271e1db64Play Game261276132022-04-29 5:31:43159 days 12 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa820 MATIC0.0293542 100
0x9346d612ba0788739a84672fbbeef464ba163b1a6ff351d8af09ad31382f42cePlay Game261274052022-04-29 5:08:56159 days 12 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa820 MATIC0.0892868 100
0x169dfc1bff68c838d1c1c3d64cdab702d38780ec2ae7bf5c6225ba0ea1a76460Play Game261273652022-04-29 5:05:36159 days 12 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa820 MATIC0.0293542 100
0x18dd6a22a46f525d9bcbf16fe0d80ee8fcc653ff867488de447f4fdb47abf53ePlay Game261273442022-04-29 5:03:50159 days 12 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa820 MATIC0.077062 100
0xc31f8039ad6fab365d80bb941dc95b0a505e000647fb18556cc39012649065d7Play Game261273102022-04-29 5:01:00159 days 12 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0xeff188bd11384f9007a6c8a5d196a967f62eaaa820 MATIC0.076782 100
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x39bba4e8be066417f9e69be0408f8d11707f1ea5a5c2dbfa03e220cffd571815264263912022-05-23 3:51:24135 days 14 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0x39bba4e8be066417f9e69be0408f8d11707f1ea5a5c2dbfa03e220cffd571815264263912022-05-23 3:51:24135 days 14 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606980.94 MATIC
0x3f9676aa418d27910d70201abae9455e642e3b85f2306e5d0a49424697edfcf7263315202022-05-16 4:21:53142 days 13 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0x3f9676aa418d27910d70201abae9455e642e3b85f2306e5d0a49424697edfcf7263315202022-05-16 4:21:53142 days 13 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0xf06caff0f88cf7f27439d460293cf22d892db5f0c90e9ae2d8433f9044bb3d00262815802022-05-11 4:12:07147 days 13 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606982.94 MATIC
0xf06caff0f88cf7f27439d460293cf22d892db5f0c90e9ae2d8433f9044bb3d00262815802022-05-11 4:12:07147 days 13 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0xf06caff0f88cf7f27439d460293cf22d892db5f0c90e9ae2d8433f9044bb3d00262815802022-05-11 4:12:07147 days 13 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0xa8bfaebc5040d423f82750f1ec3c7b9cb3645e3384add66af81d21634ed7f1ff261944652022-05-04 3:42:55154 days 14 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0xa8bfaebc5040d423f82750f1ec3c7b9cb3645e3384add66af81d21634ed7f1ff261944652022-05-04 3:42:55154 days 14 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0xa8bfaebc5040d423f82750f1ec3c7b9cb3645e3384add66af81d21634ed7f1ff261944652022-05-04 3:42:55154 days 14 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0xb914a087688e813b9d7205e133b2e8295faf784c5cfdffdd3f3b33e0a28b34f6261832352022-05-03 9:52:36155 days 7 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xbc89597718c4abb1a7e0dfdca895b13bf38da9af1.94 MATIC
0xa859d871708775520b8bdf2312f30db19f26ae54212ab38e1e284e1564e02848261798302022-05-03 4:01:42155 days 13 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0xe39a7f4928c024abd70effc6b63115c02b96032710ec1c4ab236bdb4ef081a90261307542022-04-29 11:04:29159 days 6 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0xe39a7f4928c024abd70effc6b63115c02b96032710ec1c4ab236bdb4ef081a90261307542022-04-29 11:04:29159 days 6 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606980.44 MATIC
0xe39a7f4928c024abd70effc6b63115c02b96032710ec1c4ab236bdb4ef081a90261307542022-04-29 11:04:29159 days 6 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606985.94 MATIC
0xe39a7f4928c024abd70effc6b63115c02b96032710ec1c4ab236bdb4ef081a90261307542022-04-29 11:04:29159 days 6 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0xe39a7f4928c024abd70effc6b63115c02b96032710ec1c4ab236bdb4ef081a90261307542022-04-29 11:04:29159 days 6 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0xffc87687570f418ce8668a4d9edbf0a3f8b77856f62015014a54d976e25a3148261307292022-04-29 11:02:08159 days 6 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0xd579597abd95a2551132061c97564c6cfd96fb28b464408be61927e86b1634e4261306902022-04-29 10:58:53159 days 6 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0xd579597abd95a2551132061c97564c6cfd96fb28b464408be61927e86b1634e4261306902022-04-29 10:58:53159 days 6 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0xd579597abd95a2551132061c97564c6cfd96fb28b464408be61927e86b1634e4261306902022-04-29 10:58:53159 days 6 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606980.94 MATIC
0xd579597abd95a2551132061c97564c6cfd96fb28b464408be61927e86b1634e4261306902022-04-29 10:58:53159 days 6 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0xd579597abd95a2551132061c97564c6cfd96fb28b464408be61927e86b1634e4261306902022-04-29 10:58:53159 days 6 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0xd579597abd95a2551132061c97564c6cfd96fb28b464408be61927e86b1634e4261306902022-04-29 10:58:53159 days 6 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0x472264a60cf7d6cd67fe3d544c3648ec94d6ee68cd46cae635fb68794bf78b0e261306662022-04-29 10:56:48159 days 6 hrs ago 0xeff188bd11384f9007a6c8a5d196a967f62eaaa80xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoPolyGame

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-04-06
*/

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.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() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

// File: @chainlink/contracts/src/v0.8/VRFRequestIDBase.sol


pragma solidity ^0.8.0;

contract VRFRequestIDBase {

  /**
   * @notice returns the seed which is actually input to the VRF coordinator
   *
   * @dev To prevent repetition of VRF output due to repetition of the
   * @dev user-supplied seed, that seed is combined in a hash with the
   * @dev user-specific nonce, and the address of the consuming contract. The
   * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in
   * @dev the final seed, but the nonce does protect against repetition in
   * @dev requests which are included in a single block.
   *
   * @param _userSeed VRF seed input provided by user
   * @param _requester Address of the requesting contract
   * @param _nonce User-specific nonce at the time of the request
   */
  function makeVRFInputSeed(
    bytes32 _keyHash,
    uint256 _userSeed,
    address _requester,
    uint256 _nonce
  )
    internal
    pure
    returns (
      uint256
    )
  {
    return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce)));
  }

  /**
   * @notice Returns the id for this request
   * @param _keyHash The serviceAgreement ID to be used for this request
   * @param _vRFInputSeed The seed to be passed directly to the VRF
   * @return The id for this request
   *
   * @dev Note that _vRFInputSeed is not the seed passed by the consuming
   * @dev contract, but the one generated by makeVRFInputSeed
   */
  function makeRequestId(
    bytes32 _keyHash,
    uint256 _vRFInputSeed
  )
    internal
    pure
    returns (
      bytes32
    )
  {
    return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
  }
}
// File: @chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol


pragma solidity ^0.8.0;

interface LinkTokenInterface {

  function allowance(
    address owner,
    address spender
  )
    external
    view
    returns (
      uint256 remaining
    );

  function approve(
    address spender,
    uint256 value
  )
    external
    returns (
      bool success
    );

  function balanceOf(
    address owner
  )
    external
    view
    returns (
      uint256 balance
    );

  function decimals()
    external
    view
    returns (
      uint8 decimalPlaces
    );

  function decreaseApproval(
    address spender,
    uint256 addedValue
  )
    external
    returns (
      bool success
    );

  function increaseApproval(
    address spender,
    uint256 subtractedValue
  ) external;

  function name()
    external
    view
    returns (
      string memory tokenName
    );

  function symbol()
    external
    view
    returns (
      string memory tokenSymbol
    );

  function totalSupply()
    external
    view
    returns (
      uint256 totalTokensIssued
    );

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

  function transferAndCall(
    address to,
    uint256 value,
    bytes calldata data
  )
    external
    returns (
      bool success
    );

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

}

// File: @chainlink/contracts/src/v0.8/VRFConsumerBase.sol


pragma solidity ^0.8.0;



/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constuctor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator, _link) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash), and have told you the minimum LINK
 * @dev price for VRF service. Make sure your contract has sufficient LINK, and
 * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you
 * @dev want to generate randomness from.
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomness method.
 *
 * @dev The randomness argument to fulfillRandomness is the actual random value
 * @dev generated from your seed.
 *
 * @dev The requestId argument is generated from the keyHash and the seed by
 * @dev makeRequestId(keyHash, seed). If your contract could have concurrent
 * @dev requests open, you can use the requestId to track which seed is
 * @dev associated with which randomness. See VRFRequestIDBase.sol for more
 * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.)
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ. (Which is critical to making unpredictable randomness! See the
 * @dev next section.)
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the ultimate input to the VRF is mixed with the block hash of the
 * @dev block in which the request is made, user-provided seeds have no impact
 * @dev on its economic security properties. They are only included for API
 * @dev compatability with previous versions of this contract.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request.
 */
abstract contract VRFConsumerBase is VRFRequestIDBase {

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBase expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomness the VRF output
   */
  function fulfillRandomness(
    bytes32 requestId,
    uint256 randomness
  )
    internal
    virtual;

  /**
   * @dev In order to keep backwards compatibility we have kept the user
   * seed field around. We remove the use of it because given that the blockhash
   * enters later, it overrides whatever randomness the used seed provides.
   * Given that it adds no security, and can easily lead to misunderstandings,
   * we have removed it from usage and can now provide a simpler API.
   */
  uint256 constant private USER_SEED_PLACEHOLDER = 0;

  /**
   * @notice requestRandomness initiates a request for VRF output given _seed
   *
   * @dev The fulfillRandomness method receives the output, once it's provided
   * @dev by the Oracle, and verified by the vrfCoordinator.
   *
   * @dev The _keyHash must already be registered with the VRFCoordinator, and
   * @dev the _fee must exceed the fee specified during registration of the
   * @dev _keyHash.
   *
   * @dev The _seed parameter is vestigial, and is kept only for API
   * @dev compatibility with older versions. It can't *hurt* to mix in some of
   * @dev your own randomness, here, but it's not necessary because the VRF
   * @dev oracle will mix the hash of the block containing your request into the
   * @dev VRF seed it ultimately uses.
   *
   * @param _keyHash ID of public key against which randomness is generated
   * @param _fee The amount of LINK to send with the request
   *
   * @return requestId unique ID for this request
   *
   * @dev The returned requestId can be used to distinguish responses to
   * @dev concurrent requests. It is passed as the first argument to
   * @dev fulfillRandomness.
   */
  function requestRandomness(
    bytes32 _keyHash,
    uint256 _fee
  )
    internal
    returns (
      bytes32 requestId
    )
  {
    LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER));
    // This is the seed passed to VRFCoordinator. The oracle will mix this with
    // the hash of the block containing this request to obtain the seed/input
    // which is finally passed to the VRF cryptographic machinery.
    uint256 vRFSeed  = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]);
    // nonces[_keyHash] must stay in sync with
    // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above
    // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest).
    // This provides protection against the user repeating their input seed,
    // which would result in a predictable/duplicate output, if multiple such
    // requests appeared in the same block.
    nonces[_keyHash] = nonces[_keyHash] + 1;
    return makeRequestId(_keyHash, vRFSeed);
  }

  LinkTokenInterface immutable internal LINK;
  address immutable private vrfCoordinator;

  // Nonces for each VRF key from which randomness has been requested.
  //
  // Must stay in sync with VRFCoordinator[_keyHash][this]
  mapping(bytes32 /* keyHash */ => uint256 /* nonce */) private nonces;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   * @param _link address of LINK token contract
   *
   * @dev https://docs.chain.link/docs/link-token-contracts
   */
  constructor(
    address _vrfCoordinator,
    address _link
  ) {
    vrfCoordinator = _vrfCoordinator;
    LINK = LinkTokenInterface(_link);
  }

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomness(
    bytes32 requestId,
    uint256 randomness
  )
    external
  {
    require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill");
    fulfillRandomness(requestId, randomness);
  }
}

// File: contracts/CryptoPolyGame.sol


pragma solidity ^0.8.7;





contract CryptoPolyGame is VRFConsumerBase,Ownable,ReentrancyGuard {
    
    bytes32 internal keyHash;
    uint256 internal fee;
    uint256 internal totalAmountToBePaid; //  total amount owed by the contract. Only rent for NFT owners is added to this variable
    uint256 private MIN_BET;
    uint256 private MAX_BET;
    uint256 private BONUS_X = 1;// amount to be paid when user passes the starting point
    uint256 private tokenRatio = 3;//for every matic spent get 3X tokens
    address private nftaddress;
    address private rewarderAddress;// address of the contract that rewards token holders
    uint256 private MAX_STEPS_POSSIBLE = 10; //Roll multiple limit
    uint256 private HOUSE_EDGE_PERCENT = 3;    
    uint256 private HOUSE_EDGE_MINIMUM_AMOUNT;
    uint256 private NFT_PERCENT = 10;    
    uint256 private NFT_MINIMUM_AMOUNT;
    uint private lockedInBets;
    uint constant MAXPROFIT_X = 4;
    
    int constant SINGLE_X = 1; // 1x
    int constant ONEANDHALF_X = 9; // 1.5x
    int constant DOUBLE_X = 2; // 2x
    int constant TRIPLE_X = 3; // 3x
    int constant FOUR_X = 4; // 3x
    int constant ONE_FOURTH = -1; // 1/4x
    int constant TWO_FOURTH = -2;// 1/2x
    int constant THREE_FOURTH = -3;// 3/4x
    bool constant live_mode = false;
    
    struct Chance{
        // Chance type.
        bytes32 chanceType;
        // This defines the amount of reward or tax.
        int choice; 
        // order.
        uint order;         
    }

    struct CommunityChest{
        // Chance type.
        bytes32 ccType;
        // This defines the amount of reward or tax.
        int choice;  
        // order.
         uint order;             
    }
    struct Game {
        // Game amount in wei.
        uint amount;
        // tax amount to be paid. It is either 0 or non zero when the person has to pay tax.
        uint taxTobePaid;   
        // If player has selected multiple_bet, this variable stores the multiple amount bet.
        uint multiple_bet;   
        // chances of the player
        Chance[] chances;
        // chances of the player
        CommunityChest[] cchest;        
    }
    struct Position {
        // Position type.
        bytes32 positionType;
        // This is used to decide the tax or reward
        int choice;       
    }
    
    // this is mainly used we need the ability to refund bets 
    //(in the rare case when Chainlink does not respond with the random number)
    struct Bet {
        // Wager amount in wei.
        uint amount;    
        // Block number of placeBet tx.
        uint placeBlockNumber;
        // Status of bet settlement.
        bool isSettled;
        // Win amount.
        uint winAmount;
        // Address of a gambler, used to pay out winning bets.
        address payable gambler;        
    }

    // Mapping requestId returned by Chainlink VRF to bet Id.
    mapping(bytes32 => Bet) private betMap;

    // Mapping from games by address
    mapping (address => Game) private games;
    // Mapping of current position
    mapping (address => uint) private current_positions;
    // Mapping of event numbers
    mapping (address => uint) private address_events;    
    // Mapping of requestId
    mapping (address => bytes32) private address_requestid;
    // Mapping of addresses
    mapping (bytes32 => address) private requestid_address;
    // Mapping of positions
    mapping (uint => Position) private game_positions;

    // Chance and Community Chest array
    CommunityChest[10] private chestArray;
    Chance[10] private chanceArray;
    
    enum GAMESTAT{ RUNNING, PAUSED }
    GAMESTAT private gameStatus;

    event RewardWon(bytes32 indexed requestId,uint256 amountWon,address indexed _address,uint _current_position);
    event BonusWon(bytes32 indexed requestId,uint256 amountWon,address indexed _address);
    event PositionChanged(bytes32 indexed requestId,uint256 random_number,uint256 current_position,address indexed _address,uint256 event_no,bytes32[] event_details,uint256 pending_tax,uint256 time_stamp);
    event notEnoughBalance(uint256 first,address indexed _address);
    event requestIDGenerated(bytes32 indexed requestId,address indexed _address);
    event taxPaidSucess(bytes32 indexed requestId,uint256 amountPaid,address indexed _address,uint256 event_no);
    event taxPaidPartial(bytes32 indexed requestId,uint256 taxTobePaid,address indexed _address);
    event balanceMultipleBetPaid(bytes32 indexed requestId,uint256 amountPaid,address indexed _address);
    event rentPaid(address indexed _receiver_address,uint256 amountPaid,address indexed _address);
    event BetRefunded(bytes32 indexed requestId, address indexed gambler, uint amount);

    // this is the payment owed to NFT owners
    mapping(address => uint256) private nft_payments_list;

    //polygon
      constructor()
        VRFConsumerBase(
            0x8C7382F9D8f56b33781fE506E897a4F1e2d17255, // VRF Coordinator
            0x326C977E6efc84E512bB9C30f76E30c160eD06FB  // LINK Token
        )
    {
        MIN_BET = 2 ether;
        MAX_BET = 100 ether;    
        HOUSE_EDGE_MINIMUM_AMOUNT = 0.05 ether;
        NFT_MINIMUM_AMOUNT = 0.1 ether;
        keyHash = 0x6e75b569a01ef56d18cab6a8e71e6600d6ce853834d4a5748b720d06f878b3a4;
        fee = 0.0001 * 10 ** 18; // 0.1 LINK (Varies by network)
        gameStatus = GAMESTAT.RUNNING;
        initializeBoard();
    }

    // board
    function initializeBoard() private {
        nftaddress = 0x94BB84145e9FbF238246Cc374a1299c0aE4d77D2;
        //possible positions start,reward,tax,chance,community chest

       //1 - 10 positions
        game_positions[0] = Position("start",0);
        game_positions[1] = Position("rent",0);
        game_positions[2] = Position("communitychest",0);
        game_positions[3] = Position("tax",SINGLE_X);
        game_positions[4] = Position("reward",DOUBLE_X);
        game_positions[5] = Position("rent",0);
        game_positions[6] = Position("rent",0);
        game_positions[7] = Position("chance",0);
        game_positions[8] = Position("reward",SINGLE_X);
        game_positions[9] = Position("rent",0);

        //11 - 20 positions
        game_positions[10] = Position("reward",DOUBLE_X);
        game_positions[11] = Position("rent",0);
        game_positions[12] = Position("reward",ONEANDHALF_X);
        game_positions[13] = Position("rent",0);
        game_positions[14] = Position("rent",0);
        game_positions[15] = Position("rent",0);
        game_positions[16] = Position("reward",DOUBLE_X);
        game_positions[17] = Position("communitychest",0);
        game_positions[18] = Position("rent",0);
        game_positions[19] = Position("rent",0);

        //21 - 30 positions
        game_positions[20] = Position("reward",TRIPLE_X);
        game_positions[21] = Position("rent",0);
        game_positions[22] = Position("chance",0);
        game_positions[23] = Position("rent",0);
        game_positions[24] = Position("reward",SINGLE_X);
        game_positions[25] = Position("rent",0);
        game_positions[26] = Position("rent",0);
        game_positions[27] = Position("rent",0);
        game_positions[28] = Position("reward",DOUBLE_X);
        game_positions[29] = Position("rent",0);

        //31 - 40 positions        
        game_positions[30] = Position("reward",FOUR_X);
        game_positions[31] = Position("rent",0);
        game_positions[32] = Position("reward",SINGLE_X);
        game_positions[33] = Position("communitychest",0);
        game_positions[34] = Position("rent",0);
        game_positions[35] = Position("rent",0);
        game_positions[36] = Position("chance",0);
        game_positions[37] = Position("reward",DOUBLE_X);
        game_positions[38] = Position("tax",SINGLE_X);
        game_positions[39] = Position("rent",0);

        chanceArray[0]=Chance("reward",ONE_FOURTH,0);
        chanceArray[1]=Chance("reward",ONE_FOURTH,1);
        chanceArray[2]=Chance("reward",TWO_FOURTH,2);
        chanceArray[3]=Chance("reward",ONE_FOURTH,3);
        chanceArray[4]=Chance("reward",TWO_FOURTH,4);
        chanceArray[5]=Chance("reward",ONE_FOURTH,5);
        chanceArray[6]=Chance("reward",TWO_FOURTH,6);
        chanceArray[7]=Chance("reward",ONE_FOURTH,7);
        chanceArray[8]=Chance("reward",TWO_FOURTH,8);
        chanceArray[9]=Chance("reward",ONE_FOURTH,9);


        chestArray[0]=CommunityChest("reward",ONE_FOURTH,0);
        chestArray[1]=CommunityChest("reward",TWO_FOURTH,1);
        chestArray[2]=CommunityChest("reward",TWO_FOURTH,2);
        chestArray[3]=CommunityChest("reward",ONE_FOURTH,3);
        chestArray[4]=CommunityChest("reward",ONE_FOURTH,4);
        chestArray[5]=CommunityChest("reward",TWO_FOURTH,5);
        chestArray[6]=CommunityChest("reward",ONE_FOURTH,6);
        chestArray[7]=CommunityChest("reward",TWO_FOURTH,7);
        chestArray[8]=CommunityChest("reward",TWO_FOURTH,8);
        chestArray[9]=CommunityChest("reward",ONE_FOURTH,9);   

  

    }
    
	receive() external payable {
    }

    /**
     * Requests randomness
     */
    function playGame(address _referrer,uint _multiple_bet,uint _betAmount,uint _firstTime) public payable returns (bytes32 requestId)  {

        //check for different conditions
        _validateGame();
        // for multiple bet, check if the parameter passed is greter than the paid amount
        if (_multiple_bet ==1 && _betAmount >= msg.value) {revert();} 

        uint amount = msg.value;
        //referer should not be registered if player has played before
        if (amount > 0 && _referrer != address(0) && _referrer != msg.sender && address_requestid[msg.sender] == 0) {
            if(live_mode)Rewarder(rewarderAddress).recordReferral(msg.sender, _referrer);
        }        

        requestId = requestRandomness(keyHash, fee); 
        // mappings
        address_requestid[msg.sender] = requestId;
        requestid_address[requestId] = msg.sender;
        Game storage game = games[msg.sender];

        // starting the game, initialize the variables
        if(_firstTime==1){
            current_positions[msg.sender] = 0;
            address_events[msg.sender] = 0;
            game.taxTobePaid = 0;
        }
        require(game.taxTobePaid == 0, "Tax needs to be paid in order to proceed");
	    game.amount = amount;
        game.multiple_bet = 0 ;

        // when multiple bet is selected
        if(_multiple_bet ==1){
            game.amount = _betAmount;
            game.multiple_bet = msg.value;
            require(msg.value >= game.amount, "Amount should be greater or equal than bet amount for multiple bets!");
        }

        // Winning amount.
        uint possibleWinAmount = amount * MAXPROFIT_X; // this is the max profit possible

        betMap[requestId] = Bet(
            {
                placeBlockNumber: block.number,
                isSettled: false,
                amount: msg.value,
                gambler: payable(msg.sender),
                winAmount: possibleWinAmount
            }
        );        


        // Check whether contract has enough funds to accept this bet.
        if(live_mode)
            require(lockedInBets + possibleWinAmount <= address(this).balance, "Insufficient funds");  

        // Update lock funds.
        lockedInBets += possibleWinAmount;              

        //if game start, then initialize the chance and community chest arrays
        if(_firstTime==1){
            delete game.chances;
            delete game.cchest;

            for(uint i = 0; i < chanceArray.length; i++) {
                game.chances.push(Chance(chanceArray[i].chanceType,chanceArray[i].choice,chanceArray[i].order));
            }    

            for(uint i = 0; i < chestArray.length; i++) {
                game.cchest.push(CommunityChest(chestArray[i].ccType,chestArray[i].choice,chestArray[i].order));
            }   
        }

        emit requestIDGenerated(requestId,msg.sender);
        return requestId;
    }   
    function markBetSettled(bytes32 requestId) private{
        Bet storage bet = betMap[requestId];
	    require(bet.isSettled == false, "Bet is settled already");
        bet.isSettled = true;
    }  
    /**
     * Callback function used by VRF Coordinator
     */
    function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
        
        markBetSettled(requestId);
        address player = requestid_address[requestId];
        
	    // retrieve MAX_STEPS_POSSIBLE random numbers 
        uint256[] memory return_values = expand(randomness,MAX_STEPS_POSSIBLE); 
        uint possibleWinAmount = 0;
        uint iterator = 1;
        
        
        // if it is a multiple bet then the possible win amount should be calculated accordingly
        if(games[player].multiple_bet > 0)
            possibleWinAmount = games[player].multiple_bet * MAXPROFIT_X; // this is the max profit possible
        else
            possibleWinAmount = games[player].amount * MAXPROFIT_X; // this is the max profit possible

     
        //while loop start
        while(iterator > 0){
            // fetch the random number between 1 - 6
             uint random_number = (return_values[iterator - 1] % 6) + 1; 
             bytes32[] memory event_details  = new bytes32[](4);
             uint amount_to_pay= 0;
            
            // now we need to move the player's position
            current_positions[player] += random_number;
            if(current_positions[player] >= 40){
                //if this is above 40, then it means it needs to go around amd start from 0
                current_positions[player] = current_positions[player] - 40; 
                //user also receives a bonus if they start again
                payBonus(games[player].amount,player,requestId);
            }

            // now find what kind of property this is. 
            // based on it, decide what to do


            if(game_positions[current_positions[player]].positionType == "rent"){
                // if this is rent, then we need to pay the amount to the people who owns the property
                event_details[0]="rent";
                event_details[1]="";
                payTheRent(games[player].amount,current_positions[player],player);
                // send the tokens to the user
                addTokenReward(games[player].amount,player);
            }else if(game_positions[current_positions[player]].positionType == "reward"){
                // pay reward to the user
                amount_to_pay = payReward(games[player].amount,game_positions[current_positions[player]].choice,player,requestId,current_positions[player]);
                event_details[0]="reward";
                event_details[1]=bytes32(amount_to_pay);
            }else if(game_positions[current_positions[player]].positionType == "tax"){
                // ok the user needs to pay the tax, emit the event
                games[player].taxTobePaid = getTaxPaymentAmount(games[player].amount,game_positions[current_positions[player]].choice);
                address_events[player]++;
                event_details[0]="tax";
                event_details[1]=bytes32(games[player].taxTobePaid);   
                // send the tokens to the user
                addTokenReward(games[player].amount,player);
            }else if(game_positions[current_positions[player]].positionType == "chance"){
                
                // now we need to pick one from the list and then remove it from the list so that it does not appear again
                
                uint index = return_values[iterator - 1] % games[player].chances.length; // take a random pick from the stack
                if(index > games[player].chances.length) index = 0;
   
                event_details[0]="chance";
                event_details[1]="undefined";
                // now see what "Chance" was picked
                if(games[player].chances[index].chanceType == "reward"){
                    //pay the reward
                    amount_to_pay = payReward(games[player].amount,games[player].chances[index].choice,player,requestId,current_positions[player]);
                    event_details[0]="chance";
                    event_details[1]="reward";
                    event_details[2]=bytes32(amount_to_pay);                      
                    event_details[3]=bytes32(games[player].chances[index].order);     
                }else if(games[player].chances[index].chanceType == "tax"){
                    // ok the user needs to pay the tax, emit the event 
                    games[player].taxTobePaid = getTaxPaymentAmount(games[player].amount,games[player].chances[index].choice);
                    address_events[player]++;
                    event_details[0]="chance";
                    event_details[1]="tax";
                    event_details[2]=bytes32(games[player].taxTobePaid);    
                    event_details[3]=bytes32(games[player].chances[index].order);      
                    addTokenReward(games[player].amount,player);
                }

                // the code below will remove the selected element from the array // 
                games[player].chances[index] = games[player].chances[games[player].chances.length-1];
                games[player].chances.pop();
                // the code above will remove the selected element from the array // 
                if(games[player].chances.length == 0){
                    // if all chance cards have finished, load them again and fire an event
                    for(uint i = 0; i < chanceArray.length; i++) {
                        games[player].chances.push(Chance(chanceArray[i].chanceType,chanceArray[i].choice,chanceArray[i].order));
                    }    
                    // all chance cards needs to be refilled
                }
                

            }else if(game_positions[current_positions[player]].positionType == "communitychest"){
                // now we need to pick one from the list and then remove it from the list so that it does not appear again
                
                
                uint index = return_values[iterator - 1] % games[player].cchest.length; // take a random pick from the stack
                if(index > games[player].cchest.length) index = 0;
                event_details[0]="community";
                event_details[1]="undefined";
                
                // now see what "Community Chest" was picked
                if(games[player].cchest[index].ccType == "reward"){
                    //pay the reward
                    amount_to_pay = payReward(games[player].amount,games[player].cchest[index].choice,player,requestId,current_positions[player]);
                    event_details[0]="community";
                    event_details[1]="reward";
                    event_details[2]=bytes32(amount_to_pay);        
                    event_details[3]=bytes32(games[player].cchest[index].order); 

                }else if(games[player].cchest[index].ccType == "tax"){
                    // ok the user needs to pay the tax, emit the event
                    games[player].taxTobePaid = getTaxPaymentAmount(games[player].amount,games[player].cchest[index].choice);
                    address_events[player]++;
                    event_details[0]="community";
                    event_details[1]="tax";
                    event_details[2]=bytes32(games[player].taxTobePaid);  
                    event_details[3]=bytes32(games[player].cchest[index].order);  
                    addTokenReward(games[player].amount,player);
                }

                // the code below will remove the selected element from the array // 
                games[player].cchest[index] = games[player].cchest[games[player].cchest.length-1];
                games[player].cchest.pop();
                // the code above will remove the selected element from the array // 
                if(games[player].cchest.length == 0){
                    // if all community chance cards have finished, load them again and fire an event
                    for(uint i = 0; i < chestArray.length; i++) {
                        games[player].cchest.push(CommunityChest(chestArray[i].ccType,chestArray[i].choice,chestArray[i].order));
                    }  
                }
                

            }

            
            //emit this event

            // while loop ending conditions
            iterator++;
            // if it is a multiple bet, then reduce the amount
            if(games[player].multiple_bet > 0){
                
                if(games[player].taxTobePaid > 0){
                    // if there is pending tax to be paid, then reduce it from the amount in store
                    if(games[player].taxTobePaid > games[player].multiple_bet){
                        // if we do not have enough balance then stop the loop
                        //repay the balance and let the user know that tax wasn't used
                        games[player].taxTobePaid = games[player].taxTobePaid - games[player].multiple_bet;                       
                        emit taxPaidPartial(requestId,games[player].taxTobePaid,player);
                        games[player].multiple_bet = 0;
                        iterator = 0;                         
                    }else{
                        // user has enough balance, then reduce it from user.
                        games[player].multiple_bet = games[player].multiple_bet - games[player].taxTobePaid;
                        games[player].taxTobePaid = 0;
                        address_events[player]++;
                    }
                }
                if(games[player].multiple_bet >= games[player].amount)games[player].multiple_bet = games[player].multiple_bet - games[player].amount;
                if(games[player].multiple_bet < games[player].amount){
                    //repay the balance to the user
                    iterator = 0;
                    if(games[player].multiple_bet > 0){
                        emit balanceMultipleBetPaid(requestId,games[player].multiple_bet,player);
                        player.call{value: games[player].multiple_bet}("");
                    }
                    games[player].multiple_bet = 0;

                }              
            }
            address_events[player]++;
            emit PositionChanged(requestId, random_number, current_positions[player],player,address_events[player],event_details,games[player].taxTobePaid,block.timestamp);
            if(games[player].multiple_bet == 0)iterator = 0; // if it is not a multiple bet
            if(iterator > MAX_STEPS_POSSIBLE)iterator = 0;// MAX_STEPS_POSSIBLE random numbers picked
        }
        // while loop end
        // Unlock possibleWinAmount from lockedInBets, regardless of the outcome.
        lockedInBets -= possibleWinAmount;
        
    }

   
    function addTokenReward(uint amount,address player) private {
        uint newTokens = amount * tokenRatio;
        // only do this if it is live mode
        if(live_mode)Rewarder(rewarderAddress).addReward(player, newTokens);
    }

    function payTax() public payable  {

        //check for different conditions
        if (msg.value > msg.sender.balance) {revert();}

        bytes32 requestId = address_requestid[msg.sender];
        require(requestId > 0 , "RequestID is 0");

        Game storage game = games[msg.sender];
        require(msg.value == game.taxTobePaid, "Please pay the applicable tax!");
        require(game.taxTobePaid > 0, "No Tax to be paid!");
        uint event_no = address_events[msg.sender];
        event_no++;
        emit taxPaidSucess(requestId,game.taxTobePaid, msg.sender,event_no);
        game.taxTobePaid = 0;
        address_events[msg.sender] = event_no;
    }

    function payTheRent(uint amount,uint current_position,address player) private  {
        uint256 nftCharges = getNFTCharges(amount);
        uint amountToPay = 0;// 
        if(nftCharges < amount)
            amountToPay = amount - nftCharges;
        else 
            amountToPay = 0;

        address nft_owner = 0xB1c71C6c9AB9748f24720c8A8aaeF3Aee4460698; //temp address
        address _contractOwner = owner();
        //find the owner of the NFT
        if(live_mode)
        {
            nft_owner = NFTToken(nftaddress).ownerOf(current_position);//change this and make this live
            // check if the NFTS are owned by the owner of the contract. If yes, rent need not be paid.
            if(nft_owner != _contractOwner){
                nft_payments_list[nft_owner] = nft_payments_list[nft_owner] + amountToPay;            
                totalAmountToBePaid += amountToPay;
                emit rentPaid(nft_owner,amountToPay,player);
            }else{
                emit rentPaid(nft_owner,0,player);
            }        
        }
        
    }

    function getTaxPaymentAmount(uint amount,int text) private pure returns(uint)  {
        uint taxAmount = 0;
        if(text == SINGLE_X){
            taxAmount = amount;// 1x
        }else if(text == DOUBLE_X){
            taxAmount = amount * 2;// 1x
        }else if(text == TRIPLE_X){
            taxAmount = amount * 3;// 1x
        }
        return taxAmount;
    }

    function payReward(uint amount,int text,address player,bytes32 requestId,uint _current_position) private returns(uint)  {
        uint position_amount = 0;
        uint amountToPay = 0;
        uint256 houseEdge = getHouseEdge(amount);
        if(text == SINGLE_X){
            amountToPay = amount;// 1x
        }
        else if(text == DOUBLE_X || text == TRIPLE_X || text == FOUR_X){
            position_amount = uint256(text);
            amountToPay = amount * position_amount;// 2x, 3x, 4x
        }else if(text == ONEANDHALF_X){
            amountToPay = amount + (amount / 100)* 50;// 1.5
        }
        else if(text == ONE_FOURTH){
            amountToPay = (amount / 100)* 25;// .25
        }else if(text == TWO_FOURTH){
            amountToPay = (amount / 100)* 50;// .5
        }else if(text == THREE_FOURTH){
            amountToPay = (amount / 100)* 75;// .75
        }
        if(houseEdge < amountToPay)
            amountToPay = amountToPay - houseEdge;
        else 
            amountToPay = 0;
        player.call{value: amountToPay}("");
        emit RewardWon(requestId, amountToPay,player,_current_position);
        return amountToPay;
    }

    // this is called when the player finishes a round
    function payBonus(uint amount,address player,bytes32 requestId)  private{
        uint amountToPay = 0;
        uint256 houseEdge = getHouseEdge(amount);
        amountToPay = amount * BONUS_X;
        if(houseEdge < amountToPay)
            amountToPay = amountToPay - houseEdge;
        else 
            amountToPay = 0;
        player.call{value: amountToPay}("");
        emit BonusWon(requestId, amountToPay,player);
    }


    function _validateGame() private {
        require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK - fill contract with faucet");
        require(msg.value >= MIN_BET, "Need an amount greater than minimum bet amount");
        require(msg.value <= (MAX_BET*10), "Bet amount should not be greater than the MAX bet amount");
        require(gameStatus == GAMESTAT.RUNNING,"Game is presently paused!");
    }
    

    function getHouseEdge(uint256 amount) private view returns (uint256){
        uint houseEdge = amount * HOUSE_EDGE_PERCENT / 100;

        if (houseEdge < HOUSE_EDGE_MINIMUM_AMOUNT) {
            houseEdge = HOUSE_EDGE_MINIMUM_AMOUNT;
        }
        return houseEdge;
    }
    function getNFTCharges(uint256 amount) private view returns (uint256){
        uint nftCharges = amount * NFT_PERCENT / 100;

        if (nftCharges < NFT_MINIMUM_AMOUNT) {
            nftCharges = NFT_MINIMUM_AMOUNT;
        }
        return nftCharges;
    }    
    function expand(uint256 randomValue, uint256 n) private pure returns (uint256[] memory expandedValues) {
        expandedValues = new uint256[](n);
        for (uint256 i = 0; i < n; i++) {
            expandedValues[i] = uint256(keccak256(abi.encode(randomValue, i)));
        }
        return expandedValues;
    }

    function withdraw() public nonReentrant{
        require(nft_payments_list[msg.sender] != 0, "No funds to withdraw");
		uint amount = nft_payments_list[msg.sender];
		uint256 balanceContract = address(this).balance;
		if(balanceContract < amount){
		    emit notEnoughBalance(balanceContract,msg.sender);
		}else{
    		nft_payments_list[msg.sender] = 0;
    		totalAmountToBePaid -= amount;
    		(bool success, ) = msg.sender.call{value: amount}("");
            require(success, "Transfer failed.");
		}
	}
    function getMyBalance() public view returns (uint256,uint256)  {
        uint256 _balance = nft_payments_list[msg.sender];
        uint256 balanceContract = address(this).balance;
		return (_balance,balanceContract);
	}
    function getPendingTax() public view returns (uint256)  {
        Game memory game = games[msg.sender];
		return (game.taxTobePaid);
	}

    


    // Return the bet in the very unlikely scenario it was not settled by Chainlink VRF. 
    // In case you find yourself in a situation like this, just contact support.
    // However, nothing precludes you from calling this method yourself.
    function refundBet(bytes32 requestId) external nonReentrant {
        
        Bet storage bet = betMap[requestId];
        uint amount = bet.amount;

        // Validation checks
        require(amount > 0, "Bet does not exist");
        require(bet.isSettled == false, "Bet is settled already");
        require(block.number > bet.placeBlockNumber + 21600, "Wait before requesting refund");

        uint possibleWinAmount = bet.winAmount;

        // Unlock possibleWinAmount from lockedInBets, regardless of the outcome.
        lockedInBets -= possibleWinAmount;

        // Update bet records
        bet.isSettled = true;

        // Send the refund.
        bet.gambler.transfer(amount);

        // Record refund in event logs
        emit BetRefunded(requestId, bet.gambler, amount);
    }    

    // below are admin functions 
	function withdrawAmount(uint256 amount) public onlyOwner {
        address _contractOwner = owner();
		payable(_contractOwner).transfer(amount);
	}

	function transferToRewarder(uint256 amount) public onlyOwner {
		payable(rewarderAddress).transfer(amount);
	}
	function getTotalAmountOwed() public view onlyOwner returns(uint256)  {
		return totalAmountToBePaid;
	}


    function withdrawForUser(address addr)  public onlyOwner {
        require(nft_payments_list[addr] != 0, "No funds to withdraw");
		uint amount = nft_payments_list[addr];
		uint256 balanceContract = address(this).balance;
		if(balanceContract < amount){
		    emit notEnoughBalance(balanceContract,msg.sender);
		}else{
    		nft_payments_list[addr] = 0;
    		totalAmountToBePaid -= amount;
    		(bool success, ) = addr.call{value: amount}("");
            require(success, "Transfer failed.");
		}
	}
	// withdrawLink allows the owner to withdraw any extra LINK on the contract
    function withdrawLink() public onlyOwner 
    {
        require(LINK.transfer(msg.sender, LINK.balanceOf(address(this))), "Unable to transfer");
    }
    
    function getLinkBalance() public view onlyOwner  returns (uint256)  {
        //LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress());
        return LINK.balanceOf(address(this));
    }
    function pauseGame() public onlyOwner  {
        gameStatus = GAMESTAT.PAUSED;
    }
    
    function restartGame() public onlyOwner  {
        gameStatus = GAMESTAT.RUNNING;
    }

    function changeMinBet(uint256 _minBet) public onlyOwner  {
        MIN_BET = _minBet;
    }

    function changeMaxBet(uint256 _maxBet) public onlyOwner  {
        MAX_BET = _maxBet;
    }

    function changeChainLinkKeyHash(bytes32 _keyHash) public onlyOwner  {
        keyHash = _keyHash;
    }

    function changeChainLinkFeee(uint256 _fee) public onlyOwner  {
        fee = _fee;
    }

    function changeNFTAddress(address _nftaddress) public onlyOwner  {
        nftaddress = _nftaddress;
    }
    function changeRewarderAddress(address _rewarderAddress) public onlyOwner  {
        rewarderAddress = _rewarderAddress;
    }

    function changeHouseEdge(uint256 _houseEdge) public onlyOwner  {
        HOUSE_EDGE_PERCENT = _houseEdge;
    }

    function changeNftPercent(uint256 _nftpercent) public onlyOwner  {
        NFT_PERCENT = _nftpercent;
    }

    function changeMaxStepsPossible(uint256 _maxStepsPossible) public onlyOwner  {
        MAX_STEPS_POSSIBLE = _maxStepsPossible;
    }

    function changeBonus(uint256 _bonus) public onlyOwner  {
        BONUS_X = _bonus;
    }

    function changeTokenRatio(uint256 _tokenRatio) public onlyOwner  {
        tokenRatio = _tokenRatio;
    }

    function changeHouseEdgeMinimum(uint256 _houseEdgeMinimum) public onlyOwner  {
        HOUSE_EDGE_MINIMUM_AMOUNT = _houseEdgeMinimum;
    }
    function changeNFTMinimum(uint256 _nftMinimum) public onlyOwner  {
        NFT_MINIMUM_AMOUNT = _nftMinimum;
    }    
    function changeGamePositionArray(uint256 _index,bytes32 _positionType,int _choice) public onlyOwner  {
        game_positions[_index] = Position(_positionType,_choice);
    }    
    
    function changeChanceArray(uint256 _index,bytes32 _chanceType,int _choice,uint _order) public onlyOwner  {
	    chanceArray[_index]=Chance(_chanceType,_choice,_order);
    }    


    function changeCCArray(uint256 _index,bytes32 _ccType,int _choice,uint _order) public onlyOwner  {
	    chestArray[_index]=CommunityChest(_ccType,_choice,_order);
    }   


}
interface NFTToken {
    function ownerOf(uint) external view returns (address);
}
interface Rewarder {
    function addReward(address, uint) external;
    function recordReferral(address, address) external;
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"gambler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BetRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amountWon","type":"uint256"},{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"BonusWon","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"random_number","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current_position","type":"uint256"},{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"event_no","type":"uint256"},{"indexed":false,"internalType":"bytes32[]","name":"event_details","type":"bytes32[]"},{"indexed":false,"internalType":"uint256","name":"pending_tax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time_stamp","type":"uint256"}],"name":"PositionChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amountWon","type":"uint256"},{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_current_position","type":"uint256"}],"name":"RewardWon","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"},{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"balanceMultipleBetPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"first","type":"uint256"},{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"notEnoughBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_receiver_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"},{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"rentPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"requestIDGenerated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"taxTobePaid","type":"uint256"},{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"taxPaidPartial","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"},{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"event_no","type":"uint256"}],"name":"taxPaidSucess","type":"event"},{"inputs":[{"internalType":"uint256","name":"_bonus","type":"uint256"}],"name":"changeBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"bytes32","name":"_ccType","type":"bytes32"},{"internalType":"int256","name":"_choice","type":"int256"},{"internalType":"uint256","name":"_order","type":"uint256"}],"name":"changeCCArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"changeChainLinkFeee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_keyHash","type":"bytes32"}],"name":"changeChainLinkKeyHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"bytes32","name":"_chanceType","type":"bytes32"},{"internalType":"int256","name":"_choice","type":"int256"},{"internalType":"uint256","name":"_order","type":"uint256"}],"name":"changeChanceArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"bytes32","name":"_positionType","type":"bytes32"},{"internalType":"int256","name":"_choice","type":"int256"}],"name":"changeGamePositionArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_houseEdge","type":"uint256"}],"name":"changeHouseEdge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_houseEdgeMinimum","type":"uint256"}],"name":"changeHouseEdgeMinimum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBet","type":"uint256"}],"name":"changeMaxBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxStepsPossible","type":"uint256"}],"name":"changeMaxStepsPossible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBet","type":"uint256"}],"name":"changeMinBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftaddress","type":"address"}],"name":"changeNFTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftMinimum","type":"uint256"}],"name":"changeNFTMinimum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftpercent","type":"uint256"}],"name":"changeNftPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewarderAddress","type":"address"}],"name":"changeRewarderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenRatio","type":"uint256"}],"name":"changeTokenRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLinkBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMyBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalAmountOwed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"payTax","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"uint256","name":"_multiple_bet","type":"uint256"},{"internalType":"uint256","name":"_betAmount","type":"uint256"},{"internalType":"uint256","name":"_firstTime","type":"uint256"}],"name":"playGame","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"refundBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restartGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferToRewarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"withdrawForUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405260016008556003600955600a600c556003600d55600a600f553480156200002a57600080fd5b507f8c7382f9d8f56b33781fe506e897a4f1e2d1725500000000000000000000000060a0527f326c977e6efc84e512bb9c30f76e30c160ed06fb0000000000000000000000006080526200007e33620000fb565b6001600255671bc16d674ec8000060065568056bc75e2d6310000060075566b1a2bc2ec50000600e5567016345785d8a00006010557f6e75b569a01ef56d18cab6a8e71e6600d6ce853834d4a5748b720d06f878b3a4600355655af3107a40006004556055805460ff19169055620000f56200014d565b62001729565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a80546001600160a01b0319167394bb84145e9fbf238246cc374a1299c0ae4d77d2178155604080518082018252641cdd185c9d60da1b815260006020808301828152828052601880835293517f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd755517f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd85583518085018552631c995b9d60e21b808252818301848152600180865286855292517ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4d55517ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4e55855180870187526d18dbdb5b5d5b9a5d1e58da195cdd60921b808252818501868152600280885288875292517f2bacf7cca723d030d12aee795132f2c5f2d14ad131f16f3f27eeba3e79d18b8c55517f2bacf7cca723d030d12aee795132f2c5f2d14ad131f16f3f27eeba3e79d18b8d5587518089018952620e8c2f60eb1b8082528187018681526003808a528a895292517f7a6340a7048c03c55288da75abed74d2ce9194201bafb03be53c0a7cca59149555517f7a6340a7048c03c55288da75abed74d2ce9194201bafb03be53c0a7cca591496558951808b018b52651c995dd85c9960d21b8082528189018681526004808c528c8b5292517f5b650d93b25a5c652bc6f9215f522b521daf6d36977dcec1343c2a8310b869d655517f5b650d93b25a5c652bc6f9215f522b521daf6d36977dcec1343c2a8310b869d7558b51808d018d52878152808a018b815260058c528c8b5290517f2288853b49db4f36075bf4a8cfdae4e5e3b39b7b03937d0a9148b051a6f64c5c55517f2288853b49db4f36075bf4a8cfdae4e5e3b39b7b03937d0a9148b051a6f64c5d558b51808d018d52878152808a018b815260068c528c8b5290517f33d69b83f8d9644c8360a50d7275bf12a50019a4cd4e17926d0b315da648c58d55517f33d69b83f8d9644c8360a50d7275bf12a50019a4cd4e17926d0b315da648c58e558b51808d018d52656368616e636560d01b808252818b018c815260078d528d8c5291517f0aaa0ccf1df0cbc345d3ab7229415a03568bb157ac6e99a99e7acfb410c400f55590517f0aaa0ccf1df0cbc345d3ab7229415a03568bb157ac6e99a99e7acfb410c400f6558c51808e018e52828152808b018a815260088d528d8c5290517fd216758a0109d96b1547bf0494303db8f870cdf26fb578fa6df610e0d82abc5a55517fd216758a0109d96b1547bf0494303db8f870cdf26fb578fa6df610e0d82abc5b558c51808e018e52888152808b018c81526009808e528e8d5291517f0f80ca4e91d4e32d5a64ddd95a11ac123155f01483fcd9878a3704cd57c880b555517f0f80ca4e91d4e32d5a64ddd95a11ac123155f01483fcd9878a3704cd57c880b6558d51808f018f52838152808c018981529f8d528d8c52517f97bd3d4217cc234631fd1bc3bbc8dcdba6dbc663edbe04a3d8e3d1afc6fbf207559d517f97bd3d4217cc234631fd1bc3bbc8dcdba6dbc663edbe04a3d8e3d1afc6fbf208558c51808e018e52888152808b018c8152600b8d528d8c5290517f708fe867eed89ed512a42b707e8d76b3f0636bc9091ed7bd1accea46f030a75955517f708fe867eed89ed512a42b707e8d76b3f0636bc9091ed7bd1accea46f030a75a558c51808e018e52828152808b019e8f52600c8c528c8b52517f0d0ebdbcfcc074ed98d6e77259dcf308299e0fc425bbd9eb22ee4e1d6024eebd559c517f0d0ebdbcfcc074ed98d6e77259dcf308299e0fc425bbd9eb22ee4e1d6024eebe558b51808d018d52878152808a018b8152600d8c528c8b5290517f9f54e10f2b34037c7b3dbc8b147ae978b2f5629a4965b815941ce1b59e8e3e8055517f9f54e10f2b34037c7b3dbc8b147ae978b2f5629a4965b815941ce1b59e8e3e81558b51808d018d52878152808a018b8152600e8c528c8b5290517feba5a561184a3ad28e26279c1e0509594a1144734b254549c6df63e2ac46dffa55517feba5a561184a3ad28e26279c1e0509594a1144734b254549c6df63e2ac46dffb558b51808d018d52878152808a018b8152600f8c528c8b5290517f0c2f1a7617834a7162b7580bfe95f6e3f7a6370e6a0ecd1500d6f186d7e07f4f55517f0c2f1a7617834a7162b7580bfe95f6e3f7a6370e6a0ecd1500d6f186d7e07f50558b51808d018d52818152808a0187815260108c528c8b5290517f40e11fb237babf359ad528499083b89a823331f0e666f4e65c66bcda714ba70855517f40e11fb237babf359ad528499083b89a823331f0e666f4e65c66bcda714ba709558b51808d018d52858152808a018b815260118c528c8b5290517f64d41bdb2ca9f4fa8e2762bef85267f0d90ccef534fa1a02e77c849957957a8c55517f64d41bdb2ca9f4fa8e2762bef85267f0d90ccef534fa1a02e77c849957957a8d558b51808d018d52878152808a018b815260128c528c8b5290517f7a4af925afecb059c2843c626e2447607d353a8af79743cda1ecb04891ab3fbe55517f7a4af925afecb059c2843c626e2447607d353a8af79743cda1ecb04891ab3fbf558b51808d018d52878152808a018b815260138c528c8b5290517fa662e6e83040f60a65ced71c22404e8127a66cb1a807be991e0406edace3c4aa55517fa662e6e83040f60a65ced71c22404e8127a66cb1a807be991e0406edace3c4ab558b51808d018d52818152808a0185815260148c528c8b5290517f64513dc24b777328b4a215781564150ff8ac199c8c7b7df7cb4afd85345c690e55517f64513dc24b777328b4a215781564150ff8ac199c8c7b7df7cb4afd85345c690f558b51808d018d52878152808a018b815260158c528c8b5290517fa6854583ffd97071f3ac22440174c6a4b5fe9f76b68a7795df7d0c732b38d48555517fa6854583ffd97071f3ac22440174c6a4b5fe9f76b68a7795df7d0c732b38d486558b51808d018d528d8152808a018b815260168c528c8b5290517f633c2d9f6ed3de97d498c3195c70db4b9b727c5bdae7ca054e2b5f879711517e55517f633c2d9f6ed3de97d498c3195c70db4b9b727c5bdae7ca054e2b5f879711517f558b51808d018d52878152808a018b815260178c528c8b5290517f9a42d7147904c13aa9da4b938924233fdd240592bad3fe86ca38ed831cb38e9155517f9a42d7147904c13aa9da4b938924233fdd240592bad3fe86ca38ed831cb38e92558b51808d018d52818152808a018981528c8c528c8b5290517fe909da5a13c52b40487f6e59951b40a5aec0d22c4cb63350ef95f48e29c05aad55517fe909da5a13c52b40487f6e59951b40a5aec0d22c4cb63350ef95f48e29c05aae558b51808d018d52878152808a018b815260198c528c8b5290517f017eee4fc6847fd99a7a3d4ce90c4ee375111a287064aad2d446e06a14ee940c55517f017eee4fc6847fd99a7a3d4ce90c4ee375111a287064aad2d446e06a14ee940d558b51808d018d52878152808a018b8152601a8c528c8b5290517f0739d9969bc47fdacde70a1c714fe934785a438668e4e56234e27ff945bf0dbd55517f0739d9969bc47fdacde70a1c714fe934785a438668e4e56234e27ff945bf0dbe558b51808d018d52878152808a018b8152601b8c528c8b5290517fc48ec664273fd18a09aa425f8d67c83aeff4ed71afedb2c3a5d4f516e931fc6355517fc48ec664273fd18a09aa425f8d67c83aeff4ed71afedb2c3a5d4f516e931fc64558b51808d018d52818152808a01878152601c8c528c8b5290517f523317c7f28d4bcb967f55d0e69b53d3f8d08c297aa50b35f12483cfb17a723655517f523317c7f28d4bcb967f55d0e69b53d3f8d08c297aa50b35f12483cfb17a7237558b51808d018d52878152808a018b8152601d8c528c8b5290517f82f3726761d77db1f20e348093787f279414782620c9b9800a19df39eebb8a4955517f82f3726761d77db1f20e348093787f279414782620c9b9800a19df39eebb8a4a558b51808d018d52818152808a01838152601e8c528c8b5290517f69d8eb67798bec4b507f7f3fa7b553187938142c5efc56292d573f1ce017d7e555517f69d8eb67798bec4b507f7f3fa7b553187938142c5efc56292d573f1ce017d7e6558b51808d018d52878152808a018b8152601f8c528c8b5290517f7cc7a22fb0960311578a8fabd87141ea55fcab56ba7cc59d9ee0c3d8f9cf21f655517f7cc7a22fb0960311578a8fabd87141ea55fcab56ba7cc59d9ee0c3d8f9cf21f7558b51808d018d52818152808a018981528a8c528c8b5290517f026d063f45d9e73f24a90919d0af008e7c376a6e5273e39ebd598dc55dca66fb55517f026d063f45d9e73f24a90919d0af008e7c376a6e5273e39ebd598dc55dca66fc558b51808d018d529485528489018a815260218b528b8a5294517f8018f4056a557334b30667ba1616cba36b65fbff0da517c2d7b0e70eb2930a9f5593517f8018f4056a557334b30667ba1616cba36b65fbff0da517c2d7b0e70eb2930aa0558a51808c018c528681528089018a815260228b528b8a5290517faab0bbd6880e7bac0549e8805cefa5c5b9ae280a02edf57a9b28beff7adcca1e55517faab0bbd6880e7bac0549e8805cefa5c5b9ae280a02edf57a9b28beff7adcca1f558a51808c018c528681528089018a815260238b528b8a5290517f05fd68bbca2caae6c9bfcc242a5a1410a7ce5ba52404f93aaf0b4578346e449055517f05fd68bbca2caae6c9bfcc242a5a1410a7ce5ba52404f93aaf0b4578346e4491558a51808c018c529b8c528b880189815260248a528a89529b517f88930753d24c7ac995fc00031ff7f598a0a121fc78613f53dab4acd8c1250755559a517f88930753d24c7ac995fc00031ff7f598a0a121fc78613f53dab4acd8c1250756558951808b018b5283815280880185815260258a528a895290517fbd5881717d364c9ed36bebee6e54a68463113b4cdc321b0a71b9e63ff29a967355517fbd5881717d364c9ed36bebee6e54a68463113b4cdc321b0a71b9e63ff29a9674558951808b018b529081528087018681526026895289885290517f7523c87c2851df77992737a047c1de47d72fbc2ed94114a9b57f1a702c3bd0ec55517f7523c87c2851df77992737a047c1de47d72fbc2ed94114a9b57f1a702c3bd0ed558851808a018a529384528386018781526027885297865292517fee612f87d4527f3c94438448ae7dc2b7e2b04366946a6f1646f016440f0c2c5d5595517fee612f87d4527f3c94438448ae7dc2b7e2b04366946a6f1646f016440f0c2c5e558651606080820189528782526000198287018190529189018790526037888155603883905560399790975588518082018a528881528087018390528901859052603a889055603b829055603c9490945587518085018952878152600119818701819052908901839052603d889055603e819055603f92909255875180850189528781528086018290528801839052868855604155604291909155855191820186529381529081019290925291810183905291600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600581525060376005600a811062001182576200118262001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600681525060376006600a8110620011e557620011e562001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600781525060376007600a811062001248576200124862001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600881525060376008600a8110620012ab57620012ab62001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600981525060376009600a81106200130e576200130e62001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600081525060196000600a811062001371576200137162001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600181525060196001600a8110620013d457620013d462001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600281525060196002600a811062001437576200143762001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600381525060196003600a81106200149a576200149a62001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600481525060196004600a8110620014fd57620014fd62001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600581525060196005600a811062001560576200156062001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600681525060196006600a8110620015c357620015c362001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600781525060196007600a811062001626576200162662001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600881525060196008600a811062001689576200168962001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600981525060196009600a8110620016ec57620016ec62001713565b60030201600082015181600001556020820151816001015560408201518160020155905050565b634e487b7160e01b600052603260045260246000fd5b60805160601c60a05160601c613e5062001771600039600081816112220152613468015260008181610c28015281816110cc0152818161320701526134390152613e506000f3fe6080604052600436106101fd5760003560e01c80637e1fe3d51161010d578063b264c6d3116100a0578063df3e1d831161006f578063df3e1d831461055c578063e2ca1df91461057c578063e8147a251461059c578063e8244d48146105bc578063f2fde38b146105dc57600080fd5b8063b264c6d3146104e9578063c1ff808d146104fc578063d7e5ea811461051c578063df320b291461053c57600080fd5b806394985ddd116100dc57806394985ddd146104695780639f1733b714610489578063a1a60557146104a9578063ae47a290146104c957600080fd5b80637e1fe3d5146104025780638d25af04146104175780638da5cb5b1461042c5780638dc654a21461045457600080fd5b8063492b7a1d1161019057806350c5f9751161015f57806350c5f975146103785780636f8fe3581461038d578063715018a6146103ad57806376552b34146103c25780637c7c563c146103e257600080fd5b8063492b7a1d146102f0578063495d040b14610310578063499831f2146103305780634c7389091461034557600080fd5b8063340a76ef116101cc578063340a76ef1461027b5780633ccfd60b1461029b5780633f31ec43146102b0578063415e4e32146102d057600080fd5b80630562b9f7146102095780630a9678c51461022b5780631e6e46ec1461024b5780632912ba5f1461027357600080fd5b3661020457005b600080fd5b34801561021557600080fd5b50610229610224366004613b37565b6105fc565b005b34801561023757600080fd5b50610229610246366004613bb7565b610681565b34801561025757600080fd5b50610260610704565b6040519081526020015b60405180910390f35b610229610738565b34801561028757600080fd5b50610229610296366004613abd565b6108ba565b3480156102a757600080fd5b50610229610906565b3480156102bc57600080fd5b506102296102cb366004613b37565b610ac1565b3480156102dc57600080fd5b506102296102eb366004613b37565b610af0565b3480156102fc57600080fd5b5061022961030b366004613b8b565b610b1f565b34801561031c57600080fd5b5061022961032b366004613b37565b610b77565b34801561033c57600080fd5b50610229610ba6565b34801561035157600080fd5b5033600090815260566020526040902054476040805192835260208301919091520161026a565b34801561038457600080fd5b50610260610be6565b34801561039957600080fd5b506102296103a8366004613b37565b610caf565b3480156103b957600080fd5b50610229610cde565b3480156103ce57600080fd5b506102296103dd366004613abd565b610d14565b3480156103ee57600080fd5b506102296103fd366004613bb7565b610ec2565b34801561040e57600080fd5b50610260610f1a565b34801561042357600080fd5b5061022961104f565b34801561043857600080fd5b506001546040516001600160a01b03909116815260200161026a565b34801561046057600080fd5b5061022961108d565b34801561047557600080fd5b50610229610484366004613b50565b611217565b34801561049557600080fd5b506102296104a4366004613b37565b61129d565b3480156104b557600080fd5b506102296104c4366004613b37565b6112cc565b3480156104d557600080fd5b506102296104e4366004613b37565b6112fb565b6102606104f7366004613ada565b61132a565b34801561050857600080fd5b50610229610517366004613b37565b611799565b34801561052857600080fd5b50610229610537366004613abd565b6117c8565b34801561054857600080fd5b50610229610557366004613b37565b611814565b34801561056857600080fd5b50610229610577366004613b37565b611a26565b34801561058857600080fd5b50610229610597366004613b37565b611a8a565b3480156105a857600080fd5b506102296105b7366004613b37565b611ab9565b3480156105c857600080fd5b506102296105d7366004613b37565b611ae8565b3480156105e857600080fd5b506102296105f7366004613abd565b611b17565b6001546001600160a01b0316331461062f5760405162461bcd60e51b815260040161062690613c55565b60405180910390fd5b60006106436001546001600160a01b031690565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f1935050505015801561067c573d6000803e3d6000fd5b505050565b6001546001600160a01b031633146106ab5760405162461bcd60e51b815260040161062690613c55565b604051806060016040528084815260200183815260200182815250601985600a81106106d9576106d9613dd9565b6003020160008201518160000155602082015181600101556040820151816002015590505050505050565b6001546000906001600160a01b031633146107315760405162461bcd60e51b815260040161062690613c55565b5060055490565b333134111561074657600080fd5b33600090815260166020526040902054806107945760405162461bcd60e51b815260206004820152600e60248201526d052657175657374494420697320360941b6044820152606401610626565b336000908152601360205260409020600181015434146107f65760405162461bcd60e51b815260206004820152601e60248201527f506c656173652070617920746865206170706c696361626c65207461782100006044820152606401610626565b600081600101541161083f5760405162461bcd60e51b81526020600482015260126024820152714e6f2054617820746f20626520706169642160701b6044820152606401610626565b336000908152601560205260409020548061085981613d52565b6001840154604080519182526020820183905291935033925085917fd753503979ce3ae2784b2a43a645381451297880876d0b606e3cd72a6883e3fe910160405180910390a360006001909201829055338252601560205260409091205550565b6001546001600160a01b031633146108e45760405162461bcd60e51b815260040161062690613c55565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6002805414156109585760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610626565b60028055336000908152605660205260409020546109af5760405162461bcd60e51b81526020600482015260146024820152734e6f2066756e647320746f20776974686472617760601b6044820152606401610626565b336000908152605660205260409020544781811015610a025760405181815233907fca3ea7915e3d582b1e17b3a09ecca224a5cab7fdd251a4f78313c71f0ccfec959060200160405180910390a2610ab8565b33600090815260566020526040812081905560058054849290610a26908490613d3b565b9091555050604051600090339084908381818185875af1925050503d8060008114610a6d576040519150601f19603f3d011682016040523d82523d6000602084013e610a72565b606091505b5050905080610ab65760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610626565b505b50506001600255565b6001546001600160a01b03163314610aeb5760405162461bcd60e51b815260040161062690613c55565b600355565b6001546001600160a01b03163314610b1a5760405162461bcd60e51b815260040161062690613c55565b600c55565b6001546001600160a01b03163314610b495760405162461bcd60e51b815260040161062690613c55565b6040805180820182529283526020808401928352600094855260189052909220905181559051600190910155565b6001546001600160a01b03163314610ba15760405162461bcd60e51b815260040161062690613c55565b600e55565b6001546001600160a01b03163314610bd05760405162461bcd60e51b815260040161062690613c55565b605580546001919060ff191682805b0217905550565b6001546000906001600160a01b03163314610c135760405162461bcd60e51b815260040161062690613c55565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610c7257600080fd5b505afa158015610c86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610caa9190613b72565b905090565b6001546001600160a01b03163314610cd95760405162461bcd60e51b815260040161062690613c55565b600455565b6001546001600160a01b03163314610d085760405162461bcd60e51b815260040161062690613c55565b610d126000611bb2565b565b6001546001600160a01b03163314610d3e5760405162461bcd60e51b815260040161062690613c55565b6001600160a01b038116600090815260566020526040902054610d9a5760405162461bcd60e51b81526020600482015260146024820152734e6f2066756e647320746f20776974686472617760601b6044820152606401610626565b6001600160a01b0381166000908152605660205260409020544781811015610df65760405181815233907fca3ea7915e3d582b1e17b3a09ecca224a5cab7fdd251a4f78313c71f0ccfec959060200160405180910390a2505050565b6001600160a01b038316600090815260566020526040812081905560058054849290610e23908490613d3b565b90915550506040516000906001600160a01b0385169084908381818185875af1925050503d8060008114610e73576040519150601f19603f3d011682016040523d82523d6000602084013e610e78565b606091505b5050905080610ebc5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610626565b50505050565b6001546001600160a01b03163314610eec5760405162461bcd60e51b815260040161062690613c55565b604051806060016040528084815260200183815260200182815250603785600a81106106d9576106d9613dd9565b336000908152601360209081526040808320815160a0810183528154815260018201548185015260028201548184015260038201805484518187028101870190955280855286959294606086019390929190879084015b82821015610fc15783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190610f71565b50505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561103e5783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190610fee565b505050915250506020015192915050565b6001546001600160a01b031633146110795760405162461bcd60e51b815260040161062690613c55565b605580546000919060ff1916600183610bdf565b6001546001600160a01b031633146110b75760405162461bcd60e51b815260040161062690613c55565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90339083906370a082319060240160206040518083038186803b15801561112057600080fd5b505afa158015611134573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111589190613b72565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561119e57600080fd5b505af11580156111b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d69190613b15565b610d125760405162461bcd60e51b81526020600482015260126024820152712ab730b13632903a37903a3930b739b332b960711b6044820152606401610626565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461128f5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c006044820152606401610626565b6112998282611c04565b5050565b6001546001600160a01b031633146112c75760405162461bcd60e51b815260040161062690613c55565b601055565b6001546001600160a01b031633146112f65760405162461bcd60e51b815260040161062690613c55565b600955565b6001546001600160a01b031633146113255760405162461bcd60e51b815260040161062690613c55565b600755565b60006113346131e3565b8360011480156113445750348310155b1561134e57600080fd5b34801580159061136657506001600160a01b03861615155b801561137b57506001600160a01b0386163314155b8015611394575033600090815260166020526040902054155b506113a3600354600454613435565b3360008181526016602090815260408083208590558483526017825280832080546001600160a01b031916851790559282526013905220909250600184141561140b573360009081526014602090815260408083208390556015909152812081905560018201555b60018101541561146e5760405162461bcd60e51b815260206004820152602860248201527f546178206e6565647320746f206265207061696420696e206f7264657220746f604482015267081c1c9bd8d9595960c21b6064820152608401610626565b81815560006002820155600186141561150f57848155346002820181905585111561150f5760405162461bcd60e51b8152602060048201526044602482018190527f416d6f756e742073686f756c642062652067726561746572206f722065717561908201527f6c207468616e2062657420616d6f756e7420666f72206d756c7469706c6520626064820152636574732160e01b608482015260a401610626565b600061151c600484613d1c565b6040805160a08101825234815243602080830191825260008385018181526060850187815233608087019081528c84526012909452959091209351845591516001840155905160028301805460ff1916911515919091179055915160038201559051600490910180546001600160a01b0319166001600160a01b03909216919091179055905080601160008282546115b49190613cf0565b90915550506001851415611761576115d0600383016000613a7b565b6115de600483016000613a7b565b60005b600a81101561169e57826003016040518060600160405280603784600a811061160c5761160c613dd9565b60030201548152602001603784600a811061162957611629613dd9565b60030201600101548152602001603784600a811061164957611649613dd9565b600390810291909101600290810154909252835460018082018655600095865260209586902085519290930290920190815593830151908401556040909101519101558061169681613d52565b9150506115e1565b5060005b600a81101561175f57826004016040518060600160405280601984600a81106116cd576116cd613dd9565b60030201548152602001601984600a81106116ea576116ea613dd9565b60030201600101548152602001601984600a811061170a5761170a613dd9565b600390810291909101600290810154909252835460018082018655600095865260209586902085519290930290920190815593830151908401556040909101519101558061175781613d52565b9150506116a2565b505b604051339085907f1c6f593ee83bd9c852bb9730d16bd55ef38526f41c8b24eb4beb890d2824e74690600090a3505050949350505050565b6001546001600160a01b031633146117c35760405162461bcd60e51b815260040161062690613c55565b600855565b6001546001600160a01b031633146117f25760405162461bcd60e51b815260040161062690613c55565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6002805414156118665760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610626565b6002805560008181526012602052604090208054806118bc5760405162461bcd60e51b815260206004820152601260248201527110995d08191bd95cc81b9bdd08195e1a5cdd60721b6044820152606401610626565b600282015460ff161561190a5760405162461bcd60e51b815260206004820152601660248201527542657420697320736574746c656420616c726561647960501b6044820152606401610626565b600182015461191b90615460613cf0565b43116119695760405162461bcd60e51b815260206004820152601d60248201527f57616974206265666f72652072657175657374696e6720726566756e640000006044820152606401610626565b60008260030154905080601160008282546119849190613d3b565b909155505060028301805460ff1916600117905560048301546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156119d4573d6000803e3d6000fd5b5060048301546040518381526001600160a01b039091169085907f57f542d767287314b1c4f145c240b45cac08f5448a00dc9c4af31cfe74d895ae9060200160405180910390a3505060016002555050565b6001546001600160a01b03163314611a505760405162461bcd60e51b815260040161062690613c55565b600b546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611299573d6000803e3d6000fd5b6001546001600160a01b03163314611ab45760405162461bcd60e51b815260040161062690613c55565b600f55565b6001546001600160a01b03163314611ae35760405162461bcd60e51b815260040161062690613c55565b600655565b6001546001600160a01b03163314611b125760405162461bcd60e51b815260040161062690613c55565b600d55565b6001546001600160a01b03163314611b415760405162461bcd60e51b815260040161062690613c55565b6001600160a01b038116611ba65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610626565b611baf81611bb2565b50565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611c0d826135be565b600082815260176020526040812054600c546001600160a01b039091169190611c3790849061362b565b6001600160a01b0383166000908152601360205260408120600201549192509060019015611c8e576001600160a01b038416600090815260136020526040902060020154611c8790600490613d1c565b9150611cb6565b6001600160a01b038416600090815260136020526040902054611cb390600490613d1c565b91505b80156131c4576000600684611ccc600185613d3b565b81518110611cdc57611cdc613dd9565b6020026020010151611cee9190613d6d565b611cf9906001613cf0565b60408051600480825260a0820190925291925060009190602082016080803683375050506001600160a01b0387166000908152601460205260408120805492935090918491908390611d4c908490613cf0565b90915550506001600160a01b038716600090815260146020526040902054602811611dc6576001600160a01b038716600090815260146020526040902054611d9690602890613d3b565b6001600160a01b038816600090815260146020908152604080832093909355601390522054611dc690888b6136e0565b6001600160a01b03871660009081526014602090815260408083205483526018909152902054631c995b9d60e21b1415611e9957631c995b9d60e21b82600081518110611e1557611e15613dd9565b602002602001018181525050600082600181518110611e3657611e36613dd9565b6020908102919091018101919091526001600160a01b0388166000908152601382526040808220546014909352902054611e719190896137b8565b6001600160a01b038716600090815260136020526040902054611e949088613817565b612dcb565b6001600160a01b03871660009081526014602090815260408083205483526018909152902054651c995dd85c9960d21b1415611f6b576001600160a01b03871660008181526013602090815260408083205460148084528285205480865260188552928520600101549590945292909152611f1892908a908d90613827565b9050651c995dd85c9960d21b82600081518110611f3757611f37613dd9565b6020026020010181815250508060001b82600181518110611f5a57611f5a613dd9565b602002602001018181525050612dcb565b6001600160a01b03871660009081526014602090815260408083205483526018909152902054620e8c2f60eb1b14156120ab576001600160a01b03871660009081526013602090815260408083205460148352818420548452601890925290912060010154611fda91906139c8565b6001600160a01b0388166000908152601360209081526040808320600101939093556015905290812080549161200f83613d52565b9190505550620e8c2f60eb1b8260008151811061202e5761202e613dd9565b60200260200101818152505060136000886001600160a01b03166001600160a01b031681526020019081526020016000206001015460001b8260018151811061207957612079613dd9565b6020908102919091018101919091526001600160a01b038816600090815260139091526040902054611e949088613817565b6001600160a01b03871660009081526014602090815260408083205483526018909152902054656368616e636560d01b141561275f576001600160a01b03871660009081526013602052604081206003015487612109600188613d3b565b8151811061211957612119613dd9565b602002602001015161212b9190613d6d565b6001600160a01b038916600090815260136020526040902060030154909150811115612155575060005b656368616e636560d01b8360008151811061217257612172613dd9565b602002602001018181525050681d5b9919599a5b995960ba1b8360018151811061219e5761219e613dd9565b60200260200101818152505060136000896001600160a01b03166001600160a01b0316815260200190815260200160002060030181815481106121e3576121e3613dd9565b906000526020600020906003020160000154651c995dd85c9960d21b1415612364576001600160a01b038816600090815260136020526040902080546003909101805461227b9291908490811061223c5761223c613dd9565b9060005260206000209060030201600101548a8d601460008e6001600160a01b03166001600160a01b0316815260200190815260200160002054613827565b9150656368616e636560d01b8360008151811061229a5761229a613dd9565b602002602001018181525050651c995dd85c9960d21b836001815181106122c3576122c3613dd9565b6020026020010181815250508160001b836002815181106122e6576122e6613dd9565b60200260200101818152505060136000896001600160a01b03166001600160a01b03168152602001908152602001600020600301818154811061232b5761232b613dd9565b90600052602060002090600302016002015460001b8360038151811061235357612353613dd9565b602002602001018181525050612565565b6001600160a01b038816600090815260136020526040902060030180548290811061239157612391613dd9565b906000526020600020906003020160000154620e8c2f60eb1b1415612565576001600160a01b03881660009081526013602052604090208054600390910180546123fe929190849081106123e7576123e7613dd9565b9060005260206000209060030201600101546139c8565b6001600160a01b0389166000908152601360209081526040808320600101939093556015905290812080549161243383613d52565b9190505550656368616e636560d01b8360008151811061245557612455613dd9565b602002602001018181525050620e8c2f60eb1b8360018151811061247b5761247b613dd9565b60200260200101818152505060136000896001600160a01b03166001600160a01b031681526020019081526020016000206001015460001b836002815181106124c6576124c6613dd9565b60200260200101818152505060136000896001600160a01b03166001600160a01b03168152602001908152602001600020600301818154811061250b5761250b613dd9565b90600052602060002090600302016002015460001b8360038151811061253357612533613dd9565b6020908102919091018101919091526001600160a01b0389166000908152601390915260409020546125659089613817565b6001600160a01b0388166000908152601360205260409020600301805461258e90600190613d3b565b8154811061259e5761259e613dd9565b9060005260206000209060030201601360008a6001600160a01b03166001600160a01b0316815260200190815260200160002060030182815481106125e5576125e5613dd9565b6000918252602080832084546003938402909101908155600180860154908201556002948501549401939093556001600160a01b038b1682526013909252604090200180548061263757612637613dc3565b600082815260208082206003600019909401848102909101838155600181018490556002018390559093556001600160a01b038b1681526013909252604090912001546127595760005b600a811015612757576001600160a01b038916600090815260136020526040908190208151606081019092526003019080603784600a81106126c5576126c5613dd9565b60030201548152602001603784600a81106126e2576126e2613dd9565b60030201600101548152602001603784600a811061270257612702613dd9565b600390810291909101600290810154909252835460018082018655600095865260209586902085519290930290920190815593830151908401556040909101519101558061274f81613d52565b915050612681565b505b50612dcb565b6001600160a01b038716600090815260146020908152604080832054835260189091529020546d18dbdb5b5d5b9a5d1e58da195cdd60921b1415612dcb576001600160a01b038716600090815260136020526040812060040154876127c5600188613d3b565b815181106127d5576127d5613dd9565b60200260200101516127e79190613d6d565b6001600160a01b038916600090815260136020526040902060040154909150811115612811575060005b68636f6d6d756e69747960b81b8360008151811061283157612831613dd9565b602002602001018181525050681d5b9919599a5b995960ba1b8360018151811061285d5761285d613dd9565b60200260200101818152505060136000896001600160a01b03166001600160a01b0316815260200190815260200160002060040181815481106128a2576128a2613dd9565b906000526020600020906003020160000154651c995dd85c9960d21b14156129e7576001600160a01b03881660009081526013602052604090208054600490910180546128fb9291908490811061223c5761223c613dd9565b915068636f6d6d756e69747960b81b8360008151811061291d5761291d613dd9565b602002602001018181525050651c995dd85c9960d21b8360018151811061294657612946613dd9565b6020026020010181815250508160001b8360028151811061296957612969613dd9565b60200260200101818152505060136000896001600160a01b03166001600160a01b0316815260200190815260200160002060040181815481106129ae576129ae613dd9565b90600052602060002090600302016002015460001b836003815181106129d6576129d6613dd9565b602002602001018181525050612bd4565b6001600160a01b0388166000908152601360205260409020600401805482908110612a1457612a14613dd9565b906000526020600020906003020160000154620e8c2f60eb1b1415612bd4576001600160a01b0388166000908152601360205260409020805460049091018054612a6a929190849081106123e7576123e7613dd9565b6001600160a01b03891660009081526013602090815260408083206001019390935560159052908120805491612a9f83613d52565b919050555068636f6d6d756e69747960b81b83600081518110612ac457612ac4613dd9565b602002602001018181525050620e8c2f60eb1b83600181518110612aea57612aea613dd9565b60200260200101818152505060136000896001600160a01b03166001600160a01b031681526020019081526020016000206001015460001b83600281518110612b3557612b35613dd9565b60200260200101818152505060136000896001600160a01b03166001600160a01b031681526020019081526020016000206004018181548110612b7a57612b7a613dd9565b90600052602060002090600302016002015460001b83600381518110612ba257612ba2613dd9565b6020908102919091018101919091526001600160a01b038916600090815260139091526040902054612bd49089613817565b6001600160a01b03881660009081526013602052604090206004018054612bfd90600190613d3b565b81548110612c0d57612c0d613dd9565b9060005260206000209060030201601360008a6001600160a01b03166001600160a01b031681526020019081526020016000206004018281548110612c5457612c54613dd9565b6000918252602080832084546003909302019182556001808501549083015560029384015493909101929092556001600160a01b038a168152601390915260409020600401805480612ca857612ca8613dc3565b6000828152602080822060036000199094019384020182815560018101839055600201829055919092556001600160a01b038a168252601390526040902060040154612dc95760005b600a811015612dc7576001600160a01b038916600090815260136020526040908190208151606081019092526004019080601984600a8110612d3557612d35613dd9565b60030201548152602001601984600a8110612d5257612d52613dd9565b60030201600101548152602001601984600a8110612d7257612d72613dd9565b6003908102919091016002908101549092528354600180820186556000958652602095869020855192909302909201908155938301519084015560409091015191015580612dbf81613d52565b915050612cf1565b505b505b83612dd581613d52565b6001600160a01b0389166000908152601360205260409020600201549095501590506130f0576001600160a01b03871660009081526013602052604090206001015415612f64576001600160a01b038716600090815260136020526040902060028101546001909101541115612ef3576001600160a01b03871660009081526013602052604090206002810154600190910154612e729190613d3b565b6001600160a01b038816600081815260136020526040908190206001018390555190918b917f82f8ea4e3f41d401503922c3276f2a2cc52485694f247169a95fc14995bb947b91612ec69190815260200190565b60405180910390a36001600160a01b03871660009081526013602052604081206002018190559350612f64565b6001600160a01b03871660009081526013602052604090206001810154600290910154612f209190613d3b565b6001600160a01b03881660009081526013602090815260408083206002810194909455600190930182905560159052908120805491612f5e83613d52565b91905055505b6001600160a01b0387166000908152601360205260409020805460029091015410612fd0576001600160a01b03871660009081526013602052604090208054600290910154612fb39190613d3b565b6001600160a01b0388166000908152601360205260409020600201555b6001600160a01b0387166000908152601360205260409020805460029091015410156130f0576001600160a01b038716600090815260136020526040812060020154909450156130d3576001600160a01b038716600081815260136020526040908190206002015490518b917f7bf1be1ecc063becbd9f03e00432bc548ff8024481daf1f86ba603f6235d424e9161306a91815260200190565b60405180910390a36001600160a01b038716600081815260136020526040808220600201549051909181818185875af1925050503d80600081146130ca576040519150601f19603f3d011682016040523d82523d6000602084013e6130cf565b606091505b5050505b6001600160a01b0387166000908152601360205260408120600201555b6001600160a01b038716600090815260156020526040812080549161311483613d52565b90915550506001600160a01b03871660008181526014602090815260408083205460158352818420546013909352928190206001015490518d937f5fd7d18096b8f3ecfe5d90a32b2571e1a80c098c56fc7202b177f845a7a7f2d793613180938a938a91904290613c8a565b60405180910390a36001600160a01b0387166000908152601360205260409020600201546131ad57600093505b600c548411156131bc57600093505b505050611cb6565b81601160008282546131d69190613d3b565b9091555050505050505050565b600480546040516370a0823160e01b81523092810192909252906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561324957600080fd5b505afa15801561325d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132819190613b72565b10156132e35760405162461bcd60e51b815260206004820152602b60248201527f4e6f7420656e6f756768204c494e4b202d2066696c6c20636f6e74726163742060448201526a1dda5d1a0819985d58d95d60aa1b6064820152608401610626565b60065434101561334c5760405162461bcd60e51b815260206004820152602e60248201527f4e65656420616e20616d6f756e742067726561746572207468616e206d696e6960448201526d1b5d5b4818995d08185b5bdd5b9d60921b6064820152608401610626565b60075461335a90600a613d1c565b3411156133cf5760405162461bcd60e51b815260206004820152603860248201527f42657420616d6f756e742073686f756c64206e6f74206265206772656174657260448201527f207468616e20746865204d41582062657420616d6f756e7400000000000000006064820152608401610626565b600060555460ff1660018111156133e8576133e8613dad565b14610d125760405162461bcd60e51b815260206004820152601960248201527f47616d652069732070726573656e746c792070617573656421000000000000006044820152606401610626565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634000aea07f0000000000000000000000000000000000000000000000000000000000000000848660006040516020016134a5929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016134d293929190613be9565b602060405180830381600087803b1580156134ec57600080fd5b505af1158015613500573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135249190613b15565b5060008381526020818152604080832054815180840188905280830185905230606082015260808082018390528351808303909101815260a09091019092528151918301919091208684529290915261357e906001613cf0565b6000858152602081815260409182902092909255805180830187905280820184905281518082038301815260609091019091528051910120949350505050565b6000818152601260205260409020600281015460ff161561361a5760405162461bcd60e51b815260206004820152601660248201527542657420697320736574746c656420616c726561647960501b6044820152606401610626565b600201805460ff1916600117905550565b60608167ffffffffffffffff81111561364657613646613def565b60405190808252806020026020018201604052801561366f578160200160208202803683370190505b50905060005b828110156136d95760408051602081018690529081018290526060016040516020818303038152906040528051906020012060001c8282815181106136bc576136bc613dd9565b6020908102919091010152806136d181613d52565b915050613675565b5092915050565b6000806136ec85613a14565b9050600854856136fc9190613d1c565b915081811015613717576137108183613d3b565b915061371c565b600091505b6040516001600160a01b038516908390600081818185875af1925050503d8060008114613765576040519150601f19603f3d011682016040523d82523d6000602084013e61376a565b606091505b505050836001600160a01b0316837f8baa310a5138797576dee4ed72c964b1e6f48e6dcc7ae3b405c8ac5c0c5b5062846040516137a991815260200190565b60405180910390a35050505050565b60006137c384613a48565b90506000848210156137e0576137d98286613d3b565b90506137e4565b5060005b73b1c71c6c9ab9748f24720c8a8aaef3aee4460698600061380d6001546001600160a01b031690565b5050505050505050565b600060095483610ebc9190613d1c565b600080808061383589613a14565b9050600188141561384857889150613907565b60028814806138575750600388145b806138625750600488145b1561387b57879250613874838a613d1c565b9150613907565b60098814156138a45761388f60648a613d08565b61389a906032613d1c565b613874908a613cf0565b6000198814156138c4576138b960648a613d08565b613874906019613d1c565b6001198814156138e4576138d960648a613d08565b613874906032613d1c565b600219881415613907576138f960648a613d08565b61390490604b613d1c565b91505b81811015613920576139198183613d3b565b9150613925565b600091505b6040516001600160a01b038816908390600081818185875af1925050503d806000811461396e576040519150601f19603f3d011682016040523d82523d6000602084013e613973565b606091505b505060408051848152602081018890526001600160a01b038a16925088917f691b5ed9cbbc786c7b458204db6a1b43e6a1448705bc911ba57cda583c8b8308910160405180910390a350979650505050505050565b60008060018314156139db575082613a0d565b60028314156139f6576139ef846002613d1c565b9050613a0d565b6003831415613a0d57613a0a846003613d1c565b90505b9392505050565b6000806064600d5484613a279190613d1c565b613a319190613d08565b9050600e54811015613a425750600e545b92915050565b6000806064600f5484613a5b9190613d1c565b613a659190613d08565b9050601054811015613a42575060105492915050565b5080546000825560030290600052602060002090810190611baf91905b80821115613ab9576000808255600182018190556002820155600301613a98565b5090565b600060208284031215613acf57600080fd5b8135613a0d81613e05565b60008060008060808587031215613af057600080fd5b8435613afb81613e05565b966020860135965060408601359560600135945092505050565b600060208284031215613b2757600080fd5b81518015158114613a0d57600080fd5b600060208284031215613b4957600080fd5b5035919050565b60008060408385031215613b6357600080fd5b50508035926020909101359150565b600060208284031215613b8457600080fd5b5051919050565b600080600060608486031215613ba057600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215613bcd57600080fd5b5050823594602084013594506040840135936060013592509050565b60018060a01b038416815260006020848184015260606040840152835180606085015260005b81811015613c2b57858101830151858201608001528201613c0f565b81811115613c3d576000608083870101525b50601f01601f19169290920160800195945050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060c082018883526020888185015287604085015260c0606085015281875180845260e086019150828901935060005b81811015613cd757845183529383019391830191600101613cbb565b5050608085019690965250505060a00152949350505050565b60008219821115613d0357613d03613d81565b500190565b600082613d1757613d17613d97565b500490565b6000816000190483118215151615613d3657613d36613d81565b500290565b600082821015613d4d57613d4d613d81565b500390565b6000600019821415613d6657613d66613d81565b5060010190565b600082613d7c57613d7c613d97565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611baf57600080fdfea26469706673582212200af45f4dd3837b9004631202977fac5460d2362e6f4f744b68f21e1543a0105564736f6c63430008070033

Deployed ByteCode Sourcemap

19328:34577:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50258:150;;;;;;;;;;-1:-1:-1;50258:150:0;;;;;:::i;:::-;;:::i;:::-;;53725:170;;;;;;;;;;-1:-1:-1;53725:170:0;;;;;:::i;:::-;;:::i;50528:106::-;;;;;;;;;;;;;:::i;:::-;;;4957:25:1;;;4945:2;4930:18;50528:106:0;;;;;;;;43014:683;;;:::i;52227:108::-;;;;;;;;;;-1:-1:-1;52227:108:0;;;;;:::i;:::-;;:::i;48233:521::-;;;;;;;;;;;;;:::i;52016:105::-;;;;;;;;;;-1:-1:-1;52016:105:0;;;;;:::i;:::-;;:::i;52715:134::-;;;;;;;;;;-1:-1:-1;52715:134:0;;;;;:::i;:::-;;:::i;53344:176::-;;;;;;;;;;-1:-1:-1;53344:176:0;;;;;:::i;:::-;;:::i;53071:141::-;;;;;;;;;;-1:-1:-1;53071:141:0;;;;;:::i;:::-;;:::i;51619:86::-;;;;;;;;;;;;;:::i;48760:223::-;;;;;;;;;;-1:-1:-1;48871:10:0;48805:7;48853:29;;;:17;:29;;;;;;48919:21;48760:223;;;5167:25:1;;;5223:2;5208:18;;5201:34;;;;5140:18;48760:223:0;4993:248:1;51408:205:0;;;;;;;;;;;;;:::i;52129:90::-;;;;;;;;;;-1:-1:-1;52129:90:0;;;;;:::i;:::-;;:::i;2488:94::-;;;;;;;;;;;;;:::i;50644:515::-;;;;;;;;;;-1:-1:-1;50644:515:0;;;;;:::i;:::-;;:::i;53536:175::-;;;;;;;;;;-1:-1:-1;53536:175:0;;;;;:::i;:::-;;:::i;48989:138::-;;;;;;;;;;;;;:::i;51717:89::-;;;;;;;;;;;;;:::i;1837:87::-;;;;;;;;;;-1:-1:-1;1910:6:0;;1837:87;;-1:-1:-1;;;;;1910:6:0;;;3390:51:1;;3378:2;3363:18;1837:87:0;3244:203:1;51243:153:0;;;;;;;;;;;;;:::i;19010:233::-;;;;;;;;;;-1:-1:-1;19010:233:0;;;;;:::i;:::-;;:::i;53218:116::-;;;;;;;;;;-1:-1:-1;53218:116:0;;;;;:::i;:::-;;:::i;52955:108::-;;;;;;;;;;-1:-1:-1;52955:108:0;;;;;:::i;:::-;;:::i;51915:93::-;;;;;;;;;;-1:-1:-1;51915:93:0;;;;;:::i;:::-;;:::i;28615:2977::-;;;;;;:::i;:::-;;:::i;52857:90::-;;;;;;;;;;-1:-1:-1;52857:90:0;;;;;:::i;:::-;;:::i;52341:128::-;;;;;;;;;;-1:-1:-1;52341:128:0;;;;;:::i;:::-;;:::i;49392:822::-;;;;;;;;;;-1:-1:-1;49392:822:0;;;;;:::i;:::-;;:::i;50413:112::-;;;;;;;;;;-1:-1:-1;50413:112:0;;;;;:::i;:::-;;:::i;52598:109::-;;;;;;;;;;-1:-1:-1;52598:109:0;;;;;:::i;:::-;;:::i;51814:93::-;;;;;;;;;;-1:-1:-1;51814:93:0;;;;;:::i;:::-;;:::i;52477:113::-;;;;;;;;;;-1:-1:-1;52477:113:0;;;;;:::i;:::-;;:::i;2737:192::-;;;;;;;;;;-1:-1:-1;2737:192:0;;;;;:::i;:::-;;:::i;50258:150::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;;;;;;;;;50326:22:::1;50351:7;1910:6:::0;;-1:-1:-1;;;;;1910:6:0;;1837:87;50351:7:::1;50363:40;::::0;50326:32;;-1:-1:-1;;;;;;50363:32:0;::::1;::::0;:40;::::1;;;::::0;50396:6;;50363:40:::1;::::0;;;50396:6;50363:32;:40;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;50315:93;50258:150:::0;:::o;53725:170::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;53849:38:::1;;;;;;;;53864:7;53849:38;;;;53872:7;53849:38;;;;53880:6;53849:38;;::::0;53830:10:::1;53841:6;53830:18;;;;;;;:::i;:::-;;;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;53725:170:::0;;;;:::o;50528:106::-;1910:6;;50588:7;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;-1:-1:-1;50610:19:0::1;::::0;50528:106;:::o;43014:683::-;43119:10;:18;43107:9;:30;43103:47;;;43140:8;;;43103:47;43200:10;43162:17;43182:29;;;:17;:29;;;;;;43230:13;43222:41;;;;-1:-1:-1;;;43222:41:0;;9509:2:1;43222:41:0;;;9491:21:1;9548:2;9528:18;;;9521:30;-1:-1:-1;;;9567:18:1;;;9560:44;9621:18;;43222:41:0;9307:338:1;43222:41:0;43302:10;43276:17;43296;;;:5;:17;;;;;43345:16;;;;43332:9;:29;43324:72;;;;-1:-1:-1;;;43324:72:0;;13174:2:1;43324:72:0;;;13156:21:1;13213:2;13193:18;;;13186:30;13252:32;13232:18;;;13225:60;13302:18;;43324:72:0;12972:354:1;43324:72:0;43434:1;43415:4;:16;;;:20;43407:51;;;;-1:-1:-1;;;43407:51:0;;9162:2:1;43407:51:0;;;9144:21:1;9201:2;9181:18;;;9174:30;-1:-1:-1;;;9220:18:1;;;9213:48;9278:18;;43407:51:0;8960:342:1;43407:51:0;43500:10;43469:13;43485:26;;;:14;:26;;;;;;;43522:10;43485:26;43522:10;:::i;:::-;43572:16;;;;43548:62;;;5167:25:1;;;5223:2;5208:18;;5201:34;;;43522:10:0;;-1:-1:-1;43590:10:0;;-1:-1:-1;43562:9:0;;43548:62;;5140:18:1;43548:62:0;;;;;;;43640:1;43621:16;;;;:20;;;43667:10;43652:26;;:14;:26;;;;;;:37;-1:-1:-1;43014:683:0:o;52227:108::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;52303:10:::1;:24:::0;;-1:-1:-1;;;;;;52303:24:0::1;-1:-1:-1::0;;;;;52303:24:0;;;::::1;::::0;;;::::1;::::0;;52227:108::o;48233:521::-;4929:1;5527:7;;:19;;5519:63;;;;-1:-1:-1;;;5519:63:0;;12814:2:1;5519:63:0;;;12796:21:1;12853:2;12833:18;;;12826:30;12892:33;12872:18;;;12865:61;12943:18;;5519:63:0;12612:355:1;5519:63:0;4929:1;5660:18;;48309:10:::1;48291:29;::::0;;;:17:::1;:29;::::0;;;;;48283:67:::1;;;::::0;-1:-1:-1;;;48283:67:0;;6814:2:1;48283:67:0::1;::::0;::::1;6796:21:1::0;6853:2;6833:18;;;6826:30;-1:-1:-1;;;6872:18:1;;;6865:50;6932:18;;48283:67:0::1;6612:344:1::0;48283:67:0::1;48387:10;48355:11;48369:29:::0;;;:17:::1;:29;::::0;;;;;48429:21:::1;48458:24:::0;;::::1;48455:295;;;48497:44;::::0;4957:25:1;;;48530:10:0::1;::::0;48497:44:::1;::::0;4945:2:1;4930:18;48497:44:0::1;;;;;;;48455:295;;;48578:10;48592:1;48560:29:::0;;;:17:::1;:29;::::0;;;;:33;;;48602:19:::1;:29:::0;;48625:6;;48592:1;48602:29:::1;::::0;48625:6;;48602:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;48659:34:0::1;::::0;48641:12:::1;::::0;48659:10:::1;::::0;48682:6;;48641:12;48659:34;48641:12;48659:34;48682:6;48659:10;:34:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48640:53;;;48716:7;48708:36;;;::::0;-1:-1:-1;;;48708:36:0;;12469:2:1;48708:36:0::1;::::0;::::1;12451:21:1::0;12508:2;12488:18;;;12481:30;-1:-1:-1;;;12527:18:1;;;12520:46;12583:18;;48708:36:0::1;12267:340:1::0;48708:36:0::1;48551:199;48455:295;-1:-1:-1::0;;4885:1:0;5839:7;:22;48233:521::o;52016:105::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;52095:7:::1;:18:::0;52016:105::o;52715:134::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;52803:18:::1;:38:::0;52715:134::o;53344:176::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;53481:31:::1;::::0;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;53456:22:0;;;:14:::1;:22:::0;;;;;:56;;;;;;::::1;::::0;;::::1;::::0;53344:176::o;53071:141::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;53159:25:::1;:45:::0;53071:141::o;51619:86::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;51669:10:::1;:28:::0;;51682:15:::1;::::0;51669:10;-1:-1:-1;;51669:28:0::1;51682:15:::0;;51669:28:::1;;;;;;51619:86::o:0;51408:205::-;1910:6;;51466:7;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;51576:29:::1;::::0;-1:-1:-1;;;51576:29:0;;51599:4:::1;51576:29;::::0;::::1;3390:51:1::0;51576:4:0::1;-1:-1:-1::0;;;;;51576:14:0::1;::::0;::::1;::::0;3363:18:1;;51576:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51569:36;;51408:205:::0;:::o;52129:90::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;52201:3:::1;:10:::0;52129:90::o;2488:94::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;2553:21:::1;2571:1;2553:9;:21::i;:::-;2488:94::o:0;50644:515::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50720:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;50712:61:::1;;;::::0;-1:-1:-1;;;50712:61:0;;6814:2:1;50712:61:0::1;::::0;::::1;6796:21:1::0;6853:2;6833:18;;;6826:30;-1:-1:-1;;;6872:18:1;;;6865:50;6932:18;;50712:61:0::1;6612:344:1::0;50712:61:0::1;-1:-1:-1::0;;;;;50792:23:0;::::1;50778:11;50792:23:::0;;;:17:::1;:23;::::0;;;;;50846:21:::1;50875:24:::0;;::::1;50872:283;;;50914:44;::::0;4957:25:1;;;50947:10:0::1;::::0;50914:44:::1;::::0;4945:2:1;4930:18;50914:44:0::1;;;;;;;50363:40;50315:93;50258:150:::0;:::o;50872:283::-:1;-1:-1:-1::0;;;;;50977:23:0;::::1;51003:1;50977:23:::0;;;:17:::1;:23;::::0;;;;:27;;;51013:19:::1;:29:::0;;51036:6;;51003:1;51013:29:::1;::::0;51036:6;;51013:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;51070:28:0::1;::::0;51052:12:::1;::::0;-1:-1:-1;;;;;51070:9:0;::::1;::::0;51087:6;;51052:12;51070:28;51052:12;51070:28;51087:6;51070:9;:28:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51051:47;;;51121:7;51113:36;;;::::0;-1:-1:-1;;;51113:36:0;;12469:2:1;51113:36:0::1;::::0;::::1;12451:21:1::0;12508:2;12488:18;;;12481:30;-1:-1:-1;;;12527:18:1;;;12520:46;12583:18;;51113:36:0::1;12267:340:1::0;51113:36:0::1;50968:187;50701:458;;50644:515:::0;:::o;53536:175::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;53669:34:::1;;;;;;;;53676:11;53669:34;;;;53688:7;53669:34;;;;53696:6;53669:34;;::::0;53649:11:::1;53661:6;53649:19;;;;;;;:::i;48989:138::-:0;49081:10;49035:7;49075:17;;;:5;:17;;;;;;;;49056:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49035:7;;49056:36;;;;;;;;;;49035:7;;49056:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49056:36:0;;-1:-1:-1;;49105:16:0;;;;48989:138;-1:-1:-1;;48989:138:0:o;51717:89::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;51769:10:::1;:29:::0;;51782:16:::1;::::0;51769:10;-1:-1:-1;;51769:29:0::1;::::0;51782:16;51769:29:::1;::::0;51243:153;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;51335:29:::1;::::0;-1:-1:-1;;;51335:29:0;;51358:4:::1;51335:29;::::0;::::1;3390:51:1::0;51309:4:0::1;-1:-1:-1::0;;;;;51309:13:0::1;::::0;::::1;::::0;51323:10:::1;::::0;51309:13;;51335:14:::1;::::0;3363:18:1;;51335:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51309:56;::::0;-1:-1:-1;;;;;;51309:56:0::1;::::0;;;;;;-1:-1:-1;;;;;3953:32:1;;;51309:56:0::1;::::0;::::1;3935:51:1::0;4002:18;;;3995:34;3908:18;;51309:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51301:87;;;::::0;-1:-1:-1;;;51301:87:0;;9852:2:1;51301:87:0::1;::::0;::::1;9834:21:1::0;9891:2;9871:18;;;9864:30;-1:-1:-1;;;9910:18:1;;;9903:48;9968:18;;51301:87:0::1;9650:342:1::0;19010:233:0;19126:10;-1:-1:-1;;;;;19140:14:0;19126:28;;19118:72;;;;-1:-1:-1;;;19118:72:0;;11343:2:1;19118:72:0;;;11325:21:1;11382:2;11362:18;;;11355:30;11421:33;11401:18;;;11394:61;11472:18;;19118:72:0;11141:355:1;19118:72:0;19197:40;19215:9;19226:10;19197:17;:40::i;:::-;19010:233;;:::o;53218:116::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;53294:18:::1;:32:::0;53218:116::o;52955:108::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;53031:10:::1;:24:::0;52955:108::o;51915:93::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;51983:7:::1;:17:::0;51915:93::o;28615:2977::-;28727:17;28802:15;:13;:15::i;:::-;28923:13;28939:1;28923:17;:44;;;;;28958:9;28944:10;:23;;28923:44;28919:61;;;28970:8;;;28919:61;29007:9;29103:10;;;;;:37;;-1:-1:-1;;;;;;29117:23:0;;;;29103:37;:64;;;;-1:-1:-1;;;;;;29144:23:0;;29157:10;29144:23;;29103:64;:102;;;;-1:-1:-1;29189:10:0;29171:29;;;;:17;:29;;;;;;:34;29103:102;29099:211;29342:31;29360:7;;29369:3;;29342:17;:31::i;:::-;29424:10;29406:29;;;;:17;:29;;;;;;;;:41;;;29458:28;;;:17;:28;;;;;:41;;-1:-1:-1;;;;;;29458:41:0;;;;;29530:17;;;:5;:17;;;29330:43;;-1:-1:-1;29458:41:0;29619:13;;29616:157;;;29666:10;29680:1;29648:29;;;:17;:29;;;;;;;;:33;;;29696:14;:26;;;;;:30;;;29741:16;;;:20;29616:157;29791:16;;;;:21;29783:74;;;;-1:-1:-1;;;29783:74:0;;7575:2:1;29783:74:0;;;7557:21:1;7614:2;7594:18;;;7587:30;7653:34;7633:18;;;7626:62;-1:-1:-1;;;7704:18:1;;;7697:38;7752:19;;29783:74:0;7373:404:1;29783:74:0;29865:20;;;:11;29896:17;;;:21;29992:1;29976:17;;29973:236;;;30009:24;;;30068:9;30048:17;;;:29;;;30100:24;-1:-1:-1;30100:24:0;30092:105;;;;-1:-1:-1;;;30092:105:0;;7984:2:1;30092:105:0;;;7966:21:1;8023:2;8003:18;;;7996:30;;;8062:34;8042:18;;;8035:62;8133:34;8113:18;;;8106:62;-1:-1:-1;;;8184:19:1;;;8177:35;8229:19;;30092:105:0;7782:472:1;30092:105:0;30249:22;30274:20;20256:1;30274:6;:20;:::i;:::-;30362:258;;;;;;;;30491:9;30362:258;;30417:12;30362:258;;;;;;;-1:-1:-1;30362:258:0;;;;;;;;;;;;30536:10;30362:258;;;;;;30342:17;;;:6;:17;;;;;;;:278;;;;;;30362:258;30342:278;;;;;;;;;;-1:-1:-1;;30342:278:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30342:278:0;-1:-1:-1;;;;;30342:278:0;;;;;;;;;30362:258;-1:-1:-1;30892:17:0;30876:12;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;31031:1:0;31019:13;;31016:484;;;31048:19;31055:12;;;;31048:19;:::i;:::-;31082:18;31089:11;;;;31082:18;:::i;:::-;31121:6;31117:175;31137:18;31133:1;:22;31117:175;;;31181:4;:12;;31199:76;;;;;;;;31206:11;31218:1;31206:14;;;;;;;:::i;:::-;;;;:25;31199:76;;;;31232:11;31244:1;31232:14;;;;;;;:::i;:::-;;;;:21;;;31199:76;;;;31254:11;31266:1;31254:14;;;;;;;:::i;:::-;;;;;;;;;:20;;;;;31199:76;;;31181:95;;;;;;;;-1:-1:-1;31181:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31157:3;;;;:::i;:::-;;;;31117:175;;;;31316:6;31312:174;31332:17;31328:1;:21;31312:174;;;31375:4;:11;;31392:77;;;;;;;;31407:10;31418:1;31407:13;;;;;;;:::i;:::-;;;;:20;31392:77;;;;31428:10;31439:1;31428:13;;;;;;;:::i;:::-;;;;:20;;;31392:77;;;;31449:10;31460:1;31449:13;;;;;;;:::i;:::-;;;;;;;;;:19;;;;;31392:77;;;31375:95;;;;;;;;-1:-1:-1;31375:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31351:3;;;;:::i;:::-;;;;31312:174;;;;31016:484;31517:40;;31546:10;;31536:9;;31517:40;;;;;31568:16;;;28615:2977;;;;;;:::o;52857:90::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;52923:7:::1;:16:::0;52857:90::o;52341:128::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;52427:15:::1;:34:::0;;-1:-1:-1;;;;;;52427:34:0::1;-1:-1:-1::0;;;;;52427:34:0;;;::::1;::::0;;;::::1;::::0;;52341:128::o;49392:822::-;4929:1;5527:7;;:19;;5519:63;;;;-1:-1:-1;;;5519:63:0;;12814:2:1;5519:63:0;;;12796:21:1;12853:2;12833:18;;;12826:30;12892:33;12872:18;;;12865:61;12943:18;;5519:63:0;12612:355:1;5519:63:0;4929:1;5660:18;;49473:15:::1;49491:17:::0;;;:6:::1;:17;::::0;;;;49533:10;;49594;49586:41:::1;;;::::0;-1:-1:-1;;;49586:41:0;;6060:2:1;49586:41:0::1;::::0;::::1;6042:21:1::0;6099:2;6079:18;;;6072:30;-1:-1:-1;;;6118:18:1;;;6111:48;6176:18;;49586:41:0::1;5858:342:1::0;49586:41:0::1;49646:13;::::0;::::1;::::0;::::1;;:22;49638:57;;;::::0;-1:-1:-1;;;49638:57:0;;11703:2:1;49638:57:0::1;::::0;::::1;11685:21:1::0;11742:2;11722:18;;;11715:30;-1:-1:-1;;;11761:18:1;;;11754:52;11823:18;;49638:57:0::1;11501:346:1::0;49638:57:0::1;49729:20;::::0;::::1;::::0;:28:::1;::::0;49752:5:::1;49729:28;:::i;:::-;49714:12;:43;49706:85;;;::::0;-1:-1:-1;;;49706:85:0;;10560:2:1;49706:85:0::1;::::0;::::1;10542:21:1::0;10599:2;10579:18;;;10572:30;10638:31;10618:18;;;10611:59;10687:18;;49706:85:0::1;10358:353:1::0;49706:85:0::1;49804:22;49829:3;:13;;;49804:38;;49954:17;49938:12;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;50015:13:0::1;::::0;::::1;:20:::0;;-1:-1:-1;;50015:20:0::1;50031:4;50015:20;::::0;;50077:11:::1;::::0;::::1;::::0;:28:::1;::::0;-1:-1:-1;;;;;50077:11:0;;::::1;::::0;:28;::::1;;;::::0;50098:6;;50015:13:::1;50077:28:::0;50015:13;50077:28;50098:6;50077:11;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;50186:11:0::1;::::0;::::1;::::0;50163:43:::1;::::0;4957:25:1;;;-1:-1:-1;;;;;50186:11:0;;::::1;::::0;50175:9;;50163:43:::1;::::0;4945:2:1;4930:18;50163:43:0::1;;;;;;;-1:-1:-1::0;;4885:1:0;5839:7;:22;-1:-1:-1;;49392:822:0:o;50413:112::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;50487:15:::1;::::0;50479:41:::1;::::0;-1:-1:-1;;;;;50487:15:0;;::::1;::::0;50479:41;::::1;;;::::0;50513:6;;50487:15:::1;50479:41:::0;50487:15;50479:41;50513:6;50487:15;50479:41;::::1;;;;;;;;;;;;;::::0;::::1;;;;52598:109:::0;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;52674:11:::1;:25:::0;52598:109::o;51814:93::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;51882:7:::1;:17:::0;51814:93::o;52477:113::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;52551:18:::1;:31:::0;52477:113::o;2737:192::-;1910:6;;-1:-1:-1;;;;;1910:6:0;705:10;2057:23;2049:68;;;;-1:-1:-1;;;2049:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2826:22:0;::::1;2818:73;;;::::0;-1:-1:-1;;;2818:73:0;;6407:2:1;2818:73:0::1;::::0;::::1;6389:21:1::0;6446:2;6426:18;;;6419:30;6485:34;6465:18;;;6458:62;-1:-1:-1;;;6536:18:1;;;6529:36;6582:19;;2818:73:0::1;6205:402:1::0;2818:73:0::1;2902:19;2912:8;2902:9;:19::i;:::-;2737:192:::0;:::o;2937:173::-;3012:6;;;-1:-1:-1;;;;;3029:17:0;;;-1:-1:-1;;;;;;3029:17:0;;;;;;;3062:40;;3012:6;;;3029:17;3012:6;;3062:40;;2993:16;;3062:40;2982:128;2937:173;:::o;31877:10879::-;31982:25;31997:9;31982:14;:25::i;:::-;32018:14;32035:28;;;:17;:28;;;;;;32188:18;;-1:-1:-1;;;;;32035:28:0;;;;32018:14;32170:37;;32177:10;;32170:6;:37::i;:::-;-1:-1:-1;;;;;32405:13:0;;32219:22;32405:13;;;:5;:13;;;;;:26;;;32137:70;;-1:-1:-1;32219:22:0;32272:1;;32405:30;32402:226;;-1:-1:-1;;;;;32470:13:0;;;;;;:5;:13;;;;;:26;;;:40;;20256:1;;32470:40;:::i;:::-;32450:60;;32402:226;;;-1:-1:-1;;;;;32594:13:0;;;;;;:5;:13;;;;;:20;:34;;20256:1;;32594:34;:::i;:::-;32574:54;;32402:226;32717:12;;32711:9874;;32800:18;32852:1;32822:13;32836:12;32847:1;32836:8;:12;:::i;:::-;32822:27;;;;;;;;:::i;:::-;;;;;;;:31;;;;:::i;:::-;32821:37;;32857:1;32821:37;:::i;:::-;32909:16;;;32923:1;32909:16;;;;;;;;;32800:58;;-1:-1:-1;32875:30:0;;32909:16;;;;;;;;;-1:-1:-1;;;;;;;;33049:25:0;;32941:18;33049:25;;;:17;:25;;;;;:42;;32875:50;;-1:-1:-1;32941:18:0;;33078:13;;33049:25;32941:18;;33049:42;;33078:13;;33049:42;:::i;:::-;;;;-1:-1:-1;;;;;;;33109:25:0;;;;;;:17;:25;;;;;;33138:2;-1:-1:-1;33106:354:0;;-1:-1:-1;;;;;33281:25:0;;;;;;:17;:25;;;;;;:30;;33309:2;;33281:30;:::i;:::-;-1:-1:-1;;;;;33253:25:0;;;;;;:17;:25;;;;;;;;:58;;;;33406:5;:13;;;:20;33397:47;;33271:6;33434:9;33397:8;:47::i;:::-;-1:-1:-1;;;;;33602:25:0;;33587:41;33602:25;;;:17;:25;;;;;;;;;33587:41;;:14;:41;;;;;:54;-1:-1:-1;;;33587:64:0;33584:6551;;;-1:-1:-1;;;33775:13:0;33789:1;33775:16;;;;;;;;:::i;:::-;;;;;;:23;;;;;33817:19;:13;33831:1;33817:16;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;;-1:-1:-1;;;;;33866:13:0;;;;;;:5;:13;;;;;;:20;33887:17;:25;;;;;;33855:65;;33866:20;33872:6;33855:10;:65::i;:::-;-1:-1:-1;;;;;34002:13:0;;;;;;:5;:13;;;;;:20;33987:43;;34008:6;33987:14;:43::i;:::-;33584:6551;;;-1:-1:-1;;;;;34069:25:0;;34054:41;34069:25;;;:17;:25;;;;;;;;;34054:41;;:14;:41;;;;;:54;-1:-1:-1;;;34054:66:0;34051:6084;;;-1:-1:-1;;;;;34209:13:0;;;;;;:5;:13;;;;;;;;:20;34245:17;:25;;;;;;;34230:41;;;:14;:41;;;;;:48;;;34296:25;;;;;;;;34199:123;;34230:48;34215:6;;34286:9;;34199;:123::i;:::-;34183:139;;-1:-1:-1;;;34341:13:0;34355:1;34341:16;;;;;;;;:::i;:::-;;;;;;:25;;;;;34410:13;34402:22;;34385:13;34399:1;34385:16;;;;;;;;:::i;:::-;;;;;;:39;;;;;34051:6084;;;-1:-1:-1;;;;;34463:25:0;;34448:41;34463:25;;;:17;:25;;;;;;;;;34448:41;;:14;:41;;;;;:54;-1:-1:-1;;;34448:63:0;34445:5690;;;-1:-1:-1;;;;;34648:13:0;;;;;;:5;:13;;;;;;;;:20;34684:17;:25;;;;;;34669:41;;:14;:41;;;;;;:48;;;34628:90;;34648:20;34628:19;:90::i;:::-;-1:-1:-1;;;;;34600:13:0;;;;;;:5;:13;;;;;;;;:25;;:118;;;;34737:14;:22;;;;;:24;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;34780:13:0;34794:1;34780:16;;;;;;;;:::i;:::-;;;;;;:22;;;;;34846:5;:13;34852:6;-1:-1:-1;;;;;34846:13:0;-1:-1:-1;;;;;34846:13:0;;;;;;;;;;;;:25;;;34838:34;;34821:13;34835:1;34821:16;;;;;;;;:::i;:::-;;;;;;;;;;;:51;;;;-1:-1:-1;;;;;34957:13:0;;;;;;:5;:13;;;;;;:20;34942:43;;34963:6;34942:14;:43::i;34445:5690::-;-1:-1:-1;;;;;35024:25:0;;35009:41;35024:25;;;:17;:25;;;;;;;;;35009:41;;:14;:41;;;;;:54;-1:-1:-1;;;35009:66:0;35006:5129;;;-1:-1:-1;;;;;35298:13:0;;35255:10;35298:13;;;:5;:13;;;;;:21;;:28;35268:13;35282:12;35293:1;35282:8;:12;:::i;:::-;35268:27;;;;;;;;:::i;:::-;;;;;;;:58;;;;:::i;:::-;-1:-1:-1;;;;;35393:13:0;;;;;;:5;:13;;;;;:21;;:28;35255:71;;-1:-1:-1;35385:36:0;;35382:50;;;-1:-1:-1;35431:1:0;35382:50;-1:-1:-1;;;35456:13:0;35470:1;35456:16;;;;;;;;:::i;:::-;;;;;;:25;;;;;-1:-1:-1;;;35500:13:0;35514:1;35500:16;;;;;;;;:::i;:::-;;;;;;:28;;;;;35603:5;:13;35609:6;-1:-1:-1;;;;;35603:13:0;-1:-1:-1;;;;;35603:13:0;;;;;;;;;;;;:21;;35625:5;35603:28;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;;-1:-1:-1;;;35603:51:0;35600:1182;;;-1:-1:-1;;;;;35742:13:0;;;;;;:5;:13;;;;;:20;;35763:21;;;;:28;;35732:110;;35742:20;35763:21;35785:5;;35763:28;;;;;;:::i;:::-;;;;;;;;;;;:35;;;35799:6;35806:9;35816:17;:25;35834:6;-1:-1:-1;;;;;35816:25:0;-1:-1:-1;;;;;35816:25:0;;;;;;;;;;;;;35732:9;:110::i;:::-;35716:126;;-1:-1:-1;;;35865:13:0;35879:1;35865:16;;;;;;;;:::i;:::-;;;;;;:25;;;;;-1:-1:-1;;;35913:13:0;35927:1;35913:16;;;;;;;;:::i;:::-;;;;;;:25;;;;;35986:13;35978:22;;35961:13;35975:1;35961:16;;;;;;;;:::i;:::-;;;;;;:39;;;;;36070:5;:13;36076:6;-1:-1:-1;;;;;36070:13:0;-1:-1:-1;;;;;36070:13:0;;;;;;;;;;;;:21;;36092:5;36070:28;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;36062:43;;36045:13;36059:1;36045:16;;;;;;;;:::i;:::-;;;;;;:60;;;;;35600:1182;;;-1:-1:-1;;;;;36138:13:0;;;;;;:5;:13;;;;;:21;;:28;;36160:5;;36138:28;;;;;;:::i;:::-;;;;;;;;;;;:39;;;-1:-1:-1;;;36138:48:0;36135:647;;;-1:-1:-1;;;;;36332:13:0;;;;;;:5;:13;;;;;:20;;36353:21;;;;:28;;36312:77;;36332:20;36353:21;36375:5;;36353:28;;;;;;:::i;:::-;;;;;;;;;;;:35;;;36312:19;:77::i;:::-;-1:-1:-1;;;;;36284:13:0;;;;;;:5;:13;;;;;;;;:25;;:105;;;;36412:14;:22;;;;;:24;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;36459:13:0;36473:1;36459:16;;;;;;;;:::i;:::-;;;;;;:25;;;;;-1:-1:-1;;;36507:13:0;36521:1;36507:16;;;;;;;;:::i;:::-;;;;;;:22;;;;;36577:5;:13;36583:6;-1:-1:-1;;;;;36577:13:0;-1:-1:-1;;;;;36577:13:0;;;;;;;;;;;;:25;;;36569:34;;36552:13;36566:1;36552:16;;;;;;;;:::i;:::-;;;;;;:51;;;;;36655:5;:13;36661:6;-1:-1:-1;;;;;36655:13:0;-1:-1:-1;;;;;36655:13:0;;;;;;;;;;;;:21;;36677:5;36655:28;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;36647:43;;36630:13;36644:1;36630:16;;;;;;;;:::i;:::-;;;;;;;;;;;:60;;;;-1:-1:-1;;;;;36734:13:0;;;;;;:5;:13;;;;;;:20;36719:43;;36740:6;36719:14;:43::i;:::-;-1:-1:-1;;;;;36920:13:0;;;;;;:5;:13;;;;;:21;;36942:28;;:30;;36971:1;;36942:30;:::i;:::-;36920:53;;;;;;;;:::i;:::-;;;;;;;;;;;36889:5;:13;36895:6;-1:-1:-1;;;;;36889:13:0;-1:-1:-1;;;;;36889:13:0;;;;;;;;;;;;:21;;36911:5;36889:28;;;;;;;;:::i;:::-;;;;;;;;;:84;;:28;;;;;;;:84;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36992:13:0;;;;:5;:13;;;;;;:21;:27;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;36992:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37128:13:0;;;;:5;:13;;;;;;;:21;:28;37125:438;;37282:6;37278:200;37298:18;37294:1;:22;37278:200;;;-1:-1:-1;;;;;37350:13:0;;;;;;:5;:13;;;;;;;37377:76;;;;;;;;37350:21;;;37377:76;37384:11;37396:1;37384:14;;;;;;;:::i;:::-;;;;:25;37377:76;;;;37410:11;37422:1;37410:14;;;;;;;:::i;:::-;;;;:21;;;37377:76;;;;37432:11;37444:1;37432:14;;;;;;;:::i;:::-;;;;;;;;;:20;;;;;37377:76;;;37350:104;;;;;;;;-1:-1:-1;37350:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37318:3;;;;:::i;:::-;;;;37278:200;;;;37125:438;35076:2522;35006:5129;;;-1:-1:-1;;;;;37621:25:0;;37606:41;37621:25;;;:17;:25;;;;;;;;;37606:41;;:14;:41;;;;;:54;-1:-1:-1;;;37606:74:0;37603:2532;;;-1:-1:-1;;;;;37903:13:0;;37860:10;37903:13;;;:5;:13;;;;;:20;;:27;37873:13;37887:12;37898:1;37887:8;:12;:::i;:::-;37873:27;;;;;;;;:::i;:::-;;;;;;;:57;;;;:::i;:::-;-1:-1:-1;;;;;37997:13:0;;;;;;:5;:13;;;;;:20;;:27;37860:70;;-1:-1:-1;37989:35:0;;37986:49;;;-1:-1:-1;38034:1:0;37986:49;-1:-1:-1;;;38054:13:0;38068:1;38054:16;;;;;;;;:::i;:::-;;;;;;:28;;;;;-1:-1:-1;;;38101:13:0;38115:1;38101:16;;;;;;;;:::i;:::-;;;;;;:28;;;;;38231:5;:13;38237:6;-1:-1:-1;;;;;38231:13:0;-1:-1:-1;;;;;38231:13:0;;;;;;;;;;;;:20;;38252:5;38231:27;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;-1:-1:-1;;;38231:46:0;38228:1151;;;-1:-1:-1;;;;;38365:13:0;;;;;;:5;:13;;;;;:20;;38386;;;;:27;;38355:109;;38365:20;38386;38407:5;;38386:27;;;;;;:::i;38355:109::-;38339:125;;-1:-1:-1;;;38487:13:0;38501:1;38487:16;;;;;;;;:::i;:::-;;;;;;:28;;;;;-1:-1:-1;;;38538:13:0;38552:1;38538:16;;;;;;;;:::i;:::-;;;;;;:25;;;;;38611:13;38603:22;;38586:13;38600:1;38586:16;;;;;;;;:::i;:::-;;;;;;:39;;;;;38681:5;:13;38687:6;-1:-1:-1;;;;;38681:13:0;-1:-1:-1;;;;;38681:13:0;;;;;;;;;;;;:20;;38702:5;38681:27;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;38673:42;;38656:13;38670:1;38656:16;;;;;;;;:::i;:::-;;;;;;:59;;;;;38228:1151;;;-1:-1:-1;;;;;38746:13:0;;;;;;:5;:13;;;;;:20;;:27;;38767:5;;38746:27;;;;;;:::i;:::-;;;;;;;;;;;:34;;;-1:-1:-1;;;38746:43:0;38743:636;;;-1:-1:-1;;;;;38934:13:0;;;;;;:5;:13;;;;;:20;;38955;;;;:27;;38914:76;;38934:20;38955;38976:5;;38955:27;;;;;;:::i;38914:76::-;-1:-1:-1;;;;;38886:13:0;;;;;;:5;:13;;;;;;;;:25;;:104;;;;39013:14;:22;;;;;:24;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;39060:13:0;39074:1;39060:16;;;;;;;;:::i;:::-;;;;;;:28;;;;;-1:-1:-1;;;39111:13:0;39125:1;39111:16;;;;;;;;:::i;:::-;;;;;;:22;;;;;39181:5;:13;39187:6;-1:-1:-1;;;;;39181:13:0;-1:-1:-1;;;;;39181:13:0;;;;;;;;;;;;:25;;;39173:34;;39156:13;39170:1;39156:16;;;;;;;;:::i;:::-;;;;;;:51;;;;;39257:5;:13;39263:6;-1:-1:-1;;;;;39257:13:0;-1:-1:-1;;;;;39257:13:0;;;;;;;;;;;;:20;;39278:5;39257:27;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;39249:42;;39232:13;39246:1;39232:16;;;;;;;;:::i;:::-;;;;;;;;;;;:59;;;;-1:-1:-1;;;;;39331:13:0;;;;;;:5;:13;;;;;;:20;39316:43;;39337:6;39316:14;:43::i;:::-;-1:-1:-1;;;;;39516:13:0;;;;;;:5;:13;;;;;:20;;39537:27;;:29;;39565:1;;39537:29;:::i;:::-;39516:51;;;;;;;;:::i;:::-;;;;;;;;;;;39486:5;:13;39492:6;-1:-1:-1;;;;;39486:13:0;-1:-1:-1;;;;;39486:13:0;;;;;;;;;;;;:20;;39507:5;39486:27;;;;;;;;:::i;:::-;;;;;;;;;:81;;:27;;;;;:81;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39586:13:0;;;;:5;:13;;;;;;:20;;:26;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;39586:26:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39721:13:0;;;;:5;:13;;;;;:20;;:27;39718:382;;39884:6;39880:199;39900:17;39896:1;:21;39880:199;;;-1:-1:-1;;;;;39951:13:0;;;;;;:5;:13;;;;;;;39977:77;;;;;;;;39951:20;;;39977:77;39992:10;40003:1;39992:13;;;;;;;:::i;:::-;;;;:20;39977:77;;;;40013:10;40024:1;40013:13;;;;;;;:::i;:::-;;;;:20;;;39977:77;;;;40034:10;40045:1;40034:13;;;;;;;:::i;:::-;;;;;;;;;:19;;;;;39977:77;;;39951:104;;;;;;;;-1:-1:-1;39951:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39919:3;;;;:::i;:::-;;;;39880:199;;;;39718:382;37681:2454;37603:2532;40243:10;;;;:::i;:::-;-1:-1:-1;;;;;40335:13:0;;40364:1;40335:13;;;:5;:13;;;;;:26;;;40243:10;;-1:-1:-1;40335:30:0;;-1:-1:-1;40332:1833:0;;-1:-1:-1;;;;;40406:13:0;;40434:1;40406:13;;;:5;:13;;;;;:25;;;:29;40403:1092;;-1:-1:-1;;;;;40590:13:0;;;;;;:5;:13;;;;;:26;;;;40562:25;;;;;:54;40559:917;;;-1:-1:-1;;;;;40868:13:0;;;;;;:5;:13;;;;;:26;;;;40840:25;;;;;:54;;40868:26;40840:54;:::i;:::-;-1:-1:-1;;;;;40812:13:0;;;;;;:5;:13;;;;;;;:25;;:82;;;40949:58;40812:13;;40964:9;;40949:58;;;;4957:25:1;;;4945:2;4930:18;;4811:177;40949:58:0;;;;;;;;-1:-1:-1;;;;;41034:13:0;;41063:1;41034:13;;;:5;:13;;;;;:26;;:30;;;41063:1;-1:-1:-1;40559:917:0;;;-1:-1:-1;;;;;41320:13:0;;;;;;:5;:13;;;;;:25;;;;41291:26;;;;;:54;;41320:25;41291:54;:::i;:::-;-1:-1:-1;;;;;41262:13:0;;;;;;:5;:13;;;;;;;;:26;;;:83;;;;41372:25;;;;:29;;;41428:14;:22;;;;;:24;;;;;;:::i;:::-;;;;;;40559:917;-1:-1:-1;;;;;41546:13:0;;;;;;:5;:13;;;;;:20;;41516:26;;;;;:50;41513:132;;-1:-1:-1;;;;;41625:13:0;;;;;;:5;:13;;;;;:20;;41596:26;;;;;:49;;41625:20;41596:49;:::i;:::-;-1:-1:-1;;;;;41567:13:0;;;;;;:5;:13;;;;;:26;;:78;41513:132;-1:-1:-1;;;;;41696:13:0;;;;;;:5;:13;;;;;:20;;41667:26;;;;;:49;41664:472;;;-1:-1:-1;;;;;41831:13:0;;41804:1;41831:13;;;:5;:13;;;;;:26;;;41804:1;;-1:-1:-1;41831:30:0;41828:234;;-1:-1:-1;;;;;41894:67:0;;41927:13;;;;:5;:13;;;;;;;:26;;;41894:67;;41917:9;;41894:67;;;;4957:25:1;;4945:2;4930:18;;4811:177;41894:67:0;;;;;;;;-1:-1:-1;;;;;41988:11:0;;42007:13;;;;:5;:13;;;;;;:26;;;41988:50;;42007:26;;41988:50;42007:13;41988:50;42007:26;41988:11;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41828:234;-1:-1:-1;;;;;42084:13:0;;42113:1;42084:13;;;:5;:13;;;;;:26;;:30;41664:472;-1:-1:-1;;;;;42179:22:0;;;;;;:14;:22;;;;;:24;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;42223:154:0;;42265:25;;;;:17;:25;;;;;;;;;42298:14;:22;;;;;;42335:5;:13;;;;;;;:25;;;42223:154;;42239:9;;42223:154;;;;42250:13;;42321;;42335:25;42361:15;;42223:154;:::i;:::-;;;;;;;;-1:-1:-1;;;;;42395:13:0;;;;;;:5;:13;;;;;:26;;;42392:47;;42438:1;42427:12;;42392:47;42499:18;;42488:8;:29;42485:45;;;42529:1;42518:12;;42485:45;32730:9855;;;32711:9874;;;42721:17;42705:12;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;31877:10879:0:o;46906:417::-;46991:3;;;46958:29;;-1:-1:-1;;;46958:29:0;;46981:4;46958:29;;;3390:51:1;;;;46991:3:0;-1:-1:-1;;;;;46958:4:0;:14;;;;3363:18:1;;46958:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;46950:92;;;;-1:-1:-1;;;46950:92:0;;7163:2:1;46950:92:0;;;7145:21:1;7202:2;7182:18;;;7175:30;7241:34;7221:18;;;7214:62;-1:-1:-1;;;7292:18:1;;;7285:41;7343:19;;46950:92:0;6961:407:1;46950:92:0;47074:7;;47061:9;:20;;47053:79;;;;-1:-1:-1;;;47053:79:0;;12054:2:1;47053:79:0;;;12036:21:1;12093:2;12073:18;;;12066:30;12132:34;12112:18;;;12105:62;-1:-1:-1;;;12183:18:1;;;12176:44;12237:19;;47053:79:0;11852:410:1;47053:79:0;47165:7;;:10;;47173:2;47165:10;:::i;:::-;47151:9;:25;;47143:94;;;;-1:-1:-1;;;47143:94:0;;10918:2:1;47143:94:0;;;10900:21:1;10957:2;10937:18;;;10930:30;10996:34;10976:18;;;10969:62;11067:26;11047:18;;;11040:54;11111:19;;47143:94:0;10716:420:1;47143:94:0;47270:16;47256:10;;;;;:30;;;;;;;:::i;:::-;;47248:67;;;;-1:-1:-1;;;47248:67:0;;8461:2:1;47248:67:0;;;8443:21:1;8500:2;8480:18;;;8473:30;8539:27;8519:18;;;8512:55;8584:18;;47248:67:0;8259:349:1;17074:1077:0;17184:17;17219:4;-1:-1:-1;;;;;17219:20:0;;17240:14;17256:4;17273:8;15904:1;17262:43;;;;;;;;5167:25:1;;;5223:2;5208:18;;5201:34;5155:2;5140:18;;4993:248;17262:43:0;;;;;;;;;;;;;17219:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;17541:15:0;17625:16;;;;;;;;;;;;6944:51;;;;;5477:25:1;;;5518:18;;;5511:34;;;17618:4:0;5561:18:1;;;5554:60;5630:18;;;;5623:34;;;6944:51:0;;;;;;;;;;5449:19:1;;;;6944:51:0;;;6934:62;;;;;;;;;18079:16;;;;;;;:20;;18098:1;18079:20;:::i;:::-;18060:6;:16;;;;;;;;;;;;:39;;;;7561:41;;;;;2939:19:1;;;2974:12;;;2967:28;;;7561:41:0;;;;;;;;;3011:12:1;;;;7561:41:0;;;7551:52;;;;;18106:39;17074:1077;-1:-1:-1;;;;17074:1077:0:o;31601:200::-;31662:15;31680:17;;;:6;:17;;;;;31713:13;;;;;;:22;31705:57;;;;-1:-1:-1;;;31705:57:0;;11703:2:1;31705:57:0;;;11685:21:1;11742:2;11722:18;;;11715:30;-1:-1:-1;;;11761:18:1;;;11754:52;11823:18;;31705:57:0;11501:346:1;31705:57:0;31773:13;;:20;;-1:-1:-1;;31773:20:0;31789:4;31773:20;;;-1:-1:-1;31601:200:0:o;47903:322::-;47973:31;48048:1;48034:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48034:16:0;;48017:33;;48066:9;48061:125;48085:1;48081;:5;48061:125;;;48146:26;;;;;;5167:25:1;;;5208:18;;;5201:34;;;5140:18;;48146:26:0;;;;;;;;;;;;48136:37;;;;;;48128:46;;48108:14;48123:1;48108:17;;;;;;;;:::i;:::-;;;;;;;;;;:66;48088:3;;;;:::i;:::-;;;;48061:125;;;;47903:322;;;;:::o;46458:438::-;46541:16;46572:17;46592:20;46605:6;46592:12;:20::i;:::-;46572:40;;46646:7;;46637:6;:16;;;;:::i;:::-;46623:30;;46679:11;46667:9;:23;46664:123;;;46719:23;46733:9;46719:11;:23;:::i;:::-;46705:37;;46664:123;;;46786:1;46772:15;;46664:123;46798:35;;-1:-1:-1;;;;;46798:11:0;;;46817;;46798:35;;;;46817:11;46798;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46881:6;-1:-1:-1;;;;;46849:39:0;46858:9;46849:39;46869:11;46849:39;;;;4957:25:1;;4945:2;4930:18;;4811:177;46849:39:0;;;;;;;;46530:366;;46458:438;;;:::o;43705:1095::-;43795:18;43816:21;43830:6;43816:13;:21::i;:::-;43795:42;;43848:16;43898:6;43885:10;:19;43882:115;;;43933:19;43942:10;43933:6;:19;:::i;:::-;43919:33;;43882:115;;;-1:-1:-1;43996:1:0;43882:115;44030:42;44010:17;44123:7;1910:6;;-1:-1:-1;;;;;1910:6:0;;1837:87;44123:7;-1:-1:-1;;;;;;;;43705:1095:0:o;42769:237::-;42840:14;42866:10;;42857:6;:19;;;;:::i;45197:1197::-;45310:4;;;;45414:20;45427:6;45414:12;:20::i;:::-;45394:40;;20294:1;45448:4;:16;45445:659;;;45494:6;45480:20;;45445:659;;;20376:1;45535:4;:16;:36;;;;20414:1;45555:4;:16;45535:36;:54;;;;20450:1;45575:4;:14;45535:54;45532:572;;;45631:4;;-1:-1:-1;45665:24:0;45631:4;45665:6;:24;:::i;:::-;45651:38;;45532:572;;;20336:1;45722:4;:20;45719:385;;;45782:12;45791:3;45782:6;:12;:::i;:::-;45781:18;;45797:2;45781:18;:::i;:::-;45772:27;;:6;:27;:::i;45719:385::-;-1:-1:-1;;45835:4:0;:18;45832:272;;;45884:12;45893:3;45884:6;:12;:::i;:::-;45883:18;;45899:2;45883:18;:::i;45832:272::-;-1:-1:-1;;45927:4:0;:18;45924:180;;;45976:12;45985:3;45976:6;:12;:::i;:::-;45975:18;;45991:2;45975:18;:::i;45924:180::-;-1:-1:-1;;46018:4:0;:20;46015:89;;;46069:12;46078:3;46069:6;:12;:::i;:::-;46068:18;;46084:2;46068:18;:::i;:::-;46054:32;;46015:89;46129:11;46117:9;:23;46114:123;;;46169:23;46183:9;46169:11;:23;:::i;:::-;46155:37;;46114:123;;;46236:1;46222:15;;46114:123;46248:35;;-1:-1:-1;;;;;46248:11:0;;;46267;;46248:35;;;;46267:11;46248;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46299:58:0;;;5167:25:1;;;5223:2;5208:18;;5201:34;;;-1:-1:-1;;;;;46299:58:0;;;-1:-1:-1;46309:9:0;;46299:58;;5140:18:1;46299:58:0;;;;;;;-1:-1:-1;46375:11:0;45197:1197;-1:-1:-1;;;;;;;45197:1197:0:o;44808:381::-;44880:4;;20294:1;44930:16;;44927:228;;;-1:-1:-1;44974:6:0;44927:228;;;20376:1;45005:4;:16;45002:153;;;45049:10;:6;45058:1;45049:10;:::i;:::-;45037:22;;45002:153;;;20414:1;45084:4;:16;45081:74;;;45128:10;:6;45137:1;45128:10;:::i;:::-;45116:22;;45081:74;45172:9;44808:381;-1:-1:-1;;;44808:381:0:o;47337:283::-;47397:7;47416:14;47463:3;47442:18;;47433:6;:27;;;;:::i;:::-;:33;;;;:::i;:::-;47416:50;;47495:25;;47483:9;:37;47479:107;;;-1:-1:-1;47549:25:0;;47479:107;47603:9;47337:283;-1:-1:-1;;47337:283:0:o;47626:267::-;47687:7;47706:15;47747:3;47733:11;;47724:6;:20;;;;:::i;:::-;:26;;;;:::i;:::-;47706:44;;47780:18;;47767:10;:31;47763:95;;;-1:-1:-1;47828:18:0;;47875:10;47626:267;-1:-1:-1;;47626:267:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;522:452::-;608:6;616;624;632;685:3;673:9;664:7;660:23;656:33;653:53;;;702:1;699;692:12;653:53;741:9;728:23;760:31;785:5;760:31;:::i;:::-;810:5;862:2;847:18;;834:32;;-1:-1:-1;913:2:1;898:18;;885:32;;964:2;949:18;936:32;;-1:-1:-1;522:452:1;-1:-1:-1;;;522:452:1:o;979:277::-;1046:6;1099:2;1087:9;1078:7;1074:23;1070:32;1067:52;;;1115:1;1112;1105:12;1067:52;1147:9;1141:16;1200:5;1193:13;1186:21;1179:5;1176:32;1166:60;;1222:1;1219;1212:12;1261:180;1320:6;1373:2;1361:9;1352:7;1348:23;1344:32;1341:52;;;1389:1;1386;1379:12;1341:52;-1:-1:-1;1412:23:1;;1261:180;-1:-1:-1;1261:180:1:o;1446:248::-;1514:6;1522;1575:2;1563:9;1554:7;1550:23;1546:32;1543:52;;;1591:1;1588;1581:12;1543:52;-1:-1:-1;;1614:23:1;;;1684:2;1669:18;;;1656:32;;-1:-1:-1;1446:248:1:o;1884:184::-;1954:6;2007:2;1995:9;1986:7;1982:23;1978:32;1975:52;;;2023:1;2020;2013:12;1975:52;-1:-1:-1;2046:16:1;;1884:184;-1:-1:-1;1884:184:1:o;2073:315::-;2149:6;2157;2165;2218:2;2206:9;2197:7;2193:23;2189:32;2186:52;;;2234:1;2231;2224:12;2186:52;-1:-1:-1;;2257:23:1;;;2327:2;2312:18;;2299:32;;-1:-1:-1;2378:2:1;2363:18;;;2350:32;;2073:315;-1:-1:-1;2073:315:1:o;2393:384::-;2478:6;2486;2494;2502;2555:3;2543:9;2534:7;2530:23;2526:33;2523:53;;;2572:1;2569;2562:12;2523:53;-1:-1:-1;;2595:23:1;;;2665:2;2650:18;;2637:32;;-1:-1:-1;2716:2:1;2701:18;;2688:32;;2767:2;2752:18;2739:32;;-1:-1:-1;2393:384:1;-1:-1:-1;2393:384:1:o;4040:766::-;4272:1;4268;4263:3;4259:11;4255:19;4247:6;4243:32;4232:9;4225:51;4206:4;4295:2;4333:6;4328:2;4317:9;4313:18;4306:34;4376:2;4371;4360:9;4356:18;4349:30;4408:6;4402:13;4451:6;4446:2;4435:9;4431:18;4424:34;4476:1;4486:141;4500:6;4497:1;4494:13;4486:141;;;4596:14;;;4592:23;;4586:30;4561:17;;;4580:3;4557:27;4550:67;4515:10;;4486:141;;;4645:6;4642:1;4639:13;4636:92;;;4716:1;4710:3;4701:6;4690:9;4686:22;4682:32;4675:43;4636:92;-1:-1:-1;4789:2:1;4768:15;-1:-1:-1;;4764:29:1;4749:45;;;;4796:3;4745:55;;4040:766;-1:-1:-1;;;;;4040:766:1:o;9997:356::-;10199:2;10181:21;;;10218:18;;;10211:30;10277:34;10272:2;10257:18;;10250:62;10344:2;10329:18;;9997:356::o;13766:992::-;14048:4;14096:3;14085:9;14081:19;14127:6;14116:9;14109:25;14153:2;14191:6;14186:2;14175:9;14171:18;14164:34;14234:6;14229:2;14218:9;14214:18;14207:34;14277:3;14272:2;14261:9;14257:18;14250:31;14301:6;14336;14330:13;14367:6;14359;14352:22;14405:3;14394:9;14390:19;14383:26;;14444:2;14436:6;14432:15;14418:29;;14465:1;14475:169;14489:6;14486:1;14483:13;14475:169;;;14550:13;;14538:26;;14619:15;;;;14584:12;;;;14511:1;14504:9;14475:169;;;-1:-1:-1;;14695:3:1;14680:19;;14673:35;;;;-1:-1:-1;;;14739:3:1;14724:19;14717:35;14661:3;13766:992;-1:-1:-1;;;;13766:992:1:o;14763:128::-;14803:3;14834:1;14830:6;14827:1;14824:13;14821:39;;;14840:18;;:::i;:::-;-1:-1:-1;14876:9:1;;14763:128::o;14896:120::-;14936:1;14962;14952:35;;14967:18;;:::i;:::-;-1:-1:-1;15001:9:1;;14896:120::o;15021:168::-;15061:7;15127:1;15123;15119:6;15115:14;15112:1;15109:21;15104:1;15097:9;15090:17;15086:45;15083:71;;;15134:18;;:::i;:::-;-1:-1:-1;15174:9:1;;15021:168::o;15194:125::-;15234:4;15262:1;15259;15256:8;15253:34;;;15267:18;;:::i;:::-;-1:-1:-1;15304:9:1;;15194:125::o;15324:135::-;15363:3;-1:-1:-1;;15384:17:1;;15381:43;;;15404:18;;:::i;:::-;-1:-1:-1;15451:1:1;15440:13;;15324:135::o;15464:112::-;15496:1;15522;15512:35;;15527:18;;:::i;:::-;-1:-1:-1;15561:9:1;;15464:112::o;15581:127::-;15642:10;15637:3;15633:20;15630:1;15623:31;15673:4;15670:1;15663:15;15697:4;15694:1;15687:15;15713:127;15774:10;15769:3;15765:20;15762:1;15755:31;15805:4;15802:1;15795:15;15829:4;15826:1;15819:15;15845:127;15906:10;15901:3;15897:20;15894:1;15887:31;15937:4;15934:1;15927:15;15961:4;15958:1;15951:15;15977:127;16038:10;16033:3;16029:20;16026:1;16019:31;16069:4;16066:1;16059:15;16093:4;16090:1;16083:15;16109:127;16170:10;16165:3;16161:20;16158:1;16151:31;16201:4;16198:1;16191:15;16225:4;16222:1;16215:15;16241:127;16302:10;16297:3;16293:20;16290:1;16283:31;16333:4;16330:1;16323:15;16357:4;16354:1;16347:15;16373:131;-1:-1:-1;;;;;16448:31:1;;16438:42;;16428:70;;16494:1;16491;16484:12

Swarm Source

ipfs://0af45f4dd3837b9004631202977fac5460d2362e6f4f744b68f21e1543a01055
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading