ETH Price: $3,270.94 (+0.76%)
Gas: 1 Gwei

Contract

0xa867bF8447eC6f614EA996057e3D769b76a8aa0e
 

Overview

ETH Balance

15.01 ETH

Eth Value

$49,096.74 (@ $3,270.94/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Server Force Gam...202855172024-07-11 20:00:1117 days ago1720728011IN
0xa867bF84...b76a8aa0e
0 ETH0.000684166.50572878
Transfer Profit ...202820912024-07-11 8:32:5917 days ago1720686779IN
0xa867bF84...b76a8aa0e
0 ETH0.000215984.73295951
Server End Game ...202813302024-07-11 6:00:1117 days ago1720677611IN
0xa867bF84...b76a8aa0e
0 ETH0.00048512.4886475
Create Game202794562024-07-10 23:43:1118 days ago1720654991IN
0xa867bF84...b76a8aa0e
0.01 ETH0.000511454.98973426
Server Force Gam...202789462024-07-10 22:00:1118 days ago1720648811IN
0xa867bF84...b76a8aa0e
0 ETH0.000389574.42380642
Server End Game ...202747632024-07-10 8:00:1118 days ago1720598411IN
0xa867bF84...b76a8aa0e
0 ETH0.000928374.76357312
Create Game202728442024-07-10 1:34:4718 days ago1720575287IN
0xa867bF84...b76a8aa0e
0.04 ETH0.000569235.55282504
Server End Game202728342024-07-10 1:32:4718 days ago1720575167IN
0xa867bF84...b76a8aa0e
0 ETH0.000263444.02603171
Create Game202727632024-07-10 1:18:3518 days ago1720574315IN
0xa867bF84...b76a8aa0e
0.1 ETH0.000512885.00373856
Server End Game202727602024-07-10 1:17:5918 days ago1720574279IN
0xa867bF84...b76a8aa0e
0 ETH0.000227063.47008484
Create Game202709472024-07-09 19:12:5919 days ago1720552379IN
0xa867bF84...b76a8aa0e
0.02 ETH0.000675856.59439106
Server End Game202700922024-07-09 16:20:5919 days ago1720542059IN
0xa867bF84...b76a8aa0e
0 ETH0.0007643411.68501715
Create Game202699772024-07-09 15:57:5919 days ago1720540679IN
0xa867bF84...b76a8aa0e
0.05 ETH0.0013578211.35637858
Server End Game202568202024-07-07 19:47:5921 days ago1720381679IN
0xa867bF84...b76a8aa0e
0 ETH0.000163782.0480167
Create Game202564692024-07-07 18:37:3521 days ago1720377455IN
0xa867bF84...b76a8aa0e
0.08 ETH0.000452634.41542958
Server End Game201939162024-06-29 0:58:5929 days ago1719622739IN
0xa867bF84...b76a8aa0e
0 ETH0.000233282.91744441
Create Game201938502024-06-29 0:45:3529 days ago1719621935IN
0xa867bF84...b76a8aa0e
0.25 ETH0.000424384.13979076
Server End Game201938172024-06-29 0:38:5929 days ago1719621539IN
0xa867bF84...b76a8aa0e
0 ETH0.000144221.80364677
Create Game201938072024-06-29 0:36:5929 days ago1719621419IN
0xa867bF84...b76a8aa0e
0.11 ETH0.00040683.96833943
Server End Game201077892024-06-16 23:59:5942 days ago1718582399IN
0xa867bF84...b76a8aa0e
0 ETH0.000478425.98311401
Create Game201077592024-06-16 23:53:5942 days ago1718582039IN
0xa867bF84...b76a8aa0e
0.01 ETH0.000620946.05796277
Server End Game201077552024-06-16 23:53:1142 days ago1718581991IN
0xa867bF84...b76a8aa0e
0 ETH0.000410975.13899057
Create Game201077452024-06-16 23:51:1142 days ago1718581871IN
0xa867bF84...b76a8aa0e
0.01 ETH0.00059685.82313579
Server End Game201075452024-06-16 23:10:5942 days ago1718579459IN
0xa867bF84...b76a8aa0e
0 ETH0.000330774.13706858
Create Game201075332024-06-16 23:08:3542 days ago1718579315IN
0xa867bF84...b76a8aa0e
0.01 ETH0.000607835.08422383
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
202820912024-07-11 8:32:5917 days ago1720686779
0xa867bF84...b76a8aa0e
5.12459124 ETH
202568202024-07-07 19:47:5921 days ago1720381679
0xa867bF84...b76a8aa0e
0.0005815 ETH
201939162024-06-29 0:58:5929 days ago1719622739
0xa867bF84...b76a8aa0e
0.00043914 ETH
201938172024-06-29 0:38:5929 days ago1719621539
0xa867bF84...b76a8aa0e
0.000583 ETH
201077892024-06-16 23:59:5942 days ago1718582399
0xa867bF84...b76a8aa0e
0.0099997 ETH
201077552024-06-16 23:53:1142 days ago1718581991
0xa867bF84...b76a8aa0e
0.00998 ETH
201075452024-06-16 23:10:5942 days ago1718579459
0xa867bF84...b76a8aa0e
0.009776 ETH
200030752024-06-02 8:54:4756 days ago1717318487
0xa867bF84...b76a8aa0e
0.0099997 ETH
199921022024-05-31 20:08:5958 days ago1717186139
0xa867bF84...b76a8aa0e
0.00078783 ETH
199912802024-05-31 17:23:2358 days ago1717176203
0xa867bF84...b76a8aa0e
0.31328 ETH
199909022024-05-31 16:07:4758 days ago1717171667
0xa867bF84...b76a8aa0e
0.0033676 ETH
199815672024-05-30 8:47:3559 days ago1717058855
0xa867bF84...b76a8aa0e
0.0000817 ETH
199020382024-05-19 5:56:2370 days ago1716098183
0xa867bF84...b76a8aa0e
0.1001375 ETH
199019492024-05-19 5:38:2370 days ago1716097103
0xa867bF84...b76a8aa0e
0.10454 ETH
198568402024-05-12 22:12:1177 days ago1715551931
0xa867bF84...b76a8aa0e
0.00018122 ETH
198433042024-05-11 0:46:1178 days ago1715388371
0xa867bF84...b76a8aa0e
0.000036 ETH
197784662024-05-01 23:07:5988 days ago1714604879
0xa867bF84...b76a8aa0e
0.675 ETH
197299722024-04-25 4:23:2394 days ago1714019003
0xa867bF84...b76a8aa0e
0.00516948 ETH
196918512024-04-19 20:26:11100 days ago1713558371
0xa867bF84...b76a8aa0e
0.00100965 ETH
196422762024-04-12 21:43:47107 days ago1712958227
0xa867bF84...b76a8aa0e
0.07352662 ETH
196078832024-04-08 2:09:23111 days ago1712542163
0xa867bF84...b76a8aa0e
0.09135159 ETH
196071592024-04-07 23:43:35112 days ago1712533415
0xa867bF84...b76a8aa0e
0.06046629 ETH
195807582024-04-04 6:57:35115 days ago1712213855
0xa867bF84...b76a8aa0e
0.000001 ETH
195805902024-04-04 6:23:35115 days ago1712211815
0xa867bF84...b76a8aa0e
0.0395 ETH
195585782024-04-01 4:20:35118 days ago1711945235
0xa867bF84...b76a8aa0e
0.00280951 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GameChannel

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity Multiple files format)

File 1 of 12: GameChannel.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.11;

import "./GameChannelConflict.sol";


/**
 * @title Game Channel
 * @author dicether
 */
contract GameChannel is GameChannelConflict {
    using SafeMath for uint;
    /**
     * @dev contract constructor
     * @param _serverAddress Server address.
     * @param _minStake Min value user needs to deposit to create game session.
     * @param _maxStake Max value user can deposit to create game session.
     * @param _conflictResAddress Conflict resolution contract address.
     * @param _houseAddress House address to move profit to.
     */
    constructor(
        address _serverAddress,
        uint128 _minStake,
        uint128 _maxStake,
        address _conflictResAddress,
        address payable _houseAddress
    )
        GameChannelConflict(_serverAddress, _minStake, _maxStake, _conflictResAddress, _houseAddress)
    {
        // nothing to do
    }

    /**
     * @notice Create games session request. msg.value needs to be valid stake value.
     * @param _userEndHash Last entry of users' hash chain.
     * @param _previousGameId User's previous game id, initial 0.
     * @param _createBefore Game can be only created before this timestamp.
     * @param _serverEndHash Last entry of server's hash chain.
     * @param _serverSig Server signature. See verifyCreateSig
     */
    function createGame(
        bytes32 _userEndHash,
        uint _previousGameId,
        uint _createBefore,
        bytes32 _serverEndHash,
        bytes memory _serverSig
    )
        public
        payable
        onlyValidValue
        onlyValidHouseStake(activeGames + 1)
        onlyNotPaused
    {
        uint previousGameId = userGameId[msg.sender];
        Game storage game = gameIdGame[previousGameId];

        require(game.status == GameStatus.ENDED, "prev game not ended");
        require(previousGameId == _previousGameId, "inv gamePrevGameId");
        require(block.timestamp < _createBefore, "expired");

        verifyCreateSig(block.chainid, msg.sender, _previousGameId, _createBefore, _serverEndHash, _serverSig);

        uint gameId = gameIdCntr++;
        userGameId[msg.sender] = gameId;
        Game storage newGame = gameIdGame[gameId];

        newGame.stake = uint128(msg.value); // It's safe to cast msg.value as it is limited, see onlyValidValue
        newGame.status = GameStatus.ACTIVE;

        activeGames = activeGames.add(1);

        // It's safe to cast msg.value as it is limited, see onlyValidValue
        emit LogGameCreated(msg.sender, gameId, uint128(msg.value), _serverEndHash,  _userEndHash);
    }


    /**
     * @dev Regular end game session. Used if user and house have both
     * accepted current game session state.
     * The game session with gameId _gameId is closed
     * and the user paid out. This functions is called by the server after
     * the user requested the termination of the current game session.
     * @param _roundId Round id of bet.
     * @param _balance Current balance.
     * @param _serverHash Hash of server's seed for this bet.
     * @param _userHash Hash of user's seed for this bet.
     * @param _gameId Game session id.
     * @param _contractAddress Address of this contract.
     * @param _userAddress Address of user.
     * @param _userSig User's signature of this bet.
     */
    function serverEndGame(
        uint32 _roundId,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        uint _gameId,
        address _contractAddress,
        address payable _userAddress,
        bytes memory _userSig
    )
        public
        onlyServer
    {
        verifySig(
                _roundId,
                0,
                0,
                0,
                _balance,
                _serverHash,
                _userHash,
                _gameId,
                _contractAddress,
                _userSig,
                _userAddress
        );

        regularEndGame(_userAddress, _roundId, _balance, _gameId, _contractAddress);
    }

    /**
     * @notice Regular end game session. Normally not needed as server ends game (@see serverEndGame).
     * Can be used by user if server does not end game session.
     * @param _roundId Round id of bet.
     * @param _balance Current balance.
     * @param _serverHash Hash of server's seed for this bet.
     * @param _userHash Hash of user's seed for this bet.
     * @param _gameId Game session id.
     * @param _contractAddress Address of this contract.
     * @param _serverSig Server's signature of this bet.
     */
    function userEndGame(
        uint32 _roundId,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        uint _gameId,
        address _contractAddress,
        bytes memory _serverSig
    )
        public
    {
        verifySig(
                _roundId,
                0,
                0,
                0,
                _balance,
                _serverHash,
                _userHash,
                _gameId,
                _contractAddress,
                _serverSig,
                serverAddress
        );

        regularEndGame(payable(msg.sender), _roundId, _balance, _gameId, _contractAddress);
    }

    /**
     * @dev Verify server signature.
     * @param _userAddress User's address.
     * @param _previousGameId User's previous game id, initial 0.
     * @param _createBefore Game can be only created before this timestamp.
     * @param _serverEndHash Last entry of server's hash chain.
     * @param _serverSig Server signature.
     */
    function verifyCreateSig(
        uint chainId,
        address _userAddress,
        uint _previousGameId,
        uint _createBefore,
        bytes32 _serverEndHash,
        bytes memory _serverSig
    )
        private view
    {
        address contractAddress = address(this);
        bytes32 hash = keccak256(abi.encodePacked(
            chainId, contractAddress, _userAddress, _previousGameId, _createBefore, _serverEndHash
        ));

        verify(hash, _serverSig, serverAddress);
    }

    /**
     * @dev Regular end game session implementation. Used if user and house have both
     * accepted current game session state. The game session with gameId _gameId is closed
     * and the user paid out.
     * @param _userAddress Address of user.
     * @param _balance Current balance.
     * @param _gameId Game session id.
     * @param _contractAddress Address of this contract.
     */
    function regularEndGame(
        address payable _userAddress,
        uint32 _roundId,
        int _balance,
        uint _gameId,
        address _contractAddress
    )
        private
    {
        uint gameId = userGameId[_userAddress];
        Game storage game = gameIdGame[gameId];
        int maxBalance = conflictRes.maxBalance();
        int gameStake = int(uint(game.stake));

        require(_gameId == gameId, "inv gameId");
        require(_roundId > 0, "inv roundId");
        // save to cast as game.stake hash fixed range
        require(-gameStake <= _balance && _balance <= maxBalance, "inv balance");
        require(game.status == GameStatus.ACTIVE, "inv status");

        assert(_contractAddress == address(this));

        closeGame(game, gameId, _roundId, _userAddress, ReasonEnded.REGULAR_ENDED, _balance);
    }
}

File 2 of 12: Activatable.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.11;

import "./Ownable.sol";


/**
 * @title Activatable
 * @dev Contract is initial deactivated and can be activated by owner.
 * @author Dicether
 */
contract Activatable is Ownable {
    bool public activated = false;

    /// @dev Event is fired if activated.
    event LogActive();

    /// @dev Modifier, which only allows function execution if activated.
    modifier onlyActivated() {
        require(activated);
        _;
    }

    /// @dev Modifier, which only allows function execution if not activated.
    modifier onlyNotActivated() {
        require(!activated);
        _;
    }

    /// @dev activate contract, can be only called once by the contract owner.
    function activate() public onlyOwner onlyNotActivated {
        activated = true;
        emit LogActive();
    }
}

File 3 of 12: ConflictResolutionInterface.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.11;


/**
 * @title Conflict Resolution Interface
 * @dev interface to contract used for conflict resolution. Only needed if server or
 * user stops responding during game session. For documentation consult implementation
 * contract.
 * @author dicether
 */
interface ConflictResolutionInterface {
    function minHouseStake(uint activeGames) external view returns(uint);

    function maxBalance() external view returns(int);

    function conflictEndFine() external pure returns(int);

    function isValidBet(uint8 _gameType, uint _betNum, uint _betValue) external view returns(bool);

    function endGameConflict(
        uint8 _gameType,
        uint _betNum,
        uint _betValue,
        int _balance,
        uint _stake,
        bytes32 _serverSeed,
        bytes32 _userSeed
    )
        external
        view
        returns(int);

    function serverForceGameEnd(
        uint8 gameType,
        uint _betNum,
        uint _betValue,
        int _balance,
        uint _stake,
        bytes32 _serverSeed,
        bytes32 _userSeed,
        uint _endInitiatedTime
    )
        external
        view
        returns(int);

    function userForceGameEnd(
        uint8 _gameType,
        uint _betNum,
        uint _betValue,
        int _balance,
        uint _stake,
        uint _endInitiatedTime
    )
        external
        view
        returns(int);
}

File 4 of 12: ConflictResolutionManager.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.11;

import "./ConflictResolutionInterface.sol";
import "./Ownable.sol";


/**
 * @title Conflict Resolution Manager
 * @author dicether
 */
contract ConflictResolutionManager is Ownable {
    /// @dev Conflict resolution contract.
    ConflictResolutionInterface public conflictRes;

    /// @dev New Conflict resolution contract.
    address public newConflictRes = address(0);

    /// @dev Time update of new conflict resolution contract was initiated.
    uint public updateTime = 0;

    /// @dev Min time before new conflict res contract can be activated after initiating update.
    uint public constant MIN_TIMEOUT = 3 days;

    /// @dev Min time before new conflict res contract can be activated after initiating update.
    uint public constant MAX_TIMEOUT = 6 days;

    /// @dev Update of conflict resolution contract was initiated.
    event LogUpdatingConflictResolution(address newConflictResolutionAddress);

    /// @dev New conflict resolution contract is active.
    event LogUpdatedConflictResolution(address newConflictResolutionAddress);

    /**
     * @dev Constructor
     * @param _conflictResAddress conflict resolution contract address.
     */
    constructor(address _conflictResAddress) {
        conflictRes = ConflictResolutionInterface(_conflictResAddress);
    }

    /**
     * @dev Initiate conflict resolution contract update.
     * @param _newConflictResAddress New conflict resolution contract address.
     */
    function updateConflictResolution(address _newConflictResAddress) public onlyOwner {
        newConflictRes = _newConflictResAddress;
        updateTime = block.timestamp;

        emit LogUpdatingConflictResolution(_newConflictResAddress);
    }

    /**
     * @dev Active new conflict resolution contract.
     */
    function activateConflictResolution() public onlyOwner {
        require(newConflictRes != address(0));
        require(updateTime != 0);
        require(updateTime + MIN_TIMEOUT <= block.timestamp && block.timestamp <= updateTime + MAX_TIMEOUT);

        conflictRes = ConflictResolutionInterface(newConflictRes);
        newConflictRes = address(0);
        updateTime = 0;

        emit LogUpdatedConflictResolution(newConflictRes);
    }
}

File 5 of 12: Destroyable.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.11;

import "./Pausable.sol";


/**
 * @title Destroyable
 * @dev Provides destroy support
 * @author dicether
 */
contract Destroyable is Pausable {
    /// @dev After pausing the contract for 20 days owner can selfdestruct it.
    uint public constant TIMEOUT_DESTROY = 20 days;

    /**
     * @dev Destroy contract and transfer ether to owner.
     */
    function destroy() public onlyOwner onlyPausedSince(TIMEOUT_DESTROY) {
        selfdestruct(payable(owner));
    }
}

File 6 of 12: GameChannelBase.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.11;

import "./ConflictResolutionInterface.sol";
import "./ConflictResolutionManager.sol";
import "./Destroyable.sol";
import "./MathUtil.sol";
import "./SafeCast.sol";
import "./SafeMath.sol";


/**
 * @title Game Channel Base
 * @dev Base contract for state channel implementation.
 * @author dicether
 */
