OverlayData.Driver[] LatestRunningOrder(DataSample data, TimeSpan relativeTime)
        {
            var drivers = data.Telemetry.Cars.Where(c => !c.Details.IsPaceCar).Select(c => new OverlayData.Driver
            {
                UserName     = c.Details.UserName,
                CarNumber    = c.Details.CarNumberDisplay,
                Position     = c.Position,
                CarIdx       = c.CarIdx,
                PitStopCount = c.PitStopCount
            })
                          .OrderBy(c => c.Position)
                          .ToArray();

            if (lastDrivers != null)
            {
                foreach (var d in drivers.OrderBy(d => d.Position))
                {
                    var lastPosition = lastDrivers.FirstOrDefault(lp => lp.CarIdx == d.CarIdx);
                    if (lastPosition != null && lastPosition.Position != d.Position)
                    {
                        var position = d.Position != null?d.Position.Value.ToString() : "";

                        var indicator = d.Position != null?d.Position.Value.Ordinal() : "";

                        var msg = "{0} in {1}{2}".F(d.UserName, position, indicator);
                        TraceInfo.WriteLine("{0} {1}", data.Telemetry.SessionTimeSpan, msg);
                        commentaryMessages.Add(msg, relativeTime.TotalSeconds);
                    }
                }
            }

            lastDrivers = drivers;

            return(drivers);
        }
        void AnnounceIfDriverHasFinished(DataSample data, TimeSpan relativeTime, SessionData._SessionInfo._Sessions session, int i, ref OverlayData.LeaderBoard leaderBoard)
        {
            if (!data.LastSample.Telemetry.Cars[i].HasSeenCheckeredFlag || haveNotedCheckerdFlag[i])
            {
                return;
            }

            haveNotedCheckerdFlag[i] = true;

            var driver       = data.SessionData.DriverInfo.CompetingDrivers[i];
            var position     = (int)session.ResultsPositions.First(r => r.CarIdx == i).Position;
            var pitStopCount = data.Telemetry.Cars[i].PitStopCount;

            var drivers = leaderBoard.Drivers.Where(d => d.CarIdx != i)
                          .Select(d => d.Clone())
                          .ToList();

            drivers.Insert((int)position - 1, new OverlayData.Driver
            {
                CarNumber    = driver.CarNumber,
                UserName     = driver.UserName,
                Position     = position,
                CarIdx       = i,
                PitStopCount = pitStopCount
            });

            var p = 1;

            foreach (var d in drivers)
            {
                d.Position = p++;
            }

            leaderBoard = captureLeaderBoard.CreateLeaderBoard(data, relativeTime, drivers.ToArray());

            var msg = string.Format("{0} finished in {1}{2}", driver.UserName, position, position.Ordinal());

            TraceInfo.WriteLine("{0} {1}", data.Telemetry.SessionTimeSpan, msg);
            commentaryMessages.Add(msg, relativeTime.TotalSeconds);
        }