MON Price: $0.019087 (+4.19%)

Contract

0x7171590Fb0beb71B839507F810E1D2Bc576aAA55

Overview

MON Balance

Monad Chain LogoMonad Chain LogoMonad Chain Logo0 MON

MON Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Whitelist Ph...508847792026-01-24 21:23:102 hrs ago1769289790IN
0x7171590F...c576aAA55
0 MON0.13263698102.1
Purchase Initial...508626452026-01-24 18:55:424 hrs ago1769280942IN
0x7171590F...c576aAA55
500 MON0.05085753148.5
Purchase Initial...508463222026-01-24 17:06:556 hrs ago1769274415IN
0x7171590F...c576aAA55
1,000 MON0.03496681102.10004247
Purchase Initial...508442902026-01-24 16:53:237 hrs ago1769273603IN
0x7171590F...c576aAA55
500 MON0.0524465102.093
Purchase Initial...508366432026-01-24 16:02:257 hrs ago1769270545IN
0x7171590F...c576aAA55
500 MON0.04255251124.25
Purchase Initial...508363822026-01-24 16:00:417 hrs ago1769270441IN
0x7171590F...c576aAA55
500 MON0.03491356101.94485
Add Whitelist Ph...508301102026-01-24 15:18:468 hrs ago1769267926IN
0x7171590F...c576aAA55
0 MON0.00916144102.165
Add Whitelist Ph...508275402026-01-24 15:01:368 hrs ago1769266896IN
0x7171590F...c576aAA55
0 MON0.00914709102.005
Add Whitelist Ph...508272812026-01-24 14:59:528 hrs ago1769266792IN
0x7171590F...c576aAA55
0 MON0.00918054102.378
Add Whitelist Ph...508155682026-01-24 13:41:3110 hrs ago1769262091IN
0x7171590F...c576aAA55
0 MON0.01359682102.076
Add Whitelist Ph...508151152026-01-24 13:38:3010 hrs ago1769261910IN
0x7171590F...c576aAA55
0 MON0.00919148102.5
Add Whitelist Ph...508138222026-01-24 13:29:5210 hrs ago1769261392IN
0x7171590F...c576aAA55
0 MON0.01345095150
Purchase Initial...508133442026-01-24 13:26:4110 hrs ago1769261201IN
0x7171590F...c576aAA55
500 MON0.0349119101.94
Purchase Initial...507941382026-01-24 11:18:1812 hrs ago1769253498IN
0x7171590F...c576aAA55
500 MON0.03501436102.23919031
Add Whitelist Ph...507913752026-01-24 10:59:5112 hrs ago1769252391IN
0x7171590F...c576aAA55
0 MON0.09110441102.154
Add Whitelist Ph...507870782026-01-24 10:31:0813 hrs ago1769250668IN
0x7171590F...c576aAA55
0 MON0.00914664102
Add Whitelist Ph...507848482026-01-24 10:16:1313 hrs ago1769249773IN
0x7171590F...c576aAA55
0 MON0.01359037102
Purchase Initial...507466592026-01-24 6:01:1717 hrs ago1769234477IN
0x7171590F...c576aAA55
500 MON0.03645922106.4580757
Purchase Initial...507426232026-01-24 5:34:2318 hrs ago1769232863IN
0x7171590F...c576aAA55
1,000 MON0.05240139102.005
Purchase Initial...507349782026-01-24 4:43:2319 hrs ago1769229803IN
0x7171590F...c576aAA55
1,000 MON0.034912101.94
Purchase Initial...507276022026-01-24 3:54:1519 hrs ago1769226855IN
0x7171590F...c576aAA55
500 MON0.04089151119.4
Purchase Initial...507218662026-01-24 3:15:5920 hrs ago1769224559IN
0x7171590F...c576aAA55
500 MON0.0349119101.94
Add Whitelist Ph...507185862026-01-24 2:54:0821 hrs ago1769223248IN
0x7171590F...c576aAA55
0 MON0.01360196102.087
Purchase Initial...507152902026-01-24 2:32:1121 hrs ago1769221931IN
0x7171590F...c576aAA55
1,000 MON0.05233905102
Purchase Initial...507123502026-01-24 2:12:3521 hrs ago1769220755IN
0x7171590F...c576aAA55
500 MON0.03493245102
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
508626452026-01-24 18:55:424 hrs ago1769280942
0x7171590F...c576aAA55
500 MON
508463222026-01-24 17:06:556 hrs ago1769274415
0x7171590F...c576aAA55
1,000 MON
508442902026-01-24 16:53:237 hrs ago1769273603
0x7171590F...c576aAA55
500 MON
508366432026-01-24 16:02:257 hrs ago1769270545
0x7171590F...c576aAA55
500 MON
508363822026-01-24 16:00:417 hrs ago1769270441
0x7171590F...c576aAA55
500 MON
508133442026-01-24 13:26:4110 hrs ago1769261201
0x7171590F...c576aAA55
500 MON
507941382026-01-24 11:18:1812 hrs ago1769253498
0x7171590F...c576aAA55
500 MON
507466592026-01-24 6:01:1717 hrs ago1769234477
0x7171590F...c576aAA55
500 MON
507426232026-01-24 5:34:2318 hrs ago1769232863
0x7171590F...c576aAA55
1,000 MON
507349782026-01-24 4:43:2319 hrs ago1769229803
0x7171590F...c576aAA55
1,000 MON
507276022026-01-24 3:54:1519 hrs ago1769226855
0x7171590F...c576aAA55
500 MON
507218662026-01-24 3:15:5920 hrs ago1769224559
0x7171590F...c576aAA55
500 MON
507152902026-01-24 2:32:1121 hrs ago1769221931
0x7171590F...c576aAA55
1,000 MON
507123502026-01-24 2:12:3521 hrs ago1769220755
0x7171590F...c576aAA55
500 MON
507095282026-01-24 1:53:4622 hrs ago1769219626
0x7171590F...c576aAA55
500 MON
507092732026-01-24 1:52:0422 hrs ago1769219524
0x7171590F...c576aAA55
1,000 MON
507039052026-01-24 1:16:1922 hrs ago1769217379
0x7171590F...c576aAA55
500 MON
507030032026-01-24 1:10:2022 hrs ago1769217020
0x7171590F...c576aAA55
500 MON
506137142026-01-23 15:14:0032 hrs ago1769181240
0x7171590F...c576aAA55
500 MON
506055962026-01-23 14:19:4433 hrs ago1769177984
0x7171590F...c576aAA55
500 MON
505905672026-01-23 12:39:2935 hrs ago1769171969
0x7171590F...c576aAA55
500 MON
505576702026-01-23 9:00:1238 hrs ago1769158812
0x7171590F...c576aAA55
1,000 MON
504681472026-01-22 23:02:292 days ago1769122949
0x7171590F...c576aAA55
500 MON
504244382026-01-22 18:10:572 days ago1769105457
0x7171590F...c576aAA55
500 MON
502566232026-01-21 23:29:503 days ago1769038190
0x7171590F...c576aAA55
1,000 MON
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PetroGame

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at monadscan.com on 2026-01-13
*/

// File: artifacts/contract/contract (1)/contract/PetroGame/utils/Context.sol


pragma solidity ^0.8.20;

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: artifacts/contract/contract (1)/contract/PetroGame/utils/Ownable.sol


pragma solidity ^0.8.20;


