Ecng.IO 1.0.240

There is a newer version of this package available.
See the version list below for details.
dotnet add package Ecng.IO --version 1.0.240
                    
NuGet\Install-Package Ecng.IO -Version 1.0.240
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Ecng.IO" Version="1.0.240" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.IO" Version="1.0.240" />
                    
Directory.Packages.props
<PackageReference Include="Ecng.IO" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Ecng.IO --version 1.0.240
                    
#r "nuget: Ecng.IO, 1.0.240"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Ecng.IO@1.0.240
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Ecng.IO&version=1.0.240
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.IO&version=1.0.240
                    
Install as a Cake Tool

Ecng.IO

A comprehensive .NET library providing compression, decompression, and file system utilities with async support.

Overview

Ecng.IO is part of the Ecng system framework by StockSharp, offering powerful helpers for:

  • Data compression and decompression (GZip, Deflate, 7Zip/LZMA)
  • ZIP archive extraction
  • Fossil delta compression for efficient binary differencing
  • File and directory operations
  • Stream manipulation utilities
  • Path management

Target Frameworks

  • .NET Standard 2.0
  • .NET 6.0
  • .NET 10.0

Installation

Add a reference to the Ecng.IO project or NuGet package in your project.

<ProjectReference Include="path\to\Ecng.IO\IO.csproj" />

Features

1. Compression & Decompression

The CompressionHelper class provides extension methods for compressing and decompressing data using various algorithms.

GZip Compression
using Ecng.IO;

// Decompress GZip data to string
byte[] compressedData = GetGZipData();
string result = compressedData.UnGZip();

// Decompress GZip data to buffer
byte[] destination = new byte[1024];
int bytesWritten = compressedData.UnGZip(destination);

// Decompress from specific range
string result = compressedData.UnGZip(index: 0, count: 100);

// Modern .NET: Use spans for better performance
ReadOnlySpan<byte> compressedSpan = stackalloc byte[256];
string result = compressedSpan.UnGZip();
Deflate Compression
using Ecng.IO;
using System.IO.Compression;

// Compress data with Deflate
byte[] data = GetRawData();
byte[] compressed = data.DeflateTo();

// Decompress Deflate data
string decompressed = compressed.UnDeflate();

// Decompress to buffer
byte[] destination = new byte[1024];
int bytesWritten = compressed.UnDeflate(destination);

// Decompress with custom buffer size
byte[] decompressed = compressed.DeflateFrom(bufferSize: CompressionHelper.DefaultBufferSize);
7Zip/LZMA Compression
using Ecng.IO;

// Compress with LZMA
byte[] data = GetRawData();
byte[] compressed = data.Do7Zip();

// Decompress LZMA data
byte[] decompressed = compressed.Un7Zip();
Generic Compression API
using Ecng.IO;
using System.IO.Compression;

// Compress with any compression stream type
byte[] data = GetRawData();
byte[] compressed = data.Compress<GZipStream>(
    index: 0,
    count: data.Length,
    level: CompressionLevel.Optimal,
    bufferSize: CompressionHelper.DefaultBufferSize
);

// Decompress with any compression stream type
byte[] decompressed = compressed.Uncompress<GZipStream>(
    index: 0,
    count: compressed.Length,
    bufferSize: CompressionHelper.DefaultBufferSize
);
Async Compression
using Ecng.IO;
using System.IO.Compression;
using System.Threading;

// Compress asynchronously
byte[] data = GetRawData();
byte[] compressed = await data.CompressAsync<GZipStream>(
    level: CompressionLevel.Optimal,
    bufferSize: CompressionHelper.DefaultBufferSize,
    cancellationToken: CancellationToken.None
);

// Decompress asynchronously
byte[] decompressed = await compressed.UncompressAsync<DeflateStream>(
    bufferSize: CompressionHelper.DefaultBufferSize,
    cancellationToken: CancellationToken.None
);

