Contract 0x42a47C131b613c115780aea7bD589F291b3dd7ca

 

Contract Overview

Balance:
213.77152 MATIC

MATIC Value:
$181.47 (@ $0.85/MATIC)

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x52481bd9bdf12ad42ba8e83e608b66887d2e2b01512bc36ce4098c358c1e3ce8Play Game296170722022-06-15 23:56:23111 days 19 hrs ago0x1a91489dd8f74bde7b217c6c68185e38c6748f7f IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.008352872249 30.456368479
0x5f4ecece0816bd3a10644af841e4d5eeddf0533e6f736b8039797a236e84707aPlay Game296170032022-06-15 23:54:01111 days 19 hrs ago0x1a91489dd8f74bde7b217c6c68185e38c6748f7f IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.057330303806 32.084690041
0x47f8259a8c0ed9f9e6048f3b95fd4ae9429204b27d704445d5cb4264e3b295a4Play Game284042922022-05-16 21:46:14141 days 21 hrs ago0x2a4c04c9330c555f04294d41c1a5b391a840ac00 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.009135194678 33.310341769
0x1f7f9767f3a0f5d3425ad1a72a93416f6c5a0265f71ef3a2ffaefc108a838d8bPlay Game284042582022-05-16 21:45:02141 days 22 hrs ago0x2a4c04c9330c555f04294d41c1a5b391a840ac00 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.010321272045 37.635224144
0xced9dfe22ad0aec17df11fe7291a9148a5186b82873a08cfd78bd4f445c3459aPlay Game284042302022-05-16 21:44:06141 days 22 hrs ago0x2a4c04c9330c555f04294d41c1a5b391a840ac00 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.008256458729 30.106141333
0x2eece8456ed7bab21b638b409ab42118c7244ffcf634f6fd8f42602452186173Play Game284042052022-05-16 21:43:12141 days 22 hrs ago0x2a4c04c9330c555f04294d41c1a5b391a840ac00 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.057191582011 32.00726986
0x0938485eb44cdfd51a7bd865a5a72516a04b726bdb5643f9acdc2156a3b10d53Play Game282828752022-05-13 21:47:11144 days 21 hrs ago0x4093a9381bd9c3219bc3c81044e87fdd0bf586c1 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.056397579787 31.562694533
0x8d4cabe96fc667e5ef2c364e43f188d9e1b8c9729d885206feb52f1870ffefa3Play Game282250202022-05-12 9:47:50146 days 9 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.0589571 100
0x21d87e3d576f41204507ba324bf755b2ed14762168f19b32f5d101f5481ce9c6Play Game281772412022-05-11 4:10:09147 days 15 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.063255 100
0x1468417d1bd5b9fc3ab14e07bf8c71a8276dd79e6af714413707698522dbb6d4Play Game281367162022-05-10 3:35:37148 days 16 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.0589571 100
0x93ad12f21a703679a7720ecb30b464eaba85f4910ab7b71356cf31356ba8e2e3Play Game280967442022-05-09 3:32:42149 days 16 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.0589571 100
0x60b4ba9157bf1737fa62fbae3e0ba29aed7cc89c8720072b1052b9870d267448Play Game280010462022-05-06 18:24:06152 days 1 hr ago0xac68b979ebdceb2d90ac9a67390d6e7c1bbe6636 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.041822731812 70.93756615
0xb7405fca803ed748764907b8087a59663ccbb07155f7007246251f28297d8a1aPlay Game280006502022-05-06 18:08:20152 days 1 hr ago0xac68b979ebdceb2d90ac9a67390d6e7c1bbe6636 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca6 MATIC0.017880031971 60.728234746
0xf84304a19234d2a5d04c63a98aca907b4d5e9cd161df1760e3993ff424e0284cPlay Game280006132022-05-06 18:07:02152 days 1 hr ago0xac68b979ebdceb2d90ac9a67390d6e7c1bbe6636 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca6 MATIC0.014370352659 48.807862932
0x57672f2d71e0031b8fb4f1f26ed136e85fef9dae5445f41aed9c1c9cf48cf5b4Play Game280005482022-05-06 18:04:48152 days 1 hr ago0xac68b979ebdceb2d90ac9a67390d6e7c1bbe6636 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.084483449348 47.280846358
0x65ad5031b93d3665a8e7137ce127991636789084e0e4620e6948d42b57e09eabPlay Game279771282022-05-06 3:25:04152 days 16 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.063255 100
0xd8519bdaa6465c31551c585c61f7e96de3d8ecd8140fa102c464669956ed91daPlay Game279395832022-05-05 4:30:52153 days 15 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.0589571 100
0x15d13ecddac4c13e101ecf3436ca240e503ca770c11d558f4c7b97e2d1425d9ePlay Game279002812022-05-04 4:16:55154 days 15 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.063255 100
0x91b864b3fb5f6647ecf1aa19a2112fdb0df6c31916bab98269781e0a6220ea62Withdraw Amount279002622022-05-04 4:16:17154 days 15 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca0 MATIC0.0030745 100
0x9cb649c9f12b37a34c367624667ac79738e0209814edf8a409aea78eff615dd1Play Game278602262022-05-03 3:58:40155 days 15 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.0589571 100
0x68745f0be6c8ca735d57bbf40faa2196fa32da76be01eccd8702ad3d0a601c3ePlay Game278247102022-05-02 6:09:32156 days 13 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca6 MATIC0.0607947 100
0xca47492cf087ee092f041a96ee6bdcfe4c733b0617cf808da76b36edc511ad8aPlay Game278204162022-05-02 3:33:09156 days 16 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.0589571 100
0x0b27b456a2280ef8c388e35a14b09f66fc655508a502cd25457d30e80f35a2a4Play Game277677332022-04-30 20:10:00157 days 23 hrs ago0xc20c363b6e077276da6f9b21d56fe4d4cc5c8f1b IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.063275170362 35.411712368
0xe9eb9198dc8c1f004d583b9eab84ae877367eea6b6b3c8a34d6c4d6fafb2385bPlay Game277012052022-04-29 3:21:31159 days 16 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.0589571 100
0x37a5ed3fb4f2c5274ecf70b1c4ab2dee489183e37dfb65293ea2176846c745e1Play Game276698342022-04-28 8:17:29160 days 11 hrs ago0xb1c71c6c9ab9748f24720c8a8aaef3aee4460698 IN  0x42a47c131b613c115780aea7bd589f291b3dd7ca2 MATIC0.0589571 100
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x654cc03d45ff8d05d2c39a920efbdd3398d1c329468a5d042c8bc4b3089ac09d284042422022-05-16 21:44:30141 days 22 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0x2a4c04c9330c555f04294d41c1a5b391a840ac003.94 MATIC
0xa0bb929e4c58513580cb3e7834577f5e086eaab0dbd6034049589cdfbc56eb70284042172022-05-16 21:43:36141 days 22 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0x2a4c04c9330c555f04294d41c1a5b391a840ac000.94 MATIC
0x30e3118d8923038a183db099ec65cb32935f8aa853f7b8aed6c26e0f33650702282250332022-05-12 9:48:20146 days 9 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0x8811e2033929a27e572f13a010dfb19d700b0ad8441d6f098202634c95a493c7281367282022-05-10 3:36:01148 days 16 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606980.44 MATIC
0xcf44b293e965001cd56d9714fdb56994cdc5b8ff026a564fd3a07e81d43ca285280010582022-05-06 18:24:30152 days 1 hr ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xac68b979ebdceb2d90ac9a67390d6e7c1bbe66360.94 MATIC
0xb96a51b0884e62e16d9eb33d120b537c537d8816e5cac251b7cb42c67255d784280006622022-05-06 18:08:44152 days 1 hr ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xac68b979ebdceb2d90ac9a67390d6e7c1bbe66367.94 MATIC
0xd872b86382b42041e264d9223d554dd0d0e749cceda6ee3ac63283ec3401ef19280006252022-05-06 18:07:26152 days 1 hr ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xac68b979ebdceb2d90ac9a67390d6e7c1bbe66363.94 MATIC
0xd872b86382b42041e264d9223d554dd0d0e749cceda6ee3ac63283ec3401ef19280006252022-05-06 18:07:26152 days 1 hr ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xac68b979ebdceb2d90ac9a67390d6e7c1bbe66361.94 MATIC
0xcd55aeb781bb9404fd1b8bab3a1eb36310ce1cbda68436aca69daba37c944a88279395952022-05-05 4:31:20153 days 15 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606980.44 MATIC
0x91b864b3fb5f6647ecf1aa19a2112fdb0df6c31916bab98269781e0a6220ea62279002622022-05-04 4:16:17154 days 15 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee446069821.58128 MATIC
0x16ee87fd4c81ce5366b02bbec183af8547c9c56c933f8b66a9f2cc1339e04123278602382022-05-03 3:59:04155 days 15 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606980.44 MATIC
0x3822dcab80c34c44fe33070587b0d1a112e07a0280756f207d7cadeaee0662d7278247222022-05-02 6:09:56156 days 13 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0x4764e61f1c14f46835fdb7b07ed5f34d284fbeea250e4a08f6d9ffb149f2fce0276698462022-04-28 8:17:53160 days 11 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0x1ab30d06c41a5288a83c3acc73ab3d9d2aeeb56b228f6a2b2469e9c04ec681cf276697952022-04-28 8:16:07160 days 11 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0x48c6e090f25410461282a98f575956b9da26729682646ffa88349c0ed7f01fe1276697602022-04-28 8:14:57160 days 11 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0x150fe39ad6f727a0e501b0bf6d1f61580f5d2258fc9aeaaa03aa1fa96612f249276697182022-04-28 8:13:29160 days 11 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606980.44 MATIC
0x6f92246d6eae56068660a5f0b2b86466d57f3871e8a09a0310d507e78ec11900276696362022-04-28 8:10:41160 days 11 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0xd3832cf4633f7be9509b11b05fa5ed301ba5e8b36669107c9b07b8c72730c4af276695372022-04-28 8:07:15160 days 11 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606980.44 MATIC
0xbaefbc472b7156173ab70af0566b1ee0e49b9add2a47a9232f01ed931337795d276694292022-04-28 8:03:31160 days 11 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0x7792f7556e715153a165c625ee42c458986139623fef2179093bacddb4f523fd276689462022-04-28 7:45:27160 days 12 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606980.94 MATIC
0xb6219e495d524c50e96174097880673c93fe1ad7701fc2ea119c427b2f5074eb276689052022-04-28 7:43:23160 days 12 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0xfe8d6b2c6f341290785b14ce712ab9ed8ad3fff7717504a892eba7c55b0676e1276688152022-04-28 7:40:19160 days 12 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606983.94 MATIC
0xfe8d6b2c6f341290785b14ce712ab9ed8ad3fff7717504a892eba7c55b0676e1276688152022-04-28 7:40:19160 days 12 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606980.94 MATIC
0xfe8d6b2c6f341290785b14ce712ab9ed8ad3fff7717504a892eba7c55b0676e1276688152022-04-28 7:40:19160 days 12 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.94 MATIC
0xfe8d6b2c6f341290785b14ce712ab9ed8ad3fff7717504a892eba7c55b0676e1276688152022-04-28 7:40:19160 days 12 hrs ago 0x42a47c131b613c115780aea7bd589f291b3dd7ca0xb1c71c6c9ab9748f24720c8a8aaef3aee44606981.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-13
*/

// SPDX-License-Identifier: MIT
// 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 = true;
    
    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(
            0x3d2341ADb2D31f1c5530cDC622016af293177AE0, // VRF Coordinator
            0xb0897686c545045aFc77CF20eC7A532E3120E0F1  // LINK Token
        )
    {
        MIN_BET = 2 ether;
        MAX_BET = 100 ether;    
        HOUSE_EDGE_MINIMUM_AMOUNT = 0.05 ether;
        NFT_MINIMUM_AMOUNT = 0.1 ether;
        keyHash = 0xf86195cf7690c55907b2b611ebb7343a6f649bff128701cc542f0569e2c549da;
        fee = 0.0001 * 10 ** 18; // 0.1 LINK (Varies by network)
        gameStatus = GAMESTAT.RUNNING;
        initializeBoard();
    }

    // board
    function initializeBoard() private {
        nftaddress = 0xB66e622E11D5102Fb0c797A67aEB92504B71ebe4;
        //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);
                        (bool success, /* bytes memory data */) = player.call{value: games[player].multiple_bet}("");
                        require(success, "receiver rejected balance transfer");
                    }
                    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;
        (bool success, /* bytes memory data */) = player.call{value: amountToPay}("");
        require(success, "receiver rejected reward transfer");
        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;
        (bool success, /* bytes memory data */) = player.call{value: amountToPay}("");
        require(success, "receiver rejected bonus transfer");
        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 getLockedInBets() public view onlyOwner returns (uint256) {
        return lockedInBets;
    }

    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 changeLockedInBets(uint256 _lockedBets) public onlyOwner  {
        lockedInBets = _lockedBets;
    }

    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 Security Audit

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":"_lockedBets","type":"uint256"}],"name":"changeLockedInBets","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":"getLockedInBets","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"}]