contract GameChannelBase is Destroyable, ConflictResolutionManager {
    using SafeCast for int;
    using SafeCast for uint;
    using SafeMath for int;
    using SafeMath for uint;


    /// @dev Different game session states.
    enum GameStatus {
        ENDED, ///< @dev Game session is ended.
        ACTIVE, ///< @dev Game session is active.
        USER_INITIATED_END, ///< @dev User initiated non regular end.
        SERVER_INITIATED_END ///< @dev Server initiated non regular end.
    }

    /// @dev Reason game session ended.
    enum ReasonEnded {
        REGULAR_ENDED, ///< @dev Game session is regularly ended.
        SERVER_FORCED_END, ///< @dev User did not respond. Server forced end.
        USER_FORCED_END, ///< @dev Server did not respond. User forced end.
        CONFLICT_ENDED ///< @dev Server or user raised conflict ans pushed game state, opponent pushed same game state.
    }

    struct Game {
        /// @dev Game session status.
        GameStatus status;

        /// @dev User's stake.
        uint128 stake;

        /// @dev Last game round info if not regularly ended.
        /// If game session is ended normally this data is not used.
        uint8 gameType;
        uint32 roundId;
        uint betNum;
        uint betValue;
        int balance;
        bytes32 userSeed;
        bytes32 serverSeed;
        uint endInitiatedTime;
    }

    /// @dev Minimal time span between profit transfer.
    uint public constant MIN_TRANSFER_TIMESPAN = 1 days;

    /// @dev Maximal time span between profit transfer.
    uint public constant MAX_TRANSFER_TIMSPAN = 6 * 30 days;

    bytes32 public constant EIP712DOMAIN_TYPEHASH = keccak256(
        "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
    );

    bytes32 public constant BET_TYPEHASH = keccak256(
        "Bet(uint32 roundId,uint8 gameType,uint256 number,uint256 value,int256 balance,bytes32 serverHash,bytes32 userHash,uint256 gameId)"
    );

    bytes32 public DOMAIN_SEPERATOR;

    /// @dev Current active game sessions.
    uint public activeGames = 0;

    /// @dev Game session id counter. Points to next free game session slot. So gameIdCntr -1 is the
    // number of game sessions created.
    uint public gameIdCntr = 1;

    /// @dev Only this address can accept and end games.
    address public serverAddress;

    /// @dev Address to transfer profit to.
    address payable public houseAddress;

    /// @dev Current house stake.
    uint public houseStake = 0;

    /// @dev House profit since last profit transfer.
    int public houseProfit = 0;

    /// @dev Min value user needs to deposit for creating game session.
    uint128 public minStake;

    /// @dev Max value user can deposit for creating game session.
    uint128 public maxStake;

    /// @dev Timeout until next profit transfer is allowed.
    uint public profitTransferTimeSpan = 14 days;

    /// @dev Last time profit transferred to house.
    uint public lastProfitTransferTimestamp;

    /// @dev Maps gameId to game struct.
    mapping (uint => Game) public gameIdGame;

    /// @dev Maps user address to current user game id.
    mapping (address => uint) public userGameId;

    /// @dev Maps user address to pending returns.
    mapping (address => uint) public pendingReturns;

    /// @dev Modifier, which only allows to execute if house stake is high enough.
    modifier onlyValidHouseStake(uint _activeGames) {
        uint minHouseStake = conflictRes.minHouseStake(_activeGames);
        require(houseStake >= minHouseStake, "inv houseStake");
        _;
    }

    /// @dev Modifier to check if value send fulfills user stake requirements.
    modifier onlyValidValue() {
        require(minStake <= msg.value && msg.value <= maxStake, "inv stake");
        _;
    }

    /// @dev Modifier, which only allows server to call function.
    modifier onlyServer() {
        require(msg.sender == serverAddress);
        _;
    }

    /// @dev Modifier, which only allows to set valid transfer timeouts.
    modifier onlyValidTransferTimeSpan(uint transferTimeout) {
        require(transferTimeout >= MIN_TRANSFER_TIMESPAN
                && transferTimeout <= MAX_TRANSFER_TIMSPAN);
        _;
    }

    /// @dev This event is fired when user creates game session.
    event LogGameCreated(address indexed user, uint indexed gameId, uint128 stake, bytes32 indexed serverEndHash, bytes32 userEndHash);

    /// @dev This event is fired when user requests conflict end.
    event LogUserRequestedEnd(address indexed user, uint indexed gameId);

    /// @dev This event is fired when server requests conflict end.
    event LogServerRequestedEnd(address indexed user, uint indexed gameId);

    /// @dev This event is fired when game session is ended.
    event LogGameEnded(address indexed user, uint indexed gameId, uint32 roundId, int balance, ReasonEnded reason);

    /// @dev this event is fired when owner modifies user's stake limits.
    event LogStakeLimitsModified(uint minStake, uint maxStake);

    /**
     * @dev Contract constructor.
     * @param _serverAddress Server address.
     * @param _minStake Min value user needs to deposit to create game session.
     * @param _maxStake Max value user can deposit to create game session.
     * @param _conflictResAddress Conflict resolution contract address.
     * @param _houseAddress House address to move profit to.
     */
    constructor(
        address _serverAddress,
        uint128 _minStake,
        uint128 _maxStake,
        address _conflictResAddress,
        address payable _houseAddress
    )
        ConflictResolutionManager(_conflictResAddress)
    {
        require(_minStake > 0 && _minStake <= _maxStake);

        serverAddress = _serverAddress;
        houseAddress = _houseAddress;
        lastProfitTransferTimestamp = block.timestamp;
        minStake = _minStake;
        maxStake = _maxStake;

        DOMAIN_SEPERATOR =  keccak256(abi.encode(
            EIP712DOMAIN_TYPEHASH,
            keccak256("Dicether"),
            keccak256("2"),
            block.chainid,
            address(this)
        ));
    }

    /**
     * @dev Set gameIdCntr. Can be only set before activating contract.
     */
    function setGameIdCntr(uint _gameIdCntr) public onlyOwner onlyNotActivated {
        require(gameIdCntr > 0);
        gameIdCntr = _gameIdCntr;
    }

    /**
     * @notice Withdraw pending returns.
     */
    function withdraw() public {
        uint toTransfer = pendingReturns[msg.sender];
        require(toTransfer > 0);

        pendingReturns[msg.sender] = 0;
        payable(msg.sender).transfer(toTransfer);
    }

    /**
     * @notice Transfer house profit to houseAddress.
     */
    function transferProfitToHouse() public {
        require(lastProfitTransferTimestamp.add(profitTransferTimeSpan) <= block.timestamp);

        // update last transfer timestamp
        lastProfitTransferTimestamp = block.timestamp;

        if (houseProfit <= 0) {
            // no profit to transfer
            return;
        }

        uint toTransfer = houseProfit.castToUint();

        houseProfit = 0;
        houseStake = houseStake.sub(toTransfer);

        houseAddress.transfer(toTransfer);
    }

    /**
     * @dev Set profit transfer time span.
     */
    function setProfitTransferTimeSpan(uint _profitTransferTimeSpan)
        public
        onlyOwner
        onlyValidTransferTimeSpan(_profitTransferTimeSpan)
    {
        profitTransferTimeSpan = _profitTransferTimeSpan;
    }

    /**
     * @dev Increase house stake by msg.value
     */
    function addHouseStake() public payable onlyOwner {
        houseStake = houseStake.add(msg.value);
    }

    /**
     * @dev Withdraw house stake.
     */
    function withdrawHouseStake(uint value) public onlyOwner {
        uint minHouseStake = conflictRes.minHouseStake(activeGames);

        require(value <= houseStake && houseStake.sub(value) >= minHouseStake);
        require(houseProfit <= 0 || houseProfit.castToUint() <= houseStake.sub(value));

        houseStake = houseStake.sub(value);
        payable(owner).transfer(value);
    }

    /**
     * @dev Withdraw house stake and profit.
     */
    function withdrawAll() public onlyOwner onlyPausedSince(3 days) {
        houseProfit = 0;
        uint toTransfer = houseStake;
        houseStake = 0;
        payable(owner).transfer(toTransfer);
    }

    /**
     * @dev Set new house address.
     * @param _houseAddress New house address.
     */
    function setHouseAddress(address payable _houseAddress) public onlyOwner {
        houseAddress = _houseAddress;
    }

    /**
     * @dev Set stake min and max value.
     * @param _minStake Min stake.
     * @param _maxStake Max stake.
     */
    function setStakeRequirements(uint128 _minStake, uint128 _maxStake) public onlyOwner {
        require(_minStake > 0 && _minStake <= _maxStake);
        minStake = _minStake;
        maxStake = _maxStake;
        emit LogStakeLimitsModified(minStake, maxStake);
    }

    /**
     * @dev Close game session.
     * @param _game Game session data.
     * @param _gameId Id of game session.
     * @param _userAddress User's address of game session.
     * @param _reason Reason for closing game session.
     * @param _balance Game session balance.
     */
    function closeGame(
        Game storage _game,
        uint _gameId,
        uint32 _roundId,
        address payable _userAddress,
        ReasonEnded _reason,
        int _balance
    )
        internal
    {
        _game.status = GameStatus.ENDED;

        activeGames = activeGames.sub(1);

        payOut(_userAddress, _game.stake, _balance);

        emit LogGameEnded(_userAddress, _gameId, _roundId, _balance, _reason);
    }

    /**
     * @dev End game by paying out user and server.
     * @param _userAddress User's address.
     * @param _stake User's stake.
     * @param _balance User's balance.
     */
    function payOut(address payable _userAddress, uint128 _stake, int _balance) internal {
        int stakeInt = int(uint(_stake));
        int houseStakeInt = houseStake.castToInt();

        assert(_balance <= conflictRes.maxBalance());
        assert((stakeInt.add(_balance)) >= 0);

        if (_balance > 0 && houseStakeInt < _balance) {
            // Should never happen!
            // House is bankrupt.
            // Payout left money.
            _balance = houseStakeInt;
        }

        houseProfit = houseProfit.sub(_balance);

        int newHouseStake = houseStakeInt.sub(_balance);
        houseStake = newHouseStake.castToUint();

        uint valueUser = stakeInt.add(_balance).castToUint();
        pendingReturns[_userAddress] += valueUser;
        if (pendingReturns[_userAddress] > 0) {
            safeSend(_userAddress);
        }
    }

    /**
     * @dev Send value of pendingReturns[_address] to _address.
     * @param _address Address to send value to.
     */
    function safeSend(address payable _address) internal {
        uint valueToSend = pendingReturns[_address];
        assert(valueToSend > 0);

        pendingReturns[_address] = 0;
        if (_address.send(valueToSend) == false) {
            pendingReturns[_address] = valueToSend;
        }
    }

    /**
     * @dev Verify signature of given data. Throws on verification failure.
     * @param _sig Signature of given data in the form of rsv.
     * @param _address Address of signature signer.
     */
    function verifySig(
        uint32 _roundId,
        uint8 _gameType,
        uint _num,
        uint _value,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        uint _gameId,
        address _contractAddress,
        bytes memory _sig,
        address _address
    )
        internal
        view
    {
        // check if this is the correct contract
        address contractAddress = address(this);
        require(_contractAddress == contractAddress, "inv contractAddress");

        bytes32 roundHash = calcHash(
                _roundId,
                _gameType,
                _num,
                _value,
                _balance,
                _serverHash,
                _userHash,
                _gameId
        );

        verify(
                roundHash,
                _sig,
                _address
        );
    }

     /**
     * @dev Check if _sig is valid signature of _hash. Throws if invalid signature.
     * @param _hash Hash to check signature of.
     * @param _sig Signature of _hash.
     * @param _address Address of signer.
     */
    function verify(
        bytes32 _hash,
        bytes memory _sig,
        address _address
    )
        internal
        pure
    {
        (bytes32 r, bytes32 s, uint8 v) = signatureSplit(_sig);
        address addressRecover = ecrecover(_hash, v, r, s);
        require(addressRecover == _address, "inv sig");
    }

    /**
     * @dev Calculate typed hash of given data (compare eth_signTypedData).
     * @return Hash of given data.
     */
    function calcHash(
        uint32 _roundId,
        uint8 _gameType,
        uint _num,
        uint _value,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        uint _gameId
    )
        private
        view
        returns(bytes32)
    {
        bytes32 betHash = keccak256(abi.encode(
            BET_TYPEHASH,
            _roundId,
            _gameType,
            _num,
            _value,
            _balance,
            _serverHash,
            _userHash,
            _gameId
        ));

        return keccak256(abi.encodePacked(
            "\x19\x01",
            DOMAIN_SEPERATOR,
            betHash
        ));
    }

    /**
     * @dev Split the given signature of the form rsv in r s v. v is incremented with 27 if
     * it is below 2.
     * @param _signature Signature to split.
     * @return r s v
     */
    function signatureSplit(bytes memory _signature)
        private
        pure
        returns (bytes32 r, bytes32 s, uint8 v)
    {
        require(_signature.length == 65, "inv sig");

        assembly {
            r := mload(add(_signature, 32))
            s := mload(add(_signature, 64))
            v := and(mload(add(_signature, 65)), 0xff)
        }
        if (v < 2) {
            v = v + 27;
        }
    }
}

File 7 of 12: GameChannelConflict.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.11;

import "./GameChannelBase.sol";


/**
 * @title Game Channel Conflict
 * @dev Conflict handling implementation.
 * @author dicether
 */
contract GameChannelConflict is GameChannelBase {
    using SafeCast for int;
    using SafeCast for uint;
    using SafeMath for int;
    using SafeMath for uint;

    /**
     * @dev Contract constructor.
     * @param _serverAddress Server address.
     * @param _minStake Min value user needs to deposit to create game session.
     * @param _maxStake Max value user can deposit to create game session.
     * @param _conflictResAddress Conflict resolution contract address
     * @param _houseAddress House address to move profit to
     */
    constructor(
        address _serverAddress,
        uint128 _minStake,
        uint128 _maxStake,
        address _conflictResAddress,
        address payable _houseAddress
    )
        GameChannelBase(_serverAddress, _minStake, _maxStake, _conflictResAddress, _houseAddress)
    {
        // nothing to do
    }

    /**
     * @dev Used by server if user does not end game session.
     * @param _roundId Round id of bet.
     * @param _gameType Game type of bet.
     * @param _num Number of bet.
     * @param _value Value of bet.
     * @param _balance Balance before this bet.
     * @param _serverHash Hash of server seed for this bet.
     * @param _userHash Hash of user seed for this bet.
     * @param _gameId Game session id.
     * @param _userSig User signature of this bet.
     * @param _userAddress Address of user.
     * @param _serverSeed Server seed for this bet.
     * @param _userSeed User seed for this bet.
     */
    function serverEndGameConflict(
        uint32 _roundId,
        uint8 _gameType,
        uint _num,
        uint _value,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        uint _gameId,
        bytes memory _userSig,
        address payable _userAddress,
        bytes32 _serverSeed,
        bytes32 _userSeed
    )
        public
        onlyServer
    {
        verifySig(
                _roundId,
                _gameType,
                _num,
                _value,
                _balance,
                _serverHash,
                _userHash,
                _gameId,
                address(this),
                _userSig,
                _userAddress
        );

        serverEndGameConflictImpl(
                _roundId,
                _gameType,
                _num,
                _value,
                _balance,
                _serverHash,
                _userHash,
                _serverSeed,
                _userSeed,
                _gameId,
                _userAddress
        );
    }

    /**
     * @notice Can be used by user if server does not answer to the end game session request.
     * @param _roundId Round id of bet.
     * @param _gameType Game type of bet.
     * @param _num Number of bet.
     * @param _value Value of bet.
     * @param _balance Balance before this bet.
     * @param _serverHash Hash of server seed for this bet.
     * @param _userHash Hash of user seed for this bet.
     * @param _gameId Game session id.
     * @param _serverSig Server signature of this bet.
     * @param _userSeed User seed for this bet.
     */
    function userEndGameConflict(
        uint32 _roundId,
        uint8 _gameType,
        uint _num,
        uint _value,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        uint _gameId,
        bytes memory _serverSig,
        bytes32 _userSeed
    )
        public
    {
        verifySig(
            _roundId,
            _gameType,
            _num,
            _value,
            _balance,
            _serverHash,
            _userHash,
            _gameId,
            address(this),
            _serverSig,
            serverAddress
        );

        userEndGameConflictImpl(
            _roundId,
            _gameType,
            _num,
            _value,
            _balance,
            _userHash,
            _userSeed,
            _gameId,
            payable(msg.sender)
        );
    }

    /**
     * @notice Cancel active game without playing. Useful if server stops responding before
     * one game is played.
     * @param _gameId Game session id.
     */
    function userCancelActiveGame(uint _gameId) public {
        address payable userAddress = payable(msg.sender);
        uint gameId = userGameId[userAddress];
        Game storage game = gameIdGame[gameId];

        require(gameId == _gameId, "inv gameId");

        if (game.status == GameStatus.ACTIVE) {
            game.endInitiatedTime = block.timestamp;
            game.status = GameStatus.USER_INITIATED_END;

            emit LogUserRequestedEnd(msg.sender, gameId);
        } else if (game.status == GameStatus.SERVER_INITIATED_END && game.roundId == 0) {
            cancelActiveGame(game, gameId, userAddress);
        } else {
            revert();
        }
    }

    /**
     * @dev Cancel active game without playing. Useful if user starts game session and
     * does not play.
     * @param _userAddress Users' address.
     * @param _gameId Game session id.
     */
    function serverCancelActiveGame(address payable _userAddress, uint _gameId) public onlyServer {
        uint gameId = userGameId[_userAddress];
        Game storage game = gameIdGame[gameId];

        require(gameId == _gameId, "inv gameId");

        if (game.status == GameStatus.ACTIVE) {
            game.endInitiatedTime = block.timestamp;
            game.status = GameStatus.SERVER_INITIATED_END;

            emit LogServerRequestedEnd(msg.sender, gameId);
        } else if (game.status == GameStatus.USER_INITIATED_END && game.roundId == 0) {
            cancelActiveGame(game, gameId, _userAddress);
        } else {
            revert();
        }
    }

    /**
    * @dev Force end of game if user does not respond. Only possible after a certain period of time
    * to give the user a chance to respond.
    * @param _userAddress User's address.
    */
    function serverForceGameEnd(address payable _userAddress, uint _gameId) public onlyServer {
        uint gameId = userGameId[_userAddress];
        Game storage game = gameIdGame[gameId];

        require(gameId == _gameId, "inv gameId");
        require(game.status == GameStatus.SERVER_INITIATED_END, "inv status");

        // theoretically we have enough data to calculate winner
        // but as user did not respond assume he has lost.
        int newBalance = conflictRes.serverForceGameEnd(
            game.gameType,
            game.betNum,
            game.betValue,
            game.balance,
            game.stake,
            game.serverSeed,
            game.userSeed,
            game.endInitiatedTime
        );

        closeGame(game, gameId, game.roundId, _userAddress, ReasonEnded.SERVER_FORCED_END, newBalance);
    }

    /**
    * @notice Force end of game if server does not respond. Only possible after a certain period of time
    * to give the server a chance to respond.
    */
    function userForceGameEnd(uint _gameId) public {
        address payable userAddress = payable(msg.sender);
        uint gameId = userGameId[userAddress];
        Game storage game = gameIdGame[gameId];

        require(gameId == _gameId, "inv gameId");
        require(game.status == GameStatus.USER_INITIATED_END, "inv status");

        int newBalance = conflictRes.userForceGameEnd(
            game.gameType,
            game.betNum,
            game.betValue,
            game.balance,
            game.stake,
            game.endInitiatedTime
        );

        closeGame(game, gameId, game.roundId, userAddress, ReasonEnded.USER_FORCED_END, newBalance);
    }

    /**
     * @dev Conflict handling implementation. Stores game data and timestamp if game
     * is active. If server has already marked conflict for game session the conflict
     * resolution contract is used (compare conflictRes).
     * @param _roundId Round id of bet.
     * @param _gameType Game type of bet.
     * @param _num Number of bet.
     * @param _value Value of bet.
     * @param _balance Balance before this bet.
     * @param _userHash Hash of user's seed for this bet.
     * @param _userSeed User's seed for this bet.
     * @param _gameId game Game session id.
     * @param _userAddress User's address.
     */
    function userEndGameConflictImpl(
        uint32 _roundId,
        uint8 _gameType,
        uint _num,
        uint _value,
        int _balance,
        bytes32 _userHash,
        bytes32 _userSeed,
        uint _gameId,
        address payable _userAddress
    )
        private
    {
        uint gameId = userGameId[_userAddress];
        Game storage game = gameIdGame[gameId];
        int maxBalance = conflictRes.maxBalance();
        int gameStake = int(uint(game.stake));

        require(gameId == _gameId, "inv gameId");
        require(_roundId > 0, "inv roundId");
        require(keccak256(abi.encodePacked(_userSeed)) == _userHash, "inv userSeed");
        require(-gameStake <= _balance && _balance <= maxBalance, "inv balance"); // game.stake save to cast as uint128
        require(conflictRes.isValidBet(_gameType, _num, _value), "inv bet");
        require(gameStake.add(_balance).sub(_value.castToInt()) >= 0, "value too high"); // game.stake save to cast as uint128

        if (game.status == GameStatus.SERVER_INITIATED_END && game.roundId == _roundId) {
            game.userSeed = _userSeed;
            endGameConflict(game, gameId, _userAddress);
        } else if (game.status == GameStatus.ACTIVE
                || (game.status == GameStatus.SERVER_INITIATED_END && game.roundId < _roundId)) {
            game.status = GameStatus.USER_INITIATED_END;
            game.endInitiatedTime = block.timestamp;
            game.roundId = _roundId;
            game.gameType = _gameType;
            game.betNum = _num;
            game.betValue = _value;
            game.balance = _balance;
            game.userSeed = _userSeed;
            game.serverSeed = bytes32(0);

            emit LogUserRequestedEnd(msg.sender, gameId);
        } else {
            revert("inv state");
        }
    }

    /**
     * @dev Conflict handling implementation. Stores game data and timestamp if game
     * is active. If user has already marked conflict for game session the conflict
     * resolution contract is used (compare conflictRes).
     * @param _roundId Round id of bet.
     * @param _gameType Game type of bet.
     * @param _num Number of bet.
     * @param _value Value of bet.
     * @param _balance Balance before this bet.
     * @param _serverHash Hash of server's seed for this bet.
     * @param _userHash Hash of user's seed for this bet.
     * @param _serverSeed Server's seed for this bet.
     * @param _userSeed User's seed for this bet.
     * @param _userAddress User's address.
     */
    function serverEndGameConflictImpl(
        uint32 _roundId,
        uint8 _gameType,
        uint _num,
        uint _value,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        bytes32 _serverSeed,
        bytes32 _userSeed,
        uint _gameId,
        address payable _userAddress
    )
        private
    {
        uint gameId = userGameId[_userAddress];
        Game storage game = gameIdGame[gameId];
        int maxBalance = conflictRes.maxBalance();
        int gameStake = int(uint(game.stake));

        require(gameId == _gameId, "inv gameId");
        require(_roundId > 0, "inv roundId");
        require(keccak256(abi.encodePacked(_serverSeed)) == _serverHash, "inv serverSeed");
        require(keccak256(abi.encodePacked(_userSeed)) == _userHash, "inv userSeed");
        require(-gameStake <= _balance && _balance <= maxBalance, "inv balance"); // game.stake save to cast as uint128
        require(conflictRes.isValidBet(_gameType, _num, _value), "inv bet");
        require(gameStake.add(_balance).sub(_value.castToInt()) >= 0, "too high value"); // game.stake save to cast as uin128

        if (game.status == GameStatus.USER_INITIATED_END && game.roundId == _roundId) {
            game.serverSeed = _serverSeed;
            endGameConflict(game, gameId, _userAddress);
        } else if (game.status == GameStatus.ACTIVE
                || (game.status == GameStatus.USER_INITIATED_END && game.roundId < _roundId)) {
            game.status = GameStatus.SERVER_INITIATED_END;
            game.endInitiatedTime = block.timestamp;
            game.roundId = _roundId;
            game.gameType = _gameType;
            game.betNum = _num;
            game.betValue = _value;
            game.balance = _balance;
            game.serverSeed = _serverSeed;
            game.userSeed = _userSeed;

            emit LogServerRequestedEnd(_userAddress, gameId);
        } else {
            revert("inv state");
        }
    }

    /**
     * @dev End conflicting game without placed bets.
     * @param _game Game session data.
     * @param _gameId Game session id.
     * @param _userAddress User's address.
     */
    function cancelActiveGame(Game storage _game, uint _gameId, address payable _userAddress) private {
        // user need to pay a fee when conflict ended.
        // this ensures a malicious, rich user can not just generate game sessions and then wait
        // for us to end the game session and then confirm the session status, so
        // we would have to pay a high gas fee without profit.
        int newBalance = -conflictRes.conflictEndFine();

        // do not allow balance below user stake
        int stake = int(uint(_game.stake));
        if (newBalance < -stake) {
            newBalance = -stake;
        }
        closeGame(_game, _gameId, 0, _userAddress, ReasonEnded.CONFLICT_ENDED, newBalance);
    }

    /**
     * @dev End conflicting game.
     * @param _game Game session data.
     * @param _gameId Game session id.
     * @param _userAddress User's address.
     */
    function endGameConflict(Game storage _game, uint _gameId, address payable _userAddress) private {
        int newBalance = conflictRes.endGameConflict(
            _game.gameType,
            _game.betNum,
            _game.betValue,
            _game.balance,
            _game.stake,
            _game.serverSeed,
            _game.userSeed
        );

        closeGame(_game, _gameId, _game.roundId, _userAddress, ReasonEnded.CONFLICT_ENDED, newBalance);
    }
}