// Compress stream to stream
using var inputStream = File.OpenRead("input.dat");
using var outputStream = File.Create("output.gz");
await inputStream.CompressAsync<GZipStream>(
    output: outputStream,
    level: CompressionLevel.Optimal,
    leaveOpen: false,
    bufferSize: CompressionHelper.DefaultBufferSize
);

// Decompress stream to stream
using var compressedStream = File.OpenRead("compressed.gz");
using var decompressedStream = File.Create("decompressed.dat");
await compressedStream.UncompressAsync<GZipStream>(
    output: decompressedStream,
    leaveOpen: false,
    bufferSize: CompressionHelper.DefaultBufferSize
);

2. ZIP Archive Handling

using Ecng.IO;

// Extract all entries from ZIP
byte[] zipData = File.ReadAllBytes("archive.zip");
using (var entries = zipData.Unzip())
{
    foreach (var (name, body) in entries)
    {
        Console.WriteLine($"File: {name}");
        // Process stream...
        body.CopyTo(outputStream);
    }
}

// Extract with filter
using (var entries = zipData.Unzip(filter: name => name.EndsWith(".txt")))
{
    foreach (var (name, body) in entries)
    {
        // Only .txt files are extracted
        ProcessTextFile(name, body);
    }
}

// Extract from stream
using var fileStream = File.OpenRead("archive.zip");
using (var entries = fileStream.Unzip(leaveOpen: false))
{
    foreach (var (name, body) in entries)
    {
        Console.WriteLine($"Processing: {name}");
    }
}

3. Fossil Delta Compression

Fossil delta compression is ideal for efficiently storing and transmitting differences between binary files, such as software updates or version control systems.

using Ecng.IO.Fossil;
using System.Threading;

// Create a delta between two versions
byte[] originalFile = File.ReadAllBytes("version1.bin");
byte[] newFile = File.ReadAllBytes("version2.bin");

byte[] delta = await Delta.Create(
    origin: originalFile,
    target: newFile,
    token: CancellationToken.None
);

// Delta is typically much smaller than the full new file
Console.WriteLine($"Original: {originalFile.Length} bytes");
Console.WriteLine($"New: {newFile.Length} bytes");
Console.WriteLine($"Delta: {delta.Length} bytes");

// Apply delta to reconstruct the new file
byte[] reconstructed = await Delta.Apply(
    origin: originalFile,
    delta: delta,
    token: CancellationToken.None
);

// Verify reconstruction
bool isIdentical = reconstructed.SequenceEqual(newFile); // true

// Get output size from delta without applying it
uint outputSize = Delta.OutputSize(delta);
Console.WriteLine($"Expected output size: {outputSize} bytes");

4. File and Directory Operations

The library extends the functionality available through Ecng.Common.IOHelper.

Directory Management
using Ecng.Common;

// Clear directory contents
DirectoryInfo dir = IOHelper.ClearDirectory(@"C:\temp\data");

// Clear with filter
DirectoryInfo dir = IOHelper.ClearDirectory(
    @"C:\temp\data",
    filter: path => Path.GetExtension(path) == ".tmp"
);

// Clear asynchronously
DirectoryInfo dir = await IOHelper.ClearDirectoryAsync(
    @"C:\temp\data",
    cancellationToken: cancellationToken
);

// Copy entire directory
IOHelper.CopyDirectory(@"C:\source", @"C:\destination");

// Copy asynchronously
await IOHelper.CopyDirectoryAsync(
    @"C:\source",
    @"C:\destination",
    cancellationToken
);

// Create temporary directory
string tempDir = IOHelper.CreateTempDir();
// Returns: C:\Users\...\AppData\Local\Temp\{GUID}

// Delete directory safely (no error if not exists)
@"C:\temp\data".SafeDeleteDir();

// Delete empty directories recursively
IOHelper.DeleteEmptyDirs(@"C:\project");

// Block until directory is deleted (useful for locked files)
bool stillExists = IOHelper.BlockDeleteDir(
    @"C:\temp\locked",
    isRecursive: true,
    iterCount: 1000,
    sleep: 10
);
File Operations
using Ecng.Common;