60c060405260016008556003600955600a600c556003600d55600a600f553480156200002a57600080fd5b507f3d2341adb2d31f1c5530cdc622016af293177ae000000000000000000000000060a0527fb0897686c545045afc77cf20ec7a532e3120e0f10000000000000000000000006080526200007e33620000fb565b6001600255671bc16d674ec8000060065568056bc75e2d6310000060075566b1a2bc2ec50000600e5567016345785d8a00006010557ff86195cf7690c55907b2b611ebb7343a6f649bff128701cc542f0569e2c549da600355655af3107a40006004556055805460ff19169055620000f56200014d565b62001729565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a80546001600160a01b03191673b66e622e11d5102fb0c797a67aeb92504b71ebe4178155604080518082018252641cdd185c9d60da1b815260006020808301828152828052601880835293517f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd755517f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd85583518085018552631c995b9d60e21b808252818301848152600180865286855292517ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4d55517ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4e55855180870187526d18dbdb5b5d5b9a5d1e58da195cdd60921b808252818501868152600280885288875292517f2bacf7cca723d030d12aee795132f2c5f2d14ad131f16f3f27eeba3e79d18b8c55517f2bacf7cca723d030d12aee795132f2c5f2d14ad131f16f3f27eeba3e79d18b8d5587518089018952620e8c2f60eb1b8082528187018681526003808a528a895292517f7a6340a7048c03c55288da75abed74d2ce9194201bafb03be53c0a7cca59149555517f7a6340a7048c03c55288da75abed74d2ce9194201bafb03be53c0a7cca591496558951808b018b52651c995dd85c9960d21b8082528189018681526004808c528c8b5292517f5b650d93b25a5c652bc6f9215f522b521daf6d36977dcec1343c2a8310b869d655517f5b650d93b25a5c652bc6f9215f522b521daf6d36977dcec1343c2a8310b869d7558b51808d018d52878152808a018b815260058c528c8b5290517f2288853b49db4f36075bf4a8cfdae4e5e3b39b7b03937d0a9148b051a6f64c5c55517f2288853b49db4f36075bf4a8cfdae4e5e3b39b7b03937d0a9148b051a6f64c5d558b51808d018d52878152808a018b815260068c528c8b5290517f33d69b83f8d9644c8360a50d7275bf12a50019a4cd4e17926d0b315da648c58d55517f33d69b83f8d9644c8360a50d7275bf12a50019a4cd4e17926d0b315da648c58e558b51808d018d52656368616e636560d01b808252818b018c815260078d528d8c5291517f0aaa0ccf1df0cbc345d3ab7229415a03568bb157ac6e99a99e7acfb410c400f55590517f0aaa0ccf1df0cbc345d3ab7229415a03568bb157ac6e99a99e7acfb410c400f6558c51808e018e52828152808b018a815260088d528d8c5290517fd216758a0109d96b1547bf0494303db8f870cdf26fb578fa6df610e0d82abc5a55517fd216758a0109d96b1547bf0494303db8f870cdf26fb578fa6df610e0d82abc5b558c51808e018e52888152808b018c81526009808e528e8d5291517f0f80ca4e91d4e32d5a64ddd95a11ac123155f01483fcd9878a3704cd57c880b555517f0f80ca4e91d4e32d5a64ddd95a11ac123155f01483fcd9878a3704cd57c880b6558d51808f018f52838152808c018981529f8d528d8c52517f97bd3d4217cc234631fd1bc3bbc8dcdba6dbc663edbe04a3d8e3d1afc6fbf207559d517f97bd3d4217cc234631fd1bc3bbc8dcdba6dbc663edbe04a3d8e3d1afc6fbf208558c51808e018e52888152808b018c8152600b8d528d8c5290517f708fe867eed89ed512a42b707e8d76b3f0636bc9091ed7bd1accea46f030a75955517f708fe867eed89ed512a42b707e8d76b3f0636bc9091ed7bd1accea46f030a75a558c51808e018e52828152808b019e8f52600c8c528c8b52517f0d0ebdbcfcc074ed98d6e77259dcf308299e0fc425bbd9eb22ee4e1d6024eebd559c517f0d0ebdbcfcc074ed98d6e77259dcf308299e0fc425bbd9eb22ee4e1d6024eebe558b51808d018d52878152808a018b8152600d8c528c8b5290517f9f54e10f2b34037c7b3dbc8b147ae978b2f5629a4965b815941ce1b59e8e3e8055517f9f54e10f2b34037c7b3dbc8b147ae978b2f5629a4965b815941ce1b59e8e3e81558b51808d018d52878152808a018b8152600e8c528c8b5290517feba5a561184a3ad28e26279c1e0509594a1144734b254549c6df63e2ac46dffa55517feba5a561184a3ad28e26279c1e0509594a1144734b254549c6df63e2ac46dffb558b51808d018d52878152808a018b8152600f8c528c8b5290517f0c2f1a7617834a7162b7580bfe95f6e3f7a6370e6a0ecd1500d6f186d7e07f4f55517f0c2f1a7617834a7162b7580bfe95f6e3f7a6370e6a0ecd1500d6f186d7e07f50558b51808d018d52818152808a0187815260108c528c8b5290517f40e11fb237babf359ad528499083b89a823331f0e666f4e65c66bcda714ba70855517f40e11fb237babf359ad528499083b89a823331f0e666f4e65c66bcda714ba709558b51808d018d52858152808a018b815260118c528c8b5290517f64d41bdb2ca9f4fa8e2762bef85267f0d90ccef534fa1a02e77c849957957a8c55517f64d41bdb2ca9f4fa8e2762bef85267f0d90ccef534fa1a02e77c849957957a8d558b51808d018d52878152808a018b815260128c528c8b5290517f7a4af925afecb059c2843c626e2447607d353a8af79743cda1ecb04891ab3fbe55517f7a4af925afecb059c2843c626e2447607d353a8af79743cda1ecb04891ab3fbf558b51808d018d52878152808a018b815260138c528c8b5290517fa662e6e83040f60a65ced71c22404e8127a66cb1a807be991e0406edace3c4aa55517fa662e6e83040f60a65ced71c22404e8127a66cb1a807be991e0406edace3c4ab558b51808d018d52818152808a0185815260148c528c8b5290517f64513dc24b777328b4a215781564150ff8ac199c8c7b7df7cb4afd85345c690e55517f64513dc24b777328b4a215781564150ff8ac199c8c7b7df7cb4afd85345c690f558b51808d018d52878152808a018b815260158c528c8b5290517fa6854583ffd97071f3ac22440174c6a4b5fe9f76b68a7795df7d0c732b38d48555517fa6854583ffd97071f3ac22440174c6a4b5fe9f76b68a7795df7d0c732b38d486558b51808d018d528d8152808a018b815260168c528c8b5290517f633c2d9f6ed3de97d498c3195c70db4b9b727c5bdae7ca054e2b5f879711517e55517f633c2d9f6ed3de97d498c3195c70db4b9b727c5bdae7ca054e2b5f879711517f558b51808d018d52878152808a018b815260178c528c8b5290517f9a42d7147904c13aa9da4b938924233fdd240592bad3fe86ca38ed831cb38e9155517f9a42d7147904c13aa9da4b938924233fdd240592bad3fe86ca38ed831cb38e92558b51808d018d52818152808a018981528c8c528c8b5290517fe909da5a13c52b40487f6e59951b40a5aec0d22c4cb63350ef95f48e29c05aad55517fe909da5a13c52b40487f6e59951b40a5aec0d22c4cb63350ef95f48e29c05aae558b51808d018d52878152808a018b815260198c528c8b5290517f017eee4fc6847fd99a7a3d4ce90c4ee375111a287064aad2d446e06a14ee940c55517f017eee4fc6847fd99a7a3d4ce90c4ee375111a287064aad2d446e06a14ee940d558b51808d018d52878152808a018b8152601a8c528c8b5290517f0739d9969bc47fdacde70a1c714fe934785a438668e4e56234e27ff945bf0dbd55517f0739d9969bc47fdacde70a1c714fe934785a438668e4e56234e27ff945bf0dbe558b51808d018d52878152808a018b8152601b8c528c8b5290517fc48ec664273fd18a09aa425f8d67c83aeff4ed71afedb2c3a5d4f516e931fc6355517fc48ec664273fd18a09aa425f8d67c83aeff4ed71afedb2c3a5d4f516e931fc64558b51808d018d52818152808a01878152601c8c528c8b5290517f523317c7f28d4bcb967f55d0e69b53d3f8d08c297aa50b35f12483cfb17a723655517f523317c7f28d4bcb967f55d0e69b53d3f8d08c297aa50b35f12483cfb17a7237558b51808d018d52878152808a018b8152601d8c528c8b5290517f82f3726761d77db1f20e348093787f279414782620c9b9800a19df39eebb8a4955517f82f3726761d77db1f20e348093787f279414782620c9b9800a19df39eebb8a4a558b51808d018d52818152808a01838152601e8c528c8b5290517f69d8eb67798bec4b507f7f3fa7b553187938142c5efc56292d573f1ce017d7e555517f69d8eb67798bec4b507f7f3fa7b553187938142c5efc56292d573f1ce017d7e6558b51808d018d52878152808a018b8152601f8c528c8b5290517f7cc7a22fb0960311578a8fabd87141ea55fcab56ba7cc59d9ee0c3d8f9cf21f655517f7cc7a22fb0960311578a8fabd87141ea55fcab56ba7cc59d9ee0c3d8f9cf21f7558b51808d018d52818152808a018981528a8c528c8b5290517f026d063f45d9e73f24a90919d0af008e7c376a6e5273e39ebd598dc55dca66fb55517f026d063f45d9e73f24a90919d0af008e7c376a6e5273e39ebd598dc55dca66fc558b51808d018d529485528489018a815260218b528b8a5294517f8018f4056a557334b30667ba1616cba36b65fbff0da517c2d7b0e70eb2930a9f5593517f8018f4056a557334b30667ba1616cba36b65fbff0da517c2d7b0e70eb2930aa0558a51808c018c528681528089018a815260228b528b8a5290517faab0bbd6880e7bac0549e8805cefa5c5b9ae280a02edf57a9b28beff7adcca1e55517faab0bbd6880e7bac0549e8805cefa5c5b9ae280a02edf57a9b28beff7adcca1f558a51808c018c528681528089018a815260238b528b8a5290517f05fd68bbca2caae6c9bfcc242a5a1410a7ce5ba52404f93aaf0b4578346e449055517f05fd68bbca2caae6c9bfcc242a5a1410a7ce5ba52404f93aaf0b4578346e4491558a51808c018c529b8c528b880189815260248a528a89529b517f88930753d24c7ac995fc00031ff7f598a0a121fc78613f53dab4acd8c1250755559a517f88930753d24c7ac995fc00031ff7f598a0a121fc78613f53dab4acd8c1250756558951808b018b5283815280880185815260258a528a895290517fbd5881717d364c9ed36bebee6e54a68463113b4cdc321b0a71b9e63ff29a967355517fbd5881717d364c9ed36bebee6e54a68463113b4cdc321b0a71b9e63ff29a9674558951808b018b529081528087018681526026895289885290517f7523c87c2851df77992737a047c1de47d72fbc2ed94114a9b57f1a702c3bd0ec55517f7523c87c2851df77992737a047c1de47d72fbc2ed94114a9b57f1a702c3bd0ed558851808a018a529384528386018781526027885297865292517fee612f87d4527f3c94438448ae7dc2b7e2b04366946a6f1646f016440f0c2c5d5595517fee612f87d4527f3c94438448ae7dc2b7e2b04366946a6f1646f016440f0c2c5e558651606080820189528782526000198287018190529189018790526037888155603883905560399790975588518082018a528881528087018390528901859052603a889055603b829055603c9490945587518085018952878152600119818701819052908901839052603d889055603e819055603f92909255875180850189528781528086018290528801839052868855604155604291909155855191820186529381529081019290925291810183905291600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600581525060376005600a811062001182576200118262001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600681525060376006600a8110620011e557620011e562001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600781525060376007600a811062001248576200124862001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600881525060376008600a8110620012ab57620012ab62001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600981525060376009600a81106200130e576200130e62001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600081525060196000600a811062001371576200137162001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600181525060196001600a8110620013d457620013d462001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600281525060196002600a811062001437576200143762001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600381525060196003600a81106200149a576200149a62001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600481525060196004600a8110620014fd57620014fd62001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600581525060196005600a811062001560576200156062001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600681525060196006600a8110620015c357620015c362001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600781525060196007600a811062001626576200162662001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016001198152602001600881525060196008600a811062001689576200168962001713565b600302016000820151816000015560208201518160010155604082015181600201559050506040518060600160405280651c995dd85c9960d21b81526020016000198152602001600981525060196009600a8110620016ec57620016ec62001713565b60030201600082015181600001556020820151816001015560408201518160020155905050565b634e487b7160e01b600052603260045260246000fd5b60805160601c60a05160601c6142db620017716000396000818161126d0152613630015260008181610c7301528181611117015281816133cf015261360101526142db6000f3fe6080604052600436106102135760003560e01c80638d25af0411610118578063c1ff808d116100a0578063e2ca1df91161006f578063e2ca1df9146105a7578063e8147a25146105c7578063e8244d48146105e7578063f0a7968014610607578063f2fde38b1461062757600080fd5b8063c1ff808d14610527578063d7e5ea8114610547578063df320b2914610567578063df3e1d831461058757600080fd5b80639f1733b7116100e75780639f1733b71461049f578063a1a60557146104bf578063ae47a290146104df578063b264c6d3146104ff578063b6a2d8a41461051257600080fd5b80638d25af041461042d5780638da5cb5b146104425780638dc654a21461046a57806394985ddd1461047f57600080fd5b8063495d040b1161019b5780636f8fe3581161016a5780636f8fe358146103a3578063715018a6146103c357806376552b34146103d85780637c7c563c146103f85780637e1fe3d51461041857600080fd5b8063495d040b14610326578063499831f2146103465780634c7389091461035b57806350c5f9751461038e57600080fd5b8063340a76ef116101e2578063340a76ef146102915780633ccfd60b146102b15780633f31ec43146102c6578063415e4e32146102e6578063492b7a1d1461030657600080fd5b80630562b9f71461021f5780630a9678c5146102415780631e6e46ec146102615780632912ba5f1461028957600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061023f61023a366004613fc2565b610647565b005b34801561024d57600080fd5b5061023f61025c366004614042565b6106cc565b34801561026d57600080fd5b5061027661074f565b6040519081526020015b60405180910390f35b61023f610783565b34801561029d57600080fd5b5061023f6102ac366004613f2b565b610905565b3480156102bd57600080fd5b5061023f610951565b3480156102d257600080fd5b5061023f6102e1366004613fc2565b610b0c565b3480156102f257600080fd5b5061023f610301366004613fc2565b610b3b565b34801561031257600080fd5b5061023f610321366004614016565b610b6a565b34801561033257600080fd5b5061023f610341366004613fc2565b610bc2565b34801561035257600080fd5b5061023f610bf1565b34801561036757600080fd5b50336000908152605660205260409020544760408051928352602083019190915201610280565b34801561039a57600080fd5b50610276610c31565b3480156103af57600080fd5b5061023f6103be366004613fc2565b610cfa565b3480156103cf57600080fd5b5061023f610d29565b3480156103e457600080fd5b5061023f6103f3366004613f2b565b610d5f565b34801561040457600080fd5b5061023f610413366004614042565b610f0d565b34801561042457600080fd5b50610276610f65565b34801561043957600080fd5b5061023f61109a565b34801561044e57600080fd5b506001546040516001600160a01b039091168152602001610280565b34801561047657600080fd5b5061023f6110d8565b34801561048b57600080fd5b5061023f61049a366004613fdb565b611262565b3480156104ab57600080fd5b5061023f6104ba366004613fc2565b6112e8565b3480156104cb57600080fd5b5061023f6104da366004613fc2565b611317565b3480156104eb57600080fd5b5061023f6104fa366004613fc2565b611346565b61027661050d366004613f65565b611375565b34801561051e57600080fd5b506102766118a2565b34801561053357600080fd5b5061023f610542366004613fc2565b6118d6565b34801561055357600080fd5b5061023f610562366004613f2b565b611905565b34801561057357600080fd5b5061023f610582366004613fc2565b611951565b34801561059357600080fd5b5061023f6105a2366004613fc2565b611b63565b3480156105b357600080fd5b5061023f6105c2366004613fc2565b611bc7565b3480156105d357600080fd5b5061023f6105e2366004613fc2565b611bf6565b3480156105f357600080fd5b5061023f610602366004613fc2565b611c25565b34801561061357600080fd5b5061023f610622366004613fc2565b611c54565b34801561063357600080fd5b5061023f610642366004613f2b565b611c83565b6001546001600160a01b0316331461067a5760405162461bcd60e51b8152600401610671906140e0565b60405180910390fd5b600061068e6001546001600160a01b031690565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f193505050501580156106c7573d6000803e3d6000fd5b505050565b6001546001600160a01b031633146106f65760405162461bcd60e51b8152600401610671906140e0565b604051806060016040528084815260200183815260200182815250601985600a811061072457610724614264565b6003020160008201518160000155602082015181600101556040820151816002015590505050505050565b6001546000906001600160a01b0316331461077c5760405162461bcd60e51b8152600401610671906140e0565b5060055490565b333134111561079157600080fd5b33600090815260166020526040902054806107df5760405162461bcd60e51b815260206004820152600e60248201526d052657175657374494420697320360941b6044820152606401610671565b336000908152601360205260409020600181015434146108415760405162461bcd60e51b815260206004820152601e60248201527f506c656173652070617920746865206170706c696361626c65207461782100006044820152606401610671565b600081600101541161088a5760405162461bcd60e51b81526020600482015260126024820152714e6f2054617820746f20626520706169642160701b6044820152606401610671565b33600090815260156020526040902054806108a4816141dd565b6001840154604080519182526020820183905291935033925085917fd753503979ce3ae2784b2a43a645381451297880876d0b606e3cd72a6883e3fe910160405180910390a360006001909201829055338252601560205260409091205550565b6001546001600160a01b0316331461092f5760405162461bcd60e51b8152600401610671906140e0565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6002805414156109a35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610671565b60028055336000908152605660205260409020546109fa5760405162461bcd60e51b81526020600482015260146024820152734e6f2066756e647320746f20776974686472617760601b6044820152606401610671565b336000908152605660205260409020544781811015610a4d5760405181815233907fca3ea7915e3d582b1e17b3a09ecca224a5cab7fdd251a4f78313c71f0ccfec959060200160405180910390a2610b03565b33600090815260566020526040812081905560058054849290610a719084906141c6565b9091555050604051600090339084908381818185875af1925050503d8060008114610ab8576040519150601f19603f3d011682016040523d82523d6000602084013e610abd565b606091505b5050905080610b015760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610671565b505b50506001600255565b6001546001600160a01b03163314610b365760405162461bcd60e51b8152600401610671906140e0565b600355565b6001546001600160a01b03163314610b655760405162461bcd60e51b8152600401610671906140e0565b600c55565b6001546001600160a01b03163314610b945760405162461bcd60e51b8152600401610671906140e0565b6040805180820182529283526020808401928352600094855260189052909220905181559051600190910155565b6001546001600160a01b03163314610bec5760405162461bcd60e51b8152600401610671906140e0565b600e55565b6001546001600160a01b03163314610c1b5760405162461bcd60e51b8152600401610671906140e0565b605580546001919060ff191682805b0217905550565b6001546000906001600160a01b03163314610c5e5760405162461bcd60e51b8152600401610671906140e0565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610cbd57600080fd5b505afa158015610cd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf59190613ffd565b905090565b6001546001600160a01b03163314610d245760405162461bcd60e51b8152600401610671906140e0565b600455565b6001546001600160a01b03163314610d535760405162461bcd60e51b8152600401610671906140e0565b610d5d6000611d1e565b565b6001546001600160a01b03163314610d895760405162461bcd60e51b8152600401610671906140e0565b6001600160a01b038116600090815260566020526040902054610de55760405162461bcd60e51b81526020600482015260146024820152734e6f2066756e647320746f20776974686472617760601b6044820152606401610671565b6001600160a01b0381166000908152605660205260409020544781811015610e415760405181815233907fca3ea7915e3d582b1e17b3a09ecca224a5cab7fdd251a4f78313c71f0ccfec959060200160405180910390a2505050565b6001600160a01b038316600090815260566020526040812081905560058054849290610e6e9084906141c6565b90915550506040516000906001600160a01b0385169084908381818185875af1925050503d8060008114610ebe576040519150601f19603f3d011682016040523d82523d6000602084013e610ec3565b606091505b5050905080610f075760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610671565b50505050565b6001546001600160a01b03163314610f375760405162461bcd60e51b8152600401610671906140e0565b604051806060016040528084815260200183815260200182815250603785600a811061072457610724614264565b336000908152601360209081526040808320815160a0810183528154815260018201548185015260028201548184015260038201805484518187028101870190955280855286959294606086019390929190879084015b8282101561100c5783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190610fbc565b50505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156110895783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611039565b505050915250506020015192915050565b6001546001600160a01b031633146110c45760405162461bcd60e51b8152600401610671906140e0565b605580546000919060ff1916600183610c2a565b6001546001600160a01b031633146111025760405162461bcd60e51b8152600401610671906140e0565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90339083906370a082319060240160206040518083038186803b15801561116b57600080fd5b505afa15801561117f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a39190613ffd565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156111e957600080fd5b505af11580156111fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112219190613fa0565b610d5d5760405162461bcd60e51b81526020600482015260126024820152712ab730b13632903a37903a3930b739b332b960711b6044820152606401610671565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112da5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c006044820152606401610671565b6112e48282611d70565b5050565b6001546001600160a01b031633146113125760405162461bcd60e51b8152600401610671906140e0565b601055565b6001546001600160a01b031633146113415760405162461bcd60e51b8152600401610671906140e0565b600955565b6001546001600160a01b031633146113705760405162461bcd60e51b8152600401610671906140e0565b600755565b600061137f6133ab565b83600114801561138f5750348310155b1561139957600080fd5b3480158015906113b157506001600160a01b03861615155b80156113c657506001600160a01b0386163314155b80156113df575033600090815260166020526040902054155b1561144a57600b54604051630c7f7b6b60e01b81523360048201526001600160a01b03888116602483015290911690630c7f7b6b90604401600060405180830381600087803b15801561143157600080fd5b505af1158015611445573d6000803e3d6000fd5b505050505b6114586003546004546135fd565b3360008181526016602090815260408083208590558483526017825280832080546001600160a01b03191685179055928252601390522090925060018414156114c0573360009081526014602090815260408083208390556015909152812081905560018201555b6001810154156115235760405162461bcd60e51b815260206004820152602860248201527f546178206e6565647320746f206265207061696420696e206f7264657220746f604482015267081c1c9bd8d9595960c21b6064820152608401610671565b8181556000600282015560018614156115c45784815534600282018190558511156115c45760405162461bcd60e51b8152602060048201526044602482018190527f416d6f756e742073686f756c642062652067726561746572206f722065717561908201527f6c207468616e2062657420616d6f756e7420666f72206d756c7469706c6520626064820152636574732160e01b608482015260a401610671565b60006115d16004846141a7565b6040805160a08101825234815243602080830191825260008385018181526060850187815233608087019081528c84526012909452959091209351845591516001840155905160028301805460ff1916911515919091179055915160038201559051600490910180546001600160a01b0319166001600160a01b03909216919091179055601154909150479061166890839061417b565b11156116ab5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610671565b80601160008282546116bd919061417b565b9091555050600185141561186a576116d9600383016000613ee9565b6116e7600483016000613ee9565b60005b600a8110156117a757826003016040518060600160405280603784600a811061171557611715614264565b60030201548152602001603784600a811061173257611732614264565b60030201600101548152602001603784600a811061175257611752614264565b600390810291909101600290810154909252835460018082018655600095865260209586902085519290930290920190815593830151908401556040909101519101558061179f816141dd565b9150506116ea565b5060005b600a81101561186857826004016040518060600160405280601984600a81106117d6576117d6614264565b60030201548152602001601984600a81106117f3576117f3614264565b60030201600101548152602001601984600a811061181357611813614264565b6003908102919091016002908101549092528354600180820186556000958652602095869020855192909302909201908155938301519084015560409091015191015580611860816141dd565b9150506117ab565b505b604051339085907f1c6f593ee83bd9c852bb9730d16bd55ef38526f41c8b24eb4beb890d2824e74690600090a3505050949350505050565b6001546000906001600160a01b031633146118cf5760405162461bcd60e51b8152600401610671906140e0565b5060115490565b6001546001600160a01b031633146119005760405162461bcd60e51b8152600401610671906140e0565b600855565b6001546001600160a01b0316331461192f5760405162461bcd60e51b8152600401610671906140e0565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6002805414156119a35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610671565b6002805560008181526012602052604090208054806119f95760405162461bcd60e51b815260206004820152601260248201527110995d08191bd95cc81b9bdd08195e1a5cdd60721b6044820152606401610671565b600282015460ff1615611a475760405162461bcd60e51b815260206004820152601660248201527542657420697320736574746c656420616c726561647960501b6044820152606401610671565b6001820154611a589061546061417b565b4311611aa65760405162461bcd60e51b815260206004820152601d60248201527f57616974206265666f72652072657175657374696e6720726566756e640000006044820152606401610671565b6000826003015490508060116000828254611ac191906141c6565b909155505060028301805460ff1916600117905560048301546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015611b11573d6000803e3d6000fd5b5060048301546040518381526001600160a01b039091169085907f57f542d767287314b1c4f145c240b45cac08f5448a00dc9c4af31cfe74d895ae9060200160405180910390a3505060016002555050565b6001546001600160a01b03163314611b8d5760405162461bcd60e51b8152600401610671906140e0565b600b546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156112e4573d6000803e3d6000fd5b6001546001600160a01b03163314611bf15760405162461bcd60e51b8152600401610671906140e0565b600f55565b6001546001600160a01b03163314611c205760405162461bcd60e51b8152600401610671906140e0565b600655565b6001546001600160a01b03163314611c4f5760405162461bcd60e51b8152600401610671906140e0565b600d55565b6001546001600160a01b03163314611c7e5760405162461bcd60e51b8152600401610671906140e0565b601155565b6001546001600160a01b03163314611cad5760405162461bcd60e51b8152600401610671906140e0565b6001600160a01b038116611d125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610671565b611d1b81611d1e565b50565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611d7982613786565b600082815260176020526040812054600c546001600160a01b039091169190611da39084906137f3565b6001600160a01b0383166000908152601360205260408120600201549192509060019015611dfa576001600160a01b038416600090815260136020526040902060020154611df3906004906141a7565b9150611e22565b6001600160a01b038416600090815260136020526040902054611e1f906004906141a7565b91505b801561338c576000600684611e386001856141c6565b81518110611e4857611e48614264565b6020026020010151611e5a91906141f8565b611e6590600161417b565b60408051600480825260a0820190925291925060009190602082016080803683375050506001600160a01b0387166000908152601460205260408120805492935090918491908390611eb890849061417b565b90915550506001600160a01b038716600090815260146020526040902054602811611f32576001600160a01b038716600090815260146020526040902054611f02906028906141c6565b6001600160a01b038816600090815260146020908152604080832093909355601390522054611f3290888b6138a8565b6001600160a01b03871660009081526014602090815260408083205483526018909152902054631c995b9d60e21b141561200557631c995b9d60e21b82600081518110611f8157611f81614264565b602002602001018181525050600082600181518110611fa257611fa2614264565b6020908102919091018101919091526001600160a01b0388166000908152601382526040808220546014909352902054611fdd9190896139d3565b6001600160a01b0387166000908152601360205260409020546120009088613bc3565b612f37565b6001600160a01b03871660009081526014602090815260408083205483526018909152902054651c995dd85c9960d21b14156120d7576001600160a01b0387166000818152601360209081526040808320546014808452828520548086526018855292852060010154959094529290915261208492908a908d90613c37565b9050651c995dd85c9960d21b826000815181106120a3576120a3614264565b6020026020010181815250508060001b826001815181106120c6576120c6614264565b602002602001018181525050612f37565b6001600160a01b03871660009081526014602090815260408083205483526018909152902054620e8c2f60eb1b1415612217576001600160a01b038716600090815260136020908152604080832054601483528184205484526018909252909120600101546121469190613e36565b6001600160a01b0388166000908152601360209081526040808320600101939093556015905290812080549161217b836141dd565b9190505550620e8c2f60eb1b8260008151811061219a5761219a614264565b60200260200101818152505060136000886001600160a01b03166001600160a01b031681526020019081526020016000206001015460001b826001815181106121e5576121e5614264565b6020908102919091018101919091526001600160a01b0388166000908152601390915260409020546120009088613bc3565b6001600160a01b03871660009081526014602090815260408083205483526018909152902054656368616e636560d01b14156128cb576001600160a01b038716600090815260136020526040812060030154876122756001886141c6565b8151811061228557612285614264565b602002602001015161229791906141f8565b6001600160a01b0389166000908152601360205260409020600301549091508111156122c1575060005b656368616e636560d01b836000815181106122de576122de614264565b602002602001018181525050681d5b9919599a5b995960ba1b8360018151811061230a5761230a614264565b60200260200101818152505060136000896001600160a01b03166001600160a01b03168152602001908152602001600020600301818154811061234f5761234f614264565b906000526020600020906003020160000154651c995dd85c9960d21b14156124d0576001600160a01b03881660009081526013602052604090208054600390910180546123e7929190849081106123a8576123a8614264565b9060005260206000209060030201600101548a8d601460008e6001600160a01b03166001600160a01b0316815260200190815260200160002054613c37565b9150656368616e636560d01b8360008151811061240657612406614264565b602002602001018181525050651c995dd85c9960d21b8360018151811061242f5761242f614264565b6020026020010181815250508160001b8360028151811061245257612452614264565b60200260200101818152505060136000896001600160a01b03166001600160a01b03168152602001908152602001600020600301818154811061249757612497614264565b90600052602060002090600302016002015460001b836003815181106124bf576124bf614264565b6020026020010181815250506126d1565b6001600160a01b03881660009081526013602052604090206003018054829081106124fd576124fd614264565b906000526020600020906003020160000154620e8c2f60eb1b14156126d1576001600160a01b038816600090815260136020526040902080546003909101805461256a9291908490811061255357612553614264565b906000526020600020906003020160010154613e36565b6001600160a01b0389166000908152601360209081526040808320600101939093556015905290812080549161259f836141dd565b9190505550656368616e636560d01b836000815181106125c1576125c1614264565b602002602001018181525050620e8c2f60eb1b836001815181106125e7576125e7614264565b60200260200101818152505060136000896001600160a01b03166001600160a01b031681526020019081526020016000206001015460001b8360028151811061263257612632614264565b60200260200101818152505060136000896001600160a01b03166001600160a01b03168152602001908152602001600020600301818154811061267757612677614264565b90600052602060002090600302016002015460001b8360038151811061269f5761269f614264565b6020908102919091018101919091526001600160a01b0389166000908152601390915260409020546126d19089613bc3565b6001600160a01b038816600090815260136020526040902060030180546126fa906001906141c6565b8154811061270a5761270a614264565b9060005260206000209060030201601360008a6001600160a01b03166001600160a01b03168152602001908152602001600020600301828154811061275157612751614264565b6000918252602080832084546003938402909101908155600180860154908201556002948501549401939093556001600160a01b038b168252601390925260409020018054806127a3576127a361424e565b600082815260208082206003600019909401848102909101838155600181018490556002018390559093556001600160a01b038b1681526013909252604090912001546128c55760005b600a8110156128c3576001600160a01b038916600090815260136020526040908190208151606081019092526003019080603784600a811061283157612831614264565b60030201548152602001603784600a811061284e5761284e614264565b60030201600101548152602001603784600a811061286e5761286e614264565b60039081029190910160029081015490925283546001808201865560009586526020958690208551929093029092019081559383015190840155604090910151910155806128bb816141dd565b9150506127ed565b505b50612f37565b6001600160a01b038716600090815260146020908152604080832054835260189091529020546d18dbdb5b5d5b9a5d1e58da195cdd60921b1415612f37576001600160a01b038716600090815260136020526040812060040154876129316001886141c6565b8151811061294157612941614264565b602002602001015161295391906141f8565b6001600160a01b03891660009081526013602052604090206004015490915081111561297d575060005b68636f6d6d756e69747960b81b8360008151811061299d5761299d614264565b602002602001018181525050681d5b9919599a5b995960ba1b836001815181106129c9576129c9614264565b60200260200101818152505060136000896001600160a01b03166001600160a01b031681526020019081526020016000206004018181548110612a0e57612a0e614264565b906000526020600020906003020160000154651c995dd85c9960d21b1415612b53576001600160a01b0388166000908152601360205260409020805460049091018054612a67929190849081106123a8576123a8614264565b915068636f6d6d756e69747960b81b83600081518110612a8957612a89614264565b602002602001018181525050651c995dd85c9960d21b83600181518110612ab257612ab2614264565b6020026020010181815250508160001b83600281518110612ad557612ad5614264565b60200260200101818152505060136000896001600160a01b03166001600160a01b031681526020019081526020016000206004018181548110612b1a57612b1a614264565b90600052602060002090600302016002015460001b83600381518110612b4257612b42614264565b602002602001018181525050612d40565b6001600160a01b0388166000908152601360205260409020600401805482908110612b8057612b80614264565b906000526020600020906003020160000154620e8c2f60eb1b1415612d40576001600160a01b0388166000908152601360205260409020805460049091018054612bd69291908490811061255357612553614264565b6001600160a01b03891660009081526013602090815260408083206001019390935560159052908120805491612c0b836141dd565b919050555068636f6d6d756e69747960b81b83600081518110612c3057612c30614264565b602002602001018181525050620e8c2f60eb1b83600181518110612c5657612c56614264565b60200260200101818152505060136000896001600160a01b03166001600160a01b031681526020019081526020016000206001015460001b83600281518110612ca157612ca1614264565b60200260200101818152505060136000896001600160a01b03166001600160a01b031681526020019081526020016000206004018181548110612ce657612ce6614264565b90600052602060002090600302016002015460001b83600381518110612d0e57612d0e614264565b6020908102919091018101919091526001600160a01b038916600090815260139091526040902054612d409089613bc3565b6001600160a01b03881660009081526013602052604090206004018054612d69906001906141c6565b81548110612d7957612d79614264565b9060005260206000209060030201601360008a6001600160a01b03166001600160a01b031681526020019081526020016000206004018281548110612dc057612dc0614264565b6000918252602080832084546003909302019182556001808501549083015560029384015493909101929092556001600160a01b038a168152601390915260409020600401805480612e1457612e1461424e565b6000828152602080822060036000199094019384020182815560018101839055600201829055919092556001600160a01b038a168252601390526040902060040154612f355760005b600a811015612f33576001600160a01b038916600090815260136020526040908190208151606081019092526004019080601984600a8110612ea157612ea1614264565b60030201548152602001601984600a8110612ebe57612ebe614264565b60030201600101548152602001601984600a8110612ede57612ede614264565b6003908102919091016002908101549092528354600180820186556000958652602095869020855192909302909201908155938301519084015560409091015191015580612f2b816141dd565b915050612e5d565b505b505b83612f41816141dd565b6001600160a01b0389166000908152601360205260409020600201549095501590506132b8576001600160a01b038716600090815260136020526040902060010154156130d0576001600160a01b03871660009081526013602052604090206002810154600190910154111561305f576001600160a01b03871660009081526013602052604090206002810154600190910154612fde91906141c6565b6001600160a01b038816600081815260136020526040908190206001018390555190918b917f82f8ea4e3f41d401503922c3276f2a2cc52485694f247169a95fc14995bb947b916130329190815260200190565b60405180910390a36001600160a01b038716600090815260136020526040812060020181905593506130d0565b6001600160a01b0387166000908152601360205260409020600181015460029091015461308c91906141c6565b6001600160a01b038816600090815260136020908152604080832060028101949094556001909301829055601590529081208054916130ca836141dd565b91905055505b6001600160a01b038716600090815260136020526040902080546002909101541061313c576001600160a01b0387166000908152601360205260409020805460029091015461311f91906141c6565b6001600160a01b0388166000908152601360205260409020600201555b6001600160a01b0387166000908152601360205260409020805460029091015410156132b8576001600160a01b0387166000908152601360205260408120600201549094501561329b576001600160a01b038716600081815260136020526040908190206002015490518b917f7bf1be1ecc063becbd9f03e00432bc548ff8024481daf1f86ba603f6235d424e916131d691815260200190565b60405180910390a36001600160a01b0387166000818152601360205260408082206002015490519192918381818185875af1925050503d8060008114613238576040519150601f19603f3d011682016040523d82523d6000602084013e61323d565b606091505b50509050806132995760405162461bcd60e51b815260206004820152602260248201527f72656365697665722072656a65637465642062616c616e6365207472616e736660448201526132b960f11b6064820152608401610671565b505b6001600160a01b0387166000908152601360205260408120600201555b6001600160a01b03871660009081526015602052604081208054916132dc836141dd565b90915550506001600160a01b03871660008181526014602090815260408083205460158352818420546013909352928190206001015490518d937f5fd7d18096b8f3ecfe5d90a32b2571e1a80c098c56fc7202b177f845a7a7f2d793613348938a938a91904290614115565b60405180910390a36001600160a01b03871660009081526013602052604090206002015461337557600093505b600c5484111561338457600093505b505050611e22565b816011600082825461339e91906141c6565b9091555050505050505050565b600480546040516370a0823160e01b81523092810192909252906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561341157600080fd5b505afa158015613425573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134499190613ffd565b10156134ab5760405162461bcd60e51b815260206004820152602b60248201527f4e6f7420656e6f756768204c494e4b202d2066696c6c20636f6e74726163742060448201526a1dda5d1a0819985d58d95d60aa1b6064820152608401610671565b6006543410156135145760405162461bcd60e51b815260206004820152602e60248201527f4e65656420616e20616d6f756e742067726561746572207468616e206d696e6960448201526d1b5d5b4818995d08185b5bdd5b9d60921b6064820152608401610671565b60075461352290600a6141a7565b3411156135975760405162461bcd60e51b815260206004820152603860248201527f42657420616d6f756e742073686f756c64206e6f74206265206772656174657260448201527f207468616e20746865204d41582062657420616d6f756e7400000000000000006064820152608401610671565b600060555460ff1660018111156135b0576135b0614238565b14610d5d5760405162461bcd60e51b815260206004820152601960248201527f47616d652069732070726573656e746c792070617573656421000000000000006044820152606401610671565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634000aea07f00000000000000000000000000000000000000000000000000000000000000008486600060405160200161366d929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161369a93929190614074565b602060405180830381600087803b1580156136b457600080fd5b505af11580156136c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ec9190613fa0565b5060008381526020818152604080832054815180840188905280830185905230606082015260808082018390528351808303909101815260a09091019092528151918301919091208684529290915261374690600161417b565b6000858152602081815260409182902092909255805180830187905280820184905281518082038301815260609091019091528051910120949350505050565b6000818152601260205260409020600281015460ff16156137e25760405162461bcd60e51b815260206004820152601660248201527542657420697320736574746c656420616c726561647960501b6044820152606401610671565b600201805460ff1916600117905550565b60608167ffffffffffffffff81111561380e5761380e61427a565b604051908082528060200260200182016040528015613837578160200160208202803683370190505b50905060005b828110156138a15760408051602081018690529081018290526060016040516020818303038152906040528051906020012060001c82828151811061388457613884614264565b602090810291909101015280613899816141dd565b91505061383d565b5092915050565b6000806138b485613e82565b9050600854856138c491906141a7565b9150818110156138df576138d881836141c6565b91506138e4565b600091505b6000846001600160a01b03168360405160006040518083038185875af1925050503d8060008114613931576040519150601f19603f3d011682016040523d82523d6000602084013e613936565b606091505b50509050806139875760405162461bcd60e51b815260206004820181905260248201527f72656365697665722072656a656374656420626f6e7573207472616e736665726044820152606401610671565b846001600160a01b0316847f8baa310a5138797576dee4ed72c964b1e6f48e6dcc7ae3b405c8ac5c0c5b5062856040516139c391815260200190565b60405180910390a3505050505050565b60006139de84613eb6565b90506000848210156139fb576139f482866141c6565b90506139ff565b5060005b73b1c71c6c9ab9748f24720c8a8aaef3aee44606986000613a286001546001600160a01b031690565b600a546040516331a9108f60e11b8152600481018990529192506001600160a01b031690636352211e9060240160206040518083038186803b158015613a6d57600080fd5b505afa158015613a81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa59190613f48565b9150806001600160a01b0316826001600160a01b031614613b6b576001600160a01b038216600090815260566020526040902054613ae490849061417b565b6001600160a01b03831660009081526056602052604081209190915560058054859290613b1290849061417b565b92505081905550846001600160a01b0316826001600160a01b03167f257a6cf85373055c2892fcdd33de07d4fbff97ebf81dabe15155ae743509225285604051613b5e91815260200190565b60405180910390a3613bba565b846001600160a01b0316826001600160a01b03167f257a6cf85373055c2892fcdd33de07d4fbff97ebf81dabe15155ae74350922526000604051613bb191815260200190565b60405180910390a35b50505050505050565b600060095483613bd391906141a7565b600b546040516309feb8f560e41b81526001600160a01b03858116600483015260248201849052929350911690639feb8f5090604401600060405180830381600087803b158015613c2357600080fd5b505af1158015613bba573d6000803e3d6000fd5b6000808080613c4589613e82565b90506001881415613c5857889150613d17565b6002881480613c675750600388145b80613c725750600488145b15613c8b57879250613c84838a6141a7565b9150613d17565b6009881415613cb457613c9f60648a614193565b613caa9060326141a7565b613c84908a61417b565b600019881415613cd457613cc960648a614193565b613c849060196141a7565b600119881415613cf457613ce960648a614193565b613c849060326141a7565b600219881415613d1757613d0960648a614193565b613d1490604b6141a7565b91505b81811015613d3057613d2981836141c6565b9150613d35565b600091505b6000876001600160a01b03168360405160006040518083038185875af1925050503d8060008114613d82576040519150601f19603f3d011682016040523d82523d6000602084013e613d87565b606091505b5050905080613de25760405162461bcd60e51b815260206004820152602160248201527f72656365697665722072656a656374656420726577617264207472616e7366656044820152603960f91b6064820152608401610671565b60408051848152602081018890526001600160a01b038a169189917f691b5ed9cbbc786c7b458204db6a1b43e6a1448705bc911ba57cda583c8b8308910160405180910390a3509098975050505050505050565b6000806001831415613e49575082613e7b565b6002831415613e6457613e5d8460026141a7565b9050613e7b565b6003831415613e7b57613e788460036141a7565b90505b9392505050565b6000806064600d5484613e9591906141a7565b613e9f9190614193565b9050600e54811015613eb05750600e545b92915050565b6000806064600f5484613ec991906141a7565b613ed39190614193565b9050601054811015613eb0575060105492915050565b5080546000825560030290600052602060002090810190611d1b91905b80821115613f27576000808255600182018190556002820155600301613f06565b5090565b600060208284031215613f3d57600080fd5b8135613e7b81614290565b600060208284031215613f5a57600080fd5b8151613e7b81614290565b60008060008060808587031215613f7b57600080fd5b8435613f8681614290565b966020860135965060408601359560600135945092505050565b600060208284031215613fb257600080fd5b81518015158114613e7b57600080fd5b600060208284031215613fd457600080fd5b5035919050565b60008060408385031215613fee57600080fd5b50508035926020909101359150565b60006020828403121561400f57600080fd5b5051919050565b60008060006060848603121561402b57600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561405857600080fd5b5050823594602084013594506040840135936060013592509050565b60018060a01b038416815260006020848184015260606040840152835180606085015260005b818110156140b65785810183015185820160800152820161409a565b818111156140c8576000608083870101525b50601f01601f19169290920160800195945050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060c082018883526020888185015287604085015260c0606085015281875180845260e086019150828901935060005b8181101561416257845183529383019391830191600101614146565b5050608085019690965250505060a00152949350505050565b6000821982111561418e5761418e61420c565b500190565b6000826141a2576141a2614222565b500490565b60008160001904831182151516156141c1576141c161420c565b500290565b6000828210156141d8576141d861420c565b500390565b60006000198214156141f1576141f161420c565b5060010190565b60008261420757614207614222565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611d1b57600080fdfea264697066735822122094696f3ed4d62d7c505284e6bb0a4a8d17d502049f1de9a0b8764145bea1702b64736f6c63430008070033