File 8 of 12: MathUtil.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.11;


/**
 * @title Math utils
 * @author dicether
 */
library MathUtil {
    /**
     * @dev Returns the absolute value of _val.
     * @param _val value
     * @return The absolute value of _val.
     */
    function abs(int _val) internal pure returns(uint) {
        if (_val < 0) {
            return uint(-_val);
        } else {
            return uint(_val);
        }
    }

    /**
     * @dev Calculate maximum.
     */
    function max(uint _val1, uint _val2) internal pure returns(uint) {
        return _val1 >= _val2 ? _val1 : _val2;
    }

    /**
     * @dev Calculate minimum.
     */
    function min(uint _val1, uint _val2) internal pure returns(uint) {
        return _val1 <= _val2 ? _val1 : _val2;
    }
}

File 9 of 12: Ownable.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.11;


/**
 * @title Owned
 * @dev Basic contract for authorization control.
 * @author dicether
 */
contract Ownable {
    address public owner;
    address public pendingOwner;

    event LogOwnerShipTransferred(address indexed previousOwner, address indexed newOwner);
    event LogOwnerShipTransferInitiated(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Modifier, which throws if called by other account than owner.
     */
    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    /**
     * @dev Modifier throws if called by any account other than the pendingOwner.
     */
    modifier onlyPendingOwner() {
        require(msg.sender == pendingOwner);
        _;
    }

    /**
     * @dev Set contract creator as initial owner
     */
    constructor() {
        owner = msg.sender;
        pendingOwner = address(0);
    }

    /**
     * @dev Allows the current owner to set the pendingOwner address.
     * @param _newOwner The address to transfer ownership to.
     */
    function transferOwnership(address payable _newOwner) public onlyOwner {
        pendingOwner = _newOwner;
        emit LogOwnerShipTransferInitiated(owner, _newOwner);
    }

    /**
     * @dev PendingOwner can accept ownership.
     */
    function claimOwnership() public onlyPendingOwner {
        owner = pendingOwner;
        pendingOwner = address(0);
        emit LogOwnerShipTransferred(owner, pendingOwner);
    }
}

File 10 of 12: Pausable.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.11;

import "./Activatable.sol";
import "./SafeMath.sol";


/**
 * @title Pausable
 * @dev Provides pausing support.
 * @author dicether
 */
contract Pausable is Activatable {
    using SafeMath for uint;

    /// @dev Is contract paused. Initial it is paused.
    bool public paused = true;

    /// @dev Time pause was called
    uint public timePaused = block.timestamp;

    /// @dev Modifier, which only allows function execution if not paused.
    modifier onlyNotPaused() {
        require(!paused, "paused");
        _;
    }

    /// @dev Modifier, which only allows function execution if paused.
    modifier onlyPaused() {
        require(paused);
        _;
    }

    /// @dev Modifier, which only allows function execution if paused longer than timeSpan.
    modifier onlyPausedSince(uint timeSpan) {
        require(paused && (timePaused.add(timeSpan) <= block.timestamp));
        _;
    }

    /// @dev Event is fired if paused.
    event LogPause();

    /// @dev Event is fired if pause is ended.
    event LogUnpause();

    /**
     * @dev Pause contract. No new game sessions can be created.
     */
    function pause() public onlyOwner onlyNotPaused {
        paused = true;
        timePaused = block.timestamp;
        emit LogPause();
    }

    /**
     * @dev Unpause contract. Initial contract is paused and can only be unpaused after activating it.
     */
    function unpause() public onlyOwner onlyPaused onlyActivated {
        paused = false;
        timePaused = 0;
        emit LogUnpause();
    }
}

File 11 of 12: SafeCast.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.11;

library SafeCast {
    /**
     * Cast unsigned a to signed a.
     */
    function castToInt(uint a) internal pure returns(int) {
        assert(a < (1 << 255));
        return int(a);
    }

    /**
     * Cast signed a to unsigned a.
     */
    function castToUint(int a) internal pure returns(uint) {
        assert(a >= 0);
        return uint(a);
    }
}

File 12 of 12: SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error.
 * No checks necessary for solidity >= 0.8.
 * From zeppelin-solidity
 */
library SafeMath {

    /**
    * @dev Multiplies two unsigned integers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        return a * b;
    }

    /**
    * @dev Multiplies two signed integers, throws on overflow.
    */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        return a * b;
    }

    /**
    * @dev Integer division of two unsigned integers, truncating the quotient.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
    * @dev Integer division of two signed integers, truncating the quotient.
    */
    function div(int256 a, int256 b) internal pure returns (int256) {
        return a / b;
    }

    /**
    * @dev Subtracts two unsigned integers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
    * @dev Subtracts two signed integers, throws on overflow.
    */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        return a - b;
    }

    /**
    * @dev Adds two unsigned integers, throws on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        return a + b;
    }

    /**
    * @dev Adds two signed integers, throws on overflow.
    */
    function add(int256 a, int256 b) internal pure returns (int256) {
        return a + b;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_serverAddress","type":"address"},{"internalType":"uint128","name":"_minStake","type":"uint128"},{"internalType":"uint128","name":"_maxStake","type":"uint128"},{"internalType":"address","name":"_conflictResAddress","type":"address"},{"internalType":"address payable","name":"_houseAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"LogActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"stake","type":"uint128"},{"indexed":true,"internalType":"bytes32","name":"serverEndHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"userEndHash","type":"bytes32"}],"name":"LogGameCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"roundId","type":"uint32"},{"indexed":false,"internalType":"int256","name":"balance","type":"int256"},{"indexed":false,"internalType":"enum GameChannelBase.ReasonEnded","name":"reason","type":"uint8"}],"name":"LogGameEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"LogOwnerShipTransferInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"LogOwnerShipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"LogPause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"LogServerRequestedEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxStake","type":"uint256"}],"name":"LogStakeLimitsModified","type":"event"},{"anonymous":false,"inputs":[],"name":"LogUnpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newConflictResolutionAddress","type":"address"}],"name":"LogUpdatedConflictResolution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newConflictResolutionAddress","type":"address"}],"name":"LogUpdatingConflictResolution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"LogUserRequestedEnd","type":"event"},{"inputs":[],"name":"BET_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPERATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TIMEOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TRANSFER_TIMSPAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_TIMEOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_TRANSFER_TIMESPAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIMEOUT_DESTROY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activateConflictResolution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeGames","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addHouseStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"conflictRes","outputs":[{"internalType":"contract ConflictResolutionInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_userEndHash","type":"bytes32"},{"internalType":"uint256","name":"_previousGameId","type":"uint256"},{"internalType":"uint256","name":"_createBefore","type":"uint256"},{"internalType":"bytes32","name":"_serverEndHash","type":"bytes32"},{"internalType":"bytes","name":"_serverSig","type":"bytes"}],"name":"createGame","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"destroy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gameIdCntr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"gameIdGame","outputs":[{"internalType":"enum GameChannelBase.GameStatus","name":"status","type":"uint8"},{"internalType":"uint128","name":"stake","type":"uint128"},{"internalType":"uint8","name":"gameType","type":"uint8"},{"internalType":"uint32","name":"roundId","type":"uint32"},{"internalType":"uint256","name":"betNum","type":"uint256"},{"internalType":"uint256","name":"betValue","type":"uint256"},{"internalType":"int256","name":"balance","type":"int256"},{"internalType":"bytes32","name":"userSeed","type":"bytes32"},{"internalType":"bytes32","name":"serverSeed","type":"bytes32"},{"internalType":"uint256","name":"endInitiatedTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseProfit","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProfitTransferTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxStake","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minStake","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newConflictRes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingReturns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitTransferTimeSpan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"serverAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"serverCancelActiveGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"address payable","name":"_userAddress","type":"address"},{"internalType":"bytes","name":"_userSig","type":"bytes"}],"name":"serverEndGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"uint8","name":"_gameType","type":"uint8"},{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"bytes","name":"_userSig","type":"bytes"},{"internalType":"address payable","name":"_userAddress","type":"address"},{"internalType":"bytes32","name":"_serverSeed","type":"bytes32"},{"internalType":"bytes32","name":"_userSeed","type":"bytes32"}],"name":"serverEndGameConflict","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"serverForceGameEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gameIdCntr","type":"uint256"}],"name":"setGameIdCntr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_houseAddress","type":"address"}],"name":"setHouseAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_profitTransferTimeSpan","type":"uint256"}],"name":"setProfitTransferTimeSpan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_minStake","type":"uint128"},{"internalType":"uint128","name":"_maxStake","type":"uint128"}],"name":"setStakeRequirements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timePaused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferProfitToHouse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newConflictResAddress","type":"address"}],"name":"updateConflictResolution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"userCancelActiveGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"bytes","name":"_serverSig","type":"bytes"}],"name":"userEndGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"uint8","name":"_gameType","type":"uint8"},{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"bytes","name":"_serverSig","type":"bytes"},{"internalType":"bytes32","name":"_userSeed","type":"bytes32"}],"name":"userEndGameConflict","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"userForceGameEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userGameId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdrawHouseStake","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001805461ffff60a01b1916600160a81b17815542600255600480546001600160a01b0319169055600060058190556007819055600891909155600b819055600c5562127500600e553480156200005a57600080fd5b5060405162003779380380620037798339810160408190526200007d9162000227565b60008054336001600160a01b0319918216179091556001805482169055600380549091166001600160a01b038416179055848484848484848484846001600160801b03841615801590620000e35750826001600160801b0316846001600160801b031611155b620000ed57600080fd5b600980546001600160a01b038781166001600160a01b031992831617909255600a80549284169290911691909117905542600f556001600160801b03838116600160801b0290851617600d55604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527fdfb13de966cad53a4ce1c44730ad9a850de899696c2a38947c9e6affb568cdbb918101919091527fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a560608201524660808201523060a082015260c00160405160208183030381529060405280519060200120600681905550505050505050505050505050505050620002a0565b6001600160a01b03811681146200020757600080fd5b50565b80516001600160801b03811681146200022257600080fd5b919050565b600080600080600060a086880312156200024057600080fd5b85516200024d81620001f1565b94506200025d602087016200020a565b93506200026d604087016200020a565b925060608601516200027f81620001f1565b60808701519092506200029281620001f1565b809150509295509295909350565b6134c980620002b06000396000f3fe6080604052600436106103505760003560e01c806388fedd04116101c6578063d1e9dcbf116100f7578063e475222e11610095578063ef3aaf541161006f578063ef3aaf54146109d3578063f2fde38b146109f3578063f87ffb7414610a13578063fd306ca714610a2957600080fd5b8063e475222e14610976578063e60a33aa1461098c578063ea1b28e0146109ac57600080fd5b8063db420fe3116100d1578063db420fe314610909578063dc55509014610929578063de38eb3a1461093f578063e30c39781461095657600080fd5b8063d1e9dcbf146108a9578063d6e5fe98146108c9578063d7cee31e146108e957600080fd5b8063a8182cd311610164578063bd5c4e241161013e578063bd5c4e2414610828578063c49f91d31461083f578063c861f3a014610873578063cbffb1ae1461088957600080fd5b8063a8182cd3146107d5578063afc81953146107f5578063b064ca181461080857600080fd5b80639b29f133116101a05780639b29f133146107605780639c0051db146107805780639f34ce14146107a0578063a09f8659146107b557600080fd5b806388fedd04146107135780638da5cb5b14610729578063947bc72d1461074957600080fd5b80634d20d4bc116102a0578063613f92371161023e57806383197ef01161021857806383197ef01461063c57806383e256dc146106515780638456cb59146106e9578063853828b6146106fe57600080fd5b8063613f9237146105dc5780637eaf8879146105fc57806381efc01d1461061c57600080fd5b8063543ad1df1161027a578063543ad1df14610556578063563c23a01461056d5780635ba2dd22146105835780635c975abb146105bb57600080fd5b80634d20d4bc146105055780634e71e0c8146105395780634f739ff01461054e57600080fd5b8063287e9fbc1161030d5780633ccfd60b116102e75780633ccfd60b146104a55780633f4ba83a146104ba578063410453ae146104cf57806341b80184146104ef57600080fd5b8063287e9fbc146104375780632c94a23514610457578063375b3c0a1461046d57600080fd5b80630df63210146103555780630f15f4c01461037e578063186601ca1461039557806319fc36ed146103c65780631b08345a146103dd57806326b387bb1461040a575b600080fd5b34801561036157600080fd5b5061036b60065481565b6040519081526020015b60405180910390f35b34801561038a57600080fd5b50610393610a3e565b005b3480156103a157600080fd5b506001546103b690600160a01b900460ff1681565b6040519015158152602001610375565b3480156103d257600080fd5b5061036b6201518081565b3480156103e957600080fd5b5061036b6103f8366004612d5b565b60116020526000908152604090205481565b34801561041657600080fd5b5061036b610425366004612d5b565b60126020526000908152604090205481565b34801561044357600080fd5b50610393610452366004612d78565b610aaa565b34801561046357600080fd5b5061036b600e5481565b34801561047957600080fd5b50600d5461048d906001600160801b031681565b6040516001600160801b039091168152602001610375565b3480156104b157600080fd5b50610393610aec565b3480156104c657600080fd5b50610393610b45565b3480156104db57600080fd5b506103936104ea366004612e58565b610bc5565b3480156104fb57600080fd5b5061036b600f5481565b34801561051157600080fd5b5061036b7feef42e798af5b621c1fec054bfc1e4afbc802193bba58f0790a159f94e21fbac81565b34801561054557600080fd5b50610393610c08565b610393610c70565b34801561056257600080fd5b5061036b6203f48081565b34801561057957600080fd5b5061036b60025481565b34801561058f57600080fd5b506003546105a3906001600160a01b031681565b6040516001600160a01b039091168152602001610375565b3480156105c757600080fd5b506001546103b690600160a81b900460ff1681565b3480156105e857600080fd5b506103936105f7366004612f03565b610c99565b34801561060857600080fd5b50610393610617366004612fc5565b610ce4565b34801561062857600080fd5b50610393610637366004612d78565b610d29565b34801561064857600080fd5b50610393610e5b565b34801561065d57600080fd5b506106d361066c366004612d78565b601060205260009081526040902080546001820154600283015460038401546004850154600586015460069096015460ff8087169761010088046001600160801b031697600160881b810490921696600160901b90920463ffffffff16959194919391928a565b6040516103759a9998979695949392919061309d565b3480156106f557600080fd5b50610393610eb4565b34801561070a57600080fd5b50610393610f55565b34801561071f57600080fd5b5061036b600c5481565b34801561073557600080fd5b506000546105a3906001600160a01b031681565b34801561075557600080fd5b5061036b62ed4e0081565b34801561076c57600080fd5b5061039361077b366004612d78565b610fe9565b34801561078c57600080fd5b5061039361079b366004612d78565b6110ce565b3480156107ac57600080fd5b5061039361110b565b3480156107c157600080fd5b506004546105a3906001600160a01b031681565b3480156107e157600080fd5b506103936107f0366004613102565b6111dd565b61039361080336600461312e565b6112dc565b34801561081457600080fd5b50610393610823366004612d78565b611617565b34801561083457600080fd5b5061036b621a5e0081565b34801561084b57600080fd5b5061036b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b34801561087f57600080fd5b5061036b600b5481565b34801561089557600080fd5b506103936108a4366004612d5b565b611772565b3480156108b557600080fd5b506103936108c4366004613102565b6117e1565b3480156108d557600080fd5b506103936108e43660046131a9565b611976565b3480156108f557600080fd5b50600a546105a3906001600160a01b031681565b34801561091557600080fd5b506009546105a3906001600160a01b031681565b34801561093557600080fd5b5061036b60055481565b34801561094b57600080fd5b5061036b6207e90081565b34801561096257600080fd5b506001546105a3906001600160a01b031681565b34801561098257600080fd5b5061036b60075481565b34801561099857600080fd5b506103936109a73660046131dc565b611a25565b3480156109b857600080fd5b50600d5461048d90600160801b90046001600160801b031681565b3480156109df57600080fd5b506103936109ee366004612d5b565b611a65565b3480156109ff57600080fd5b50610393610a0e366004612d5b565b611a9e565b348015610a1f57600080fd5b5061036b60085481565b348015610a3557600080fd5b50610393611b06565b6000546001600160a01b03163314610a5557600080fd5b600154600160a01b900460ff1615610a6c57600080fd5b6001805460ff60a01b1916600160a01b1790556040517fc9d6bebde85c4e3348468c6af2cb34f978d1a8c6eebc438f1361c1ad5edf5f0e90600090a1565b6000546001600160a01b03163314610ac157600080fd5b600154600160a01b900460ff1615610ad857600080fd5b600060085411610ae757600080fd5b600855565b3360009081526012602052604090205480610b0657600080fd5b336000818152601260205260408082208290555183156108fc0291849190818181858888f19350505050158015610b41573d6000803e3d6000fd5b5050565b6000546001600160a01b03163314610b5c57600080fd5b600154600160a81b900460ff16610b7257600080fd5b600154600160a01b900460ff16610b8857600080fd5b6001805460ff60a81b19169055600060028190556040517f730c1faaa977b67dacf1e2451ef54556e04a07d577785ff79f6d31f73502efc99190a1565b6009546001600160a01b03163314610bdc57600080fd5b610bf18860008060008b8b8b8b8b8a8c611b98565b610bfe8289898787611cbe565b5050505050505050565b6001546001600160a01b03163314610c1f57600080fd5b60018054600080546001600160a01b0383166001600160a01b03199182168117835592169092556040517f897d3c8bbea11029ba3b26eb993fe8edb14c2c4c0d2ecceccce41d1d83d3e359908390a3565b6000546001600160a01b03163314610c8757600080fd5b600b54610c949034611e3b565b600b55565b6009546001600160a01b03163314610cb057600080fd5b610cc38c8c8c8c8c8c8c8c308d8d611b98565b610cd68c8c8c8c8c8c8c89898e8d611e4e565b505050505050505050505050565b610d0c8a8a8a8a8a8a8a8a308b600960009054906101000a90046001600160a01b0316611b98565b610d1d8a8a8a8a8a89878a33612333565b50505050505050505050565b6000546001600160a01b03163314610d4057600080fd5b6003546007546040516373c4726b60e01b815260048101919091526000916001600160a01b0316906373c4726b90602401602060405180830381865afa158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190613263565b9050600b548211158015610dd35750600b548190610dd0908461272b565b10155b610ddc57600080fd5b6000600c54131580610e045750600b54610df6908361272b565b610e01600c54612737565b11155b610e0d57600080fd5b600b54610e1a908361272b565b600b55600080546040516001600160a01b039091169184156108fc02918591818181858888f19350505050158015610e56573d6000803e3d6000fd5b505050565b6000546001600160a01b03163314610e7257600080fd5b600154621a5e0090600160a81b900460ff168015610e9d57506002544290610e9a9083611e3b565b11155b610ea657600080fd5b6000546001600160a01b0316ff5b6000546001600160a01b03163314610ecb57600080fd5b600154600160a81b900460ff1615610f135760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b60448201526064015b60405180910390fd5b6001805460ff60a81b1916600160a81b179055426002556040517f4b314b34e912fda7f95e7d23e9c8c95f82f0aff1984e4ce592a0b005f905562490600090a1565b6000546001600160a01b03163314610f6c57600080fd5b6001546203f48090600160a81b900460ff168015610f9757506002544290610f949083611e3b565b11155b610fa057600080fd5b6000600c819055600b805490829055815460405191926001600160a01b039091169183156108fc0291849190818181858888f19350505050158015610e56573d6000803e3d6000fd5b3360008181526011602090815260408083205480845260109092529091208382146110265760405162461bcd60e51b8152600401610f0a9061327c565b6001815460ff16600381111561103e5761103e613069565b141561108757426006820155805460ff19166002178155604051829033907f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed90600090a36110c8565b6003815460ff16600381111561109f5761109f613069565b1480156110b857508054600160901b900463ffffffff16155b15610350576110c881838561274d565b50505050565b6000546001600160a01b031633146110e557600080fd5b806201518081101580156110fc575062ed4e008111155b61110557600080fd5b50600e55565b6000546001600160a01b0316331461112257600080fd5b6004546001600160a01b031661113757600080fd5b60055461114357600080fd5b426203f48060055461115591906132b6565b1115801561117357506207e90060055461116f91906132b6565b4211155b61117c57600080fd5b60048054600380546001600160a01b0383166001600160a01b031991821617909155169055600060058190556040519081527f28de3c2df3d09a8b061f86cd0c78b7d02f1f5caffcd086ff45ee12a4a51056c89060200160405180910390a1565b6009546001600160a01b031633146111f457600080fd5b6001600160a01b038216600090815260116020908152604080832054808452601090925290912082821461123a5760405162461bcd60e51b8152600401610f0a9061327c565b6001815460ff16600381111561125257611252613069565b141561129b57426006820155805460ff19166003178155604051829033907fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab090600090a36110c8565b6002815460ff1660038111156112b3576112b3613069565b1480156112cc57508054600160901b900463ffffffff16155b15610350576110c881838661274d565b600d54346001600160801b039091161180159061130b5750600d54600160801b90046001600160801b03163411155b6113435760405162461bcd60e51b8152602060048201526009602482015268696e76207374616b6560b81b6044820152606401610f0a565b6007546113519060016132b6565b6003546040516373c4726b60e01b8152600481018390526000916001600160a01b0316906373c4726b90602401602060405180830381865afa15801561139b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113bf9190613263565b905080600b5410156114045760405162461bcd60e51b815260206004820152600e60248201526d696e7620686f7573655374616b6560901b6044820152606401610f0a565b600154600160a81b900460ff16156114475760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606401610f0a565b33600090815260116020908152604080832054808452601090925282209091815460ff16600381111561147c5761147c613069565b146114bf5760405162461bcd60e51b81526020600482015260136024820152721c1c995d8819d85b59481b9bdd08195b991959606a1b6044820152606401610f0a565b8782146115035760405162461bcd60e51b81526020600482015260126024820152711a5b9d8819d85b59541c995d91d85b59525960721b6044820152606401610f0a565b86421061153c5760405162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b6044820152606401610f0a565b61154a46338a8a8a8a612803565b600880546000918261155b836132ce565b9091555033600090815260116020908152604080832084905583835260109091529020805470ffffffffffffffffffffffffffffffffff191660ff19610100346001600160801b03160216176001908117825560075492935090916115bf91611e3b565b600755604080516001600160801b0334168152602081018d90528991849133917fd25faca801440882fa5d7c7f70b072a2ad89621e277ee0b6f9923ccac48411b1910160405180910390a45050505050505050505050565b3360008181526011602090815260408083205480845260109092529091208382146116545760405162461bcd60e51b8152600401610f0a9061327c565b6002815460ff16600381111561166c5761166c613069565b146116895760405162461bcd60e51b8152600401610f0a906132e9565b6003805482546001840154600285015493850154600686015460405163062f5d8d60e11b8152600160881b850460ff1660048201526024810193909352604483019590955260648201526101009091046001600160801b0316608482015260a48101929092526000916001600160a01b0390911690630c5ebb1a9060c401602060405180830381865afa158015611724573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117489190613263565b825490915061176b9083908590600160901b900463ffffffff168760028661287a565b5050505050565b6000546001600160a01b0316331461178957600080fd5b600480546001600160a01b0319166001600160a01b038316908117909155426005556040519081527f97044e884f04922f1959ef2de012f4734423df2d4da57fd4c5eaf40cd63b525f9060200160405180910390a150565b6009546001600160a01b031633146117f857600080fd5b6001600160a01b038216600090815260116020908152604080832054808452601090925290912082821461183e5760405162461bcd60e51b8152600401610f0a9061327c565b6003815460ff16600381111561185657611856613069565b146118735760405162461bcd60e51b8152600401610f0a906132e9565b60038054825460018401546002850154938501546005860154600480880154600689015460405163454a41cd60e11b8152600160881b880460ff16938101939093526024830195909552604482019790975260648101929092526101009093046001600160801b0316608482015260a481019290925260c482019390935260e48101929092526000916001600160a01b0390911690638a94839a9061010401602060405180830381865afa15801561192f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119539190613263565b825490915061176b9083908590600160901b900463ffffffff168860018661287a565b6000546001600160a01b0316331461198d57600080fd5b6000826001600160801b03161180156119b85750806001600160801b0316826001600160801b031611155b6119c157600080fd5b6001600160801b03828116600160801b8383168102828117600d8190556040805192861690941782529190910490921660208301527f1ec948cac143dba0e555a87dd86ae387e2ecd4a8fee80f7dd324d5987cb3e7f8910160405180910390a15050565b611a4f8760008060008a8a8a8a8a8a600960009054906101000a90046001600160a01b0316611b98565b611a5c3388888686611cbe565b50505050505050565b6000546001600160a01b03163314611a7c57600080fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ab557600080fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917f83ada3430836f9d4bd6f7bc690ffbba5199cb19b37393dd64c229930213535969190a350565b42611b1e600e54600f54611e3b90919063ffffffff16565b1115611b2957600080fd5b42600f55600c54600012611b3957565b6000611b46600c54612737565b6000600c55600b54909150611b5b908261272b565b600b55600a546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610b41573d6000803e3d6000fd5b306001600160a01b0384168114611be75760405162461bcd60e51b8152602060048201526013602482015272696e7620636f6e74726163744164647265737360681b6044820152606401610f0a565b604080517feef42e798af5b621c1fec054bfc1e4afbc802193bba58f0790a159f94e21fbac60208083019190915263ffffffff8f168284015260ff8e166060830152608082018d905260a082018c905260c082018b905260e082018a90526101008201899052610120808301899052835180840390910181526101408301845280519082012060065461190160f01b61016085015261016284015261018280840191909152835180840390910181526101a29092019092528051910120611caf8185856128fd565b50505050505050505050505050565b6001600160a01b038086166000908152601160209081526040808320548084526010835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a92600480830193928290030181865afa158015611d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d489190613263565b825490915061010090046001600160801b0316838614611d7a5760405162461bcd60e51b8152600401610f0a9061327c565b60008863ffffffff1611611da05760405162461bcd60e51b8152600401610f0a9061330d565b86611daa82613332565b13158015611db85750818713155b611dd45760405162461bcd60e51b8152600401610f0a9061334f565b6001835460ff166003811115611dec57611dec613069565b14611e095760405162461bcd60e51b8152600401610f0a906132e9565b6001600160a01b0385163014611e2157611e21613374565b611e3083858a8c60008c61287a565b505050505050505050565b6000611e4782846132b6565b9392505050565b6001600160a01b038082166000908152601160209081526040808320548084526010835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a92600480830193928290030181865afa158015611eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed89190613263565b825490915061010090046001600160801b0316858414611f0a5760405162461bcd60e51b8152600401610f0a9061327c565b60008f63ffffffff1611611f305760405162461bcd60e51b8152600401610f0a9061330d565b8988604051602001611f4491815260200190565b6040516020818303038152906040528051906020012014611f985760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d881cd95c9d995c94d9595960921b6044820152606401610f0a565b8887604051602001611fac91815260200190565b6040516020818303038152906040528051906020012014611ffe5760405162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b6044820152606401610f0a565b8a61200882613332565b131580156120165750818b13155b6120325760405162461bcd60e51b8152600401610f0a9061334f565b600360009054906101000a90046001600160a01b03166001600160a01b03166309eecdd78f8f8f6040518463ffffffff1660e01b815260040161208d9392919060ff9390931683526020830191909152604082015260600190565b602060405180830381865afa1580156120aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ce919061338a565b6121045760405162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b6044820152606401610f0a565b60006121226121128e6129c8565b61211c848f6129dd565b906129e9565b12156121615760405162461bcd60e51b815260206004820152600e60248201526d746f6f20686967682076616c756560901b6044820152606401610f0a565b6002835460ff16600381111561217957612179613069565b1480156121a557508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16145b156121c157600583018890556121bc8385876129f5565b612322565b6001835460ff1660038111156121d9576121d9613069565b148061222457506002835460ff1660038111156121f8576121f8613069565b14801561222457508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16105b156122ee578254600390849060ff191660018302179055504283600601819055508e8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508d8360000160116101000a81548160ff021916908360ff1602179055508c83600101819055508b83600201819055508a836003018190555087836005018190555086836004018190555083856001600160a01b03167fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab060405160405180910390a3612322565b60405162461bcd60e51b8152602060048201526009602482015268696e7620737461746560b81b6044820152606401610f0a565b505050505050505050505050505050565b6001600160a01b038082166000908152601160209081526040808320548084526010835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a92600480830193928290030181865afa158015612399573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bd9190613263565b825490915061010090046001600160801b03168584146123ef5760405162461bcd60e51b8152600401610f0a9061327c565b60008d63ffffffff16116124155760405162461bcd60e51b8152600401610f0a9061330d565b878760405160200161242991815260200190565b604051602081830303815290604052805190602001201461247b5760405162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b6044820152606401610f0a565b8861248582613332565b131580156124935750818913155b6124af5760405162461bcd60e51b8152600401610f0a9061334f565b6003546040516309eecdd760e01b815260ff8e166004820152602481018d9052604481018c90526001600160a01b03909116906309eecdd790606401602060405180830381865afa158015612508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252c919061338a565b6125625760405162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b6044820152606401610f0a565b600061257a6125708c6129c8565b61211c848d6129dd565b12156125b95760405162461bcd60e51b815260206004820152600e60248201526d0ecc2d8eaca40e8dede40d0d2ced60931b6044820152606401610f0a565b6003835460ff1660038111156125d1576125d1613069565b1480156125ee5750825463ffffffff8e8116600160901b90920416145b1561260a57600483018790556126058385876129f5565b611caf565b6001835460ff16600381111561262257612622613069565b148061265e57506003835460ff16600381111561264157612641613069565b14801561265e5750825463ffffffff808f16600160901b90920416105b156122ee578254600290849060ff191660018302179055504283600601819055508c8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508b8360000160116101000a81548160ff021916908360ff1602179055508a83600101819055508983600201819055508883600301819055508683600401819055506000801b836005018190555083336001600160a01b03167f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed60405160405180910390a3611caf565b6000611e4782846133ac565b60008082121561274957612749613374565b5090565b60035460408051637e7630bd60e11b815290516000926001600160a01b03169163fcec617a9160048083019260209291908290030181865afa158015612797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127bb9190613263565b6127c490613332565b845490915061010090046001600160801b03166127e081613332565b8212156127f3576127f081613332565b91505b61176b858560008660038761287a565b60408051602080820189905230606081811b6bffffffffffffffffffffffff1990811685870152908a901b166054840152606883018890526088830187905260a88084018790528451808503909101815260c89093019093528151910120600954610bfe90829085906001600160a01b03166128fd565b855460ff1916865560075461289090600161272b565b60075585546128af90849061010090046001600160801b031683612ae7565b84836001600160a01b03167f59ba0efd7d5a5d7e109fb346b50365a8d68661fc7c2c311cd29750707e1b8de58684866040516128ed939291906133c3565b60405180910390a3505050505050565b600080600061290b85612c53565b92509250925060006001878386866040516000815260200160405260405161294f949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612971573d6000803e3d6000fd5b505050602060405103519050846001600160a01b0316816001600160a01b031614611a5c5760405162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b6044820152606401610f0a565b6000600160ff1b821061274957612749613374565b6000611e4782846133ee565b6000611e47828461342f565b600380548454600186015460028701549387015460058801546004808a0154604051631503b1e760e11b8152600160881b870460ff16928101929092526024820194909452604481019690965260648601919091526101009092046001600160801b0316608485015260a484019190915260c48301526000916001600160a01b0390911690632a0763ce9060e401602060405180830381865afa158015612aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac49190613263565b84549091506110c89085908590600160901b900463ffffffff168560038661287a565b6000826001600160801b031690506000612b02600b546129c8565b9050600360009054906101000a90046001600160a01b03166001600160a01b03166373ad468a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7b9190613263565b831315612b8a57612b8a613374565b6000612b9683856129dd565b1215612ba457612ba4613374565b600083138015612bb357508281125b15612bbc578092505b600c54612bc990846129e9565b600c556000612bd882856129e9565b9050612be381612737565b600b556000612bfa612bf585876129dd565b612737565b6001600160a01b038816600090815260126020526040812080549293508392909190612c279084906132b6565b90915550506001600160a01b03871660009081526012602052604090205415611a5c57611a5c87612cc6565b60008060008351604114612c935760405162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b6044820152606401610f0a565b50505060208101516040820151604183015160ff166002811015612cbf57612cbc81601b61346e565b90505b9193909250565b6001600160a01b03811660009081526012602052604090205480612cec57612cec613374565b6001600160a01b0382166000818152601260205260408082208290555183156108fc0291849190818181858888f115159350610b4192505050576001600160a01b0391909116600090815260126020526040902055565b6001600160a01b0381168114612d5857600080fd5b50565b600060208284031215612d6d57600080fd5b8135611e4781612d43565b600060208284031215612d8a57600080fd5b5035919050565b803563ffffffff81168114612da557600080fd5b919050565b8035612da581612d43565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612ddc57600080fd5b813567ffffffffffffffff80821115612df757612df7612db5565b604051601f8301601f19908116603f01168101908282118183101715612e1f57612e1f612db5565b81604052838152866020858801011115612e3857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b031215612e7557600080fd5b612e7e89612d91565b97506020890135965060408901359550606089013594506080890135935060a0890135612eaa81612d43565b925060c0890135612eba81612d43565b915060e089013567ffffffffffffffff811115612ed657600080fd5b612ee28b828c01612dcb565b9150509295985092959890939650565b803560ff81168114612da557600080fd5b6000806000806000806000806000806000806101808d8f031215612f2657600080fd5b612f2f8d612d91565b9b50612f3d60208e01612ef2565b9a5060408d0135995060608d0135985060808d0135975060a08d0135965060c08d0135955060e08d0135945067ffffffffffffffff6101008e01351115612f8357600080fd5b612f948e6101008f01358f01612dcb565b9350612fa36101208e01612daa565b92506101408d013591506101608d013590509295989b509295989b509295989b565b6000806000806000806000806000806101408b8d031215612fe557600080fd5b612fee8b612d91565b9950612ffc60208c01612ef2565b985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135935060e08b013592506101008b013567ffffffffffffffff81111561304357600080fd5b61304f8d828e01612dcb565b9250506101208b013590509295989b9194979a5092959850565b634e487b7160e01b600052602160045260246000fd5b60048110612d5857634e487b7160e01b600052602160045260246000fd5b61014081016130ab8c61307f565b9a81526001600160801b039990991660208a015260ff97909716604089015263ffffffff959095166060880152608087019390935260a086019190915260c085015260e08401526101008301526101209091015290565b6000806040838503121561311557600080fd5b823561312081612d43565b946020939093013593505050565b600080600080600060a0868803121561314657600080fd5b85359450602086013593506040860135925060608601359150608086013567ffffffffffffffff81111561317957600080fd5b61318588828901612dcb565b9150509295509295909350565b80356001600160801b0381168114612da557600080fd5b600080604083850312156131bc57600080fd5b6131c583613192565b91506131d360208401613192565b90509250929050565b600080600080600080600060e0888a0312156131f757600080fd5b61320088612d91565b96506020880135955060408801359450606088013593506080880135925060a088013561322c81612d43565b915060c088013567ffffffffffffffff81111561324857600080fd5b6132548a828b01612dcb565b91505092959891949750929550565b60006020828403121561327557600080fd5b5051919050565b6020808252600a90820152691a5b9d8819d85b59525960b21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156132c9576132c96132a0565b500190565b60006000198214156132e2576132e26132a0565b5060010190565b6020808252600a9082015269696e762073746174757360b01b604082015260600190565b6020808252600b908201526a1a5b9d881c9bdd5b99125960aa1b604082015260600190565b6000600160ff1b821415613348576133486132a0565b5060000390565b6020808252600b908201526a696e762062616c616e636560a81b604082015260600190565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561339c57600080fd5b81518015158114611e4757600080fd5b6000828210156133be576133be6132a0565b500390565b63ffffffff8416815260208101839052606081016133e08361307f565b826040830152949350505050565b600080821280156001600160ff1b0384900385131615613410576134106132a0565b600160ff1b8390038412811615613429576134296132a0565b50500190565b60008083128015600160ff1b85018412161561344d5761344d6132a0565b6001600160ff1b0384018313811615613468576134686132a0565b50500390565b600060ff821660ff84168060ff0382111561348b5761348b6132a0565b01939250505056fea264697066735822122079c3a5760c202f948c6e99da588bff4809558e21194ed3203dec81aaa08282ae64736f6c634300080c0033000000000000000000000000437ec7503dff1b5f5ab4dab4455c45a270629f4d000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000001a055690d9db80000000000000000000000000000e48424356e1b5057b067fdd15da2c939837608e800000000000000000000000071be1ace87248f3950bdfc4c89b4b3eed059f6f3