abstract contract Ownable is Context {
    address private _owner;
    error OwnableUnauthorizedAccount(address account);
    error OwnableInvalidOwner(address owner);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: artifacts/contract/contract (1)/contract/PetroGame/utils/EnumerableSetLib.sol


pragma solidity ^0.8.4;

library EnumerableSetLib {
    error IndexOutOfBounds();
    error ValueIsZeroSentinel();
    error ExceedsCapacity();

    uint256 private constant _ZERO_SENTINEL = 0xfbb67fda52d4bfb8bf;
    uint256 private constant _ENUMERABLE_ADDRESS_SET_SLOT_SEED = 0x978aab92;
    uint256 private constant _ENUMERABLE_WORD_SET_SLOT_SEED = 0x18fb5864;

    struct AddressSet { uint256 _spacer; }
    struct Bytes32Set { uint256 _spacer; }
    struct Uint256Set { uint256 _spacer; }
    struct Int256Set { uint256 _spacer; }
    struct Uint8Set { uint256 data; }

    function length(Uint256Set storage set) internal view returns (uint256 result) {
        result = length(_toBytes32Set(set));
    }

    function contains(Uint256Set storage set, uint256 value) internal view returns (bool result) {
        result = contains(_toBytes32Set(set), bytes32(value));
    }

    function add(Uint256Set storage set, uint256 value) internal returns (bool result) {
        result = add(_toBytes32Set(set), bytes32(value));
    }

    function remove(Uint256Set storage set, uint256 value) internal returns (bool result) {
        result = remove(_toBytes32Set(set), bytes32(value));
    }

    function at(Uint256Set storage set, uint256 i) internal view returns (uint256 result) {
        result = uint256(at(_toBytes32Set(set), i));
    }

    // --- Private Helpers to reduce size (Using Bytes32 logic for Uint256) ---
    function length(Bytes32Set storage set) internal view returns (uint256 result) {
        bytes32 rootSlot = _rootSlot(set);
        assembly {
            let n := sload(not(rootSlot))
            result := shr(1, n)
        }
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool result) {
        bytes32 rootSlot = _rootSlot(set);
        assembly {
            if eq(value, _ZERO_SENTINEL) { mstore(0x00, 0xf5a267f1) revert(0x1c, 0x04) }
            if iszero(value) { value := _ZERO_SENTINEL }
            mstore(0x20, rootSlot)
            mstore(0x00, value)
            result := iszero(iszero(sload(keccak256(0x00, 0x40))))
        }
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool result) {
        bytes32 rootSlot = _rootSlot(set);
        assembly {
            if eq(value, _ZERO_SENTINEL) { mstore(0x00, 0xf5a267f1) revert(0x1c, 0x04) }
            if iszero(value) { value := _ZERO_SENTINEL }
            mstore(0x20, rootSlot)
            mstore(0x00, value)
            let p := keccak256(0x00, 0x40)
            if iszero(sload(p)) {
                let n := sload(not(rootSlot))
                mstore(0x00, n) // Use scratch space
                sstore(add(rootSlot, shr(1, n)), value)
                sstore(p, add(1, shr(1, n)))
                sstore(not(rootSlot), add(n, 2)) 
                result := 1
            }
        }
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool result) {
        bytes32 rootSlot = _rootSlot(set);
        assembly {
            if eq(value, _ZERO_SENTINEL) { mstore(0x00, 0xf5a267f1) revert(0x1c, 0x04) }
            if iszero(value) { value := _ZERO_SENTINEL }
            mstore(0x20, rootSlot)
            mstore(0x00, value)
            let p := keccak256(0x00, 0x40)
            let position := sload(p)
            if position {
                let n := shr(1, sload(not(rootSlot)))
                let lastValue := sload(add(rootSlot, sub(n, 1)))
                if iszero(eq(value, lastValue)) {
                    sstore(add(rootSlot, sub(position, 1)), lastValue)
                    mstore(0x00, lastValue)
                    sstore(keccak256(0x00, 0x40), position)
                }
                sstore(not(rootSlot), sub(shl(1, n), 2))
                sstore(p, 0)
                result := 1
            }
        }
    }

    function at(Bytes32Set storage set, uint256 i) internal view returns (bytes32 result) {
        bytes32 rootSlot = _rootSlot(set);
        assembly {
             if iszero(lt(i, shr(1, sload(not(rootSlot))))) {
                mstore(0x00, 0x4e23d035) // IndexOutOfBounds()
                revert(0x1c, 0x04)
            }
            result := sload(add(rootSlot, i))
            result := mul(result, iszero(eq(result, _ZERO_SENTINEL)))
        }
    }

    function _rootSlot(Bytes32Set storage s) private pure returns (bytes32 r) {
        assembly {
            mstore(0x04, _ENUMERABLE_WORD_SET_SLOT_SEED)
            mstore(0x00, s.slot)
            r := keccak256(0x00, 0x24)
        }
    }

    function _toBytes32Set(Uint256Set storage s) private pure returns (Bytes32Set storage c) {
        assembly { c.slot := s.slot }
    }
}
// File: artifacts/contract/contract (1)/contract/PetroGame/utils/FixedPointMathLib.sol


pragma solidity ^0.8.4;

library FixedPointMathLib {
    uint256 internal constant WAD = 1e18;

    function mulWad(uint256 x, uint256 y) internal pure returns (uint256 z) {
        assembly {
            if mul(y, gt(x, div(not(0), y))) {
                mstore(0x00, 0xbac65e5b) 
                revert(0x1c, 0x04)
            }
            z := div(mul(x, y), WAD)
        }
    }

    function mulDiv(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {
        assembly {
            if iszero(mul(or(iszero(x), eq(div(mul(x, y), x), y)), d)) {
                mstore(0x00, 0xad251c27) 
                revert(0x1c, 0x04)
            }
            z := div(mul(x, y), d)
        }
    }
}
// File: artifacts/contract/contract (1)/contract/PetroGame/interfaces/IPetro.sol

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.19;

interface IPetro {
    function mint(address to, uint256 amt) external;
    function burn(uint256 value) external;
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// File: artifacts/contract/contract (1)/contract/PetroGame/types/Rig.sol


pragma solidity ^0.8.19;

struct Rig {
    uint256 rigIndex; 
    uint256 id;
    uint256 x;
    uint256 y;
    uint256 hashrate;
    uint256 powerConsumption;
    uint256 cost;
    bool inProduction;
}
// File: artifacts/contract/contract (1)/contract/PetroGame/types/Field.sol


pragma solidity ^0.8.19;

struct Field {
    uint256 fieldIndex; 
    uint256 maxRigs;    
    uint256 currRigs;   
    uint256 totalPowerOutput;
    uint256 currPowerOutput;
    uint256 x;
    uint256 y;
}
// File: artifacts/contract/contract (1)/contract/PetroGame/types/NewField.sol


pragma solidity ^0.8.19;

struct NewField {
    uint256 maxRigs; 
    uint256 totalPowerOutput;
    uint256 cost;
    bool inProduction;
    uint256 x;
    uint256 y;
}
// File: artifacts/contract/contract (1)/contract/PetroGame/libraries/Errors.sol


pragma solidity ^0.8.19;

library Errors {
    error IncorrectValue();
    error AlreadyPurchasedInitialField();
    error StarterRigAlreadyAcquired();
    error FieldAtMaxCapacity();
    error FieldInadequatePowerOutput();
    error PlayerDoesNotOwnRig();
    error GreatDepression();
    error RigNotInProduction();
    error TooPoor();
    error NewFieldNotInProduction();
    error CannotDowngradeAField();
    error NoRewardsPending();
    error CannotDecreaseBelowZero();
    error InvalidRigCoordinates();
    error FieldDimensionsInvalid();
    error NeedToInitializeField();
    error InvalidReferrer();
    error NonExistentRig();
    error CantModifyStarterRig();
    error NonExistentField();
    error CantModifyStarterField();
    error AlreadyAtMaxField();
    error CantBuyNewFieldYet();
    error InvalidRigIndex();
    error InvalidFieldIndex();
    error InvalidFee();
    error InvalidPowerOutput();
    error MiningHasntStarted();
    error WithdrawFailed();
}
// File: artifacts/contract/contract (1)/contract/PetroGame/libraries/Events.sol


pragma solidity ^0.8.19;

library Events {
    event MiningStarted(uint256 startBlock);
    event NewRigAdded(uint256 indexed rigIndex, uint256 hashRate, uint256 powerConsumption, uint256 cost, bool inProduction);
    event RigProductionToggled(uint256 indexed rigIndex, bool inProduction);
    event FieldProductionToggled(uint256 indexed fieldIndex, bool inProduction);
    event NewFieldAdded(uint256 indexed fieldIndex, uint256 totalPowerOutput, uint256 cost, bool inProduction, uint256 x, uint256 y);
    event RigSecondaryMarketAdded(uint256 indexed rigIndex, uint256 price);
    event InitialFieldPurchased(address indexed player);
    event FreeRigRedeemed(address indexed player);
    event RigSold(address indexed player, uint256 indexed rigIndex, uint256 secondHandPrice, uint256 rigId, uint256 x, uint256 y);
    event RigBought(address indexed payer, address indexed player, uint256 indexed rigIndex, uint256 cost, uint256 rigId, uint256 x, uint256 y);
    event FieldBought(address indexed player, uint256 indexed fieldIndex, uint256 cost);
    event PlayerHashrateIncreased(address indexed player, uint256 playerHashrate, uint256 playerPendingRewards);
    event PlayerHashrateDecreased(address indexed player, uint256 playerHashrate, uint256 playerPendingRewards);
    event RewardsClaimed(address indexed player, uint256 rewards);
    event RigCostChanged(uint256 indexed rigIndex, uint256 newCost);
    event FieldCostChanged(uint256 indexed fieldIndex, uint256 newCost);
}
// File: artifacts/contract/contract (1)/contract/PetroGame/PetroGame.sol


pragma solidity ^0.8.19;





// --- ORACLE ---
interface IUniswapV2Pair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function token0() external view returns (address);
}






contract PetroGame is Ownable {
    using EnumerableSetLib for EnumerableSetLib.Uint256Set;

    address public petroToken;
    address public devWallet; 
    address public marketingWallet; 

    // ORACLE settings
    address public liquidityPair; 
    bool public useOracle = false; 
    uint256 public manualPetroPrice = 0.0001 ether; 

    
    uint256 public startTime; 
    bool public miningHasStarted;
    
    
    // 360,000 * 1e18 / 86,400 = 4.166666666666666666 PETRO
    uint256 public constant INITIAL_PETRO_PER_SECOND = 4166666666666666666; 
    
    
    uint256 public constant HALVING_PERIOD = 6 days; 
    uint256 public constant REWARDS_PRECISION = 1e18;

    uint256 universalRigId;
    uint256 public uniqueRigCount;
    uint256 public fieldCount;
    uint256 public totalPlayers;      
    uint256 public totalPetroMined;   
    uint256 public lastRewardTime; 
    uint256 public totalHashrate;
    uint256 public cumulativePetroPerHash;
    
    // COOLDOWN 
    uint256 public cooldown = 86400; 
    
    mapping(address => uint256) public lastUpgradeTime; 
    mapping(address => uint256) public lastClaimTime; 

    mapping(address => uint256) public playerHashrate;
    mapping(address => uint256) public playerPendingRewards;
    mapping(address => uint256) public playerPetroDebt;
    
    mapping(uint256 => Rig) public rigs;
    mapping(uint256 => NewField) public fields;
    
    mapping(address => EnumerableSetLib.Uint256Set) public playerRigsOwned;
    mapping(uint256 => Rig) public playerRigsId;
    mapping(address => Field) public ownerToField;
    
    mapping(address => bool) public initializedStarterField;
    mapping(address => bool) public acquiredStarterRig;
    
    mapping(address => mapping(uint256 => mapping(uint256 => bool))) public playerOccupiedCoords;
    mapping(address => mapping(uint256 => mapping(uint256 => uint256))) public gridRigIndex; 
    
    mapping(address => address) public referrals;
    mapping(address => address[]) public referredUsers;
    
    mapping(address => uint256) public referralPetroBalance; 
    mapping(address => uint256) public totalMonCommission;   
    
    uint8 public currentPhase = 0; 
    
    
    uint256 public initialFieldPrice = 1500 ether;      
    uint256 public constant PHASE1_PRICE = 1 ether; 

    uint256 public constant PHASE2_WL_PRICE = 500 ether;    
    uint256 public constant PHASE2_PUBLIC_PRICE = 1000 ether; 
    
    mapping(address => bool) public whitelistPhase1;
    mapping(address => bool) public whitelistPhase2;

    uint256 public immutable STARTER_RIG_INDEX;
    uint256 public immutable STARTER_FIELD_INDEX;

    event FieldUpgraded(address indexed player, uint256 newLevel, uint256 newMaxRigs, uint256 newPower);
    event ReferralRewardClaimed(address indexed user, uint256 amount);
    event ClaimFeePaid(address indexed user, uint256 totalFee, uint256 devShare, uint256 marketingShare);
    event PhaseChanged(uint8 newPhase);
    event OracleUpdated(address pair, bool status);
    
    
    event UsersMigrated(uint256 count);
    event NewRigAdded(uint256 rigIndex, uint256 hashrate, uint256 cost);
    event NewFieldAdded(uint256 fieldIndex, uint256 cost, uint256 maxRigs);

    constructor() Ownable(msg.sender) {
        devWallet = msg.sender;
        marketingWallet = msg.sender;

        
        _addRigInternal(100, 1, 0); STARTER_RIG_INDEX = 1;
        _addRigInternal(180, 6, 21 * 1e18); 
        _addRigInternal(420, 8, 36 * 1e18); 
        _addRigInternal(720, 10, 54 * 1e18); _addRigInternal(1000, 10, 60 * 1e18); 
        _addRigInternal(5000, 30, 180 * 1e18); _addRigInternal(15000, 50, 375 * 1e18); 
        _addRigInternal(20000, 90, 600 * 1e18); _addRigInternal(60000, 200, 1200 * 1e18); 
        _addRigInternal(200000, 600, 3600 * 1e18); _addRigInternal(1120000, 3200, 8000 * 1e18); 
        _addRigInternal(800000, 2000, 9000 * 1e18); _addRigInternal(1336000, 3000, 12000 * 1e18); 
        _addRigInternal(2508000, 5000, 18000 * 1e18); _addRigInternal(3484000, 4500, 28000 * 1e18); 

        
        fields[++fieldCount] = NewField(4, 28, 0, false, 2, 2); STARTER_FIELD_INDEX = fieldCount;
        fields[++fieldCount] = NewField(8, 168, 210 * 1e18, false, 2, 4);
        fields[++fieldCount] = NewField(12, 420, 1125 * 1e18, false, 3, 4);
        fields[++fieldCount] = NewField(16, 1120, 888 * 1e18, false, 4, 4);
        fields[++fieldCount] = NewField(20, 7000, 1065 * 1e18, false, 4, 5);
        fields[++fieldCount] = NewField(20, 13125, 1275 * 1e18, false, 4, 5);
        fields[++fieldCount] = NewField(20, 19685, 2550 * 1e18, false, 4, 5);
    }

    
    function addNewRig(uint256 hashrate, uint256 power, uint256 cost) external onlyOwner {
        _addRigInternal(hashrate, power, cost);
        emit NewRigAdded(uniqueRigCount, hashrate, cost);
    }

    function addNewField(uint256 maxRigs, uint256 totalPowerOutput, uint256 cost, uint256 x, uint256 y) external onlyOwner {
        fields[++fieldCount] = NewField(maxRigs, totalPowerOutput, cost, false, x, y);
        emit NewFieldAdded(fieldCount, cost, maxRigs);
    }

    function _addRigInternal(uint256 hashrate, uint256 power, uint256 cost) internal {
        uniqueRigCount++;
        rigs[uniqueRigCount] = Rig(uniqueRigCount, type(uint256).max, type(uint256).max, type(uint256).max, hashrate, power, cost, false);
    }

    function migrateUsers(address[] calldata _users) external onlyOwner {
    NewField memory starterData = fields[STARTER_FIELD_INDEX];
    for(uint i=0; i<_users.length; i++) {
        address user = _users[i];
        if (!initializedStarterField[user]) {
            initializedStarterField[user] = true;
            totalPlayers++;
            playerPetroDebt[user] = cumulativePetroPerHash;
            lastClaimTime[user] = block.timestamp;
                
                Field storage field = ownerToField[user];
                field.fieldIndex = STARTER_FIELD_INDEX;
                field.maxRigs = starterData.maxRigs;
                field.totalPowerOutput = starterData.totalPowerOutput;
                field.currPowerOutput = 0;
                field.x = starterData.x;
                field.y = starterData.y;
            }
        }
        emit UsersMigrated(_users.length);
    }

    

    function getCurrentRewardPerSecond() public view returns (uint256) {
        if (!miningHasStarted) return 0;
        
        uint256 timePassed = block.timestamp - startTime;
        uint256 halvings = timePassed / HALVING_PERIOD; 
        
        if (halvings > 64) return 0;
        return INITIAL_PETRO_PER_SECOND >> halvings;
    }

    function getPendingReward(address _user) public view returns (uint256) {
        uint256 _accPetroPerHash = cumulativePetroPerHash;
        
        if (block.timestamp > lastRewardTime && totalHashrate != 0) {
            uint256 timeDelta = block.timestamp - lastRewardTime;
            uint256 currentReward = getCurrentRewardPerSecond();
            uint256 rewards = timeDelta * currentReward;
            _accPetroPerHash += (rewards * REWARDS_PRECISION) / totalHashrate;
        }
        return playerPendingRewards[_user] + (playerHashrate[_user] * (_accPetroPerHash - playerPetroDebt[_user])) / REWARDS_PRECISION;
    }

    function _updateCumulativeRewards() internal {
        if (block.timestamp <= lastRewardTime) return;
        if (totalHashrate == 0) {
            lastRewardTime = block.timestamp;
            return;
        }
        
        uint256 timeDelta = block.timestamp - lastRewardTime;
        uint256 currentReward = getCurrentRewardPerSecond();
        uint256 rewards = timeDelta * currentReward;
        
        cumulativePetroPerHash += (rewards * REWARDS_PRECISION) / totalHashrate;
        lastRewardTime = block.timestamp;
    }

    

    function purchaseInitialField(address referrer) external payable {
        if (initializedStarterField[msg.sender]) revert Errors.AlreadyPurchasedInitialField();
        require(currentPhase > 0, "Sales not started");

        uint256 priceToPay;
        
        if (currentPhase == 1) {
            require(whitelistPhase1[msg.sender], "Not Whitelisted for Phase 1");
            priceToPay = PHASE1_PRICE;
        } 
        else if (currentPhase == 2) {
            
            if (whitelistPhase2[msg.sender]) {
                priceToPay = PHASE2_WL_PRICE; // 500 MON
            } else {
                priceToPay = PHASE2_PUBLIC_PRICE; // 1000 MON
            }
        } 
        else {
            
            priceToPay = initialFieldPrice; 
            if (referrer != address(0) && referrer != msg.sender) {
                priceToPay = (initialFieldPrice * 90) / 100; 
            }
        }

        if (msg.value < priceToPay) revert Errors.IncorrectValue();

        
        bool isValidRef = (referrer != address(0) && referrer != msg.sender && currentPhase == 3);
        
        if (isValidRef) {
            uint256 refShare = (initialFieldPrice * 10) / 100;
            uint256 remainingShare = msg.value - refShare;

            payable(referrer).transfer(refShare);
            totalMonCommission[referrer] += refShare;
            referrals[msg.sender] = referrer;
            referredUsers[referrer].push(msg.sender);

            if (marketingWallet != address(0) && marketingWallet != devWallet) {
                uint256 splitAmount = remainingShare / 2; 
                payable(devWallet).transfer(splitAmount);
                payable(marketingWallet).transfer(remainingShare - splitAmount);
            } else {
                payable(devWallet).transfer(remainingShare); 
            }
        } else {
            
            if (marketingWallet != address(0) && marketingWallet != devWallet) {
                uint256 splitAmount = msg.value / 2;
                payable(devWallet).transfer(splitAmount);
                payable(marketingWallet).transfer(msg.value - splitAmount);
            } else {
                payable(devWallet).transfer(msg.value);
            }
        }

        initializedStarterField[msg.sender] = true;
        totalPlayers++;
        lastClaimTime[msg.sender] = block.timestamp; 

        NewField memory newField = fields[STARTER_FIELD_INDEX];
        Field storage field = ownerToField[msg.sender];
        field.fieldIndex = STARTER_FIELD_INDEX;
        field.maxRigs = newField.maxRigs;
        field.totalPowerOutput = newField.totalPowerOutput;
        field.currPowerOutput = 0;
        field.x = newField.x;
        field.y = newField.y;
        emit Events.InitialFieldPurchased(msg.sender);
    }

    

    function _increaseHashrate(address player, uint256 hashrate) internal {
        if (!miningHasStarted) {
            miningHasStarted = true;
            startTime = block.timestamp;     
            lastRewardTime = block.timestamp;
            emit Events.MiningStarted(block.number);
        }
        _updateRewards(player);
        totalHashrate += hashrate;
        playerHashrate[player] += hashrate;
        emit Events.PlayerHashrateIncreased(player, playerHashrate[player], playerPendingRewards[player]);
    }
    
    function claimRewards() external payable {
        if (!miningHasStarted) revert Errors.MiningHasntStarted();
        _updateRewards(msg.sender);
        
        uint256 totalReward = playerPendingRewards[msg.sender];
        if (totalReward > 0) {
            uint256 timeDiff = block.timestamp - lastClaimTime[msg.sender];
            uint256 hoursPassed = timeDiff / 3600; 
            
            uint256 burnPercent = 0;
            uint256 startFee = 30; 

            if (hoursPassed >= startFee) {
                burnPercent = 0; 
            } else {
                burnPercent = startFee - hoursPassed; 
            }

            uint256 currentPetroPrice = getPetroPrice(); 
            uint256 claimValueInMon = (totalReward * currentPetroPrice) / 1e18;
            uint256 requiredFee = (claimValueInMon * 10) / 100; 
            require(msg.value >= requiredFee, "Insufficient Pay-to-Claim Fee");

            uint256 devShare = requiredFee / 2;
            uint256 marketingShare = requiredFee - devShare;
            payable(devWallet).transfer(devShare);
            payable(marketingWallet).transfer(marketingShare);
            emit ClaimFeePaid(msg.sender, requiredFee, devShare, marketingShare);

            playerPendingRewards[msg.sender] = 0; 
            lastClaimTime[msg.sender] = block.timestamp; 

            uint256 burnAmount = (totalReward * burnPercent) / 100;
            uint256 netReward = totalReward - burnAmount;

            uint256 contractShare = (totalReward * 75) / 1000; 
            uint256 refShare = (totalReward * 25) / 1000; 

            IPetro(petroToken).mint(msg.sender, netReward);

            address referrer = referrals[msg.sender];
            if (referrer != address(0)) {
                IPetro(petroToken).mint(address(this), contractShare);
                referralPetroBalance[referrer] += refShare;
            } else {
                IPetro(petroToken).mint(address(this), contractShare + refShare);
            }
            emit Events.RewardsClaimed(msg.sender, netReward);
        }
    }

    function _updateRewards(address player) internal {
        _updateCumulativeRewards();
        playerPendingRewards[player] += (playerHashrate[player] * (cumulativePetroPerHash - playerPetroDebt[player])) / REWARDS_PRECISION;
        playerPetroDebt[player] = cumulativePetroPerHash;
    }

    function setLiquidityPair(address _pair, bool _enabled) external onlyOwner {
        liquidityPair = _pair;
        useOracle = _enabled;
        emit OracleUpdated(_pair, _enabled);
    }

    function setManualPetroPrice(uint256 _priceInWei) external onlyOwner {
        manualPetroPrice = _priceInWei;
    }

    function getPetroPrice() public view returns (uint256) {
        if (!useOracle || liquidityPair == address(0)) {
            return manualPetroPrice;
        }
        (uint112 reserve0, uint112 reserve1, ) = IUniswapV2Pair(liquidityPair).getReserves();
        address token0 = IUniswapV2Pair(liquidityPair).token0();
        if (reserve0 == 0 || reserve1 == 0) return manualPetroPrice;
        uint256 reserveMON;
        uint256 reservePETRO;
        if (token0 == petroToken) {
            reservePETRO = reserve0;
            reserveMON = reserve1;
        } else {
            reserveMON = reserve0;
            reservePETRO = reserve1;
        }
        return (reserveMON * 1e18) / reservePETRO;
    }
    
    function setMarketingWallet(address _wallet) external onlyOwner {
        marketingWallet = _wallet;
    }
    
    function setPhase(uint8 _phase) external onlyOwner {
        currentPhase = _phase;
        emit PhaseChanged(_phase);
    }

    function addWhitelistPhase1(address[] calldata _users) external onlyOwner {
        for(uint i=0; i<_users.length; i++) {
            whitelistPhase1[_users[i]] = true;
        }
    }

    function addWhitelistPhase2(address[] calldata _users) external onlyOwner {
        for(uint i=0; i<_users.length; i++) {
            whitelistPhase2[_users[i]] = true;
        }
    }

    function upgradeField() external {
        require(currentPhase == 3, "Game has not started yet (Upgrades Locked)");
        if (!initializedStarterField[msg.sender]) revert Errors.NeedToInitializeField();
        require(block.timestamp >= lastUpgradeTime[msg.sender] + cooldown, "Cooldown active: Please wait.");
        Field storage userField = ownerToField[msg.sender];
        uint256 nextLevelIndex = userField.fieldIndex + 1;
        if (nextLevelIndex > fieldCount) revert Errors.AlreadyAtMaxField();
        NewField memory nextFieldData = fields[nextLevelIndex];
        bool success = IPetro(petroToken).transferFrom(msg.sender, address(this), nextFieldData.cost);
        require(success, "Token transfer failed");
        if (nextFieldData.cost > 0) IPetro(petroToken).burn(nextFieldData.cost);
        userField.fieldIndex = nextLevelIndex;
        userField.maxRigs = nextFieldData.maxRigs;
        userField.totalPowerOutput = nextFieldData.totalPowerOutput;
        userField.x = nextFieldData.x; 
        userField.y = nextFieldData.y; 
        lastUpgradeTime[msg.sender] = block.timestamp;
        emit FieldUpgraded(msg.sender, nextLevelIndex, nextFieldData.maxRigs, nextFieldData.totalPowerOutput);
    }

    function buyMiner(uint256 minerIndex, uint256 x, uint256 y) external {
        require(currentPhase == 3, "Game has not started yet (Drilling Locked)");
        if (!initializedStarterField[msg.sender]) revert Errors.NeedToInitializeField();
        Rig memory rig = rigs[minerIndex];
        if (rig.rigIndex == 0) revert Errors.NonExistentRig(); 
        bool success = IPetro(petroToken).transferFrom(msg.sender, address(this), rig.cost);
        require(success, "Token transfer failed");
        if (rig.cost > 0) IPetro(petroToken).burn(rig.cost);
        _mintRig(msg.sender, minerIndex, x, y, rig.cost);
    }

    function claimReferralEarnings() external {
        uint256 amount = referralPetroBalance[msg.sender];
        require(amount > 0, "No referral earnings");
        referralPetroBalance[msg.sender] = 0;
        IPetro(petroToken).mint(msg.sender, amount); 
        emit ReferralRewardClaimed(msg.sender, amount);
    }

    function getReferralStats(address user) external view returns (uint256 userCount, uint256 totalMon, uint256 pendingPetro) {
        return (referredUsers[user].length, totalMonCommission[user], referralPetroBalance[user]);
    }

    function withdrawPetro() external onlyOwner {
        uint256 balance = IPetro(petroToken).balanceOf(address(this));
        require(balance > 0, "No PETRO");
        IPetro(petroToken).transfer(devWallet, balance);
    }

    function withdrawMON() external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No MON");
        payable(devWallet).transfer(balance);
    }

    function getFreeStarterRig(uint256 x, uint256 y) external {
        require(currentPhase == 3, "Game has not started yet (Drilling Locked)");
        if (acquiredStarterRig[msg.sender]) revert Errors.StarterRigAlreadyAcquired();
        if (!initializedStarterField[msg.sender]) revert Errors.NeedToInitializeField();
        acquiredStarterRig[msg.sender] = true;
        _mintRig(msg.sender, STARTER_RIG_INDEX, x, y, 0); 
    }
    
    function removeRig(uint256 x, uint256 y) external {
        if (!playerOccupiedCoords[msg.sender][x][y]) revert Errors.RigNotInProduction();
        Field storage field = ownerToField[msg.sender];
        uint256 rIndex = gridRigIndex[msg.sender][x][y];
        Rig memory rigInfo = rigs[rIndex];
        _updateRewards(msg.sender);
        
        if (totalHashrate >= rigInfo.hashrate) {
            totalHashrate -= rigInfo.hashrate;
        } else {
            totalHashrate = 0;
        }
        if (playerHashrate[msg.sender] >= rigInfo.hashrate) {
            playerHashrate[msg.sender] -= rigInfo.hashrate;
        } else {
            playerHashrate[msg.sender] = 0;
        }
        if (field.currPowerOutput >= rigInfo.powerConsumption) {
            field.currPowerOutput -= rigInfo.powerConsumption;
        } else {
            field.currPowerOutput = 0;
        }

        playerOccupiedCoords[msg.sender][x][y] = false;
        gridRigIndex[msg.sender][x][y] = 0;
        if (field.currRigs > 0) field.currRigs--;
        emit Events.PlayerHashrateDecreased(msg.sender, playerHashrate[msg.sender], playerPendingRewards[msg.sender]);
    }

    function _mintRig(address player, uint256 rigIndex, uint256 x, uint256 y, uint256 cost) internal {
        Rig memory rig = rigs[rigIndex];
        Field storage field = ownerToField[player];
        if (_isInvalidCoordinates(player, x, y, field.x, field.y)) revert Errors.InvalidRigCoordinates();
        if (field.currRigs >= field.maxRigs) revert Errors.FieldAtMaxCapacity();

        if (field.currPowerOutput + rig.powerConsumption > field.totalPowerOutput) revert Errors.FieldInadequatePowerOutput();
        field.currPowerOutput += rig.powerConsumption;
        universalRigId++;
        rig.x = x;
        rig.y = y;
        rig.id = universalRigId;
        playerOccupiedCoords[player][x][y] = true;
        gridRigIndex[player][x][y] = rigIndex;
        playerRigsOwned[player].add(universalRigId);
        playerRigsId[universalRigId] = rig;
        field.currRigs++;
        _increaseHashrate(player, rig.hashrate);
        emit Events.RigBought(player, player, rigIndex, cost, universalRigId, x, y);
    }

    function _isInvalidCoordinates(address player, uint256 desiredX, uint256 desiredY, uint256 fieldX, uint256 fieldY) internal view returns (bool) {
        if (desiredX >= fieldX || desiredY >= fieldY) return true;
        return playerOccupiedCoords[player][desiredX][desiredY];
    }

    function setPetro(address _petro) external onlyOwner {
        petroToken = _petro;
    }

    function getNextFieldInfo(uint256 currentLevel) external view returns (uint256 cost, uint256 newMaxRigs, uint256 newPower) {
        if (currentLevel >= fieldCount) return (0,0,0);
        NewField memory next = fields[currentLevel + 1];
        return (next.cost, next.maxRigs, next.totalPowerOutput);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyAtMaxField","type":"error"},{"inputs":[],"name":"AlreadyPurchasedInitialField","type":"error"},{"inputs":[],"name":"FieldAtMaxCapacity","type":"error"},{"inputs":[],"name":"FieldInadequatePowerOutput","type":"error"},{"inputs":[],"name":"IncorrectValue","type":"error"},{"inputs":[],"name":"InvalidRigCoordinates","type":"error"},{"inputs":[],"name":"MiningHasntStarted","type":"error"},{"inputs":[],"name":"NeedToInitializeField","type":"error"},{"inputs":[],"name":"NonExistentRig","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"RigNotInProduction","type":"error"},{"inputs":[],"name":"StarterRigAlreadyAcquired","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"devShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingShare","type":"uint256"}],"name":"ClaimFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"newLevel","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxRigs","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPower","type":"uint256"}],"name":"FieldUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"}],"name":"InitialFieldPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"}],"name":"MiningStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fieldIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxRigs","type":"uint256"}],"name":"NewFieldAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rigIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hashrate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"}],"name":"NewRigAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"OracleUpdated","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":false,"internalType":"uint8","name":"newPhase","type":"uint8"}],"name":"PhaseChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"playerHashrate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"playerPendingRewards","type":"uint256"}],"name":"PlayerHashrateDecreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"playerHashrate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"playerPendingRewards","type":"uint256"}],"name":"PlayerHashrateIncreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReferralRewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewards","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payer","type":"address"},{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"uint256","name":"rigIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rigId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"x","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"y","type":"uint256"}],"name":"RigBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"UsersMigrated","type":"event"},{"inputs":[],"name":"HALVING_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_PETRO_PER_SECOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PHASE1_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PHASE2_PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PHASE2_WL_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARDS_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STARTER_FIELD_INDEX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STARTER_RIG_INDEX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"acquiredStarterRig","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxRigs","type":"uint256"},{"internalType":"uint256","name":"totalPowerOutput","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"addNewField","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"hashrate","type":"uint256"},{"internalType":"uint256","name":"power","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"}],"name":"addNewRig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"addWhitelistPhase1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"addWhitelistPhase2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minerIndex","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"buyMiner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimReferralEarnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cumulativePetroPerHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPhase","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fieldCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fields","outputs":[{"internalType":"uint256","name":"maxRigs","type":"uint256"},{"internalType":"uint256","name":"totalPowerOutput","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"bool","name":"inProduction","type":"bool"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentRewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"getFreeStarterRig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentLevel","type":"uint256"}],"name":"getNextFieldInfo","outputs":[{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"newMaxRigs","type":"uint256"},{"internalType":"uint256","name":"newPower","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getPendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPetroPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getReferralStats","outputs":[{"internalType":"uint256","name":"userCount","type":"uint256"},{"internalType":"uint256","name":"totalMon","type":"uint256"},{"internalType":"uint256","name":"pendingPetro","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"gridRigIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialFieldPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"initializedStarterField","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpgradeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualPetroPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"migrateUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"miningHasStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ownerToField","outputs":[{"internalType":"uint256","name":"fieldIndex","type":"uint256"},{"internalType":"uint256","name":"maxRigs","type":"uint256"},{"internalType":"uint256","name":"currRigs","type":"uint256"},{"internalType":"uint256","name":"totalPowerOutput","type":"uint256"},{"internalType":"uint256","name":"currPowerOutput","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"petroToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerHashrate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"playerOccupiedCoords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerPetroDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"playerRigsId","outputs":[{"internalType":"uint256","name":"rigIndex","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"hashrate","type":"uint256"},{"internalType":"uint256","name":"powerConsumption","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"bool","name":"inProduction","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerRigsOwned","outputs":[{"internalType":"uint256","name":"_spacer","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"}],"name":"purchaseInitialField","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralPetroBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrals","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"referredUsers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"removeRig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rigs","outputs":[{"internalType":"uint256","name":"rigIndex","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"hashrate","type":"uint256"},{"internalType":"uint256","name":"powerConsumption","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"bool","name":"inProduction","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setLiquidityPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceInWei","type":"uint256"}],"name":"setManualPetroPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_petro","type":"address"}],"name":"setPetro","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_phase","type":"uint8"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalHashrate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalMonCommission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPetroMined","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPlayers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniqueRigCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upgradeField","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useOracle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistPhase1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistPhase2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMON","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawPetro","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526004805460ff60a01b19169055655af3107a4000600555620151806010556023805460ff19169055685150ae84a8cdf0000060245534801562000045575f80fd5b5033806200006c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000778162000709565b5060028054336001600160a01b03199182168117909255600380549091169091179055620000a9606460015f62000758565b6001608052620000c660b460066801236efcbcbb34000062000758565b620000df6101a460086801f399b1438a10000062000758565b620000f86102d0600a6802ed6689e54f18000062000758565b620001116103e8600a680340aad21b3b70000062000758565b6200012a611388601e6809c2007651b250000062000758565b62000143613a9860326814542ba12a337c000062000758565b6200015c614e20605a682086ac35105260000062000758565b6200017561ea6060c868410d586a20a4c0000062000758565b6200019062030d4061025868c328093e61ee40000062000758565b620001ac62111700610c806901b1ae4d6e2ef500000062000758565b620001c8620c35006107d06901e7e4171bf4d3a0000062000758565b620001e4621462c0610bb869028a857425466f80000062000758565b62000200622644e06113886903cfc82e37e9a740000062000758565b6200021c623529606111946905ede20f01a45980000062000758565b6040518060c0016040528060048152602001601c81526020015f81526020015f1515815260200160028152602001600281525060175f600a5f8154620002629062000802565b91905081905581526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff0219169083151502179055506080820151816004015560a08201518160050155905050600a5460a081815250506040518060c001604052806008815260200160a88152602001680b6255df5f5008000081526020015f1515815260200160028152602001600481525060175f600a5f8154620003209062000802565b91905081905581526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff0219169083151502179055506080820151816004015560a082015181600501559050506040518060c00160405280600c81526020016101a48152602001683cfc82e37e9a74000081526020015f1515815260200160038152602001600481525060175f600a5f8154620003d59062000802565b91905081905581526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff0219169083151502179055506080820151816004015560a082015181600501559050506040518060c0016040528060108152602001610460815260200168302379bf2ca2e0000081526020015f1515815260200160048152602001600481525060175f600a5f81546200048a9062000802565b91905081905581526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff0219169083151502179055506080820151816004015560a082015181600501559050506040518060c0016040528060148152602001611b5881526020016839bbd811635f04000081526020015f1515815260200160048152602001600581525060175f600a5f81546200053f9062000802565b91905081905581526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff0219169083151502179055506080820151816004015560a082015181600501559050506040518060c0016040528060148152602001613345815260200168451e2df0c2af0c000081526020015f1515815260200160048152602001600581525060175f600a5f8154620005f49062000802565b91905081905581526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff0219169083151502179055506080820151816004015560a082015181600501559050506040518060c0016040528060148152602001614ce58152602001688a3c5be1855e18000081526020015f1515815260200160048152602001600581525060175f600a5f8154620006a99062000802565b9182905550815260208082019290925260409081015f20835181559183015160018301558201516002820155606082015160038201805460ff19169115159190911790556080820151600482015560a09091015160059091015562000827565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60098054905f620007698362000802565b909155505060408051610100810182526009548082525f1960208084018281528486018381526060860193845260808601998a5260a0860198895260c086019788525f60e087018181529581526016909352959091209351845551600184015592516002830155915160038201559351600485015591516005840155516006830155516007909101805460ff1916911515919091179055565b5f600182016200082057634e487b7160e01b5f52601160045260245ffd5b5060010190565b60805160a05161383c620008655f395f81816108e201528181611e9001528181612b4d0152612c7f01525f8181610b63015261227a015261383c5ff3fe608060405260043610610416575f3560e01c8063787a08a611610220578063bb485bbd11610129578063e2b15d8c116100b3578063f37785a211610078578063f37785a214610e48578063f537967114610e5c578063f60cdcf614610e7b578063f6934a9f14610e90578063f86f25ee14610ebb575f80fd5b8063e2b15d8c14610d9b578063e92820e614610dda578063efc5119414610df9578063f2fde38b14610e15578063f322b65f14610e34575f80fd5b8063c7fda104116100f9578063c7fda10414610cdb578063cc53b27614610d3a578063d013eb0a14610d68578063d09d4abd14610a66578063dff657c314610d87575f80fd5b8063bb485bbd14610c5a578063bbb1239214610c6f578063c03afb5914610c8e578063c2df398214610cad575f80fd5b80639231cf74116101aa578063a9bc82491161017a578063a9bc824914610b3d578063ad154c6814610b52578063b3c0d5e414610b85578063b55de1a814610ba4578063b77cf9c614610c2f575f80fd5b80639231cf7414610abc57806394fc19e414610ad15780639ca423b314610aea578063a269435d14610b1e575f80fd5b806384caff83116101f057806384caff8314610a3257806384db13d214610a4757806386b3cd2614610a665780638da5cb5b14610a815780638ea5220f14610a9d575f80fd5b8063787a08a6146109d557806378e97925146109ea578063808a5457146109ff57806384ae48b514610a1e575f80fd5b8063372500ab116103225780634fe6f7a9116102ac5780635f7f44e11161027c5780635f7f44e11461094b5780636a8fa04114610979578063715018a61461098d57806375ddec4b146109a157806375f0a874146109b6575f80fd5b80634fe6f7a9146108d157806356fbab7a146109045780635a5ccef0146109175780635d098b381461092c575f80fd5b806341f09ea6116102f257806341f09ea61461082d578063426222d5146108485780634487872414610873578063476e2e66146108935780634df9d6ba146108b2575f80fd5b8063372500ab146107b95780633adde9c1146107c15780633d5e1f1e146107d757806340f5da9e14610802575f80fd5b80631c52ef27116103a3578063234f3f1b11610373578063234f3f1b14610710578063238760641461073b5780632aabc69e1461075a5780633041a5201461077957806333437f64146107a4575f80fd5b80631c52ef27146106915780631dbd6bc8146106a65780631ea4bab7146106ba57806321bade13146106d6575f80fd5b806307604998116103e9578063076049981461053e57806312544abc14610588578063136d5072146105a757806316ccbed2146105d25780631913785614610610575f80fd5b80630504023b1461041a57806305244d771461043b578063055ad42e146104dc57806306bbf22814610507575b5f80fd5b348015610425575f80fd5b50610439610434366004613470565b610eda565b005b348015610446575f80fd5b5061049a61045536600461348b565b60166020525f90815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909160ff1688565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c0830152151560e0820152610100015b60405180910390f35b3480156104e7575f80fd5b506023546104f59060ff1681565b60405160ff90911681526020016104d3565b348015610512575f80fd5b50600154610526906001600160a01b031681565b6040516001600160a01b0390911681526020016104d3565b348015610549575f80fd5b5061057a6105583660046134a2565b601e60209081525f938452604080852082529284528284209052825290205481565b6040519081526020016104d3565b348015610593575f80fd5b506104396105a23660046134d4565b610f04565b3480156105b2575f80fd5b5061057a6105c1366004613470565b60186020525f908152604090205481565b3480156105dd575f80fd5b506106006105ec366004613470565b601b6020525f908152604090205460ff1681565b60405190151581526020016104d3565b34801561061b575f80fd5b5061066261062a36600461348b565b60176020525f908152604090208054600182015460028301546003840154600485015460059095015493949293919260ff9091169186565b6040805196875260208701959095529385019290925215156060840152608083015260a082015260c0016104d3565b34801561069c575f80fd5b5061057a600f5481565b3480156106b1575f80fd5b5061057a610f80565b3480156106c5575f80fd5b5061057a683635c9adc5dea0000081565b3480156106e1575f80fd5b506106f56106f0366004613470565b61112a565b604080519384526020840192909252908201526060016104d3565b34801561071b575f80fd5b5061057a61072a366004613470565b60136020525f908152604090205481565b348015610746575f80fd5b50610439610755366004613550565b61115b565b348015610765575f80fd5b506106f561077436600461348b565b6111cf565b348015610784575f80fd5b5061057a610793366004613470565b60216020525f908152604090205481565b3480156107af575f80fd5b5061057a60095481565b61043961125f565b3480156107cc575f80fd5b5061057a6207e90081565b3480156107e2575f80fd5b5061057a6107f1366004613470565b60116020525f908152604090205481565b34801561080d575f80fd5b5061057a61081c366004613470565b60146020525f908152604090205481565b348015610838575f80fd5b5061057a6739d2f941e420aaaa81565b348015610853575f80fd5b5061057a610862366004613470565b60156020525f908152604090205481565b34801561087e575f80fd5b5060045461060090600160a01b900460ff1681565b34801561089e575f80fd5b506104396108ad366004613587565b611694565b3480156108bd575f80fd5b5061057a6108cc366004613470565b6118bf565b3480156108dc575f80fd5b5061057a7f000000000000000000000000000000000000000000000000000000000000000081565b610439610912366004613470565b6119b6565b348015610922575f80fd5b5061057a600e5481565b348015610937575f80fd5b50610439610946366004613470565b611f68565b348015610956575f80fd5b50610600610965366004613470565b601c6020525f908152604090205460ff1681565b348015610984575f80fd5b50610439611f92565b348015610998575f80fd5b506104396120ba565b3480156109ac575f80fd5b5061057a60245481565b3480156109c1575f80fd5b50600354610526906001600160a01b031681565b3480156109e0575f80fd5b5061057a60105481565b3480156109f5575f80fd5b5061057a60065481565b348015610a0a575f80fd5b50600454610526906001600160a01b031681565b348015610a29575f80fd5b506104396120cd565b348015610a3d575f80fd5b5061057a60055481565b348015610a52575f80fd5b50610439610a6136600461348b565b6121c9565b348015610a71575f80fd5b5061057a670de0b6b3a764000081565b348015610a8c575f80fd5b505f546001600160a01b0316610526565b348015610aa8575f80fd5b50600254610526906001600160a01b031681565b348015610ac7575f80fd5b5061057a600d5481565b348015610adc575f80fd5b506007546106009060ff1681565b348015610af5575f80fd5b50610526610b04366004613470565b601f6020525f90815260409020546001600160a01b031681565b348015610b29575f80fd5b50610439610b383660046135b0565b6121d6565b348015610b48575f80fd5b5061057a600c5481565b348015610b5d575f80fd5b5061057a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610b90575f80fd5b50610439610b9f3660046134d4565b6122a3565b348015610baf575f80fd5b50610bfa610bbe366004613470565b601a6020525f90815260409020805460018201546002830154600384015460048501546005860154600690960154949593949293919290919087565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016104d3565b348015610c3a575f80fd5b5061057a610c49366004613470565b60126020525f908152604090205481565b348015610c65575f80fd5b5061057a600a5481565b348015610c7a575f80fd5b50610439610c893660046135d0565b61231a565b348015610c99575f80fd5b50610439610ca8366004613607565b612403565b348015610cb8575f80fd5b50610600610cc7366004613470565b60256020525f908152604090205460ff1681565b348015610ce6575f80fd5b5061049a610cf536600461348b565b60196020525f90815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909160ff1688565b348015610d45575f80fd5b50610600610d54366004613470565b60266020525f908152604090205460ff1681565b348015610d73575f80fd5b50610439610d823660046135b0565b612453565b348015610d92575f80fd5b5061057a6126b6565b348015610da6575f80fd5b50610600610db53660046134a2565b601d60209081525f938452604080852082529284528284209052825290205460ff1681565b348015610de5575f80fd5b50610526610df4366004613627565b61270a565b348015610e04575f80fd5b5061057a681b1ae4d6e2ef50000081565b348015610e20575f80fd5b50610439610e2f366004613470565b61273d565b348015610e3f575f80fd5b50610439612777565b348015610e53575f80fd5b506104396127ed565b348015610e67575f80fd5b50610439610e763660046134d4565b612b43565b348015610e86575f80fd5b5061057a600b5481565b348015610e9b575f80fd5b5061057a610eaa366004613470565b60226020525f908152604090205481565b348015610ec6575f80fd5b50610439610ed5366004613587565b612d18565b610ee2612d6b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610f0c612d6b565b5f5b81811015610f7b57600160265f858585818110610f2d57610f2d613651565b9050602002016020810190610f429190613470565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905580610f7381613679565b915050610f0e565b505050565b6004545f90600160a01b900460ff161580610fa457506004546001600160a01b0316155b15610fb0575060055490565b6004805460408051630240bc6b60e21b815290515f9384936001600160a01b031692630902f1ac92818301926060928290030181865afa158015610ff6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101a91906136ac565b50915091505f60045f9054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611070573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109491906136f8565b90506001600160701b03831615806110b357506001600160701b038216155b156110c357600554935050505090565b6001545f9081906001600160a01b03908116908416036110f25750506001600160701b03828116908416611103565b50506001600160701b038084169083165b8061111683670de0b6b3a7640000613713565b6111209190613730565b9550505050505090565b6001600160a01b0381165f9081526020808052604080832054602283528184205460219093529220545b9193909250565b611163612d6b565b600480546001600160a01b0384166001600160a81b03199091168117600160a01b841515908102919091179092556040805191825260208201929092527f94c9cbe1d9aa7af08484f82ab0179d6db973a391236668c34192d954ff32c06c910160405180910390a15050565b5f805f600a5484106111e857505f915081905080611154565b5f6017816111f787600161374f565b815260208082019290925260409081015f20815160c081018352815480825260018301549482018590526002830154938201849052600383015460ff16151560608301526004830154608083015260059092015460a090910152909790965090945092505050565b60075460ff1661128257604051633017f16560e11b815260040160405180910390fd5b61128b33612d97565b335f90815260146020526040902054801561169157335f908152601260205260408120546112b99042613762565b90505f6112c8610e1083613730565b90505f601e8083106112dc575f91506112e9565b6112e68382613762565b91505b5f6112f2610f80565b90505f670de0b6b3a76400006113088389613713565b6113129190613730565b90505f606461132283600a613713565b61132c9190613730565b9050803410156113835760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e74205061792d746f2d436c61696d2046656500000060448201526064015b60405180910390fd5b5f61138f600283613730565b90505f61139c8284613762565b6002546040519192506001600160a01b03169083156108fc029084905f818181858888f193505050501580156113d4573d5f803e3d5ffd5b506003546040516001600160a01b039091169082156108fc029083905f818181858888f1935050505015801561140c573d5f803e3d5ffd5b50604080518481526020810184905290810182905233907fb3aa4172b89ad35b55207df3917001046668de5f42c54b312c9e0b02e2968c8b9060600160405180910390a2335f90815260146020908152604080832083905560129091528120429055606461147a898d613713565b6114849190613730565b90505f611491828d613762565b90505f6103e86114a28e604b613713565b6114ac9190613730565b90505f6103e86114bd8f6019613713565b6114c79190613730565b6001546040516340c10f1960e01b8152336004820152602481018690529192506001600160a01b0316906340c10f19906044015f604051808303815f87803b158015611511575f80fd5b505af1158015611523573d5f803e3d5ffd5b5050335f908152601f60205260409020546001600160a01b031691505080156115d7576001546040516340c10f1960e01b8152306004820152602481018590526001600160a01b03909116906340c10f19906044015f604051808303815f87803b15801561158f575f80fd5b505af11580156115a1573d5f803e3d5ffd5b505050506001600160a01b0381165f90815260216020526040812080548492906115cc90849061374f565b9091555061164d9050565b6001546001600160a01b03166340c10f19306115f3858761374f565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015611636575f80fd5b505af1158015611648573d5f803e3d5ffd5b505050505b60405184815233907ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe9060200160405180910390a250505050505050505050505050505b50565b60235460ff166003146116b95760405162461bcd60e51b815260040161137a90613775565b335f908152601b602052604090205460ff166116e85760405163350ac7f360e01b815260040160405180910390fd5b5f83815260166020908152604080832081516101008101835281548082526001830154948201949094526002820154928101929092526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460ff16151560e082015291036117735760405163990e7a0b60e01b815260040160405180910390fd5b60015460c08201516040516323b872dd60e01b815233600482015230602482015260448101919091525f916001600160a01b0316906323b872dd906064016020604051808303815f875af11580156117cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f191906137bf565b9050806118385760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604482015260640161137a565b60c0820151156118a75760015460c0830151604051630852cd8d60e31b81526001600160a01b03909216916342966c68916118799160040190815260200190565b5f604051808303815f87803b158015611890575f80fd5b505af11580156118a2573d5f803e3d5ffd5b505050505b6118b8338686868660c00151612e43565b5050505050565b600f54600d545f9190421180156118d75750600e5415155b15611935575f600d54426118eb9190613762565b90505f6118f66126b6565b90505f6119038284613713565b600e5490915061191b670de0b6b3a764000083613713565b6119259190613730565b61192f908561374f565b93505050505b6001600160a01b0383165f90815260156020526040902054670de0b6b3a7640000906119619083613762565b6001600160a01b0385165f908152601360205260409020546119839190613713565b61198d9190613730565b6001600160a01b0384165f908152601460205260409020546119af919061374f565b9392505050565b335f908152601b602052604090205460ff16156119e65760405163120d9bd960e11b815260040160405180910390fd5b60235460ff16611a2c5760405162461bcd60e51b815260206004820152601160248201527014d85b195cc81b9bdd081cdd185c9d1959607a1b604482015260640161137a565b6023545f9060ff16600103611aa857335f9081526025602052604090205460ff16611a995760405162461bcd60e51b815260206004820152601b60248201527f4e6f742057686974656c697374656420666f7220506861736520310000000000604482015260640161137a565b50670de0b6b3a7640000611b34565b60235460ff16600203611aec57335f9081526026602052604090205460ff1615611adc5750681b1ae4d6e2ef500000611b34565b50683635c9adc5dea00000611b34565b506024546001600160a01b03821615801590611b1157506001600160a01b0382163314155b15611b34576064602454605a611b279190613713565b611b319190613730565b90505b80341015611b5557604051636956f2ab60e11b815260040160405180910390fd5b5f6001600160a01b03831615801590611b7757506001600160a01b0383163314155b8015611b88575060235460ff166003145b90508015611d63575f6064602454600a611ba29190613713565b611bac9190613730565b90505f611bb98234613762565b6040519091506001600160a01b0386169083156108fc029084905f818181858888f19350505050158015611bef573d5f803e3d5ffd5b506001600160a01b0385165f9081526022602052604081208054849290611c1790849061374f565b9091555050335f818152601f6020908152604080832080546001600160a01b03808c166001600160a01b0319928316811790935591855283805291842080546001810182559085529290932090910180549091169092179091556003541615801590611c9457506002546003546001600160a01b03908116911614155b15611d23575f611ca5600283613730565b6002546040519192506001600160a01b03169082156108fc029083905f818181858888f19350505050158015611cdd573d5f803e3d5ffd5b506003546001600160a01b03166108fc611cf78385613762565b6040518115909202915f818181858888f19350505050158015611d1c573d5f803e3d5ffd5b5050611d5c565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015611d5a573d5f803e3d5ffd5b505b5050611e4e565b6003546001600160a01b031615801590611d8e57506002546003546001600160a01b03908116911614155b15611e16575f611d9f600234613730565b6002546040519192506001600160a01b03169082156108fc029083905f818181858888f19350505050158015611dd7573d5f803e3d5ffd5b506003546001600160a01b03166108fc611df18334613762565b6040518115909202915f818181858888f19350505050158015611d5c573d5f803e3d5ffd5b6002546040516001600160a01b03909116903480156108fc02915f818181858888f19350505050158015611e4c573d5f803e3d5ffd5b505b335f908152601b60205260408120805460ff19166001179055600b805491611e7583613679565b9091555050335f8181526012602090815260408083204290557f000000000000000000000000000000000000000000000000000000000000000080845260178352818420825160c0810184528154815260018083015482870190815260028401548387015260038085015460ff16151560608501526004808601546080860190815260059687015460a087019081528c8c52601a909a52888b20978855855194880194909455915190860155840187905551918301919091559251600682015590519193909290917febe01df6d96920585e2744874d810e5560bc050e9ff947aa34f10422a33cbc279190a25050505050565b611f70612d6b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b611f9a612d6b565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015611fe0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061200491906137da565b90505f81116120405760405162461bcd60e51b81526020600482015260086024820152674e6f20504554524f60c01b604482015260640161137a565b60015460025460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb906044016020604051808303815f875af1158015612092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b691906137bf565b5050565b6120c2612d6b565b6120cb5f6130fb565b565b335f90815260216020526040902054806121205760405162461bcd60e51b81526020600482015260146024820152734e6f20726566657272616c206561726e696e677360601b604482015260640161137a565b335f818152602160205260408082209190915560015490516340c10f1960e01b81526004810192909252602482018390526001600160a01b0316906340c10f19906044015f604051808303815f87803b15801561217b575f80fd5b505af115801561218d573d5f803e3d5ffd5b50506040518381523392507f5be4d22009fea85381595ed91090bc5c0bc92a93fe07ed7472c5888eb1993f83915060200160405180910390a250565b6121d1612d6b565b600555565b60235460ff166003146121fb5760405162461bcd60e51b815260040161137a90613775565b335f908152601c602052604090205460ff161561222b57604051639d38dc2760e01b815260040160405180910390fd5b335f908152601b602052604090205460ff1661225a5760405163350ac7f360e01b815260040160405180910390fd5b335f818152601c60205260408120805460ff191660011790556120b691907f00000000000000000000000000000000000000000000000000000000000000009085908590612e43565b6122ab612d6b565b5f5b81811015610f7b57600160255f8585858181106122cc576122cc613651565b90506020020160208101906122e19190613470565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790558061231281613679565b9150506122ad565b612322612d6b565b6040518060c001604052808681526020018581526020018481526020015f151581526020018381526020018281525060175f600a5f815461236290613679565b9182905550815260208082019290925260409081015f208351815583830151600182015583820151600282015560608085015160038301805460ff19169115159190911790556080850151600483015560a090940151600590910155600a54815190815291820186905281018790527f47d717b6b55d68dba6b9044d2f7a4eac7b376a5ce11ed5de835b8c83c829f354910160405180910390a15050505050565b61240b612d6b565b6023805460ff191660ff83169081179091556040519081527fa6dcc92f45df25789d5639b7a0c97ba1edf3bb1c0b5dd3376fd96a0db87c46429060200160405180910390a150565b335f908152601d60209081526040808320858452825280832084845290915290205460ff1661249557604051635522b5a360e01b815260040160405180910390fd5b335f818152601a60209081526040808320601e835281842087855283528184208685528352818420548085526016845293829020825161010081018452815481526001820154948101949094526002810154928401929092526003820154606084015260048201546080840152600582015460a0840152600682015460c084015260079091015460ff16151560e08301529261253090612d97565b8060800151600e541061255d578060800151600e5f8282546125529190613762565b909155506125629050565b5f600e555b6080810151335f90815260136020526040902054106125a9576080810151335f908152601360205260408120805490919061259e908490613762565b909155506125b99050565b335f908152601360205260408120555b8060a001518360040154106125ea578060a00151836004015f8282546125df9190613762565b909155506125f19050565b5f60048401555b335f818152601d6020908152604080832089845282528083208884528252808320805460ff19169055928252601e8152828220888352815282822087835290529081205560028301541561265657600283018054905f612650836137f1565b91905055505b335f818152601360209081526040808320546014909252918290205491517fe331ada0d0e61e9a4196bf4994f2519193d70a601daff346c4276d591664da9a926126a7928252602082015260400190565b60405180910390a25050505050565b6007545f9060ff166126c757505f90565b5f600654426126d69190613762565b90505f6126e66207e90083613730565b905060408111156126f9575f9250505090565b6739d2f941e420aaaa901c92915050565b60208052815f5260405f208181548110612722575f80fd5b5f918252602090912001546001600160a01b03169150829050565b612745612d6b565b6001600160a01b03811661276e57604051631e4fbdf760e01b81525f600482015260240161137a565b611691816130fb565b61277f612d6b565b47806127b65760405162461bcd60e51b815260206004820152600660248201526527379026a7a760d11b604482015260640161137a565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156120b6573d5f803e3d5ffd5b60235460ff166003146128555760405162461bcd60e51b815260206004820152602a60248201527f47616d6520686173206e6f7420737461727465642079657420285570677261646044820152696573204c6f636b65642960b01b606482015260840161137a565b335f908152601b602052604090205460ff166128845760405163350ac7f360e01b815260040160405180910390fd5b601054335f908152601160205260409020546128a0919061374f565b4210156128ef5760405162461bcd60e51b815260206004820152601d60248201527f436f6f6c646f776e206163746976653a20506c6561736520776169742e000000604482015260640161137a565b335f908152601a60205260408120805490919061290d90600161374f565b9050600a5481111561293257604051633196792f60e11b815260040160405180910390fd5b5f818152601760209081526040808320815160c08101835281548152600180830154948201949094526002820154818401819052600383015460ff1615156060830152600480840154608084015260059093015460a0830152935492516323b872dd60e01b8152339281019290925230602483015260448201939093529192916001600160a01b03909116906323b872dd906064016020604051808303815f875af11580156129e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0791906137bf565b905080612a4e5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604482015260640161137a565b604082015115612abd576001546040808401519051630852cd8d60e31b81526001600160a01b03909216916342966c6891612a8f9160040190815260200190565b5f604051808303815f87803b158015612aa6575f80fd5b505af1158015612ab8573d5f803e3d5ffd5b505050505b828455815160018501556020808301805160038701556080840151600587015560a08401516006870155335f8181526011845260409081902042905585519251815188815294850193909352830191909152907f1957c3ddde972a0f75f4e54bddd65ada5f0810c35dee609b075fc2d92ec399a99060600160405180910390a250505050565b612b4b612d6b565b7f00000000000000000000000000000000000000000000000000000000000000005f908152601760209081526040808320815160c08101835281548152600182015493810193909352600281015491830191909152600381015460ff1615156060830152600481015460808301526005015460a0820152905b82811015612cde575f848483818110612bdf57612bdf613651565b9050602002016020810190612bf49190613470565b6001600160a01b0381165f908152601b602052604090205490915060ff16612ccb576001600160a01b0381165f908152601b60205260408120805460ff19166001179055600b805491612c4683613679565b9091555050600f546001600160a01b0382165f9081526015602090815260408083209390935560128152828220429055601a81529181207f000000000000000000000000000000000000000000000000000000000000000081558551600182015591850151600383015560048201556080840151600582015560a08401516006909101555b5080612cd681613679565b915050612bc4565b506040518281527fcc3ea4ccc3876221c238f6e5d8f2ae37a892fdafcf77b9889ebe193958128efd906020015b60405180910390a1505050565b612d20612d6b565b612d2b83838361314a565b600954604080519182526020820185905281018290527f87c2af2747de4bc7935697bdac2c724ce1a28877f21caba0bee6acf1f141643290606001612d0b565b5f546001600160a01b031633146120cb5760405163118cdaa760e01b815233600482015260240161137a565b612d9f6131f2565b6001600160a01b0381165f90815260156020526040902054600f54670de0b6b3a764000091612dcd91613762565b6001600160a01b0383165f90815260136020526040902054612def9190613713565b612df99190613730565b6001600160a01b0382165f9081526014602052604081208054909190612e2090849061374f565b9091555050600f546001600160a01b039091165f90815260156020526040902055565b5f84815260166020908152604080832081516101008101835281548152600182015481850152600282015481840152600382015460608201526004820154608082015260058083015460a083015260068084015460c084015260079093015460ff16151560e08301526001600160a01b038b168652601a9094529190932091820154928201549092612edb9189918891889190613273565b15612ef957604051631f9aa14f60e11b815260040160405180910390fd5b8060010154816002015410612f2157604051636d6cfd7d60e11b815260040160405180910390fd5b80600301548260a001518260040154612f3a919061374f565b1115612f5957604051630f576a4f60e41b815260040160405180910390fd5b8160a00151816004015f828254612f70919061374f565b909155505060088054905f612f8483613679565b9091555050604080830186905260608301859052600880546020808601919091526001600160a01b038a165f818152601d83528481208a825283528481208982528352848120805460ff19166001179055818152601e83528481208a8252835284812089825283528481208b905592549083526018909152919020613008916132c9565b506008545f90815260196020908152604080832085518155918501516001830155840151600280830191909155606085015160038301556080850151600483015560a0850151600583015560c0850151600683015560e08501516007909201805460ff191692151592909217909155820180549161308583613679565b91905055506130988783608001516132d4565b60085460408051858152602081019290925281018690526060810185905286906001600160a01b0389169081907fbb355279b9cc8558bd03d4b1dbb0007f6e6dc26a512f267d829ada5da913cee79060800160405180910390a450505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60098054905f61315983613679565b909155505060408051610100810182526009548082525f1960208084018281528486018381526060860193845260808601998a5260a0860198895260c086019788525f60e087018181529581526016909352959091209351845551600184015592516002830155915160038201559351600485015591516005840155516006830155516007909101805460ff1916911515919091179055565b600d5442116131fd57565b600e545f0361320c5742600d55565b5f600d544261321b9190613762565b90505f6132266126b6565b90505f6132338284613713565b600e5490915061324b670de0b6b3a764000083613713565b6132559190613730565b600f5f828254613265919061374f565b909155505042600d55505050565b5f82851015806132835750818410155b15613290575060016132c0565b506001600160a01b0385165f908152601d60209081526040808320878452825280832086845290915290205460ff165b95945050505050565b5f6119af83836133e0565b60075460ff1661332f576007805460ff19166001179055426006819055600d556040517fdaae9aa758637a0d349f036f099afd70aa88d8ac63fce096321de512ffebc16c906133269043815260200190565b60405180910390a15b61333882612d97565b80600e5f828254613349919061374f565b90915550506001600160a01b0382165f908152601360205260408120805483929061337590849061374f565b90915550506001600160a01b0382165f818152601360209081526040808320546014909252918290205491517fa051d58ced8df58040b29d2c939da70a826ae40290f77c9a66b38b8b85315f65926133d4928252602082015260400190565b60405180910390a25050565b6318fb58646004525f8281526024812068fbb67fda52d4bfb8bf830361340d5763f5a267f15f526004601cfd5b8261341f5768fbb67fda52d4bfb8bf92505b80602052825f5260405f20805461345457811954805f52848160011c8401558060011c60010182556002810183195550600192505b505092915050565b6001600160a01b0381168114611691575f80fd5b5f60208284031215613480575f80fd5b81356119af8161345c565b5f6020828403121561349b575f80fd5b5035919050565b5f805f606084860312156134b4575f80fd5b83356134bf8161345c565b95602085013595506040909401359392505050565b5f80602083850312156134e5575f80fd5b823567ffffffffffffffff808211156134fc575f80fd5b818501915085601f83011261350f575f80fd5b81358181111561351d575f80fd5b8660208260051b8501011115613531575f80fd5b60209290920196919550909350505050565b8015158114611691575f80fd5b5f8060408385031215613561575f80fd5b823561356c8161345c565b9150602083013561357c81613543565b809150509250929050565b5f805f60608486031215613599575f80fd5b505081359360208301359350604090920135919050565b5f80604083850312156135c1575f80fd5b50508035926020909101359150565b5f805f805f60a086880312156135e4575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f60208284031215613617575f80fd5b813560ff811681146119af575f80fd5b5f8060408385031215613638575f80fd5b82356136438161345c565b946020939093013593505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161368a5761368a613665565b5060010190565b80516001600160701b03811681146136a7575f80fd5b919050565b5f805f606084860312156136be575f80fd5b6136c784613691565b92506136d560208501613691565b9150604084015163ffffffff811681146136ed575f80fd5b809150509250925092565b5f60208284031215613708575f80fd5b81516119af8161345c565b808202811582820484141761372a5761372a613665565b92915050565b5f8261374a57634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111561372a5761372a613665565b8181038181111561372a5761372a613665565b6020808252602a908201527f47616d6520686173206e6f7420737461727465642079657420284472696c6c696040820152696e67204c6f636b65642960b01b606082015260800190565b5f602082840312156137cf575f80fd5b81516119af81613543565b5f602082840312156137ea575f80fd5b5051919050565b5f816137ff576137ff613665565b505f19019056fea26469706673582212206d951f7ac4f0d052329a23db1492f6fb45a120ca79422b48a36a82b67b932ee664736f6c63430008140033

Deployed Bytecode

0x608060405260043610610416575f3560e01c8063787a08a611610220578063bb485bbd11610129578063e2b15d8c116100b3578063f37785a211610078578063f37785a214610e48578063f537967114610e5c578063f60cdcf614610e7b578063f6934a9f14610e90578063f86f25ee14610ebb575f80fd5b8063e2b15d8c14610d9b578063e92820e614610dda578063efc5119414610df9578063f2fde38b14610e15578063f322b65f14610e34575f80fd5b8063c7fda104116100f9578063c7fda10414610cdb578063cc53b27614610d3a578063d013eb0a14610d68578063d09d4abd14610a66578063dff657c314610d87575f80fd5b8063bb485bbd14610c5a578063bbb1239214610c6f578063c03afb5914610c8e578063c2df398214610cad575f80fd5b80639231cf74116101aa578063a9bc82491161017a578063a9bc824914610b3d578063ad154c6814610b52578063b3c0d5e414610b85578063b55de1a814610ba4578063b77cf9c614610c2f575f80fd5b80639231cf7414610abc57806394fc19e414610ad15780639ca423b314610aea578063a269435d14610b1e575f80fd5b806384caff83116101f057806384caff8314610a3257806384db13d214610a4757806386b3cd2614610a665780638da5cb5b14610a815780638ea5220f14610a9d575f80fd5b8063787a08a6146109d557806378e97925146109ea578063808a5457146109ff57806384ae48b514610a1e575f80fd5b8063372500ab116103225780634fe6f7a9116102ac5780635f7f44e11161027c5780635f7f44e11461094b5780636a8fa04114610979578063715018a61461098d57806375ddec4b146109a157806375f0a874146109b6575f80fd5b80634fe6f7a9146108d157806356fbab7a146109045780635a5ccef0146109175780635d098b381461092c575f80fd5b806341f09ea6116102f257806341f09ea61461082d578063426222d5146108485780634487872414610873578063476e2e66146108935780634df9d6ba146108b2575f80fd5b8063372500ab146107b95780633adde9c1146107c15780633d5e1f1e146107d757806340f5da9e14610802575f80fd5b80631c52ef27116103a3578063234f3f1b11610373578063234f3f1b14610710578063238760641461073b5780632aabc69e1461075a5780633041a5201461077957806333437f64146107a4575f80fd5b80631c52ef27146106915780631dbd6bc8146106a65780631ea4bab7146106ba57806321bade13146106d6575f80fd5b806307604998116103e9578063076049981461053e57806312544abc14610588578063136d5072146105a757806316ccbed2146105d25780631913785614610610575f80fd5b80630504023b1461041a57806305244d771461043b578063055ad42e146104dc57806306bbf22814610507575b5f80fd5b348015610425575f80fd5b50610439610434366004613470565b610eda565b005b348015610446575f80fd5b5061049a61045536600461348b565b60166020525f90815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909160ff1688565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c0830152151560e0820152610100015b60405180910390f35b3480156104e7575f80fd5b506023546104f59060ff1681565b60405160ff90911681526020016104d3565b348015610512575f80fd5b50600154610526906001600160a01b031681565b6040516001600160a01b0390911681526020016104d3565b348015610549575f80fd5b5061057a6105583660046134a2565b601e60209081525f938452604080852082529284528284209052825290205481565b6040519081526020016104d3565b348015610593575f80fd5b506104396105a23660046134d4565b610f04565b3480156105b2575f80fd5b5061057a6105c1366004613470565b60186020525f908152604090205481565b3480156105dd575f80fd5b506106006105ec366004613470565b601b6020525f908152604090205460ff1681565b60405190151581526020016104d3565b34801561061b575f80fd5b5061066261062a36600461348b565b60176020525f908152604090208054600182015460028301546003840154600485015460059095015493949293919260ff9091169186565b6040805196875260208701959095529385019290925215156060840152608083015260a082015260c0016104d3565b34801561069c575f80fd5b5061057a600f5481565b3480156106b1575f80fd5b5061057a610f80565b3480156106c5575f80fd5b5061057a683635c9adc5dea0000081565b3480156106e1575f80fd5b506106f56106f0366004613470565b61112a565b604080519384526020840192909252908201526060016104d3565b34801561071b575f80fd5b5061057a61072a366004613470565b60136020525f908152604090205481565b348015610746575f80fd5b50610439610755366004613550565b61115b565b348015610765575f80fd5b506106f561077436600461348b565b6111cf565b348015610784575f80fd5b5061057a610793366004613470565b60216020525f908152604090205481565b3480156107af575f80fd5b5061057a60095481565b61043961125f565b3480156107cc575f80fd5b5061057a6207e90081565b3480156107e2575f80fd5b5061057a6107f1366004613470565b60116020525f908152604090205481565b34801561080d575f80fd5b5061057a61081c366004613470565b60146020525f908152604090205481565b348015610838575f80fd5b5061057a6739d2f941e420aaaa81565b348015610853575f80fd5b5061057a610862366004613470565b60156020525f908152604090205481565b34801561087e575f80fd5b5060045461060090600160a01b900460ff1681565b34801561089e575f80fd5b506104396108ad366004613587565b611694565b3480156108bd575f80fd5b5061057a6108cc366004613470565b6118bf565b3480156108dc575f80fd5b5061057a7f000000000000000000000000000000000000000000000000000000000000000181565b610439610912366004613470565b6119b6565b348015610922575f80fd5b5061057a600e5481565b348015610937575f80fd5b50610439610946366004613470565b611f68565b348015610956575f80fd5b50610600610965366004613470565b601c6020525f908152604090205460ff1681565b348015610984575f80fd5b50610439611f92565b348015610998575f80fd5b506104396120ba565b3480156109ac575f80fd5b5061057a60245481565b3480156109c1575f80fd5b50600354610526906001600160a01b031681565b3480156109e0575f80fd5b5061057a60105481565b3480156109f5575f80fd5b5061057a60065481565b348015610a0a575f80fd5b50600454610526906001600160a01b031681565b348015610a29575f80fd5b506104396120cd565b348015610a3d575f80fd5b5061057a60055481565b348015610a52575f80fd5b50610439610a6136600461348b565b6121c9565b348015610a71575f80fd5b5061057a670de0b6b3a764000081565b348015610a8c575f80fd5b505f546001600160a01b0316610526565b348015610aa8575f80fd5b50600254610526906001600160a01b031681565b348015610ac7575f80fd5b5061057a600d5481565b348015610adc575f80fd5b506007546106009060ff1681565b348015610af5575f80fd5b50610526610b04366004613470565b601f6020525f90815260409020546001600160a01b031681565b348015610b29575f80fd5b50610439610b383660046135b0565b6121d6565b348015610b48575f80fd5b5061057a600c5481565b348015610b5d575f80fd5b5061057a7f000000000000000000000000000000000000000000000000000000000000000181565b348015610b90575f80fd5b50610439610b9f3660046134d4565b6122a3565b348015610baf575f80fd5b50610bfa610bbe366004613470565b601a6020525f90815260409020805460018201546002830154600384015460048501546005860154600690960154949593949293919290919087565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016104d3565b348015610c3a575f80fd5b5061057a610c49366004613470565b60126020525f908152604090205481565b348015610c65575f80fd5b5061057a600a5481565b348015610c7a575f80fd5b50610439610c893660046135d0565b61231a565b348015610c99575f80fd5b50610439610ca8366004613607565b612403565b348015610cb8575f80fd5b50610600610cc7366004613470565b60256020525f908152604090205460ff1681565b348015610ce6575f80fd5b5061049a610cf536600461348b565b60196020525f90815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909160ff1688565b348015610d45575f80fd5b50610600610d54366004613470565b60266020525f908152604090205460ff1681565b348015610d73575f80fd5b50610439610d823660046135b0565b612453565b348015610d92575f80fd5b5061057a6126b6565b348015610da6575f80fd5b50610600610db53660046134a2565b601d60209081525f938452604080852082529284528284209052825290205460ff1681565b348015610de5575f80fd5b50610526610df4366004613627565b61270a565b348015610e04575f80fd5b5061057a681b1ae4d6e2ef50000081565b348015610e20575f80fd5b50610439610e2f366004613470565b61273d565b348015610e3f575f80fd5b50610439612777565b348015610e53575f80fd5b506104396127ed565b348015610e67575f80fd5b50610439610e763660046134d4565b612b43565b348015610e86575f80fd5b5061057a600b5481565b348015610e9b575f80fd5b5061057a610eaa366004613470565b60226020525f908152604090205481565b348015610ec6575f80fd5b50610439610ed5366004613587565b612d18565b610ee2612d6b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610f0c612d6b565b5f5b81811015610f7b57600160265f858585818110610f2d57610f2d613651565b9050602002016020810190610f429190613470565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905580610f7381613679565b915050610f0e565b505050565b6004545f90600160a01b900460ff161580610fa457506004546001600160a01b0316155b15610fb0575060055490565b6004805460408051630240bc6b60e21b815290515f9384936001600160a01b031692630902f1ac92818301926060928290030181865afa158015610ff6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101a91906136ac565b50915091505f60045f9054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611070573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109491906136f8565b90506001600160701b03831615806110b357506001600160701b038216155b156110c357600554935050505090565b6001545f9081906001600160a01b03908116908416036110f25750506001600160701b03828116908416611103565b50506001600160701b038084169083165b8061111683670de0b6b3a7640000613713565b6111209190613730565b9550505050505090565b6001600160a01b0381165f9081526020808052604080832054602283528184205460219093529220545b9193909250565b611163612d6b565b600480546001600160a01b0384166001600160a81b03199091168117600160a01b841515908102919091179092556040805191825260208201929092527f94c9cbe1d9aa7af08484f82ab0179d6db973a391236668c34192d954ff32c06c910160405180910390a15050565b5f805f600a5484106111e857505f915081905080611154565b5f6017816111f787600161374f565b815260208082019290925260409081015f20815160c081018352815480825260018301549482018590526002830154938201849052600383015460ff16151560608301526004830154608083015260059092015460a090910152909790965090945092505050565b60075460ff1661128257604051633017f16560e11b815260040160405180910390fd5b61128b33612d97565b335f90815260146020526040902054801561169157335f908152601260205260408120546112b99042613762565b90505f6112c8610e1083613730565b90505f601e8083106112dc575f91506112e9565b6112e68382613762565b91505b5f6112f2610f80565b90505f670de0b6b3a76400006113088389613713565b6113129190613730565b90505f606461132283600a613713565b61132c9190613730565b9050803410156113835760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e74205061792d746f2d436c61696d2046656500000060448201526064015b60405180910390fd5b5f61138f600283613730565b90505f61139c8284613762565b6002546040519192506001600160a01b03169083156108fc029084905f818181858888f193505050501580156113d4573d5f803e3d5ffd5b506003546040516001600160a01b039091169082156108fc029083905f818181858888f1935050505015801561140c573d5f803e3d5ffd5b50604080518481526020810184905290810182905233907fb3aa4172b89ad35b55207df3917001046668de5f42c54b312c9e0b02e2968c8b9060600160405180910390a2335f90815260146020908152604080832083905560129091528120429055606461147a898d613713565b6114849190613730565b90505f611491828d613762565b90505f6103e86114a28e604b613713565b6114ac9190613730565b90505f6103e86114bd8f6019613713565b6114c79190613730565b6001546040516340c10f1960e01b8152336004820152602481018690529192506001600160a01b0316906340c10f19906044015f604051808303815f87803b158015611511575f80fd5b505af1158015611523573d5f803e3d5ffd5b5050335f908152601f60205260409020546001600160a01b031691505080156115d7576001546040516340c10f1960e01b8152306004820152602481018590526001600160a01b03909116906340c10f19906044015f604051808303815f87803b15801561158f575f80fd5b505af11580156115a1573d5f803e3d5ffd5b505050506001600160a01b0381165f90815260216020526040812080548492906115cc90849061374f565b9091555061164d9050565b6001546001600160a01b03166340c10f19306115f3858761374f565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015611636575f80fd5b505af1158015611648573d5f803e3d5ffd5b505050505b60405184815233907ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe9060200160405180910390a250505050505050505050505050505b50565b60235460ff166003146116b95760405162461bcd60e51b815260040161137a90613775565b335f908152601b602052604090205460ff166116e85760405163350ac7f360e01b815260040160405180910390fd5b5f83815260166020908152604080832081516101008101835281548082526001830154948201949094526002820154928101929092526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460ff16151560e082015291036117735760405163990e7a0b60e01b815260040160405180910390fd5b60015460c08201516040516323b872dd60e01b815233600482015230602482015260448101919091525f916001600160a01b0316906323b872dd906064016020604051808303815f875af11580156117cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f191906137bf565b9050806118385760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604482015260640161137a565b60c0820151156118a75760015460c0830151604051630852cd8d60e31b81526001600160a01b03909216916342966c68916118799160040190815260200190565b5f604051808303815f87803b158015611890575f80fd5b505af11580156118a2573d5f803e3d5ffd5b505050505b6118b8338686868660c00151612e43565b5050505050565b600f54600d545f9190421180156118d75750600e5415155b15611935575f600d54426118eb9190613762565b90505f6118f66126b6565b90505f6119038284613713565b600e5490915061191b670de0b6b3a764000083613713565b6119259190613730565b61192f908561374f565b93505050505b6001600160a01b0383165f90815260156020526040902054670de0b6b3a7640000906119619083613762565b6001600160a01b0385165f908152601360205260409020546119839190613713565b61198d9190613730565b6001600160a01b0384165f908152601460205260409020546119af919061374f565b9392505050565b335f908152601b602052604090205460ff16156119e65760405163120d9bd960e11b815260040160405180910390fd5b60235460ff16611a2c5760405162461bcd60e51b815260206004820152601160248201527014d85b195cc81b9bdd081cdd185c9d1959607a1b604482015260640161137a565b6023545f9060ff16600103611aa857335f9081526025602052604090205460ff16611a995760405162461bcd60e51b815260206004820152601b60248201527f4e6f742057686974656c697374656420666f7220506861736520310000000000604482015260640161137a565b50670de0b6b3a7640000611b34565b60235460ff16600203611aec57335f9081526026602052604090205460ff1615611adc5750681b1ae4d6e2ef500000611b34565b50683635c9adc5dea00000611b34565b506024546001600160a01b03821615801590611b1157506001600160a01b0382163314155b15611b34576064602454605a611b279190613713565b611b319190613730565b90505b80341015611b5557604051636956f2ab60e11b815260040160405180910390fd5b5f6001600160a01b03831615801590611b7757506001600160a01b0383163314155b8015611b88575060235460ff166003145b90508015611d63575f6064602454600a611ba29190613713565b611bac9190613730565b90505f611bb98234613762565b6040519091506001600160a01b0386169083156108fc029084905f818181858888f19350505050158015611bef573d5f803e3d5ffd5b506001600160a01b0385165f9081526022602052604081208054849290611c1790849061374f565b9091555050335f818152601f6020908152604080832080546001600160a01b03808c166001600160a01b0319928316811790935591855283805291842080546001810182559085529290932090910180549091169092179091556003541615801590611c9457506002546003546001600160a01b03908116911614155b15611d23575f611ca5600283613730565b6002546040519192506001600160a01b03169082156108fc029083905f818181858888f19350505050158015611cdd573d5f803e3d5ffd5b506003546001600160a01b03166108fc611cf78385613762565b6040518115909202915f818181858888f19350505050158015611d1c573d5f803e3d5ffd5b5050611d5c565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015611d5a573d5f803e3d5ffd5b505b5050611e4e565b6003546001600160a01b031615801590611d8e57506002546003546001600160a01b03908116911614155b15611e16575f611d9f600234613730565b6002546040519192506001600160a01b03169082156108fc029083905f818181858888f19350505050158015611dd7573d5f803e3d5ffd5b506003546001600160a01b03166108fc611df18334613762565b6040518115909202915f818181858888f19350505050158015611d5c573d5f803e3d5ffd5b6002546040516001600160a01b03909116903480156108fc02915f818181858888f19350505050158015611e4c573d5f803e3d5ffd5b505b335f908152601b60205260408120805460ff19166001179055600b805491611e7583613679565b9091555050335f8181526012602090815260408083204290557f000000000000000000000000000000000000000000000000000000000000000180845260178352818420825160c0810184528154815260018083015482870190815260028401548387015260038085015460ff16151560608501526004808601546080860190815260059687015460a087019081528c8c52601a909a52888b20978855855194880194909455915190860155840187905551918301919091559251600682015590519193909290917febe01df6d96920585e2744874d810e5560bc050e9ff947aa34f10422a33cbc279190a25050505050565b611f70612d6b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b611f9a612d6b565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015611fe0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061200491906137da565b90505f81116120405760405162461bcd60e51b81526020600482015260086024820152674e6f20504554524f60c01b604482015260640161137a565b60015460025460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb906044016020604051808303815f875af1158015612092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b691906137bf565b5050565b6120c2612d6b565b6120cb5f6130fb565b565b335f90815260216020526040902054806121205760405162461bcd60e51b81526020600482015260146024820152734e6f20726566657272616c206561726e696e677360601b604482015260640161137a565b335f818152602160205260408082209190915560015490516340c10f1960e01b81526004810192909252602482018390526001600160a01b0316906340c10f19906044015f604051808303815f87803b15801561217b575f80fd5b505af115801561218d573d5f803e3d5ffd5b50506040518381523392507f5be4d22009fea85381595ed91090bc5c0bc92a93fe07ed7472c5888eb1993f83915060200160405180910390a250565b6121d1612d6b565b600555565b60235460ff166003146121fb5760405162461bcd60e51b815260040161137a90613775565b335f908152601c602052604090205460ff161561222b57604051639d38dc2760e01b815260040160405180910390fd5b335f908152601b602052604090205460ff1661225a5760405163350ac7f360e01b815260040160405180910390fd5b335f818152601c60205260408120805460ff191660011790556120b691907f00000000000000000000000000000000000000000000000000000000000000019085908590612e43565b6122ab612d6b565b5f5b81811015610f7b57600160255f8585858181106122cc576122cc613651565b90506020020160208101906122e19190613470565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790558061231281613679565b9150506122ad565b612322612d6b565b6040518060c001604052808681526020018581526020018481526020015f151581526020018381526020018281525060175f600a5f815461236290613679565b9182905550815260208082019290925260409081015f208351815583830151600182015583820151600282015560608085015160038301805460ff19169115159190911790556080850151600483015560a090940151600590910155600a54815190815291820186905281018790527f47d717b6b55d68dba6b9044d2f7a4eac7b376a5ce11ed5de835b8c83c829f354910160405180910390a15050505050565b61240b612d6b565b6023805460ff191660ff83169081179091556040519081527fa6dcc92f45df25789d5639b7a0c97ba1edf3bb1c0b5dd3376fd96a0db87c46429060200160405180910390a150565b335f908152601d60209081526040808320858452825280832084845290915290205460ff1661249557604051635522b5a360e01b815260040160405180910390fd5b335f818152601a60209081526040808320601e835281842087855283528184208685528352818420548085526016845293829020825161010081018452815481526001820154948101949094526002810154928401929092526003820154606084015260048201546080840152600582015460a0840152600682015460c084015260079091015460ff16151560e08301529261253090612d97565b8060800151600e541061255d578060800151600e5f8282546125529190613762565b909155506125629050565b5f600e555b6080810151335f90815260136020526040902054106125a9576080810151335f908152601360205260408120805490919061259e908490613762565b909155506125b99050565b335f908152601360205260408120555b8060a001518360040154106125ea578060a00151836004015f8282546125df9190613762565b909155506125f19050565b5f60048401555b335f818152601d6020908152604080832089845282528083208884528252808320805460ff19169055928252601e8152828220888352815282822087835290529081205560028301541561265657600283018054905f612650836137f1565b91905055505b335f818152601360209081526040808320546014909252918290205491517fe331ada0d0e61e9a4196bf4994f2519193d70a601daff346c4276d591664da9a926126a7928252602082015260400190565b60405180910390a25050505050565b6007545f9060ff166126c757505f90565b5f600654426126d69190613762565b90505f6126e66207e90083613730565b905060408111156126f9575f9250505090565b6739d2f941e420aaaa901c92915050565b60208052815f5260405f208181548110612722575f80fd5b5f918252602090912001546001600160a01b03169150829050565b612745612d6b565b6001600160a01b03811661276e57604051631e4fbdf760e01b81525f600482015260240161137a565b611691816130fb565b61277f612d6b565b47806127b65760405162461bcd60e51b815260206004820152600660248201526527379026a7a760d11b604482015260640161137a565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156120b6573d5f803e3d5ffd5b60235460ff166003146128555760405162461bcd60e51b815260206004820152602a60248201527f47616d6520686173206e6f7420737461727465642079657420285570677261646044820152696573204c6f636b65642960b01b606482015260840161137a565b335f908152601b602052604090205460ff166128845760405163350ac7f360e01b815260040160405180910390fd5b601054335f908152601160205260409020546128a0919061374f565b4210156128ef5760405162461bcd60e51b815260206004820152601d60248201527f436f6f6c646f776e206163746976653a20506c6561736520776169742e000000604482015260640161137a565b335f908152601a60205260408120805490919061290d90600161374f565b9050600a5481111561293257604051633196792f60e11b815260040160405180910390fd5b5f818152601760209081526040808320815160c08101835281548152600180830154948201949094526002820154818401819052600383015460ff1615156060830152600480840154608084015260059093015460a0830152935492516323b872dd60e01b8152339281019290925230602483015260448201939093529192916001600160a01b03909116906323b872dd906064016020604051808303815f875af11580156129e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0791906137bf565b905080612a4e5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604482015260640161137a565b604082015115612abd576001546040808401519051630852cd8d60e31b81526001600160a01b03909216916342966c6891612a8f9160040190815260200190565b5f604051808303815f87803b158015612aa6575f80fd5b505af1158015612ab8573d5f803e3d5ffd5b505050505b828455815160018501556020808301805160038701556080840151600587015560a08401516006870155335f8181526011845260409081902042905585519251815188815294850193909352830191909152907f1957c3ddde972a0f75f4e54bddd65ada5f0810c35dee609b075fc2d92ec399a99060600160405180910390a250505050565b612b4b612d6b565b7f00000000000000000000000000000000000000000000000000000000000000015f908152601760209081526040808320815160c08101835281548152600182015493810193909352600281015491830191909152600381015460ff1615156060830152600481015460808301526005015460a0820152905b82811015612cde575f848483818110612bdf57612bdf613651565b9050602002016020810190612bf49190613470565b6001600160a01b0381165f908152601b602052604090205490915060ff16612ccb576001600160a01b0381165f908152601b60205260408120805460ff19166001179055600b805491612c4683613679565b9091555050600f546001600160a01b0382165f9081526015602090815260408083209390935560128152828220429055601a81529181207f000000000000000000000000000000000000000000000000000000000000000181558551600182015591850151600383015560048201556080840151600582015560a08401516006909101555b5080612cd681613679565b915050612bc4565b506040518281527fcc3ea4ccc3876221c238f6e5d8f2ae37a892fdafcf77b9889ebe193958128efd906020015b60405180910390a1505050565b612d20612d6b565b612d2b83838361314a565b600954604080519182526020820185905281018290527f87c2af2747de4bc7935697bdac2c724ce1a28877f21caba0bee6acf1f141643290606001612d0b565b5f546001600160a01b031633146120cb5760405163118cdaa760e01b815233600482015260240161137a565b612d9f6131f2565b6001600160a01b0381165f90815260156020526040902054600f54670de0b6b3a764000091612dcd91613762565b6001600160a01b0383165f90815260136020526040902054612def9190613713565b612df99190613730565b6001600160a01b0382165f9081526014602052604081208054909190612e2090849061374f565b9091555050600f546001600160a01b039091165f90815260156020526040902055565b5f84815260166020908152604080832081516101008101835281548152600182015481850152600282015481840152600382015460608201526004820154608082015260058083015460a083015260068084015460c084015260079093015460ff16151560e08301526001600160a01b038b168652601a9094529190932091820154928201549092612edb9189918891889190613273565b15612ef957604051631f9aa14f60e11b815260040160405180910390fd5b8060010154816002015410612f2157604051636d6cfd7d60e11b815260040160405180910390fd5b80600301548260a001518260040154612f3a919061374f565b1115612f5957604051630f576a4f60e41b815260040160405180910390fd5b8160a00151816004015f828254612f70919061374f565b909155505060088054905f612f8483613679565b9091555050604080830186905260608301859052600880546020808601919091526001600160a01b038a165f818152601d83528481208a825283528481208982528352848120805460ff19166001179055818152601e83528481208a8252835284812089825283528481208b905592549083526018909152919020613008916132c9565b506008545f90815260196020908152604080832085518155918501516001830155840151600280830191909155606085015160038301556080850151600483015560a0850151600583015560c0850151600683015560e08501516007909201805460ff191692151592909217909155820180549161308583613679565b91905055506130988783608001516132d4565b60085460408051858152602081019290925281018690526060810185905286906001600160a01b0389169081907fbb355279b9cc8558bd03d4b1dbb0007f6e6dc26a512f267d829ada5da913cee79060800160405180910390a450505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60098054905f61315983613679565b909155505060408051610100810182526009548082525f1960208084018281528486018381526060860193845260808601998a5260a0860198895260c086019788525f60e087018181529581526016909352959091209351845551600184015592516002830155915160038201559351600485015591516005840155516006830155516007909101805460ff1916911515919091179055565b600d5442116131fd57565b600e545f0361320c5742600d55565b5f600d544261321b9190613762565b90505f6132266126b6565b90505f6132338284613713565b600e5490915061324b670de0b6b3a764000083613713565b6132559190613730565b600f5f828254613265919061374f565b909155505042600d55505050565b5f82851015806132835750818410155b15613290575060016132c0565b506001600160a01b0385165f908152601d60209081526040808320878452825280832086845290915290205460ff165b95945050505050565b5f6119af83836133e0565b60075460ff1661332f576007805460ff19166001179055426006819055600d556040517fdaae9aa758637a0d349f036f099afd70aa88d8ac63fce096321de512ffebc16c906133269043815260200190565b60405180910390a15b61333882612d97565b80600e5f828254613349919061374f565b90915550506001600160a01b0382165f908152601360205260408120805483929061337590849061374f565b90915550506001600160a01b0382165f818152601360209081526040808320546014909252918290205491517fa051d58ced8df58040b29d2c939da70a826ae40290f77c9a66b38b8b85315f65926133d4928252602082015260400190565b60405180910390a25050565b6318fb58646004525f8281526024812068fbb67fda52d4bfb8bf830361340d5763f5a267f15f526004601cfd5b8261341f5768fbb67fda52d4bfb8bf92505b80602052825f5260405f20805461345457811954805f52848160011c8401558060011c60010182556002810183195550600192505b505092915050565b6001600160a01b0381168114611691575f80fd5b5f60208284031215613480575f80fd5b81356119af8161345c565b5f6020828403121561349b575f80fd5b5035919050565b5f805f606084860312156134b4575f80fd5b83356134bf8161345c565b95602085013595506040909401359392505050565b5f80602083850312156134e5575f80fd5b823567ffffffffffffffff808211156134fc575f80fd5b818501915085601f83011261350f575f80fd5b81358181111561351d575f80fd5b8660208260051b8501011115613531575f80fd5b60209290920196919550909350505050565b8015158114611691575f80fd5b5f8060408385031215613561575f80fd5b823561356c8161345c565b9150602083013561357c81613543565b809150509250929050565b5f805f60608486031215613599575f80fd5b505081359360208301359350604090920135919050565b5f80604083850312156135c1575f80fd5b50508035926020909101359150565b5f805f805f60a086880312156135e4575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f60208284031215613617575f80fd5b813560ff811681146119af575f80fd5b5f8060408385031215613638575f80fd5b82356136438161345c565b946020939093013593505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161368a5761368a613665565b5060010190565b80516001600160701b03811681146136a7575f80fd5b919050565b5f805f606084860312156136be575f80fd5b6136c784613691565b92506136d560208501613691565b9150604084015163ffffffff811681146136ed575f80fd5b809150509250925092565b5f60208284031215613708575f80fd5b81516119af8161345c565b808202811582820484141761372a5761372a613665565b92915050565b5f8261374a57634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111561372a5761372a613665565b8181038181111561372a5761372a613665565b6020808252602a908201527f47616d6520686173206e6f7420737461727465642079657420284472696c6c696040820152696e67204c6f636b65642960b01b606082015260800190565b5f602082840312156137cf575f80fd5b81516119af81613543565b5f602082840312156137ea575f80fd5b5051919050565b5f816137ff576137ff613665565b505f19019056fea26469706673582212206d951f7ac4f0d052329a23db1492f6fb45a120ca79422b48a36a82b67b932ee664736f6c63430008140033

Deployed Bytecode Sourcemap

12204:21820:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33610:91;;;;;;;;;;-1:-1:-1;33610:91:0;;;;;:::i;:::-;;:::i;:::-;;13568:35;;;;;;;;;;-1:-1:-1;13568:35:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;924:25:1;;;980:2;965:18;;958:34;;;;1008:18;;;1001:34;;;;1066:2;1051:18;;1044:34;;;;1109:3;1094:19;;1087:35;1153:3;1138:19;;1131:35;1197:3;1182:19;;1175:35;1254:14;1247:22;1241:3;1226:19;;1219:51;911:3;896:19;13568:35:0;;;;;;;;14421:29;;;;;;;;;;-1:-1:-1;14421:29:0;;;;;;;;;;;1453:4:1;1441:17;;;1423:36;;1411:2;1396:18;14421:29:0;1281:184:1;12304:25:0;;;;;;;;;;-1:-1:-1;12304:25:0;;;;-1:-1:-1;;;;;12304:25:0;;;;;;-1:-1:-1;;;;;1634:32:1;;;1616:51;;1604:2;1589:18;12304:25:0;1470:203:1;14074:87:0;;;;;;;;;;-1:-1:-1;14074:87:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2212:25:1;;;2200:2;2185:18;14074:87:0;2066:177:1;27549:188:0;;;;;;;;;;-1:-1:-1;27549:188:0;;;;;:::i;:::-;;:::i;13665:70::-;;;;;;;;;;-1:-1:-1;13665:70:0;;;;;:::i;:::-;;;;;;;;;;;;;;13850:55;;;;;;;;;;-1:-1:-1;13850:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3033:14:1;;3026:22;3008:41;;2996:2;2981:18;13850:55:0;2868:187:1;13610:42:0;;;;;;;;;;-1:-1:-1;13610:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3341:25:1;;;3397:2;3382:18;;3375:34;;;;3425:18;;;3418:34;;;;3495:14;3488:22;3483:2;3468:18;;3461:50;3542:3;3527:19;;3520:35;3586:3;3571:19;;3564:35;3328:3;3313:19;13610:42:0;3060:545:1;13158:37:0;;;;;;;;;;;;;;;;26359:727;;;;;;;;;;;;;:::i;14646:56::-;;;;;;;;;;;;14692:10;14646:56;;29963:230;;;;;;;;;;-1:-1:-1;29963:230:0;;;;;:::i;:::-;;:::i;:::-;;;;3812:25:1;;;3868:2;3853:18;;3846:34;;;;3896:18;;;3889:34;3800:2;3785:18;29963:230:0;3610:319:1;13387:49:0;;;;;;;;;;-1:-1:-1;13387:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;26033:192;;;;;;;;;;-1:-1:-1;26033:192:0;;;;;:::i;:::-;;:::i;33709:312::-;;;;;;;;;;-1:-1:-1;33709:312:0;;;;;:::i;:::-;;:::i;14289:55::-;;;;;;;;;;-1:-1:-1;14289:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;12938:29;;;;;;;;;;;;;;;;23608:2116;;;:::i;12797:47::-;;;;;;;;;;;;12838:6;12797:47;;13271:50;;;;;;;;;;-1:-1:-1;13271:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;13443:55;;;;;;;;;;-1:-1:-1;13443:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;12707:70;;;;;;;;;;;;12758:19;12707:70;;13505:50;;;;;;;;;;-1:-1:-1;13505:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;12468:29;;;;;;;;;;-1:-1:-1;12468:29:0;;;;-1:-1:-1;;;12468:29:0;;;;;;28998:626;;;;;;;;;;-1:-1:-1;28998:626:0;;;;;:::i;:::-;;:::i;18985:639::-;;;;;;;;;;-1:-1:-1;18985:639:0;;;;;:::i;:::-;;:::i;14875:44::-;;;;;;;;;;;;;;;20195:2854;;;;;;:::i;:::-;;:::i;13123:28::-;;;;;;;;;;;;;;;;27098:108;;;;;;;;;;-1:-1:-1;27098:108:0;;;;;:::i;:::-;;:::i;13912:50::-;;;;;;;;;;-1:-1:-1;13912:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;30201:225;;;;;;;;;;;;;:::i;1279:103::-;;;;;;;;;;;;;:::i;14470:45::-;;;;;;;;;;;;;;;;12368:30;;;;;;;;;;-1:-1:-1;12368:30:0;;;;-1:-1:-1;;;;;12368:30:0;;;13226:31;;;;;;;;;;;;;;;;12567:24;;;;;;;;;;;;;;;;12432:28;;;;;;;;;;-1:-1:-1;12432:28:0;;;;-1:-1:-1;;;;;12432:28:0;;;29632:323;;;;;;;;;;;;;:::i;12505:46::-;;;;;;;;;;;;;;;;26233:118;;;;;;;;;;-1:-1:-1;26233:118:0;;;;;:::i;:::-;;:::i;12852:48::-;;;;;;;;;;;;12896:4;12852:48;;1010:87;;;;;;;;;;-1:-1:-1;1056:7:0;1083:6;-1:-1:-1;;;;;1083:6:0;1010:87;;12336:24;;;;;;;;;;-1:-1:-1;12336:24:0;;;;-1:-1:-1;;;;;12336:24:0;;;13086:29;;;;;;;;;;;;;;;;12599:28;;;;;;;;;;-1:-1:-1;12599:28:0;;;;;;;;14175:44;;;;;;;;;;-1:-1:-1;14175:44:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;14175:44:0;;;30630:435;;;;;;;;;;-1:-1:-1;30630:435:0;;;;;:::i;:::-;;:::i;13046:30::-;;;;;;;;;;;;;;;;14826:42;;;;;;;;;;;;;;;27353:188;;;;;;;;;;-1:-1:-1;27353:188:0;;;;;:::i;:::-;;:::i;13792:45::-;;;;;;;;;;-1:-1:-1;13792:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5333:25:1;;;5389:2;5374:18;;5367:34;;;;5417:18;;;5410:34;;;;5475:2;5460:18;;5453:34;;;;5518:3;5503:19;;5496:35;5562:3;5547:19;;5540:35;5606:3;5591:19;;5584:35;5320:3;5305:19;13792:45:0;5018:607:1;13329:48:0;;;;;;;;;;-1:-1:-1;13329:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;12974:25;;;;;;;;;;;;;;;;17156:271;;;;;;;;;;-1:-1:-1;17156:271:0;;;;;:::i;:::-;;:::i;27218:127::-;;;;;;;;;;-1:-1:-1;27218:127:0;;;;;:::i;:::-;;:::i;14716:47::-;;;;;;;;;;-1:-1:-1;14716:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;13742:43;;;;;;;;;;-1:-1:-1;13742:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14770:47;;;;;;;;;;-1:-1:-1;14770:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31077:1185;;;;;;;;;;-1:-1:-1;31077:1185:0;;;;;:::i;:::-;;:::i;18631:346::-;;;;;;;;;;;;;:::i;13975:92::-;;;;;;;;;;-1:-1:-1;13975:92:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14226:50;;;;;;;;;;-1:-1:-1;14226:50:0;;;;;:::i;:::-;;:::i;14584:51::-;;;;;;;;;;;;14626:9;14584:51;;1390:220;;;;;;;;;;-1:-1:-1;1390:220:0;;;;;:::i;:::-;;:::i;30434:188::-;;;;;;;;;;;;;:::i;27745:1245::-;;;;;;;;;;;;;:::i;17699:916::-;;;;;;;;;;-1:-1:-1;17699:916:0;;;;;:::i;:::-;;:::i;13006:27::-;;;;;;;;;;;;;;;;14352:53;;;;;;;;;;-1:-1:-1;14352:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;16947:201;;;;;;;;;;-1:-1:-1;16947:201:0;;;;;:::i;:::-;;:::i;33610:91::-;969:13;:11;:13::i;:::-;33674:10:::1;:19:::0;;-1:-1:-1;;;;;;33674:19:0::1;-1:-1:-1::0;;;;;33674:19:0;;;::::1;::::0;;;::::1;::::0;;33610:91::o;27549:188::-;969:13;:11;:13::i;:::-;27638:6:::1;27634:96;27648:15:::0;;::::1;27634:96;;;27714:4;27685:15;:26;27701:6;;27708:1;27701:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27685:26:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;27685:26:0;:33;;-1:-1:-1;;27685:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;27665:3;::::1;::::0;::::1;:::i;:::-;;;;27634:96;;;;27549:188:::0;;:::o;26359:727::-;26430:9;;26405:7;;-1:-1:-1;;;26430:9:0;;;;26429:10;;:41;;-1:-1:-1;26443:13:0;;-1:-1:-1;;;;;26443:13:0;:27;26429:41;26425:97;;;-1:-1:-1;26494:16:0;;;26359:727::o;26425:97::-;26588:13;;;26573:43;;;-1:-1:-1;;;26573:43:0;;;;26533:16;;;;-1:-1:-1;;;;;26588:13:0;;26573:41;;:43;;;;;;;;;;;26588:13;26573:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26532:84;;;;;26627:14;26659:13;;;;;;;;;-1:-1:-1;;;;;26659:13:0;-1:-1:-1;;;;;26644:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26627:55;-1:-1:-1;;;;;;26697:13:0;;;;:30;;-1:-1:-1;;;;;;26714:13:0;;;26697:30;26693:59;;;26736:16;;26729:23;;;;;26359:727;:::o;26693:59::-;26837:10;;26763:18;;;;-1:-1:-1;;;;;26837:10:0;;;26827:20;;;;26823:204;;-1:-1:-1;;;;;;;26902:21:0;;;;26864:23;;26823:204;;;-1:-1:-1;;;;;;;26956:21:0;;;;26992:23;;26823:204;27066:12;27045:17;:10;27058:4;27045:17;:::i;:::-;27044:34;;;;:::i;:::-;27037:41;;;;;;;26359:727;:::o;29963:230::-;-1:-1:-1;;;;;30104:19:0;;30026:17;30104:19;;;:13;:19;;;;;;;:26;30132:18;:24;;;;;;30158:20;:26;;;;;;29963:230;;;;;;:::o;26033:192::-;969:13;:11;:13::i;:::-;26119::::1;:21:::0;;-1:-1:-1;;;;;26119:21:0;::::1;-1:-1:-1::0;;;;;;26151:20:0;;;;;-1:-1:-1;;;26151:20:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;26187:30:::1;::::0;;8554:51:1;;;8636:2;8621:18;;8614:50;;;;26187:30:0::1;::::0;8527:18:1;26187:30:0::1;;;;;;;26033:192:::0;;:::o;33709:312::-;33780:12;33794:18;33814:16;33863:10;;33847:12;:26;33843:46;;-1:-1:-1;33883:1:0;;-1:-1:-1;33883:1:0;;-1:-1:-1;33883:1:0;33875:14;;33843:46;33900:20;33923:6;33900:20;33930:16;:12;33945:1;33930:16;:::i;:::-;33923:24;;;;;;;;;;;;;;-1:-1:-1;33923:24:0;33900:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33900:47:0;;-1:-1:-1;33709:312:0;-1:-1:-1;;;33709:312:0:o;23608:2116::-;23665:16;;;;23660:57;;23690:27;;-1:-1:-1;;;23690:27:0;;;;;;;;;;;23660:57;23728:26;23743:10;23728:14;:26::i;:::-;23818:10;23775:19;23797:32;;;:20;:32;;;;;;23844:15;;23840:1877;;23927:10;23876:16;23913:25;;;:13;:25;;;;;;23895:43;;:15;:43;:::i;:::-;23876:62;-1:-1:-1;23953:19:0;23975:15;23986:4;23876:62;23975:15;:::i;:::-;23953:37;-1:-1:-1;24020:19:0;24077:2;24101:23;;;24097:158;;24159:1;24145:15;;24097:158;;;24216:22;24227:11;24216:8;:22;:::i;:::-;24202:36;;24097:158;24271:25;24299:15;:13;:15::i;:::-;24271:43;-1:-1:-1;24330:23:0;24392:4;24357:31;24271:43;24357:11;:31;:::i;:::-;24356:40;;;;:::i;:::-;24330:66;-1:-1:-1;24411:19:0;24458:3;24434:20;24330:66;24452:2;24434:20;:::i;:::-;24433:28;;;;:::i;:::-;24411:50;;24498:11;24485:9;:24;;24477:66;;;;-1:-1:-1;;;24477:66:0;;9140:2:1;24477:66:0;;;9122:21:1;9179:2;9159:18;;;9152:30;9218:31;9198:18;;;9191:59;9267:18;;24477:66:0;;;;;;;;;24560:16;24579:15;24593:1;24579:11;:15;:::i;:::-;24560:34;-1:-1:-1;24609:22:0;24634;24560:34;24634:11;:22;:::i;:::-;24679:9;;24671:37;;24609:47;;-1:-1:-1;;;;;;24679:9:0;;24671:37;;;;;24699:8;;24679:9;24671:37;24679:9;24671:37;24699:8;24679:9;24671:37;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24731:15:0;;24723:49;;-1:-1:-1;;;;;24731:15:0;;;;24723:49;;;;;24757:14;;24731:15;24723:49;24731:15;24723:49;24757:14;24731:15;24723:49;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24792:63:0;;;3812:25:1;;;3868:2;3853:18;;3846:34;;;3896:18;;;3889:34;;;24805:10:0;;24792:63;;3800:2:1;3785:18;24792:63:0;;;;;;;24893:10;24907:1;24872:32;;;:20;:32;;;;;;;;:36;;;24924:13;:25;;;;;24952:15;24924:43;;25036:3;25007:25;25021:11;25007;:25;:::i;:::-;25006:33;;;;:::i;:::-;24985:54;-1:-1:-1;25054:17:0;25074:24;24985:54;25074:11;:24;:::i;:::-;25054:44;-1:-1:-1;25115:21:0;25160:4;25140:16;:11;25154:2;25140:16;:::i;:::-;25139:25;;;;:::i;:::-;25115:49;-1:-1:-1;25180:16:0;25220:4;25200:16;:11;25214:2;25200:16;:::i;:::-;25199:25;;;;:::i;:::-;25249:10;;25242:46;;-1:-1:-1;;;25242:46:0;;25266:10;25242:46;;;9470:51:1;9537:18;;;9530:34;;;25180:44:0;;-1:-1:-1;;;;;;25249:10:0;;25242:23;;9443:18:1;;25242:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25334:10:0;25305:16;25324:21;;;:9;:21;;;;;;-1:-1:-1;;;;;25324:21:0;;-1:-1:-1;;25364:22:0;;25360:282;;25414:10;;25407:53;;-1:-1:-1;;;25407:53:0;;25439:4;25407:53;;;9470:51:1;9537:18;;;9530:34;;;-1:-1:-1;;;;;25414:10:0;;;;25407:23;;9443:18:1;;25407:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;25479:30:0;;;;;;:20;:30;;;;;:42;;25513:8;;25479:30;:42;;25513:8;;25479:42;:::i;:::-;;;;-1:-1:-1;25360:282:0;;-1:-1:-1;25360:282:0;;25569:10;;-1:-1:-1;;;;;25569:10:0;25562:23;25594:4;25601:24;25617:8;25601:13;:24;:::i;:::-;25562:64;;-1:-1:-1;;;;;;25562:64:0;;;;;;;-1:-1:-1;;;;;9488:32:1;;;25562:64:0;;;9470:51:1;9537:18;;;9530:34;9443:18;;25562:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25360:282;25661:44;;2212:25:1;;;25683:10:0;;25661:44;;2200:2:1;2185:18;25661:44:0;;;;;;;23861:1856;;;;;;;;;;;;;;23840:1877;23649:2075;23608:2116::o;28998:626::-;29086:12;;;;29102:1;29086:17;29078:72;;;;-1:-1:-1;;;29078:72:0;;;;;;;:::i;:::-;29190:10;29166:35;;;;:23;:35;;;;;;;;29161:79;;29210:30;;-1:-1:-1;;;29210:30:0;;;;;;;;;;;29161:79;29251:14;29268:16;;;:4;:16;;;;;;;;29251:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29299:17;29295:53;;29325:23;;-1:-1:-1;;;29325:23:0;;;;;;;;;;;29295:53;29382:10;;29434:8;;;;29375:68;;-1:-1:-1;;;29375:68:0;;29407:10;29375:68;;;10226:34:1;29427:4:0;10276:18:1;;;10269:43;10328:18;;;10321:34;;;;29360:12:0;;-1:-1:-1;;;;;29382:10:0;;29375:31;;10161:18:1;;29375:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29360:83;;29462:7;29454:41;;;;-1:-1:-1;;;29454:41:0;;10818:2:1;29454:41:0;;;10800:21:1;10857:2;10837:18;;;10830:30;-1:-1:-1;;;10876:18:1;;;10869:51;10937:18;;29454:41:0;10616:345:1;29454:41:0;29510:8;;;;:12;29506:51;;29531:10;;29548:8;;;;29524:33;;-1:-1:-1;;;29524:33:0;;-1:-1:-1;;;;;29531:10:0;;;;29524:23;;:33;;;;2212:25:1;;;2200:2;2185:18;;2066:177;29524:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29506:51;29568:48;29577:10;29589;29601:1;29604;29607:3;:8;;;29568;:48::i;:::-;29067:557;;28998:626;;;:::o;18985:639::-;19094:22;;19159:14;;19047:7;;19094:22;19141:15;:32;:54;;;;-1:-1:-1;19177:13:0;;:18;;19141:54;19137:343;;;19212:17;19250:14;;19232:15;:32;;;;:::i;:::-;19212:52;;19279:21;19303:27;:25;:27::i;:::-;19279:51;-1:-1:-1;19345:15:0;19363:25;19279:51;19363:9;:25;:::i;:::-;19455:13;;19345:43;;-1:-1:-1;19424:27:0;12896:4;19345:43;19424:27;:::i;:::-;19423:45;;;;:::i;:::-;19403:65;;;;:::i;:::-;;;19197:283;;;19137:343;-1:-1:-1;;;;;19572:22:0;;;;;;:15;:22;;;;;;12896:4;;19553:41;;:16;:41;:::i;:::-;-1:-1:-1;;;;;19528:21:0;;;;;;:14;:21;;;;;;:67;;;;:::i;:::-;19527:89;;;;:::i;:::-;-1:-1:-1;;;;;19497:27:0;;;;;;:20;:27;;;;;;:119;;;;:::i;:::-;19490:126;18985:639;-1:-1:-1;;;18985:639:0:o;20195:2854::-;20299:10;20275:35;;;;:23;:35;;;;;;;;20271:85;;;20319:37;;-1:-1:-1;;;20319:37:0;;;;;;;;;;;20271:85;20375:12;;;;20367:46;;;;-1:-1:-1;;;20367:46:0;;11168:2:1;20367:46:0;;;11150:21:1;11207:2;11187:18;;;11180:30;-1:-1:-1;;;11226:18:1;;;11219:47;11283:18;;20367:46:0;10966:341:1;20367:46:0;20469:12;;20426:18;;20469:12;;;:17;20465:663;;20527:10;20511:27;;;;:15;:27;;;;;;;;20503:67;;;;-1:-1:-1;;;20503:67:0;;11514:2:1;20503:67:0;;;11496:21:1;11553:2;11533:18;;;11526:30;11592:29;11572:18;;;11565:57;11639:18;;20503:67:0;11312:351:1;20503:67:0;-1:-1:-1;14567:7:0;20465:663;;;20642:12;;;;20658:1;20642:17;20638:490;;20710:10;20694:27;;;;:15;:27;;;;;;;;20690:192;;;-1:-1:-1;14626:9:0;20638:490;;20690:192;-1:-1:-1;14692:10:0;20638:490;;;-1:-1:-1;20951:17:0;;-1:-1:-1;;;;;20988:22:0;;;;;;:48;;-1:-1:-1;;;;;;21014:22:0;;21026:10;21014:22;;20988:48;20984:133;;;21097:3;21071:17;;21091:2;21071:22;;;;:::i;:::-;21070:30;;;;:::i;:::-;21057:43;;20984:133;21156:10;21144:9;:22;21140:58;;;21175:23;;-1:-1:-1;;;21175:23:0;;;;;;;;;;;21140:58;21221:15;-1:-1:-1;;;;;21240:22:0;;;;;;:48;;-1:-1:-1;;;;;;21266:22:0;;21278:10;21266:22;;21240:48;:69;;;;-1:-1:-1;21292:12:0;;;;21308:1;21292:17;21240:69;21221:89;;21335:10;21331:1145;;;21362:16;21408:3;21382:17;;21402:2;21382:22;;;;:::i;:::-;21381:30;;;;:::i;:::-;21362:49;-1:-1:-1;21426:22:0;21451:20;21362:49;21451:9;:20;:::i;:::-;21488:36;;21426:45;;-1:-1:-1;;;;;;21488:26:0;;;:36;;;;;21515:8;;21488:36;;;;21515:8;21488:26;:36;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21539:28:0;;;;;;:18;:28;;;;;:40;;21571:8;;21539:28;:40;;21571:8;;21539:40;:::i;:::-;;;;-1:-1:-1;;21604:10:0;21594:21;;;;:9;:21;;;;;;;;:32;;-1:-1:-1;;;;;21594:32:0;;;-1:-1:-1;;;;;;21594:32:0;;;;;;;;21641:23;;;;;;;;;:40;;21594:32;21641:40;;;;;;;;;;;;;;;;;;;;;;;;;21702:15;;;:29;;;;:61;;-1:-1:-1;21754:9:0;;21735:15;;-1:-1:-1;;;;;21735:15:0;;;21754:9;;21735:28;;21702:61;21698:369;;;21784:19;21806:18;21823:1;21806:14;:18;:::i;:::-;21852:9;;21844:40;;21784;;-1:-1:-1;;;;;;21852:9:0;;21844:40;;;;;21784;;21852:9;21844:40;21852:9;21844:40;21784;21852:9;21844:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21911:15:0;;-1:-1:-1;;;;;21911:15:0;21903:63;21937:28;21954:11;21937:14;:28;:::i;:::-;21903:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21765:217;21698:369;;;22015:9;;22007:43;;-1:-1:-1;;;;;22015:9:0;;;;22007:43;;;;;22035:14;;22015:9;22007:43;22015:9;22007:43;22035:14;22015:9;22007:43;;;;;;;;;;;;;;;;;;;;;21698:369;21347:731;;21331:1145;;;22117:15;;-1:-1:-1;;;;;22117:15:0;:29;;;;:61;;-1:-1:-1;22169:9:0;;22150:15;;-1:-1:-1;;;;;22150:15:0;;;22169:9;;22150:28;;22117:61;22113:352;;;22199:19;22221:13;22233:1;22221:9;:13;:::i;:::-;22261:9;;22253:40;;22199:35;;-1:-1:-1;;;;;;22261:9:0;;22253:40;;;;;22199:35;;22261:9;22253:40;22261:9;22253:40;22199:35;22261:9;22253:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22320:15:0;;-1:-1:-1;;;;;22320:15:0;22312:58;22346:23;22358:11;22346:9;:23;:::i;:::-;22312:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22113:352;22419:9;;22411:38;;-1:-1:-1;;;;;22419:9:0;;;;22439;22411:38;;;;;22419:9;22411:38;22419:9;22411:38;22439:9;22419;22411:38;;;;;;;;;;;;;;;;;;;;;22113:352;22512:10;22488:35;;;;:23;:35;;;;;:42;;-1:-1:-1;;22488:42:0;22526:4;22488:42;;;22541:12;:14;;;;;;:::i;:::-;;;;-1:-1:-1;;22580:10:0;22566:25;;;;:13;:25;;;;;;;;22594:15;22566:43;;22657:19;22650:27;;;:6;:27;;;;;22623:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22710:24;;;:12;:24;;;;;;22745:38;;;22810:16;;22794:13;;;:32;;;;22862:25;;22837:22;;;:50;22898:21;;:25;;;22944:10;22934:7;;;:20;;;;22975:10;;22965:7;;;:20;23001:40;;22623:54;;22710:24;;22580:10;;23001:40;;22566:25;23001:40;20260:2789;;;;20195:2854;:::o;27098:108::-;969:13;:11;:13::i;:::-;27173:15:::1;:25:::0;;-1:-1:-1;;;;;;27173:25:0::1;-1:-1:-1::0;;;;;27173:25:0;;;::::1;::::0;;;::::1;::::0;;27098:108::o;30201:225::-;969:13;:11;:13::i;:::-;30281:10:::1;::::0;30274:43:::1;::::0;-1:-1:-1;;;30274:43:0;;30311:4:::1;30274:43;::::0;::::1;1616:51:1::0;30256:15:0::1;::::0;-1:-1:-1;;;;;30281:10:0::1;::::0;30274:28:::1;::::0;1589:18:1;;30274:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30256:61;;30346:1;30336:7;:11;30328:32;;;::::0;-1:-1:-1;;;30328:32:0;;12059:2:1;30328:32:0::1;::::0;::::1;12041:21:1::0;12098:1;12078:18;;;12071:29;-1:-1:-1;;;12116:18:1;;;12109:38;12164:18;;30328:32:0::1;11857:331:1::0;30328:32:0::1;30378:10;::::0;30399:9:::1;::::0;30371:47:::1;::::0;-1:-1:-1;;;30371:47:0;;-1:-1:-1;;;;;30399:9:0;;::::1;30371:47;::::0;::::1;9470:51:1::0;9537:18;;;9530:34;;;30378:10:0;::::1;::::0;30371:27:::1;::::0;9443:18:1;;30371:47:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30245:181;30201:225::o:0;1279:103::-;969:13;:11;:13::i;:::-;1344:30:::1;1371:1;1344:18;:30::i;:::-;1279:103::o:0;29632:323::-;29723:10;29685:14;29702:32;;;:20;:32;;;;;;29753:10;29745:43;;;;-1:-1:-1;;;29745:43:0;;12395:2:1;29745:43:0;;;12377:21:1;12434:2;12414:18;;;12407:30;-1:-1:-1;;;12453:18:1;;;12446:50;12513:18;;29745:43:0;12193:344:1;29745:43:0;29820:10;29834:1;29799:32;;;:20;:32;;;;;;:36;;;;29853:10;;29846:43;;-1:-1:-1;;;29846:43:0;;;;;9470:51:1;;;;9537:18;;;9530:34;;;-1:-1:-1;;;;;29853:10:0;;29846:23;;9443:18:1;;29846:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29906:41:0;;2212:25:1;;;29928:10:0;;-1:-1:-1;29906:41:0;;-1:-1:-1;2200:2:1;2185:18;29906:41:0;;;;;;;29674:281;29632:323::o;26233:118::-;969:13;:11;:13::i;:::-;26313:16:::1;:30:::0;26233:118::o;30630:435::-;30707:12;;;;30723:1;30707:17;30699:72;;;;-1:-1:-1;;;30699:72:0;;;;;;;:::i;:::-;30805:10;30786:30;;;;:18;:30;;;;;;;;30782:77;;;30825:34;;-1:-1:-1;;;30825:34:0;;;;;;;;;;;30782:77;30899:10;30875:35;;;;:23;:35;;;;;;;;30870:79;;30919:30;;-1:-1:-1;;;30919:30:0;;;;;;;;;;;30870:79;30979:10;30960:30;;;;:18;:30;;;;;:37;;-1:-1:-1;;30960:37:0;30993:4;30960:37;;;31008:48;;30979:10;31029:17;;31048:1;;31051;;31008:8;:48::i;27353:188::-;969:13;:11;:13::i;:::-;27442:6:::1;27438:96;27452:15:::0;;::::1;27438:96;;;27518:4;27489:15;:26;27505:6;;27512:1;27505:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27489:26:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;27489:26:0;:33;;-1:-1:-1;;27489:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;27469:3;::::1;::::0;::::1;:::i;:::-;;;;27438:96;;17156:271:::0;969:13;:11;:13::i;:::-;17309:54:::1;;;;;;;;17318:7;17309:54;;;;17327:16;17309:54;;;;17345:4;17309:54;;;;17351:5;17309:54;;;;;;17358:1;17309:54;;;;17361:1;17309:54;;::::0;17286:6:::1;:20;17295:10;;17293:12;;;;;:::i;:::-;::::0;;;;-1:-1:-1;17286:20:0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;17286:20:0;:77;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;17286:77:0::1;::::0;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;17393:10:::1;::::0;17379:40;;3812:25:1;;;3853:18;;;3846:34;;;3896:18;;3889:34;;;17379:40:0::1;::::0;3785:18:1;17379:40:0::1;;;;;;;17156:271:::0;;;;;:::o;27218:127::-;969:13;:11;:13::i;:::-;27280:12:::1;:21:::0;;-1:-1:-1;;27280:21:0::1;;::::0;::::1;::::0;;::::1;::::0;;;27317:20:::1;::::0;1423:36:1;;;27317:20:0::1;::::0;1411:2:1;1396:18;27317:20:0::1;;;;;;;27218:127:::0;:::o;31077:1185::-;31164:10;31143:32;;;;:20;:32;;;;;;;;:35;;;;;;;;:38;;;;;;;;;;;31138:79;;31190:27;;-1:-1:-1;;;31190:27:0;;;;;;;;;;;31138:79;31263:10;31228:19;31250:24;;;:12;:24;;;;;;;;31302:12;:24;;;;;:27;;;;;;;;:30;;;;;;;;;31364:12;;;:4;:12;;;;;;31343:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31250:24;31387:26;;:14;:26::i;:::-;31455:7;:16;;;31438:13;;:33;31434:149;;31505:7;:16;;;31488:13;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;31434:149:0;;-1:-1:-1;31434:149:0;;31570:1;31554:13;:17;31434:149;31627:16;;;;31612:10;31597:26;;;;:14;:26;;;;;;:46;31593:188;;31690:16;;;;31675:10;31660:26;;;;:14;:26;;;;;:46;;:26;;;:46;;31690:16;;31660:46;:::i;:::-;;;;-1:-1:-1;31593:188:0;;-1:-1:-1;31593:188:0;;31754:10;31768:1;31739:26;;;:14;:26;;;;;:30;31593:188;31820:7;:24;;;31795:5;:21;;;:49;31791:189;;31886:7;:24;;;31861:5;:21;;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;31791:189:0;;-1:-1:-1;31791:189:0;;31967:1;31943:21;;;:25;31791:189;32013:10;32033:5;31992:32;;;:20;:32;;;;;;;;:35;;;;;;;;:38;;;;;;;;:46;;-1:-1:-1;;31992:46:0;;;32049:24;;;:12;:24;;;;;:27;;;;;;;;:30;;;;;;;;:34;32098:14;;;;:18;32094:40;;32118:14;;;:16;;;:14;:16;;;:::i;:::-;;;;;;32094:40;32181:10;32193:26;;;;:14;:26;;;;;;;;;32221:20;:32;;;;;;;;32150:104;;;;;;12857:25:1;;12913:2;12898:18;;12891:34;12845:2;12830:18;;12683:248;32150:104:0;;;;;;;;31127:1135;;;31077:1185;;:::o;18631:346::-;18714:16;;18689:7;;18714:16;;18709:31;;-1:-1:-1;18739:1:0;;18631:346::o;18709:31::-;18761:18;18800:9;;18782:15;:27;;;;:::i;:::-;18761:48;-1:-1:-1;18820:16:0;18839:27;12838:6;18761:48;18839:27;:::i;:::-;18820:46;;18903:2;18892:8;:13;18888:27;;;18914:1;18907:8;;;;18631:346;:::o;18888:27::-;12758:19;18933:36;;;18631:346;-1:-1:-1;;18631:346:0:o;14226:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14226:50:0;;-1:-1:-1;14226:50:0;;-1:-1:-1;14226:50:0:o;1390:220::-;969:13;:11;:13::i;:::-;-1:-1:-1;;;;;1475:22:0;::::1;1471:93;;1521:31;::::0;-1:-1:-1;;;1521:31:0;;1549:1:::1;1521:31;::::0;::::1;1616:51:1::0;1589:18;;1521:31:0::1;1470:203:1::0;1471:93:0::1;1574:28;1593:8;1574:18;:28::i;30434:188::-:0;969:13;:11;:13::i;:::-;30505:21:::1;30545:11:::0;30537:30:::1;;;::::0;-1:-1:-1;;;30537:30:0;;13138:2:1;30537:30:0::1;::::0;::::1;13120:21:1::0;13177:1;13157:18;;;13150:29;-1:-1:-1;;;13195:18:1;;;13188:36;13241:18;;30537:30:0::1;12936:329:1::0;30537:30:0::1;30586:9;::::0;30578:36:::1;::::0;-1:-1:-1;;;;;30586:9:0;;::::1;::::0;30578:36;::::1;;;::::0;30606:7;;30586:9:::1;30578:36:::0;30586:9;30578:36;30606:7;30586:9;30578:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;27745:1245:::0;27797:12;;;;27813:1;27797:17;27789:72;;;;-1:-1:-1;;;27789:72:0;;13472:2:1;27789:72:0;;;13454:21:1;13511:2;13491:18;;;13484:30;13550:34;13530:18;;;13523:62;-1:-1:-1;;;13601:18:1;;;13594:40;13651:19;;27789:72:0;13270:406:1;27789:72:0;27901:10;27877:35;;;;:23;:35;;;;;;;;27872:79;;27921:30;;-1:-1:-1;;;27921:30:0;;;;;;;;;;;27872:79;28019:8;;28005:10;27989:27;;;;:15;:27;;;;;;:38;;28019:8;27989:38;:::i;:::-;27970:15;:57;;27962:99;;;;-1:-1:-1;;;27962:99:0;;13883:2:1;27962:99:0;;;13865:21:1;13922:2;13902:18;;;13895:30;13961:31;13941:18;;;13934:59;14010:18;;27962:99:0;13681:353:1;27962:99:0;28111:10;28072:23;28098:24;;;:12;:24;;;;;28158:20;;28098:24;;28072:23;28158:24;;28181:1;28158:24;:::i;:::-;28133:49;;28214:10;;28197:14;:27;28193:66;;;28233:26;;-1:-1:-1;;;28233:26:0;;;;;;;;;;;28193:66;28270:29;28302:22;;;:6;:22;;;;;;;;28270:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28357:10;;28350:78;;-1:-1:-1;;;28350:78:0;;28382:10;28350:78;;;10226:34:1;;;;28402:4:0;10276:18:1;;;10269:43;10328:18;;;10321:34;;;;28270:54:0;;:29;-1:-1:-1;;;;;28357:10:0;;;;28350:31;;10161:18:1;;28350:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28335:93;;28447:7;28439:41;;;;-1:-1:-1;;;28439:41:0;;10818:2:1;28439:41:0;;;10800:21:1;10857:2;10837:18;;;10830:30;-1:-1:-1;;;10876:18:1;;;10869:51;10937:18;;28439:41:0;10616:345:1;28439:41:0;28495:18;;;;:22;28491:71;;28526:10;;28543:18;;;;;28519:43;;-1:-1:-1;;;28519:43:0;;-1:-1:-1;;;;;28526:10:0;;;;28519:23;;:43;;;;2212:25:1;;;2200:2;2185:18;;2066:177;28519:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28491:71;28573:37;;;28641:21;;28621:17;;;:41;28702:30;;;;;;28673:26;;;:59;28757:15;;;;28743:11;;;:29;28798:15;;;;28784:11;;;:29;28841:10;-1:-1:-1;28825:27:0;;;:15;:27;;;;;;;28855:15;28825:45;;28928:21;;28951:30;;28886:96;;3812:25:1;;;3853:18;;;3846:34;;;;3896:18;;3889:34;;;;28841:10:0;28886:96;;3800:2:1;3785:18;28886:96:0;;;;;;;27778:1212;;;;27745:1245::o;17699:916::-;969:13;:11;:13::i;:::-;17811:19:::1;17774:27;17804::::0;;;:6:::1;:27;::::0;;;;;;;17774:57;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;::::1;;;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;;17838:726:::1;17852:15:::0;;::::1;17838:726;;;17885:12;17900:6;;17907:1;17900:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17925:29:0;::::1;;::::0;;;:23:::1;:29;::::0;;;;;17885:24;;-1:-1:-1;17925:29:0::1;;17920:633;;-1:-1:-1::0;;;;;17971:29:0;::::1;;::::0;;;:23:::1;:29;::::0;;;;:36;;-1:-1:-1;;17971:36:0::1;18003:4;17971:36;::::0;;18022:12:::1;:14:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;18075:22:0::1;::::0;-1:-1:-1;;;;;18051:21:0;::::1;;::::0;;;:15:::1;:21;::::0;;;;;;;:46;;;;18112:13:::1;:19:::0;;;;;18134:15:::1;18112:37:::0;;18208:12:::1;:18:::0;;;;;18264:19:::1;18245:38:::0;;18318:19;;18302:13:::1;::::0;::::1;:35:::0;18381:28;;::::1;::::0;18356:22:::1;::::0;::::1;:53:::0;18428:21:::1;::::0;::::1;:25:::0;18482:13:::1;::::0;::::1;::::0;18472:7:::1;::::0;::::1;:23:::0;18524:13:::1;::::0;::::1;::::0;18514:7:::1;::::0;;::::1;:23:::0;17920:633:::1;-1:-1:-1::0;17869:3:0;::::1;::::0;::::1;:::i;:::-;;;;17838:726;;;-1:-1:-1::0;18579:28:0::1;::::0;2212:25:1;;;18579:28:0::1;::::0;2200:2:1;2185:18;18579:28:0::1;;;;;;;;17767:848;17699:916:::0;;:::o;16947:201::-;969:13;:11;:13::i;:::-;17043:38:::1;17059:8;17069:5;17076:4;17043:15;:38::i;:::-;17109:14;::::0;17097:43:::1;::::0;;3812:25:1;;;3868:2;3853:18;;3846:34;;;3896:18;;3889:34;;;17097:43:0::1;::::0;3800:2:1;3785:18;17097:43:0::1;3610:319:1::0;1105:166:0;1056:7;1083:6;-1:-1:-1;;;;;1083:6:0;224:10;1165:23;1161:103;;1212:40;;-1:-1:-1;;;1212:40:0;;224:10;1212:40;;;1616:51:1;1589:18;;1212:40:0;1470:203:1;25732:293:0;25792:26;:24;:26::i;:::-;-1:-1:-1;;;;;25913:23:0;;;;;;:15;:23;;;;;;25888:22;;12896:4;;25888:48;;;:::i;:::-;-1:-1:-1;;;;;25862:22:0;;;;;;:14;:22;;;;;;:75;;;;:::i;:::-;25861:97;;;;:::i;:::-;-1:-1:-1;;;;;25829:28:0;;;;;;:20;:28;;;;;:129;;:28;;;:129;;;;;:::i;:::-;;;;-1:-1:-1;;25995:22:0;;-1:-1:-1;;;;;25969:23:0;;;;;;;:15;:23;;;;;:48;25732:293::o;32270:1038::-;32378:14;32395;;;:4;:14;;;;;;;;32378:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32442:20:0;;;;:12;:20;;;;;;;32513:7;;;;32522;;;;32378:31;;32477:53;;32455:6;;32507:1;;32510;;32513:7;32477:21;:53::i;:::-;32473:96;;;32539:30;;-1:-1:-1;;;32539:30:0;;;;;;;;;;;32473:96;32602:5;:13;;;32584:5;:14;;;:31;32580:71;;32624:27;;-1:-1:-1;;;32624:27:0;;;;;;;;;;;32580:71;32715:5;:22;;;32692:3;:20;;;32668:5;:21;;;:44;;;;:::i;:::-;:69;32664:117;;;32746:35;;-1:-1:-1;;;32746:35:0;;;;;;;;;;;32664:117;32817:3;:20;;;32792:5;:21;;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;32848:14:0;:16;;;:14;:16;;;:::i;:::-;;;;-1:-1:-1;;32875:5:0;;;;:9;;;32895:5;;;:9;;;32924:14;;;32915:6;;;;:23;;;;-1:-1:-1;;;;;32949:28:0;;-1:-1:-1;32949:28:0;;;:20;:28;;;;;:31;;;;;;;;:34;;;;;;;;:41;;-1:-1:-1;;32949:41:0;32986:4;32949:41;;;33001:20;;;:12;:20;;;;;:23;;;;;;;;:26;;;;;;;;:37;;;33077:14;;33049:23;;;:15;:23;;;;;;:43;;:27;:43::i;:::-;-1:-1:-1;33116:14:0;;33103:28;;;;:12;:28;;;;;;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33103:34:0;;;;;;;;;;;33148:14;;:16;;;;;;:::i;:::-;;;;;;33175:39;33193:6;33201:3;:12;;;33175:17;:39::i;:::-;33279:14;;33230:70;;;14270:25:1;;;14326:2;14311:18;;14304:34;;;;14354:18;;14347:34;;;14412:2;14397:18;;14390:34;;;33263:8:0;;-1:-1:-1;;;;;33230:70:0;;;;;;;14257:3:1;14242:19;33230:70:0;;;;;;;32367:941;;32270:1038;;;;;:::o;1618:191::-;1692:16;1711:6;;-1:-1:-1;;;;;1728:17:0;;;-1:-1:-1;;;;;;1728:17:0;;;;;;1761:40;;1711:6;;;;;;;1761:40;;1692:16;1761:40;1681:128;1618:191;:::o;17435:256::-;17527:14;:16;;;:14;:16;;;:::i;:::-;;;;-1:-1:-1;;17577:106:0;;;;;;;;17581:14;;17577:106;;;-1:-1:-1;;17577:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17577:106:0;;;;;;17554:20;;;:4;:20;;;;;;;:129;;;;;17577:106;17554:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17554:129:0;;;;;;;;;;17435:256::o;19632:547::-;19711:14;;19692:15;:33;19688:46;;19632:547::o;19688:46::-;19748:13;;19765:1;19748:18;19744:104;;19800:15;19783:14;:32;19632:547::o;19744:104::-;19868:17;19906:14;;19888:15;:32;;;;:::i;:::-;19868:52;;19931:21;19955:27;:25;:27::i;:::-;19931:51;-1:-1:-1;19993:15:0;20011:25;19931:51;20011:9;:25;:::i;:::-;20115:13;;19993:43;;-1:-1:-1;20084:27:0;12896:4;19993:43;20084:27;:::i;:::-;20083:45;;;;:::i;:::-;20057:22;;:71;;;;;;;:::i;:::-;;;;-1:-1:-1;;20156:15:0;20139:14;:32;-1:-1:-1;;;19632:547:0:o;33316:286::-;33454:4;33487:6;33475:8;:18;;:40;;;;33509:6;33497:8;:18;;33475:40;33471:57;;;-1:-1:-1;33524:4:0;33517:11;;33471:57;-1:-1:-1;;;;;;33546:28:0;;;;;;:20;:28;;;;;;;;:38;;;;;;;;:48;;;;;;;;;;;33316:286;;;;;;;;:::o;2816:150::-;2886:11;2919:39;2937:3;2951:5;2919:3;:39::i;23065:531::-;23151:16;;;;23146:221;;23184:16;:23;;-1:-1:-1;;23184:23:0;23203:4;23184:23;;;23234:15;23222:9;:27;;;23269:14;:32;23321:34;;;;;;23342:12;2212:25:1;;2200:2;2185:18;;2066:177;23321:34:0;;;;;;;;23146:221;23377:22;23392:6;23377:14;:22::i;:::-;23427:8;23410:13;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;23446:22:0;;;;;;:14;:22;;;;;:34;;23472:8;;23446:22;:34;;23472:8;;23446:34;:::i;:::-;;;;-1:-1:-1;;;;;;;23496:92:0;;23535:22;;;;:14;:22;;;;;;;;;23559:20;:28;;;;;;;;23496:92;;;;;;12857:25:1;;12913:2;12898:18;;12891:34;12845:2;12830:18;;12683:248;23496:92:0;;;;;;;;23065:531;;:::o;4090:761::-;6458:30;6452:4;6445:44;4160:11;6503:20;;;6558:4;6542:21;;4265:14;4258:5;4255:25;4252:76;;4296:10;4290:4;4283:24;4321:4;4315;4308:18;4252:76;4352:5;4342:44;;4370:14;4361:23;;4342:44;4413:8;4407:4;4400:22;4449:5;4443:4;4436:19;4494:4;4488;4478:21;4529:1;4523:8;4513:320;;4571:8;4567:13;4561:20;4612:1;4606:4;4599:15;4686:5;4681:1;4678;4674:9;4664:8;4660:24;4653:39;4734:1;4731;4727:9;4724:1;4720:17;4717:1;4710:28;4785:1;4782;4778:9;4767:8;4763:13;4756:32;;4817:1;4807:11;;4513:320;;4237:607;4090:761;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:180::-;461:6;514:2;502:9;493:7;489:23;485:32;482:52;;;530:1;527;520:12;482:52;-1:-1:-1;553:23:1;;402:180;-1:-1:-1;402:180:1:o;1678:383::-;1755:6;1763;1771;1824:2;1812:9;1803:7;1799:23;1795:32;1792:52;;;1840:1;1837;1830:12;1792:52;1879:9;1866:23;1898:31;1923:5;1898:31;:::i;:::-;1948:5;2000:2;1985:18;;1972:32;;-1:-1:-1;2051:2:1;2036:18;;;2023:32;;1678:383;-1:-1:-1;;;1678:383:1:o;2248:615::-;2334:6;2342;2395:2;2383:9;2374:7;2370:23;2366:32;2363:52;;;2411:1;2408;2401:12;2363:52;2451:9;2438:23;2480:18;2521:2;2513:6;2510:14;2507:34;;;2537:1;2534;2527:12;2507:34;2575:6;2564:9;2560:22;2550:32;;2620:7;2613:4;2609:2;2605:13;2601:27;2591:55;;2642:1;2639;2632:12;2591:55;2682:2;2669:16;2708:2;2700:6;2697:14;2694:34;;;2724:1;2721;2714:12;2694:34;2777:7;2772:2;2762:6;2759:1;2755:14;2751:2;2747:23;2743:32;2740:45;2737:65;;;2798:1;2795;2788:12;2737:65;2829:2;2821:11;;;;;2851:6;;-1:-1:-1;2248:615:1;;-1:-1:-1;;;;2248:615:1:o;3934:118::-;4020:5;4013:13;4006:21;3999:5;3996:32;3986:60;;4042:1;4039;4032:12;4057:382;4122:6;4130;4183:2;4171:9;4162:7;4158:23;4154:32;4151:52;;;4199:1;4196;4189:12;4151:52;4238:9;4225:23;4257:31;4282:5;4257:31;:::i;:::-;4307:5;-1:-1:-1;4364:2:1;4349:18;;4336:32;4377:30;4336:32;4377:30;:::i;:::-;4426:7;4416:17;;;4057:382;;;;;:::o;4444:316::-;4521:6;4529;4537;4590:2;4578:9;4569:7;4565:23;4561:32;4558:52;;;4606:1;4603;4596:12;4558:52;-1:-1:-1;;4629:23:1;;;4699:2;4684:18;;4671:32;;-1:-1:-1;4750:2:1;4735:18;;;4722:32;;4444:316;-1:-1:-1;4444:316:1:o;4765:248::-;4833:6;4841;4894:2;4882:9;4873:7;4869:23;4865:32;4862:52;;;4910:1;4907;4900:12;4862:52;-1:-1:-1;;4933:23:1;;;5003:2;4988:18;;;4975:32;;-1:-1:-1;4765:248:1:o;5630:454::-;5725:6;5733;5741;5749;5757;5810:3;5798:9;5789:7;5785:23;5781:33;5778:53;;;5827:1;5824;5817:12;5778:53;-1:-1:-1;;5850:23:1;;;5920:2;5905:18;;5892:32;;-1:-1:-1;5971:2:1;5956:18;;5943:32;;6022:2;6007:18;;5994:32;;-1:-1:-1;6073:3:1;6058:19;6045:33;;-1:-1:-1;5630:454:1;-1:-1:-1;5630:454:1:o;6089:269::-;6146:6;6199:2;6187:9;6178:7;6174:23;6170:32;6167:52;;;6215:1;6212;6205:12;6167:52;6254:9;6241:23;6304:4;6297:5;6293:16;6286:5;6283:27;6273:55;;6324:1;6321;6314:12;6363:315;6431:6;6439;6492:2;6480:9;6471:7;6467:23;6463:32;6460:52;;;6508:1;6505;6498:12;6460:52;6547:9;6534:23;6566:31;6591:5;6566:31;:::i;:::-;6616:5;6668:2;6653:18;;;;6640:32;;-1:-1:-1;;;6363:315:1:o;6683:127::-;6744:10;6739:3;6735:20;6732:1;6725:31;6775:4;6772:1;6765:15;6799:4;6796:1;6789:15;6815:127;6876:10;6871:3;6867:20;6864:1;6857:31;6907:4;6904:1;6897:15;6931:4;6928:1;6921:15;6947:135;6986:3;7007:17;;;7004:43;;7027:18;;:::i;:::-;-1:-1:-1;7074:1:1;7063:13;;6947:135::o;7087:188::-;7166:13;;-1:-1:-1;;;;;7208:42:1;;7198:53;;7188:81;;7265:1;7262;7255:12;7188:81;7087:188;;;:::o;7280:450::-;7367:6;7375;7383;7436:2;7424:9;7415:7;7411:23;7407:32;7404:52;;;7452:1;7449;7442:12;7404:52;7475:40;7505:9;7475:40;:::i;:::-;7465:50;;7534:49;7579:2;7568:9;7564:18;7534:49;:::i;:::-;7524:59;;7626:2;7615:9;7611:18;7605:25;7670:10;7663:5;7659:22;7652:5;7649:33;7639:61;;7696:1;7693;7686:12;7639:61;7719:5;7709:15;;;7280:450;;;;;:::o;7735:251::-;7805:6;7858:2;7846:9;7837:7;7833:23;7829:32;7826:52;;;7874:1;7871;7864:12;7826:52;7906:9;7900:16;7925:31;7950:5;7925:31;:::i;7991:168::-;8064:9;;;8095;;8112:15;;;8106:22;;8092:37;8082:71;;8133:18;;:::i;:::-;7991:168;;;;:::o;8164:217::-;8204:1;8230;8220:132;;8274:10;8269:3;8265:20;8262:1;8255:31;8309:4;8306:1;8299:15;8337:4;8334:1;8327:15;8220:132;-1:-1:-1;8366:9:1;;8164:217::o;8675:125::-;8740:9;;;8761:10;;;8758:36;;;8774:18;;:::i;8805:128::-;8872:9;;;8893:11;;;8890:37;;;8907:18;;:::i;9575:406::-;9777:2;9759:21;;;9816:2;9796:18;;;9789:30;9855:34;9850:2;9835:18;;9828:62;-1:-1:-1;;;9921:2:1;9906:18;;9899:40;9971:3;9956:19;;9575:406::o;10366:245::-;10433:6;10486:2;10474:9;10465:7;10461:23;10457:32;10454:52;;;10502:1;10499;10492:12;10454:52;10534:9;10528:16;10553:28;10575:5;10553:28;:::i;11668:184::-;11738:6;11791:2;11779:9;11770:7;11766:23;11762:32;11759:52;;;11807:1;11804;11797:12;11759:52;-1:-1:-1;11830:16:1;;11668:184;-1:-1:-1;11668:184:1:o;12542:136::-;12581:3;12609:5;12599:39;;12618:18;;:::i;:::-;-1:-1:-1;;;12654:18:1;;12542:136::o

Swarm Source

ipfs://6d951f7ac4f0d052329a23db1492f6fb45a120ca79422b48a36a82b67b932ee6

Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

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

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.