public static IList <T> Read <T>(byte[] bytes, long offset, Func <IBinaryBufferReader, IHerculesEventBuilder <T> > eventBuilderProvider, ILog log)
        {
            var reader = new BinaryBufferReader(bytes, offset)
            {
                Endianness = Endianness.Big
            };

            var count  = reader.ReadInt32();
            var result = new List <T>(count);

            for (var i = 0; i < count; i++)
            {
                var startPosition = reader.Position;

                try
                {
                    result.Add(ReadEvent(reader, eventBuilderProvider(reader)));
                }
                catch (Exception e)
                {
                    log.Error(e, "Failed to read event from position {Position}.", startPosition);

                    reader.Position = startPosition;
                    ReadEvent(reader, DummyEventBuilder.Instance);
                }
            }

            return(result);
        }
        protected private void HandleEvents(RawReadStreamPayload result, StreamCoordinates queryCoordinates)
        {
            int count;

            using (new OperationContextToken("HandleEvents"))
                using (var operationSpan = tracer.BeginConsumerCustomOperationSpan("HandleEvents"))
                    using (iterationMetric?.For("handle_time").Measure())
                    {
                        // ReSharper disable once AssignNullToNotNullAttribute
                        var reader = new BinaryBufferReader(result.Content.Array, result.Content.Offset)
                        {
                            Endianness = Endianness.Big
                        };

                        count = reader.ReadInt32();

                        for (var i = 0; i < count; i++)
                        {
                            var startPosition = reader.Position;

                            try
                            {
                                var @event = EventsBinaryReader.ReadEvent(reader, settings.EventBuilderProvider(reader));
                                settings.OnEvent?.Invoke(@event, queryCoordinates);
                            }
                            catch (Exception e)
                            {
                                log.Error(e, "Failed to read event from position {Position}.", startPosition);

                                reader.Position = startPosition;
                                EventsBinaryReader.ReadEvent(reader, DummyEventBuilder.Instance);
                            }
                        }

                        operationSpan.SetOperationDetails(count);
                        LogProgress(count);
                    }

            if (count == 0)
            {
                Thread.Sleep(settings.DelayOnNoEvents);
            }
        }