Deployed Bytecode

0x6080604052600436106103505760003560e01c806388fedd04116101c6578063d1e9dcbf116100f7578063e475222e11610095578063ef3aaf541161006f578063ef3aaf54146109d3578063f2fde38b146109f3578063f87ffb7414610a13578063fd306ca714610a2957600080fd5b8063e475222e14610976578063e60a33aa1461098c578063ea1b28e0146109ac57600080fd5b8063db420fe3116100d1578063db420fe314610909578063dc55509014610929578063de38eb3a1461093f578063e30c39781461095657600080fd5b8063d1e9dcbf146108a9578063d6e5fe98146108c9578063d7cee31e146108e957600080fd5b8063a8182cd311610164578063bd5c4e241161013e578063bd5c4e2414610828578063c49f91d31461083f578063c861f3a014610873578063cbffb1ae1461088957600080fd5b8063a8182cd3146107d5578063afc81953146107f5578063b064ca181461080857600080fd5b80639b29f133116101a05780639b29f133146107605780639c0051db146107805780639f34ce14146107a0578063a09f8659146107b557600080fd5b806388fedd04146107135780638da5cb5b14610729578063947bc72d1461074957600080fd5b80634d20d4bc116102a0578063613f92371161023e57806383197ef01161021857806383197ef01461063c57806383e256dc146106515780638456cb59146106e9578063853828b6146106fe57600080fd5b8063613f9237146105dc5780637eaf8879146105fc57806381efc01d1461061c57600080fd5b8063543ad1df1161027a578063543ad1df14610556578063563c23a01461056d5780635ba2dd22146105835780635c975abb146105bb57600080fd5b80634d20d4bc146105055780634e71e0c8146105395780634f739ff01461054e57600080fd5b8063287e9fbc1161030d5780633ccfd60b116102e75780633ccfd60b146104a55780633f4ba83a146104ba578063410453ae146104cf57806341b80184146104ef57600080fd5b8063287e9fbc146104375780632c94a23514610457578063375b3c0a1461046d57600080fd5b80630df63210146103555780630f15f4c01461037e578063186601ca1461039557806319fc36ed146103c65780631b08345a146103dd57806326b387bb1461040a575b600080fd5b34801561036157600080fd5b5061036b60065481565b6040519081526020015b60405180910390f35b34801561038a57600080fd5b50610393610a3e565b005b3480156103a157600080fd5b506001546103b690600160a01b900460ff1681565b6040519015158152602001610375565b3480156103d257600080fd5b5061036b6201518081565b3480156103e957600080fd5b5061036b6103f8366004612d5b565b60116020526000908152604090205481565b34801561041657600080fd5b5061036b610425366004612d5b565b60126020526000908152604090205481565b34801561044357600080fd5b50610393610452366004612d78565b610aaa565b34801561046357600080fd5b5061036b600e5481565b34801561047957600080fd5b50600d5461048d906001600160801b031681565b6040516001600160801b039091168152602001610375565b3480156104b157600080fd5b50610393610aec565b3480156104c657600080fd5b50610393610b45565b3480156104db57600080fd5b506103936104ea366004612e58565b610bc5565b3480156104fb57600080fd5b5061036b600f5481565b34801561051157600080fd5b5061036b7feef42e798af5b621c1fec054bfc1e4afbc802193bba58f0790a159f94e21fbac81565b34801561054557600080fd5b50610393610c08565b610393610c70565b34801561056257600080fd5b5061036b6203f48081565b34801561057957600080fd5b5061036b60025481565b34801561058f57600080fd5b506003546105a3906001600160a01b031681565b6040516001600160a01b039091168152602001610375565b3480156105c757600080fd5b506001546103b690600160a81b900460ff1681565b3480156105e857600080fd5b506103936105f7366004612f03565b610c99565b34801561060857600080fd5b50610393610617366004612fc5565b610ce4565b34801561062857600080fd5b50610393610637366004612d78565b610d29565b34801561064857600080fd5b50610393610e5b565b34801561065d57600080fd5b506106d361066c366004612d78565b601060205260009081526040902080546001820154600283015460038401546004850154600586015460069096015460ff8087169761010088046001600160801b031697600160881b810490921696600160901b90920463ffffffff16959194919391928a565b6040516103759a9998979695949392919061309d565b3480156106f557600080fd5b50610393610eb4565b34801561070a57600080fd5b50610393610f55565b34801561071f57600080fd5b5061036b600c5481565b34801561073557600080fd5b506000546105a3906001600160a01b031681565b34801561075557600080fd5b5061036b62ed4e0081565b34801561076c57600080fd5b5061039361077b366004612d78565b610fe9565b34801561078c57600080fd5b5061039361079b366004612d78565b6110ce565b3480156107ac57600080fd5b5061039361110b565b3480156107c157600080fd5b506004546105a3906001600160a01b031681565b3480156107e157600080fd5b506103936107f0366004613102565b6111dd565b61039361080336600461312e565b6112dc565b34801561081457600080fd5b50610393610823366004612d78565b611617565b34801561083457600080fd5b5061036b621a5e0081565b34801561084b57600080fd5b5061036b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b34801561087f57600080fd5b5061036b600b5481565b34801561089557600080fd5b506103936108a4366004612d5b565b611772565b3480156108b557600080fd5b506103936108c4366004613102565b6117e1565b3480156108d557600080fd5b506103936108e43660046131a9565b611976565b3480156108f557600080fd5b50600a546105a3906001600160a01b031681565b34801561091557600080fd5b506009546105a3906001600160a01b031681565b34801561093557600080fd5b5061036b60055481565b34801561094b57600080fd5b5061036b6207e90081565b34801561096257600080fd5b506001546105a3906001600160a01b031681565b34801561098257600080fd5b5061036b60075481565b34801561099857600080fd5b506103936109a73660046131dc565b611a25565b3480156109b857600080fd5b50600d5461048d90600160801b90046001600160801b031681565b3480156109df57600080fd5b506103936109ee366004612d5b565b611a65565b3480156109ff57600080fd5b50610393610a0e366004612d5b565b611a9e565b348015610a1f57600080fd5b5061036b60085481565b348015610a3557600080fd5b50610393611b06565b6000546001600160a01b03163314610a5557600080fd5b600154600160a01b900460ff1615610a6c57600080fd5b6001805460ff60a01b1916600160a01b1790556040517fc9d6bebde85c4e3348468c6af2cb34f978d1a8c6eebc438f1361c1ad5edf5f0e90600090a1565b6000546001600160a01b03163314610ac157600080fd5b600154600160a01b900460ff1615610ad857600080fd5b600060085411610ae757600080fd5b600855565b3360009081526012602052604090205480610b0657600080fd5b336000818152601260205260408082208290555183156108fc0291849190818181858888f19350505050158015610b41573d6000803e3d6000fd5b5050565b6000546001600160a01b03163314610b5c57600080fd5b600154600160a81b900460ff16610b7257600080fd5b600154600160a01b900460ff16610b8857600080fd5b6001805460ff60a81b19169055600060028190556040517f730c1faaa977b67dacf1e2451ef54556e04a07d577785ff79f6d31f73502efc99190a1565b6009546001600160a01b03163314610bdc57600080fd5b610bf18860008060008b8b8b8b8b8a8c611b98565b610bfe8289898787611cbe565b5050505050505050565b6001546001600160a01b03163314610c1f57600080fd5b60018054600080546001600160a01b0383166001600160a01b03199182168117835592169092556040517f897d3c8bbea11029ba3b26eb993fe8edb14c2c4c0d2ecceccce41d1d83d3e359908390a3565b6000546001600160a01b03163314610c8757600080fd5b600b54610c949034611e3b565b600b55565b6009546001600160a01b03163314610cb057600080fd5b610cc38c8c8c8c8c8c8c8c308d8d611b98565b610cd68c8c8c8c8c8c8c89898e8d611e4e565b505050505050505050505050565b610d0c8a8a8a8a8a8a8a8a308b600960009054906101000a90046001600160a01b0316611b98565b610d1d8a8a8a8a8a89878a33612333565b50505050505050505050565b6000546001600160a01b03163314610d4057600080fd5b6003546007546040516373c4726b60e01b815260048101919091526000916001600160a01b0316906373c4726b90602401602060405180830381865afa158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190613263565b9050600b548211158015610dd35750600b548190610dd0908461272b565b10155b610ddc57600080fd5b6000600c54131580610e045750600b54610df6908361272b565b610e01600c54612737565b11155b610e0d57600080fd5b600b54610e1a908361272b565b600b55600080546040516001600160a01b039091169184156108fc02918591818181858888f19350505050158015610e56573d6000803e3d6000fd5b505050565b6000546001600160a01b03163314610e7257600080fd5b600154621a5e0090600160a81b900460ff168015610e9d57506002544290610e9a9083611e3b565b11155b610ea657600080fd5b6000546001600160a01b0316ff5b6000546001600160a01b03163314610ecb57600080fd5b600154600160a81b900460ff1615610f135760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b60448201526064015b60405180910390fd5b6001805460ff60a81b1916600160a81b179055426002556040517f4b314b34e912fda7f95e7d23e9c8c95f82f0aff1984e4ce592a0b005f905562490600090a1565b6000546001600160a01b03163314610f6c57600080fd5b6001546203f48090600160a81b900460ff168015610f9757506002544290610f949083611e3b565b11155b610fa057600080fd5b6000600c819055600b805490829055815460405191926001600160a01b039091169183156108fc0291849190818181858888f19350505050158015610e56573d6000803e3d6000fd5b3360008181526011602090815260408083205480845260109092529091208382146110265760405162461bcd60e51b8152600401610f0a9061327c565b6001815460ff16600381111561103e5761103e613069565b141561108757426006820155805460ff19166002178155604051829033907f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed90600090a36110c8565b6003815460ff16600381111561109f5761109f613069565b1480156110b857508054600160901b900463ffffffff16155b15610350576110c881838561274d565b50505050565b6000546001600160a01b031633146110e557600080fd5b806201518081101580156110fc575062ed4e008111155b61110557600080fd5b50600e55565b6000546001600160a01b0316331461112257600080fd5b6004546001600160a01b031661113757600080fd5b60055461114357600080fd5b426203f48060055461115591906132b6565b1115801561117357506207e90060055461116f91906132b6565b4211155b61117c57600080fd5b60048054600380546001600160a01b0383166001600160a01b031991821617909155169055600060058190556040519081527f28de3c2df3d09a8b061f86cd0c78b7d02f1f5caffcd086ff45ee12a4a51056c89060200160405180910390a1565b6009546001600160a01b031633146111f457600080fd5b6001600160a01b038216600090815260116020908152604080832054808452601090925290912082821461123a5760405162461bcd60e51b8152600401610f0a9061327c565b6001815460ff16600381111561125257611252613069565b141561129b57426006820155805460ff19166003178155604051829033907fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab090600090a36110c8565b6002815460ff1660038111156112b3576112b3613069565b1480156112cc57508054600160901b900463ffffffff16155b15610350576110c881838661274d565b600d54346001600160801b039091161180159061130b5750600d54600160801b90046001600160801b03163411155b6113435760405162461bcd60e51b8152602060048201526009602482015268696e76207374616b6560b81b6044820152606401610f0a565b6007546113519060016132b6565b6003546040516373c4726b60e01b8152600481018390526000916001600160a01b0316906373c4726b90602401602060405180830381865afa15801561139b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113bf9190613263565b905080600b5410156114045760405162461bcd60e51b815260206004820152600e60248201526d696e7620686f7573655374616b6560901b6044820152606401610f0a565b600154600160a81b900460ff16156114475760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606401610f0a565b33600090815260116020908152604080832054808452601090925282209091815460ff16600381111561147c5761147c613069565b146114bf5760405162461bcd60e51b81526020600482015260136024820152721c1c995d8819d85b59481b9bdd08195b991959606a1b6044820152606401610f0a565b8782146115035760405162461bcd60e51b81526020600482015260126024820152711a5b9d8819d85b59541c995d91d85b59525960721b6044820152606401610f0a565b86421061153c5760405162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b6044820152606401610f0a565b61154a46338a8a8a8a612803565b600880546000918261155b836132ce565b9091555033600090815260116020908152604080832084905583835260109091529020805470ffffffffffffffffffffffffffffffffff191660ff19610100346001600160801b03160216176001908117825560075492935090916115bf91611e3b565b600755604080516001600160801b0334168152602081018d90528991849133917fd25faca801440882fa5d7c7f70b072a2ad89621e277ee0b6f9923ccac48411b1910160405180910390a45050505050505050505050565b3360008181526011602090815260408083205480845260109092529091208382146116545760405162461bcd60e51b8152600401610f0a9061327c565b6002815460ff16600381111561166c5761166c613069565b146116895760405162461bcd60e51b8152600401610f0a906132e9565b6003805482546001840154600285015493850154600686015460405163062f5d8d60e11b8152600160881b850460ff1660048201526024810193909352604483019590955260648201526101009091046001600160801b0316608482015260a48101929092526000916001600160a01b0390911690630c5ebb1a9060c401602060405180830381865afa158015611724573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117489190613263565b825490915061176b9083908590600160901b900463ffffffff168760028661287a565b5050505050565b6000546001600160a01b0316331461178957600080fd5b600480546001600160a01b0319166001600160a01b038316908117909155426005556040519081527f97044e884f04922f1959ef2de012f4734423df2d4da57fd4c5eaf40cd63b525f9060200160405180910390a150565b6009546001600160a01b031633146117f857600080fd5b6001600160a01b038216600090815260116020908152604080832054808452601090925290912082821461183e5760405162461bcd60e51b8152600401610f0a9061327c565b6003815460ff16600381111561185657611856613069565b146118735760405162461bcd60e51b8152600401610f0a906132e9565b60038054825460018401546002850154938501546005860154600480880154600689015460405163454a41cd60e11b8152600160881b880460ff16938101939093526024830195909552604482019790975260648101929092526101009093046001600160801b0316608482015260a481019290925260c482019390935260e48101929092526000916001600160a01b0390911690638a94839a9061010401602060405180830381865afa15801561192f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119539190613263565b825490915061176b9083908590600160901b900463ffffffff168860018661287a565b6000546001600160a01b0316331461198d57600080fd5b6000826001600160801b03161180156119b85750806001600160801b0316826001600160801b031611155b6119c157600080fd5b6001600160801b03828116600160801b8383168102828117600d8190556040805192861690941782529190910490921660208301527f1ec948cac143dba0e555a87dd86ae387e2ecd4a8fee80f7dd324d5987cb3e7f8910160405180910390a15050565b611a4f8760008060008a8a8a8a8a8a600960009054906101000a90046001600160a01b0316611b98565b611a5c3388888686611cbe565b50505050505050565b6000546001600160a01b03163314611a7c57600080fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ab557600080fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917f83ada3430836f9d4bd6f7bc690ffbba5199cb19b37393dd64c229930213535969190a350565b42611b1e600e54600f54611e3b90919063ffffffff16565b1115611b2957600080fd5b42600f55600c54600012611b3957565b6000611b46600c54612737565b6000600c55600b54909150611b5b908261272b565b600b55600a546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610b41573d6000803e3d6000fd5b306001600160a01b0384168114611be75760405162461bcd60e51b8152602060048201526013602482015272696e7620636f6e74726163744164647265737360681b6044820152606401610f0a565b604080517feef42e798af5b621c1fec054bfc1e4afbc802193bba58f0790a159f94e21fbac60208083019190915263ffffffff8f168284015260ff8e166060830152608082018d905260a082018c905260c082018b905260e082018a90526101008201899052610120808301899052835180840390910181526101408301845280519082012060065461190160f01b61016085015261016284015261018280840191909152835180840390910181526101a29092019092528051910120611caf8185856128fd565b50505050505050505050505050565b6001600160a01b038086166000908152601160209081526040808320548084526010835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a92600480830193928290030181865afa158015611d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d489190613263565b825490915061010090046001600160801b0316838614611d7a5760405162461bcd60e51b8152600401610f0a9061327c565b60008863ffffffff1611611da05760405162461bcd60e51b8152600401610f0a9061330d565b86611daa82613332565b13158015611db85750818713155b611dd45760405162461bcd60e51b8152600401610f0a9061334f565b6001835460ff166003811115611dec57611dec613069565b14611e095760405162461bcd60e51b8152600401610f0a906132e9565b6001600160a01b0385163014611e2157611e21613374565b611e3083858a8c60008c61287a565b505050505050505050565b6000611e4782846132b6565b9392505050565b6001600160a01b038082166000908152601160209081526040808320548084526010835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a92600480830193928290030181865afa158015611eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed89190613263565b825490915061010090046001600160801b0316858414611f0a5760405162461bcd60e51b8152600401610f0a9061327c565b60008f63ffffffff1611611f305760405162461bcd60e51b8152600401610f0a9061330d565b8988604051602001611f4491815260200190565b6040516020818303038152906040528051906020012014611f985760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d881cd95c9d995c94d9595960921b6044820152606401610f0a565b8887604051602001611fac91815260200190565b6040516020818303038152906040528051906020012014611ffe5760405162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b6044820152606401610f0a565b8a61200882613332565b131580156120165750818b13155b6120325760405162461bcd60e51b8152600401610f0a9061334f565b600360009054906101000a90046001600160a01b03166001600160a01b03166309eecdd78f8f8f6040518463ffffffff1660e01b815260040161208d9392919060ff9390931683526020830191909152604082015260600190565b602060405180830381865afa1580156120aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ce919061338a565b6121045760405162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b6044820152606401610f0a565b60006121226121128e6129c8565b61211c848f6129dd565b906129e9565b12156121615760405162461bcd60e51b815260206004820152600e60248201526d746f6f20686967682076616c756560901b6044820152606401610f0a565b6002835460ff16600381111561217957612179613069565b1480156121a557508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16145b156121c157600583018890556121bc8385876129f5565b612322565b6001835460ff1660038111156121d9576121d9613069565b148061222457506002835460ff1660038111156121f8576121f8613069565b14801561222457508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16105b156122ee578254600390849060ff191660018302179055504283600601819055508e8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508d8360000160116101000a81548160ff021916908360ff1602179055508c83600101819055508b83600201819055508a836003018190555087836005018190555086836004018190555083856001600160a01b03167fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab060405160405180910390a3612322565b60405162461bcd60e51b8152602060048201526009602482015268696e7620737461746560b81b6044820152606401610f0a565b505050505050505050505050505050565b6001600160a01b038082166000908152601160209081526040808320548084526010835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a92600480830193928290030181865afa158015612399573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bd9190613263565b825490915061010090046001600160801b03168584146123ef5760405162461bcd60e51b8152600401610f0a9061327c565b60008d63ffffffff16116124155760405162461bcd60e51b8152600401610f0a9061330d565b878760405160200161242991815260200190565b604051602081830303815290604052805190602001201461247b5760405162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b6044820152606401610f0a565b8861248582613332565b131580156124935750818913155b6124af5760405162461bcd60e51b8152600401610f0a9061334f565b6003546040516309eecdd760e01b815260ff8e166004820152602481018d9052604481018c90526001600160a01b03909116906309eecdd790606401602060405180830381865afa158015612508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252c919061338a565b6125625760405162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b6044820152606401610f0a565b600061257a6125708c6129c8565b61211c848d6129dd565b12156125b95760405162461bcd60e51b815260206004820152600e60248201526d0ecc2d8eaca40e8dede40d0d2ced60931b6044820152606401610f0a565b6003835460ff1660038111156125d1576125d1613069565b1480156125ee5750825463ffffffff8e8116600160901b90920416145b1561260a57600483018790556126058385876129f5565b611caf565b6001835460ff16600381111561262257612622613069565b148061265e57506003835460ff16600381111561264157612641613069565b14801561265e5750825463ffffffff808f16600160901b90920416105b156122ee578254600290849060ff191660018302179055504283600601819055508c8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508b8360000160116101000a81548160ff021916908360ff1602179055508a83600101819055508983600201819055508883600301819055508683600401819055506000801b836005018190555083336001600160a01b03167f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed60405160405180910390a3611caf565b6000611e4782846133ac565b60008082121561274957612749613374565b5090565b60035460408051637e7630bd60e11b815290516000926001600160a01b03169163fcec617a9160048083019260209291908290030181865afa158015612797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127bb9190613263565b6127c490613332565b845490915061010090046001600160801b03166127e081613332565b8212156127f3576127f081613332565b91505b61176b858560008660038761287a565b60408051602080820189905230606081811b6bffffffffffffffffffffffff1990811685870152908a901b166054840152606883018890526088830187905260a88084018790528451808503909101815260c89093019093528151910120600954610bfe90829085906001600160a01b03166128fd565b855460ff1916865560075461289090600161272b565b60075585546128af90849061010090046001600160801b031683612ae7565b84836001600160a01b03167f59ba0efd7d5a5d7e109fb346b50365a8d68661fc7c2c311cd29750707e1b8de58684866040516128ed939291906133c3565b60405180910390a3505050505050565b600080600061290b85612c53565b92509250925060006001878386866040516000815260200160405260405161294f949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612971573d6000803e3d6000fd5b505050602060405103519050846001600160a01b0316816001600160a01b031614611a5c5760405162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b6044820152606401610f0a565b6000600160ff1b821061274957612749613374565b6000611e4782846133ee565b6000611e47828461342f565b600380548454600186015460028701549387015460058801546004808a0154604051631503b1e760e11b8152600160881b870460ff16928101929092526024820194909452604481019690965260648601919091526101009092046001600160801b0316608485015260a484019190915260c48301526000916001600160a01b0390911690632a0763ce9060e401602060405180830381865afa158015612aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac49190613263565b84549091506110c89085908590600160901b900463ffffffff168560038661287a565b6000826001600160801b031690506000612b02600b546129c8565b9050600360009054906101000a90046001600160a01b03166001600160a01b03166373ad468a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7b9190613263565b831315612b8a57612b8a613374565b6000612b9683856129dd565b1215612ba457612ba4613374565b600083138015612bb357508281125b15612bbc578092505b600c54612bc990846129e9565b600c556000612bd882856129e9565b9050612be381612737565b600b556000612bfa612bf585876129dd565b612737565b6001600160a01b038816600090815260126020526040812080549293508392909190612c279084906132b6565b90915550506001600160a01b03871660009081526012602052604090205415611a5c57611a5c87612cc6565b60008060008351604114612c935760405162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b6044820152606401610f0a565b50505060208101516040820151604183015160ff166002811015612cbf57612cbc81601b61346e565b90505b9193909250565b6001600160a01b03811660009081526012602052604090205480612cec57612cec613374565b6001600160a01b0382166000818152601260205260408082208290555183156108fc0291849190818181858888f115159350610b4192505050576001600160a01b0391909116600090815260126020526040902055565b6001600160a01b0381168114612d5857600080fd5b50565b600060208284031215612d6d57600080fd5b8135611e4781612d43565b600060208284031215612d8a57600080fd5b5035919050565b803563ffffffff81168114612da557600080fd5b919050565b8035612da581612d43565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612ddc57600080fd5b813567ffffffffffffffff80821115612df757612df7612db5565b604051601f8301601f19908116603f01168101908282118183101715612e1f57612e1f612db5565b81604052838152866020858801011115612e3857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b031215612e7557600080fd5b612e7e89612d91565b97506020890135965060408901359550606089013594506080890135935060a0890135612eaa81612d43565b925060c0890135612eba81612d43565b915060e089013567ffffffffffffffff811115612ed657600080fd5b612ee28b828c01612dcb565b9150509295985092959890939650565b803560ff81168114612da557600080fd5b6000806000806000806000806000806000806101808d8f031215612f2657600080fd5b612f2f8d612d91565b9b50612f3d60208e01612ef2565b9a5060408d0135995060608d0135985060808d0135975060a08d0135965060c08d0135955060e08d0135945067ffffffffffffffff6101008e01351115612f8357600080fd5b612f948e6101008f01358f01612dcb565b9350612fa36101208e01612daa565b92506101408d013591506101608d013590509295989b509295989b509295989b565b6000806000806000806000806000806101408b8d031215612fe557600080fd5b612fee8b612d91565b9950612ffc60208c01612ef2565b985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135935060e08b013592506101008b013567ffffffffffffffff81111561304357600080fd5b61304f8d828e01612dcb565b9250506101208b013590509295989b9194979a5092959850565b634e487b7160e01b600052602160045260246000fd5b60048110612d5857634e487b7160e01b600052602160045260246000fd5b61014081016130ab8c61307f565b9a81526001600160801b039990991660208a015260ff97909716604089015263ffffffff959095166060880152608087019390935260a086019190915260c085015260e08401526101008301526101209091015290565b6000806040838503121561311557600080fd5b823561312081612d43565b946020939093013593505050565b600080600080600060a0868803121561314657600080fd5b85359450602086013593506040860135925060608601359150608086013567ffffffffffffffff81111561317957600080fd5b61318588828901612dcb565b9150509295509295909350565b80356001600160801b0381168114612da557600080fd5b600080604083850312156131bc57600080fd5b6131c583613192565b91506131d360208401613192565b90509250929050565b600080600080600080600060e0888a0312156131f757600080fd5b61320088612d91565b96506020880135955060408801359450606088013593506080880135925060a088013561322c81612d43565b915060c088013567ffffffffffffffff81111561324857600080fd5b6132548a828b01612dcb565b91505092959891949750929550565b60006020828403121561327557600080fd5b5051919050565b6020808252600a90820152691a5b9d8819d85b59525960b21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156132c9576132c96132a0565b500190565b60006000198214156132e2576132e26132a0565b5060010190565b6020808252600a9082015269696e762073746174757360b01b604082015260600190565b6020808252600b908201526a1a5b9d881c9bdd5b99125960aa1b604082015260600190565b6000600160ff1b821415613348576133486132a0565b5060000390565b6020808252600b908201526a696e762062616c616e636560a81b604082015260600190565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561339c57600080fd5b81518015158114611e4757600080fd5b6000828210156133be576133be6132a0565b500390565b63ffffffff8416815260208101839052606081016133e08361307f565b826040830152949350505050565b600080821280156001600160ff1b0384900385131615613410576134106132a0565b600160ff1b8390038412811615613429576134296132a0565b50500190565b60008083128015600160ff1b85018412161561344d5761344d6132a0565b6001600160ff1b0384018313811615613468576134686132a0565b50500390565b600060ff821660ff84168060ff0382111561348b5761348b6132a0565b01939250505056fea264697066735822122079c3a5760c202f948c6e99da588bff4809558e21194ed3203dec81aaa08282ae64736f6c634300080c0033

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