// Copy file and make writable
string destFile = IOHelper.CopyAndMakeWritable(
    @"C:\source\file.txt",
    @"C:\destination"
);

// Create directory for file if needed
string filePath = @"C:\deep\nested\path\file.txt";
bool wasCreated = filePath.CreateDirIfNotExists();

// Create file with content
IOHelper.CreateFile(
    rootPath: @"C:\data",
    relativePath: "logs",
    fileName: "app.log",
    content: Encoding.UTF8.GetBytes("Log entry")
);

// Check if file is locked
bool isLocked = IOHelper.IsFileLocked(@"C:\data\file.dat");

// Get assembly/file timestamp
DateTime buildTime = IOHelper.GetTimestamp(@"C:\app\MyApp.exe");
DateTime asmTime = typeof(MyClass).Assembly.GetTimestamp();
Path Utilities
using Ecng.Common;

// Convert to full path
string fullPath = @"relative\path\file.txt".ToFullPath();

// Add relative path segment
string combined = @"C:\base".AddRelative(@"subdir\file.txt");
// Returns: C:\base\subdir\file.txt

// Expand %Documents% variable
string path = @"%Documents%\MyApp\data.db".ToFullPathIfNeed();
// Returns: C:\Users\Username\Documents\MyApp\data.db

// Get relative path
string relative = @"C:\project\src\file.cs".GetRelativePath(@"C:\project");
// Returns: src\file.cs

// Normalize paths for comparison
string normalized = @"C:\Path\To\..\File.txt".NormalizePath();
string normalized2 = @"C:\path\to\..\file.txt".NormalizePath();

// Compare paths
bool areEqual = IOHelper.IsPathsEqual(
    @"C:\Path\To\File.txt",
    @"c:\path\to\file.txt"
); // true

// Check if path is directory
bool isDir = @"C:\Windows".IsDirectory();
bool isDir2 = @"C:\Windows".IsPathIsDir(); // alternative
Directory Queries
using Ecng.Common;

// Get directories with pattern
IEnumerable<string> dirs = IOHelper.GetDirectories(
    @"C:\projects",
    searchPattern: "*.Tests",
    searchOption: SearchOption.AllDirectories
);

// Get directories asynchronously
IEnumerable<string> dirs = await IOHelper.GetDirectoriesAsync(
    @"C:\projects",
    searchPattern: "*",
    searchOption: SearchOption.TopDirectoryOnly,
    cancellationToken: cancellationToken
);

// Get files asynchronously
IEnumerable<string> files = await IOHelper.GetFilesAsync(
    @"C:\logs",
    searchPattern: "*.log",
    searchOption: SearchOption.AllDirectories,
    cancellationToken: cancellationToken
);

// Check if directory exists and has content
bool hasInstall = IOHelper.CheckInstallation(@"C:\Program Files\MyApp");

// Check if directory contains files (recursive)
bool hasFiles = IOHelper.CheckDirContainFiles(@"C:\temp");

// Check if directory contains anything
bool hasContent = IOHelper.CheckDirContainsAnything(@"C:\temp");

// Get disk free space
long freeSpace = IOHelper.GetDiskFreeSpace("C:");
Console.WriteLine($"Free: {freeSpace.ToHumanReadableFileSize()}");

5. Stream Operations

Reading from Streams
using Ecng.Common;

// Read exact number of bytes
Stream stream = GetStream();
byte[] buffer = stream.ReadBuffer(size: 1024);

// Read bytes into buffer
byte[] data = new byte[512];
stream.ReadBytes(data, len: 256, pos: 0);

// Read bytes into Memory<byte>
Memory<byte> memory = new byte[512];
stream.ReadBytes(memory);

// Read full amount asynchronously (ensures all bytes are read)
byte[] buffer = new byte[1024];
int totalRead = await stream.ReadFullAsync(
    buffer,
    offset: 0,
    bytesToRead: 1024,
    cancellationToken
);

