private static function buildRanges($rows)
 {
     $ranges = array();
     $currentClientId = -1;
     // stack with the open connections of the client
     $sessions = array();
     for ($i = 0, $count = count($rows); $i < $count; $i++) {
         $row = $rows[$i];
         if ($currentClientId != $row['client_id']) {
             // maybe online?
             if (count($sessions) > 0) {
                 foreach ($sessions as $range) {
                     $onlineTime = $range->getTimeFromStart();
                     if ($onlineTime < Config::get("max_online_time", OnlineRange::MAX_ONLINE_TIME)) {
                         // FIXME if a user is connected multiple times what happens?
                         OnlineRange::$online_ranges[$range->user->master_client_id] = $range;
                         Logger::log("    online user {$currentClientId} [{$range->user->master_client_id}] for {$onlineTime} seconds");
                     } else {
                         Logger::log("    " . count($sessions) . " pending sessions of client_id = {$currentClientId}");
                     }
                 }
             }
             $sessions = array();
             $currentClientId = $row['client_id'];
         }
         if ($row['type'] == 'c') {
             $user = OnlineRange::getUser($row['user_id']);
             $ip = $row['ip'];
             $start = new DateTime($row['date']);
             $start_id = $row['event_id'];
             $range = new OnlineRange($start, null, $user, $ip);
             $range->start_id = $start_id;
             $sessions[] = $range;
         } else {
             if ($row['type'] == 'd') {
                 if (count($sessions) == 0) {
                     Logger::log("    No sessions found in stack for client_id = {$currentClientId}");
                     continue;
                 }
                 $end = new DateTime($row['date']);
                 $end_id = $rows[$i]['event_id'];
                 $range = array_pop($sessions);
                 $range->end = $end;
                 $range->end_id = $end_id;
                 if (!isset(OnlineRange::$last_online[$range->user->master_client_id]) || Utils::getTimestamp($end) > Utils::getTimestamp(OnlineRange::$last_online[$range->user->master_client_id])) {
                     OnlineRange::$last_online[$range->user->master_client_id] = $end;
                 }
                 if (Utils::getTimestamp($range->end) - Utils::getTimestamp($range->start) <= Config::get("max_online_time", OnlineRange::MAX_ONLINE_TIME)) {
                     $ranges[] = $range;
                 }
             } else {
                 foreach ($sessions as $session) {
                     $end = new DateTime($row['date']);
                     $end_id = -1;
                     $range = $session;
                     $range->end = $end;
                     $range->end_id = $end_id;
                     Logger::log("Removed session " . Utils::formatDate($range->start) . " crash on " . Utils::formatDate($end));
                     if (!isset(OnlineRange::$last_online[$range->user->master_client_id]) || Utils::getTimestamp($end) > Utils::getTimestamp(OnlineRange::$last_online[$range->user->master_client_id])) {
                         OnlineRange::$last_online[$range->user->master_client_id] = $end;
                     }
                     if (Utils::getTimestamp($range->end) - Utils::getTimestamp($range->start) <= Config::get("max_online_time", OnlineRange::MAX_ONLINE_TIME)) {
                         $ranges[] = $range;
                     }
                 }
                 $sessions = [];
             }
         }
     }
     return $ranges;
 }