000000000000000000000000437ec7503dff1b5f5ab4dab4455c45a270629f4d000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000001a055690d9db80000000000000000000000000000e48424356e1b5057b067fdd15da2c939837608e800000000000000000000000071be1ace87248f3950bdfc4c89b4b3eed059f6f3

-----Decoded View---------------
Arg [0] : _serverAddress (address): 0x437EC7503dFF1b5F5Ab4Dab4455C45a270629f4d
Arg [1] : _minStake (uint128): 10000000000000000
Arg [2] : _maxStake (uint128): 30000000000000000000
Arg [3] : _conflictResAddress (address): 0xE48424356e1B5057b067FDd15dA2c939837608e8
Arg [4] : _houseAddress (address): 0x71BE1aCe87248F3950BdFc4c89b4B3EED059f6f3

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000437ec7503dff1b5f5ab4dab4455c45a270629f4d
Arg [1] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [2] : 000000000000000000000000000000000000000000000001a055690d9db80000
Arg [3] : 000000000000000000000000e48424356e1b5057b067fdd15da2c939837608e8
Arg [4] : 00000000000000000000000071be1ace87248f3950bdfc4c89b4b3eed059f6f3


Deployed Bytecode Sourcemap

157:7184:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2357:31:5;;;;;;;;;;;;;;;;;;;160:25:12;;;148:2;133:18;2357:31:5;;;;;;;;744:113:0;;;;;;;;;;;;;:::i;:::-;;253:29;;;;;;;;;;-1:-1:-1;253:29:0;;;;-1:-1:-1;;;253:29:0;;;;;;;;;361:14:12;;354:22;336:41;;324:2;309:18;253:29:0;196:187:12;1815:51:5;;;;;;;;;;;;1860:6;1815:51;;3530:43;;;;;;;;;;-1:-1:-1;3530:43:5;;;;;:::i;:::-;;;;;;;;;;;;;;3631:47;;;;;;;;;;-1:-1:-1;3631:47:5;;;;;:::i;:::-;;;;;;;;;;;;;;6605:149;;;;;;;;;;-1:-1:-1;6605:149:5;;;;;:::i;:::-;;:::i;3237:44::-;;;;;;;;;;;;;;;;3050:23;;;;;;;;;;-1:-1:-1;3050:23:5;;;;-1:-1:-1;;;;;3050:23:5;;;;;;-1:-1:-1;;;;;1307:47:12;;;1289:66;;1277:2;1262:18;3050:23:5;1143:218:12;6817:212:5;;;;;;;;;;;;;:::i;1455:143:9:-;;;;;;;;;;;;;:::i;3353:697:4:-;;;;;;;;;;-1:-1:-1;3353:697:4;;;;;:::i;:::-;;:::i;3340:39:5:-;;;;;;;;;;;;;;;;2155:195;;;;;;;;;;;;2194:156;2155:195;;1350:181:8;;;;;;;;;;;;;:::i;7974:105:5:-;;;:::i;654:41:2:-;;;;;;;;;;;;689:6;654:41;;395:40:9;;;;;;;;;;;;;;;;299:46:2;;;;;;;;;;-1:-1:-1;299:46:2;;;;-1:-1:-1;;;;;299:46:2;;;;;;-1:-1:-1;;;;;3692:32:12;;;3674:51;;3662:2;3647:18;299:46:2;3493:238:12;328:25:9;;;;;;;;;;-1:-1:-1;328:25:9;;;;-1:-1:-1;;;328:25:9;;;;;;1701:1057:6;;;;;;;;;;-1:-1:-1;1701:1057:6;;;;;:::i;:::-;;:::i;3331:841::-;;;;;;;;;;-1:-1:-1;3331:841:6;;;;;:::i;:::-;;:::i;8135:387:5:-;;;;;;;;;;-1:-1:-1;8135:387:5;;;;;:::i;:::-;;:::i;423:114:3:-;;;;;;;;;;;;;:::i;3427:40:5:-;;;;;;;;;;-1:-1:-1;3427:40:5;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3427:40:5;;-1:-1:-1;;;3427:40:5;;;;;;-1:-1:-1;;;3427:40:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1189:141:9:-;;;;;;;;;;;;;:::i;8589:203:5:-;;;;;;;;;;;;;:::i;2945:26::-;;;;;;;;;;;;;;;;186:20:8;;;;;;;;;;-1:-1:-1;186:20:8;;;;-1:-1:-1;;;;;186:20:8;;;1929:55:5;;;;;;;;;;;;1973:11;1929:55;;4352:677:6;;;;;;;;;;-1:-1:-1;4352:677:6;;;;;:::i;:::-;;:::i;7680:226:5:-;;;;;;;;;;-1:-1:-1;7680:226:5;;;;;:::i;:::-;;:::i;1842:441:2:-;;;;;;;;;;;;;:::i;399:42::-;;;;;;;;;;-1:-1:-1;399:42:2;;;;-1:-1:-1;;;;;399:42:2;;;5242:665:6;;;;;;;;;;-1:-1:-1;5242:665:6;;;;;:::i;:::-;;:::i;1373:1249:4:-;;;;;;:::i;:::-;;:::i;7126:668:6:-;;;;;;;;;;-1:-1:-1;7126:668:6;;;;;:::i;:::-;;:::i;296:46:3:-;;;;;;;;;;;;335:7;296:46;;1991:157:5;;;;;;;;;;;;2039:109;1991:157;;2858:26;;;;;;;;;;;;;;;;1521:246:2;;;;;;;;;;-1:-1:-1;1521:246:2;;;;;:::i;:::-;;:::i;6114:840:6:-;;;;;;;;;;-1:-1:-1;6114:840:6;;;;;:::i;:::-;;:::i;9147:267:5:-;;;;;;;;;;-1:-1:-1;9147:267:5;;;;;:::i;:::-;;:::i;2782:35::-;;;;;;;;;;-1:-1:-1;2782:35:5;;;;-1:-1:-1;;;;;2782:35:5;;;2703:28;;;;;;;;;;-1:-1:-1;2703:28:5;;;;-1:-1:-1;;;;;2703:28:5;;;524:26:2;;;;;;;;;;;;;;;;799:41;;;;;;;;;;;;834:6;799:41;;212:27:8;;;;;;;;;;-1:-1:-1;212:27:8;;;;-1:-1:-1;;;;;212:27:8;;;2438::5;;;;;;;;;;;;;;;;4592:650:4;;;;;;;;;;-1:-1:-1;4592:650:4;;;;;:::i;:::-;;:::i;3147:23:5:-;;;;;;;;;;-1:-1:-1;3147:23:5;;;;-1:-1:-1;;;3147:23:5;;-1:-1:-1;;;;;3147:23:5;;;8896:118;;;;;;;;;;-1:-1:-1;8896:118:5;;;;;:::i;:::-;;:::i;1107:174:8:-;;;;;;;;;;-1:-1:-1;1107:174:8;;;;;:::i;:::-;;:::i;2613:26:5:-;;;;;;;;;;;;;;;;7105:510;;;;;;;;;;;;;:::i;744:113:0:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;631:9:0::1;::::0;-1:-1:-1;;;631:9:0;::::1;;;630:10;622:19;;;::::0;::::1;;820:4:::2;808:16:::0;;-1:-1:-1;;;;808:16:0::2;-1:-1:-1::0;;;808:16:0::2;::::0;;839:11:::2;::::0;::::2;::::0;808:16;;839:11:::2;744:113::o:0;6605:149:5:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;631:9:0::1;::::0;-1:-1:-1;;;631:9:0;::::1;;;630:10;622:19;;;::::0;::::1;;6711:1:5::2;6698:10;;:14;6690:23;;;::::0;::::2;;6723:10;:24:::0;6605:149::o;6817:212::-;6887:10;6854:15;6872:26;;;:14;:26;;;;;;6916:14;6908:23;;;;;;6957:10;6971:1;6942:26;;;:14;:26;;;;;;:30;;;6982:40;;;;;;7011:10;;6982:40;;6971:1;6982:40;7011:10;6957;6982:40;;;;;;;;;;;;;;;;;;;;;6844:185;6817:212::o;1455:143:9:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;713:6:9::1;::::0;-1:-1:-1;;;713:6:9;::::1;;;705:15;;;::::0;::::1;;472:9:0::2;::::0;-1:-1:-1;;;472:9:0;::::2;;;464:18;;;::::0;::::2;;1526:6:9::3;:14:::0;;-1:-1:-1;;;;1526:14:9::3;::::0;;1535:5:::3;1550:10;:14:::0;;;1579:12:::3;::::0;::::3;::::0;1535:5;1579:12:::3;1455:143::o:0;3353:697:4:-;4301:13:5;;-1:-1:-1;;;;;4301:13:5;4287:10;:27;4279:36;;;;;;3658:299:4::1;3685:8;3711:1;3730::::0;3749::::1;3768:8;3794:11;3823:9;3850:7;3875:16;3909:8;3935:12;3658:9;:299::i;:::-;3968:75;3983:12;3997:8;4007;4017:7;4026:16;3968:14;:75::i;:::-;3353:697:::0;;;;;;;;:::o;1350:181:8:-;766:12;;-1:-1:-1;;;;;766:12:8;752:10;:26;744:35;;;;;;1418:12:::1;::::0;;::::1;1410:20:::0;;-1:-1:-1;;;;;1418:12:8;::::1;-1:-1:-1::0;;;;;;1410:20:8;;::::1;::::0;::::1;::::0;;1440:25;::::1;::::0;;;1480:44:::1;::::0;::::1;::::0;1418:12;;1480:44:::1;1350:181::o:0;7974:105:5:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;8047:10:5::1;::::0;:25:::1;::::0;8062:9:::1;8047:14;:25::i;:::-;8034:10;:38:::0;7974:105::o;1701:1057:6:-;4301:13:5;;-1:-1:-1;;;;;4301:13:5;4287:10;:27;4279:36;;;;;;2101:312:6::1;2128:8;2154:9;2181:4;2203:6;2227:8;2253:11;2282:9;2309:7;2342:4;2365:8;2391:12;2101:9;:312::i;:::-;2424:327;2467:8;2493:9;2520:4;2542:6;2566:8;2592:11;2621:9;2648:11;2677:9;2704:7;2729:12;2424:25;:327::i;:::-;1701:1057:::0;;;;;;;;;;;;:::o;3331:841::-;3645:271;3668:8;3690:9;3713:4;3731:6;3751:8;3773:11;3798:9;3821:7;3850:4;3869:10;3893:13;;;;;;;;;-1:-1:-1;;;;;3893:13:6;3645:9;:271::i;:::-;3927:238;3964:8;3986:9;4009:4;4027:6;4047:8;4069:9;4092;4115:7;4144:10;3927:23;:238::i;:::-;3331:841;;;;;;;;;;:::o;8135:387:5:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;8223:11:5::1;::::0;8249::::1;::::0;8223:38:::1;::::0;-1:-1:-1;;;8223:38:5;;::::1;::::0;::::1;160:25:12::0;;;;8202:18:5::1;::::0;-1:-1:-1;;;;;8223:11:5::1;::::0;:25:::1;::::0;133:18:12;;8223:38:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8202:59;;8289:10;;8280:5;:19;;:61;;;;-1:-1:-1::0;8303:10:5::1;::::0;8328:13;;8303:21:::1;::::0;8318:5;8303:14:::1;:21::i;:::-;:38;;8280:61;8272:70;;;::::0;::::1;;8375:1;8360:11;;:16;;:69;;;-1:-1:-1::0;8408:10:5::1;::::0;:21:::1;::::0;8423:5;8408:14:::1;:21::i;:::-;8380:24;:11;;:22;:24::i;:::-;:49;;8360:69;8352:78;;;::::0;::::1;;8454:10;::::0;:21:::1;::::0;8469:5;8454:14:::1;:21::i;:::-;8441:10;:34:::0;8493:5:::1;::::0;;8485:30:::1;::::0;-1:-1:-1;;;;;8493:5:5;;::::1;::::0;8485:30;::::1;;;::::0;8509:5;;8485:30;8493:5;8485:30;8509:5;8493;8485:30;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;8192:330;8135:387:::0;:::o;423:114:3:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;894:6:9::1;::::0;335:7:3::1;::::0;-1:-1:-1;;;894:6:9;::::1;;;:55:::0;::::1;;;-1:-1:-1::0;905:10:9::1;::::0;933:15:::1;::::0;905:24:::1;::::0;920:8;905:14:::1;:24::i;:::-;:43;;894:55;886:64;;;::::0;::::1;;523:5:3::2;::::0;-1:-1:-1;;;;;523:5:3::2;502:28;1189:141:9::0;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;561:6:9::1;::::0;-1:-1:-1;;;561:6:9;::::1;;;560:7;552:26;;;::::0;-1:-1:-1;;;552:26:9;;10711:2:12;552:26:9::1;::::0;::::1;10693:21:12::0;10750:1;10730:18;;;10723:29;-1:-1:-1;;;10768:18:12;;;10761:36;10814:18;;552:26:9::1;;;;;;;;;1256:4:::2;1247:13:::0;;-1:-1:-1;;;;1247:13:9::2;-1:-1:-1::0;;;1247:13:9::2;::::0;;1283:15:::2;1270:10;:28:::0;1313:10:::2;::::0;::::2;::::0;1247:13;;1313:10:::2;1189:141::o:0;8589:203:5:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;894:6:9::1;::::0;8645::5::1;::::0;-1:-1:-1;;;894:6:9;::::1;;;:55:::0;::::1;;;-1:-1:-1::0;905:10:9::1;::::0;933:15:::1;::::0;905:24:::1;::::0;920:8;905:14:::1;:24::i;:::-;:43;;894:55;886:64;;;::::0;::::1;;8677:1:5::2;8663:11;:15:::0;;;8706:10:::2;::::0;;8726:14;;;;8758:5;;8750:35:::2;::::0;8706:10;;-1:-1:-1;;;;;8758:5:5;;::::2;::::0;8750:35;::::2;;;::::0;8706:10;;8750:35;;8677:1;8750:35;8706:10;8758:5;8750:35;::::2;;;;;;;;;;;;;::::0;::::2;;;;4352:677:6::0;4451:10;4413:27;4486:23;;;:10;:23;;;;;;;;;4539:18;;;:10;:18;;;;;;4576:17;;;4568:40;;;;-1:-1:-1;;;4568:40:6;;;;;;;:::i;:::-;4638:17;4623:11;;;;:32;;;;;;;;:::i;:::-;;4619:404;;;4695:15;4671:21;;;:39;4724:43;;-1:-1:-1;;4724:43:6;4738:29;4724:43;;;4787:39;;4819:6;;4807:10;;4787:39;;-1:-1:-1;;4787:39:6;4619:404;;;4862:31;4847:11;;;;:46;;;;;;;;:::i;:::-;;:67;;;;-1:-1:-1;4897:12:6;;-1:-1:-1;;;4897:12:6;;;;:17;4847:67;4843:180;;;4930:43;4947:4;4953:6;4961:11;4930:16;:43::i;:::-;4403:626;;;4352:677;:::o;7680:226:5:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;7812:23:5::1;1860:6;4487:15;:40;;:99;;;;;1973:11;4547:15;:39;;4487:99;4479:108;;;::::0;::::1;;-1:-1:-1::0;7851:22:5::2;:48:::0;7680:226::o;1842:441:2:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;1915:14:2::1;::::0;-1:-1:-1;;;;;1915:14:2::1;1907:37;;;::::0;::::1;;1962:10;::::0;1954:24:::1;;;::::0;::::1;;2024:15;689:6;1996:10;;:24;;;;:::i;:::-;:43;;:90;;;;;834:6;2062:10;;:24;;;;:::i;:::-;2043:15;:43;;1996:90;1988:99;;;::::0;::::1;;2140:14;::::0;;2098:11:::1;:57:::0;;-1:-1:-1;;;;;2140:14:2;::::1;-1:-1:-1::0;;;;;;2098:57:2;;::::1;;::::0;;;2165:27:::1;::::0;;-1:-1:-1;2202:10:2::1;:14:::0;;;2232:44:::1;::::0;3674:51:12;;;2232:44:2::1;::::0;3662:2:12;3647:18;2232:44:2::1;;;;;;;1842:441::o:0;5242:665:6:-;4301:13:5;;-1:-1:-1;;;;;4301:13:5;4287:10;:27;4279:36;;;;;;-1:-1:-1;;;;;5360:24:6;::::1;5346:11;5360:24:::0;;;:10:::1;:24;::::0;;;;;;;;5414:18;;;:10:::1;:18:::0;;;;;;5451:17;;::::1;5443:40;;;;-1:-1:-1::0;;;5443:40:6::1;;;;;;;:::i;:::-;5513:17;5498:11:::0;;::::1;;:32;::::0;::::1;;;;;;:::i;:::-;;5494:407;;;5570:15;5546:21;::::0;::::1;:39:::0;5599:45;;-1:-1:-1;;5599:45:6::1;5613:31;5599:45;::::0;;5664:41:::1;::::0;5698:6;;5686:10:::1;::::0;5664:41:::1;::::0;-1:-1:-1;;5664:41:6::1;5494:407;;;5741:29;5726:11:::0;;::::1;;:44;::::0;::::1;;;;;;:::i;:::-;;:65;;;;-1:-1:-1::0;5774:12:6;;-1:-1:-1;;;5774:12:6;::::1;;;:17:::0;5726:65:::1;5722:179;;;5807:44;5824:4;5830:6;5838:12;5807:16;:44::i;1373:1249:4:-:0;4097:8:5;;4109:9;-1:-1:-1;;;;;4097:8:5;;;:21;;;;:46;;-1:-1:-1;4135:8:5;;-1:-1:-1;;;4135:8:5;;-1:-1:-1;;;;;4135:8:5;4122:9;:21;;4097:46;4089:68;;;;-1:-1:-1;;;4089:68:5;;11649:2:12;4089:68:5;;;11631:21:12;11688:1;11668:18;;;11661:29;-1:-1:-1;;;11706:18:12;;;11699:39;11755:18;;4089:68:5;11447:332:12;4089:68:5;1634:11:4::1;::::0;:15:::1;::::0;1648:1:::1;1634:15;:::i;:::-;3847:11:5;::::0;:39:::1;::::0;-1:-1:-1;;;3847:39:5;;::::1;::::0;::::1;160:25:12::0;;;3826:18:5::1;::::0;-1:-1:-1;;;;;3847:11:5::1;::::0;:25:::1;::::0;133:18:12;;3847:39:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3826:60;;3918:13;3904:10;;:27;;3896:54;;;::::0;-1:-1:-1;;;3896:54:5;;11986:2:12;3896:54:5::1;::::0;::::1;11968:21:12::0;12025:2;12005:18;;;11998:30;-1:-1:-1;;;12044:18:12;;;12037:44;12098:18;;3896:54:5::1;11784:338:12::0;3896:54:5::1;561:6:9::2;::::0;-1:-1:-1;;;561:6:9;::::2;;;560:7;552:26;;;::::0;-1:-1:-1;;;552:26:9;;10711:2:12;552:26:9::2;::::0;::::2;10693:21:12::0;10750:1;10730:18;;;10723:29;-1:-1:-1;;;10768:18:12;;;10761:36;10814:18;;552:26:9::2;10509:329:12::0;552:26:9::2;1720:10:4::3;1687:19;1709:22:::0;;;:10:::3;:22;::::0;;;;;;;;1761:26;;;:10:::3;:26:::0;;;;;1709:22;;1806:11;;::::3;;:31;::::0;::::3;;;;;;:::i;:::-;;1798:63;;;::::0;-1:-1:-1;;;1798:63:4;;12329:2:12;1798:63:4::3;::::0;::::3;12311:21:12::0;12368:2;12348:18;;;12341:30;-1:-1:-1;;;12387:18:12;;;12380:49;12446:18;;1798:63:4::3;12127:343:12::0;1798:63:4::3;1897:15;1879:14;:33;1871:64;;;::::0;-1:-1:-1;;;1871:64:4;;12677:2:12;1871:64:4::3;::::0;::::3;12659:21:12::0;12716:2;12696:18;;;12689:30;-1:-1:-1;;;12735:18:12;;;12728:48;12793:18;;1871:64:4::3;12475:342:12::0;1871:64:4::3;1971:13;1953:15;:31;1945:51;;;::::0;-1:-1:-1;;;1945:51:4;;13024:2:12;1945:51:4::3;::::0;::::3;13006:21:12::0;13063:1;13043:18;;;13036:29;-1:-1:-1;;;13081:18:12;;;13074:37;13128:18;;1945:51:4::3;12822:330:12::0;1945:51:4::3;2007:102;2023:13;2038:10;2050:15;2067:13;2082:14;2098:10;2007:15;:102::i;:::-;2134:10;:12:::0;;2120:11:::3;::::0;;2134:12:::3;::::0;::::3;:::i;:::-;::::0;;;-1:-1:-1;2167:10:4::3;2156:22;::::0;;;:10:::3;:22;::::0;;;;;;;:31;;;2220:18;;;:10:::3;:18:::0;;;;;2249:34;;-1:-1:-1;;2361:34:4;-1:-1:-1;;2249:34:4::3;2273:9;-1:-1:-1::0;;;;;2249:34:4::3;;2361::::0;;-1:-1:-1;2361:34:4;;::::3;::::0;;2420:11:::3;::::0;2156:31;;-1:-1:-1;2220:18:4;;2420::::3;::::0;:15:::3;:18::i;:::-;2406:11;:32:::0;2530:85:::3;::::0;;-1:-1:-1;;;;;2573:9:4::3;13489:47:12::0;13471:66;;13568:2;13553:18;;13546:34;;;2585:14:4;;2557:6;;2545:10:::3;::::0;2530:85:::3;::::0;13444:18:12;2530:85:4::3;;;;;;;1677:945;;;;3816:152:5::1;4167:1;1373:1249:4::0;;;;;:::o;7126:668:6:-;7221:10;7183:27;7256:23;;;:10;:23;;;;;;;;;7309:18;;;:10;:18;;;;;;7346:17;;;7338:40;;;;-1:-1:-1;;;7338:40:6;;;;;;;:::i;:::-;7411:29;7396:11;;;;:44;;;;;;;;:::i;:::-;;7388:67;;;;-1:-1:-1;;;7388:67:6;;;;;;;:::i;:::-;7483:11;;;7525:13;;7483:11;7552;;;7577:13;;;;7604:12;;;;7654:21;;;;7483:202;;-1:-1:-1;;;7483:202:6;;-1:-1:-1;;;7525:13:6;;;;7483:202;;;14211:36:12;14263:18;;;14256:34;;;;14306:18;;;14299:34;;;;14349:18;;;14342:34;7483:11:6;7630:10;;;-1:-1:-1;;;;;7630:10:6;14392:19:12;;;14385:76;14477:19;;;14470:35;;;;7466:14:6;;-1:-1:-1;;;;;7483:11:6;;;;:28;;14183:19:12;;7483:202:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7720:12;;7466:219;;-1:-1:-1;7696:91:6;;7720:12;;7712:6;;-1:-1:-1;;;7720:12:6;;;;7734:11;7747:27;7466:219;7696:9;:91::i;:::-;7173:621;;;;7126:668;:::o;1521:246:2:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;1614:14:2::1;:39:::0;;-1:-1:-1;;;;;;1614:39:2::1;-1:-1:-1::0;;;;;1614:39:2;::::1;::::0;;::::1;::::0;;;1676:15:::1;1663:10;:28:::0;1707:53:::1;::::0;3674:51:12;;;1707:53:2::1;::::0;3662:2:12;3647:18;1707:53:2::1;;;;;;;1521:246:::0;:::o;6114:840:6:-;4301:13:5;;-1:-1:-1;;;;;4301:13:5;4287:10;:27;4279:36;;;;;;-1:-1:-1;;;;;6228:24:6;::::1;6214:11;6228:24:::0;;;:10:::1;:24;::::0;;;;;;;;6282:18;;;:10:::1;:18:::0;;;;;;6319:17;;::::1;6311:40;;;;-1:-1:-1::0;;;6311:40:6::1;;;;;;;:::i;:::-;6384:31;6369:11:::0;;::::1;;:46;::::0;::::1;;;;;;:::i;:::-;;6361:69;;;;-1:-1:-1::0;;;6361:69:6::1;;;;;;;:::i;:::-;6582:11;::::0;;6626:13;;6582:11;6653;::::1;::::0;6678:13:::1;::::0;::::1;::::0;6705:12;;::::1;::::0;6755:15:::1;::::0;::::1;::::0;6784:13:::1;::::0;;::::1;::::0;6811:21:::1;::::0;::::1;::::0;6582:260:::1;::::0;-1:-1:-1;;;6582:260:6;;-1:-1:-1;;;6626:13:6;::::1;;;6582:260:::0;;::::1;15041:36:12::0;;;;15093:18;;;15086:34;;;;15136:18;;;15129:34;;;;15179:18;;;15172:34;;;;6582:11:6::1;6731:10:::0;;::::1;-1:-1:-1::0;;;;;6731:10:6::1;15222:19:12::0;;;15215:76;15307:19;;;15300:35;;;;15351:19;;;15344:35;;;;15395:19;;;15388:35;;;;6565:14:6::1;::::0;-1:-1:-1;;;;;6582:11:6;;::::1;::::0;:30:::1;::::0;15013:19:12;;6582:260:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6877:12:::0;;6565:277;;-1:-1:-1;6853:94:6::1;::::0;6877:12;;6869:6;;-1:-1:-1;;;6877:12:6;::::1;;;6891::::0;6905:29:::1;6565:277:::0;6853:9:::1;:94::i;9147:267:5:-:0;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;9262:1:5::1;9250:9;-1:-1:-1::0;;;;;9250:13:5::1;;:39;;;;;9280:9;-1:-1:-1::0;;;;;9267:22:5::1;:9;-1:-1:-1::0;;;;;9267:22:5::1;;;9250:39;9242:48;;;::::0;::::1;;-1:-1:-1::0;;;;;9300:20:5;;::::1;-1:-1:-1::0;;;9330:20:5;;::::1;::::0;::::1;::::0;;::::1;9300:8;9330:20:::0;;;9365:42:::1;::::0;;9388:8;;;;;;15661:34:12;;9398:8:5;;;::::1;::::0;;::::1;15726:2:12::0;15711:18;;15704:43;9365:42:5::1;::::0;15581:18:12;9365:42:5::1;;;;;;;9147:267:::0;;:::o;4592:650:4:-;4840:302;4867:8;4893:1;4912;4931;4950:8;4976:11;5005:9;5032:7;5057:16;5091:10;5119:13;;;;;;;;;-1:-1:-1;;;;;5119:13:4;4840:9;:302::i;:::-;5153:82;5176:10;5189:8;5199;5209:7;5218:16;5153:14;:82::i;:::-;4592:650;;;;;;;:::o;8896:118:5:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;8979:12:5::1;:28:::0;;-1:-1:-1;;;;;;8979:28:5::1;-1:-1:-1::0;;;;;8979:28:5;;;::::1;::::0;;;::::1;::::0;;8896:118::o;1107:174:8:-;578:5;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;1188:12:::1;:24:::0;;-1:-1:-1;;;;;;1188:24:8::1;-1:-1:-1::0;;;;;1188:24:8;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;1257:5:8;;1227:47:::1;::::0;1188:24;;1257:5:::1;::::0;1227:47:::1;::::0;-1:-1:-1;1227:47:8::1;1107:174:::0;:::o;7105:510:5:-;7222:15;7163:55;7195:22;;7163:27;;:31;;:55;;;;:::i;:::-;:74;;7155:83;;;;;;7321:15;7291:27;:45;7351:11;;7366:1;-1:-1:-1;7347:90:5;;7105:510::o;7347:90::-;7447:15;7465:24;:11;;:22;:24::i;:::-;7514:1;7500:11;:15;7538:10;;7447:42;;-1:-1:-1;7538:26:5;;7447:42;7538:14;:26::i;:::-;7525:10;:39;7575:12;;:33;;-1:-1:-1;;;;;7575:12:5;;;;:33;;;;;7597:10;;7575:12;:33;:12;:33;7597:10;7575:12;:33;;;;;;;;;;;;;;;;;;;11842:875;12271:4;-1:-1:-1;;;;;12294:35:5;;;;12286:67;;;;-1:-1:-1;;;12286:67:5;;15960:2:12;12286:67:5;;;15942:21:12;15999:2;15979:18;;;15972:30;-1:-1:-1;;;16018:18:12;;;16011:49;16077:18;;12286:67:5;15758:343:12;12286:67:5;13715:220;;;2194:156;13715:220;;;;21394:25:12;;;;21467:10;21455:23;;21435:18;;;21428:51;21527:4;21515:17;;21495:18;;;21488:45;21549:18;;;21542:34;;;21592:19;;;21585:35;;;21636:19;;;21629:35;;;21680:19;;;21673:35;;;21724:19;;;21717:35;;;21768:19;;;;21761:35;;;13715:220:5;;;;;;;;;;21366:19:12;;;13715:220:5;;13705:231;;;;;;14018:16;;-1:-1:-1;;;13964:101:5;;;22065:27:12;22108:11;;;22101:27;22144:12;;;;22137:28;;;;13964:101:5;;;;;;;;;;22181:12:12;;;;13964:101:5;;;13954:112;;;;;12619:91;12643:9;12670:4;12692:8;12619:6;:91::i;:::-;12178:539;;11842:875;;;;;;;;;;;:::o;6501:838:4:-;-1:-1:-1;;;;;6716:24:4;;;6702:11;6716:24;;;:10;:24;;;;;;;;;6770:18;;;:10;:18;;;;;6815:11;;:24;;-1:-1:-1;;;6815:24:4;;;;6716;;6770:18;;6702:11;6815;;;:22;;:24;;;;;6716;6815;;;;;:11;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6874:10;;6798:41;;-1:-1:-1;6874:10:4;;;-1:-1:-1;;;;;6874:10:4;6905:17;;;6897:40;;;;-1:-1:-1;;;6897:40:4;;;;;;;:::i;:::-;6966:1;6955:8;:12;;;6947:36;;;;-1:-1:-1;;;6947:36:4;;;;;;;:::i;:::-;7070:8;7056:10;7057:9;7056:10;:::i;:::-;:22;;:48;;;;;7094:10;7082:8;:22;;7056:48;7048:72;;;;-1:-1:-1;;;7048:72:4;;;;;;;:::i;:::-;7153:17;7138:11;;;;:32;;;;;;;;:::i;:::-;;7130:55;;;;-1:-1:-1;;;7130:55:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;7203:33:4;;7231:4;7203:33;7196:41;;;;:::i;:::-;7248:84;7258:4;7264:6;7272:8;7282:12;7296:25;7323:8;7248:9;:84::i;:::-;6692:647;;;;6501:838;;;;;:::o;1468:98:11:-;1526:9;1554:5;1558:1;1554;:5;:::i;:::-;1547:12;1468:98;-1:-1:-1;;;1468:98:11:o;10975:1979:6:-;-1:-1:-1;;;;;11344:24:6;;;11330:11;11344:24;;;:10;:24;;;;;;;;;11398:18;;;:10;:18;;;;;11443:11;;:24;;-1:-1:-1;;;11443:24:6;;;;11344;;11398:18;;11330:11;11443;;;:22;;:24;;;;;11344;11443;;;;;:11;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11502:10;;11426:41;;-1:-1:-1;11502:10:6;;;-1:-1:-1;;;;;11502:10:6;11533:17;;;11525:40;;;;-1:-1:-1;;;11525:40:6;;;;;;;:::i;:::-;11594:1;11583:8;:12;;;11575:36;;;;-1:-1:-1;;;11575:36:6;;;;;;;:::i;:::-;11673:11;11656;11639:29;;;;;;17188:19:12;;17232:2;17223:12;;17059:182;11639:29:6;;;;;;;;;;;;;11629:40;;;;;;:55;11621:82;;;;-1:-1:-1;;;11621:82:6;;17448:2:12;11621:82:6;;;17430:21:12;17487:2;17467:18;;;17460:30;-1:-1:-1;;;17506:18:12;;;17499:44;17560:18;;11621:82:6;17246:338:12;11621:82:6;11763:9;11748;11731:27;;;;;;17188:19:12;;17232:2;17223:12;;17059:182;11731:27:6;;;;;;;;;;;;;11721:38;;;;;;:51;11713:76;;;;-1:-1:-1;;;11713:76:6;;17791:2:12;11713:76:6;;;17773:21:12;17830:2;17810:18;;;17803:30;-1:-1:-1;;;17849:18:12;;;17842:42;17901:18;;11713:76:6;17589:336:12;11713:76:6;11821:8;11807:10;11808:9;11807:10;:::i;:::-;:22;;:48;;;;;11845:10;11833:8;:22;;11807:48;11799:72;;;;-1:-1:-1;;;11799:72:6;;;;;;;:::i;:::-;11927:11;;;;;;;;;-1:-1:-1;;;;;11927:11:6;-1:-1:-1;;;;;11927:22:6;;11950:9;11961:4;11967:6;11927:47;;;;;;;;;;;;;;;;18158:4:12;18146:17;;;;18128:36;;18195:2;18180:18;;18173:34;;;;18238:2;18223:18;;18216:34;18116:2;18101:18;;17930:326;11927:47:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11919:67;;;;-1:-1:-1;;;11919:67:6;;18745:2:12;11919:67:6;;;18727:21:12;18784:1;18764:18;;;18757:29;-1:-1:-1;;;18802:18:12;;;18795:37;18849:18;;11919:67:6;18543:330:12;11919:67:6;12055:1;12004:47;12032:18;:6;:16;:18::i;:::-;12004:23;:9;12018:8;12004:13;:23::i;:::-;:27;;:47::i;:::-;:52;;11996:79;;;;-1:-1:-1;;;11996:79:6;;19080:2:12;11996:79:6;;;19062:21:12;19119:2;19099:18;;;19092:30;-1:-1:-1;;;19138:18:12;;;19131:44;19192:18;;11996:79:6;18878:338:12;11996:79:6;12142:29;12127:11;;;;:44;;;;;;;;:::i;:::-;;:72;;;;;12191:8;12175:24;;:4;:12;;;;;;;;;;;;:24;;;12127:72;12123:825;;;12215:15;;;:29;;;12258:43;12215:4;12280:6;12288:12;12258:15;:43::i;:::-;12123:825;;;12337:17;12322:11;;;;:32;;;;;;;;:::i;:::-;;:125;;;-1:-1:-1;12390:29:6;12375:11;;;;:44;;;;;;;;:::i;:::-;;:71;;;;;12438:8;12423:23;;:4;:12;;;;;;;;;;;;:23;;;12375:71;12318:630;;;12463:45;;12477:31;;12463:4;;-1:-1:-1;;12463:45:6;;12477:31;12463:45;;;;;12546:15;12522:4;:21;;:39;;;;12590:8;12575:4;:12;;;:23;;;;;;;;;;;;;;;;;;12628:9;12612:4;:13;;;:25;;;;;;;;;;;;;;;;;;12665:4;12651;:11;;:18;;;;12699:6;12683:4;:13;;:22;;;;12734:8;12719:4;:12;;:23;;;;12774:11;12756:4;:15;;:29;;;;12815:9;12799:4;:13;;:25;;;;12880:6;12866:12;-1:-1:-1;;;;;12844:43:6;;;;;;;;;;;12318:630;;;12918:19;;-1:-1:-1;;;12918:19:6;;19423:2:12;12918:19:6;;;19405:21:12;19462:1;19442:18;;;19435:29;-1:-1:-1;;;19480:18:12;;;19473:39;19529:18;;12918:19:6;19221:332:12;12318:630:6;11320:1634;;;;10975:1979;;;;;;;;;;;:::o;8439:1821::-;-1:-1:-1;;;;;8748:24:6;;;8734:11;8748:24;;;:10;:24;;;;;;;;;8802:18;;;:10;:18;;;;;8847:11;;:24;;-1:-1:-1;;;8847:24:6;;;;8748;;8802:18;;8734:11;8847;;;:22;;:24;;;;;8748;8847;;;;;:11;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8906:10;;8830:41;;-1:-1:-1;8906:10:6;;;-1:-1:-1;;;;;8906:10:6;8937:17;;;8929:40;;;;-1:-1:-1;;;8929:40:6;;;;;;;:::i;:::-;8998:1;8987:8;:12;;;8979:36;;;;-1:-1:-1;;;8979:36:6;;;;;;;:::i;:::-;9075:9;9060;9043:27;;;;;;17188:19:12;;17232:2;17223:12;;17059:182;9043:27:6;;;;;;;;;;;;;9033:38;;;;;;:51;9025:76;;;;-1:-1:-1;;;9025:76:6;;17791:2:12;9025:76:6;;;17773:21:12;17830:2;17810:18;;;17803:30;-1:-1:-1;;;17849:18:12;;;17842:42;17901:18;;9025:76:6;17589:336:12;9025:76:6;9133:8;9119:10;9120:9;9119:10;:::i;:::-;:22;;:48;;;;;9157:10;9145:8;:22;;9119:48;9111:72;;;;-1:-1:-1;;;9111:72:6;;;;;;;:::i;:::-;9239:11;;:47;;-1:-1:-1;;;9239:47:6;;18158:4:12;18146:17;;9239:47:6;;;18128:36:12;18180:18;;;18173:34;;;18223:18;;;18216:34;;;-1:-1:-1;;;;;9239:11:6;;;;:22;;18101:18:12;;9239:47:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9231:67;;;;-1:-1:-1;;;9231:67:6;;18745:2:12;9231:67:6;;;18727:21:12;18784:1;18764:18;;;18757:29;-1:-1:-1;;;18802:18:12;;;18795:37;18849:18;;9231:67:6;18543:330:12;9231:67:6;9367:1;9316:47;9344:18;:6;:16;:18::i;:::-;9316:23;:9;9330:8;9316:13;:23::i;:47::-;:52;;9308:79;;;;-1:-1:-1;;;9308:79:6;;19760:2:12;9308:79:6;;;19742:21:12;19799:2;19779:18;;;19772:30;-1:-1:-1;;;19818:18:12;;;19811:44;19872:18;;9308:79:6;19558:338:12;9308:79:6;9455:31;9440:11;;;;:46;;;;;;;;:::i;:::-;;:74;;;;-1:-1:-1;9490:12:6;;:24;;;;-1:-1:-1;;;9490:12:6;;;;:24;9440:74;9436:818;;;9530:13;;;:25;;;9569:43;9530:4;9591:6;9599:12;9569:15;:43::i;:::-;9436:818;;;9648:17;9633:11;;;;:32;;;;;;;;:::i;:::-;;:127;;;-1:-1:-1;9701:31:6;9686:11;;;;:46;;;;;;;;:::i;:::-;;:73;;;;-1:-1:-1;9736:12:6;;:23;;;;-1:-1:-1;;;9736:12:6;;;;:23;9686:73;9629:625;;;9776:43;;9790:29;;9776:4;;-1:-1:-1;;9776:43:6;;9790:29;9776:43;;;;;9857:15;9833:4;:21;;:39;;;;9901:8;9886:4;:12;;;:23;;;;;;;;;;;;;;;;;;9939:9;9923:4;:13;;;:25;;;;;;;;;;;;;;;;;;9976:4;9962;:11;;:18;;;;10010:6;9994:4;:13;;:22;;;;10045:8;10030:4;:12;;:23;;;;10083:9;10067:4;:13;;:25;;;;10132:1;10124:10;;10106:4;:15;;:28;;;;10186:6;10174:10;-1:-1:-1;;;;;10154:39:6;;;;;;;;;;;9629:625;;1116:96:11;1174:7;1200:5;1204:1;1200;:5;:::i;317:110:10:-;366:4;394:1;389;:6;;382:14;;;;:::i;:::-;-1:-1:-1;418:1:10;317:110::o;13151:723:6:-;13574:11;;:29;;;-1:-1:-1;;;13574:29:6;;;;13556:14;;-1:-1:-1;;;;;13574:11:6;;:27;;:29;;;;;;;;;;;;;;:11;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13573:30;;;:::i;:::-;13684:11;;13556:47;;-1:-1:-1;13684:11:6;;;-1:-1:-1;;;;;13684:11:6;13724:6;13684:11;13724:6;:::i;:::-;13711:10;:19;13707:69;;;13759:6;13760:5;13759:6;:::i;:::-;13746:19;;13707:69;13785:82;13795:5;13802:7;13811:1;13814:12;13828:26;13856:10;13785:9;:82::i;5593:499:4:-;5908:126;;;;;;;20300:19:12;;;5868:4:4;20407:2:12;20403:15;;;-1:-1:-1;;20399:24:12;;;20385:12;;;20378:46;20458:15;;;;20454:24;20440:12;;;20433:46;20495:12;;;20488:28;;;20532:13;;;20525:29;;;20570:13;;;;20563:29;;;5908:126:4;;;;;;;;;;20608:13:12;;;;5908:126:4;;;5898:137;;;;;6071:13;;6046:39;;5898:137;;6059:10;;-1:-1:-1;;;;;6071:13:4;6046:6;:39::i;9708:435:5:-;9928:31;;-1:-1:-1;;9928:31:5;;;9984:11;;:18;;9928:31;9984:15;:18::i;:::-;9970:11;:32;10034:11;;10013:43;;10020:12;;10034:11;;;-1:-1:-1;;;;;10034:11:5;10047:8;10013:6;:43::i;:::-;10099:7;10085:12;-1:-1:-1;;;;;10072:64:5;;10108:8;10118;10128:7;10072:64;;;;;;;;:::i;:::-;;;;;;;;9708:435;;;;;;:::o;12953:319::-;13096:9;13107;13118:7;13129:20;13144:4;13129:14;:20::i;:::-;13095:54;;;;;;13159:22;13184:25;13194:5;13201:1;13204;13207;13184:25;;;;;;;;;;;;;;;;;22431::12;;;22504:4;22492:17;;;;22487:2;22472:18;;22465:45;22541:2;22526:18;;22519:34;22584:2;22569:18;;22562:34;22418:3;22403:19;;22204:398;13184:25:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13159:50;;13245:8;-1:-1:-1;;;;;13227:26:5;:14;-1:-1:-1;;;;;13227:26:5;;13219:46;;;;-1:-1:-1;;;13219:46:5;;22809:2:12;13219:46:5;;;22791:21:12;22848:1;22828:18;;;22821:29;-1:-1:-1;;;22866:18:12;;;22859:37;22913:18;;13219:46:5;22607:330:12;143:116:10;192:3;-1:-1:-1;;;214:1:10;:14;207:22;;;;:::i;1644:93:11:-;1700:6;1725:5;1729:1;1725;:5;:::i;1295:93::-;1351:6;1376:5;1380:1;1376;:5;:::i;14051:465:6:-;14175:11;;;14216:14;;14175:11;14244:12;;;14270:14;;;;14298:13;;;;14350:16;;;;14380:14;;;;;14175:229;;-1:-1:-1;;;14175:229:6;;-1:-1:-1;;;14216:14:6;;;;14175:229;;;23793:36:12;;;;23845:18;;;23838:34;;;;23888:18;;;23881:34;;;;23931:18;;;23924:34;;;;14175:11:6;14325;;;-1:-1:-1;;;;;14325:11:6;23974:19:12;;;23967:76;24059:19;;;24052:35;;;;24103:19;;;24096:35;14158:14:6;;-1:-1:-1;;;;;14175:11:6;;;;:27;;23765:19:12;;14175:229:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14441:13;;14158:246;;-1:-1:-1;14415:94:6;;14441:13;;14432:7;;-1:-1:-1;;;14441:13:6;;;;14456:12;14470:26;14158:246;14415:9;:94::i;10334:862:5:-;10429:12;10453:6;-1:-1:-1;;;;;10448:12:5;10429:32;;10471:17;10491:22;:10;;:20;:22::i;:::-;10471:42;;10543:11;;;;;;;;;-1:-1:-1;;;;;10543:11:5;-1:-1:-1;;;;;10543:22:5;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10531:8;:36;;10524:44;;;;:::i;:::-;10613:1;10586:22;:8;10599;10586:12;:22::i;:::-;10585:29;;10578:37;;;;:::i;:::-;10641:1;10630:8;:12;:40;;;;;10662:8;10646:13;:24;10630:40;10626:199;;;10801:13;10790:24;;10626:199;10849:11;;:25;;10865:8;10849:15;:25::i;:::-;10835:11;:39;10885:17;10905:27;:13;10923:8;10905:17;:27::i;:::-;10885:47;;10955:26;:13;:24;:26::i;:::-;10942:10;:39;10992:14;11009:35;:22;:8;11022;11009:12;:22::i;:::-;:33;:35::i;:::-;-1:-1:-1;;;;;11054:28:5;;;;;;:14;:28;;;;;:41;;10992:52;;-1:-1:-1;10992:52:5;;11054:28;;;:41;;10992:52;;11054:41;:::i;:::-;;;;-1:-1:-1;;;;;;;11109:28:5;;11140:1;11109:28;;;:14;:28;;;;;;:32;11105:85;;11157:22;11166:12;11157:8;:22::i;14275:418::-;14370:9;14381;14392:7;14423:10;:17;14444:2;14423:23;14415:43;;;;-1:-1:-1;;;14415:43:5;;22809:2:12;14415:43:5;;;22791:21:12;22848:1;22828:18;;;22821:29;-1:-1:-1;;;22866:18:12;;;22859:37;22913:18;;14415:43:5;22607:330:12;14415:43:5;-1:-1:-1;;;14519:2:5;14503:19;;14497:26;14563:2;14547:19;;14541:26;14611:2;14595:19;;14589:26;14617:4;14585:37;14649:1;14645:5;;14641:46;;;14670:6;:1;14674:2;14670:6;:::i;:::-;14666:10;;14641:46;14275:418;;;;;:::o;11331:298::-;-1:-1:-1;;;;;11413:24:5;;11394:16;11413:24;;;:14;:24;;;;;;11454:15;11447:23;;;;:::i;:::-;-1:-1:-1;;;;;11481:24:5;;11508:1;11481:24;;;:14;:24;;;;;;:28;;;11523:26;;;;;;11537:11;;11523:26;;11508:1;11523:26;11537:11;11481:24;11523:26;;:35;;;-1:-1:-1;11519:104:5;;-1:-1:-1;;;11519:104:5;-1:-1:-1;;;;;11574:24:5;;;;;;;;:14;:24;;;;;:38;11331:298::o;570:131:12:-;-1:-1:-1;;;;;645:31:12;;635:42;;625:70;;691:1;688;681:12;625:70;570:131;:::o;706:247::-;765:6;818:2;806:9;797:7;793:23;789:32;786:52;;;834:1;831;824:12;786:52;873:9;860:23;892:31;917:5;892:31;:::i;958:180::-;1017:6;1070:2;1058:9;1049:7;1045:23;1041:32;1038:52;;;1086:1;1083;1076:12;1038:52;-1:-1:-1;1109:23:12;;958:180;-1:-1:-1;958:180:12:o;1366:163::-;1433:20;;1493:10;1482:22;;1472:33;;1462:61;;1519:1;1516;1509:12;1462:61;1366:163;;;:::o;1534:142::-;1610:20;;1639:31;1610:20;1639:31;:::i;1681:127::-;1742:10;1737:3;1733:20;1730:1;1723:31;1773:4;1770:1;1763:15;1797:4;1794:1;1787:15;1813:718;1855:5;1908:3;1901:4;1893:6;1889:17;1885:27;1875:55;;1926:1;1923;1916:12;1875:55;1962:6;1949:20;1988:18;2025:2;2021;2018:10;2015:36;;;2031:18;;:::i;:::-;2106:2;2100:9;2074:2;2160:13;;-1:-1:-1;;2156:22:12;;;2180:2;2152:31;2148:40;2136:53;;;2204:18;;;2224:22;;;2201:46;2198:72;;;2250:18;;:::i;:::-;2290:10;2286:2;2279:22;2325:2;2317:6;2310:18;2371:3;2364:4;2359:2;2351:6;2347:15;2343:26;2340:35;2337:55;;;2388:1;2385;2378:12;2337:55;2452:2;2445:4;2437:6;2433:17;2426:4;2418:6;2414:17;2401:54;2499:1;2492:4;2487:2;2479:6;2475:15;2471:26;2464:37;2519:6;2510:15;;;;;;1813:718;;;;:::o;2536:952::-;2673:6;2681;2689;2697;2705;2713;2721;2729;2782:3;2770:9;2761:7;2757:23;2753:33;2750:53;;;2799:1;2796;2789:12;2750:53;2822:28;2840:9;2822:28;:::i;:::-;2812:38;;2897:2;2886:9;2882:18;2869:32;2859:42;;2948:2;2937:9;2933:18;2920:32;2910:42;;2999:2;2988:9;2984:18;2971:32;2961:42;;3050:3;3039:9;3035:19;3022:33;3012:43;;3105:3;3094:9;3090:19;3077:33;3119:31;3144:5;3119:31;:::i;:::-;3169:5;-1:-1:-1;3226:3:12;3211:19;;3198:33;3240;3198;3240;:::i;:::-;3292:7;-1:-1:-1;3350:3:12;3335:19;;3322:33;3378:18;3367:30;;3364:50;;;3410:1;3407;3400:12;3364:50;3433:49;3474:7;3465:6;3454:9;3450:22;3433:49;:::i;:::-;3423:59;;;2536:952;;;;;;;;;;;:::o;3736:156::-;3802:20;;3862:4;3851:16;;3841:27;;3831:55;;3882:1;3879;3872:12;3897:1106;4068:6;4076;4084;4092;4100;4108;4116;4124;4132;4140;4148:7;4157;4211:3;4199:9;4190:7;4186:23;4182:33;4179:53;;;4228:1;4225;4218:12;4179:53;4251:28;4269:9;4251:28;:::i;:::-;4241:38;;4298:36;4330:2;4319:9;4315:18;4298:36;:::i;:::-;4288:46;;4381:2;4370:9;4366:18;4353:32;4343:42;;4432:2;4421:9;4417:18;4404:32;4394:42;;4483:3;4472:9;4468:19;4455:33;4445:43;;4535:3;4524:9;4520:19;4507:33;4497:43;;4587:3;4576:9;4572:19;4559:33;4549:43;;4639:3;4628:9;4624:19;4611:33;4601:43;;4694:18;4687:3;4676:9;4672:19;4659:33;4656:57;4653:77;;;4726:1;4723;4716:12;4653:77;4749:76;4817:7;4809:3;4798:9;4794:19;4781:33;4770:9;4766:49;4749:76;:::i;:::-;4739:86;;4844:47;4886:3;4875:9;4871:19;4844:47;:::i;:::-;4834:57;;4939:3;4928:9;4924:19;4911:33;4900:44;;4992:3;4981:9;4977:19;4964:33;4953:44;;3897:1106;;;;;;;;;;;;;;:::o;5008:944::-;5153:6;5161;5169;5177;5185;5193;5201;5209;5217;5225;5278:3;5266:9;5257:7;5253:23;5249:33;5246:53;;;5295:1;5292;5285:12;5246:53;5318:28;5336:9;5318:28;:::i;:::-;5308:38;;5365:36;5397:2;5386:9;5382:18;5365:36;:::i;:::-;5355:46;;5448:2;5437:9;5433:18;5420:32;5410:42;;5499:2;5488:9;5484:18;5471:32;5461:42;;5550:3;5539:9;5535:19;5522:33;5512:43;;5602:3;5591:9;5587:19;5574:33;5564:43;;5654:3;5643:9;5639:19;5626:33;5616:43;;5706:3;5695:9;5691:19;5678:33;5668:43;;5762:3;5751:9;5747:19;5734:33;5790:18;5782:6;5779:30;5776:50;;;5822:1;5819;5812:12;5776:50;5845:49;5886:7;5877:6;5866:9;5862:22;5845:49;:::i;:::-;5835:59;;;5941:3;5930:9;5926:19;5913:33;5903:43;;5008:944;;;;;;;;;;;;;:::o;5957:127::-;6018:10;6013:3;6009:20;6006:1;5999:31;6049:4;6046:1;6039:15;6073:4;6070:1;6063:15;6089:212;6172:1;6165:5;6162:12;6152:143;;6217:10;6212:3;6208:20;6205:1;6198:31;6252:4;6249:1;6242:15;6280:4;6277:1;6270:15;6306:945;6696:3;6681:19;;6709:40;6742:6;6709:40;:::i;:::-;6758:25;;;-1:-1:-1;;;;;6819:47:12;;;;6814:2;6799:18;;6792:75;6915:4;6903:17;;;;6898:2;6883:18;;6876:45;6969:10;6957:23;;;;6952:2;6937:18;;6930:51;7012:3;6997:19;;6990:35;;;;7056:3;7041:19;;7034:35;;;;7100:3;7085:19;;7078:35;7144:3;7129:19;;7122:35;7188:3;7173:19;;7166:35;7232:3;7217:19;;;7210:35;6306:945;:::o;7644:323::-;7720:6;7728;7781:2;7769:9;7760:7;7756:23;7752:32;7749:52;;;7797:1;7794;7787:12;7749:52;7836:9;7823:23;7855:31;7880:5;7855:31;:::i;:::-;7905:5;7957:2;7942:18;;;;7929:32;;-1:-1:-1;;;7644:323:12:o;7972:594::-;8076:6;8084;8092;8100;8108;8161:3;8149:9;8140:7;8136:23;8132:33;8129:53;;;8178:1;8175;8168:12;8129:53;8214:9;8201:23;8191:33;;8271:2;8260:9;8256:18;8243:32;8233:42;;8322:2;8311:9;8307:18;8294:32;8284:42;;8373:2;8362:9;8358:18;8345:32;8335:42;;8428:3;8417:9;8413:19;8400:33;8456:18;8448:6;8445:30;8442:50;;;8488:1;8485;8478:12;8442:50;8511:49;8552:7;8543:6;8532:9;8528:22;8511:49;:::i;:::-;8501:59;;;7972:594;;;;;;;;:::o;8571:188::-;8639:20;;-1:-1:-1;;;;;8688:46:12;;8678:57;;8668:85;;8749:1;8746;8739:12;8764:260;8832:6;8840;8893:2;8881:9;8872:7;8868:23;8864:32;8861:52;;;8909:1;8906;8899:12;8861:52;8932:29;8951:9;8932:29;:::i;:::-;8922:39;;8980:38;9014:2;9003:9;8999:18;8980:38;:::i;:::-;8970:48;;8764:260;;;;;:::o;9253:802::-;9373:6;9381;9389;9397;9405;9413;9421;9474:3;9462:9;9453:7;9449:23;9445:33;9442:53;;;9491:1;9488;9481:12;9442:53;9514:28;9532:9;9514:28;:::i;:::-;9504:38;;9589:2;9578:9;9574:18;9561:32;9551:42;;9640:2;9629:9;9625:18;9612:32;9602:42;;9691:2;9680:9;9676:18;9663:32;9653:42;;9742:3;9731:9;9727:19;9714:33;9704:43;;9797:3;9786:9;9782:19;9769:33;9811:31;9836:5;9811:31;:::i;:::-;9861:5;-1:-1:-1;9917:3:12;9902:19;;9889:33;9945:18;9934:30;;9931:50;;;9977:1;9974;9967:12;9931:50;10000:49;10041:7;10032:6;10021:9;10017:22;10000:49;:::i;:::-;9990:59;;;9253:802;;;;;;;;;;:::o;10320:184::-;10390:6;10443:2;10431:9;10422:7;10418:23;10414:32;10411:52;;;10459:1;10456;10449:12;10411:52;-1:-1:-1;10482:16:12;;10320:184;-1:-1:-1;10320:184:12:o;10843:334::-;11045:2;11027:21;;;11084:2;11064:18;;;11057:30;-1:-1:-1;;;11118:2:12;11103:18;;11096:40;11168:2;11153:18;;10843:334::o;11182:127::-;11243:10;11238:3;11234:20;11231:1;11224:31;11274:4;11271:1;11264:15;11298:4;11295:1;11288:15;11314:128;11354:3;11385:1;11381:6;11378:1;11375:13;11372:39;;;11391:18;;:::i;:::-;-1:-1:-1;11427:9:12;;11314:128::o;13157:135::-;13196:3;-1:-1:-1;;13217:17:12;;13214:43;;;13237:18;;:::i;:::-;-1:-1:-1;13284:1:12;13273:13;;13157:135::o;13591:334::-;13793:2;13775:21;;;13832:2;13812:18;;;13805:30;-1:-1:-1;;;13866:2:12;13851:18;;13844:40;13916:2;13901:18;;13591:334::o;16106:335::-;16308:2;16290:21;;;16347:2;16327:18;;;16320:30;-1:-1:-1;;;16381:2:12;16366:18;;16359:41;16432:2;16417:18;;16106:335::o;16446:136::-;16481:3;-1:-1:-1;;;16502:22:12;;16499:48;;;16527:18;;:::i;:::-;-1:-1:-1;16567:1:12;16563:13;;16446:136::o;16587:335::-;16789:2;16771:21;;;16828:2;16808:18;;;16801:30;-1:-1:-1;;;16862:2:12;16847:18;;16840:41;16913:2;16898:18;;16587:335::o;16927:127::-;16988:10;16983:3;16979:20;16976:1;16969:31;17019:4;17016:1;17009:15;17043:4;17040:1;17033:15;18261:277;18328:6;18381:2;18369:9;18360:7;18356:23;18352:32;18349:52;;;18397:1;18394;18387:12;18349:52;18429:9;18423:16;18482:5;18475:13;18468:21;18461:5;18458:32;18448:60;;18504:1;18501;18494:12;19901:125;19941:4;19969:1;19966;19963:8;19960:34;;;19974:18;;:::i;:::-;-1:-1:-1;20011:9:12;;19901:125::o;20632:394::-;20873:10;20861:23;;20843:42;;20916:2;20901:18;;20894:34;;;20831:2;20816:18;;20937:40;20970:6;20937:40;:::i;:::-;21013:6;21008:2;20997:9;20993:18;20986:34;20632:394;;;;;;:::o;22942:265::-;22981:3;23009:9;;;23034:10;;-1:-1:-1;;;;;23053:27:12;;;23046:35;;23030:52;23027:78;;;23085:18;;:::i;:::-;-1:-1:-1;;;23132:19:12;;;23125:27;;23117:36;;23114:62;;;23156:18;;:::i;:::-;-1:-1:-1;;23192:9:12;;22942:265::o;23212:267::-;23251:4;23280:9;;;23305:10;;-1:-1:-1;;;23324:19:12;;23317:27;;23301:44;23298:70;;;23348:18;;:::i;:::-;-1:-1:-1;;;;;23395:27:12;;23388:35;;23380:44;;23377:70;;;23427:18;;:::i;:::-;-1:-1:-1;;23464:9:12;;23212:267::o;24142:204::-;24180:3;24216:4;24213:1;24209:12;24248:4;24245:1;24241:12;24283:3;24277:4;24273:14;24268:3;24265:23;24262:49;;;24291:18;;:::i;:::-;24327:13;;24142:204;-1:-1:-1;;;24142:204:12:o

Swarm Source

ipfs://79c3a5760c202f948c6e99da588bff4809558e21194ed3203dec81aaa08282ae

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.