// Read typed data
int value = stream.Read<int>();
DateTime timestamp = stream.Read<DateTime>();
MyStruct data = stream.Read<MyStruct>();

// Read with dynamic size (for strings/arrays)
string text = (string)stream.Read(typeof(string));
byte[] bytes = (byte[])stream.Read(typeof(byte[]));

// Enumerate lines
foreach (string line in stream.EnumerateLines(Encoding.UTF8, leaveOpen: true))
{
    Console.WriteLine(line);
}
Writing to Streams
using Ecng.Common;

Stream stream = GetStream();

// Write bytes
byte[] data = GetData();
stream.WriteBytes(data, len: data.Length, pos: 0);

// Write raw data
stream.WriteRaw(data);
stream.WriteRaw(myObject); // Converts object to bytes

// Write with length prefix
stream.WriteEx("Hello"); // Writes length + data
stream.WriteEx(new byte[] { 1, 2, 3 }); // Writes length + data
Stream Utilities
using Ecng.Common;

// Save stream to file
stream.Save(@"C:\output\data.bin");

// Save byte array to file
byte[] data = GetData();
data.Save(@"C:\output\data.bin");

// Try save with error handling
bool success = data.TrySave(
    @"C:\output\data.bin",
    errorHandler: ex => Console.WriteLine($"Error: {ex.Message}")
);

// Get actual buffer from MemoryStream
var ms = new MemoryStream();
ms.Write(someData, 0, someData.Length);
ArraySegment<byte> segment = ms.GetActualBuffer();
// segment contains only written data, not entire buffer

// Truncate StreamWriter
using var writer = new StreamWriter(@"C:\log.txt");
writer.WriteLine("Entry 1");
writer.Truncate(); // Clears the file
writer.WriteLine("Entry 2");

6. Process Execution

using Ecng.Common;
using System.Diagnostics;

// Execute process and capture output
int exitCode = IOHelper.Execute(
    fileName: "git",
    arg: "status",
    output: line => Console.WriteLine($"OUT: {line}"),
    error: line => Console.WriteLine($"ERR: {line}"),
    waitForExit: TimeSpan.FromSeconds(30)
);

// Execute with advanced options
int exitCode = IOHelper.Execute(
    fileName: "dotnet",
    arg: "build",
    output: line => LogOutput(line),
    error: line => LogError(line),
    infoHandler: info => {
        info.WorkingDirectory = @"C:\project";
        info.EnvironmentVariables["CUSTOM_VAR"] = "value";
    },
    stdInput: "input data",
    priority: ProcessPriorityClass.High
);

// Execute asynchronously
int exitCode = await IOHelper.ExecuteAsync(
    fileName: "npm",
    arg: "install",
    output: line => Console.WriteLine(line),
    error: line => Console.Error.WriteLine(line),
    priority: ProcessPriorityClass.BelowNormal,
    cancellationToken: cancellationToken
);

7. Utility Functions

using Ecng.Common;

// Convert file size to human-readable format
long bytes = 1536000;
string size = bytes.ToHumanReadableFileSize();
// Returns: "1.5 MB"

// Get size of unmanaged type
int size = IOHelper.SizeOf<int>(); // 4
int size = IOHelper.SizeOf<DateTime>(); // 8 (stored as long)
int size = typeof(MyStruct).SizeOf();

// Open file or URL with default application
bool success = @"C:\document.pdf".OpenLink(raiseError: false);
bool success = "https://example.com".OpenLink(raiseError: true);

Buffer Sizes

The library uses a default buffer size for compression operations:

// Default buffer size: 80 KB
const int bufferSize = CompressionHelper.DefaultBufferSize; // 81920 bytes

You can customize buffer sizes for performance tuning:

// Use smaller buffer for memory-constrained environments
byte[] compressed = data.Compress<GZipStream>(bufferSize: 4096);