Deployed ByteCode Sourcemap

19361:35141:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50624:150;;;;;;;;;;-1:-1:-1;50624:150:0;;;;;:::i;:::-;;:::i;:::-;;54322:170;;;;;;;;;;-1:-1:-1;54322:170:0;;;;;:::i;:::-;;:::i;50894:106::-;;;;;;;;;;;;;:::i;:::-;;;4957:25:1;;;4945:2;4930:18;50894:106:0;;;;;;;;43169:683;;;:::i;52824:108::-;;;;;;;;;;-1:-1:-1;52824:108:0;;;;;:::i;:::-;;:::i;48599:521::-;;;;;;;;;;;;;:::i;52613:105::-;;;;;;;;;;-1:-1:-1;52613:105:0;;;;;:::i;:::-;;:::i;53312:134::-;;;;;;;;;;-1:-1:-1;53312:134:0;;;;;:::i;:::-;;:::i;53941:176::-;;;;;;;;;;-1:-1:-1;53941:176:0;;;;;:::i;:::-;;:::i;53668:141::-;;;;;;;;;;-1:-1:-1;53668:141:0;;;;;:::i;:::-;;:::i;52098:86::-;;;;;;;;;;;;;:::i;49126:223::-;;;;;;;;;;-1:-1:-1;49237:10:0;49171:7;49219:29;;;:17;:29;;;;;;49285:21;49126:223;;;5167:25:1;;;5223:2;5208:18;;5201:34;;;;5140:18;49126:223:0;4993:248:1;51887:205:0;;;;;;;;;;;;;:::i;52726:90::-;;;;;;;;;;-1:-1:-1;52726:90:0;;;;;:::i;:::-;;:::i;2521:94::-;;;;;;;;;;;;;:::i;51010:515::-;;;;;;;;;;-1:-1:-1;51010:515:0;;;;;:::i;:::-;;:::i;54133:175::-;;;;;;;;;;-1:-1:-1;54133:175:0;;;;;:::i;:::-;;:::i;49355:138::-;;;;;;;;;;;;;:::i;52196:89::-;;;;;;;;;;;;;:::i;1870:87::-;;;;;;;;;;-1:-1:-1;1943:6:0;;1870:87;;-1:-1:-1;;;;;1943:6:0;;;3390:51:1;;3378:2;3363:18;1870:87:0;3244:203:1;51609:153:0;;;;;;;;;;;;;:::i;19043:233::-;;;;;;;;;;-1:-1:-1;19043:233:0;;;;;:::i;:::-;;:::i;53815:116::-;;;;;;;;;;-1:-1:-1;53815:116:0;;;;;:::i;:::-;;:::i;53552:108::-;;;;;;;;;;-1:-1:-1;53552:108:0;;;;;:::i;:::-;;:::i;52394:93::-;;;;;;;;;;-1:-1:-1;52394:93:0;;;;;:::i;:::-;;:::i;28647:2977::-;;;;;;:::i;:::-;;:::i;51774:105::-;;;;;;;;;;;;;:::i;53454:90::-;;;;;;;;;;-1:-1:-1;53454:90:0;;;;;:::i;:::-;;:::i;52938:128::-;;;;;;;;;;-1:-1:-1;52938:128:0;;;;;:::i;:::-;;:::i;49758:822::-;;;;;;;;;;-1:-1:-1;49758:822:0;;;;;:::i;:::-;;:::i;50779:112::-;;;;;;;;;;-1:-1:-1;50779:112:0;;;;;:::i;:::-;;:::i;53195:109::-;;;;;;;;;;-1:-1:-1;53195:109:0;;;;;:::i;:::-;;:::i;52293:93::-;;;;;;;;;;-1:-1:-1;52293:93:0;;;;;:::i;:::-;;:::i;53074:113::-;;;;;;;;;;-1:-1:-1;53074:113:0;;;;;:::i;:::-;;:::i;52493:112::-;;;;;;;;;;-1:-1:-1;52493:112:0;;;;;:::i;:::-;;:::i;2770:192::-;;;;;;;;;;-1:-1:-1;2770:192:0;;;;;:::i;:::-;;:::i;50624:150::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;;;;;;;;;50692:22:::1;50717:7;1943:6:::0;;-1:-1:-1;;;;;1943:6:0;;1870:87;50717:7:::1;50729:40;::::0;50692:32;;-1:-1:-1;;;;;;50729:32:0;::::1;::::0;:40;::::1;;;::::0;50762:6;;50729:40:::1;::::0;;;50762:6;50729:32;:40;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;50681:93;50624:150:::0;:::o;54322:170::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;54446:38:::1;;;;;;;;54461:7;54446:38;;;;54469:7;54446:38;;;;54477:6;54446:38;;::::0;54427:10:::1;54438:6;54427:18;;;;;;;:::i;:::-;;;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;54322:170:::0;;;;:::o;50894:106::-;1943:6;;50954:7;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;-1:-1:-1;50976:19:0::1;::::0;50894:106;:::o;43169:683::-;43274:10;:18;43262:9;:30;43258:47;;;43295:8;;;43258:47;43355:10;43317:17;43337:29;;;:17;:29;;;;;;43385:13;43377:41;;;;-1:-1:-1;;;43377:41:0;;9509:2:1;43377:41:0;;;9491:21:1;9548:2;9528:18;;;9521:30;-1:-1:-1;;;9567:18:1;;;9560:44;9621:18;;43377:41:0;9307:338:1;43377:41:0;43457:10;43431:17;43451;;;:5;:17;;;;;43500:16;;;;43487:9;:29;43479:72;;;;-1:-1:-1;;;43479:72:0;;14340:2:1;43479:72:0;;;14322:21:1;14379:2;14359:18;;;14352:30;14418:32;14398:18;;;14391:60;14468:18;;43479:72:0;14138:354:1;43479:72:0;43589:1;43570:4;:16;;;:20;43562:51;;;;-1:-1:-1;;;43562:51:0;;9162:2:1;43562:51:0;;;9144:21:1;9201:2;9181:18;;;9174:30;-1:-1:-1;;;9220:18:1;;;9213:48;9278:18;;43562:51:0;8960:342:1;43562:51:0;43655:10;43624:13;43640:26;;;:14;:26;;;;;;;43677:10;43640:26;43677:10;:::i;:::-;43727:16;;;;43703:62;;;5167:25:1;;;5223:2;5208:18;;5201:34;;;43677:10:0;;-1:-1:-1;43745:10:0;;-1:-1:-1;43717:9:0;;43703:62;;5140:18:1;43703:62:0;;;;;;;43795:1;43776:16;;;;:20;;;43822:10;43807:26;;:14;:26;;;;;;:37;-1:-1:-1;43169:683:0:o;52824:108::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;52900:10:::1;:24:::0;;-1:-1:-1;;;;;;52900:24:0::1;-1:-1:-1::0;;;;;52900:24:0;;;::::1;::::0;;;::::1;::::0;;52824:108::o;48599:521::-;4962:1;5560:7;;:19;;5552:63;;;;-1:-1:-1;;;5552:63:0;;13980:2:1;5552:63:0;;;13962:21:1;14019:2;13999:18;;;13992:30;14058:33;14038:18;;;14031:61;14109:18;;5552:63:0;13778:355:1;5552:63:0;4962:1;5693:18;;48675:10:::1;48657:29;::::0;;;:17:::1;:29;::::0;;;;;48649:67:::1;;;::::0;-1:-1:-1;;;48649:67:0;;6814:2:1;48649: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;;48649:67:0::1;6612:344:1::0;48649:67:0::1;48753:10;48721:11;48735:29:::0;;;:17:::1;:29;::::0;;;;;48795:21:::1;48824:24:::0;;::::1;48821:295;;;48863:44;::::0;4957:25:1;;;48896:10:0::1;::::0;48863:44:::1;::::0;4945:2:1;4930:18;48863:44:0::1;;;;;;;48821:295;;;48944:10;48958:1;48926:29:::0;;;:17:::1;:29;::::0;;;;:33;;;48968:19:::1;:29:::0;;48991:6;;48958:1;48968:29:::1;::::0;48991:6;;48968:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;49025:34:0::1;::::0;49007:12:::1;::::0;49025:10:::1;::::0;49048:6;;49007:12;49025:34;49007:12;49025:34;49048:6;49025:10;:34:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49006:53;;;49082:7;49074:36;;;::::0;-1:-1:-1;;;49074:36:0;;12830:2:1;49074:36:0::1;::::0;::::1;12812:21:1::0;12869:2;12849:18;;;12842:30;-1:-1:-1;;;12888:18:1;;;12881:46;12944:18;;49074:36:0::1;12628:340:1::0;49074:36:0::1;48917:199;48821:295;-1:-1:-1::0;;4918:1:0;5872:7;:22;48599:521::o;52613:105::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;52692:7:::1;:18:::0;52613:105::o;53312:134::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;53400:18:::1;:38:::0;53312:134::o;53941:176::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;54078:31:::1;::::0;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;54053:22:0;;;:14:::1;:22:::0;;;;;:56;;;;;;::::1;::::0;;::::1;::::0;53941:176::o;53668:141::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;53756:25:::1;:45:::0;53668:141::o;52098:86::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;52148:10:::1;:28:::0;;52161:15:::1;::::0;52148:10;-1:-1:-1;;52148:28:0::1;52161:15:::0;;52148:28:::1;;;;;;52098:86::o:0;51887:205::-;1943:6;;51945:7;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;52055:29:::1;::::0;-1:-1:-1;;;52055:29:0;;52078:4:::1;52055:29;::::0;::::1;3390:51:1::0;52055:4:0::1;-1:-1:-1::0;;;;;52055:14:0::1;::::0;::::1;::::0;3363:18:1;;52055:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52048:36;;51887:205:::0;:::o;52726:90::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;52798:3:::1;:10:::0;52726:90::o;2521:94::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;2586:21:::1;2604:1;2586:9;:21::i;:::-;2521:94::o:0;51010:515::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51086:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;51078:61:::1;;;::::0;-1:-1:-1;;;51078:61:0;;6814:2:1;51078: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;;51078:61:0::1;6612:344:1::0;51078:61:0::1;-1:-1:-1::0;;;;;51158:23:0;::::1;51144:11;51158:23:::0;;;:17:::1;:23;::::0;;;;;51212:21:::1;51241:24:::0;;::::1;51238:283;;;51280:44;::::0;4957:25:1;;;51313:10:0::1;::::0;51280:44:::1;::::0;4945:2:1;4930:18;51280:44:0::1;;;;;;;50729:40;50681:93;50624:150:::0;:::o;51238:283::-:1;-1:-1:-1::0;;;;;51343:23:0;::::1;51369:1;51343:23:::0;;;:17:::1;:23;::::0;;;;:27;;;51379:19:::1;:29:::0;;51402:6;;51369:1;51379:29:::1;::::0;51402:6;;51379:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;51436:28:0::1;::::0;51418:12:::1;::::0;-1:-1:-1;;;;;51436:9:0;::::1;::::0;51453:6;;51418:12;51436:28;51418:12;51436:28;51453:6;51436:9;:28:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51417:47;;;51487:7;51479:36;;;::::0;-1:-1:-1;;;51479:36:0;;12830:2:1;51479:36:0::1;::::0;::::1;12812:21:1::0;12869:2;12849:18;;;12842:30;-1:-1:-1;;;12888:18:1;;;12881:46;12944:18;;51479:36:0::1;12628:340:1::0;51479:36:0::1;51334:187;51067:458;;51010:515:::0;:::o;54133:175::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;54266:34:::1;;;;;;;;54273:11;54266:34;;;;54285:7;54266:34;;;;54293:6;54266:34;;::::0;54246:11:::1;54258:6;54246:19;;;;;;;:::i;49355:138::-:0;49447:10;49401:7;49441:17;;;:5;:17;;;;;;;;49422:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49401:7;;49422:36;;;;;;;;;;49401:7;;49422:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49422:36:0;;-1:-1:-1;;49471:16:0;;;;49355:138;-1:-1:-1;;49355:138:0:o;52196:89::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;52248:10:::1;:29:::0;;52261:16:::1;::::0;52248:10;-1:-1:-1;;52248:29:0::1;::::0;52261:16;52248:29:::1;::::0;51609:153;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;51701:29:::1;::::0;-1:-1:-1;;;51701:29:0;;51724:4:::1;51701:29;::::0;::::1;3390:51:1::0;51675:4:0::1;-1:-1:-1::0;;;;;51675:13:0::1;::::0;::::1;::::0;51689:10:::1;::::0;51675:13;;51701:14:::1;::::0;3363:18:1;;51701:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51675:56;::::0;-1:-1:-1;;;;;;51675:56:0::1;::::0;;;;;;-1:-1:-1;;;;;3953:32:1;;;51675:56:0::1;::::0;::::1;3935:51:1::0;4002:18;;;3995:34;3908:18;;51675:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51667:87;;;::::0;-1:-1:-1;;;51667:87:0;;9852:2:1;51667: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;;51667:87:0::1;9650:342:1::0;19043:233:0;19159:10;-1:-1:-1;;;;;19173:14:0;19159:28;;19151:72;;;;-1:-1:-1;;;19151:72:0;;11343:2:1;19151:72:0;;;11325:21:1;11382:2;11362:18;;;11355:30;11421:33;11401:18;;;11394:61;11472:18;;19151:72:0;11141:355:1;19151:72:0;19230:40;19248:9;19259:10;19230:17;:40::i;:::-;19043:233;;:::o;53815:116::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;53891:18:::1;:32:::0;53815:116::o;53552:108::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;53628:10:::1;:24:::0;53552:108::o;52394:93::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;52462:7:::1;:17:::0;52394:93::o;28647:2977::-;28759:17;28834:15;:13;:15::i;:::-;28955:13;28971:1;28955:17;:44;;;;;28990:9;28976:10;:23;;28955:44;28951:61;;;29002:8;;;28951:61;29039:9;29135:10;;;;;:37;;-1:-1:-1;;;;;;29149:23:0;;;;29135:37;:64;;;;-1:-1:-1;;;;;;29176:23:0;;29189:10;29176:23;;29135:64;:102;;;;-1:-1:-1;29221:10:0;29203:29;;;;:17;:29;;;;;;:34;29135:102;29131:211;;;29276:15;;29267:63;;-1:-1:-1;;;29267:63:0;;29308:10;29267:63;;;3664:34:1;-1:-1:-1;;;;;3734:15:1;;;3714:18;;;3707:43;29276:15:0;;;;29267:40;;3599:18:1;;29267:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29254:76;29374:31;29392:7;;29401:3;;29374:17;:31::i;:::-;29456:10;29438:29;;;;:17;:29;;;;;;;;:41;;;29490:28;;;:17;:28;;;;;:41;;-1:-1:-1;;;;;;29490:41:0;;;;;29562:17;;;:5;:17;;;29362:43;;-1:-1:-1;29490:41:0;29651:13;;29648:157;;;29698:10;29712:1;29680:29;;;:17;:29;;;;;;;;:33;;;29728:14;:26;;;;;:30;;;29773:16;;;:20;29648:157;29823:16;;;;:21;29815:74;;;;-1:-1:-1;;;29815:74:0;;7575:2:1;29815: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;;29815:74:0;7373:404:1;29815:74:0;29897:20;;;:11;29928:17;;;:21;30024:1;30008:17;;30005:236;;;30041:24;;;30100:9;30080:17;;;:29;;;30132:24;-1:-1:-1;30132:24:0;30124:105;;;;-1:-1:-1;;;30124:105:0;;7984:2:1;30124: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;;30124:105:0;7782:472:1;30124:105:0;30281:22;30306:20;20289:1;30306:6;:20;:::i;:::-;30394:258;;;;;;;;30523:9;30394:258;;30449:12;30394:258;;;;;;;-1:-1:-1;30394:258:0;;;;;;;;;;;;30568:10;30394:258;;;;;;30374:17;;;:6;:17;;;;;;;:278;;;;;;30394:258;30374:278;;;;;;;;;;-1:-1:-1;;30374:278:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30374:278:0;-1:-1:-1;;;;;30374:278:0;;;;;;;;;30782:12;;30394:258;;-1:-1:-1;30818:21:0;;30782:32;;30394:258;;30782:32;:::i;:::-;:57;;30774:88;;;;-1:-1:-1;;;30774:88:0;;8815:2:1;30774:88:0;;;8797:21:1;8854:2;8834:18;;;8827:30;-1:-1:-1;;;8873:18:1;;;8866:48;8931:18;;30774:88:0;8613:342:1;30774:88:0;30924:17;30908:12;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;31063:1:0;31051:13;;31048:484;;;31080:19;31087:12;;;;31080:19;:::i;:::-;31114:18;31121:11;;;;31114:18;:::i;:::-;31153:6;31149:175;31169:18;31165:1;:22;31149:175;;;31213:4;:12;;31231:76;;;;;;;;31238:11;31250:1;31238:14;;;;;;;:::i;:::-;;;;:25;31231:76;;;;31264:11;31276:1;31264:14;;;;;;;:::i;:::-;;;;:21;;;31231:76;;;;31286:11;31298:1;31286:14;;;;;;;:::i;:::-;;;;;;;;;:20;;;;;31231:76;;;31213:95;;;;;;;;-1:-1:-1;31213:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31189:3;;;;:::i;:::-;;;;31149:175;;;;31348:6;31344:174;31364:17;31360:1;:21;31344:174;;;31407:4;:11;;31424:77;;;;;;;;31439:10;31450:1;31439:13;;;;;;;:::i;:::-;;;;:20;31424:77;;;;31460:10;31471:1;31460:13;;;;;;;:::i;:::-;;;;:20;;;31424:77;;;;31481:10;31492:1;31481:13;;;;;;;:::i;:::-;;;;;;;;;:19;;;;;31424:77;;;31407:95;;;;;;;;-1:-1:-1;31407:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31383:3;;;;:::i;:::-;;;;31344:174;;;;31048:484;31549:40;;31578:10;;31568:9;;31549:40;;;;;31600:16;;;28647:2977;;;;;;:::o;51774:105::-;1943:6;;51832:7;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;-1:-1:-1;51859:12:0::1;::::0;51774:105;:::o;53454:90::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;53520:7:::1;:16:::0;53454:90::o;52938:128::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;53024:15:::1;:34:::0;;-1:-1:-1;;;;;;53024:34:0::1;-1:-1:-1::0;;;;;53024:34:0;;;::::1;::::0;;;::::1;::::0;;52938:128::o;49758:822::-;4962:1;5560:7;;:19;;5552:63;;;;-1:-1:-1;;;5552:63:0;;13980:2:1;5552:63:0;;;13962:21:1;14019:2;13999:18;;;13992:30;14058:33;14038:18;;;14031:61;14109:18;;5552:63:0;13778:355:1;5552:63:0;4962:1;5693:18;;49839:15:::1;49857:17:::0;;;:6:::1;:17;::::0;;;;49899:10;;49960;49952:41:::1;;;::::0;-1:-1:-1;;;49952:41:0;;6060:2:1;49952: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;;49952:41:0::1;5858:342:1::0;49952:41:0::1;50012:13;::::0;::::1;::::0;::::1;;:22;50004:57;;;::::0;-1:-1:-1;;;50004:57:0;;11703:2:1;50004: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;;50004:57:0::1;11501:346:1::0;50004:57:0::1;50095:20;::::0;::::1;::::0;:28:::1;::::0;50118:5:::1;50095:28;:::i;:::-;50080:12;:43;50072:85;;;::::0;-1:-1:-1;;;50072:85:0;;10560:2:1;50072:85:0::1;::::0;::::1;10542:21:1::0;10599:2;10579:18;;;10572:30;10638:31;10618:18;;;10611:59;10687:18;;50072:85:0::1;10358:353:1::0;50072:85:0::1;50170:22;50195:3;:13;;;50170:38;;50320:17;50304:12;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;50381:13:0::1;::::0;::::1;:20:::0;;-1:-1:-1;;50381:20:0::1;50397:4;50381:20;::::0;;50443:11:::1;::::0;::::1;::::0;:28:::1;::::0;-1:-1:-1;;;;;50443:11:0;;::::1;::::0;:28;::::1;;;::::0;50464:6;;50381:13:::1;50443:28:::0;50381:13;50443:28;50464:6;50443:11;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;50552:11:0::1;::::0;::::1;::::0;50529:43:::1;::::0;4957:25:1;;;-1:-1:-1;;;;;50552:11:0;;::::1;::::0;50541:9;;50529:43:::1;::::0;4945:2:1;4930:18;50529:43:0::1;;;;;;;-1:-1:-1::0;;4918:1:0;5872:7;:22;-1:-1:-1;;49758:822:0:o;50779:112::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;50853:15:::1;::::0;50845:41:::1;::::0;-1:-1:-1;;;;;50853:15:0;;::::1;::::0;50845:41;::::1;;;::::0;50879:6;;50853:15:::1;50845:41:::0;50853:15;50845:41;50879:6;50853:15;50845:41;::::1;;;;;;;;;;;;;::::0;::::1;;;;53195:109:::0;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;53271:11:::1;:25:::0;53195:109::o;52293:93::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;52361:7:::1;:17:::0;52293:93::o;53074:113::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;53148:18:::1;:31:::0;53074:113::o;52493:112::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;52571:12:::1;:26:::0;52493:112::o;2770:192::-;1943:6;;-1:-1:-1;;;;;1943:6:0;738:10;2090:23;2082:68;;;;-1:-1:-1;;;2082:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2859:22:0;::::1;2851:73;;;::::0;-1:-1:-1;;;2851:73:0;;6407:2:1;2851: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;;2851:73:0::1;6205:402:1::0;2851:73:0::1;2935:19;2945:8;2935:9;:19::i;:::-;2770:192:::0;:::o;2970:173::-;3045:6;;;-1:-1:-1;;;;;3062:17:0;;;-1:-1:-1;;;;;;3062:17:0;;;;;;;3095:40;;3045:6;;;3062:17;3045:6;;3095:40;;3026:16;;3095:40;3015:128;2970:173;:::o;31909:11002::-;32014:25;32029:9;32014:14;:25::i;:::-;32050:14;32067:28;;;:17;:28;;;;;;32220:18;;-1:-1:-1;;;;;32067:28:0;;;;32050:14;32202:37;;32209:10;;32202:6;:37::i;:::-;-1:-1:-1;;;;;32437:13:0;;32251:22;32437:13;;;:5;:13;;;;;:26;;;32169:70;;-1:-1:-1;32251:22:0;32304:1;;32437:30;32434:226;;-1:-1:-1;;;;;32502:13:0;;;;;;:5;:13;;;;;:26;;;:40;;20289:1;;32502:40;:::i;:::-;32482:60;;32434:226;;;-1:-1:-1;;;;;32626:13:0;;;;;;:5;:13;;;;;:20;:34;;20289:1;;32626:34;:::i;:::-;32606:54;;32434:226;32749:12;;32743:9997;;32832:18;32884:1;32854:13;32868:12;32879:1;32868:8;:12;:::i;:::-;32854:27;;;;;;;;:::i;:::-;;;;;;;:31;;;;:::i;:::-;32853:37;;32889:1;32853:37;:::i;:::-;32941:16;;;32955:1;32941:16;;;;;;;;;32832:58;;-1:-1:-1;32907:30:0;;32941:16;;;;;;;;;-1:-1:-1;;;;;;;;33081:25:0;;32973:18;33081:25;;;:17;:25;;;;;:42;;32907:50;;-1:-1:-1;32973:18:0;;33110:13;;33081:25;32973:18;;33081:42;;33110:13;;33081:42;:::i;:::-;;;;-1:-1:-1;;;;;;;33141:25:0;;;;;;:17;:25;;;;;;33170:2;-1:-1:-1;33138:354:0;;-1:-1:-1;;;;;33313:25:0;;;;;;:17;:25;;;;;;:30;;33341:2;;33313:30;:::i;:::-;-1:-1:-1;;;;;33285:25:0;;;;;;:17;:25;;;;;;;;:58;;;;33438:5;:13;;;:20;33429:47;;33303:6;33466:9;33429:8;:47::i;:::-;-1:-1:-1;;;;;33634:25:0;;33619:41;33634:25;;;:17;:25;;;;;;;;;33619:41;;:14;:41;;;;;:54;-1:-1:-1;;;33619:64:0;33616:6551;;;-1:-1:-1;;;33807:13:0;33821:1;33807:16;;;;;;;;:::i;:::-;;;;;;:23;;;;;33849:19;:13;33863:1;33849:16;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;;-1:-1:-1;;;;;33898:13:0;;;;;;:5;:13;;;;;;:20;33919:17;:25;;;;;;33887:65;;33898:20;33904:6;33887:10;:65::i;:::-;-1:-1:-1;;;;;34034:13:0;;;;;;:5;:13;;;;;:20;34019:43;;34040:6;34019:14;:43::i;:::-;33616:6551;;;-1:-1:-1;;;;;34101:25:0;;34086:41;34101:25;;;:17;:25;;;;;;;;;34086:41;;:14;:41;;;;;:54;-1:-1:-1;;;34086:66:0;34083:6084;;;-1:-1:-1;;;;;34241:13:0;;;;;;:5;:13;;;;;;;;:20;34277:17;:25;;;;;;;34262:41;;;:14;:41;;;;;:48;;;34328:25;;;;;;;;34231:123;;34262:48;34247:6;;34318:9;;34231;:123::i;:::-;34215:139;;-1:-1:-1;;;34373:13:0;34387:1;34373:16;;;;;;;;:::i;:::-;;;;;;:25;;;;;34442:13;34434:22;;34417:13;34431:1;34417:16;;;;;;;;:::i;:::-;;;;;;:39;;;;;34083:6084;;;-1:-1:-1;;;;;34495:25:0;;34480:41;34495:25;;;:17;:25;;;;;;;;;34480:41;;:14;:41;;;;;:54;-1:-1:-1;;;34480:63:0;34477:5690;;;-1:-1:-1;;;;;34680:13:0;;;;;;:5;:13;;;;;;;;:20;34716:17;:25;;;;;;34701:41;;:14;:41;;;;;;:48;;;34660:90;;34680:20;34660:19;:90::i;:::-;-1:-1:-1;;;;;34632:13:0;;;;;;:5;:13;;;;;;;;:25;;:118;;;;34769:14;:22;;;;;:24;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;34812:13:0;34826:1;34812:16;;;;;;;;:::i;:::-;;;;;;:22;;;;;34878:5;:13;34884:6;-1:-1:-1;;;;;34878:13:0;-1:-1:-1;;;;;34878:13:0;;;;;;;;;;;;:25;;;34870:34;;34853:13;34867:1;34853:16;;;;;;;;:::i;:::-;;;;;;;;;;;:51;;;;-1:-1:-1;;;;;34989:13:0;;;;;;:5;:13;;;;;;:20;34974:43;;34995:6;34974:14;:43::i;34477:5690::-;-1:-1:-1;;;;;35056:25:0;;35041:41;35056:25;;;:17;:25;;;;;;;;;35041:41;;:14;:41;;;;;:54;-1:-1:-1;;;35041:66:0;35038:5129;;;-1:-1:-1;;;;;35330:13:0;;35287:10;35330:13;;;:5;:13;;;;;:21;;:28;35300:13;35314:12;35325:1;35314:8;:12;:::i;:::-;35300:27;;;;;;;;:::i;:::-;;;;;;;:58;;;;:::i;:::-;-1:-1:-1;;;;;35425:13:0;;;;;;:5;:13;;;;;:21;;:28;35287:71;;-1:-1:-1;35417:36:0;;35414:50;;;-1:-1:-1;35463:1:0;35414:50;-1:-1:-1;;;35488:13:0;35502:1;35488:16;;;;;;;;:::i;:::-;;;;;;:25;;;;;-1:-1:-1;;;35532:13:0;35546:1;35532:16;;;;;;;;:::i;:::-;;;;;;:28;;;;;35635:5;:13;35641:6;-1:-1:-1;;;;;35635:13:0;-1:-1:-1;;;;;35635:13:0;;;;;;;;;;;;:21;;35657:5;35635:28;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;;-1:-1:-1;;;35635:51:0;35632:1182;;;-1:-1:-1;;;;;35774:13:0;;;;;;:5;:13;;;;;:20;;35795:21;;;;:28;;35764:110;;35774:20;35795:21;35817:5;;35795:28;;;;;;:::i;:::-;;;;;;;;;;;:35;;;35831:6;35838:9;35848:17;:25;35866:6;-1:-1:-1;;;;;35848:25:0;-1:-1:-1;;;;;35848:25:0;;;;;;;;;;;;;35764:9;:110::i;:::-;35748:126;;-1:-1:-1;;;35897:13:0;35911:1;35897:16;;;;;;;;:::i;:::-;;;;;;:25;;;;;-1:-1:-1;;;35945:13:0;35959:1;35945:16;;;;;;;;:::i;:::-;;;;;;:25;;;;;36018:13;36010:22;;35993:13;36007:1;35993:16;;;;;;;;:::i;:::-;;;;;;:39;;;;;36102:5;:13;36108:6;-1:-1:-1;;;;;36102:13:0;-1:-1:-1;;;;;36102:13:0;;;;;;;;;;;;:21;;36124:5;36102:28;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;36094:43;;36077:13;36091:1;36077:16;;;;;;;;:::i;:::-;;;;;;:60;;;;;35632:1182;;;-1:-1:-1;;;;;36170:13:0;;;;;;:5;:13;;;;;:21;;:28;;36192:5;;36170:28;;;;;;:::i;:::-;;;;;;;;;;;:39;;;-1:-1:-1;;;36170:48:0;36167:647;;;-1:-1:-1;;;;;36364:13:0;;;;;;:5;:13;;;;;:20;;36385:21;;;;:28;;36344:77;;36364:20;36385:21;36407:5;;36385:28;;;;;;:::i;:::-;;;;;;;;;;;:35;;;36344:19;:77::i;:::-;-1:-1:-1;;;;;36316:13:0;;;;;;:5;:13;;;;;;;;:25;;:105;;;;36444:14;:22;;;;;:24;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;36491:13:0;36505:1;36491:16;;;;;;;;:::i;:::-;;;;;;:25;;;;;-1:-1:-1;;;36539:13:0;36553:1;36539:16;;;;;;;;:::i;:::-;;;;;;:22;;;;;36609:5;:13;36615:6;-1:-1:-1;;;;;36609:13:0;-1:-1:-1;;;;;36609:13:0;;;;;;;;;;;;:25;;;36601:34;;36584:13;36598:1;36584:16;;;;;;;;:::i;:::-;;;;;;:51;;;;;36687:5;:13;36693:6;-1:-1:-1;;;;;36687:13:0;-1:-1:-1;;;;;36687:13:0;;;;;;;;;;;;:21;;36709:5;36687:28;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;36679:43;;36662:13;36676:1;36662:16;;;;;;;;:::i;:::-;;;;;;;;;;;:60;;;;-1:-1:-1;;;;;36766:13:0;;;;;;:5;:13;;;;;;:20;36751:43;;36772:6;36751:14;:43::i;:::-;-1:-1:-1;;;;;36952:13:0;;;;;;:5;:13;;;;;:21;;36974:28;;:30;;37003:1;;36974:30;:::i;:::-;36952:53;;;;;;;;:::i;:::-;;;;;;;;;;;36921:5;:13;36927:6;-1:-1:-1;;;;;36921:13:0;-1:-1:-1;;;;;36921:13:0;;;;;;;;;;;;:21;;36943:5;36921:28;;;;;;;;:::i;:::-;;;;;;;;;:84;;:28;;;;;;;:84;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37024:13:0;;;;:5;:13;;;;;;:21;:27;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;37024:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37160:13:0;;;;:5;:13;;;;;;;:21;:28;37157:438;;37314:6;37310:200;37330:18;37326:1;:22;37310:200;;;-1:-1:-1;;;;;37382:13:0;;;;;;:5;:13;;;;;;;37409:76;;;;;;;;37382:21;;;37409:76;37416:11;37428:1;37416:14;;;;;;;:::i;:::-;;;;:25;37409:76;;;;37442:11;37454:1;37442:14;;;;;;;:::i;:::-;;;;:21;;;37409:76;;;;37464:11;37476:1;37464:14;;;;;;;:::i;:::-;;;;;;;;;:20;;;;;37409:76;;;37382:104;;;;;;;;-1:-1:-1;37382:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37350:3;;;;:::i;:::-;;;;37310:200;;;;37157:438;35108:2522;35038:5129;;;-1:-1:-1;;;;;37653:25:0;;37638:41;37653:25;;;:17;:25;;;;;;;;;37638:41;;:14;:41;;;;;:54;-1:-1:-1;;;37638:74:0;37635:2532;;;-1:-1:-1;;;;;37935:13:0;;37892:10;37935:13;;;:5;:13;;;;;:20;;:27;37905:13;37919:12;37930:1;37919:8;:12;:::i;:::-;37905:27;;;;;;;;:::i;:::-;;;;;;;:57;;;;:::i;:::-;-1:-1:-1;;;;;38029:13:0;;;;;;:5;:13;;;;;:20;;:27;37892:70;;-1:-1:-1;38021:35:0;;38018:49;;;-1:-1:-1;38066:1:0;38018:49;-1:-1:-1;;;38086:13:0;38100:1;38086:16;;;;;;;;:::i;:::-;;;;;;:28;;;;;-1:-1:-1;;;38133:13:0;38147:1;38133:16;;;;;;;;:::i;:::-;;;;;;:28;;;;;38263:5;:13;38269:6;-1:-1:-1;;;;;38263:13:0;-1:-1:-1;;;;;38263:13:0;;;;;;;;;;;;:20;;38284:5;38263:27;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;-1:-1:-1;;;38263:46:0;38260:1151;;;-1:-1:-1;;;;;38397:13:0;;;;;;:5;:13;;;;;:20;;38418;;;;:27;;38387:109;;38397:20;38418;38439:5;;38418:27;;;;;;:::i;38387:109::-;38371:125;;-1:-1:-1;;;38519:13:0;38533:1;38519:16;;;;;;;;:::i;:::-;;;;;;:28;;;;;-1:-1:-1;;;38570:13:0;38584:1;38570:16;;;;;;;;:::i;:::-;;;;;;:25;;;;;38643:13;38635:22;;38618:13;38632:1;38618:16;;;;;;;;:::i;:::-;;;;;;:39;;;;;38713:5;:13;38719:6;-1:-1:-1;;;;;38713:13:0;-1:-1:-1;;;;;38713:13:0;;;;;;;;;;;;:20;;38734:5;38713:27;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;38705:42;;38688:13;38702:1;38688:16;;;;;;;;:::i;:::-;;;;;;:59;;;;;38260:1151;;;-1:-1:-1;;;;;38778:13:0;;;;;;:5;:13;;;;;:20;;:27;;38799:5;;38778:27;;;;;;:::i;:::-;;;;;;;;;;;:34;;;-1:-1:-1;;;38778:43:0;38775:636;;;-1:-1:-1;;;;;38966:13:0;;;;;;:5;:13;;;;;:20;;38987;;;;:27;;38946:76;;38966:20;38987;39008:5;;38987:27;;;;;;:::i;38946:76::-;-1:-1:-1;;;;;38918:13:0;;;;;;:5;:13;;;;;;;;:25;;:104;;;;39045:14;:22;;;;;:24;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;39092:13:0;39106:1;39092:16;;;;;;;;:::i;:::-;;;;;;:28;;;;;-1:-1:-1;;;39143:13:0;39157:1;39143:16;;;;;;;;:::i;:::-;;;;;;:22;;;;;39213:5;:13;39219:6;-1:-1:-1;;;;;39213:13:0;-1:-1:-1;;;;;39213:13:0;;;;;;;;;;;;:25;;;39205:34;;39188:13;39202:1;39188:16;;;;;;;;:::i;:::-;;;;;;:51;;;;;39289:5;:13;39295:6;-1:-1:-1;;;;;39289:13:0;-1:-1:-1;;;;;39289:13:0;;;;;;;;;;;;:20;;39310:5;39289:27;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;39281:42;;39264:13;39278:1;39264:16;;;;;;;;:::i;:::-;;;;;;;;;;;:59;;;;-1:-1:-1;;;;;39363:13:0;;;;;;:5;:13;;;;;;:20;39348:43;;39369:6;39348:14;:43::i;:::-;-1:-1:-1;;;;;39548:13:0;;;;;;:5;:13;;;;;:20;;39569:27;;:29;;39597:1;;39569:29;:::i;:::-;39548:51;;;;;;;;:::i;:::-;;;;;;;;;;;39518:5;:13;39524:6;-1:-1:-1;;;;;39518:13:0;-1:-1:-1;;;;;39518:13:0;;;;;;;;;;;;:20;;39539:5;39518:27;;;;;;;;:::i;:::-;;;;;;;;;:81;;:27;;;;;:81;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39618:13:0;;;;:5;:13;;;;;;:20;;:26;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;39618:26:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39753:13:0;;;;:5;:13;;;;;:20;;:27;39750:382;;39916:6;39912:199;39932:17;39928:1;:21;39912:199;;;-1:-1:-1;;;;;39983:13:0;;;;;;:5;:13;;;;;;;40009:77;;;;;;;;39983:20;;;40009:77;40024:10;40035:1;40024:13;;;;;;;:::i;:::-;;;;:20;40009:77;;;;40045:10;40056:1;40045:13;;;;;;;:::i;:::-;;;;:20;;;40009:77;;;;40066:10;40077:1;40066:13;;;;;;;:::i;:::-;;;;;;;;;:19;;;;;40009:77;;;39983:104;;;;;;;;-1:-1:-1;39983:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39951:3;;;;:::i;:::-;;;;39912:199;;;;39750:382;37713:2454;37635:2532;40275:10;;;;:::i;:::-;-1:-1:-1;;;;;40367:13:0;;40396:1;40367:13;;;:5;:13;;;;;:26;;;40275:10;;-1:-1:-1;40367:30:0;;-1:-1:-1;40364:1956:0;;-1:-1:-1;;;;;40438:13:0;;40466:1;40438:13;;;:5;:13;;;;;:25;;;:29;40435:1092;;-1:-1:-1;;;;;40622:13:0;;;;;;:5;:13;;;;;:26;;;;40594:25;;;;;:54;40591:917;;;-1:-1:-1;;;;;40900:13:0;;;;;;:5;:13;;;;;:26;;;;40872:25;;;;;:54;;40900:26;40872:54;:::i;:::-;-1:-1:-1;;;;;40844:13:0;;;;;;:5;:13;;;;;;;:25;;:82;;;40981:58;40844:13;;40996:9;;40981:58;;;;4957:25:1;;;4945:2;4930:18;;4811:177;40981:58:0;;;;;;;;-1:-1:-1;;;;;41066:13:0;;41095:1;41066:13;;;:5;:13;;;;;:26;;:30;;;41095:1;-1:-1:-1;40591:917:0;;;-1:-1:-1;;;;;41352:13:0;;;;;;:5;:13;;;;;:25;;;;41323:26;;;;;:54;;41352:25;41323:54;:::i;:::-;-1:-1:-1;;;;;41294:13:0;;;;;;:5;:13;;;;;;;;:26;;;:83;;;;41404:25;;;;:29;;;41460:14;:22;;;;;:24;;;;;;:::i;:::-;;;;;;40591:917;-1:-1:-1;;;;;41578:13:0;;;;;;:5;:13;;;;;:20;;41548:26;;;;;:50;41545:132;;-1:-1:-1;;;;;41657:13:0;;;;;;:5;:13;;;;;:20;;41628:26;;;;;:49;;41657:20;41628:49;:::i;:::-;-1:-1:-1;;;;;41599:13:0;;;;;;:5;:13;;;;;:26;;:78;41545:132;-1:-1:-1;;;;;41728:13:0;;;;;;:5;:13;;;;;:20;;41699:26;;;;;:49;41696:595;;;-1:-1:-1;;;;;41863:13:0;;41836:1;41863:13;;;:5;:13;;;;;:26;;;41836:1;;-1:-1:-1;41863:30:0;41860:357;;-1:-1:-1;;;;;41926:67:0;;41959:13;;;;:5;:13;;;;;;;:26;;;41926:67;;41949:9;;41926:67;;;;4957:25:1;;4945:2;4930:18;;4811:177;41926:67:0;;;;;;;;-1:-1:-1;;;;;42062:11:0;;42021:12;42081:13;;;:5;:13;;;;;;:26;;;42062:50;;42021:12;;42062:11;42021:12;42062:50;42021:12;42062:50;42081:26;42062:11;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42020:92;;;42147:7;42139:54;;;;-1:-1:-1;;;42139:54:0;;13175:2:1;42139:54:0;;;13157:21:1;13214:2;13194:18;;;13187:30;13253:34;13233:18;;;13226:62;-1:-1:-1;;;13304:18:1;;;13297:32;13346:19;;42139:54:0;12973:398:1;42139:54:0;41894:323;41860:357;-1:-1:-1;;;;;42239:13:0;;42268:1;42239:13;;;:5;:13;;;;;:26;;:30;41696:595;-1:-1:-1;;;;;42334:22:0;;;;;;:14;:22;;;;;:24;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;42378:154:0;;42420:25;;;;:17;:25;;;;;;;;;42453:14;:22;;;;;;42490:5;:13;;;;;;;:25;;;42378:154;;42394:9;;42378:154;;;;42405:13;;42476;;42490:25;42516:15;;42378:154;:::i;:::-;;;;;;;;-1:-1:-1;;;;;42550:13:0;;;;;;:5;:13;;;;;:26;;;42547:47;;42593:1;42582:12;;42547:47;42654:18;;42643:8;:29;42640:45;;;42684:1;42673:12;;42640:45;32762:9978;;;32743:9997;;;42876:17;42860:12;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;31909:11002:0:o;47272:417::-;47357:3;;;47324:29;;-1:-1:-1;;;47324:29:0;;47347:4;47324:29;;;3390:51:1;;;;47357:3:0;-1:-1:-1;;;;;47324:4:0;:14;;;;3363:18:1;;47324:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;47316:92;;;;-1:-1:-1;;;47316:92:0;;7163:2:1;47316: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;;47316:92:0;6961:407:1;47316:92:0;47440:7;;47427:9;:20;;47419:79;;;;-1:-1:-1;;;47419:79:0;;12415:2:1;47419:79:0;;;12397:21:1;12454:2;12434:18;;;12427:30;12493:34;12473:18;;;12466:62;-1:-1:-1;;;12544:18:1;;;12537:44;12598:19;;47419:79:0;12213:410:1;47419:79:0;47531:7;;:10;;47539:2;47531:10;:::i;:::-;47517:9;:25;;47509:94;;;;-1:-1:-1;;;47509:94:0;;10918:2:1;47509: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;;47509:94:0;10716:420:1;47509:94:0;47636:16;47622:10;;;;;:30;;;;;;;:::i;:::-;;47614:67;;;;-1:-1:-1;;;47614:67:0;;8461:2:1;47614:67:0;;;8443:21:1;8500:2;8480:18;;;8473:30;8539:27;8519:18;;;8512:55;8584:18;;47614:67:0;8259:349:1;17107:1077:0;17217:17;17252:4;-1:-1:-1;;;;;17252:20:0;;17273:14;17289:4;17306:8;15937:1;17295:43;;;;;;;;5167:25:1;;;5223:2;5208:18;;5201:34;5155:2;5140:18;;4993:248;17295:43:0;;;;;;;;;;;;;17252:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;17574:15:0;17658:16;;;;;;;;;;;;6977:51;;;;;5477:25:1;;;5518:18;;;5511:34;;;17651:4:0;5561:18:1;;;5554:60;5630:18;;;;5623:34;;;6977:51:0;;;;;;;;;;5449:19:1;;;;6977:51:0;;;6967:62;;;;;;;;;18112:16;;;;;;;:20;;18131:1;18112:20;:::i;:::-;18093:6;:16;;;;;;;;;;;;:39;;;;7594:41;;;;;2939:19:1;;;2974:12;;;2967:28;;;7594:41:0;;;;;;;;;3011:12:1;;;;7594:41:0;;;7584:52;;;;;18139:39;17107:1077;-1:-1:-1;;;;17107:1077:0:o;31633:200::-;31694:15;31712:17;;;:6;:17;;;;;31745:13;;;;;;:22;31737:57;;;;-1:-1:-1;;;31737:57:0;;11703:2:1;31737:57:0;;;11685:21:1;11742:2;11722:18;;;11715:30;-1:-1:-1;;;11761:18:1;;;11754:52;11823:18;;31737:57:0;11501:346:1;31737:57:0;31805:13;;:20;;-1:-1:-1;;31805:20:0;31821:4;31805:20;;;-1:-1:-1;31633:200:0:o;48269:322::-;48339:31;48414:1;48400:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48400:16:0;;48383:33;;48432:9;48427:125;48451:1;48447;:5;48427:125;;;48512:26;;;;;;5167:25:1;;;5208:18;;;5201:34;;;5140:18;;48512:26:0;;;;;;;;;;;;48502:37;;;;;;48494:46;;48474:14;48489:1;48474:17;;;;;;;;:::i;:::-;;;;;;;;;;:66;48454:3;;;;:::i;:::-;;;;48427:125;;;;48269:322;;;;:::o;46719:543::-;46802:16;46833:17;46853:20;46866:6;46853:12;:20::i;:::-;46833:40;;46907:7;;46898:6;:16;;;;:::i;:::-;46884:30;;46940:11;46928:9;:23;46925:123;;;46980:23;46994:9;46980:11;:23;:::i;:::-;46966:37;;46925:123;;;47047:1;47033:15;;46925:123;47060:12;47101:6;-1:-1:-1;;;;;47101:11:0;47120;47101:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47059:77;;;47155:7;47147:52;;;;-1:-1:-1;;;47147:52:0;;12054:2:1;47147:52:0;;;12036:21:1;;;12073:18;;;12066:30;12132:34;12112:18;;;12105:62;12184:18;;47147:52:0;11852:356:1;47147:52:0;47247:6;-1:-1:-1;;;;;47215:39:0;47224:9;47215:39;47235:11;47215:39;;;;4957:25:1;;4945:2;4930:18;;4811:177;47215:39:0;;;;;;;;46791:471;;;46719:543;;;:::o;43860:1095::-;43950:18;43971:21;43985:6;43971:13;:21::i;:::-;43950:42;;44003:16;44053:6;44040:10;:19;44037:115;;;44088:19;44097:10;44088:6;:19;:::i;:::-;44074:33;;44037:115;;;-1:-1:-1;44151:1:0;44037:115;44185:42;44165:17;44278:7;1943:6;;-1:-1:-1;;;;;1943:6:0;;1870:87;44278:7;44392:10;;44383:46;;-1:-1:-1;;;44383:46:0;;;;;4957:25:1;;;44253:32:0;;-1:-1:-1;;;;;;44392:10:0;;44383:28;;4930:18:1;;44383:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44371:58;;44597:14;-1:-1:-1;;;;;44584:27:0;:9;-1:-1:-1;;;;;44584:27:0;;44581:338;;-1:-1:-1;;;;;44662:28:0;;;;;;:17;:28;;;;;;:42;;44693:11;;44662:42;:::i;:::-;-1:-1:-1;;;;;44631:28:0;;;;;;:17;:28;;;;;:73;;;;44735:19;:34;;44758:11;;44631:28;44735:34;;44758:11;;44735:34;:::i;:::-;;;;;;;;44824:6;-1:-1:-1;;;;;44793:38:0;44802:9;-1:-1:-1;;;;;44793:38:0;;44812:11;44793:38;;;;4957:25:1;;4945:2;4930:18;;4811:177;44793:38:0;;;;;;;;44581:338;;;44896:6;-1:-1:-1;;;;;44875:28:0;44884:9;-1:-1:-1;;;;;44875:28:0;;44894:1;44875:28;;;;4957:25:1;;4945:2;4930:18;;4811:177;44875:28:0;;;;;;;;44581:338;43939:1016;;;;43860:1095;;;:::o;42924:237::-;42995:14;43021:10;;43012:6;:19;;;;:::i;:::-;43108:15;;43099:54;;-1:-1:-1;;;43099:54:0;;-1:-1:-1;;;;;3953:32:1;;;43099:54:0;;;3935:51:1;4002:18;;;3995:34;;;42995:36:0;;-1:-1:-1;43108:15:0;;;43099:35;;3908:18:1;;43099:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45352:1303;45465:4;;;;45569:20;45582:6;45569:12;:20::i;:::-;45549:40;;20327:1;45603:4;:16;45600:659;;;45649:6;45635:20;;45600:659;;;20409:1;45690:4;:16;:36;;;;20447:1;45710:4;:16;45690:36;:54;;;;20483:1;45730:4;:14;45690:54;45687:572;;;45786:4;;-1:-1:-1;45820:24:0;45786:4;45820:6;:24;:::i;:::-;45806:38;;45687:572;;;20369:1;45877:4;:20;45874:385;;;45937:12;45946:3;45937:6;:12;:::i;:::-;45936:18;;45952:2;45936:18;:::i;:::-;45927:27;;:6;:27;:::i;45874:385::-;-1:-1:-1;;45990:4:0;:18;45987:272;;;46039:12;46048:3;46039:6;:12;:::i;:::-;46038:18;;46054:2;46038:18;:::i;45987:272::-;-1:-1:-1;;46082:4:0;:18;46079:180;;;46131:12;46140:3;46131:6;:12;:::i;:::-;46130:18;;46146:2;46130:18;:::i;46079:180::-;-1:-1:-1;;46173:4:0;:20;46170:89;;;46224:12;46233:3;46224:6;:12;:::i;:::-;46223:18;;46239:2;46223:18;:::i;:::-;46209:32;;46170:89;46284:11;46272:9;:23;46269:123;;;46324:23;46338:9;46324:11;:23;:::i;:::-;46310:37;;46269:123;;;46391:1;46377:15;;46269:123;46404:12;46445:6;-1:-1:-1;;;;;46445:11:0;46464;46445:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46403:77;;;46499:7;46491:53;;;;-1:-1:-1;;;46491:53:0;;13578:2:1;46491:53:0;;;13560:21:1;13617:2;13597:18;;;13590:30;13656:34;13636:18;;;13629:62;-1:-1:-1;;;13707:18:1;;;13700:31;13748:19;;46491:53:0;13376:397:1;46491:53:0;46560:58;;;5167:25:1;;;5223:2;5208:18;;5201:34;;;-1:-1:-1;;;;;46560:58:0;;;46570:9;;46560:58;;5140:18:1;46560:58:0;;;;;;;-1:-1:-1;46636:11:0;;45352:1303;-1:-1:-1;;;;;;;;45352:1303:0:o;44963:381::-;45035:4;;20327:1;45085:16;;45082:228;;;-1:-1:-1;45129:6:0;45082:228;;;20409:1;45160:4;:16;45157:153;;;45204:10;:6;45213:1;45204:10;:::i;:::-;45192:22;;45157:153;;;20447:1;45239:4;:16;45236:74;;;45283:10;:6;45292:1;45283:10;:::i;:::-;45271:22;;45236:74;45327:9;44963:381;-1:-1:-1;;;44963:381:0:o;47703:283::-;47763:7;47782:14;47829:3;47808:18;;47799:6;:27;;;;:::i;:::-;:33;;;;:::i;:::-;47782:50;;47861:25;;47849:9;:37;47845:107;;;-1:-1:-1;47915:25:0;;47845:107;47969:9;47703:283;-1:-1:-1;;47703:283:0:o;47992:267::-;48053:7;48072:15;48113:3;48099:11;;48090:6;:20;;;;:::i;:::-;:26;;;;:::i;:::-;48072:44;;48146:18;;48133:10;:31;48129:95;;;-1:-1:-1;48194:18:0;;48241:10;47992:267;-1:-1:-1;;47992: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;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456: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;14932:992::-;15214:4;15262:3;15251:9;15247:19;15293:6;15282:9;15275:25;15319:2;15357:6;15352:2;15341:9;15337:18;15330:34;15400:6;15395:2;15384:9;15380:18;15373:34;15443:3;15438:2;15427:9;15423:18;15416:31;15467:6;15502;15496:13;15533:6;15525;15518:22;15571:3;15560:9;15556:19;15549:26;;15610:2;15602:6;15598:15;15584:29;;15631:1;15641:169;15655:6;15652:1;15649:13;15641:169;;;15716:13;;15704:26;;15785:15;;;;15750:12;;;;15677:1;15670:9;15641:169;;;-1:-1:-1;;15861:3:1;15846:19;;15839:35;;;;-1:-1:-1;;;15905:3:1;15890:19;15883:35;15827:3;14932:992;-1:-1:-1;;;;14932:992:1:o;15929:128::-;15969:3;16000:1;15996:6;15993:1;15990:13;15987:39;;;16006:18;;:::i;:::-;-1:-1:-1;16042:9:1;;15929:128::o;16062:120::-;16102:1;16128;16118:35;;16133:18;;:::i;:::-;-1:-1:-1;16167:9:1;;16062:120::o;16187:168::-;16227:7;16293:1;16289;16285:6;16281:14;16278:1;16275:21;16270:1;16263:9;16256:17;16252:45;16249:71;;;16300:18;;:::i;:::-;-1:-1:-1;16340:9:1;;16187:168::o;16360:125::-;16400:4;16428:1;16425;16422:8;16419:34;;;16433:18;;:::i;:::-;-1:-1:-1;16470:9:1;;16360:125::o;16490:135::-;16529:3;-1:-1:-1;;16550:17:1;;16547:43;;;16570:18;;:::i;:::-;-1:-1:-1;16617:1:1;16606:13;;16490:135::o;16630:112::-;16662:1;16688;16678:35;;16693:18;;:::i;:::-;-1:-1:-1;16727:9:1;;16630:112::o;16747:127::-;16808:10;16803:3;16799:20;16796:1;16789:31;16839:4;16836:1;16829:15;16863:4;16860:1;16853:15;16879:127;16940:10;16935:3;16931:20;16928:1;16921:31;16971:4;16968:1;16961:15;16995:4;16992:1;16985:15;17011:127;17072:10;17067:3;17063:20;17060:1;17053:31;17103:4;17100:1;17093:15;17127:4;17124:1;17117:15;17143:127;17204:10;17199:3;17195:20;17192:1;17185:31;17235:4;17232:1;17225:15;17259:4;17256:1;17249:15;17275:127;17336:10;17331:3;17327:20;17324:1;17317:31;17367:4;17364:1;17357:15;17391:4;17388:1;17381:15;17407:127;17468:10;17463:3;17459:20;17456:1;17449:31;17499:4;17496:1;17489:15;17523:4;17520:1;17513:15;17539:131;-1:-1:-1;;;;;17614:31:1;;17604:42;;17594:70;;17660:1;17657;17650:12

Swarm Source

ipfs://94696f3ed4d62d7c505284e6bb0a4a8d17d502049f1de9a0b8764145bea1702b
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.