// Use larger buffer for better throughput
byte[] compressed = data.Compress<GZipStream>(bufferSize: 1024 * 1024);

Error Handling

All methods throw standard .NET exceptions:

  • ArgumentNullException - When required parameters are null
  • ArgumentOutOfRangeException - When sizes or indices are invalid
  • IOException - When I/O operations fail
  • UnauthorizedAccessException - When access is denied
  • DirectoryNotFoundException / FileNotFoundException - When paths don't exist
try
{
    var data = compressedData.UnGZip();
}
catch (ArgumentNullException ex)
{
    // Input was null
}
catch (IOException ex)
{
    // Decompression failed
}

Thread Safety

  • CompressionHelper methods are thread-safe as they operate on method parameters
  • Stream operations are not inherently thread-safe - synchronize access if needed
  • File operations should be synchronized when accessing the same files from multiple threads
  • Async methods support CancellationToken for cooperative cancellation

Performance Tips

  1. Use async methods for I/O-bound operations to avoid blocking threads
  2. Use Span/Memory APIs on .NET 6.0+ for better performance and less allocation
  3. Choose appropriate compression levels:
    • CompressionLevel.Fastest - Quick but larger files
    • CompressionLevel.Optimal - Balanced (default)
    • CompressionLevel.SmallestSize - Slow but smallest files (.NET 7+)
  4. Adjust buffer sizes based on your data and memory constraints
  5. Use Fossil Delta for incremental updates instead of full file transfers

Examples

Example 1: Compress and Save File

using Ecng.IO;
using System.IO.Compression;

// Read, compress, and save
byte[] original = File.ReadAllBytes(@"C:\data\large-file.json");
byte[] compressed = original.Compress<GZipStream>(
    level: CompressionLevel.Optimal
);
compressed.Save(@"C:\data\large-file.json.gz");

Console.WriteLine($"Original: {original.Length.ToHumanReadableFileSize()}");
Console.WriteLine($"Compressed: {compressed.Length.ToHumanReadableFileSize()}");
Console.WriteLine($"Ratio: {(100.0 * compressed.Length / original.Length):F1}%");

Example 2: Process ZIP Archive

using Ecng.IO;

byte[] zipData = File.ReadAllBytes(@"C:\downloads\archive.zip");

using (var entries = zipData.Unzip(filter: name => name.EndsWith(".csv")))
{
    foreach (var (fileName, stream) in entries)
    {
        Console.WriteLine($"Processing: {fileName}");

        using var reader = new StreamReader(stream);
        string csvContent = reader.ReadToEnd();

        // Process CSV...
        ProcessCsvData(csvContent);
    }
}

Example 3: Incremental Binary Updates with Fossil Delta

using Ecng.IO.Fossil;

// Server side: Create delta
byte[] v1 = File.ReadAllBytes(@"app-v1.0.exe");
byte[] v2 = File.ReadAllBytes(@"app-v2.0.exe");
byte[] delta = await Delta.Create(v1, v2, CancellationToken.None);

// Upload only the delta (much smaller than full v2)
await UploadToServer("update-1.0-to-2.0.delta", delta);

// Client side: Apply delta
byte[] currentVersion = File.ReadAllBytes(@"app.exe");
byte[] deltaUpdate = await DownloadFromServer("update-1.0-to-2.0.delta");
byte[] newVersion = await Delta.Apply(currentVersion, deltaUpdate, CancellationToken.None);

File.WriteAllBytes(@"app.exe", newVersion);

Example 4: Async Directory Processing

using Ecng.Common;

// Find all log files and compress them
var logFiles = await IOHelper.GetFilesAsync(
    @"C:\logs",
    searchPattern: "*.log",
    searchOption: SearchOption.AllDirectories,
    cancellationToken: cancellationToken
);

foreach (string logFile in logFiles)
{
    byte[] content = await File.ReadAllBytesAsync(logFile, cancellationToken);
    byte[] compressed = await content.CompressAsync<GZipStream>(
        cancellationToken: cancellationToken
    );

    await File.WriteAllBytesAsync(
        logFile + ".gz",
        compressed,
        cancellationToken
    );

    Console.WriteLine($"Compressed: {logFile}");
}

Example 5: Stream Processing Pipeline

using Ecng.IO;
using Ecng.Common;
using System.IO.Compression;

// Create a processing pipeline
await using var inputFile = File.OpenRead(@"C:\data\input.txt");
await using var compressed = new MemoryStream();
await using var encrypted = new MemoryStream();

// Compress
await inputFile.CompressAsync<GZipStream>(
    output: compressed,
    level: CompressionLevel.Optimal,
    leaveOpen: true
);

compressed.Position = 0;

// Further processing...
// (e.g., encrypt, hash, etc.)

// Save final result
compressed.Position = 0;
await using var output = File.Create(@"C:\data\output.bin");
await compressed.CopyToAsync(output);

License

Copyright © StockSharp 2010-2025

  • Ecng.Common - Core utilities and extensions
  • Ecng.Lzma - LZMA compression implementation
  • Ecng.Serialization - Serialization utilities

Support

For issues and questions, please visit the StockSharp repository or documentation.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (14)

Showing the top 5 NuGet packages that depend on Ecng.IO:

Package Downloads
Ecng.Interop

Ecng system framework

Ecng.Security

Ecng system framework

StockSharp.Algo

Trading algorithms. More info on web site https://stocksharp.com/store/

StockSharp.Fix

FIX/FAST

StockSharp.DukasCopy

DukasCopy

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on Ecng.IO:

Repository Stars
StockSharp/StockSharp
Algorithmic trading and quantitative trading open source platform to develop trading robots (stock markets, forex, crypto, bitcoins, and options).
Version Downloads Last Updated
1.0.247 64 1/1/2026
1.0.246 295 12/31/2025
1.0.245 413 12/30/2025
1.0.244 386 12/30/2025
1.0.243 88 12/29/2025
1.0.242 92 12/26/2025
1.0.241 83 12/26/2025
1.0.240 83 12/26/2025
1.0.239 100 12/26/2025
1.0.238 172 12/25/2025
1.0.237 174 12/25/2025
1.0.236 182 12/22/2025
1.0.235 165 12/21/2025
1.0.234 247 12/19/2025
1.0.233 232 12/19/2025
1.0.232 321 12/17/2025
1.0.231 313 12/15/2025
1.0.230 173 12/12/2025
1.0.229 126 12/12/2025
1.0.228 259 11/29/2025
1.0.227 129 11/28/2025
1.0.226 136 11/28/2025
1.0.225 191 11/27/2025
1.0.224 288 11/24/2025
1.0.223 197 11/24/2025
1.0.222 200 11/23/2025
1.0.221 248 11/22/2025
1.0.220 1,028 11/20/2025
1.0.219 441 11/18/2025
1.0.218 406 11/18/2025
1.0.217 391 11/13/2025
1.0.216 294 11/10/2025
1.0.215 1,159 11/1/2025
1.0.214 249 10/28/2025
1.0.213 254 10/27/2025
1.0.212 196 10/27/2025
1.0.211 130 10/25/2025
1.0.210 1,204 10/3/2025
1.0.209 417 9/25/2025
1.0.208 4,981 8/30/2025
1.0.207 3,056 7/13/2025
1.0.206 219 7/13/2025
1.0.205 196 7/12/2025
1.0.204 611 7/8/2025
1.0.203 3,381 6/16/2025
1.0.202 387 6/9/2025
1.0.201 285 6/8/2025
1.0.200 776 5/21/2025
1.0.199 220 5/17/2025
1.0.198 823 5/12/2025
1.0.197 281 5/12/2025
1.0.196 380 4/17/2025
1.0.195 2,842 3/20/2025
1.0.194 259 3/19/2025
1.0.193 1,410 2/26/2025
1.0.192 188 2/26/2025
1.0.191 2,599 2/5/2025
1.0.190 571 1/21/2025
1.0.189 669 1/14/2025
1.0.188 227 1/12/2025
1.0.187 215 1/10/2025
1.0.186 3,115 11/18/2024
1.0.185 655 11/7/2024
1.0.184 362 10/19/2024
1.0.183 2,277 10/5/2024
1.0.182 2,234 9/18/2024
1.0.181 226 9/17/2024
1.0.180 1,206 9/1/2024
1.0.179 6,652 6/12/2024
1.0.178 1,207 5/28/2024
1.0.177 1,657 5/4/2024
1.0.176 2,418 4/14/2024
1.0.175 1,982 3/28/2024
1.0.174 273 3/17/2024
1.0.173 2,056 2/23/2024
1.0.172 226 2/23/2024
1.0.171 1,500 2/18/2024
1.0.170 236 2/16/2024
1.0.169 947 2/13/2024
1.0.168 866 2/8/2024
1.0.167 1,153 2/4/2024
1.0.166 1,114 1/23/2024
1.0.165 2,004 1/12/2024
1.0.164 2,254 1/2/2024
1.0.163 406 12/29/2023
1.0.162 5,467 11/12/2023
1.0.161 184 11/10/2023
1.0.160 167 11/10/2023
1.0.159 402 11/9/2023
1.0.158 545 11/3/2023
1.0.157 209 11/1/2023
1.0.156 192 11/1/2023
1.0.155 5,762 9/8/2023
1.0.154 443 9/8/2023
1.0.153 418 9/3/2023
1.0.152 321 8/21/2023
1.0.151 723 8/14/2023
1.0.150 851 8/10/2023
1.0.149 5,411 6/29/2023
1.0.148 4,305 5/27/2023
1.0.147 1,025 5/19/2023
1.0.146 4,643 5/8/2023
1.0.145 3,577 4/21/2023
1.0.144 6,315 4/3/2023
1.0.143 4,066 3/13/2023
1.0.142 2,589 3/6/2023
1.0.141 1,370 2/26/2023
1.0.140 7,924 2/9/2023
1.0.139 4,138 2/7/2023
1.0.138 432 2/4/2023
1.0.137 3,248 2/2/2023
1.0.136 3,172 1/30/2023
1.0.135 4,359 1/18/2023
1.0.134 9,644 12/30/2022
1.0.133 1,589 12/23/2022
1.0.132 3,874 12/12/2022
1.0.131 6,808 12/4/2022
1.0.130 494 12/4/2022
1.0.129 521 11/30/2022
1.0.128 482 11/28/2022
1.0.127 2,599 11/18/2022
1.0.126 5,976 11/11/2022
1.0.125 529 11/11/2022
1.0.124 521 11/10/2022
1.0.123 569 11/5/2022
1.0.122 1,946 11/4/2022
1.0.121 18,516 11/1/2022
1.0.120 20,905 10/16/2022
1.0.119 683 9/25/2022
1.0.118 5,061 9/10/2022
1.0.117 42,250 9/8/2022
1.0.116 609 9/8/2022
1.0.115 620 9/8/2022
1.0.114 609 9/4/2022
1.0.113 83,383 8/24/2022
1.0.112 4,859 8/8/2022
1.0.111 2,515 7/26/2022
1.0.110 636 7/26/2022
1.0.109 43,264 7/19/2022
1.0.108 42,364 7/18/2022
1.0.107 3,890 7/13/2022
1.0.106 648 7/11/2022
1.0.105 635 7/8/2022
1.0.104 1,662 6/30/2022
1.0.103 1,651 6/18/2022
1.0.102 695 6/6/2022
1.0.101 84,554 4/30/2022
1.0.100 675 4/20/2022
1.0.99 680 4/10/2022
1.0.98 663 4/7/2022
1.0.97 658 4/7/2022
1.0.96 663 4/2/2022
1.0.95 7,396 3/29/2022
1.0.94 630 3/27/2022
1.0.93 238,123 1/24/2022
1.0.92 147,805 12/29/2021
1.0.91 25,865 12/20/2021
1.0.90 598 12/13/2021
1.0.89 50,646 12/6/2021
1.0.88 532 12/2/2021
1.0.87 27,605 11/29/2021
1.0.86 25,761 11/22/2021
1.0.85 613 11/17/2021
1.0.84 26,665 11/13/2021
1.0.83 567 11/10/2021
1.0.82 533 11/9/2021
1.0.81 56,310 11/5/2021
1.0.80 610 11/5/2021
1.0.79 570 11/4/2021
1.0.78 573 11/4/2021
1.0.77 587 11/3/2021
1.0.76 643 10/30/2021
1.0.75 29,425 10/21/2021
1.0.74 679 10/17/2021
1.0.73 55,267 10/14/2021
1.0.72 4,622 10/13/2021
1.0.71 553 10/12/2021
1.0.70 29,114 10/11/2021
1.0.69 577 10/9/2021
1.0.68 32,364 10/7/2021
1.0.67 30,972 10/7/2021
1.0.66 531 10/7/2021
1.0.65 608 10/6/2021
1.0.64 642 9/28/2021
1.0.63 30,320 9/23/2021
1.0.62 673 9/10/2021
1.0.61 610 9/9/2021
1.0.60 574 9/8/2021
1.0.59 566 9/8/2021
1.0.58 28,712 9/6/2021
1.0.57 599 8/31/2021
1.0.56 560 8/30/2021
1.0.55 29,742 7/31/2021
1.0.54 54,906 7/30/2021
1.0.53 651 7/26/2021
1.0.52 81,903 7/5/2021
1.0.51 607 7/1/2021
1.0.50 57,471 6/4/2021
1.0.49 82,971 4/26/2021
1.0.48 28,925 4/19/2021
1.0.47 135,619 4/7/2021
1.0.46 27,907 4/3/2021
1.0.45 163,172 3/22/2021
1.0.44 101,750 3/4/2021
1.0.43 28,004 2/26/2021
1.0.42 151,305 2/2/2021
1.0.41 101,384 1/24/2021
1.0.40 667 1/23/2021
1.0.39 51,474 1/20/2021
1.0.38 653 1/20/2021
1.0.37 26,266 1/18/2021
1.0.36 25,382 1/16/2021
1.0.35 104,400 12/16/2020
1.0.34 52,868 12/14/2020
1.0.33 29,854 12/9/2020
1.0.32 794 12/6/2020
1.0.31 722 12/2/2020
1.0.30 26,334 12/1/2020
1.0.29 145,491 11/12/2020
1.0.29-atestpub 549 11/11/2020
1.0.28 26,974 10/11/2020
1.0.27 100,056 9/9/2020
1.0.26 25,463 9/3/2020
1.0.25 26,162 8/20/2020
1.0.24 75,646 8/9/2020
1.0.23 25,619 7/28/2020
1.0.22 25,432 7/19/2020
1.0.21 49,322 7/6/2020
1.0.20 76,009 6/6/2020
1.0.19 26,425 6/4/2020
1.0.18 51,049 5/29/2020
1.0.17 51,076 5/21/2020
1.0.16 854 5/17/2020
1.0.15 51,755 5/12/2020
1.0.14 102,487 5/4/2020
1.0.13 868 4/24/2020
1.0.12 4,006 4/22/2020
1.0.11 751 4/22/2020
1.0.10 746 4/21/2020
1.0.9 28,112 4/18/2020
1.0.8 26,173 4/16/2020
1.0.7 739 4/16/2020
1.0.6 22,191 4/15/2020
1.0.5 23,598 4/11/2020
1.0.4 23,423 4/3/2020
1.0.3 776 4/1/2020
1.0.2 10,111 3/27/2020
1.0.1 9,110 3/22/2020
1.0.0 2,619 3/22/2020